Apache Lucene評分
計算文檔的評分屬性時,考慮如下因素:
- 文檔加權:對文檔建立索引時,對文檔的加權值
- 字段加權:查詢和索引時,對字段的加權
- 協調:基於文檔條數的協調因子。對包含更多查詢詞條的文檔,它提供更大的值
- 逆文檔頻率:基於詞條的因子,它告訴評分公式,給定詞條出現的頻率有多低。逆文檔頻率越高,詞條越罕見
- 長度規范:基於字段的規范化因子,它基於給定字段包含的詞條數目。字段越長,該因子給的加權值越小。這基本意味着更短的文檔更受分數的青睞
- 詞頻:基於詞條的因子, 描述給定詞條在文檔中出現的次數,詞頻越高,文檔的得分越高。
- 查詢規范:基於查詢的規范化因子,由每個查詢詞條比重的平方和計算而成。查詢規范用於查詢之間的得分比較。
從上述討論中得到:
- 匹配的詞條越罕見,得分越高
- 文檔字段越小,得分越高
- 字段加權越高,得分越高
- 文檔匹配的查詢詞條數目越高,字段越少,分數越高
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配置文件中注冊
搜索不同語言的內容
思路:
- 使用語言檢測庫檢測文檔使用的語言,或者由用戶將語言信息存放在文檔的一個字段中
- 定義索引映射時,根據語言字段設置分析器
{
"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定義如何將函數查詢所計算分數與查詢分數結合起來。取值如下
- multiply:默認行為,查詢得分與函數得分相乘
- replace:查詢的得分忽略,只用函數得分
- sum
- avg
- max
- min
score_mode定義函數計算得分如何結合在一起,取值如下:
- multiply:默認
- sum
- avg
- first
- max
- min
function節點中的可用函數如下:
- boost_factor函數:文檔得分乘以一個給定值
- script_score函數:使用腳本計算得分,函數返回得分
- random_score:通過指定seed值生成一個偽隨機分數,為了模擬隨性,每次都應該指定一個新的seed
- decay函數:基於一個單值得數值型字段計算而來
索引加權
查詢加權盡管很強大,但是如果在建立文檔的時候就知道哪些字段重要,可以在索引時加權,這樣效率也更高。
索引加權既可以通過在插入數據的時候實現,也可以在定義映射的時候加權。
同義詞
同義詞過濾器
過濾器的類型屬性(type)設置為synonym,synonyms屬性包括同義詞如"crime=>criminality";如果同義詞是一個文件,並且在config目錄下,則可以通過synonym_path設置
同義詞規則
- 顯式同義詞:crime=>criminality
- 等效同義詞:war, star wars
- 擴展同義詞:a,b => c,d a或b將被擴展到c和d