首页 > 解决方案 > 将 ES 查询转换为按键和值对嵌套对象进行排序到 Java API(ES 版本 6.2)的问题

问题描述

我想将下面的 ES 查询转换为 Java API

{
  "sort": [
{
  "nested_objects.Value": {
    "order": "desc",
    "nested_path": "nested_objects",
    "nested_filter": {
      "term": { "nested_objects.Key": "abc" }
      }
     }
   }
  ]
}

尝试编写如下查询,但看起来以前的工作方法现在在 ES 6.2 中已弃用

FieldSortBuilder mySort = SortBuilders.fieldSort("nested_objects.Value")
                .setNestedFilter(QueryBuilders.nestedQuery("nested_objects",
                        QueryBuilders.termQuery("nested_objects.Key", "abc"), ScoreMode.Avg))
                .order(SortOrder.DESC);

setNestedFilter() 似乎已弃用任何替代方案?

标签: javaelasticsearch

解决方案


我已从此弃用列表链接中复制了以下文本

org.elasticsearch.search.sort.FieldSortBuilder.getNestedFilter()
set nested sort with FieldSortBuilder.setNestedSort(NestedSortBuilder) and retrieve with FieldSortBuilder.getNestedSort()

org.elasticsearch.search.sort.FieldSortBuilder.getNestedPath()
set nested sort with FieldSortBuilder.setNestedSort(NestedSortBuilder) and retrieve with FieldSortBuilder.getNestedSort()

您可以看到他们如何提到您需要使用NestedSortBuilder

以下是您可以执行的操作。只需创建一个术语查询QueryBuilder,并在setFilter链接到setNestedSort.

    QueryBuilder query = QueryBuilders.boolQuery()
            .must(QueryBuilders.termQuery("nested_objects.Key", "abc"));

    FieldSortBuilder mySort = SortBuilders.fieldSort("nested_objects.Value")
            .order(SortOrder.DESC)
            .setNestedSort(new NestedSortBuilder("nested_objects")
            .setFilter(query));

希望能帮助到你!


推荐阅读