Table des matières
Adresse de démonstration" >Adresse de démonstration
www.ar414 .com/search?query=php%E5%..." >www.ar414 .com/search?query=php%E5%...
Avant-propos" >Avant-propos
Référence" >Référence
Le répertoire " > Le répertoire
À l'aide d'Elasticsearch dans le projet Laravel" >À l'aide d'Elasticsearch dans le projet Laravel
Maison cadre php Laravel Intégrez facilement la nouvelle version de la recherche chinoise Elasticsearch7.9 au projet Laravel7

Intégrez facilement la nouvelle version de la recherche chinoise Elasticsearch7.9 au projet Laravel7

Sep 16, 2020 am 09:15 AM
php laravel

La colonne tutorielle suivante de Laravel vous présentera comment intégrer facilement la nouvelle version de la recherche chinoise Elasticsearch7.9 au projet Laravel7. amis dans le besoin !


ar414 5分钟 集成新版 Elasticsearch7.9 中文搜索 到你的 Laravel7 项目

Juste cinq étapes :

1. Commencez à intégrer le plug-in de segmentation de mots chinois ik. -dans Elasticsearch7.9 Docker Image

Recommandation de cours → : "Elasticsearch Full Text Search Practical Combat" (Vidéo pratique)

Extrait du cours "Solution de concurrence de données à dix millions de niveaux (théorie + pratique)"

2. Configuration de Laravel7 Scout

3. >

4, Importer des données

5. Rechercher

ar414 5分钟 集成新版 Elasticsearch7.9 中文搜索 到你的 Laravel7 项目

Portée de recherche

    Contenu de l'article
  • Titre
  • Tag
Poids du résultat

    Nombre de mots-clés apparaissant
  1. Nombre de mots-clés apparaissant
Page de recherche

    Affichage des surbrillance
  • Affichage de la segmentation des mots
  • Pagination des résultats
Principalement juste pour bloguer Faites une recherche et organisez-la en articles

Laravel + Elasticsearch De nombreux seniors ont écrit des tutoriels et des cas, mais avec les mises à niveau de version d'Elasticsearch et de Laravel, la plupart des articles précédents ne le sont plus. applicable à la nouvelle version. Il est recommandé, lors de l'utilisation d'un projet open source, de parcourir la documentation, principalement la documentation de la version actuellement utilisée, complétée par des tutoriels

    Elasticsearch 7.9
  • Laravel 7
  • elasticsearch-analysis-ik v7.9
    plug-in de segmentation de mots chinois ik
  • document officiel d'elasticsearch

Créez des journaux et un stockage de données à l'aide d'Elasticsearch avec le plugin intégréik中文分词

pull docker
$ docker pull ar414/elasticsearch-7.9-ik-plugin
Copier après la connexion

est mappé localement dans le conteneur Docker pour éviter la perte de données lors du redémarrage de Docker

$ mkdir -p /data/elasticsearch/data
$ mkdir -p /data/elasticsearch/log
$ chmod -R 777 /data/elasticsearch/data
$ chmod -R 777 /data/elasticsearch/log
Copier après la connexion

Exécuter
docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -v /data/elasticsearch/data:/var/lib/elasticsearch -v /data/elasticsearch/log:/var/log/elasticsearch ar414/elasticsearch-7.9-ik-plugin
Copier après la connexion

Vérification
$ curl http://localhost:9200{
  "name" : "01ac21393985",  "cluster_name" : "docker-cluster",  "cluster_uuid" : "h8L336qcRb2i1aydOv04Og",  "version" : {
    "number" : "7.9.0",    "build_flavor" : "default",    "build_type" : "docker",    "build_hash" : "a479a2a7fce0389512d6a9361301708b92dff667",    "build_date" : "2020-08-11T21:36:48.204330Z",    "build_snapshot" : false,    "lucene_version" : "8.6.0",    "minimum_wire_compatibility_version" : "6.8.0",    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },  "tagline" : "You Know, for Search"}
