2010-07-06 115 views
1

我有一個列出人員及其所有聯繫信息的表格。我希望用戶能夠在桌面上執行智能搜索,只需鍵入一些內容並獲取結果,即輸入的每個術語至少與表格中的一列匹配。要開始我做了一個查詢像如何搜索多個表格列中的多個術語?

SELECT * FROM contacts WHERE 
    firstname LIKE '%Bob%' 
OR lastname LIKE '%Bob%' 
OR phone LIKE '%Bob%' OR 
... 

但現在我意識到,這將完全作爲「鮑勃·詹金斯」這樣簡單的事情會失敗,因爲它不是足夠聰明,分別搜索第一的姓氏。我需要做的是將搜索項分開並單獨搜索它們,然後以某種方式將每個術語的結果相交。至少這對我來說似乎是解決方案。但是最好的方法是什麼?

我聽說過全文和MATCH()... AGAINST(),但這聽起來像一個相當模糊的搜索,我不知道要設置多少工作。我希望得到具有合理表現的確切結果或不結果。搜索需要在20行至120,000行左右完成。希望用戶不會輸入兩個或三個以上的術語。


對不起,我忘了提及我正在使用MySQL(和PHP)。

我只是想出了全文搜索,這是一個很酷的選擇(有沒有一種方法可以調整它的嚴格程度?LIMIT只會截斷結果,無論它的匹配程度如何)。但是這需要一個全文索引,而我的網站正在使用一個視圖,你不能將視圖編入索引?所以...

+0

你使用了什麼數據庫?每個提供不同的功能和功能,所以它將有助於瞭解。 – Oded 2010-07-06 05:48:55

回答

0

BOOLEAN MODE

SELECT * FROM contacts WHERE 
MATCH(firstname,lastname,email,webpage,country,city,street...) 
AGAINST('+bob +jenkins' IN BOOLEAN MODE) 

布爾模式是非常強大的。它甚至可以滿足我所有的需求。我將不得不做一些測試。通過將+置於搜索條件之前,這些條款就成爲必需。 (該行必須匹配'bob'和'jenkins'而不是'bob'或'jenkins')。這種模式甚至可以在非索引列上工作,因此我可以在視圖上使用它,儘管它會比較慢(這是我需要測試的)。我遇到的最後一個問題是它與部分搜索條件不匹配,因此'bob'例如找不到'bobby'。通常的%通配符不起作用,而是使用星號*

0

我建議使用MATCH/AGAINST。全文搜索是更高級的搜索,更像谷歌,不太初級。

它可以匹配多個表格,並將它們排列爲它們有多少匹配。

否則,如果這個詞是有的話,尤其是,跨多個表格,你沒有排名。你可以在服務器端進行排名,但是這需要更多的編程/時間。

根據您使用的數據庫,執行交叉列的能力可能變得或多或少困難。你可能不想做20個JOIN,因爲這將是一個非常慢的查詢。

還有像Sphinx和Lucene這樣的引擎可以做這些類型的搜索。

+0

我想如果有一種方法只接受匹配搜索中所有術語的結果,那麼全文就可以做到這一點。除了在視圖中不能使用它的問題... – Moss 2010-07-06 06:01:10

+0

請提供一些示例查詢,供其他人和OP瞭解如何繼續處理MATCH/AGAINST關鍵字。 – 2010-07-06 06:44:56

+0

如果你搜索它它有例子:http://stackoverflow.com/questions/2378366/mysql-how-to-make-multiple-table-fulltext-search – 2010-07-06 07:29:32