假设我有一些文档,在名为“名称”的文本字段中包含以下值
abc xyz group
组x/组y
组1、组2、组3、组4
现在,假设我向ES发送一个简单的匹配查询,查询术语“组”:
{
"query": {
"match": {
"name": "group"
}
}
}
我期望的结果是,无论术语出现的频率、出现的位置等,所有3个文档都会以相同的分数返回。现在,我已经知道,我可以通过将我的匹配项包装为常量分数来实现这一点,如下所示:
{
"query": {
"constant_score": {
"filter": {
"match": {
"name": "group"
}
},
"boost": 1
}
}
}
但是,假设我现在想使用搜索词abc组进行查询。在这种情况下,我希望Document2和Document3返回相同的分数(匹配组),但Document1的分数更好,因为它同时匹配abc和组。
使用常量分数包装我的匹配查询,包含任何术语的文档返回相同的分数(即文档1、2和3为abc组返回相同的分数)。如果我删除了常量评分,那么文档3的评分可能是最好的,因为它包含了更多与搜索文本匹配的内容(组出现了4次)。
似乎我需要一种方法,在匹配
查询分析了我的搜索文本后,将常量_分数
查询移动到。有效地使abc组的查询成为两个恒定分数查询-一个用于abc组,另一个用于abc组。
有人知道实现这一目标的方法吗?
我利用Elasticsearch的独特令牌过滤器成功解决了这个问题:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-unique-tokenfilter.html
我已经将它添加到索引映射中的name
字段中,它看起来正在检索所需的结果,而不必担心constant_score
。
然而,请注意,所有这一切都是为了消除术语频率对得分的任何影响-其他指标(如字段长度)仍然会对结果产生影响。因此,这并不等同于我在问题中假设的使用后分析版本的常量分数,但这足以满足我当前的要求。