【发布时间】:2018-07-27 09:54:20
【问题描述】:
假设我有一些文档,在名为 name 的文本字段中包含以下值
- 文档1:
abc xyz group - 文档2:
group x/group y - 文档3:
group 1, group 2, group 3, group 4
现在想象一下,我正在向 ES 发送一个简单的匹配查询以获取术语“组”:
{
"query": {
"match": {
"name": "group"
}
}
}
我想要的结果是所有 3 个文档都将以相同的分数返回,无论该术语出现的频率如何,出现在何处等等。
现在,我已经知道我可以做到这一点,方法是用 constant_score 包裹我的 match,如下所示:
{
"query": {
"constant_score": {
"filter": {
"match": {
"name": "group"
}
},
"boost": 1
}
}
}
但是,假设我现在想使用搜索词 abc group 进行查询。在这种情况下,我想要发生的是 Document2 和 Document3 将返回相同的分数(匹配 group),但 Document1 的分数更高,因为它同时匹配 abc 和 group。
使用 constant_score 包装我的 match 查询,包含任何术语的文档返回相同的分数(即 Document1、2 和 3 为 abc group 返回相同的分数)。如果我删除了constant_score,那么文档 3 的得分最高可能是因为它包含更多与搜索文本的匹配项(group 出现了 4 次)。
似乎在match 查询分析了我的搜索文本之后,我需要一种将constant_score 查询移动到的方法。有效地导致abc group 的查询成为两个constant_score 查询——一个用于abc,一个用于group。
有谁知道实现这一目标的方法吗?
【问题讨论】:
标签: elasticsearch