如何让多个范围查询在 elasticsearch 中工作?
How to get multiple range queries to work in elasticsearch?
我正在尝试在 elasticsearch 2.4.5
中使用多个 range
查询,但它们在相互组合时似乎不起作用。
我正在建立一个在线商店,它必须能够搜索和过滤产品,我正在使用 elasticsearch
来添加这些功能。商店必须能够按以下字段筛选产品:price
、num_in_stock
和 popularity
.
以下是 elasticsearch
内部存储每个字段的方式:
popularity
= float
(即 0.0098736465783,将转换为百分比以表示产品的受欢迎程度)
price
= float
(即 5.890000000,将四舍五入并转换为正确的价格格式)
num_in_stock
= long
(即 10)
这是我确定知道的:
当我对任何字段(price
、popularity
或 num_in_stock
单独执行 单个 范围查询时),效果很好。例如,当我按受欢迎程度过滤时——比方说 0.05 (5%)
- 0.75 (75%)
——效果很好。
但是,当我组合多个range
查询时,popularity
范围查询不起作用。但是 price
和 num_in_stock
范围确实有效。在下面的示例查询中,范围 price
和 num_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
}
}
]
}
}
如您所见,我想按 popularity
从 0
到 0.02
进行过滤,但它给了我一个 popularity
更大的结果!
这对我来说是个大问题,因为商店必须能够同时按多个范围进行筛选。有哪些策略可以解决这个问题?
范围查询的正确构造类似于
"bool" : {
"must" : [
{
"range" : {
"popularity" : ...
}
},
{
"range" : {
"price" : ...
}
},
{
"range" : {
"num_in_stock" : ...
}
},
]
}
我正在尝试在 elasticsearch 2.4.5
中使用多个 range
查询,但它们在相互组合时似乎不起作用。
我正在建立一个在线商店,它必须能够搜索和过滤产品,我正在使用 elasticsearch
来添加这些功能。商店必须能够按以下字段筛选产品:price
、num_in_stock
和 popularity
.
以下是 elasticsearch
内部存储每个字段的方式:
popularity
=float
(即 0.0098736465783,将转换为百分比以表示产品的受欢迎程度)price
=float
(即 5.890000000,将四舍五入并转换为正确的价格格式)num_in_stock
=long
(即 10)
这是我确定知道的:
当我对任何字段(
price
、popularity
或num_in_stock
单独执行 单个 范围查询时),效果很好。例如,当我按受欢迎程度过滤时——比方说0.05 (5%)
-0.75 (75%)
——效果很好。但是,当我组合多个
range
查询时,popularity
范围查询不起作用。但是price
和num_in_stock
范围确实有效。在下面的示例查询中,范围price
和num_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
}
}
]
}
}
如您所见,我想按 popularity
从 0
到 0.02
进行过滤,但它给了我一个 popularity
更大的结果!
这对我来说是个大问题,因为商店必须能够同时按多个范围进行筛选。有哪些策略可以解决这个问题?
范围查询的正确构造类似于
"bool" : {
"must" : [
{
"range" : {
"popularity" : ...
}
},
{
"range" : {
"price" : ...
}
},
{
"range" : {
"num_in_stock" : ...
}
},
]
}