Copier après la connexion

Test de la segmentation des mots chinois
curl -X POST "http://localhost:9200/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
  "analyzer": "ik_max_word",
  "text":     "laravel天下无敌"
}
'{
  "tokens" : [
    {
      "token" : "laravel",      "start_offset" : 0,      "end_offset" : 7,      "type" : "ENGLISH",      "position" : 0    },    {
      "token" : "天下无敌",      "start_offset" : 7,      "end_offset" : 11,      "type" : "CN_WORD",      "position" : 1    },    {
      "token" : "天下",      "start_offset" : 7,      "end_offset" : 9,      "type" : "CN_WORD",      "position" : 2    },    {
      "token" : "无敌",      "start_offset" : 9,      "end_offset" : 11,      "type" : "CN_WORD",      "position" : 3    }
  ]}
Copier après la connexion

Intégrez facilement la nouvelle version de la recherche chinoise Elasticsearch7.9 au projet Laravel7
Le SDK officiel est fourni, qui peut être connecté plus rapidement à Elasticsearch dans le projet Laravel lui-même fournit une solution de recherche en texte intégral Scout. vous devez remplacer le pilote Algolia par défaut par Elasticsearch. 优雅ElasticSearch驱动

Installer

laravel/scout
  • Intégrez facilement la nouvelle version de la recherche chinoise Elasticsearch7.9 au projet Laravel7
    $ composer require laravel/scout
    $ composer require Intégrez facilement la nouvelle version de la recherche chinoise Elasticsearch7.9 au projet Laravel7
    Copier après la connexion

Configuration

    Générer le fichier de configuration Scout (config/scout.php)
  1. $ php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"Copied File [\vendor\laravel\scout\config\scout.php] To [\config\scout.php]Publishing complete.
    Copier après la connexion

  2. Spécifier le pilote Scout
Première méthode : Spécifiez (recommandé)
SCOUT_DRIVER=Matchish\ScoutElasticSearch\Engines\ElasticSearchEngine
Copier après la connexion
  • dans le fichier .env Deuxième méthode : Modifiez directement le pilote par défaut
    'driver' => env('SCOUT_DRIVER', 'algolia')改为'driver' => env('SCOUT_DRIVER', 'Matchish\ScoutElasticSearch\Engines\ElasticSearchEngine')
    Copier après la connexion
  • config/scout.php. >
