我正在使用ElasticSearch(1.4.0)来执行搜索。
我设法设置了ElasticSearch,除了geo_location过滤器之外,一切都很好。
每当我使用geo_location过滤器时,都不会返回任何结果。 请注意,ElasticSearch不会返回任何错误。即使我确保我的搜索点附近有实体,也没有返回命中。
这是我用来测试geo_distance过滤器的PHP params数组的简化版本:
$searchParams['index'] = 'myname';
$searchParams['type'] = 'myentity';
$searchParams['body']['query']['filtered']['filter']['geo_distance'] =
[
'distance' => '50km',
'address.geopoint' => $lat . "," $lng
];
这是卷曲请求体,也不会返回任何命中:
{
"query" : {
"filtered" : {
"filter" : {
"geo_distance" : {
"distance" : "50km",
"address.geopoint" : "51.43,-2.54"
}
}
}
}
}
这是我的映射:
{
"myname":{
"mappings":{
"myentity":{
"properties":{
"address":{
"type":"nested",
"properties":{
"country":{
"type":"string"
},
"geopoint":{
"type":"geo_point",
"lat_lon":true
},
"house":{
"type":"string"
},
"postcode":{
"type":"string"
},
"street":{
"type":"string"
},
"town":{
"type":"string"
}
}
},
"categories":{
"type":"string"
},
"tags":{
"type":"string"
}
}
}
}
}
}
以下是我希望获得的文件:
[_source] => Array (
[categories] => Array (
)
[tags] => Array (
)
[address] => Array (
[street] => Bristol Road
[geopoint] => 51.4307381,-2.5417914
[town] => Bristol
[house] => 1
[postcode] => BS4 5NL
[country] => UK
)
)
任何帮助将不胜感激。
答案 0 :(得分:4)
根据doc:
格式在[lon,lat]中,注意,这里是lon / lat的顺序,以符合GeoJSON。
所以我认为你应该尝试:
address.coordinates = [$lng, $lat]
编辑:在你的版本之后回答
自从您发布了地图后,我现在就看到了您的真实问题。当您使用address
{
"query": {
"nested": {
"path": "address",
"query": {
"filtered": {
"filter": {
"geo_distance": {
"distance": "50km",
"geopoint": "51.43,-2.54"
}
}
}
}
}
}
}
对象时,需要nested type类似于:
"type":"nested",
要么停止使用嵌套类型,要么停止使用嵌套类型(如果我没错,那么只是从映射中移除{{1}})。对于这个特殊用例并不是真的需要,你的原件也可以使用。