倒排索引為什么用FST(或者trie樹)而不是hashmap?hashmap只能滿足精確key查找,倒排需要匹配各種模糊搜索。
1. 召回
查詢query轉為集合運算的bool表達式
改寫優化下get_word_match,更加適用于短語
2. 排序:關鍵詞個數 - 向量余弦夾角- tf-idf
召回主要突出文檔與查詢的相似性、排序更主要是找到文檔與文檔之間的差異性、區分性從而獲得相關度的不同評分。
下方向量每一個維度表示一個詞組,所有詞組組成詞表。
每個文檔的打分實際就是在所選的向量空間下求查詢短語向量與當前文檔向量之間的相似度。
所以詞表選擇影響很大,可以選當前文檔的所有分詞、召回結果集的分詞集合,候選集(相當于倒排索引的詞典?)所有文檔的分詞、所有采集到的文檔的總分詞集合、整個文檔世界的分詞集合。一般選擇候選集。
對于長文檔,可以讓tf/文檔長度代替tf來抵消長文檔對詞頻的影響
預處理優化:在構建倒排索引的詞典vocabulary的時候,可以同時把所有文檔的tf/idf值都提前計算出來保存到dict,當執行搜索時可以直接從dict詞典中查出來
相對而言,粗排往往是整個搜索性能的瓶頸,粗排可以通過減少向量維度(如只用query生成詞典vocabulary空間),或者簡化算法(比如用ann算法,而不用tf/idf、bm25等復雜算法)等來快速降低文檔規模。另外,分布式環境下也有更多優化方式。