1. 程式人生 > >一個簡單的記憶體倒排索引

一個簡單的記憶體倒排索引

有任務需要對使用者的詞,檢索到相應的廣告詞。(個性化的廣告詞),概括為:通過簡短(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基礎上再包了一層。