【问题标题】:Spring data elasticsearch: setting sort value to entity fieldSpring data elasticsearch:将排序值设置为实体字段
【发布时间】:2015-12-10 15:23:59
【问题描述】:

使用 spring-data-elastic search 的地理距离排序从 elasticsearch 中查找最近的商店。

问题

StoreES 被 orgCodestoreCode 填充,因为它们位于 _source 中。 如何从搜索响应 sort[0] 值填充 distance 值。

StoreElasticSearchRepository 方法

public default List<StoreES> nearStores(Double latitude, Double longitude, Integer page, Integer size) {
    GeoDistanceSortBuilder distanceSortbuilder = SortBuilders.geoDistanceSort("location").point(latitude, longitude)
                        .order(SortOrder.ASC).unit(DistanceUnit.KILOMETERS);
                SearchQuery query = new NativeSearchQueryBuilder().withQuery(QueryBuilders.matchAllQuery())
                        .withSort(distanceSortbuilder).withPageable(new PageRequest(page, size)).build();
                FacetedPage<StoreES> storesPage = this.search(query);
    return storesPage.getContent();
}

上述查询等效的休息请求:

{
  "sort": {
    "_geo_distance": {
      "location": {
        "lat": 12.9259,
        "lon": 77.6229
      },
      "order": "asc",
      "unit": "km"
    }
  }
}

查询结果

    {
  "took": 5,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1365,
    "max_score": null,
    "hits": [
      {
        "_index": "app",
        "_type": "store",
        "_id": "99991258",
        "_score": null,
        "_source": {
          "id": 1,
          "orgCode": "ABC",
          "storeCode": "12345",
       },
      "sort": [
          0.49933591591981075
        ]
}

实体对象

public class StoreES{

    private String orgCode;

    private String storeCode;
  
    private Double distance;

// setter gettter methods
}

提前致谢。

【问题讨论】:

    标签: elasticsearch spring-data-elasticsearch elasticsearch-java-api


    【解决方案1】:

    解决方法

    public default List<StoreES> nearStores(Double latitude, Double longitude, String address, Integer page,
                Integer size) {
    DistanceSortBuilder distanceSortbuilder = SortBuilders.geoDistanceSort("location").point(latitude, longitude)
                        .order(SortOrder.ASC).unit(DistanceUnit.KILOMETERS);
                SearchQuery query = new NativeSearchQueryBuilder().withQuery(QueryBuilders.matchAllQuery())
                        .withSort(distanceSortbuilder).withPageable(new PageRequest(page, size)).build();
                FacetedPage<StoreES> storesPage = this.search(query);
    
        List<StoreES> stores = storesPage.getContent();
    
            // ##############calculate distance##################
            for (StoreES store : stores) {
                if (store.getLocation() != null) {
                    double distance = GeoDistance.DEFAULT.calculate(latitude, longitude, store.getLocation().getLat(),
                            store.getLocation().getLon(), DistanceUnit.KILOMETERS);
                    store.setDistance(distance);
                }
                store.setDistanceUnit(DistanceUnit.KILOMETERS.toString());
            }
            return stores;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-18
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-07
      • 2020-04-24
      • 1970-01-01
      相关资源
      最近更新 更多