默认情况下,结果集会按照相关性进行排序 – 相关性越高,排名越靠前。 这一章我们会讲述相关性是什么以及它是如何计算的。 在此之前,我们先看一下sort
参数的使用方法。
为了使结果可以按照相关性进行排序,我们需要一个相关性的值。在ElasticSearch的查询结果中, 相关性分值会用_score
字段来给出一个浮点型的数值,所以默认情况下,结果集以_score
进行倒序排列。
JAVA代码示例:com.javablog.elasticsearch.query.impl.SortQueryImpl
@Override
public void queryMatch(String indexName, String typeName, String field,String keyWord) throws IOException {
SearchRequest searchRequest = new SearchRequest(indexName);
searchRequest.types(typeName);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery(field,keyWord));
searchSourceBuilder.sort("replyTotal");
searchRequest.source(searchSourceBuilder);
log.info("source:" + searchRequest.source());
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = searchResponse.getHits();
System.out.println("count:"+hits.totalHits);
SearchHit[] h = hits.getHits();
for (SearchHit hit : h) {
System.out.println("结果"+hit.getSourceAsMap() +",score:"+ hit.getScore());
}
}
@Override
public void sortQuery(String indexName, String typeName, String field,String keyWord,String sort,SortOrder sortOrder) throws IOException {
SearchRequest searchRequest = new SearchRequest(indexName);
searchRequest.types(typeName);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery(field,keyWord));
searchSourceBuilder.sort(sort, sortOrder);
searchRequest.source(searchSourceBuilder);
log.info("source:" + searchRequest.source());
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = searchResponse.getHits();
System.out.println("count:"+hits.totalHits);
SearchHit[] h = hits.getHits();
for (SearchHit hit : h) {
System.out.println("结果"+hit.getSourceAsMap() +",score:"+ hit.getScore());
}
}
@Override
public void multSortQuery(String indexName, String typeName, String field,String keyWord,String sort1,String sort2,SortOrder sortOrder) throws IOException {
SearchRequest searchRequest = new SearchRequest(indexName);
searchRequest.types(typeName);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery(field,keyWord));
searchSourceBuilder.sort(sort1, sortOrder);
searchSourceBuilder.sort(sort2, sortOrder);
searchRequest.source(searchSourceBuilder);
log.info("source:" + searchRequest.source());
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = searchResponse.getHits();
System.out.println("count:"+hits.totalHits);
SearchHit[] h = hits.getHits();
for (SearchHit hit : h) {
System.out.println("结果"+hit.getSourceAsMap() +",score:"+ hit.getScore());
}
}
演示用例:com.qianfeng.elasticsearch.test.document.SortQueryTest
//默认排序
@Test
public void testSortQueryByDefault() throws IOException {
sortQuery.queryMatch(indexName,type,"smsContent","中国银行");
}
//条件排序
@Test
public void testSortQueryBySort() throws IOException {
sortQuery.sortQuery(indexName,type,"smsContent","中国银行","replyTotal", SortOrder.DESC);
}
//多条件排序
@Test
public void testSortQueryByMultSort() throws IOException {
sortQuery.multSortQuery(indexName,type,"smsContent","中国银行","replyTotal","province", SortOrder.DESC);
}
完整代码:https://github.com/chutianmen/elasticsearch-examples