2009-09-09 134 views
4

我試圖在我的數據庫中搜索一個字符串,但它應該能夠匹配任何單詞而不是整個短語。mySQL LIKE查詢

假設,一個表格數據有像a b c d e f g這樣的文字。然後,如果我搜索d c b它應該能夠顯示結果。

field LIKE '%d c b%'不以這種方式工作。

有人可以建議一個更強大的搜索方式,也可能顯示相關性計數器。

我不介意在上面使用PHP,但更喜歡在數據庫級別進行搜索。

回答

4

爲獲得最佳效果,您需要爲您的數據創建FULLTEXT索引。

CREATE TABLE mytable (id INT NOT NULL, data TEXT NOT NULL, FULLTEXT KEY fx_mytable_data) ENGINE=MyISAM 

SELECT * 
FROM mytable 
WHERE MATCH(data) AGAINST ('+word1 +word2 +word3' IN BOOLEAN MODE) 

注意索引一個字母的單詞(如你的例子),你需要設置ft_min_word_len1MySQL confguration。

即使你沒有一個索引(只要你的表是MyISAM)這種語法能正常工作,但會比較慢。

1

如果表是在MyISAM中,您可以使用全文搜索集成在MySQL:11.8. Full-Text Search Functions

雖然會有一些限制(例如,如果我沒記錯,你不能單詞比X字符短搜索 - X通常是3或4)。


另一種解決方案是使用一些全文的發動機,像LuceneSolr,或Sphinx - 那些通常做得更好,當涉及到全文的搜索:這是他們的工作(MySQL的工作是存儲數據,而不是做全文搜索)

已經有許多關於那些做題;例如:


如果您使用的是PHP,不能安裝任何軟件,有一個完整的PHP實現了Lucene:Zend_Search_Lucene

2

我想你想要做的是,對於任何字母:

field LIKE '%d%' or field like '%c%' or field like '%b%' 

所有的字母

field LIKE '%d%' and field like '%c%' and field like '%b%' 
+0

但是,這將返回任何具有它們的任何東西,而不是隻返回那些具有全部或部分屬性的東西。 – nilamo 2009-09-09 16:50:48

+0

是的,但這似乎並不是他要「匹配任何詞而不是整個詞組」的要求。 – 2009-09-09 17:00:04

+0

-1這也會返回一個字符串,例如「** d ** hhlkjfyfjfjf ** c ** kjhtyfgv ** b **」,在這種情況下您可能會說'LIKE'%d%c%b% 」。 – 2009-09-09 17:00:08

1

最後,MySQL LIKE子句並不意味着用作'強大'搜索工具來進行基於單詞的匹配。這是找到部分短語的簡單工具。它也不是很好的擴展,所以如果你在高端吞吐量網站上這樣做,你可能會需要另一種解決方案。

所以他這樣說,也有一些對你的選擇,讓你想要什麼:

  • 正則表達式的支持,也支持在MySQL做REGEX based searches。使用它,並且使用足夠複雜的REGEX,您可以找到您要查找的內容。

  • 在MySQL中真正的全文索引。 MySQL有辦法創建FULLTEXT indexes。您需要使用MyISAM數據引擎,並且對於您可以或不可以執行的操作有限制。但它比SQL所具有的基本'like'功能強大得多。如果你有興趣,我建議你閱讀它。

  • 第三方索引器。這實際上是大多數人走的路線。他們將使用Lucene/Solr或其他類似的索引技術,這些索引技術專門用於使用各種邏輯對單詞進行全文搜索,就像現代Web搜索引擎的工作方式一樣。它們非常高效,因爲它們本質上保留了自己的數據庫,並將它們分解成一切,並以最適合這些類型搜索的方式進行存儲。

希望這三個選項之一會爲你工作。

0

使用like子句時,請注意它是%variable%variable%而不是%variable。其次,做一個情感搜索使用explode函數來打破單詞,就像我搜索「學習php」一樣,它應該像這樣搜索:「learn + php」,就像在Google中一樣。它的功能是explode()

+0

這聽起來更像是評論而不是答案。 – 2012-11-22 12:30:20