ElasticSearch geo_distance过滤器未返回任何匹配

时间:2015-01-22 13:30:08

标签: php elasticsearch

我正在使用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
    )
)

任何帮助将不胜感激。

1 个答案:

答案 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}})。对于这个特殊用例并不是真的需要,你的原件也可以使用。