排序與相關性(Sorting and Relevance)

本文翻譯自Elasticsearch官方指南的Sorting and Relevance一章的第一節。html

原文地址:http://www.elastic.co/guide/en/elasticsearch/guide/current/_sorting.htmlelasticsearch

排序

ES默認是經過相關度來對結果進行排序的,最相關的文檔在最前面。在本章裏,咱們闡述咱們所說的相關性以及它是如何計算的,可是咱們先講解sort參數及其如何使用。ide

爲了根據相關性進行排序,咱們須要把相關性表示爲一個值。在Elasticsearch裏,在返回的查詢結果中,咱們用一個浮點數值_score來表示相關性得分,所以默認的排序是按_score降序。ui

有時候,不能獲得一個有意義的相關性得分。好比,下面的查詢只返回了字段user_id值爲1的全部的tweets:翻譯

GET /_search
{
    "query" : {
        "filtered" : {
            "filter" : {
                "term" : {
                    "user_id" : 1
                }
            }
        }
    }
}
過濾器與_score無關,而且不含任何條件的match_all查詢對全部的文檔的_score都設置爲1。換句話說,全部的文檔被認爲是相等的相關性。

按字段值排序

     在這種狀況下,可能按tweets的時間排序是有意義的,最近的tweets在最前面。咱們可使用sort參數作到這一點:code

GET /_search
{
    "query" : {
        "filtered" : {
            "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沒有被計算出來的,由於在排序中不被使用。htm

date字段的值,被表示爲從時間紀元開始的毫秒數,在sort值裏返回。排序

第一,每個結果中都多了一個新的元素:sort,它包含咱們用做排序的那個字段值。在這個例子中,咱們按date排序,date是按着從紀元時間的毫秒數加入索引。這段長數字1411516800000與日期字符串2014-09-24 00:00:00UTC是等價的。索引

第二,字段_score與max_score都是null.計算_score很花費時間,何況一般它惟一的目的就是爲了排序。咱們不是按照相關性排序,因此跟蹤_score是沒有意義的。若是你仍然還想計算_score,你能夠將track_scores參數設置爲true.文檔

TIP: 做爲一個快捷方式,你能夠指定要排序的字段名字:

    "sort": "number_of_children"
字段名默認按升序排序,_score默認按降序排序。

多級排序

咱們也許要結合_score與date進行查詢,在展現全部匹配結果的時候,首先按照date排序,而後按相關度_score排序。

GET /_search
{
    "query" : {
        "filtered" : {
            "query":   { "match": { "tweet": "manage text search" }},
            "filter" : { "term" : { "user_id" : 2 }}
        }
    },
    "sort": [
        { "date":   { "order": "desc" }},
        { "_score": { "order": "desc" }}
    ]
}
順序是很重要的。結果首先按第一個標準排序。只有當結果的第一個sort 值相同時,而後再按第二個標準排序,等等。
多級排序不是必須含有_score字段。在腳本里,你可使用幾個不一樣的fields,geo-distance或者自定義值排序。

NOTE:Query-string 查詢也支持在查詢字符串裏使用sort參數自定義排序:

GET /_search?sort=date:desc&sort=_score&q=search

多值字段排序

當排序字段有不止一個值時,請記住,這些值沒有任何內部順序;一個多值字段只是一袋值(譯者注:全部值能夠看作一個總體)。你選擇哪一個進行排序呢?
對於數字與日期類型,你能夠經過min,max,avg或者sum等排序模式,將一個多值字段減小爲一個值。例如,你能夠經過以下方式,在date字段值集合中的最先的那個日期進行排序:
"sort": {
    "dates": {
        "order": "asc",
        "mode":  "min"
    }
}
相關文章
相關標籤/搜索