elasticsearch赋予不同领域和场景更多权重

elasticsearch giving more weight to different fields and scenarios

我有这个 ES 查询:

{
  "query": {
    "bool": {
      "should": [
        {
          "multi_match": {
            "query": "test",
            "fields": [
              "name^-1.0",
              "id^-1.0",
              "address.city^-1.0",
              "address.street^-1.0"
            ],
            "type": "phrase_prefix",
            "lenient": "true"
          }
        }
      ],
      "boost": 1.0,
      "minimum_should_match": "1"
    }
  },
  "from": 0,
  "size": 20
}

目前发生的情况是,当我搜索名字为 john 的人时,我会得到一堆结果,其中 id, address.city, address.street 包含 john,这很好,但我想要name 更重要,而且如果我在 es 中有 2 个人 john 和有 2 个名字的人 george john 我希望 john 先出现.

我能做到吗? :)

要使任何字段比其他字段更重要,您可以将其提升设置为更高的值。因此,如果 fieldA^4fieldB^1 这意味着 fieldAfieldB 重要 4 倍。因此,您可以为 name 字段提供更高的提升值,使其对评分更重要。

对于第二点,name 字段值为 john 的文档比 name 字段值为 george john 的文档得分更高 (假设其他字段在两个文档中具有相同的数据)。您获得第二个文档 (george john) 更高结果的原因是因为您提升了所有具有负值的字段。

所以为了迎合你的两点

  • 给予更高的提升 name
  • 将所有字段提升为正值。

所以查询应该如下所示:

{
  //"explain": true,
  "query": {
    "bool": {
      "should": [
        {
          "multi_match": {
            "query": "john",
            "fields": [
              "name^4.0",
              "id^1.0",
              "address.city^1.0",
              "address.street^1.0"
            ],
            "type": "phrase_prefix",
            "lenient": "true"
          }
        }
      ],
      "boost": 1,
      "minimum_should_match": "1"
    }
  },
  "from": 0,
  "size": 20
}

要了解有关 elastic 如何计算匹配文档分数的更多信息,您可以在查询中使用 "explain": true。这将给出结果中的详细步骤,由 elastic 计算分数。