es搜索同义词近义词技术方案
es搜索同义词近义词技术⽅案
⽅案⼀:
使⽤同义词⽂件,在es索引中定义"synonyms_path",在服务器中放⼊同义词⽂件⽂件,并设置updateable为true动态读取更新的同义词⽂件,但这个需要运维⼀起配合,当有业务有新增同义词时候,也需要运维帮我们添加进这个⽂件中,维护⽐较不⽅便
PUT /myIndex
{
"settings":{
"analysis":{
"filter":{
"my_synonym_filter":{
"type":"synonym",
"updateable":true,
"synonyms_path":""
}
},
"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条数据,对“海马⽑”进⾏分词,可以得到“海马”,“⽑”
进⾏match检索,发现也只能召回出⼀条数据
但是,业务上如果要认为在搜索上,输⼊海马⽑的检索效果跟马海⽑的⼀样,那么就需要给es配置同
义词2、创建含有同义词过滤器的es索引
es配置同义词的格式有多种,最简单的就是使⽤逗号分割
"jump,leap,hop"(推荐)
或者,使⽤=>语法,可以指定⼀个词项列表(在左边),和⼀个或多个替换(右边)的列表:
"u s a,united states,united states of america => usa"
或者,扩展
"kitten => kitten,cat,pet"
⾃定义分析器后,我们增加再对“海马⽑”进⾏分词
发现同义词已经⽣效了,这个时候,我们在检索“海马⽑”时候,也可以召回到“马海⽑”的数据
后期维护:
后续业务如果还需要⼀直添加同义词,对es来说,是需要reindex进⾏操作
reindix操作的操作在我另⼀篇博客有详细描述:
如果只是单纯修改settings,那么只会对改索引新增的⽂档数据有效,对旧数据⽆效

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。