Spécifiez le port IP du service Elasticsearch
  1. Si vous utilisez le déploiement Docker, utilisez l'adresse IP de

    Linux peut le visualiser via ifconfig

    dans docker0Configuration moyenne

    ELASTICSEARCH_HOST=172.17.0.1:9200
    Copier après la connexion

    .envEnregistrer le service

  2. 'providers' => [
     // Other Service Providers
     \Matchish\ScoutElasticSearch\ElasticSearchServiceProvider::class],
    Copier après la connexion


    config/app.phpVider le cache de configuration

    $ php artisan config:clear
    Copier après la connexion
  3. Jusqu'à présent, Laravel a été connecté à Elasticsearch

    实际业务中使用

    需求

    14分钟14秒 集成 Elasticsearch中文搜索 到你的 Laravel 项目

    通过博客右上角的搜索框可以搜索到与关键词相关的文章,从以下几点匹配

    • 文章内容
    • 文章标题
    • 文章标签

    涉及到2张 Mysql表 以及字段

    • article
      • title
      • tags
    • article_content
      • content

    为文章配置 Elasticsearch 索引

    1. 创建索引配置文件(config/elasticsearch.php)

      $ touch config/elasticsearch.php
      Copier après la connexion
    2. elasticsearch.php 配置字段映射

      <?phpreturn  [
       &#39;indices&#39; => [
           'mappings' => [
               'blog-articles' => [
                   "properties"=>  [
                       "content"=>  [
                           "type"=>  "text",
                           "analyzer"=>  "ik_max_word",
                           "search_analyzer"=>  "ik_smart"
                       ],
                       "tags"=>  [
                           "type"=>  "text",
                           "analyzer"=>  "ik_max_word",
                           "search_analyzer"=>  "ik_smart"
                       ],
                       "title"=>  [
                           "type"=>  "text",
                           "analyzer"=>  "ik_max_word",
                           "search_analyzer"=>  "ik_smart"
                       ]
                   ]
               ]
           ]
       ],];
      Copier après la connexion
    • analyzer:字段文本的分词器
      • search_analyzer:搜索词的分词器
      • 根据具体业务场景选择(颗粒小占用资源多,一般场景analyzer使用ik_max_word,search_analyzer使用ik_smart):
        • ik_max_word:ik中文分词插件提供,对文本进行最大数量分词
          laravel天下无敌 -> laravel天下无敌,天下,无敌
        • ik_smart: ik中文分词插件提供,对文本进行最小数量分词
          laravel天下无敌 -> laravel天下无敌

    配置文章模型

    建议先看一遍 Laravel Scout 使用文档

    1. 引入Laravel Scout

       namespace App\Models\Blog;
      
       use Laravel\Scout\Searchable;
      
       class Article extends BlogBaseModel
       {
           use Searchable;
       }
      Copier après la connexion
    2. 指定索引(刚刚配置文件中的elasticsearch.indices.mappings.blog-articles)

       /**
        * 指定索引
        * @return string
        */
       public function searchableAs()
       {
           return 'blog-articles';
       }
      Copier après la connexion
    3. 设置导入索引的数据字段

       /**
        * 设置导入索引的数据字段
        * @return array
        */
       public function toSearchableArray()
       {
           return [
               'content' => ArticleContent::query()
                   ->where('article_id',$this->id)
                   ->value('content'),
               'tags'    => implode(',',$this->tags),
               'title'   => $this->title
           ];
       }
      Copier après la connexion
    4. 指定 搜索索引中存储的唯一ID

       /**
        * 指定 搜索索引中存储的唯一ID
        * @return mixed
        */
       public function getScoutKey()
       {
           return $this->id;
       }
      
       /**
        * 指定 搜索索引中存储的唯一ID的键名
        * @return string
        */
       public function getScoutKeyName()
       {
           return 'id';
       }
      Copier après la connexion

    数据导入

    其实是将数据表中的数据通过Elasticsearch导入到Lucene
    Elasticsearch 是 Lucene 的封装,提供了 REST API 的操作接口

    • 一键自动导入: php artisan scout:import
    • 导入指定模型: php artisan scout:import ${model}
    $ php artisan scout:import "App\Models\Blog\Article"Importing [App\Models\Blog\Article]Switching to the new index
    5/5 [⚬⚬⚬⚬⚬⚬⚬⚬⚬⚬⚬⚬⚬⚬⚬⚬⚬⚬⚬⚬⚬⚬⚬⚬⚬⚬⚬⚬] 100%[OK] All [App\Models\Blog\Article] records have been imported.
    Copier après la connexion

    导入失败,常见原因:

    • Unresolvable dependency resolving [Parameter #0 [  integer $retries ]] in class Elasticsearch\Transport
      • 解决: 修改配置后,没有清除配置缓存
    • invalid_index_name_exception
      • 解决: searchableAs配置错误,为索引创建别名后,指定别名

    检查索引是否正确

    $ curl -XGET http://localhost:9200/blog-articles/_mapping?pretty{
      "blog-articles_1598362919" : {
        "mappings" : {
          "properties" : {
            "__class_name" : {
              "type" : "text",          "fields" : {
                "keyword" : {
                  "type" : "keyword",              "ignore_above" : 256            }
              }
            },        "content" : {
              "type" : "text",          "analyzer" : "ik_max_word",          "search_analyzer" : "ik_smart"
            },        "tags" : {
              "type" : "text",          "analyzer" : "ik_max_word",          "search_analyzer" : "ik_smart"
            },        "title" : {
              "type" : "text",          "analyzer" : "ik_max_word",          "search_analyzer" : "ik_smart"
            }
          }
        }
      }}
    Copier après la connexion

    测试

    1. 创建一个测试命令行

      $ php artisan make:command ElasticTest
      Copier après la connexion
    2. 代码

    <?phpnamespace  App\Console\Commands;use App\Models\Blog\Article;use App\Models\Blog\ArticleContent;use Illuminate\Console\Command;use Illuminate\Support\Carbon;class ElasticTest extends Command{
        /**
         * The name and signature of the console command.
         *
         * @var string
         */
        protected $signature = &#39;elasticsearch {query}&#39;;
    
        /**
         * The console command description.
         *
         * @var string
         */
        protected $description = &#39;elasticsearch test&#39;;
    
        /**
         * Create a new command instance.
         *
         * @return void
         */
        public function __construct()
        {
            parent::__construct();
        }
    
        /**
         * Execute the console command.
         *
         * @return mixed
         */
        public function handle()
        {
            //
            $startTime = Carbon::now()->getPreciseTimestamp(3);
            $articles = Article::search($this->argument('query'))->get()->toArray();
            $userTime = Carbon::now()->getPreciseTimestamp(3) - $startTime;
            echo "耗时(毫秒):{$userTime} \n";
    
            //content在另外一张表中,方便观察测试 这里输出
            if(!empty($articles)) {
                foreach($articles as &$article) {
                    $article = ArticleContent::query()->where('article_id',$article['id'])->value('content');
                }
            }
    
            var_dump($articles);
    
        }}
    Copier après la connexion
    1. 测试
      $ php artisan elasticsearch 周杰伦
      Copier après la connexion

    ar414 5分钟 集成新版 Elasticsearch7.9 中文搜索 到你的 Laravel7 项目

    1. 复杂查询
      例如:自定义高亮显示
      //ONGR\ElasticsearchDSL\Highlight\Highlight ArticleModel::search($query,function($client,$body) {
               $higlight = new Highlight();
               $higlight->addField('content',['type' => 'plain']);
               $higlight->addField('title');
               $higlight->addField('tags');
               $body->addHighlight($higlight);
               $body->setSource(['title','tags']);
               return $client->search(['index' => (new ArticleModel())->searchableAs(), 'body' => $body->toArray()]);
           })->raw();
      Copier après la connexion

    复杂自定义查询回调中的$client和$body,可根据这两个包进行灵活操作

    $client 官方 elasticsearch/elasticsearch package(https://packagist.org/packages/elasticsearch/elasticsearch)

    $body ongr/elasticsearch-dsl package(https://packagist.org/packages/ongr/elasticsearch-dsl)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Vous avez un jeu croisé?
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Apr 05, 2025 am 12:04 AM

JWT est une norme ouverte basée sur JSON, utilisée pour transmettre en toute sécurité des informations entre les parties, principalement pour l'authentification de l'identité et l'échange d'informations. 1. JWT se compose de trois parties: en-tête, charge utile et signature. 2. Le principe de travail de JWT comprend trois étapes: la génération de JWT, la vérification de la charge utile JWT et l'analyse. 3. Lorsque vous utilisez JWT pour l'authentification en PHP, JWT peut être généré et vérifié, et les informations sur le rôle et l'autorisation des utilisateurs peuvent être incluses dans l'utilisation avancée. 4. Les erreurs courantes incluent une défaillance de vérification de signature, l'expiration des jetons et la charge utile surdimensionnée. Les compétences de débogage incluent l'utilisation des outils de débogage et de l'exploitation forestière. 5. L'optimisation des performances et les meilleures pratiques incluent l'utilisation des algorithmes de signature appropriés, la définition des périodes de validité raisonnablement,

Expliquez la liaison statique tardive en PHP (statique: :). Expliquez la liaison statique tardive en PHP (statique: :). Apr 03, 2025 am 12:04 AM

Liaison statique (statique: :) ​​implémente la liaison statique tardive (LSB) dans PHP, permettant à des classes d'appel d'être référencées dans des contextes statiques plutôt que de définir des classes. 1) Le processus d'analyse est effectué au moment de l'exécution, 2) Recherchez la classe d'appel dans la relation de succession, 3) il peut apporter des frais généraux de performance.

