2008-10-06 175 views
8

我想用Google App Engine編寫一個web應用程序(所以參考語言應該是Python)。我的應用程序需要一個簡單的搜索引擎,因此用戶將能夠找到指定關鍵字的數據。構建一個全文搜索引擎:從哪裏開始

例如,如果我有一個表的那些行:

1辦公空間
2 2001:空間 奧德賽
3巴西

和 「空格」 的用戶查詢,第1行和第2行將被返回。如果用戶查詢「辦公空間」,結果也應該是第1行和第2行(第1行)。

什麼是以簡單的方式做到這一點的技術指導方針/算法?
你能給我提供一個很好的背景理論指針嗎?

謝謝。

編輯:我不在這裏尋找任何複雜的東西(比如說索引噸數據)。

回答

4

如果可能的話,我不會建立它自己。

App Engine包含全文搜索引擎的基礎知識,並且有一個描述如何使用它的great blog post here

還有一個feature request in the bug tracker最近似乎正在引起一些關注,因此如果可以的話,您可能需要堅持,直到實施。

6

我發現這兩本書在我用來構建全文搜索引擎時非常有用。

Information Retrieval

Managing Gigabytes

+0

我還沒有閱讀/看過信息檢索,但我已經使用了管理千兆字節,除了基本上覆蓋了製作全文搜索和檢索系統所需的所有內容外,它實際上非常易讀。 – olliej 2008-10-08 02:33:51

3

一如往常,在wikipedia開始。首先開始通常是建立一個倒排索引。

1

首先建立您的索引。 經過輸入,分解成文字
對於每個單詞檢查它是否已經在索引中,如果是將當前記錄編號添加到索引列表中,如果沒有添加單詞和記錄編號。
要查找單詞,請轉到(可能已排序)索引並返回該單詞的所有記錄編號。
對於使用Python內置存儲類型的可擴展大小列表來說,這樣做非常容易。

作爲一種額外的改進,您只需要存儲單詞的基本部分,例如'find'用於'查找' - 查找詞幹算法。

+0

如果用「索引」表示「映射」或「字典」,那麼這就是工作。如果你的意思是這樣,那麼就把「排序」這個詞取出來,因爲Python字典是從鍵到值的散列。 – 2008-10-07 00:55:39

+0

我的意思是一般(書籍/ DB)意義上的索引。 python中的哪個容器最好實現它是一個單獨的問題。 – 2008-10-07 01:49:43

+0

除了Python字典之外,沒有其他選擇。因此建議您考慮放棄「排序」。 – 2008-10-07 09:51:26

0

老實說,聰明的人比我想象出來的東西。我會加載solr應用程序,並從我的appengine應用程序發出json調用,並讓solr負責索引。

3

這裏是原來的想法:

不要建立索引。認真。

我前段時間面臨類似的問題。我需要一種快速的方法來搜索來自文檔的文本和megs文本。我需要匹配的不僅僅是單詞,而是大文件中的文字接近(這個詞附近那個單詞)。我剛剛用C寫完,速度讓我感到驚訝。它速度很快,不需要任何優化或索引。由於現代計算機的速度,如果您編寫的代碼直接在金屬上編譯(編譯代碼),您通常不需要訂單日誌(n)類型的算法來獲得所需的性能。

7

閱讀Tim Bray的series of posts on the subject

  • 背景
  • 搜索引擎
  • 基礎
  • 精度和使用召回
  • 搜索engne智能
  • 整蠱搜索字詞
  • 停用詞
  • 國際
  • 排名結果
  • XML
  • 機器人
  • 要求列表
0

我剛剛發現這篇文章本週末:http://www.perl.com/pub/a/2003/02/19/engine.html

看起來不是太複雜做一個簡單的(雖然它可能需要重優化是肯定的企業類型的解決方案)。我打算用Project Gutenberg的一些數據嘗試一個概念驗證。

如果您只是在尋找可以探索和學習的東西,我認爲這是一個好的開始。

3

LuceneAutonomy!這些都不是開箱即用的解決方案。你將不得不在他們的接口上編寫包裝器。
他們肯定會照顧詞幹,語法,關係運營商等

1

Introduction to Information Retrieval提供了一個很好的介紹該領域。

死樹的版本由劍橋大學出版社出版,但您也可以在上面的鏈接中找到免費的在線版(HTML和PDF)。

0

查看「管理千兆字節」這本書,它涵蓋了大量純文本數據的存儲和檢索 - 例如。壓縮和實際搜索,以及各種可用的算法。

此外,對於純文本檢索,最好使用基於矢量的搜索系統而不是關鍵字 - >文檔索引系統,因爲基於矢量的系統可以更快,而且更重要的是可以提供相對平庸的相關性排名。

-1

試試這個: 假設變量表是您的搜索條目列表。

query = input("Query: ").strip().lower()#Or raw_input, for python 2 
end = [] 
for item in table: 
    if query in item.strip().lower(): 
     end.append(item) 

print end #Narrowed results 

它只是遍歷所有項目來查看查詢是否在其中任何一個。它適用於簡單的應用內搜索功能。雖然可能不是整個互聯網。