当前位置: 首页 > 后端技术 > PHP

只需五步,将新版Elasticsearch7.9中文搜索集成到你的Laravel7项目中

时间:2023-03-30 01:46:53 PHP

只需五步:启动集成ik中文分词插件的Elasticsearch7.9Docker镜像Laravel7配置Scout配置Model模型导入数据搜索demo地址ar414https://www.ar414.com搜索范围文章内容标题标签结果权重出现关键词数量出现搜索页关键词数量高亮显示,分词显示,结果分页很多文章不适用于新版本。建议您在使用任何开源项目时仔细阅读文档。文档以当前版本的文档为主,教程为辅。文档使用集成ik中文分词插件的Elasticsearch拉取docker$dockerpullar414/elasticsearch-7.9-ik-plugin创建日志和数据存储目录,并在本地映射到docker容器,防止数据丢失docker重新启动$mkdir-p/data/elasticsearch/data$mkdir-p/data/elasticsearch/log$chmod-R777/data/elasticsearch/data$chmod-R777/data/elasticsearch/logrundockerrun-d-p9200:9200-p9300:9300-e"discovery.type=single-node"-v/data/elasticsearch/data:/var/lib/elasticsearch-v/data/elasticsearch/log:/var/log/elasticsearchar414/elasticsearch-7.9-ik-plugin验证$curlhttp://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”:假,“lucene_version”:“8.6.0”,“minimum_wire_compatibility_version”:“6.8.0”,“minimum_index_compatibility_version”:“6.0.0-beta1”},"tagline":"YouKnow,forSearch"}测试中文分词curl-XPOST"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”:“Invincible”,“start_offset”:9,“end_offset”:11,“type”:“CN_WORD”,“position”:3}]}在Laravel项目中使用ElasticsearchElasticsearch官方提供了SDK。在Laravel项目中,你可以更优雅、更快速地访问Elasticsearch。Laravel本身提供了Scout全文搜索解决方案。我们只需要将默认的Algolia驱动程序替换为ElasticSearch驱动程序即可。安装laravel/scoutmatchish/laravel-scout-elasticsearch$composerrequirelaravel/scout$composerrequirematchish/laravel-scout-elasticsearch配置生成Scout配置文件(config/scout.php)$phpartisanvendor:publish--provider="Laravel\Scout\ScoutServiceProvider”复制文件[\vendor\laravel\scout\config\scout.php]到[\config\scout.php]发布完成。指定Scout驱动第一种:在.env文件中指定(推荐)SCOUT_DRIVER=Matchish\ScoutElasticSearch\Engines\ElasticSearchEngine第二种:直接在config中修改默认驱动'driver'=>env('SCOUT_DRIVER','algolia')/scout.phpto'driver'=>env('SCOUT_DRIVER','Matchish\ScoutElasticSearch\Engines\ElasticSearchEngine')指定Elasticsearch服务I如果P口用docker部署,就用docker0的IP。linux可以通过ifconfig查看,在.env中配置ELASTICSEARCH_HOST=172.17.0.1:9200注册服务config/app.php'providers'=>[//OtherServiceProviders\Matchish\ScoutElasticSearch\ElasticSearchServiceProvider::class],清空配置cache$phpartisanconfig:clear至此laravel在实际业务使用需求中已经接入了Elasticsearch您可以通过博客右上角的搜索框搜索关键词相关的文章,从以下几点内容文章进行匹配title文章标签涉及到2个Mysql表和字段articletitletagsarticle_contentcontent为文章配置Elasticsearch索引创建索引配置文件(config/elasticsearch.php)$touchconfig/elasticsearch.phpelasticsearch.php配置字段映射['mappings'=>['blog-articles'=>["properties"=>["content"=>["type"=>"text","analyzer"=>"ik_max_word","search_analyzer"=>"ik_smart"],"标签”=>[“类型”=>“文本”,“analyzer"=>"ik_max_word","search_analyzer"=>"ik_smart"],"title"=>["type"=>"text","analyzer"=>"ik_max_word","search_analyzer"=>"ik_smart"]]]]],];analyzer:字段文本的分词器search_analyzer:搜索词的分词器根据具体业务场景选择(小颗粒占用资源较多,一般场景analyzer使用ik_max_word,search_analyzer使用ik_smart):ik_max_word:ik中文分词插件提供,对文本laravel天下无敌进行最大分词数->laravel,天下无敌,天下无敌`配置文章模型推荐先阅读LaravelScout。使用文档介绍LaravelScoutnamespaceApp\Models\Blog;useLaravel\Scout\Searchable;classArticleextendsBlogBaseModel{useSearchable;}指定索引(刚才配置文件中的elasticsearch.indices.mappings.blog-articles)/***指定索引*/publicfunctionsearchableAs(){return'blog-articles';}```设置导入索引的数据字段/***设置导入索引的数据字段*/publicfuntoSearchableArray(){return['content'=>ArticleContent::query()->where('article_id',$this->id)->value('content'),'tags'=>implode(',',$this->tags),'title'=>$this->title];}```指定存储在搜索索引中的唯一ID/***指定存储在搜索索引中的唯一ID*/publicfunctiongetScoutKey(){return$this->id;}/***指定存储在搜索索引中的唯一ID的键名*@returnstring*/publicfunctiongetScoutKeyName(){return'id';}```数据导入其实就是通过Elasticsearch将数据表中的数据导入到Lucene中。Elasticsearch是Lucene的封装,提供RESTAPI的操作接口。一键自动导入:phpartisanscout:import导入指定模型:phpartisanscout:import${model}$phpartisanscout:import"App\Models\Blog\Article"Importing[App\Models\Blog\Article]切换到新索引5/5[????????????????????????]100%[OK]All[App\Models\Blog\条]记录已导入。导入失败,常见原因:类ElasticsearchTransport中无法解析的依赖解析[Parameter#0[integer$retries]]解决方法:修改配置后,配置缓存未清除invalid_index_name_exception解决方法:searchableAs配置错误,为索引创建别名后,指定别名检查索引是否正确$curl-XGEThttp://localhost:9200/blog-articles/_mapping?pretty{“blog-articles_1598362919”:{“映射”:{“属性”:{“__class_name”:{“类型”:“文本”,“字段”:{“关键字”:{“类型”:“关键字”,“ignore_above”:256}}},“内容”:{“类型”:“文本”,“分析器”:“ik_max_word”,“search_analyzer”:“ik_smart”},“标签”:{“类型”:“文本”,“分析器”:“ik_max_word”,“search_analyzer”:“ik_smart”},“标题”:{“类型”:“文本”,“分析器”:“ik_max_word”,“search_analyzer”:"ik_smart"}}}}}test创建一个测试命令行$phpartisanmake:commandElasticTestcodegetPreciseTimestamp(3);$articles=Article::search($this->argument('query'))->get()->toArray();$userTime=Carbon::now()->getPreciseTimestamp(3)-$startTime;echo"耗时(秒):{$userTime}\n";//content在另外一张表中,方方便观察在这里测试输出if(!empty($articles)){foreach($articlesas&$article){$article=ArticleContent::query()->where('article_id',$article['id'])->价值('内容');}}var_dump($文章);}}test$phpartisanelasticsearch周杰伦高亮片段高亮需要自定义查询,核心代码//ONGR\ElasticsearchDSL\Highlight\HighlightArticleModel::search($query,function($client,$body){$higlight=newHighlight();$higlight->addField('content',['type'=>'plain']);$higlight->addField('title');$higlight->addField('tags');$body->addHighlight($higlight);$body->setSource(['title','tags']);返回$client->search(['index'=>(newArticleModel())->searchableAs(),'body'=>$body->toArray()]);})->raw();自定义查询可以参考两个包灵活开发$clientelasticsearch/elasticsearchpackage$bodyongr/elasticsearch-dslpackage