2008-11-19 240 views
5

我們有一個託管應用程序,用於管理內容頁面。每個頁面可以有多個自定義字段,以及一些標準字段(時間戳,用戶名,用戶電子郵件等)。高效過濾/搜索

與可能使用該系統的數百個不同的網站 - 什麼是處理過濾/搜索的有效途徑?描繪你想要縮小的網格視圖。您可以過濾特定字段(用戶標識,日期),也可以輸入全文搜索。

例如,「通過用戶標識10開始的所有頁面」將在MySQL數據庫上一個漂亮的快速查詢。但諸如「用戶的用戶名爲10並匹配[某些搜索查詢]的所有頁面」會吸引數據庫,因此它適合於像Lucene這樣的搜索引擎。

基本上我想知道其他大型網站如何做這種事情。他們是否將100%的搜索引擎用於所有類型的過濾?他們是否將數據庫查詢與搜索引擎混合?

如果我們只使用搜索引擎,則在搜索索引中出現新的/更新的對象所需的延遲時間存在問題。也就是說,我讀過,更新索引立即並不是很聰明,而是分批進行。即使這意味着每5分鐘一次,當用戶查看簡單頁面列表(例如「category:5」的搜索查詢)時,如果最近添加的頁面沒有立即列出,用戶會感到困惑。

我們正在使用MySQL,並一直在密切關注Lucene搜索。還有其他一些我不知道的技術嗎?

我的想法是提供其使用MySQL對基本字段篩選簡單的過濾頁面。然後提供一個單獨的全文搜索頁面,可以呈現類似於Google的結果。這是唯一的方法嗎?

回答

2

Solr的或grassyknoll既Lucene的提供稍微抽象接口。

這就是說:是的。如果你是一個主要由內容驅動的網站,提供全文搜索你的數據,那麼在LIKE之外就有一些東西在起作用。儘管MySql的FULLTEXT係數並不完美,但在此期間它可能是一個可接受的佔位符。

假設你創建了一個Lucene索引,將Lucene Documents鏈接到你的關係對象非常簡單,只需在索引時將一個存儲屬性添加到文檔中(該屬性可以是url,ID,GUID等。)然後,搜索變成2相體系: 1)問題查詢Lucene的indexies(顯示簡單的結果如標題) 2)獲得有關從你的關係存儲對象的詳細信息,其關鍵

由於文件的實例在Lucene中相對比較昂貴,您只需要在Lucene索引中存儲搜索的字段,而不是完成關係對象的克隆。

0

不要輕易註銷MySQL!

使用數據庫實現它,例如,在where子句或其他內容中帶有「like」的選擇。

配置文件,如有必要添加索引。推出一個測試版,讓你從用戶的實際數據模式得到真正的號碼 - 並不是所有列會後同樣要求等

如果性能不吸,然後這就是當你考慮其他的選擇。您可以考慮調整你的SQL,你的數據庫,在數據庫上運行,最後用另一種技術棧的機器...

0

在你想使用MySQL或PostgreSQL,一個開源的解決方案,它的偉大工程與它的情況是獅身人面像: http://www.sphinxsearch.com/

我們有同樣的問題,並考慮獅身人面像和Lucene可能的解決方案。