排序

为了按照相关性来排序,需要将相关性表示为一个数值。在 Elasticsearch 中, 相关性得分 (_score)由一个浮点数进行表示,并在搜索结果中通过 _score 参数返回, 默认排序是 _score 降序。注: filter不参与评分.


1. 按照字段排序(评分机制取消)

只有字段排序会使评分机制取消.

GET /_search
{
    "query" : {
        "bool" : {
            "filter" : { "term" : { "user_id" : 1 }}
        }
    },
    "sort": { "date": { "order": "desc" }}
}

搜索结果如下:

"hits" : {
    "total" :           6,
    "max_score" :       null, 
    "hits" : [ {
        "_index" :      "us",
        "_type" :       "tweet",
        "_id" :         "14",
        "_score" :      null, 
        "_source" :     {
             "date":    "2014-09-24",
             ...
        },
        "sort" :        [ 1411516800000 ] 
    },
    ...
}

可以主要到的是_score为null了,代表评分机制取消, 结果只按照时间排序

 

2. 多字段组合排序(多级排序)

如果我们还是希望通过字段排序的同时, 也引入评分机制

例: 假定我们想要结合使用 date 和 _score 进行查询,并且匹配的结果首先按照日期排序,然后按照相关性排序

GET /_search
{
    "query" : {
        "bool" : {
            "must":   { "match": { "tweet": "manage text search" }},
            "filter" : { "term" : { "user_id" : 2 }}
        }
    },
    "sort": [
        { "date":   { "order": "desc" }},
        { "_score": { "order": "desc" }}
    ]
}

Java代码如下:

        // 排序条件
        FieldSortBuilder ageSortBuilder = SortBuilders.fieldSort("date").order(SortOrder.ASC);
        // 默认score是倒序
        ScoreSortBuilder scoreSortBuilder = new ScoreSortBuilder();

        //组装条件
        NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(defaultQueryBuilder)
                .withHighlightBuilder(highlightBuilder)
                .withPageable(pageRequest)
                .withSort(ageSortBuilder)
                .withSort(scoreSortBuilder)
                .build();

排序条件的顺序是很重要的。结果首先按第一个条件排序,仅当结果集的第一个 sort 值完全相同时才会按照第二个条件进行排序,以此类推。

多级排序并不一定包含 _score 。你可以根据一些不同的字段进行排序,如地理距离或是脚本计算的特定值。

3.多值字段排序

如果是这个字段是集合类型例如 List<Date> dates, 那要怎么排序呢???

对于数字或日期,你可以将多值字段减为单值,这可以通过使用 min 、 max 、 avg 或是 sum 排序模式 。 例如你可以按照每个 date 字段中的最早日期进行排序,通过以下方法:

"sort": {
    "dates": {
        "order": "asc",
        "mode":  "min"
    }
}

Java代码如下:

FieldSortBuilder dateSortBuilder = SortBuilders
   .fieldSort("dates")
   .order(SortOrder.ASC)
   .sortMode(SortMode.MIN);

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