Quelles sont les méthodes PHP Magic (__construct, __ destruct, __ call, __get, __set, etc.) et fournir des cas d'utilisation? Quelles sont les méthodes PHP Magic (__construct, __ destruct, __ call, __get, __set, etc.) et fournir des cas d'utilisation? Apr 03, 2025 am 12:03 AM

Quelles sont les méthodes magiques de PHP? Les méthodes magiques de PHP incluent: 1. \ _ \ _ Construct, utilisé pour initialiser les objets; 2. \ _ \ _ Destruct, utilisé pour nettoyer les ressources; 3. \ _ \ _ Appel, gérer les appels de méthode inexistants; 4. \ _ \ _ GET, Implémentez l'accès à l'attribut dynamique; 5. \ _ \ _ SET, Implémentez les paramètres d'attribut dynamique. Ces méthodes sont automatiquement appelées dans certaines situations, améliorant la flexibilité et l'efficacité du code.

Comment obtenir le code de retour lorsque l'envoi par e-mail échoue à Laravel? Comment obtenir le code de retour lorsque l'envoi par e-mail échoue à Laravel? Apr 01, 2025 pm 02:45 PM

Méthode pour obtenir le code de retour lorsque l'envoi par e-mail de Laravel échoue. Lorsque vous utilisez Laravel pour développer des applications, vous rencontrez souvent des situations où vous devez envoyer des codes de vérification. Et en réalité ...

