我試圖在我的數據庫中搜索一個字符串,但它應該能夠匹配任何單詞而不是整個短語。mySQL LIKE查詢
假設,一個表格數據有像a b c d e f g
這樣的文字。然後,如果我搜索d c b
它應該能夠顯示結果。
field LIKE '%d c b%'
不以這種方式工作。
有人可以建議一個更強大的搜索方式,也可能顯示相關性計數器。
我不介意在上面使用PHP,但更喜歡在數據庫級別進行搜索。
我試圖在我的數據庫中搜索一個字符串,但它應該能夠匹配任何單詞而不是整個短語。mySQL LIKE查詢
假設,一個表格數據有像a b c d e f g
這樣的文字。然後,如果我搜索d c b
它應該能夠顯示結果。
field LIKE '%d c b%'
不以這種方式工作。
有人可以建議一個更強大的搜索方式,也可能顯示相關性計數器。
我不介意在上面使用PHP,但更喜歡在數據庫級別進行搜索。
爲獲得最佳效果,您需要爲您的數據創建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_len
到1
在MySQL
confguration。
即使你沒有一個索引(只要你的表是MyISAM
)這種語法能正常工作,但會比較慢。
如果表是在MyISAM中,您可以使用全文搜索集成在MySQL:11.8. Full-Text Search Functions
雖然會有一些限制(例如,如果我沒記錯,你不能單詞比X字符短搜索 - X通常是3或4)。
另一種解決方案是使用一些全文的發動機,像Lucene,Solr,或Sphinx - 那些通常做得更好,當涉及到全文的搜索:這是他們的工作(MySQL的工作是存儲數據,而不是做全文搜索)
已經有許多關於那些做題;例如:
如果您使用的是PHP,不能安裝任何軟件,有一個完整的PHP實現了Lucene:Zend_Search_Lucene
我想你想要做的是,對於任何字母:
field LIKE '%d%' or field like '%c%' or field like '%b%'
所有的字母
field LIKE '%d%' and field like '%c%' and field like '%b%'
最後,MySQL LIKE子句並不意味着用作'強大'搜索工具來進行基於單詞的匹配。這是找到部分短語的簡單工具。它也不是很好的擴展,所以如果你在高端吞吐量網站上這樣做,你可能會需要另一種解決方案。
所以他這樣說,也有一些對你的選擇,讓你想要什麼:
正則表達式的支持,也支持在MySQL做REGEX based searches。使用它,並且使用足夠複雜的REGEX,您可以找到您要查找的內容。
在MySQL中真正的全文索引。 MySQL有辦法創建FULLTEXT indexes。您需要使用MyISAM數據引擎,並且對於您可以或不可以執行的操作有限制。但它比SQL所具有的基本'like'功能強大得多。如果你有興趣,我建議你閱讀它。
第三方索引器。這實際上是大多數人走的路線。他們將使用Lucene/Solr或其他類似的索引技術,這些索引技術專門用於使用各種邏輯對單詞進行全文搜索,就像現代Web搜索引擎的工作方式一樣。它們非常高效,因爲它們本質上保留了自己的數據庫,並將它們分解成一切,並以最適合這些類型搜索的方式進行存儲。
希望這三個選項之一會爲你工作。
使用like
子句時,請注意它是%variable%
或variable%
而不是%variable
。其次,做一個情感搜索使用explode
函數來打破單詞,就像我搜索「學習php」一樣,它應該像這樣搜索:「learn + php」,就像在Google中一樣。它的功能是explode()
。
這聽起來更像是評論而不是答案。 – 2012-11-22 12:30:20
但是,這將返回任何具有它們的任何東西,而不是隻返回那些具有全部或部分屬性的東西。 – nilamo 2009-09-09 16:50:48
是的,但這似乎並不是他要「匹配任何詞而不是整個詞組」的要求。 – 2009-09-09 17:00:04
-1這也會返回一個字符串,例如「** d ** hhlkjfyfjfjf ** c ** kjhtyfgv ** b **」,在這種情況下您可能會說'LIKE'%d%c%b% 」。 – 2009-09-09 17:00:08