一個簡單的記憶體倒排索引
有任務需要對使用者的詞,檢索到相應的廣告詞。(個性化的廣告詞),概括為:通過簡短(a,b,c,d) 檢索出 廣告詞(A, B ,C, D)
1、如果記憶體一個比較簡單的是在記憶體中做索引。
記憶體建索引的節省記憶體的方法:
1)廣告詞索引:id1-> A; id2 ->B; id3->C; id4 ->D;
2) 細粒度詞到廣告詞的倒排索引:
建立切詞後的細粒度的詞;假設A切出來有a,c; B切出來的也有: a, b
那麼a -> id1, id2
b -> id2
2、進一步加入權重:
在1)中加入對應的權重:
1)廣告詞索引:id1-> A,wegihtA; id2 ->B,weightB; id3->C,weightC; id4 ->D,weightD;
(A,weightA)是一個結構體,作為一個結構儲存。
2)倒排: 如果在建立倒排時,拉鍊太長,我們可以在建立的時候,按wegiht排序好, 按wegiht進行截斷。這樣在拉鍊的從前往後weight是降序排列。
3、檢索服務:
在檢索的時候,比如輸入為(a,c)兩個細粒度詞租組成的查詢源,則直接從倒排裡找到對應的下標值。
可以先求交(這就看實際需要了),如果求交沒有的話,在取並集。
a,c也相對應帶有權重(比如tf, 或者wordrank分值)f, 和weightA,wegihtB 加權,得到最終的各個query下標對應的分值,然後排序。
最終可以選取top,但為了多樣性一般是選了topN,然後在從中random選取n個(n為最終需要的)
4、最終分數:
最終分數可以是f 和weight的加權值。 根據需要,也可以是產出(a,c)對應的權重直接付給 最終的結果。
擴充套件延升:
小型的應用可以記憶體搞定,但是字典可能會越來越大,不同的業務需求也來越多,這種服務越來越多,純粹記憶體形式搞不定。 現在各種分散式的搜尋架構的ElasticSearch
運用比較廣泛,在Lucene基礎上再包了一層。