居然是你

请问ik分词后能实现类似 like%关键字% 的模糊查询么?

Elasticsearch | 作者 zhufengwnsh | 发布于2019年11月05日 | 阅读数:4584

我用ik分词后, 如果用match查询,会有太多不需要的结果, 如果用match_phrase查询, 会出现查不到的情况, 比如"性能测试" 被分为"性能" "测试" 2个词语, 但是我希望输入"能测"也能查询到, 其实就是要实现数据库的 like %能测% 功能, 请问有办法实现么
已邀请:

tacsklet - 公司有用到es

赞同来自: AYOU

我觉得这种情况不要用ik了,ik的目的是分词,你的查询场景不是一个词也要查到,用ik没有意义了,建议用edge做分词,然后查询的时候用wildcard * 查询,可以实现你想要的结果。

zhuo

赞同来自:

这有点难吧,总是要拆词的。

Zach

赞同来自:

我看有这么条设定,不知道 能不能帮到你:
 
ik_max_word 和 ik_smart 什么区别?

ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合,适合 Term Query;

ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase 查询。
https://github.com/medcl/elasticsearch-analysis-ik
页面滚动到底

liuxg - Elastic

赞同来自:

如果你想在输入“性能”的情况下,也能查到,那么你可以使用match,而不用match_phrase。match_phrase是需要查到两个token/term,并且它们是按照它们出现的顺序。如果你觉得match返回的结果太多,你可以通过使用must和should相结合的方式来做。

WarrenW

赞同来自:

用默认的standard分词器,中文一个字一个词 然后再用match_phrase 做查询

God_lockin

赞同来自:

试试用multi_field?
第一遍搜索走
content.ik: "性能测试"
如果召回结果不理想,第二遍走
content.ngram: "能测"
 
"content": {
"type": "text",
"fields": {
"text":{
"type":"text",
"analyzer":"ngram_analyzer"
},"keyword":{
"type":"text",
"analyzer":"ik_smart"
}
}
}

core_wzw - 某AILab搜索技术负责人

赞同来自:

上面都在回答些啥,追加一个wildcard模糊匹配的dsl就行了。候选集不大的情况下顺便用,反之不建议用模糊匹配做搜索。

要回复问题请先登录注册