term
推薦器提供了很方便的API基於特定字符串距離去獲取可選的建議詞,這些API允許單獨從這些流中獲取標記,然而,通常需要預先選擇的推薦以呈現給最終用戶,phrase
推薦器在term
推薦器的基礎上添加額外的邏輯去選擇完全修正的短語而不是基於ngram-language
模式的單獨地修正標記,實際上這些推薦器將能夠基於共生和頻率選出更好的標記。
總的來說,phrase
推薦器需要先前做過映射配置(即結構化數據mapping
)的來工作,下面是結構化的過程:
PUT test
{
"settings": {
"index": {
"number_of_shards": 1,
// 定義2個自定義的分析器
"analysis": {
"analyzer": {
"trigram": {
"type": "custom",
"tokenizer": "standard",
"filter": ["shingle"]
},
"reverse": {
"type": "custom",
"tokenizer": "standard",
"filter": ["reverse"]
}
},
// 定義過濾器
"filter": {
"shingle": {
"type": "shingle",
"min_shingle_size": 2,
"max_shingle_size": 3
}
}
}
}
},
// 域映射,作結構化數據映射
"mappings": {
"_doc": {
"properties": {
"title": {
"type": "text",
"fields": {
"trigram": {
"type": "text",
"analyzer": "trigram"
},
"reverse": {
"type": "text",
"analyzer": "reverse"
}
}
}
}
}
}
}
// 添加測試數據
POST test/_doc?refresh=true
{"title": "noble warriors"}
POST test/_doc?refresh=true
{"title": "nobel prize"}
一旦設置了分析器和映射,就可以在使用term
推薦器了(和phrase
推薦器的使用一樣),比如:
POST test/_search
{
"suggest": {
"text": "noble prize",
"simple_phrase": {
"phrase": {
"field": "title.trigram",
"size": 1,
"gram_size": 3,
"direct_generator": [{
"field": "title.trigram",
"suggest_mode": "always"
}],
"highlight": {
"pre_tag": "<em>",
"post_tag": "</em>"
}
}
}
}
}
// 返回的結果爲:
{
"took": 5,
"timed_out": false,
"_shards": ...
"hits": ...
"suggest": {
"simple_phrase": [
{
"text": "noble prize",
"offset": 0,
"length": 11,
"options": [
{
"text": "nobel prize",
"highlighted": "<em>nobel</em> prize",
"score": 0.5962314
}
]
}
]
}
}
短語推薦器接口的基本參數有:
field
:用於作基於語言模式的連詞查找字段,這個推薦器將會使用這個字段去獲取修正分數的統計數據,這個字段是強制的;gram_size
:設置在field
中連詞的最大數值,如果這個字段不包含連詞應該可以被忽略或者直接設置爲1,注意ES會嘗試基於特定的field
字段檢測連詞的長度,這個字段用了shingle
過濾器,如果沒有顯式指定那它的gram_size
將會被設置爲max_shingle_size
;real_word_error_likelihood
:表示一個術語被拼錯的甚至存在於字典中的可能性,默認是0.95對應於5%是真實單詞是拼寫錯誤;confidence
:信任級別定義了一個影響爲其他推薦詞的閾值輸入短語分數的因素,只有分數大於閾值的候選詞會包含在結果中,比如設置爲1.0
將會返回分數大於輸入短語的推薦詞(這也是默認值),如果設置爲0
將會返回前N個候選詞;max_errors
:術語(爲了形成修正大多數認爲拼寫錯誤)的最大百分比,這個參數可以接受[0,1)範圍內的小數作爲實際查詢項的一部分,也可以是大於等於1的絕對數。默認值爲1.0,與最多1對應,只有修正拼寫錯誤返回,注意這個參數設置太高將會影響ES性能,推薦使用像1或2這樣較小的數值,否則時間花在建議調用可能超過花在查詢執行的時間;separator
:表示在三目域中用於分隔術語的分隔符,如果沒有設置分隔符,那將使用空格字符作爲分隔符;size
:爲每個查詢詞生成的推薦詞的數值,提高這個參數可以提高更高的編輯距離,默認爲5;analyzer
:分析推薦文本的分析器,默認是通過field
使用推薦詞的搜索分析器;shard_size
:表示從每個獨立的碎片獲取推薦詞的最大數量,在降低階段,只返回前幾個推薦詞(具體幾個根據size
選項),默認是5;text
:設置文本以提供推薦詞;highlight
:設置高亮推薦,如果不提供該參數將不會有返回highlighted
字段;如果提供參數,那必須明確包含pre_tag
和post_tag
標籤(用於包裹高亮內容),如果多個標記連續改變整個短語的改變標記包裝而不是每個標記;collate
:檢查每一個推薦詞對指定的query
刪除推薦詞不存在匹配文檔的索引,推薦詞的校對查詢僅僅可以在從本地碎片中獲取的推薦詞的碎片上執行,query
參數必須指定,而且它可以被模板化,當前的推薦詞可以作爲{{suggestion}}
自動使用(可以使用在查詢中)。你還可以指定自己的模板params
——suggestion
值將被添加到指定的變量中,此外如果將返回所有推薦短語還可以指定一個prune
來控制,當設置爲true
時推薦詞將有一個額外的參數collate_match
,如果相應的短語匹配到文檔則爲true
,否則爲false
,prune
默認值是false
;
POST _search
{
"suggest": {
"text": "noble prize",
"simple_phrase": {
"phrase": {
"field": "title.trigram",
"size": 1,
"direct_generator": [{
"field": "title.trigram",
"suggest_mode": "always",
"min_word_length": 1
}],
"collate": {
// 這個查詢將爲每個推薦都運行一次
"query": {
"source": {
"match": {
// 這裏 {{suggestion}} 變量將會被每個推薦的文本替換掉
"{{field_name}}": "{{suggestion}}"
}
}
},
// 在 params 字段中通過 field_name 指定了一個額外變量,這個變量將會在匹配查詢中使用
"params": {"field_name": "title"},
// 指定每個推薦詞都返回一個額外的字段 collate_match,表示產生的短語是否匹配到了文檔
"prune": true
}
}
}
}
}
平滑化模式
phrase
推薦器支持通過多種平滑模型以平衡低頻短語(沒有出現在索引中的短語)和高頻連詞(在索引中至少出現過一次)的權重,參數有:
stupid_backoff
:一個簡單的補償模型,如果高階數爲0和折扣低階語法模型常數因子,補償作用將會發揮,默認discount
是0.4,stupid_backoff
是默認使用的模型;laplace
:一個平滑模型,使用額外的平滑將常數添加所有以平衡權重,默認alpha
是0.5;linear_interpolation
:是一種基於用戶提供的權值(lambdas)對一元、二元和三元圖取加權平均值的平滑模型,線性插值模式沒有提供任何默認值,要使用這種模型必須手動提供所有參數(包括trigram_lambda
、bigram_lambda
、unigram_lambda
);