本人是 ES 新人,目前被安排一个项目有 ES 的,大概背景如下:
SaaS 项目,没有分库,ES 存储文章内容,并发不高没做分布式。ES 由前人设计,7.9 版本,一个索引存了所有数据,包括文章正文、标题、作者、摘要等等。正文采用 text 类型。整个索引用了 ik 分词并设置为 ik_max_word ,正文字段的搜索分词用 ik smart ,并设置了 fielddata 。
现在有租户提需求,希望通过关键词查询正文,并且要求结果里一定要出现完整的关键词。听上去很普通的需求?但是有问题啊啊,用 term 一直都会返回一些,不多,但完全没有搜索关键词的结果。
一开始以为是保留词的问题,所以把用户关心的几个关键词全加到保留词列表里( ik/config 下面,并配置好,重启,重建索引),但结果还是一样。也试过用 .keyword ,查询结果数量更少了。。
查了网上很多资料,看上去很简单的问题。有没有大佬给指个路?
感恩感恩。
1
riverdd 90 天前
|
2
rqrq 90 天前
把关键词加到 analysis-ik 目录里的 main.dic ,放到最前面。
查询例子 {"size":20,"from":0,"_source":["_id"],"highlight":{"require_field_match":false,"fields":{"title":{},"tags":{},"category":{}}},"query":{"bool":{"must":[{"range":{"status":{"gt":0}}},{"bool":{"should":[{"multi_match":{"query":"关键词","boost":10,"fields":["title^2","tags","category"]}}]}}]}}} |
![]() |
3
lix7 89 天前
不考虑停用词的话,match_phrase
考虑停用词的话,可以加一个 property ,直接单字切分,然后在这个属性上做 match_phrase |
![]() |
4
colinxt OP |
![]() |
5
lix7 88 天前
@colinxt #4 一个 property 可以有多个 field ,字段默认作为 ik field ,再加一个 field 配不同的分词器用于单字分词就行,一般看情况还可以加精准匹配 keyword 、拼音、前后缀啥的。
查询的时候可以用 name.ik ,name.ngram ,name.keyword, name.prefix, name.suffix, name.pinyin |
![]() |
6
colinxt OP @lix7 明白了,就是说这个 property 里的 field 相当于这个字段的不同视图,每个视图可以配置不同的分词器等配置属性,但内容上都是这个字段。
谢谢大佬! |
7
HetFrame 80 天前
先看看你的 es 构建版本 flavor 是不是 default ,如果是,可以用 wildcard 字段,这个字段专门用于"*关键词*"这样的模糊搜索,比直接在 keyword 类型字段上快很多。构建方法可以像 5 楼说的那样建立多字段类型,查询的话就 {"query":{"wildcard":{"content.wildcard":"*中国现代化化*"}}}
|