gpt4 book ai didi

elasticsearch - 在 Elasticsearch 中,不同单词的匹配得分应该高于一个单词的多个匹配

转载 作者:行者123 更新时间:2023-12-03 01:03:07 26 4
gpt4 key购买 nike

在我们的 Elasticsearch 中,我们索引了一些人,每个人都可以有多个标签。

以 2 人为例(全名 - (标签)):

  • Bart Newman -(巴特,工程师,首席执行官)
  • Bart Holland -(开发商、雇主)

  • 我们的搜索查询
    {
    "multi_match": {
    "type": "most_fields",
    "query": "bart developer",
    "operator": "or",
    "boost": 5,
    "fields": [
    "fullname^5",
    "taggings.tag.name^5"
    ],
    "fuzziness": 0
    }
    }

    假设我们正在搜索“ bart developer ”。那么我们应该期望 Bart Holland 应该排在 Bart Newman 之前,但是因为 Bart Newman 有 巴特 以他的全名和 巴特 作为标签,他的得分比巴特·霍兰德(Bart Holland)高。

    有没有一种方法可以让我配置不同单词的匹配项( bart developer )可以比一个单词上的多个匹配项得分更高( bart )。

    我已经尝试过 -运算符(operator)没有成功。

    谢谢!

    最佳答案

    这是 most fields 的预期结果查询,它是以字段为中心而不是以术语为中心,来自 Docs

    most_fields being field-centric rather than term-centric: it looks for the most matching fields, when really what we’re interested is the most matching terms.



    另一个问题是 Inverse Document Frequency 在您的情况下也可能如此。我猜只有少数文档有标签 bart这就是为什么它的 IDF非常高,因此获得更高的分数。

    如以上链接所示,您应该看到文档是如何使用 validate 评分的。和 explain .

    有几种方法可以解决这个问题

    1)您可以使用 custom _all字段,即复制两个 full nametag使用 copy_to 将信息添加到新字段参数,然后查询它,但你必须 reindex你的数据

    2) 我认为更好的解决方案是使用 cross fields , 它需要 term-centric方法。从文档

    The cross_fields type first analyzes the query string to produce a list of terms, and then it searches for each term in any field.



    它还解决了 IDF通过将其混合到所有领域来发布。

    这应该可以解决您的问题。
    {
    "query": {
    "multi_match": {
    "type": "cross_fields",
    "query": "bart developer",
    "operator": "or",
    "fields": [
    "fullname",
    "tagging.tag.name"
    ],
    "fuzziness": 0
    }
    }
    }

    希望这可以帮助!

    关于elasticsearch - 在 Elasticsearch 中,不同单词的匹配得分应该高于一个单词的多个匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34631940/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com