elasticsearch赋予不同领域和方案更多的权重

时间:2019-01-01 16:45:39

标签: elasticsearch elasticsearch-5 elastic4s

我有这个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包含约翰,这很好,但是我想要{{ 1}}更重要,并且如果我在ES中有2个人name和2个人,例如john这样的人,我希望公正的george john首先出现。 / p>

我可以这样做吗? :)

1 个答案:

答案 0 :(得分:1)

要使任何字段都比其他字段更重要,可以将其增强值设置为更高的值。因此,如果fieldA^4fieldB^1的重要性是fieldA的重要性是fieldB的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
}

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