我有一个包含三个字段type
的索引,这是一个整数,coordinates
是一个地理位置,title
是一个字符串。我想查询title
上的匹配项。然后我想有条件地过滤我的结果。如果记录在{15}半径范围内,则应包括type
2的记录。那些不属于type
2的人只有在半径7.5公里范围内才能被包括在内。以下查询无法实现此目的;我宁愿把它包括在内,以便对索引的结构有所了解。此查询返回类型为2且在15 km范围内的匹配记录。我希望扩展此查询以包括不匹配类型2(即1)的匹配记录,但前提是它们落在7.5 km范围内。这是否可以在单个ES查询中实现?
我的过滤条件逻辑的伪代码:
if type == 2
filter
distance: 15 km
else
filter
distance 7.5 km
查询:
{
"query": {
"filtered": {
"query": {
"match": {
"title": "my search terms"
}
},
"filter": {
"and": [
{
"geo_distance": {
"distance": "15km",
"coordinates": [
-79.3931,
43.6709
]
}
},
{
"term": {
"type": "2"
}
}
]
}
}
}
}
ES 2.3
答案 0 :(得分:2)
你可以达到你想要的效果:
{
"query": {
"bool": {
"must": {
"match": {
"title": "my search terms"
}
},
"should": [
{
"bool": {
"must": [
{
"geo_distance": {
"distance": "15km",
"coordinates": [
-79.3931,
43.6709
]
}
},
{
"term": {
"type": "2"
}
}
]
}
},
{
"bool": {
"must": [
{
"geo_distance": {
"distance": "7.5km",
"coordinates": [
-79.3931,
43.6709
]
}
}
],
"must_not": {
"term": {
"type": "2"
}
}
}
}
]
}
}
}