2012-02-22 133 views
2

我正在嘗試構建自己的搜索引擎進行實驗。查詢多個單詞時搜索索引如何工作?

我知道倒排索引。例如索引單詞時。

關鍵是這個詞,並有一個包含該詞的文檔ID列表。所以,當你搜索這個詞,你得到的文件馬上

它是如何爲多個單詞

你得到的每一個字的所有文件和遍歷這些文件,看看是否有這兩個詞的工作?

我覺得情況並非如此。

任何人都知道這個沒有投機的真正答案?

+3

如果你可以得到所有一個字一個文件(或文件IDS),你可以做一個字相同B,您也可以在不打開文檔本身的情況下生成兩個結果集的交集。 – biziclop 2012-02-22 00:47:01

回答

0

您發現文檔集的交集爲biziclop說,你可以用相當快的方式做到這一點。請參閱this post以及其中鏈接的文件以獲得更正式的描述。

+0

這篇文章並沒有真正解決匹配列表_intersection_(即AND查詢)的問題,因爲它討論了OR查詢。 – jogojapan 2012-02-24 06:04:32

+0

@jogojapan:鏈接的論文是核心實施細節。我認爲最重要的部分是可以通過僅找到最前面的k來改善界限。 – Xodarap 2012-02-24 17:02:04

0

正如指出的biziclop,對於和查詢需要交叉匹配列表(又名倒排列表)兩個查詢詞。

在典型的實現方式中,倒排列表被實現爲使得它們可以搜索任何給定的文檔ID非常有效地(通常,對數時間)。實現這一目標的方法之一是讓他們排序(和使用二進制搜索),但注意,這不是小事,因爲還需要將它們存儲在壓縮形式。給定查詢A AND B,並且假設對於A有occ(A)匹配並且對於B有occ(B)匹配(即occ(x):=對於項x的匹配列表的長度)。假設在不失一般性的情況下,occ(A)> occ(B),即A在文檔中比B更頻繁地出現。然後你要做的是遍歷B中的所有匹配並在列表中搜索它們中的每一個爲A.如果確實列表可以在對數時間內搜索,這意味着你需要

occ(B) * log(occ(A)) 

計算步驟來標識包含兩方面的所有比賽。

描述落實各個方面進行一個偉大的書是Managing Gigabytes

0

反向索引是獲得交集,用鋸齒形alorithm非常有效:

假設你而言是一個列表T

lastDoc <- 0 //the first doc in the collection 
currTerm <- 0 //the first term in T 
while (lastDoc != infinity): 
    if (currTerm > T.last): //if we have passed the last term: 
    insert lastDoc into result 
    currTerm <- 0 
    lastDoc <- lastDoc + 1 
    continue 
    docId <- T[currTerm].getFirstAfter(lastDoc-1) 
    if (docID != lastDoc): 
    lastDoc <- docID 
    currTerm <- 0 
    else: 
    currTerm <- currTerm + 1 

該算法假設有效getFirstAfter(),可以給你的第一符合術語和他的docId的文檔大於指定的參數。如果沒有的話,它應該返回無窮大。如果條款排列,使得稀有項第一

該算法將是最有效的。

的算法保證在最#docs_matching_first_term * #terms迭代,但實際上 - 它通常會少得多的迭代。

注意:雖然此算法是有效的,但AFAIK lucene不使用它。

更多信息可以在this lecture notes幻燈片11-13在演講的第一頁的複製權限]

-1

我真的不明白爲什麼人們在談論路口此找到。

Lucene支持使用布爾查詢的查詢組合,如果必須的話,您可以無限地嵌套。

QueryParser還支持AND關鍵字,這將需要這兩個單詞在文檔中。

例(Lucene.NET,C#):

var outerQuery + new BooleanQuery(); 
outerQuery.Add(new TermQuery(new Term("FieldNameToSearch", word1)), BooleanClause.Occur.MUST); 
outerQuery.Add(new TermQuery(new Term("FieldNameToSearch", word2)), BooleanClause.Occur.MUST); 

如果要拆分使用相同的分析儀的話(實際的搜索項),有很多方法可以做到這一點。雖然,QueryParser可能更易於使用。

您可以查看這個答案,例如如何使用您用於索引同一個分析器分割字符串:

No hits when searching for "mvc2" with lucene.net

+0

您的「a」和「b」查詢精確計算匹配「a」的文檔集和匹配「b」的文檔集之間的交集 – fulmicoton 2016-01-08 01:52:49

1

您需要將文檔存儲到索引文件中的一個字的位置。 您的索引文件結構應該是這樣的。 word id - doc id- no。點擊的位置。

enter image description here

現在假設查詢包含4個字 「W1,W2,W3 W4」。選擇包含大部分單詞的文件。現在計算它們在文檔中的相對距離。大多數單詞出現並且其相對距離最小的文檔在搜索結果中具有高優先級。

我開發了一個總的搜索引擎,沒有使用互聯網上的任何爬行或索引工具。你可以閱讀更多的信息的詳細說明這裏 - Search Engine

閱讀本文由谷歌founders- click here