是时候用 ES 拯救发际线啦

求教如何限制查询匹配中的“距离”

Elasticsearch | 作者 yeziblo | 发布于2019年08月21日 | 阅读数:487

我的情景是这样的:
 
用户需要我使用pinyin进行一个全文检索,我在使用pinyin分词器后,发现了一个问题...
 
比如我要查询xinbeishi(新北市),那么返回的结果中,可能错误的包含诸如“新华路北区联合超市”这种奇怪的数据。
 
我可以理解这是因为该数据中分别包含了xin、bei和shi的拼音,因此在切词匹配倒排时,把该值也错误的匹配了出来。
 
在查询的时候不切词也是不行的,因为用户的需求,需要liudehua和dehua liu都能查到“刘德华”,所以查询时必须切词。
 
我想请教各位前辈,有没有什么查询方法,可以限制不同匹配值之间的距离,以此来避免当不同字相距过远也返回的情况?
 
或者有没有其他方法可以解决我的问题呢?
 
描述的可能不是很清楚,希望各位能够解答,同时祝大家身体健康、工作顺利~
已邀请:

Ombres

赞同来自: yeziblo

 
最大间隔距离是slop参数,但是只有match_phrase 或者7.x版本的span查询支持slop吧。

简单介绍一下 
match_phrase是把查询的词先分词成一个或者多个term,然后按照slop(默认是0,也就是多个term必须紧邻)确定多个term之间的最大移动距离来返回结果. 
如果 刘德华 被拆成 liu de hua 三个term,使用match_phrase查询 德华刘,slop为0时可以不会返回结果,但是slop为2时能查到刘德华这条记录
 
 

fantuan

赞同来自: yeziblo

对于拼音,不能像英文可以用模糊查询的编辑距离去做调整。因为拼音本身是一个词语,修改/替换一个字符没有意义。
提供一个思路。搞一个keep_joined_full_pinyin为true的自定义拼音分词器,不切词,只保留全拼音,例如新北市-> xinbeishi, 搞一个字段用这个分词器解析。第一次用prefix查询这个字段,只召回新北市。如果没有召回,再查询默认pinyin分析其解析的字段。这样也能满足liudehua, dehua liu都召回刘德华的情况。

要回复问题请先登录注册