2009-03-05 83 views
9

好,我有一個MySQL數據庫,看起來像這樣全文搜索答案?

ID - 一個int和記錄

標題的唯一ID - 項

說明的名字 - 商品描述

我想搜索關鍵詞的標題和描述,目前我正在使用。

SELECT * FROM「項目」,其中標題LIKE%鍵%

而這個工作和有數據庫中的並不多,然而,如搜索「這個關鍵的」未找到「這是關鍵「我想改善網站的搜索引擎,甚至可能會添加某種排名系統(但這是相當長的時間)。所以對於這個問題,我聽說過一個叫做「全文搜索」的東西(據我所知)是一個數據庫設計的主要部分,但作爲這個主題的一個新詞,我對此一無所知...

1)你認爲這會有用嗎?

和一個額外的questron ...

2)我讀什麼可以瞭解數據庫設計/搜索引擎的設計,將點我在正確的方向。

如果是相關的網站目前寫成挺直PHP(即沒有框架)(救援人員到場將其轉換爲Ruby on Rails的思想已經跨越了我的心)

更新

謝謝所有,我會去全文搜索。 對於任何一個後來發現,我發現一個好的tutorial全文搜索以及。

回答

9

'%keyword%'類型搜索的問題是,即使您在該列上創建索引,也無法在常規表中高效地搜索它。考慮一下你會如何看待電話簿中的字符串。實際上沒有辦法優化它 - 你必須掃描整個電話簿 - 這就是MySQL所做的,全表掃描。

如果您將該搜索更改爲'keyword%'並使用索引,則可以獲得非常快的搜索。這聽起來像這不是你想要的,但。

考慮到這一點

所以,我已經使用全文索引/搜索了不少,而且這裏有幾個優點和缺點:

優點

  • 非常快
  • 返回結果按相關性排序(默認情況下,儘管您可以使用任何分類)
  • 可以使用停用詞。

缺點

  • MyISAM表只適用
  • 字太短會被忽略(默認最小爲4個字母)
  • 需要where子句中不同的SQL,所以你會需要修改現有的查詢。
  • 不匹配的部分字符串(例如, '字' 不匹配 '關鍵字',只有 '字')

Here is some good documentation on full-text searching

另一種選擇是使用搜索系統,如Sphinx。它可以非常快速和靈活。它針對搜索進行了優化,並與MySQL完美集成。

+0

謝謝,我謹慎使用類似獅身人面像的東西,但說實話,除非需要花費大量時間,否則我寧願自己構建它,這樣我就能理解它是如何工作的。 – 2009-03-05 11:40:23

+0

我們正在接近在我們的一個應用程序中實現sphinx。我們對大量數據進行了大量搜索。我們使用全文搜索一段時間,但需要遷移到innodb進行交易。但是,全文很容易實現,速度非常快。 – jonstjohn 2009-03-05 11:44:26

1

你也可以考慮Zend_Lucene。它比Sphinx整合要容易一些,因爲它是純粹的PHP。

2

我猜想MySQL全文足以滿足您的需求,但值得注意的是內置支持不能很好地擴展。對於平均尺寸的文件,它開始變得無法用於小至幾十萬行的表格尺寸。如果你認爲這可能會進一步成爲問題,那麼你應該已經看過獅身人面像。它已經成爲MYSQL用戶的事實標準,儘管我個人更喜歡使用java lucene實現我自己的解決方案。 :)

另外,我想提一下,全文搜索與標準LIKE'%keyword%' - 搜索有根本的區別。與LIKE搜索全文索引不同,您可以搜索幾個不必緊挨着出現的關鍵字。例如,谷歌等標準搜索引擎就是全文搜索引擎。