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

时间:2018-07-27 09:54:21

标签: elasticsearch

想象一下我有一些文档,这些值包含在名为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个文档都将以相同的分数返回。 现在,我已经知道我可以做到这一点,方法是将matchconstant_score包裹起来,就像这样:

{
    "query": {
        "constant_score": {
            "filter": {
                "match": {
                    "name": "group"
                }
            },
            "boost": 1
        }            
    }
}

但是,说我现在想使用搜索词abc group进行查询。在这种情况下,我想发生的是Document2和Document3将返回相同的分数(匹配group),但是Document1具有更好的分数,因为它同时匹配abcgroup

使用constant_score包裹我的match查询后,包含任何术语的文档将返回相同的分数(即,文档{1、2和3对于abc group返回相同的分数)。如果我删除constant_score,则可能是文档3得分最高,因为它与搜索文本的匹配项更多(group出现了4次)。

constant_score查询分析了我的搜索文本之后,似乎需要一种将match查询移至的方法。有效地导致对abc group的查询是两个constant_score查询-一个查询abc和一个查询group

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

1 个答案:

答案 0 :(得分:0)

我已经设法通过使用Elasticsearch的{​​{1}}令牌过滤器来解决此问题:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-unique-tokenfilter.html

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

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