【问题标题】:Elasticsearch dynamic mapping with geopoint使用 geopoint 的 Elasticsearch 动态映射
【发布时间】:2013-07-22 23:08:20
【问题描述】:

我们使用 Elasticsearch 来索引无模式数据。问题是我们要索引的大多数条目都包含"longitude""latitude""lat""long" 等字段。

索引该数据以便字段类型允许使用地理距离过滤器进行搜索的最佳方法是什么?

非常感谢。

【问题讨论】:

  • 我最终在我的应用程序中完成了它,并在索引之前将映射“放入”弹性搜索中。不是我想要的,但它仍然有效。喜欢这里建议stackoverflow.com/questions/16151646/…

标签: elasticsearch


【解决方案1】:

我知道您发布此内容已经有一段时间了,但如果有人像我一样偶然发现它,这里有一些方法可以做到。

在我们的例子中,我们需要一个动态半径,所以这是我们拥有的映射:

"mappings": {
    "mygeopoints": {
        "properties": {
            "geopoint": {
                "type": "geo_point",
                "lat_lon" : true
            },
            "radius": {
                "type": "long"
            }
        }
    }
}

我们的文档使用如下所示的 SQL 查询进行索引:

SELECT label, (lat || ',' || lon) as geopoint, radius FROM points;

我们将地理点作为一个字符串发送,其中包含用逗号分隔的纬度和经度。

现在搜索可以使用geo_distance filter的点:

"filter" : {
    "geo_distance" : {
        "geopoint" : [ 5.7, 43.5 ],
        "distance" : "15km"
    }
}

但在我们这边,我们需要一个动态范围,所以除了使用 script filter 之外,我们没有找到任何其他解决方案。

"filter" : {
    "script" : {
        "script" : "!doc['geopoint'].empty && doc['geopoint'].distanceInKm(43.5,5.7) <= doc['radius'].value"
    }
}

【讨论】:

猜你喜欢
  • 2019-07-04
  • 2012-08-31
  • 1970-01-01
  • 2014-05-28
  • 2019-08-27
  • 1970-01-01
  • 2017-08-30
  • 2021-03-10
  • 1970-01-01
相关资源
最近更新 更多