ES提供给了一些自带的分词器,如标准分词器,空格分词器,对中文支持不好。 因此也就有了一些第三方的分词器。 如ik分词器,这里用着还不错, 不过有的时候还是不能满足我们工作中的需要,因此就需要在现成的分词器上加一些定制化的改造。 有点像设计模式中的装饰模式。
这里选用的分词器是IK分词器。
扩展新词
进入 ik分词器的配置文件目录,创建new_dict.dic文件,并在里面添加自己想的词。然后在修改IKAnalyzer.cfg.xml
配置文件。指定扩展词文件的路径。
里面的还可以配置停用词,还远程扩展词库,也就是写一个服务器,可以动态添加。
这里需要重启一下ES服务器,才能让扩展词库有意义。
这个时候使用新词搜索还是不行的。很有可能一个内容也搜索不出来, 因此在原有的分词器这个新词是两个字, 索引已经创建了。这个时候如果在去拿一个新词去搜索,应该是搜索不出来的。
这个时候的解决办法就是更新一下索引。语法如下:
将name字段中的数据以输入的为条件查询出来 ,更新他的索引。这样就会使用新的分词器进行索引构建 了。 这里官方文档已经有了,只是没有说还需要更新索引。
POST /shop/_update_by_query
{
"query": {
"bool": {
"must": [
{"term": {
"name": {
"value": "凯"
}
}},
{
"term": {
"name": {
"value": "悦"
}
}
}
]
}
}
}
关于热更新 就请看官方文档吧。 IK分词器官方文档
同义词
- 在IK插件配置目录一下创建一个同义词文件。
synonyms,txt
文件内容如下:
- 索引结构需要重新定义。
原来的搜索结构是不支持同义词的, 我们需要重新定义。原来的索引就需要删除掉了。
下面json中
#1
代码 :synonyms_path
默认路径是es中的config
目录, 我们是在analysis-ik这个目录下创建的,因此就有下面的内容了。
#2
代码:是对自定义分词器的使用。
#0
代码 : 是处定义分词器。
# 将原来的索引删除
DELETE /shop
PUT /shop
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"analysis": { `# 0`
"filter": {
"my_synonym_filter":{
"type":"synonym",
"synonyms_path":"analysis-ik/synonyms.txt" `#1`
}
},
"analyzer": {
"ik_syno":{
"type":"custom",
"tokenizer":"ik_smart",
"filter":["my_synonym_filter"]
},
"ik_syno_max":{
"type":"custom",
"tokenizer":"ik_max_word",
"filter":["my_synonym_filter"]
}
}
}
},
"mappings": {
"properties": {
"id":{ "type": "integer"},
"name":{"type": "text","analyzer": "ik_syno_max","search_analyzer": "ik_syno"}, `#2`
"tags":{"type": "text","analyzer": "whitespace","fielddata": true},
"location":{"type": "geo_point"},
"remark_score":{"type": "double"},
"price_per_man":{"type": "integer"},
"category_id": {"type": "integer"},
"category_name":{ "type": "keyword"},
"seller_id":{"type":"integer"},
"seller_remark_score":{"type": "double"},
"seller_disabled_flag":{"type": "integer"}
}
}
}
- 需要重新构建索引了。
在查询的时候就可以使用同义词进行替换查询了。