- 默認情況下,ElasticSearch 會根據算分進行排序;
- 可以使用 sort API 指定排序的規則;
POST /kibana_sample_data_ecommerce/_search { "size": 5, "query": { "match_all": { } }, "sort": [ {"order_date": {"order": "desc"}} ] }
在 Elasticsearch 中, 相關性得分 由一個浮點數進行表示,並在搜索結果中通過 _score 參數返回
默認排序是 _score 降序
有時,相關性評分對你來說並沒有意義。例如,下面的查詢返回所有 user_id 字段包含 1 的結果:
多級排序
排序條件的順序是很重要的。結果首先按第一個條件排序,僅當結果集的第一個 sort 值完全相同時才會按照第二個條件進行排序,以此類推。
GET /_search
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 在排序過程中沒有這樣的信息。。一個字符串如果進行分詞之后,如果你對字符串進行排序的話,他的排序規則就不想日期、數字那樣是固定的,如果想按照一個字符串作為一個整體進行排序,不進行分詞之后的排序,可以做下面的操作
一個簡單的方法是用兩種方式對同一個字符串進行索引,這將在文檔中包括兩個字段:
analyzed 用於搜索,
not_analyzed 用於排序
"tweet": { "type": "string", "analyzer": "english" }
將上面的轉為下面的格式
"tweet": { "type": "string", "analyzer": "english", "fields": { "raw": { "type": "string", "index": "not_analyzed" } } }
其中字段tweet字段進行查詢操作會進行分詞,tweet.raw字段不進行分詞,作為sort操作,整個字符串不進行分詞整個字符串進行排序,但是將文本字段用於聚合,排序需要開啟fielddata字段
https://segmentfault.com/a/1190000016645964

tweet
