1. 程式人生 > >ElasticSearch之排序使用-ES常用排序方法

ElasticSearch之排序使用-ES常用排序方法

       在搜尋系統中,最常遇到的一個需求就是排序,同時排序也是搜尋引擎需要改造最多的地方。

常見排序一般有如下兩類:
(1)按照相似度匹配得分排序

(2)按照指定欄位排序

    相似度得分排序是系統預設的排序方式,更多時候,我們需要按照指定欄位排序。lucene中,基於欄位內容的排序是由FieldComparator介面來實現的,在排序中又分為單欄位排序和多欄位排序。在排序速度方面,數值型別排序速度最快,在lucene中數值型別的排序是由 NumericComparator 的派生類來實現,NumericComparator派生類支援 float、double、int 、long 四鍾型別(日期在底層會轉化為long型儲存)。
     字串型別的欄位一般都需要進行搜尋的,那麼需要對其進行分詞處理。分詞處理的結果就是將該字串解析為多個詞條。在lucene層面,根據docid可以取到多個索引詞條,而無論採用哪個索引詞條來進行排序其實都正確。
     所以為了對字串型別欄位進行排序,需要儲存整個字串作為一個索引詞條,同時為了保證該欄位能夠被搜尋,還要儲存該字串analyzed的結果(即需要儲存完整的字串作為一個詞條,同時又分詞索引)。

在ES中為實現該功能,ES提供了 multi-field mapping 機制,配置通過配置即可實現欄位即分詞,又可排序:

"title": {  
    "type":     "string",
    "analyzer": "ansj",
    "fields": {
        "sort": {
            "type":  "string",
            "index": "not_analyzed"
        }
    }
}

通過title欄位作為搜尋,而用title.sort欄位作為排序:

GET /_search
{
    "query": {
        "match": {
            "title": "elasticsearch"
        }
    },
    "sort": "title.sort"

}

Lucene標準語法中多欄位排序:
{
  "from": 0,
  "size": 10,
  "query": {
    "query_string": {    "query": "*:*",    "default_operator": "and"  }
  },
  "sort": [

    {   

     "title.sort": { "order": "desc"   },

      "_score": {   "order": "desc"   }
    }
  ]

}

預設欄位排序:

{
  "from": 0,
  "size": 10,
  "query": {
    "query_string": {    "query": "title:test",    "default_operator": "and"   }
  },
  "sort": [
    {
      "rpgendatetime": {      "order": "desc",      "missing": "_last"     }
    }
  ]
}

使用指令碼排序:

{
    "query" : {
     "query_string": {
         "query": "",
         "default_operator": "and"
          }
    },
    "sort" : {
        "_script" : {
            "type" : "number",
            "script" : {
                "inline": "doc['field_name'].value * factor",
                "params" : {
                    "factor" : 1.1
                }
            },
            "order" : "asc"
        }
    }
}

相關推薦

ElasticSearch排序使用-ES常用排序方法

       在搜尋系統中,最常遇到的一個需求就是排序,同時排序也是搜尋引擎需要改造最多的地方。 常見排序一般有如下兩類: (1)按照相似度匹配得分排序 (2)按照指定欄位排序     相似度得分排序是系統預設的排序方式,更多時候,我們需要按照指定欄位排序。lucene中

排序常用排序

led content long problem name cstring define spl spa 問題 B: 【排序】常用排序法 時間限制: 1 Sec 內存限制: 64 MB提交: 69 解決: 41[提交] [狀態] [討論版] [命題人:] 題目描述 為

ElasticSearch實戰】——ES常用查詢條件與mysql對比

類比mysql,我們需要=、>、>=、<、<= 、or、and、in、like、count、sum、group by、order by、limit  在高版本的ES裡面使用了boolquery替換了filter 1、等於號= Quer

常用排序演算法 常用排序演算法

常用排序演算法  目錄 一、氣泡排序 二、選擇排序 三、插入排序 四、快速排序 五、堆排序 六、歸併排序 七、基數排序 八、希爾排序 九、桶排序 十、總結 一、氣泡排序 1、思路:首先,列

氣泡排序、插入排序、選擇排序、希爾排序、堆排序、歸併排序常用排序演算法的比較

掌握好常用的排序演算法,在實際的專案開發中可以節省很多的時間。每一種排序演算法在執行的效率上是存在差別的,這些微小的時間差,也許在平常的聯絡當中感覺不到,但是涉及到資料量比較大或者是在資源比較緊張的系統中就顯得尤其的重要,比如嵌入式系統。下面簡要介紹三種常用的排序演算法以及

資料探勘七種常用方法

資料探勘是指從資料庫的大量資料中揭示出隱含的、先前未知的並有潛在價值的資訊的非平凡過程。         利用資料探勘進行資料分析常用的方法主要有分類、迴歸分析、聚類、關聯規則、特徵、變化和偏差分析、Web頁挖掘等, 它們分別從不同的角度對資料進行挖掘。  分類    

