ElasticSearch 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到< = 30.因此它将返回包含id = 2且范围介于20到30之间的所有记录因此,即使在其他记录中,如果id = 1不存在,它将搜索范围值,如果范围匹配,将返回记录。
而不是这个我想搜索id = 1且id值在20到30之间的记录。 所以我的问题是弹性搜索在AND查询之间是否支持这种?
答案 0 :(得分:1)
您的映射中需要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
data type而不是range.from/to
对象。只是我的两美分