如何将地理距离过滤器与布尔项查询

时间:2016-04-22 23:59:26

标签: java elasticsearch spring-data-elasticsearch

如何使用Elasticsearch 1.6 / 1.7版本地理距离过滤器和bool术语查询。如何和这两个合并这两个查询

原始查询:

{
  "query": {
        "bool": {
          "must": [
            {
              "term": {
                "categories": "tv"
              }
            }
          ],
          "should": [
            {
              "term": {
                "subCategory": "led"
              }
            }
          ],
          "minimum_should_match": 1,
          "boost": 2
        }
      }
    }

我想搜索距离为10英里的以上bool查询的产品

{
  "filtered": {
    "filter": {
      "geo_distance": {
        "distance": "10km",
        "sellerInfoES.address.sellerLocation": "28.628978,77.21971479999999"
      }
    }
  }
}

感谢Val!查询正在运行,我没有得到任何查询解析错误。但是,此地理查询未返回并且距离范围结果。我正在使用Elasticsearch 1.6并将sellerLocation存储为geo_point.Mapping:

{
  "SellerInfoES": {
    "type": "nested",
    "properties": {
      "sellerLocation": {
        "type": "geo_point"
      }
    }
  }
}

此geo_query无效

{
  "geo_distance": {
    "distance": "100km",
    "sellerLocation": {
      "lat": 28.628978,
      "lon": 77.21971479999999
    }
  }
}

1 个答案:

答案 0 :(得分:1)

您可以将这两种查询/过滤器组合在一起:

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "categories": "tv"
              }
            },
            {
              "nested": {
                 "path": "sellerInfoES",
                 "filter": {
                    "geo_distance": {
                       "distance": "10km",
                       "sellerInfoES.sellerLocation": {
                           "lat": "28.628978",
                           "lon":"77.21971479999999"
                       }
                    }
                 }
              }
            }
          ],
          "should": [
            {
              "term": {
                "subCategory": "led"
              }
            }
          ],
          "minimum_should_match": 1,
          "boost": 2
        }
      }
    }
  }
}