这是我参与「掘金日新计划 · 2 月更文挑战」的第 7 天,点击查看活动详情”
一、ES的基本使用
针对ES操作,官方提供了很多种操作方式。www.elastic.co/guide/en/el…
可以看到ES支持很多种客户端,如果在实际工作中使用ES的时候,想要屏蔽语言差异,建议使用RestAPI。其实就是通过URL去访问,这种兼容性比较好,可以跨语言,任何语言都可以去操作这种HTTP请求。但是有时候操作起来比较麻烦,需要拼装各种数据字符串,参数需要自己拼装,最终的结果也需要解析,比较麻烦,但是兼容性比较好。而对于Java语言而言,还有一种选择,使用Java Rest Client。这种方式相对于Rest API而言,它的代码量会大一些,但是从代码层面来看,它是比较清晰的。
1.1、RestAPI操作ES
-
创建名称为test的索引库
注意:索引库可以提前创建,也可以在后续添加数据的时候直接指定一个不存在的索引库,ES会默认自动创建索引库
手工创建:可以自定义索引库的任务数的分片数量以及配置
自动创建:取参数的默认值
ps:索引库名称规范:必须全部小写并且不能以下划线(_)、横杠(-)、加号(+)开头,里面也不能包含逗号
curl -XPUT 'http://192.168.234.100:9200/test'
-
删除索引库
curl -XDELETE 'http://192.168.234.100:9200/test'
-
创建指定3个分片库的索引库
curl -H "Content-Type:application/json" -XPUT 'http://192.168.234.100:9200/test' -d '{"settings":{"index.number_of_shards":3}}'
-
添加数据 往test索引库里面的_doc类型添加索引为1的数据
curl -H "Content-Type:application/json" -XPOST 'http://192.168.234.100:9200/test/_doc/1' -d '{"name":"zhangsan","age":18}'
如果不指定id的话,会随机生成一个Id
curl -H "Content-Type:application/json" -XPOST 'http://192.168.234.100:9200/test/_doc' -d '{"name":"lisi","age":19}'
-
查询数据
curl -XGET 'http://192.168.234.100:9200/test/_doc/1?pretty'
-
指定获取结果
curl -XGET 'http://192.168.234.100:9200/test/_doc/1?_source=name&pretty'
-
全表扫描查询
curl -XGET 'http://192.168.234.100:9200/test/_search?&pretty'
-
全部更新
相同id直接赋给原来的内容
执行更新的时候,ES会将你的旧的文档标记为删除,然后添加新的文档,旧的文档不会立刻消失,但是你也访问不了。ES会自动删除
curl -H "Content-Type:application/json" -XPOST 'http://192.168.234.100:9200/test/_doc/1' -d '{"name":"zhangsan_new","age":180}'
-
局部更新
curl -H "Content-Type:application/json" -XPOST 'http://192.168.234.100:9200/test/_update/1/' -d '{"doc":{"age":25}}'
1.2、Bulk API
格式:
{action:{metadata}}
{request body}
- action:index(添加索引)(数据已经存在,不会报错)/create(添加索引)(数据已经存在,则报错)/update(更新索引)/delete(删除索引)
- metadata:元数据信息:是
_index、_type、_id - request body :
_source(删除操作不需要)
{"index":{"_index":"bulk_test","_type":"_doc","_id":"1"}}
{"name":"zhangsan"}
{"index":{"_index":"bulk_test","_type":"_doc","_id":"2"}}
{"name":"lisi"}
把上面文件vim 保存在request里面
vim request
curl -H "Content-Type:application/json" -XPUT 'http://192.168.234.100:9200/bulk_test/_doc/_bulk' --data-binary @request
Bulk实际项目中最好不要超过100m
二、ES分词介绍
比如我们把Hello World,这条数据在ES中创建索引,方便后期检索,那对应的创建索引和查询索引的大致流程是这样的,
创建索引的过程:首先会对这个数据,也就是原始数据,对这个数据做一个空白字符切割,然后把它切分为两个单词,然后再做一个单词切割,把Hello World切割成Hello、World然后再执行一个小写转换的操作,把这些英文单词全部转换成小写。
查询索引的过程:想要把ES里面这些数据给它检索出来,但是这条数据的具体内容记不清了,只能大致想起一些核心关键词,类似于Hello,首先针对你输入的关键词,做一个空白符分割,把它切成多份,然后再执行小写转换。这样检索的时候就忽略英文大小写。
所以以后在搜索引擎搜索内容的时候,怎么快速高效的检索,就是输入一些核心的关键词。关键词中间最好你提前使用空格分开,这样避免它去做空白符分割,单词切割的shih,它可能给你分的不太合理,这样的话,你前期把自己的核心关键词给分割开。针对英文字符,输入的时候不用纠结大小写。
这些数据最终在ES里面去分词后,这些数据在底层,它其实会产生一个倒排索引。这个倒排索引是ES能够提供快速检索能力的最核心的东西
正排索引:文档ID到文档内容和单词的关联;倒排索引:单词到文档ID的关系
2.1、ES中文分词插件(es-ik)
- ES官方默认的分词插件,对中文分词效果不理想
- 针对中文分词,需要在ES中集成中文分词器
操作步骤:
-
解压到指定目录
unzip elasticsearch-analysis-ik-7.17.6.zip -d /usr/local/elasticsearch-7.17.6/plugins/ik
-
重启es服务,root用户切换elastic用户
bin/elasticsearch -d
测试:
curl -H "Content-Type:application/json" -XPOST 'http://192.168.234.100:9200/test/_analyze?pretty' -d '{"text":"大家是帅哥"}'
PS:这边使用的是谷歌浏览器插件:Multi Elasticsearch Head
curl -H "Content-Type:application/json" -XPOST 'http://192.168.234.100:9200/test/_analyze?pretty' -d '{"text":"大家是帅哥","tokenizer":"ik_max_word"}'
其中/usr/local/elasticsearch-7.17.6/plugins/ik/config里面有stopword.dic。并且可以在/usr/local/elasticsearch-7.17.6/plugins/ik/config的IKAnalyzer.cfg.xml里面添加自定义的词典
•<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict"></entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>