弹性搜索多地理点

时间:2017-01-05 21:58:25

标签: elasticsearch

现在寻找一下,看看是否可行。

我的文档在映射中有两个地理位置。

  1. originGeo
  2. destinationgeo
  3. 我正在寻找一个查询,我可以在originGeo和y miles of destinationGeo的x英里内找到所有文档。

    我目前正在尝试这两种不同的方式:

    1

    这不是我想要的,因为它每个地点使用相同的距离。但是,它似乎也只返回与destinationGeo有关的文件。

    {
        "query": {
            "filtered": {
                "filter": {
                    "bool": {
                        "must": [],
                        "must_not": [{
                            "term": {
                                "system": "boo"
                            }
                        }]
                    }
                },
                "query": {
                    "filtered": {
                        "filter": {
                            "geo_distance": {
                                "distance": "1mi",
                                "originGeo": {
                                    "lat": 33.9962144,
                                    "lon": -118.46887759999998
                                },
                                "destinationGeo": {
                                    "lat": 34.0348144,
                                    "lon": -117.58480250000002
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    

    2

    这导致解析错误:过滤器格式错误,start_object之后没有字段

    {
        "query": {
            "filtered": {
                "filter": {
                    "bool": {
                        "must": [],
                        "must_not": [{
                            "term": {
                                "system": "boo"
                            }
                        }]
                    },
                    "geo_distance": {
                        "distance": "1mi",
                        "originGeo": {
                            "lat": 33.9962144,
                            "lon": -118.46887759999998
                        },
                        "destinationGeo": {
                            "lat": 34.0348144,
                            "lon": -117.58480250000002
                        }
                    }
                }
            }
        }
    }
    

    任何帮助都会一如既往地受到赞赏!

1 个答案:

答案 0 :(得分:1)

ES 2.x及更高版本的以下查询应该执行您需要的操作

{
  "query": {
    "bool": {
      "filter": [
        {
          "geo_distance": {
            "distance": "1mi",
            "originGeo": {
              "lat": 33.9962144,
              "lon": -118.46887759999998
            }
          }
        },
        {
          "geo_distance": {
            "distance": "1mi",
            "destinationGeo": {
              "lat": 34.0348144,
              "lon": -117.58480250000002
            }
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "system": "boo"
          }
        }
      ]
    }
  }
}

如果你在ES 1.x上运行,那么你可以使用这个:

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "geo_distance": {
                "distance": "1mi",
                "originGeo": {
                  "lat": 33.9962144,
                  "lon": -118.46887759999998
                }
              }
            },
            {
              "geo_distance": {
                "distance": "1mi",
                "destinationGeo": {
                  "lat": 34.0348144,
                  "lon": -117.58480250000002
                }
              }
            }
          ],
          "must_not": [
            {
              "term": {
                "system": "boo"
              }
            }
          ]
        }
      }
    }
  }
}