弹性搜索:为什么简单查询会返回不同的分数,而所有文档都是相同的?

时间:2016-09-18 10:41:21

标签: elasticsearch sense

我有这个查询返回给我年龄= 40,没有生活状态“ID”并且余额> = 20000且余额< = 30000?

的客户

查询如下:

POST /bank/_search?pretty
{
  "query": {
    "bool": {
      "must": [
        { "match": { "age": "40" } }
      ],
      "must_not": [
        { "match": { "state": "ID" } }
      ],
      "filter": {
        "range": {
          "balance": {
            "gte": 20000,
            "lte": 30000
          }
        }
      }
    }
  }
}

我觉得所有结果文档都具有相同的相关性,但elasticsearch已为每个文档分配了不同的分数。 示例结果:https://jsonblob.com/57de6b37e4b0dc55a4f67d54

我知道分数即将到来,因为我正在使用“匹配”查询。任何人都可以告诉: -

  1. 是否可以执行此查询以避免“匹配”并仅使用过滤器?因为我认为通过将age = 40和state =“ID”,我只是过滤结果集。

  2. 我们可以避免这种分数计算,因为在我们的场景中上述查询不需要这样做吗?

  3. 为什么这些文件的分数不同。因为查询对我来说似乎很简单,应该返回任何文档匹配此查询或不匹配。没有什么比得上匹配或稍微匹配。

1 个答案:

答案 0 :(得分:1)

如果您不关心相关性并希望避免分数计算,您可以切换到过滤器:

POST /bank/_search?pretty
{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "balance": {
              "gte": 20000,
              "lte": 30000
            }
          }
        },
        {
          "term": {
            "age": "40"
          }
        },
        {
          "not": {
            "term": {
              "state": "ID"
            }
          }
        }
      ]
    }
  }
}

如果您想知道为什么某些结果会得到一定的分数,您可以在查询部分上方添加explain: true并获得分数的每个结果细分。