如何同时使用Elasticsearch的geo_point和geo_shape类型?

时间:2015-04-24 19:17:57

标签: elasticsearch

以下是我们的文档

{
    "geometry" : {
        "type" : "Point",
        "coordinates" : [ -87.662682, 41.843014 ]
    }
}

我们希望针对同一geo_shape字段对_geo_distance种进行geometry次搜索。前者需要geo_shape种类型,而后者需要geo_point

这两个索引单独成功,但不在一起

"geometry": {
    "type": "geo_shape"
}

"geometry": {
    "properties": {
        "coordinates": {
            "type": "geo_point"
        }
    }
},

到目前为止,我们已尝试过这些并且失败了

"geometry": {
    "type": "geo_shape"
},
"geometry.coordinates": {
    "type": "geo_point"
},

"geometry": {
    "copy_to": "geometryShape",
    "type": "geo_shape"
},
"geometryShape": {
    "properties": {
        "coordinates": {
            "type": "geo_point"
        }
    }
}

"geometry": {
    "copy_to": "geometryShape",
    "properties": {
        "coordinates": {
            "type": "geo_point"
        }
    }
},
"geometryShape": {
    "type": "geo_shape"
}

有关如何正确创建此索引的任何想法?

2 个答案:

答案 0 :(得分:4)

如果启用了脚本,那么您可以通过在映射

中指定transforms来实现它

会在这些方面看到一些东西:

put test/test_type/_mapping
{
   "transform": {
      "script": "if (ctx._source['geometry']['coordinates']) ctx._source['test'] = ctx._source['geometry']['coordinates']",
      "lang": "groovy"
   },
   "properties": {
      "geometry": {
         "type": "geo_shape"
      },
      "coordinates": {
         "type": "geo_point"
      }
   }
}

答案 1 :(得分:0)

我会使用function_score_query和原始地图只使用geo_shape。 Elasticsearch文档表明scoring by distance通常比按距离排序更好。

另外请注意,您是否使用带有geo_point的geo_bounding_box签出了?我不确定您使用的是geo_shape类型,但是您可以使用边界框复制它。查看示例here