ES 新人请教大佬精确查询的问题

147 天前
 colinxt

本人是 ES 新人,目前被安排一个项目有 ES 的,大概背景如下:

SaaS 项目,没有分库,ES 存储文章内容,并发不高没做分布式。ES 由前人设计,7.9 版本,一个索引存了所有数据,包括文章正文、标题、作者、摘要等等。正文采用 text 类型。整个索引用了 ik 分词并设置为 ik_max_word ,正文字段的搜索分词用 ik smart ,并设置了 fielddata 。

现在有租户提需求,希望通过关键词查询正文,并且要求结果里一定要出现完整的关键词。听上去很普通的需求?但是有问题啊啊,用 term 一直都会返回一些,不多,但完全没有搜索关键词的结果。

一开始以为是保留词的问题,所以把用户关心的几个关键词全加到保留词列表里( ik/config 下面,并配置好,重启,重建索引),但结果还是一样。也试过用 .keyword ,查询结果数量更少了。。

查了网上很多资料,看上去很简单的问题。有没有大佬给指个路?

感恩感恩。

1801 次点击
所在节点    Elasticsearch
7 条回复
riverdd
147 天前
```
"query": {
"bool": {
"should": [
{"match": {"entry": { "query": req.kw, "minimum_should_match": "-25%"}}},
{"match_phrase": {"entry": { "query": req.kw, "slop": 5, "boost": 100}}}
],
},
},
```

试试这样?很久以前写的 query ,我都不记得这些参数啥意思了。
rqrq
146 天前
把关键词加到 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"]}}]}}]}}}
lix7
146 天前
不考虑停用词的话,match_phrase
考虑停用词的话,可以加一个 property ,直接单字切分,然后在这个属性上做 match_phrase
colinxt
145 天前
谢谢各位大佬。

我先试试 match_phrase 。

@rqrq 想问下,你的意思是说,es 用 dic 文件做分词是有顺序的?即放在前面的先分词?比如,“中国现代化”放前面,那么先分了这个词,如果 dic 后面有“中国”就不会分了?


@lix7 请教一下,单字切分的意思是给查询字段的每个字都分出来?这样不是跟 ik 分词矛盾了? 😂
lix7
145 天前
@colinxt #4 一个 property 可以有多个 field ,字段默认作为 ik field ,再加一个 field 配不同的分词器用于单字分词就行,一般看情况还可以加精准匹配 keyword 、拼音、前后缀啥的。
查询的时候可以用 name.ik ,name.ngram ,name.keyword, name.prefix, name.suffix, name.pinyin
colinxt
145 天前
@lix7 明白了,就是说这个 property 里的 field 相当于这个字段的不同视图,每个视图可以配置不同的分词器等配置属性,但内容上都是这个字段。
谢谢大佬!
HetFrame
137 天前
先看看你的 es 构建版本 flavor 是不是 default ,如果是,可以用 wildcard 字段,这个字段专门用于"*关键词*"这样的模糊搜索,比直接在 keyword 类型字段上快很多。构建方法可以像 5 楼说的那样建立多字段类型,查询的话就 {"query":{"wildcard":{"content.wildcard":"*中国现代化化*"}}}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1048081

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX