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

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

  • 巴特·纽曼-(bart,engineer,ceo)
  • Bart Holland-(开发人员,雇主)

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

    假设我们正在搜索“巴特开发者”。那么我们应该期望Bart Holland会比Bart Newman早,但是因为Bart Newman的全名中有 bart bart 作为标记,所以他的得分要比Bart Holland高。

    有没有一种方法可以配置匹配不同单词( bart 开发人员)的单词,使其得分高于然后匹配一个单词( bart )。

    我已经尝试过 -operator,但没有成功。

    谢谢!

    最佳答案

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



    另一个问题是 Inverse Document Frequency ,在您的情况下也可能出现。我猜只有很少的文档具有名为bart的标签,这就是为什么IDF很高,因此得分更高的原因。

    如以上链接所示,您应该看到如何使用validateexplain对文档进行评分。

    有几种方法可以解决此问题

    1)您可以使用custom _all字段,即将full nametag信息都复制到带有copy_to参数的新字段中,然后对其进行查询,但是您必须对此数据进行reindex
    2)我认为更好的解决方案是使用cross fields,它需要term-centric方法。来自文档



    它还通过在所有字段中混合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/

    10-11 09:08