elasticsearch 使用java API的Elasticsearch排序,elasticsearch,java,elasticsearch,Java" /> elasticsearch 使用java API的Elasticsearch排序,elasticsearch,java,elasticsearch,Java" />

elasticsearch 使用java API的Elasticsearch排序

elasticsearch 使用java API的Elasticsearch排序,elasticsearch,java,elasticsearch,Java,我试图根据totalEmployee字段对文档进行排序,其中索引是index_db,类型是departments,字段是totalEmployee 但我得到了一个错误: 线程main中的异常无法执行阶段[query],所有碎片都失败;shardFailures{[q9B7Qs-DSXWC14pjc5zlNg][index_db][0]:RemoteTransportException[[elasticsearch_node][10.64.216.92:9375][index:data/read/

我试图根据totalEmployee字段对文档进行排序,其中索引是index_db,类型是departments,字段是totalEmployee

但我得到了一个错误:

线程main中的异常无法执行阶段[query],所有碎片都失败;shardFailures{[q9B7Qs-DSXWC14pjc5zlNg][index_db][0]:RemoteTransportException[[elasticsearch_node][10.64.216.92:9375][index:data/read/search[phase/query]];嵌套:


IllegalArgumentException[Fielddata默认情况下在文本字段上禁用。在[totalEmployee]上设置Fielddata=true,以便通过取消反转索引将Fielddata加载到内存中。请注意,这可能会占用大量内存。];}{[q9B7Qs-DSXWC14pjc5zlNg][index_db][1]:RemoteTransportException[[elasticsearch_node][10.64.216.92:9375][index:data/read/search[phase/query]];nested:IllegalArgumentException[Fielddata默认情况下在文本字段上禁用。在[totalEmployee]上设置Fielddata=true,以便通过取消反转索引将Fielddata加载到内存中。注意,这可能会占用大量内存。];}{[q9B7Qs-DSXWC14pjc5zlNg][piyush_db][2]:RemoteTransportException[[elasticsearch_node][10.64.216.92:9375][index:data/read/search[phase/query]];嵌套:IllegalArgumentException[Fielddata默认情况下在文本字段上禁用。在[totalEmployee]上设置Fielddata=true为了通过取消反转索引将fielddata加载到内存中。请注意,这可能会占用大量内存。]}{[q9B7Qs-DSXWC14pjc5zlNg][piyush_db][3]:RemoteTransportException[[elasticsearch_node][10.64.216.92:9375][Indexes:data/read/search[phase/query]];嵌套:IllegalArgumentException[默认情况下,文本字段上禁用Fielddata。在[totalEmployee]上设置Fielddata=true,以便通过取消反转索引将Fielddata加载到内存中。请注意,这可能会使用有效内存。]}{[q9B7Qs-DSXWC14pjc5zlNg][piyush_db][4]:RemoteTransportException[[elasticsearch_node][10.64.216.92:9375][Indexs:data/read/search[phase/query]]];嵌套:IllegalArgumentException[Fielddata默认情况下在文本字段上禁用。在[totalEmployee]上设置Fielddata=true,以便通过取消反转索引将Fielddata加载到内存中。请注意,这可能会占用大量内存。];}

最后,我得到了上述查询的答案。问题是由于在Elasticsearch中索引期间的动态映射。最好使用您自己的映射并对长类型字段进行排序。在我的示例中,我尝试根据关键字字符串字段类型进行排序。

由于totalEmployee被分析为字段,elastic要求字段数据值与执行排序操作。相反,您可以使用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());
}

这与重读无关
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());
}