2

我有这个查询返回给我年龄 = 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. 为什么这些文件有不同的分数。由于查询对我来说似乎很简单,它应该返回与此查询匹配或不匹配的文档。这里没有什么比紧密匹配或轻微匹配。

4

1 回答 1

1

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

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

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

于 2016-09-19T10:07:12.070 回答