elasticSearch
特点:分布式搜索和分析引擎,可以用http以json的方式进行数据索引。
由来:ES全称Elastic Stack(ELK Stack),是由三个产品elasticSearch,logstack(数据收集),kibana(可视化平台)的集成设计方案,解决人们的搜索需求,用于全文检索。
IK分词器
ES常见的几种分词器
分词器 | 分词方式
StandardAnalyzer | 单字分词
CJKAnalyzer | 二分法
IKAnalyzer | 词库分词
分词器作用是把一段中文或者别的划分成一个个的关键字或词,我们在搜索时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行个匹配操作,默认的中文分词是将每个字看成一个词,比如"我爱中国"会被分为"我""爱"中"国",这是然是不符合要求的,所以我们需要安装中文分词器水来解决这个问题。
(分词器提供了两种分词算法:ik smar和ik max work,其中ik smant是最少切分,ik max work是最细粒度划分
学习es数据库
ik_max_word :,学习、es、数据、库
ik_smart :学习、es、数据库
安装和入门使用
安装前可以先参考看这三个文章
1.安装 2.错误 3.安装插件
- Windows系统下Elasticsearch-7.15.2安装_windows安装7.15.2ik分词器-CSDN博客
- 解决ElasticSearch本地只能通过localhost访问不能通过IP访问的问题。_localhost能访问,ip地址访问不了-CSDN博客
- ElasticSearch下载安装配置及其使用(windows)_elasticsearch下载和安装-CSDN博客
使用的安装包是:(版本一定要一样)
1.elasticsearch-7.15.2-windows-x86_64
2.elasticsearch-analysis-ik-7.15.2
我的安装流程:
1.先解压elasticsearch-7.15.2-windows-x86_64。
2.在elasticsearch-7.15.2-windows-x86_64/plugins下,先创建一个名为ik的文件夹(不一定用这个名字,自己创建一个是因为elasticsearch-analysis-ik-7.15.2解压后没有文件夹)
3.把elasticsearch-analysis-ik-7.15.2复制粘贴到,ik下,解压到当前文件夹
4.elasticsearch-7.15.2\config下的elasticsearch.yml,新增三个值,这三个值原本是注释到模板的,可以搜索一下然后新增
network.host: 0.0.0.0
http.port: 9200
cluster.initial_master_nodes: ["node-1"]
5.运行elasticsearch-7.15.2\bin下的elasticsearch.bat,启动日志查看是否有ik分词器插件是否加载完成,浏览器运行 127.0.0.1:9200查看是否有json出现,有就成功了。
接口的使用
我用的是postman去调用调试接口
1.创建一个具有ik_smart分词的索引,这个索引相当于mysql中的库。
put: http://192.168.2.108:9200/nba
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0,
"analysis":{
"analyzer":{
"default":{
"tokenizer":"ik_smart"
}
}
}
},
"mappings": {
"properties": {
"name":{
"type": "keyword"
},
"description":{
"type": "text"
}
}
}
}
2.给前面的库添加信息,_doc文档相当于mysql表中的行
post:http://192.168.2.108:9200/nba/_doc
{
"name":"科比",
"description":"湖人的名宿科比布莱恩特"
}
3.第二步添加之后,会返回一个id,复制过来,试一下查询
get: http://192.168.2.108:9200/nba/_doc/kmVX7pAB8qKKc8y0iK4Z
4.试一下删除,同上操作
delete : http://192.168.2.108:9200/nba/_doc/kmVX7pAB8qKKc8y0iK4Z
5.再把刚刚那个加回来,我们试一下,更新操作
更新有两种,覆盖和追加
5.1,覆盖会把其他字段置空
put: http://192.168.2.108:9200/nba/_doc/k2Vc7pAB8qKKc8y06K70
{
"name":"科比覆盖"
}
5.2追加不会影响其他字段。
post : http://192.168.2.108:9200/nba/_doc/k2Vc7pAB8qKKc8y06K70/_update
{
"name":"科比追加"
}
6.搜索接口(记得把原来的数据name更新成科比,不然可能搜索不到,比如刚刚更新成科比追加的话,这里搜索科比就搜不到了,得搜索全称,至于为什么,后面会讲到分词)
post : http://192.168.2.108:9200/nba/_search
{
"query":{
"match":{
"name":"科比"
}
}
}
7.查看分词器结果(这里和前面存入的没关系了,就是针对分词器的查看解析,因为我们一开始创建的索引是以ik_smart的)这个接口相当于搜索框下面的提词。
post :http://192.168.2.108:9200/_analyze?pretty=true
{
"analyzer":"ik_smart",
"text": "湖人的名宿科比布莱恩特"
}
上面可以看到无论是 name "科比追加" 还是description "湖人的名宿科比布莱恩特" 进行的分词结果 都是一个科 和 一个 比,这就是为什么上面如果不是搜索全称的话直接搜索科比的话会搜索不到,如果原来的name是"科比",虽然分词是一个"科"和一个"比",但是只要是全称依然能搜索到,而如果是"科比追加",搜索"科比"的话,就没法搜索到了。那么如何解决后面这种情况呢?就是接下来的自定义分词了。
8.自定义分词
这个没什么复杂的,原本引入的分词就是写了一个文件 内容是 各种词汇,而我们的自定义分词,只是新建一个新的文件去新增我们自己的词汇,然后把新的文件地址写在分词器中就行了。
8.1
去到ik分词器config文件下。
比如我是
E:\work\ES\elasticsearch-7.15.2\plugins\ik\config
可以看到一个文件IKAnalyzer.cfg.xml
8.2
复制main.dic ,粘贴一个副本出来,然后修改为my.dic,然后把my.dic清空。
为什么要这么做呢,因为我自己新建结果搞半天发现是文件编码问题,要保证utf-8,所以直接复制最方便。
8.3
打开,给 <entry key="ext_dict">my.dic</entry>
这个标签加上my.dic
8.4
给my.dic,像main.dic那样添加词汇,这次我们就加一个科比即可。
8.5
重启es
8.6
重新查看"科比追加"和"湖人的名宿科比布莱恩特"的分词结果,可以发现两个字科比合在一起了。但经过我检验,自定义分词,只能合并词汇,而不能拆分,比如没用自定义分词之前的分词结果是 "布莱恩特",你想通过自定义分词成"布莱"和"恩特",他是不会分的,他的作用是合并。拆分的功能应该在建立索引的时候过滤器那里。
8.7
我们把name改成科比追加,然后搜索,"科比",发现是搜索到了,说明这个自定义分词生效。
注意:我这里搜索发现并不符合预期,原因是创建索引之前我还没加自定义分词。这样的话索引就有可能没用到,虽然es启动能看到用了,但只是安装成功了而已。所以需要先删除索引,创建索引,添加文档一遍。
get:http://192.168.2.108:9200/nba/_mapping
可以看到什么变化都没
这时候得删除前面的索引,即库,重新添加文档,再一次查询映射可以看到。
这时候搜索"科比"可以看到出来了。
9.停止词
查看"湖人的名宿科比布莱恩特"的分词结果,可以看到有个单独的"的"字。这些"的""了"等等词出现频率很高,会降低查询的准确度和效率,所以有必要新增一个停止词的扩展
9.1
和自定义分词一样,创建文件,引入文件。
源文件是stopword.dic,我们创建一个新的 myStopwords.dic,然后加一个"的",再到IKAnalyzer.cfg.xml去,给里面<entry key="ext_stopwords">myStopwords.dic</entry>
加上这个文件。
9.2
重启
9.3
看分词器结果不用删除索引,要看搜索效果的话,要删除索引重新来一遍,不然跟前面一样,这里就不多操作一遍了