ElasticSearch 學習筆記 - 9.排序

在 Elasticsearch 中, 相關性得分 由一個浮點數進行表示,並在搜索結果中經過 _score 參數返回
默認排序是 _score 降序elasticsearch

有時,相關性評分對你來講並無意義。例如,下面的查詢返回全部 user_id 字段包含 1 的結果:code

GET /_search
{
    "query" : {
        "bool" : {
            "filter" : {
                "term" : {
                    "user_id" : 1
                }
            }
        }
    }
}

若是不須要爲0分排序

GET /_search
{
    "query" : {
        "constant_score" : {
            "filter" : {
                "term" : {
                    "user_id" : 1
                }
            }
        }
    }
}

按照字段值排序

經過時間來對 tweets 進行排序是有意義的,最新的 tweets 排在最前。 咱們能夠使用 sort 參數進行實現:索引

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

能夠簡寫爲文檔

"sort": "number_of_children"

字段將會默認升序排序 ,而按照 _score 的值進行降序排序。字符串

多級排序

排序條件的順序是很重要的。結果首先按第一個條件排序,僅當結果集的第一個 sort 值徹底相同時纔會按照第二個條件進行排序,以此類推。string

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

字符串排序與多字段

被解析的字符串字段也是多值字段, 可是不多會按照你想要的方式進行排序。
若是你想分析一個字符串,如 fine old art , 這包含 3 項。
咱們極可能想要按第一項的字母排序,而後按第二項的字母排序,諸如此類,
可是 Elasticsearch 在排序過程當中沒有這樣的信息。ast

一個簡單的方法是用兩種方式對同一個字符串進行索引,這將在文檔中包括兩個字段:
analyzed 用於搜索,
not_analyzed 用於排序date

"tweet": {
    "type":     "string",
    "analyzer": "english"
}

將上面的轉爲下面的格式搜索

"tweet": { 
    "type":     "string",
    "analyzer": "english",
    "fields": {
        "raw": { 
            "type":  "string",
            "index": "not_analyzed"
        }
    }
}

使用 tweet 字段用於搜索,tweet.raw 字段用於排序

GET /_search
{
    "query": {
        "match": {
            "tweet": "elasticsearch"
        }
    },
    "sort": "tweet.raw"
}
相關文章
相關標籤/搜索