背景介紹
在調(diào)整召回效果的時(shí)候,使用普通match得到的召回效果中規(guī)中矩,不能說錯(cuò)逼纸,但總歸覺得不適應(yīng)比較復(fù)雜的實(shí)際情況,特別是在沒有做語義分析的相關(guān)工作情況下蜘渣,簡(jiǎn)單的通過中文分詞->中文分詞淌铐,效果上并不盡如人意。結(jié)果上看通常是符合邏輯而不符合“人性”的蔫缸,即使我們通過了一些其他方式對(duì)結(jié)果進(jìn)行矯正腿准。而過于復(fù)雜的方式也會(huì)對(duì)性能上造成影響,相信比起一個(gè)精心計(jì)算的需要等個(gè)一兩秒的“精致結(jié)果”來說拾碌,還是一個(gè)可以立刻響應(yīng)的“差不多結(jié)果”會(huì)更加合適吐葱。
問題分析
通過大量的query結(jié)果來看,目前的召回方式對(duì)于搜索詞沒有一個(gè)總體順序的感覺校翔,當(dāng)query被分詞以后弟跑,所有詞的權(quán)重都是一樣的。舉例一個(gè)比較奇葩的搜索關(guān)鍵詞:“大清 銀幣”防症。
能看得到索引中有433個(gè)相關(guān)結(jié)果孟辑。
那如果把關(guān)鍵詞反過來變成一個(gè)不倫不類的關(guān)鍵詞呢“銀幣 大清”
毫無疑問召回結(jié)果是完全一樣的,因?yàn)樵趍atch層級(jí)上這兩次輸入完全沒有一點(diǎn)區(qū)別(相關(guān)性分?jǐn)?shù)小數(shù)點(diǎn)后的差異可以忽略蔫敲,索引是在動(dòng)態(tài)變化的饲嗽,以及還有分片計(jì)算的誤差)。
在這個(gè)例子中奈嘿,可能“大清銀幣”與“銀幣大清”出來的結(jié)果相關(guān)性都還不錯(cuò)貌虾,因?yàn)楸旧黻P(guān)鍵詞就比較偏僻,可以很有效的過濾不相干內(nèi)容指么,那如果是相對(duì)通用的關(guān)鍵詞呢酝惧,我希望能讓和用戶輸入搜索詞一模一樣的內(nèi)容更靠前,這時(shí)怎么做呢伯诬。
解決方案
官方文檔中關(guān)于match_phrase的描述
我們使用的是match_phrase來解決這個(gè)問題晚唇。
可以看到,在使用match_phrase語法后盗似,原本433個(gè)搜索結(jié)果中被過濾到僅剩8個(gè)搜索結(jié)果哩陕,這8個(gè)搜索結(jié)果中都是出現(xiàn)了“大清銀幣”關(guān)鍵詞,并且完全按照順序赫舒,而其他400多個(gè)文本悍及,只是同時(shí)包含了這兩個(gè)關(guān)鍵詞而已。我們?cè)侔殃P(guān)鍵詞反過來試試:
很好接癌,至少我們的索引里面沒有這么奇葩的文本心赶。433個(gè)文本里面完全沒有一個(gè)這樣的關(guān)鍵詞。
但是如果僅僅召回8個(gè)文本也是不行的缺猛,我的目的僅僅是抬高完全匹配的權(quán)重而不是完全過濾掉這400多個(gè)內(nèi)容缨叫,所以可以使用match和match_phrase進(jìn)行嵌套椭符,然后通過設(shè)置權(quán)重來區(qū)分,如下
問題總結(jié)
收效還是比較明顯的耻姥,在AB實(shí)驗(yàn)中可以看到用戶對(duì)于這個(gè)更新的反饋還是很不錯(cuò)的销钝。