插件安装
ElasticSearch 有两种方法安装插件
第一种
./bin/elasticsearch-plugin install 下载链接
第二种
将插件解压到 ElasticSearch 安装目录下的 plugins 目录下
还有一点需要注意的时,插件的版本要与 ElasticSearch 版本要一致,下面使用的 elasticSearch 版本均为 6.5.0
.
IK 插件
Analyzer(分词器)的作用是把一段文本中的词按一定规则进行切分。对于不同的语言,要用不同的分词器,在 ES 中创建索引的需要分词器,在查询的时候也需要分词器,注意,这两个地方需要使用相同的分词器,不然会出现搜索不出结果的情况。
IKAnalyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包,对于ES IK分词插件在中文检索中非常常用。
安装 IK
$ bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.5.0/elasticsearch-analysis-ik-6.5.0.zip
成功提示
出现下面这样的提示,说明安装成功了,成功后重启即可使用,ES 会自动加载插件。
-> Installed analysis-ik
如果出现这样的提示,说明 ik 跟 elastic 版本不一致:
Plugin [analysis-ik] was built for Elasticsearch version 6.5.0 but version 6.5.1 is running
使用示例
ES 中的文档时使用 JSON 格式表示的,等下我们用于测试的文档格式如下:
{
"user": "张三",
"title": "工程师",
"desc": "数据库管理"
}
分词设置
上面三个字段都是中文的,创建索引的时候需要通过设置,指定一下分词器(默认是英文的)
PUT /accounts
{
"mappings": {
"person": {
"properties": {
"user": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
},
"title": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
},
"desc": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
}
}
}
}
}
-
accounts
是索引 -
person
是类型 -
user
、title
、desc
是需要设置的字段名
字段设置详解
"user": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
}
-
type
指定字段的类型,text 代表文本类型 -
analyzer
创建索引使用的分词策略,ik_max_word 分词策略(最大程度的分词) -
search_analyzer
搜索时使用的分词策略,ik_max_word 作用同上
关于分词策略:IK 有两种分词策略 ik_max_word
和 ik_smart
。根据 IK 的文档,二者区别如下:
- ik_max_word:会将文本做最细粒度的拆分,例如「中华人民共和国国歌」会被拆分为「中华人民共和国、中华人民、中华、华人、人民共和国、人民、人、民、共和国、共和、和、国国、国歌」,会穷尽各种可能的组合
- ik_smart:会将文本做最粗粒度的拆分,例如「中华人民共和国国歌」会被拆分为「中华人民共和国、国歌」
添加文档
PUT /accounts/person/1
{
"user": "张三",
"title": "工程师",
"desc": "Python 开发工程师,运维工程师"
}
PUT /accounts/person/2
{
"user": "李四",
"title": "工程师",
"desc": "Java 开发工程师,系统管理工程师"
}
PUT /accounts/person/3
{
"user": "王五",
"title": "工程师",
"desc": "Web 前端开发工程师,UI 设计工程师"
}
查询
查询
GET accounts/person/_search
{
"query": {
"match": {
"desc": "系统管理"
}
}
}
Response
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 1.1507283,
"hits" : [
{
"_index" : "accounts",
"_type" : "person",
"_id" : "2",
"_score" : 1.1507283,
"_source" : {
"user" : "李四",
"title" : "工程师",
"desc" : "Java 开发工程师,系统管理工程师"
}
}
]
}
}
hits
字段里是查询命中的文档,可以看到查询成功了。