Dans Laravel, comment gérer la situation où les codes de vérification ne sont pas envoyés par e-mail? Dans Laravel, comment gérer la situation où les codes de vérification ne sont pas envoyés par e-mail? Mar 31, 2025 pm 11:48 PM

La méthode de traitement de l'échec de l'e-mail de Laravel à envoyer le code de vérification est d'utiliser Laravel ...

Comment implémenter la fonction de table personnalisée de clic pour ajouter des données dans l'administrateur DCAT? Comment implémenter la fonction de table personnalisée de clic pour ajouter des données dans l'administrateur DCAT? Apr 01, 2025 am 07:09 AM

Comment implémenter la fonction du tableau de Cliquez sur personnalisé pour ajouter des données dans DCATADMIN (Laravel-Admin) lors de l'utilisation de DCAT ...

Expliquez l'expression de correspondance (PHP 8) et comment elle diffère du commutateur. Expliquez l'expression de correspondance (PHP 8) et comment elle diffère du commutateur. Apr 06, 2025 am 12:03 AM

Dans PHP8, les expressions de correspondance sont une nouvelle structure de contrôle qui renvoie différents résultats en fonction de la valeur de l'expression. 1) Il est similaire à une instruction Switch, mais renvoie une valeur au lieu d'un bloc d'instruction d'exécution. 2) L'expression de correspondance est strictement comparée (===), ce qui améliore la sécurité. 3) Il évite les éventuelles omissions de rupture dans les instructions de commutation et améliore la simplicité et la lisibilité du code.

Partage de connexion Laravel Redis: pourquoi la méthode de sélection affecte-t-elle d'autres connexions? Partage de connexion Laravel Redis: pourquoi la méthode de sélection affecte-t-elle d'autres connexions? Apr 01, 2025 am 07:45 AM

L'impact du partage des connexions redis dans Laravel Framework et sélectionnez Méthodes Lors de l'utilisation de Laravel Framework et Redis, les développeurs peuvent rencontrer un problème: grâce à la configuration ...

See all articles