如何让多个范围查询在 elasticsearch 中工作?

How to get multiple range queries to work in elasticsearch?

我正在尝试在 elasticsearch 2.4.5 中使用多个 range 查询,但它们在相互组合时似乎不起作用。

我正在建立一个在线商店,它必须能够搜索和过滤产品,我正在使用 elasticsearch 来添加这些功能。商店必须能够按以下字段筛选产品:pricenum_in_stockpopularity.

以下是 elasticsearch 内部存储每个字段的方式:

这是我确定知道的:

  1. 当我对任何字段(pricepopularitynum_in_stock 单独执行 单个 范围查询时),效果很好。例如,当我按受欢迎程度过滤时——比方说 0.05 (5%) - 0.75 (75%)——效果很好。

  2. 但是,当我组合多个range查询时,popularity范围查询不起作用。但是 pricenum_in_stock 范围确实有效。在下面的示例查询中,范围 pricenum_in_stock 工作正常,但范围 popularity 不工作!

这是一个示例查询:

{
  "query": {
    "query": {
      "constant_score": {
        "filter": {
          "bool": {
            "must": [
              {
                "bool": {
                  "must": {
                    "range": {
                      "popularity": {
                        "gte": 0,
                        "lte": 0.02
                      },
                      "price": {
                        "gte": 0,
                        "lte": 10.25
                      },
                      "num_in_stock": {
                        "gte": 0,
                        "lte": 15
                      }
                    }
                  }
                }
              }
            ]
          }
        }
      }
    }
  },
  "from": 0,
  "size": 1
}

这是我得到的响应

{
  "took": 10,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 9,
    "max_score": null,
    "hits": [
      {
        "_index": "store",
        "_type": "modelresult",
        "_id": "product.360",
        "_score": null,
        "_source": {
          "product_name": "Tide Laundry Detergent",
          "price": 5.15,
          "popularity" : 0.044386262065587822,
          "num_in_stock": 5
        }
      }
    ]
  }
}

如您所见,我想按 popularity00.02 进行过滤,但它给了我一个 popularity 更大的结果!

这对我来说是个大问题,因为商店必须能够同时按多个范围进行筛选。有哪些策略可以解决这个问题?

范围查询的正确构造类似于

"bool" : {
  "must" : [
    {
      "range" : {
        "popularity" : ...
      }
    },
    {
      "range" : {
        "price" : ...
      }
    },
    {
      "range" : {
        "num_in_stock" : ...
      }
    },
  ]
}