Elasticsearch--更好的搜索_加權得分,腳本,同義詞


Apache Lucene評分

計算文檔的評分屬性時,考慮如下因素:

  • 文檔加權:對文檔建立索引時,對文檔的加權值
  • 字段加權:查詢和索引時,對字段的加權
  • 協調:基於文檔條數的協調因子。對包含更多查詢詞條的文檔,它提供更大的值
  • 逆文檔頻率:基於詞條的因子,它告訴評分公式,給定詞條出現的頻率有多低。逆文檔頻率越高,詞條越罕見
  • 長度規范:基於字段的規范化因子,它基於給定字段包含的詞條數目。字段越長,該因子給的加權值越小。這基本意味着更短的文檔更受分數的青睞
  • 詞頻:基於詞條的因子, 描述給定詞條在文檔中出現的次數,詞頻越高,文檔的得分越高。
  • 查詢規范:基於查詢的規范化因子,由每個查詢詞條比重的平方和計算而成。查詢規范用於查詢之間的得分比較。

從上述討論中得到:

  1. 匹配的詞條越罕見,得分越高
  2. 文檔字段越小,得分越高
  3. 字段加權越高,得分越高
  4. 文檔匹配的查詢詞條數目越高,字段越少,分數越高

Elasticsearch的腳本功能

elasticsearch使用腳本執行的任何請求中,一些可能使用到的相似的屬性:

  • script:包含實際執行的腳本
  • lang:腳本的語言信息
  • params:包含參數和值,每個定義的參數都可以在腳本中使用,由於緩存,使用參數的腳本比嵌入常數的代碼執行更快

腳本執行過程中可以使用的對象

  • _doc: 它是org.elasticsearch.search.lookup.DocLookup對象的實例。通過它可以訪問當前找到的文檔,附帶計算的得分和字段的值
  • _source:是org.elasticsearch.search.lookup.SourceLookup對象的實例,通過它可以訪問當前文檔的_source
  • _fields:是org.elasticsearch.search.lookup.FieldsLookup對象的實例,通過它可以訪問文檔的所有字段

另一方面,在文檔更新過程中,Elasticsearch只通過_source屬性公開了ctx對象,通過它可以訪問當前文檔。

當訪問文檔中的字段時,上述三種方式都可以,_doc可以更快的訪問到分析的字段,_souce可以更快的訪問字段的原始值。

使用自定義的腳本庫

小腳本應該定義成文件,放在Elasticsearch的config/scripts目錄中。使用方式如下:

{
    "query":{
        "match_all":{

        }
    },
    "sort":{
        "_script":{
            "script":"sort_script",
            "type":"text",
            "order":"asc"
        }
    }
}

script屬性值直接調用我們自定義腳本的名字。

如果對腳本語言執行速度不滿意,可以編寫elasticsearch插件,插件應該放在lib目錄下,並且使用Setting API或者在yml配置文件中注冊

搜索不同語言的內容

思路:

  1. 使用語言檢測庫檢測文檔使用的語言,或者由用戶將語言信息存放在文檔的一個字段中
  2. 定義索引映射時,根據語言字段設置分析器
{
    "mappings":{
        "indextype":{
            "_analyzer":{
                "path":"lang"
            },
            "properties":{
                "lang":{
                    "type":"keywords",
                    "index":"not_analyzed"
                }
            }
        }
    }
}

lang字段的值是Elasticsearch知道的分析器的名字相同的值。

使用加權影響得分

加權

加權適用於下列地方:

  • query:給定查詢是復雜查詢的一部分,且比其他部分更重要
  • field:重要字段的加權
{
    "query":{
        "query_string":{
            "fields":[
                "from^5",
                "to^10",
                "subject"
            ],
            "query":"john"
        }
    }
}

假定一個索引含有from,to,subject三個字段,現在搜索john,以上查詢將生成3個小查詢,最后組合結果,to字段權重最大,from字段次之。

function_score查詢

{
    "query":{
        "function_score":{
            "query":{

            },
            "filter":{

            },
            "functions":[
                {
                    "filter":{

                    },
                    "FUNCTION":{

                    }
                }
            ],
            "boost_mode":"",
            "score_mode":"",
            "max_boost":"",
            "boost":""
        }
    }
}

一般來說,function_score查詢中可以使用查詢、過濾、函數和附加參數。每個函數可以有一個過濾器定義要應用的過濾結果。

function_score背后的邏輯是首先匹配文檔基於score_mode參數計算得分,然后,文檔的查詢得分由函數計算所得分數結合而成,結合基於boost_mode參數。

boost_mode定義如何將函數查詢所計算分數與查詢分數結合起來。取值如下

  1. multiply:默認行為,查詢得分與函數得分相乘
  2. replace:查詢的得分忽略,只用函數得分
  3. sum
  4. avg
  5. max
  6. min

score_mode定義函數計算得分如何結合在一起,取值如下:

  1. multiply:默認
  2. sum
  3. avg
  4. first
  5. max
  6. min

function節點中的可用函數如下:

  1. boost_factor函數:文檔得分乘以一個給定值
  2. script_score函數:使用腳本計算得分,函數返回得分
  3. random_score:通過指定seed值生成一個偽隨機分數,為了模擬隨性,每次都應該指定一個新的seed
  4. decay函數:基於一個單值得數值型字段計算而來

索引加權

查詢加權盡管很強大,但是如果在建立文檔的時候就知道哪些字段重要,可以在索引時加權,這樣效率也更高。

索引加權既可以通過在插入數據的時候實現,也可以在定義映射的時候加權。

同義詞

同義詞過濾器

過濾器的類型屬性(type)設置為synonym,synonyms屬性包括同義詞如"crime=>criminality";如果同義詞是一個文件,並且在config目錄下,則可以通過synonym_path設置

同義詞規則

  • 顯式同義詞:crime=>criminality
  • 等效同義詞:war, star wars
  • 擴展同義詞:a,b => c,d a或b將被擴展到c和d


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM