我正在使用Geo Distance Filter和ElasticSearch,无论我搜索的是什么距离,elasticsearch 0.90.11都会返回零结果。
这就是我所做的:首先,使用地理映射删除/创建一个新索引:
curl -XDELETE 'http://localhost:9200/photos'
curl -XPOST 'http://localhost:9200/photos' -d '
{
"mappings": {
"pin" : {
"properties" : {
"location" : {
"type" : "geo_point"
}
}
}
}
}
'
然后,添加一个文档:
curl -XPOST 'http://localhost:9200/photos/photo?pretty=1' -d '
{
"pin" : {
"location" : {
"lat" : 46.8,
"lon" : -71.2
}
},
"file" : "IMG_2115.JPG"
}
'
然后搜索:
curl -XGET 'http://localhost:9200/photos/_search?pretty=1&size=20' -d '
{
"query" : {
"match_all" : {}
},
"filter" : {
"geo_distance" : {
"distance" : "10km",
"pin.location" : {
"lat" : "46.8",
"lon" : "-71.2"
}
}
}
}
'
但搜索产生零点击率:
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 0,
"max_score" : null,
"hits" : [ ]
}
}
任何人都知道为什么它在半径范围内找不到文件?作为一个有趣的附注,如上文所述的文档中描述的具有“查询”和“过滤器”作为子字段的“过滤”语法似乎根本不再起作用,似乎现在“查询”和“过滤器”需要是在json查询的顶层。
任何帮助表示赞赏...
答案 0 :(得分:6)
事实证明官方手册页不准确,映射需要
[Sun Feb 9 11:01:55 2014] # Request to: http://localhost:9200
curl -XPUT 'http://localhost:9200/photos?pretty=1' -d '
{
"mappings" : {
"photo" : {
"properties" : {
"Location" : {
"type" : "geo_point"
}
}
}
}
}
'
然后需要添加带有GPS数据的记录:
[Sun Feb 9 11:01:56 2014] # Request to: http://localhost:9200
curl -XPOST 'http://localhost:9200/photos/photo?pretty=1' -d '
{
"file" : "/home/mschilli/iphone/IMG_2115.JPG",
"Location" : [
46.8,
-71.2
]
}
'
然后是查询
[Sun Feb 9 11:05:00 2014] # Request to: http://localhost:9200
curl -XGET 'http://localhost:9200/photos/_search?pretty=1&size=100' -d '
{
"filter" : {
"geo_distance" : {
"distance" : "1km",
"Location" : [
36.986,
-121.443333333333
]
}
},
"query" : {
"match_all" : {}
}
}
'
将显示所需的结果,正确滤除所选GPS距离之外的结果。
答案 1 :(得分:0)
我有类似的问题,花了很多时间来解决。所以也许对某人会有帮助。 问题可能是,如果您想按距离搜索嵌套文件属性,例如:
something:
properties:
name:
type: text
city:
type: nested
properties:
location:
type: geo_point
您需要在主查询中添加嵌套查询:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-query.html