Laravel + Elasticsearch 实现中文搜索的方法
Elasticsearch
Elasticsearch是一个基于ApacheLucene(TM)的开源搜索引擎,无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。
但是,Lucene只是一个库。想要发挥其强大的作用,你需使用Java并要将其集成到你的应用中。Lucene非常复杂,你需要深入的了解检索相关知识来理解它是如何工作的。
Elasticsearch也是使用Java编写并使用Lucene来建立索引并实现搜索功能,但是它的目的是通过简单连贯的RESTfulAPI让全文搜索变得简单并隐藏Lucene的复杂性。
不过,Elasticsearch不仅仅是Lucene和全文搜索引擎,它还提供:
- 分布式的实时文件存储,每个字段都被索引并可被搜索
- 实时分析的分布式搜索引擎
- 可以扩展到上百台服务器,处理PB级结构化或非结构化数据
而且,所有的这些功能被集成到一台服务器,你的应用可以通过简单的RESTfulAPI、各种语言的客户端甚至命令行与之交互。上手Elasticsearch非常简单,它提供了许多合理的缺省值,并对初学者隐藏了复杂的搜索引擎理论。它开箱即用(安装即可使用),只需很少的学习既可在生产环境中使用。
Elasticsearch在Apache2license下许可使用,可以免费下载、使用和修改。
ElasticSearch安装
在Laradock中已经集成了ElasticSearch。我们可以直接使用:
docker-composeup-delasticsearch
如果需要安装插件,执行命令:
docker-composeexecelasticsearch/usr/share/elasticsearch/bin/elasticsearch-plugininstall{plugin-name} //重启容器 docker-composerestartelasticsearch
注:
Thevm.max_map_countkernelsettingmustbesettoatleast262144forproductionuse.由于我是centos7环境,直接设置在系统设置:
默认用户名和密码:「elastic」、「changeme」,端口号:9200
sysctl-wvm.max_map_count=262144
ElasticHQ
ElasticHQisanopensourceapplicationthatoffersasimplifiedinterfaceformanagingandmonitoringElasticsearchclusters.ManagementandMonitoringforElasticsearch.
http://www.elastichq.org/
- Real-TimeMonitoring
- FullClusterManagement
- FullClusterMonitoring
- ElasticsearchVersionAgnostic
- EasyInstall-AlwaysOn
- WorkswithX-Pack
输入我们的ElasticsearchHost,即可进入后台。
默认的创建了:
一个集群cluster:laradock-cluster
一个节点node:laradock-node
一个索引index:.elastichq
IK分词器安装
ElasticSearch主要是用于自己blog或者公众号文章的搜索使用,所以需要选择一个中文分词器配合使用,这里刚开始推荐使用IK分词器,下面开始安装对应ElasticSearch版本(7.5.1)一致的插件:
https://github.com/medcl/elasticsearch-analysis-ik/releases
//安装插件 docker-composeexecelasticsearch/usr/share/elasticsearch/bin/elasticsearch-plugininstallhttps://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.5.1/elasticsearch-analysis-ik-7.5.1.zip
注:可以将zip文件先下载回来,然后再安装,速度会快些。
检验分词效果
根据ElasticsearchAPI测试,分词的效果达到了:
~curl-XPOST"http://your_host/_analyze?pretty"-H'Content-Type:application/json'-d' { "analyzer":"ik_max_word", "text":"我是中国人" } ' { "tokens":[ { "token":"我", "start_offset":0, "end_offset":1, "type":"CN_CHAR", "position":0 }, { "token":"是", "start_offset":1, "end_offset":2, "type":"CN_CHAR", "position":1 }, { "token":"中国人", "start_offset":2, "end_offset":5, "type":"CN_WORD", "position":2 }, { "token":"中国", "start_offset":2, "end_offset":4, "type":"CN_WORD", "position":3 }, { "token":"国人", "start_offset":3, "end_offset":5, "type":"CN_WORD", "position":4 } ] }
结合Laravel
虽然Elasticsearch官方提供了对应的PHP版本的插件,但我们还是希望和Laravel结合的更紧密些,所以这里选择和Scout结合使用,具体用到了tamayo/laravel-scout-elastic插件。
composerrequiretamayo/laravel-scout-elastic composerrequirelaravel/scout phpartisanvendor:publish
选择:Laravel\Scout\ScoutServiceProvider
修改驱动为elasticsearch:
'driver'=>env('SCOUT_DRIVER','elasticsearch'),
创建索引
创建索引有几种方法,其中可以使用Ela可视化工具ElasticHQ直接创建。
接下来我们需要更新这个索引,补充Mappings这部分,可以用Postman。
另一种方法是用Laravel自带的Artisan命令行功能。
这里我们推荐使用Artisan命令行。
phpartisanmake:commandESOpenCommand
根据官网提示,我们可以在ESOpenCommand上向Elasticsearch服务器发送PUT请求,这里借助Elasticsearch提供的PHP插件,在我们使用tamayo/laravel-scout-elastic插件时,已经安装了ElasticsearchPHP插件:
下面就可以借助插件,创建我们的Index,直接看代码:
publicfunctionhandle() { $host=config('scout.elasticsearch.hosts'); $index=config('scout.elasticsearch.index'); $client=ClientBuilder::create()->setHosts($host)->build(); if($client->indices()->exists(['index'=>$index])){ $this->warn("Index{$index}exists,deleting..."); $client->indices()->delete(['index'=>$index]); } $this->info("Creatingindex:{$index}"); return$client->indices()->create([ 'index'=>$index, 'body'=>[ 'settings'=>[ 'number_of_shards'=>1, 'number_of_replicas'=>0 ], 'mappings'=>[ '_source'=>[ 'enabled'=>true ], 'properties'=>[ 'id'=>[ 'type'=>'long' ], 'title'=>[ 'type'=>'text', 'analyzer'=>'ik_max_word', 'search_analyzer'=>'ik_smart' ], 'subtitle'=>[ 'type'=>'text', 'analyzer'=>'ik_max_word', 'search_analyzer'=>'ik_smart' ], 'content'=>[ 'type'=>'text', 'analyzer'=>'ik_max_word', 'search_analyzer'=>'ik_smart' ] ], ] ] ]); }
好了,我们执行Kibana看到我们已经创建好了Index:
注Kibana本地Docker安装:后续会重点说明Kibana如何使用
dockerrun-d--namekibana-eELASTICSEARCH_HOSTS=http://elasticsearch_host-p5601:5601-eSERVER_NAME=ki.testkibana:7.5.2
为了验证Index是否可用,可以插入一条数据看看:
curl-XPOSTyour_host/coding01_open/_create/1-H'Content-Type:application/json'-d' {"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}
可以通过浏览器看看对应的数据:
有了Index,下一步我们就可以结合Laravel,导入、更新、查询等操作了。
LaravelModel使用
Laravel框架已经为我们推荐使用Scout全文搜索,我们只需要在ArticleModel加上官方所说的内容即可,很简单,推荐大家看Scout使用文档:https://learnku.com/docs/laravel/6.x/scout/5191,下面直接上代码:
'array' ]; /** *Setthecontentattribute. * *@param$value */ publicfunctionsetContentAttribute($value) { $data=[ 'raw'=>$value, 'html'=>(newMarkdowner)->convertMarkdownToHtml($value) ]; $this->attributes['content']=json_encode($data); } /** *获取模型的可搜索数据 * *@returnarray */ publicfunctiontoSearchableArray() { $data=[ 'id'=>$this->id, 'title'=>$this->title, 'subtitle'=>$this->subtitle, 'content'=>$this->content['html'] ]; return$data; } publicfunctionsearchableAs() { return'_doc'; } }
Scout提供了Artisan命令import用来导入所有已存在的记录到搜索索引中。
phpartisanscout:import"App\Article"
看看Kibana,已存入12条数据,和数据库条数吻合。
有了数据,我们可以测试看看能不能查询到数据。
还是一样的,创建一个命令:
classElasearchCommandextendsCommand { /** *Thenameandsignatureoftheconsolecommand. * *@varstring */ protected$signature='command:search{query}'; /** *Theconsolecommanddescription. * *@varstring */ protected$description='Commanddescription'; /** *Createanewcommandinstance. * *@returnvoid */ publicfunction__construct() { parent::__construct(); } /** *Executetheconsolecommand. * *@returnmixed */ publicfunctionhandle() { $article=Article::search($this->argument('query'))->first(); $this->info($article->title); } }
这是我的titles,我随便输入一个关键字:「清单」,看是否能搜到。
总结
整体完成了:
- Elasticsearch安装;
- ElasticsearchIK分词器插件安装;
- Elasticsearch可视化工具ElasticHQ和Kibana的安装和简单使用;
- Scout的使用;
- Elasticsearch和Scout结合使用。
接下来就要将更多的内容存入Elasticsearch中,为自己的blog、公众号、自动化搜索等场景提供全文搜索。
参考
推荐一个命令行应用开发工具——LaravelZero
Artisan命令行https://learnku.com/docs/laravel/6.x/artisan/5158
Scout全文搜索https://learnku.com/docs/laravel/6.x/scout/5191
HowtointegrateElasticsearchinyourLaravelApp–2019editionhttps://madewithlove.be/how-to-integrate-elasticsearch-in-your-laravel-app-2019-edition/
KibanaGuidehttps://www.elastic.co/guide/en/kibana/index.html
elasticsearchphp-api[https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/index.html](https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/index.html)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。