为什么我无法通过弹性搜索中的地理位置进行查询?

时间:2014-10-17 17:00:47

标签: elasticsearch geolocation

所以我正在试验ElasticSearch,这就是我所做的。

1)在我的索引上添加了一个名为“test”的geo_point映射

curl -XPOST localhost:9200/test -d '{
    "mappings" : {
        "type1" : {
            "_source" : { "enabled" : false },
            "properties" : {
                "location" : { "type" : "geo_point", "index" : "not_analyzed" }
            }
        }
    }
}'

2)索引正在测试的文件:

curl -XPUT 'localhost:9200/test/type1/1?pretty' -d '{
 "location" : {
                "lat" : 74,           
                "lon" : 90            
              }                      
}'  

3)然后用地理定位过滤器写了一个查询:

curl -XPOST 'localhost:9200/test2/_search?pretty' -d '{
    "filtered" : {
        "query" : {
            "match_all" : {}
},
        "filter" : {
            "geo_distance" : {
                "distance" : "200km",
                "location" : {
                    "lat" : 40,
                    "lon" : -70
                }
            }
        }
    }
}'

为此,我得到:

  

“error”:“SearchPhaseExecutionException [无法执行阶段   [查询],所有分片都失败了; shardFailures   {[QpGEHtdcReeYmt8X2tG26g] [TEST2] [0]:   RemoteTransportException [[小丑] [INET [/10.58.91.21:9301] [搜索/相位/查询]];   嵌套:SearchParseException [[test2] [0]:from [-1],size [-1]:Parse   失败[无法解析源[ na ]]];嵌套:   ElasticsearchParseException [无法从中派生xcontent   org.elasticsearch.common.bytes.ChannelBufferBytesReference@60d8bc76];

1 个答案:

答案 0 :(得分:0)

首先,在您的查询中(即第3段代码),localhost:9200/test2/_search?pretty应为localhost:9200/test/_search?pretty,即您没有查询正确的索引。

然后您的查询遗漏了query关键字(即filtered应该包含在query中),它应如下所示:

curl -XPOST 'localhost:9200/test/_search?pretty' -d '{
    "query": {
        "filtered": {
            "query": {
                "match_all": {}
            },
            "filter": {
                "geo_distance": {
                    "distance": "200km",
                    "location": {
                        "lat": 40,
                        "lon": -70
                    }
                }
            }
        }
    }
}