Elasticsearch中的条件过滤

时间:2017-05-11 02:00:10

标签: elasticsearch

我有一个包含三个字段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

1 个答案:

答案 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"
              }
            }
          }
        }
      ]
    }
  }
}