我有大约500个固定多边形,我希望能够检查这些多边形中有多少点。 也许某些点位于许多这些多边形内,有些点根本不在任何多边形中。 我知道elasticsearch geo_shape可以帮助我,但据我所知,我只能, 查询一个点以了解它是哪个多边形。
所以例如20分我应该连接到elasticsearch 20次(考虑rtt)
如果我在我的进程中加载所有多边形并迭代点和多边形,则应该有嵌套循环,计数为20 * 500 在每个循环中,我应该检测点是否是多边形 所以我认为这个脚本所需的执行速度和内存量都不行。
任何人都能帮助我找到更好的解决方案吗?
答案 0 :(得分:1)
我认为更好的方法是使用percolator
mapping type。首先,创建一个索引,您可以在其中存储geo_shape
个查询(queries
类型)。您还需要定义点的映射(在points
类型中),以便ES知道它所查询的内容:
PUT /my-index
{
"mappings": {
"points": {
"properties": {
"point": {
"type": "geo_shape"
}
}
},
"queries": {
"properties": {
"query": {
"type": "percolator"
}
}
}
}
}
然后,您可以为每个已编入索引的多边形索引一个geo_shape
查询。在这里,我们为您已存储在geo_shape
中的每个多边形定义polygon-index
个查询:
PUT /my-index/queries/query-id-for-polygon-id
{
"query" : {
"geo_shape": {
"location": {
"indexed_shape": {
"index": "polygon-index",
"type": "polygon-type",
"id": "polygon-id",
"path": "polygon-field"
}
}
}
}
}
最后,您可以针对要检查的每个点发出一个msearch
query,其中包含一个percolate
query。
单个点的一个percolate查询将如下所示。这个查询基本上是这样说的:"找到包含给定点的所有多边形查询"。因此,您将获得一个匹配列表,其中每个匹配是一个查询,并将包含匹配的多边形(查询)的ID。
POST /my-index/_search
{
"query" : {
"percolate" : {
"field" : "query",
"document_type" : "points",
"document" : {
"point" : {
"type" : "point",
"coordinates" : [-77.03653, 38.897676]
}
}
}
}
}
所以现在你需要为你想要检查的每个点创建一个以下格式:
POST /my-index/_search
{}
{"query": {"percolate": {"field": "query", "document_type" : "points", "document" : {"point" : {"type" : "point","coordinates" : [-77.03653, 38.897676]}}}}}
{}
{"query": {"percolate": {"field": "query", "document_type" : "points", "document" : {"point" : {"type" : "point","coordinates" : [-77.03653, 38.897676]}}}}}
{}
{"query": {"percolate": {"field": "query", "document_type" : "points", "document" : {"point" : {"type" : "point","coordinates" : [-77.03653, 38.897676]}}}}}
{}
{"query": {"percolate": {"field": "query", "document_type" : "points", "document" : {"point" : {"type" : "point","coordinates" : [-77.03653, 38.897676]}}}}}
...
你会回到每个点,包含它的多边形。