es搜索同义词近义词技术方案
Posted 百里东君~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了es搜索同义词近义词技术方案相关的知识,希望对你有一定的参考价值。
方案一:
使用同义词文件,在es索引中定义"synonyms_path",在服务器中放入同义词文件synonyms.txt文件,并设置updateable为true动态读取更新的同义词文件,但这个需要运维一起配合,当有业务有新增同义词时候,也需要运维帮我们添加进这个文件中,维护比较不方便
PUT /myIndex
"settings":
"analysis":
"filter":
"my_synonym_filter":
"type": "synonym",
"updateable": true,
"synonyms_path": "analysis/synonyms.txt"
,
"analyzer":
"my_synonyms_analyzer":
"tokenizer": "ik_smart",
"filter": [
"my_synonym_filter"
]
,
"mappings":
"properties":
"title":
"type": "text",
"analyzer": "ik_smart",
"search_analyzer": "my_synonyms_analyzer"
查看腾讯云关于同义词配置的文档,关于同义词的添加,也同样需要对现有索引进行reindex操作
主要讲一下方案二,直接在我们建的索引上进行维护同义词
方案二:同义词技术方案
es建索引时,我们可以给es创建一个同义词语汇单元过滤器,然后使用下面这样的同义词规则:
“衬衫, 衬衫料, 衬衣料, 衬衣”
例子:
1、创建普通索引
先创建一个普通的索引,并增加2条数据,对“海马毛”进行分词,可以得到“海马”,“毛”
"索引名" :
"aliases" :
//索引别名
,
"mappings" :
"properties" :
//索引字段
,
"settings" :
"number_of_shards" : "3",
"max_result_window" : "100000000",
"analysis" :
"filter" :
"my_synonym" :
"ignore_case" : "true",
"expand" : "true",
"type" : "synonym",
"synonyms" : [
"马海毛,海马毛"
],
"tokenizer" : "standard"
,
"analyzer" :
"ik_max_word_my_analyzer" :
"filter" : [
"my_synonym"
],
"tokenizer" : "ik_max_word_tokenizer"
,
"tokenizer" :
"ik_max_word_tokenizer" :
"type" : "ik_max_word"
进行match检索,发现也只能召回出一条数据
但是,业务上如果要认为在搜索上,输入海马毛的检索效果跟马海毛的一样,那么就需要给es配置同义词
2、创建含有同义词过滤器的es索引
es配置同义词的格式有多种,最简单的就是使用逗号分割
"jump,leap,hop"(推荐)
或者, 使用 => 语法,可以指定一个词项列表(在左边),和一个或多个替换(右边)的列表:
"u s a,united states,united states of america => usa"
或者,扩展
"kitten => kitten,cat,pet"
关于自定义分析器,可参考官方文档https://www.elastic.co/guide/cn/elasticsearch/guide/current/custom-analyzers.html
自定义分析器后,我们增加再对“海马毛”进行分词
发现同义词已经生效了,这个时候,我们在检索“海马毛”时候,也可以召回到“马海毛”的数据
后期维护:
后续业务如果还需要一直添加同义词,对es来说,是需要reindex进行操作
reindix操作的操作在我另一篇博客有详细描述:传送门
如果只是单纯修改settings,那么只会对改索引新增的文档数据有效,对旧数据无效
以上是关于es搜索同义词近义词技术方案的主要内容,如果未能解决你的问题,请参考以下文章