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

46scxncf  于 2021-06-15  发布在  ElasticSearch
关注(0)|答案(1)|浏览(251)

我有这个问题:

{
  "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 里面有约翰,这很好,但我想 name 更重要的是,如果我有在es 2的人 john 有两个名字的人 george john 我想要公正的 john 先上来。
我能做到吗?:)

tyky79it

tyky79it1#

要使任何字段比其他字段更重要,可以将其boost设置为更高的值。所以如果 fieldA^4 以及 fieldB^1 这意味着 fieldA 是你的4倍 fieldB . 因此,您可以为 name 使得分更加重要。
对于第二点,文档 name 字段值为 john 将有更高的分数比一个文件有 name 字段值为 george john (假设其他字段在两个文档中具有相同的数据)。之所以要使第二个doc(georgejohn)的结果更高,是因为所有字段的值都是负值。
为了迎合你的两个观点
提高 name 将所有字段的boost设置为正值。
因此,查询应如下所示:

{
  //"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计算分数的详细步骤。

相关问题