1. 程式人生 > >搜索系統7:索引查詢方法與評價方法

搜索系統7:索引查詢方法與評價方法

如果 介紹 多個 一次 它的 存儲 標題 搜索系統 角度

一、 多條件的查詢方法:
之前已經介紹過倒排索引的結構。在查單個詞的時候比較簡單,直接查從索引裏找是否有這個詞對應的文檔列表就行了。但如果條件是and、or、not這樣的條件,怎麽處理呢?
and:對多個條件分別取文檔列表後,再取交集。
or:對多個條件分別取文檔列表後,再取並集。
not:對多個條件分別取文檔列表後,再取補集。
曾經以為這樣效率不高,但仔細想想。索引列表壓縮後最多也就幾mb的數據,這已經可存百萬級的列表了,在內存中對幾個幾mb的數據遍歷一下也要不了多少時間,更不用說可用二分等更高級的算法了,效率不是問題。
二、如何按相關性排序?
比如用戶搜"秋季 瘦身",可先按上面or的處理方法取出並集,但這麽多的文檔怎麽按相關性排序呢?如果索引裏的值已經足夠計算相關性,那麽直接用索引裏的值,不夠再讀取相應的文檔。具體方法有一次一單詞(Term at a Time)、一次一文檔(Doc at aTime)、跳躍指針(Skip Pointers)。

三、多字段的索引怎麽存儲


1.每個字段做一個索引文件,如下
標題字段
技術分享
描述字段
技術分享
2.在字段信息存在索引裏:
技術分享
這個字段可以不用名稱,可每個字段用一個比特位來表示。如總共有2個字段,則上對於"美容"這個詞的值為Doc7(tf,idf)(11),doc8(tf,idf)(10),Doc6(tf,idf)(01)

3.擴展列表方式
對每個字段做一個擴展列表,如下:
標題字段擴展 {doc1,(1,4)},{doc2,(6,8)}
{doc1,(1,4)}的意思是文檔1的標題所占的位置是1到4,其它類推。
那麽倒排列表結構可這麽存:
美容: [doc1,(6,8)], [doc2,(7)]
那麽"美容"這個詞在文檔1的位置是6到8,並沒有在上面的1到4裏,就是說標題裏沒有"美容"這個詞。同理"美容"這個詞在文檔2的標題裏。



四、檢索效果評價

1.精確率Pr
Pr=檢索結果中與檢索相關的結果數 / 全部檢索結果數
如,在檢索某個查詢的答案時,取前50個文檔。而且這35個文檔是與查詢相關的,則精確率為P50=70% 。為什麽是這麽計算,其實是有前提的:就是相關的才被查出來。這與我們的實際工作有些區別,有時我們要盡可能給用戶提供更多的選擇,相關也是有相關度的區別的。如果返回的前35個就是最相關的,而且除了這已經沒有最相關的了,其它的是15個是次相關的,這個精確率就應該是100% 。

2.召回率Rr
Rr=與檢索相關且實際檢索出的文檔數 / 與檢索相關的文檔數
還是前面那個例子,實際檢索出的前50個文檔中有35個是相關的,但是真正相關的有70篇,那麽召回率R50=50%,因為在前50篇文檔中只選出了35/70=50的相關文檔。

一般在用ik這樣的中文分詞,如果單從詞的匹配的角度來看,精確率應該都是100%。但如果從一個用戶的觀點看,可能在第10頁的數據才是他認為是精準匹配的,所以這樣的問題得具體問題具體分析,使用不同的算法來解決。

搜索系統7:索引查詢方法與評價方法