使用Java API进行Elasticsearch排序

4

我正在尝试根据totalEmployee字段对文档进行排序,索引为index_db,类型为departments

QueryBuilder qb = QueryBuilders.matchAllQuery();
            SearchResponse response = client.prepareSearch("index_db").setTypes("departments")
                    .addSort(SortBuilders.fieldSort("totalEmployee").order(SortOrder.ASC)).setQuery(qb)
                    .setSize(100).execute().actionGet();
            for(SearchHit hits :response.getHits()) {
                System.out.print("id = "+hits.getId());
                System.out.println(hits.getSourceAsString());
            }

但我遇到了错误:
例外线程"main"执行阶段[查询]失败; 所有分片都失败了;shardFailures {[q9B7Qs-DSXWC14pjc5zlNg][index_db][0]: RemoteTransportException[[elasticsearch_node][10.64.216.92:9375][indices:data/read/search[phase/query]]]; nested: IllegalArgumentException[默认情况下,文本字段上禁用Fielddata。要在内存中加载fielddata,请将fielddata=true设置为[totalEmployee]。请注意,这可能会使用大量内存。]; }{[q9B7Qs-DSXWC14pjc5zlNg][index_db][1]: RemoteTransportException[[elasticsearch_node][10.64.216.92:9375][indices:data/read/search[phase/query]]]; nested: IllegalArgumentException[默认情况下,文本字段上禁用Fielddata。要在内存中加载fielddata,请将fielddata=true设置为[totalEmployee]。请注意,这可能会使用大量内存。]; }{[q9B7Qs-DSXWC14pjc5zlNg][piyush_db][2]: RemoteTransportException[[elasticsearch_node][10.64.216.92:9375][indices:data/read/search[phase/query]]]; nested: IllegalArgumentException[默认情况下,文本字段上禁用Fielddata。要在内存中加载fielddata,请将fielddata=true设置为[totalEmployee]。请注意,这可能会使用大量内存。]; }{[q9B7Qs-DSXWC14pjc5zlNg][piyush_db][3]: RemoteTransportException[[elasticsearch_node][10.64.216.92:9375][indices:data/read/search[phase/query]]]; nested: IllegalArgumentException[默认情况下,文本字段上禁用Fielddata。要在内存中加载fielddata,请将fielddata=true设置为[totalEmployee]。请注意,这可能会使用大量内存。]; }{[q9B7Qs-DSXWC14pjc5zlNg][piyush_db][4]: RemoteTransportException[[elasticsearch_node][10.64.216.92:9375][indices:data/read/search[phase/query]]]; nested: IllegalArgumentException[默认情况下,文本字段上禁用Fielddata。要在内存中加载fielddata,请将fielddata=true设置为[totalEmployee]。请注意,这可能会使用大量内存。]; }
3个回答

7
作为被分析的字段,elastic要求将field data value设置为true才能执行排序操作。相反,您可以使用totalEmployee.keyword来实现所需的结果。
以下是可行的代码。
QueryBuilder qb = QueryBuilders.matchAllQuery();

SearchResponse response = client.prepareSearch("index_db").setTypes("departments")
                    .addSort(SortBuilders.fieldSort("totalEmployee.keyword")
                    .order(SortOrder.ASC)).setQuery(qb)
                    .setSize(100).execute().actionGet();

for(SearchHit hits : response.getHits())
{
     System.out.print("id = " + hits.getId());
     System.out.println(hits.getSourceAsString());
}

这不考虑重音。 - David

0

最终,我得到了上述问题的答案。问题是由于在Elasticsearch索引期间进行动态映射造成的。最好使用自己的映射,并在long类型字段上进行排序(在我的情况下,我试图根据keyword(字符串)字段类型进行排序)。


0
您可以在搜索请求中指定排序选项:
SearchRequest request = SearchRequest.of(req -> req
  .index(indexName)
  .query(query)
  .sort(SortOptions.of(so -> so
    .field(f -> f
      .field(sortField)
      .order(SortOrder.Asc)
    )
  ))
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接