提问者:小点点

Elasticsearch:在匹配查询中应用恒定分数,但在分析搜索词之后?


假设我有一些文档,在名为“名称”的文本字段中包含以下值

  • 文档1:abc xyz group
  • 文档2:组x/组y
  • 文档3:组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组。

有人知道实现这一目标的方法吗?


共1个答案

匿名用户

我利用Elasticsearch的独特令牌过滤器成功解决了这个问题:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-unique-tokenfilter.html

我已经将它添加到索引映射中的name字段中,它看起来正在检索所需的结果,而不必担心constant_score

然而,请注意,所有这一切都是为了消除术语频率对得分的任何影响-其他指标(如字段长度)仍然会对结果产生影响。因此,这并不等同于我在问题中假设的使用后分析版本的常量分数,但这足以满足我当前的要求。