倒排索引要存哪些信息
??提到倒排索引,第一感覺是詞到文檔列表的映射,實(shí)際上,倒排索引需要存儲(chǔ)的信息不止詞和文檔列表。為了使用余弦相似度計(jì)算搜索詞和文檔的相似度,需要計(jì)算文檔中每個(gè)詞的TF-IDF值,這樣就需要記錄詞在每個(gè)文檔中出現(xiàn)的頻率以及包含這個(gè)詞的文檔數(shù)量,前者需要對(duì)應(yīng)每個(gè)文檔記錄一個(gè)值,后者就是倒排表長(zhǎng)度。除此以外,為了能夠高亮搜索結(jié)果,需要記錄每個(gè)詞在文檔中的偏移信息(起始位置和長(zhǎng)度),為了支持短語(yǔ)查詢,需要記錄每個(gè)詞的position信息,注意position和offset不是一個(gè)概念,position是文檔分詞之后得到的term序列中詞的位置,offset是分詞之前的偏移,如果文檔中一個(gè)詞被分成多個(gè)Term,那么這些Term將共享同一個(gè)position,典型場(chǎng)景是同義詞,這在自然語(yǔ)言處理中很有用。如果用戶希望在Term級(jí)別干預(yù)查詢打分結(jié)果,那么就需要對(duì)文檔中的每個(gè)詞存儲(chǔ)額外的信息(payload)。
??綜上,倒排索引需要存儲(chǔ)的信息主要有以下幾方面:
詞(Term)
倒排文檔列表(DocIDList)
詞頻(TermFreq)
Position
Offset
Payload
??有幾點(diǎn)需要特別說(shuō)明,lucene中Term是對(duì)每個(gè)Field而言的,也就是說(shuō)在Document不同F(xiàn)ield中出現(xiàn)的相同字面的詞也算不同的Term。搞清楚了這一點(diǎn),就很容易理解TermFreq、Position、Offset、Payload都是在一個(gè)Document中Field下的統(tǒng)計(jì)量。另外,同一個(gè)Term在同一個(gè)Document的同一個(gè)Field中,Position、Offset、Payload可能會(huì)出現(xiàn)多次,次數(shù)由TermFreq決定。
lucene中倒排索引的邏輯結(jié)構(gòu)如下:
網(wǎng)友評(píng)論