lasticsearch v:5.3
我有一个项目数组存储在弹性搜索中。
userId: "123"
items: [
{
"range": {
"from": 10,
"to": 30
},
"id": "1"
},
{
"range": {
"from": 20,
"to": 100
},
"id": "2"
},
{
"range": {
"from": 5,
"to": 90
},
"id": "3"
},
]
这只是单一记录。将其视为包含项目密钥的多个记录。现在,我想用ID执行搜索查询,并受到尊敬的范围。所以我当前的查询就像这样
GET product/item/_search{
"query": {
"bool": {
"filter": [
{
"term": {
"items.id": "1"
}
},
{
"range": {
"items.range.from": {
"gte": 20,
"lte": 30
}
}
},
{
"range": {
"items.range.to": {
"gte": 20,
"lte": 30
}
}
},
]
}
}
}
当前,这将执行具有ID = 1的搜索查询,并且范围值从> = 20和to< = 30。因此,它将返回所有包含ID = 2的记录,并且范围在20到30之间。因此,即使在其他记录中,如果不存在ID = 1,它也会搜索范围值,如果范围匹配,则会返回记录。
我想搜索具有ID = 1的记录,并且ID的值应在20到30之间。所以我的问题是,弹性搜索是否支持这种介于之间和查询?
您需要 items
字段是映射中的 nested
,因此:
PUT product
{
"mappings": {
"item": {
"properties": {
"itemId": {
"type": "long"
},
"items": {
"type": "nested",
"properties": {
"id": {
"type": "long"
},
"range": {
"properties": {
"from": {
"type": "long"
},
"to": {
"type": "long"
}
}
}
}
}
}
}
}
}
然后您将能够像这样查询:
GET product/item/_search
{
"query": {
"nested": {
"path": "items",
"query": {
"bool": {
"filter": [
{
"term": {
"items.id": "1"
}
},
{
"range": {
"items.range.from": {
"gte": 20,
"lte": 30
}
}
},
{
"range": {
"items.range.to": {
"gte": 20,
"lte": 30
}
}
}
]
}
}
}
}
}
ps:我建议您查看integer_range
数据类型而不是range.from/to
对象。只是我的两分钱