如何在ElasticSearch距离中输出geo_distance从多个位置选择的相同位置

时间:2016-11-16 23:35:31

标签: elasticsearch groovy geolocation

我有多个地点:

  • 文件1 -

    "联系":[ {     "地址":{         " geolocation":{             " lon":-73.5409,             " lat":41.2512         }     } } ]

  • 文件2 -

    {"联系":[ {     "地址":{         " geolocation":{             " lon":-73.7055,             " lat":40.6744         }     } }, {     "地址":[         {             " geolocation":{                 " lon":-73.9325,                 " lat":40.7482             }         },         {             " geolocation":{                 " lon":-87.9921,                 " lat":42.9959             }         },         {             " geolocation":{                  " lon":-95.4563,                  " lat":29.8775             }         }     ] } ] }

geo_distance按最近的位置查找两个文档。

"geo_distance": {
"distance": "275mi",
"distance_type": "plane",
"contact.address.geolocation": {
    "lat": 42,
    "lon": -71
    },
"unit": "mi"
}

}

但是当我添加脚本字段来输出lat,lon和distance

"script_fields": {
"distance_value": {
    "script": "doc.containsKey('contact.address.geolocation') ? doc['contact.address.geolocation'].value ? doc['contact.address.geolocation'].arcDistanceInMiles(42.2882,-71.0474)  : null : null"
    },
"geolocation": {
    "script": "doc.containsKey('contact.address.geolocation') ? doc['contact.address.geolocation'].value : null"
    }
}

从文档2输出随机地理定位元素。 对于文件1,它是147英里 但是对于文档2,它是1601英里,因为它的位置与geo_distance过滤器不同。

如何打印与geo_distance相同的值?我希望显示与我的观点的距离。

我试过这个剧本:

"script_fields": {
"distance_value": {
    "script": "if (doc.containsKey('contact.address.geolocation')==false) return null; min = 40000; for(e in doc['contact.address.geolocation']){ c=0; if(e!=null) c = e.arcDistanceInMiles(42.2882,-71.0474); if(c<min) min=c;}; return min;"
    }
}

它给出了错误 没有方法签名:org.elasticsearch.common.geo.GeoPoint.arcDistanceInMiles()适用于参数类型:(java.lang.Double,java.lang.Double) 此外,我认为它不会遍历所有的凝胶化领域。

1 个答案:

答案 0 :(得分:0)

我发现只有一种方法可以输出与过滤器相同的距离 - 添加&#34;排序&#34;元素:

"sort": [ 
    "_score",
    {
        "_geo_distance": {
            "contact.address.geolocation": [
                 -71,
                 42
            ],
        "order": "asc",
        "unit": "mi"
        }
    }
]