代码之家  ›  专栏  ›  技术社区  ›  JohnBigs

弹性搜索为不同的领域和场景提供了更多的权重

  •  0
  • JohnBigs  · 技术社区  · 6 年前

    我有这个问题:

    {
      "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 更重要的是,如果我有两个人 厕所 有两个名字的人 george john 我想要公正的 厕所 先上来。

    我可以那样做吗?:)

    1 回复  |  直到 6 年前
        1
  •  1
  •   Nishant    6 年前

    要使任何字段比其他字段更重要,可以将其Boost设置为更高的值。所以如果 fieldA^4 fieldB^1 它意味着 fieldA 比…重要4倍 fieldB . 因此,您可以为 name 使得分更重要的领域。

    第二点,文件 名称 字段值为 john 将比具有 名称 字段值为 george john (假设其他字段在两个文档中具有相同的数据) . 你得到第二个医生的原因 (george john) 结果越高,是因为所有字段的值都是负值。

    所以为了迎合你的观点

    • 提高 名称
    • 将所有字段的值提升为正值。

    所以查询应该如下所示:

    {
      //"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
    }
    

    要进一步了解如何通过弹性计算匹配文档的分数,可以使用 "explain": true 在你的询问中。这将在结果中给出详细的步骤,弹性计算分数。