Elasticsearch geo point union或类似的

时间:2014-07-31 15:29:22

标签: java elasticsearch

有谁知道在Elasticsearch中实现联合的最简单方法是什么?

我有很多带有字段disease_namelat/lon字段的文档。

e.g。

{
  "disease_name": 'Flu',
  "location": {
    "lat": 41.12,
    "lon": -71.34
  }
}

我想找到所有地理多边形中出现的所有疾病。 (OR查询不是一个合适的选择,因为这可能会发现仅存在于一个区域的任何疾病。)

这很容易作为'找到一个或多个',因为它只是一个包含多个多边形的OR查询并运行Elasticsearch术语聚合。

编辑 - 有关用例的其他信息

我希望执行UNION和INTERSECT。 以编程方式,暂时忘记ES,我实现这一目标的方式如下:

  1. 假设我有大量文档

    [
      {
        "disease_name": 'Flu',
        "location": {
          "lat": 41.12,
          "lon": -71.34
        }
      },
      ...
    ]
    
  2. 假设我定义了多个地理数据块(地理多边形)。

  3. 对于每种疾病,它是否存在于所有桶中,如果没有,则丢弃文件。
  4. 列出剩余文档的所有不同的disease_name值。
  5. 我希望尽可能避免以编程方式执行此操作。

1 个答案:

答案 0 :(得分:2)

确保您具有正确的映射(作为位置的地理位置),

我认为这可能会有所帮助。

POST x/diseases/_search
{
   "size": 0,
   "query": {
      "filtered": {
         "query": {
            "match_all": {}
         },
         "filter": {
            "and": {
               "filters": [
                  {
                     "geo_polygon": {
                        "location": {
                           "points": [
                              {
                                 "lat": 40.73,
                                 "lon": -74.1
                              },
                              {
                                 "lat": 40.83,
                                 "lon": -75.1
                              }
                           ]
                        }
                     }
                  },
                  {
                     "geo_polygon": {
                        "location": {
                           "points": [
                              {
                                 "lat": 40.73,
                                 "lon": -74.1
                              },
                              {
                                 "lat": 40.83,
                                 "lon": -75.1
                              }
                           ]
                        }
                     }
                  }
               ]
            }
         }
      }
   },
   "aggs": {
      "diseases": {
         "terms": {
            "field": "disease_name"
         }
      }
   }
}

在这里,您可以更改坐标,如果要为其他多边形添加类似的过滤器。

希望这有帮助!!