ElasticSearch-排序

相關(guān)性排序

默認情況下,結(jié)果集會按照相關(guān)性進行排序 -- 相關(guān)性越高,排名越靠前。 那么相關(guān)性是什么以及它是如何計算的?我們先看一下sort參數(shù)的使用方法。

排序方式

為了使結(jié)果可以按照相關(guān)性進行排序,我們需要一個相關(guān)性的值。在ElasticSearch的查詢結(jié)果中, 相關(guān)性分值會用_score字段來給出一個浮點型的數(shù)值,所以默認情況下,結(jié)果集以_score進行倒序排列。

1.字段值排序

下面例子中,對結(jié)果集按照時間排序,這也是最常見的情形,將最新的文檔排列靠前。 我們使用?sort?參數(shù)進行排序:

返回結(jié)果中有兩個不同點:

<1>?_score?字段沒有經(jīng)過計算,因為它沒有用作排序。

<2>?date?字段被轉(zhuǎn)為毫秒當作排序依據(jù)。

首先,在每個結(jié)果中增加了一個?sort?字段,它所包含的值是用來排序的。 在這個例子當中?date?字段在內(nèi)部被轉(zhuǎn)為毫秒,即長整型數(shù)字1411516800000等同于日期字符串?2014-09-24 00:00:00 UTC。

其次就是?_score?和?max_score?字段都為?null。計算?_score?是比較消耗性能的, 而且通常主要用作排序 -- 我們不是用相關(guān)性進行排序的時候,就不需要統(tǒng)計其相關(guān)性。 如果你想強制計算其相關(guān)性,可以設(shè)置track_scores為?true。

2.默認排序

作為縮寫,你可以只指定要排序的字段名稱:

字段值默認以順序排列,而?_score?默認以倒序排列。

3.多級排序

如果我們想要合并一個查詢語句,并且展示所有匹配的結(jié)果集使用第一排序是date,第二排序是?_score:

排序是很重要的。結(jié)果集會先用第一排序字段來排序,當用用作第一字段排序的值相同的時候, 然后再用第二字段對第一排序值相同的文檔進行排序,以此類推。

多級排序不需要包含?_score?-- 你可以使用幾個不同的字段,如位置距離或者自定義數(shù)值。

4.字符串查詢參數(shù)排序

字符串查詢也支持自定義排序,在查詢字符串使用sort參數(shù)就可以:

5.多值字段排序規(guī)則

在為一個字段的多個值進行排序的時候, 其實這些值本來是沒有固定的排序的-- 一個擁有多值的字段就是一個集合, 你準備以哪一個作為排序依據(jù)呢?

對于數(shù)字和日期,你可以從多個值中取出一個來進行排序,你可以使用min,?max,?avg?或?sum這些模式。 比說你可以在?dates?字段中用最早的日期來進行排序:

6.“多值字段”排序

多值字段是指同一個字段在ES索引中可以有多個含義,即可使用多個分析器(analyser)進行分詞與排序,也可以不添加分析器,保留原值。

被分析器(analyser)處理過的字符稱為analyzed field,analyzed字符串字段同時也是多值字段,在這些字段上排序往往得不到你想要的值。 比如你分析一個字符?"fine old art",它最終會得到三個值。例如我們想要按照第一個詞首字母排序, 如果第一個單詞相同的話,再用第二個詞的首字母排序,以此類推,可惜 ElasticSearch 在進行排序時 是得不到這些信息的。

為了使一個string字段可以進行排序,它必須只包含一個詞:即完整的not_analyzed字符串。 當然我們需要對字段進行全文本搜索的時候還必須使用被?analyzed?標記的字段。

在?_source?下相同的字符串上排序兩次會造成不必要的資源浪費。 而我們想要的是同一個字段中同時包含這兩種索引方式,我們只需要改變索引(index)的mapping即可。 方法是在所有核心字段類型上,使用通用參數(shù)?fields對mapping進行修改。 比如,我們原有mapping如下:

改變后的多值字段mapping如下:

<1>?tweet?字段用于全文本的?analyzed?索引方式不變。

<2> 新增的?tweet.raw?子字段索引方式是?not_analyzed。

現(xiàn)在,在給數(shù)據(jù)重建索引后,我們既可以使用?tweet?字段進行全文本搜索,也可以用tweet.raw字段進行排序:

注:對?analyzed?字段進行強制排序會消耗大量內(nèi)存。?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容