1

我是 ES 的新手。我正在尝试编写java程序来使用ES对MongoDB进行地理搜索(安装了河流插件等并能够使用java程序进行正常搜索)。我在 mongodb 中有一个集合(表),其中存储了纬度和经度值。现在我想根据我从 Java 程序传递的纬度和经度检索记录。

    FilterBuilder filter =  FilterBuilders.geoDistanceFilter("pin.location").lat(10).lon(20).distance(5,DistanceUnit.KILOMETERS).geoDistance(GeoDistance.PLANE);

    SearchResponse response = client.prepareSearch(INDEX)
                                    .setTypes(TYPE)
                                    .setSearchType(SearchType.QUERY_AND_FETCH)
                                    .setQuery(matchAllQuery())
                                    .setPostFilter(filter)
                                    .setFrom(0).setSize(60).setExplain(true)
                                    .execute()
                                    .actionGet();

如果我执行上述程序,我会得到“QueryParsingException[[mongoindex] failed to find geo_point field [pin.location]];” 这个 pin.location 是什么?我的 mongodb 表也有“纬度”和“经度”列。但在上面的过滤器中,我有“lat(10).lon(20)”。我在这里遗漏了一些东西。请帮助我理解。任何快速帮助都非常感谢.

全栈tarce:

},"解释":true}]]]; 嵌套:QueryParsingException[[mongoindex] 找不到 geo_point 字段 [pin.location]];org.elasticsearch.action.search.type.TransportSearchTypeAction$BaseAsyncAction.onFirstPhaseResult(TransportSearchTypeAction.java:233) 在 org.elasticsearch.action.search.type.TransportSearchTypeAction$BaseAsyncAction$1.onFailure(TransportSearchTypeAction.java:179) 在 org .elasticsearch.search.action.SearchServiceTransportAction$12.handleException(SearchServiceTransportAction.java:351) 在 org.elasticsearch.transport.netty.MessageChannelHandler.handleException(MessageChannelHandler.java:185) 在 org.elasticsearch.transport.netty.MessageChannelHandler.handlerResponseError( MessageChannelHandler.java:175) 在 org.elasticsearch.transport.netty.MessageChannelHandler。

谢谢, 斯里

4

2 回答 2

1

您正在创建的过滤器基于字段 pin.location

FilterBuilders.geoDistanceFilter("pin.location")

这回答了你关于这个 pin.location 的问题。开始查看索引的映射,看看您添加到 elasticsearch 的字段是否属于geo_point类型。我自己没有使用过 mongo 河,但是根据这个问题,您必须提供自己的映射。

https://github.com/richardwilly98/elasticsearch-river-mongodb/issues/218#issuecomment-35824681

下面是来自上述帖子的示例:

curl -XPUT 'http://localhost:9200/location_test' -d '
{
    "mappings": {
        "places": {
            "properties": {
               "location": {
                    "type": "geo_point"
                }
            }
        }
    }
}
'

可以在此处找到有关弹性搜索中 geo_point 的更多信息: http ://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-geo-point-type.html

于 2015-02-09T08:13:01.810 回答
0

谢谢提供信息。问题已解决。使用以下配置工作正常。

curl -XPUT 'http://localhost:9200/myindex' -d '
{
   "settings" : {
        "number_of_shards" : 2,
        "number_of_replicas" : 1
    },
   "mappings" : {
      "my_details" : {
          "properties" : {
              "my_id" : {"type" : "integer", "store" : "yes" , "index":"not_analyzed"},
              "location" : {"type" : "geo_point", "store" : "yes", "index":"not_analyzed"}
          }
      }
  }

}'

curl -XPUT 'http://localhost:9200/_river/my_river/_meta' -d '
{
    "type": "mongodb",
    "mongodb": {
        "db": "MyDatabase",
        "collection": "my_details"
    },
    "index": {
        "name": "myindex",
        "type": "my_details"
    }

}'

注意:MongoDb 在“MyDatabase”中有“my_details”集合。
干杯, Cdhar

于 2015-02-16T10:45:53.700 回答