Elasticsearch外掛es ik配置自定義中文分詞詞典

1. 首先需要安裝好ik 2. 配置自定義中文分詞詞典 如果寶寶們已經安裝好ik,在es中測試分詞成功的,可以新增自己的熱詞庫與停止庫 ① cd 到自己的elasticsearch-6.2.2/config/analysis-ik目錄下,可以看到有

javascriptDOM中常用方法

節點的成員屬性 firstChild:獲取節點的第一個子節點: var text = love.firstChild; lastChild:獲取節點的最後一個子節點:

Python3集合set常用方法

集合set常用的方法 方法 意義 S.add(e) 在集合中新增一個新的元素e;如果元素已經存在,則不新增 S.remove(e) 從集合中刪除一個元素,如果元

javascriptBOM中常用方法和屬性

方法: resizeTo():將瀏覽器調整到制定的大小 window.resizeTo(300,300); resizeBy():將瀏覽器在當前大小的情況下調整制定的高度和寬度 window.resizeBy(-100,-100)

資料結構和演算法分析排序篇--歸併排序(Merge Sort)和常用排序演算法時間複雜度比較(附贈記憶方法

歸併排序的基本思想 歸併排序法是將兩個或以上的有序表合併成一個新的有序表,即把待排序序列分成若干個子序列,每個子序列是有序的。然後再把有序子序列合併為整體有序序列。注意:一定要是有序序列! 歸併排序例項: 合併方法: 設r[i……n]由兩個有序子表r

常用排序選擇排序

length stat sort simple out blog 一個 i++ string 算法簡介:      選擇排序就是每一趟選擇最小或者最大的數,然後與起始位置進行交換。 實現思路:      1、從第一個數開始,找到最小或者最大的數,與第一個數進行交換。

常用算法----選擇排序、插入排序和希爾排序

插入 @override == 撰寫 [] 步長 1.5 shells 撲克 一些說明 我將會寫一系列關於算法的博客,因為我是程序員,並不是計算機科學家,也即我是搞工程的,並不是搞學術的,所以對於我來說,最重要的就是 1.有哪些算法 2.這些算法的原理 3.這些

常用排序方法 —— JavaScript 實現

一、氣泡排序 function bubbleSort(arr) { var len = arr.length; var temp; for (var i = 0; i < len; i++) { for (var j = 0; j

排序演算法——歸併排序(兩種方法及其優化)

1 public class MergeX implements Comparable<Merge> {// 歸併排序(優化後) 2 private static Comparable[] aux; 3 4 private static boolean less(C

資料結構與演算法分析----各種常用排序詳解

package cn.qunye.Sort_排序; import java.util.ArrayList; import java.util.List; /** * 合併排序: * 將待排序元素分成大小大致相同的兩個子集合,分別對兩個子集進行合併排序,最終將排好序的子集合併成所要求的排好序的集合 *

Atitit order algo 排序演算法 演算法道 目錄 1.1. 生活中常用排序是插入排序和選擇排序 2 2. 0.1 演算法分類 2 3. .2 演算法複雜度 3 4. 十大經典排序演算法(動圖

Atitit order algo 排序演算法 演算法之道   目錄 1.1. 生活中常用的排序是插入排序和選擇排序 2 2. 0.1 演算法分類 2 3. .2 演算法複雜度 3 4. 十大經典排序演算法(動圖演示) 2 4 4.1. 0、演算法概述 2 4

Java陣列的幾種常用操作方法(排序演算法及查詢)

陣列的查詢 查詢是在陣列中尋找特定元素的過程。 線性查詢法 線性查詢法將要查詢的關鍵字key與陣列中的元素逐個進行比較。如果匹配成功,線性查詢法則返回與關鍵字匹配的元素在陣列中的下標;如果沒有匹配成功,則返回-1。下面給出線性查詢法的程式: pr

常用內部排序演算法四:簡單選擇排序、直接插入排序和氣泡排序

前言 之所以把這三類演算法放在一塊,是因為除此之外的演算法都是在這三類演算法的基礎上進行優化的。簡單選擇排序的思想是每一趟n−i+1(i=1,2,...,n−1)個記錄中選擇最小的記錄作為有序序列的第i個記錄。直接插入排序的思想是將一個記錄插入到已經排好序的有

經典演算法歸併排序的C實現方法

以前寫過歸併排序的演算法,但是時間過了好久,忘記怎麼寫的了,(也是醉了)。正好複習演算法的時候遇到這個問題,就重新寫了一下,把遇到的一些問題順便記錄一下。 核心就是用兩個子陣列記錄分割後的兩個陣列中的變數, 然後依次比較大小即可。 這裡有個細節需要注意一下,