Java 按名称对结果进行排序
我的ElasticSearch数据库中有一个个人索引。我通过此方法获取所有的人:Java 按名称对结果进行排序,java,
elasticsearch,elasticsearch-jest,Java,
elasticsearch,Elasticsearch Jest,我的ElasticSearch数据库中有一个个人索引。我通过此方法获取所有的人: public List<Person> findAll() { SearchResult result = null; SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.matchAllQuery());
public List<Person> findAll() {
SearchResult result = null;
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
Search search = new Search.Builder(searchSourceBuilder.toString()).addIndex(PERSON_INDEX_NAME)
.addType(PERSON_TYPE_NAME).build();
try {
result = client.execute(search);
} catch (IOException e) {
}
List<SearchResult.Hit<Person, Void>> hits = result.getHits(Person.class);
return hits.stream().map(this::getPerson).collect(Collectors.toList());
}
公共列表findAll(){
SearchResult=null;
SearchSourceBuilder SearchSourceBuilder=新的SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
Search Search=new Search.Builder(searchSourceBuilder.toString()).addIndex(人名)
.addType(PERSON_TYPE_NAME).build();
试一试{
结果=client.execute(搜索);
}捕获(IOE异常){
}
List hits=result.getHits(Person.class);
返回hits.stream().map(this::getPerson.collect(Collectors.toList());
}
但是我想按姓名的字母顺序对结果进行排序(person有字符串id和字符串名称),但我不知道如何进行排序。
非常感谢您的帮助
我获取了ES给出的列表,并使用集合排序方法对其排序您的姓名字段是什么类型的 问题可能在于ElasticSearch将名称拆分为多个单词,然后它可以对任何单词进行排序。这可能会产生一些非常随机的结果(例如,“Zachary A.Zincstein”这个名字会出现得很高,因为它包含一个“A”)
一个解决方案是使用第二个字段,在映射中设置type
关键字
,并对其进行排序。这个答案可能会有所帮助:另一个问题(我刚才注意到它也是我的xDDD)有效,因为长Id,这种按名称(字符串)排序不起作用:cAnd您不能按名称排序,因为您的名称字段已被分析,对吗?您可能需要创建名称字段的另一个子字段来进行排序。这不会正确排序您的结果,但只能对您从ES收到的前十个结果进行排序?为什么只返回前十个?因为查询中没有大小,默认情况下ES只返回按分数排序的前十个结果。你需要做一些阅读:;-)感谢您的回答,我完成了该项目的工作,并被转移到另一个项目,如果我没记错的话,我们将数据库中的字段更改为“未分析”,以使ES返回已排序的值。