我无法让我的过滤器查询与geo_distance一起正常工作。它似乎返回0次点击。但是,如果我不想找到地理位置,那么我的所有其他查询都会起作用。
我正在使用ElasticSearch的2.3.1版
{
"name" : "Mar-Vell",
"cluster_name" : "elastic-logs",
"version" : {
"number" : "2.3.1",
"build_hash" : "bd980929010aef404e7cb0843e61d0665269fc39",
"build_timestamp" : "2016-04-04T12:25:05Z",
"build_snapshot" : false,
"lucene_version" : "5.5.0"
},
"tagline" : "You Know, for Search"
}
我通过使用json发出请求,将我的位置键映射到一种“geo_point”:
curl -XPUT 'http://10.0.7.181:9200/connections/profile/_mapping' -d '
{
"profile" : {
"properties" : {
"location" : {
"type" : "geo_point"
}
}
}
}
然后它返回。我假设我的改变有效。
{"acknowledged":true}
以下是我的数据示例
{
"_index": "connections",
"_type": "profile",
"_id": "92",
"_score": 1,
"_source": {
"profile": {
"location": {
"lon": -111.8909815,
"lat": 40.7607818
},
"age": 44,
"school": {
"undergraduate": {
"universityId": 1814,
"active": true,
"programId": 9
},
"graduate": {
"universityId": 1814,
"active": true,
"programId": 7
}
},
"bio": "Everything is awesome! "
},
"id": 0,
"active": false,
"optIn": true
}
}
我的查询是我发送给我们的ElasticSearch。没什么了不起的。
{
"filter" : {
"geo_distance" : {
"distance" : "1000mi",
"distance_type": "plane",
"location" : {
"lon": -111.8391029,
"lat": 40.7607818
}
}
},
"query" : {
"match_all" : {}
}
}
我尝试将距离改为1英里,100英里和1000英里。它应该返回100英里但没有显示的东西。我也试过使用不同的单位测量,看它是否会做任何事情。同样的交易。
坐标位于盐湖城。经度和纬度的顺序应该是正确的。我不确定我还应该尝试什么。
答案 0 :(得分:1)
您的位置字段名称为location
,但在您的查询中,您使用geoPoint
作为字段名称。试试这个:
{
"filter" : {
"geo_distance" : {
"distance" : "1000mi",
"distance_type": "plane",
"location" : {
"lon": -111.8391029,
"lat": 40.7607818
}
}
},
"query" : {
"match_all" : {}
}
}
更新:好的,这是我看到的明显错误所以我没有再看了。以下是我的一个项目的工作查询(包含您的值):
{
"query": {
"bool": {
"must": {
"match_all": []
},
"filter": {
"geo_distance": {
"distance": "1000mi",
"distance_type": "plane",
"location": {
"lat": "-111.8391029",
"lon": "40.7607818"
}
}
}
}
}
}
这应该有效。
答案 1 :(得分:0)
@Pelmered感谢您帮助我进行过滤查询。我发现我的映射操作不正确。现在一切都按预期工作。因此,请确保您正确映射它。
curl -XPUT 'http://10.0.7.181:9200/connections' -d '
{
"mappings":{
"profile":{
"properties":{
"location":{
"type":"geo_point"
}
}
}
}
}'