【问题标题】:Using elasticsearch java API in order to compute a distance using the user's geolocation使用 elasticsearch java API 以使用用户的地理位置计算距离
【发布时间】:2016-03-30 20:26:41
【问题描述】:

我想使用 java 客户端 API 在文档的响应中返回一个计算字段。

具体来说,我希望用户传入一个地理点并使用该地理点来计算该地理点(在查询中传递)和文档的地理点(存储在 ES 索引中)之间的距离。

我知道使用如下脚本字段很容易实现:

curl -XGET 'http://127.0.0.1:9200/geonames/_search?pretty=1'  -d '
{
   "script_fields" : {
      "distance" : {
         "params" : {
            "lat" : 2.27,
            "lon" : 50.3
         },
         "script" : "doc[\u0027location\u0027].distanceInKm(lat,lon)"
      }
   }
}

以上内容引用自以下SO帖子:https://stackoverflow.com/a/9309674/536299

现在你如何使用 java API 或 Spring Data ES 来做这件事?

【问题讨论】:

    标签: java elasticsearch spring-data-elasticsearch


    【解决方案1】:

    您可以使用下面的方法将其转换为 java api

        import org.elasticsearch.action.search.SearchRequestBuilder;
    
        String script =  "doc[\u0027location\u0027].distanceInKm(lat,lon)";
        Map<String, Object> params = ...
    
        SearchRequestBuilder esRequestBuilder = new SearchRequestBuilder(<ES_CLIENT>);
        esRequestBuilder.addScriptField("distance", script, params);
    

    【讨论】:

    • 非常感谢@rahulroc,嗯。但是,脚本字段是否用于所有文档类型?如何将类型与上述脚本字段相关联?
    • 按类型..您的意思是索引中的弹性搜索类型? elastic.co/blog/index-vs-type
    • 是的,我的意思也是用spring data es的@org.springframework.data.elasticsearch.annotations.Document注解注解的java类。
    • 您还可以在您的实体@Document(indexName="myIndex", type="myType") 中指定类型。然后您可以在类型中搜索 curl -XGET '127.0.0.1:9200/<INDEXNAME>/<INDEXTYPE>/_search
    • 我明白了。关于java api,@Document 中的字段是如何添加的?
    猜你喜欢
    • 1970-01-01
    • 2020-07-16
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    相关资源
    最近更新 更多