2009-02-25 83 views
8

因此,我需要找出如何在MySQL數據庫上執行全文布爾搜索以返回包含術語「C++」的記錄。如何獲得全文布爾搜索來獲取術語C++?

我有我的SQL搜索字符串爲:

SELECT * 
FROM mytable 
WHERE MATCH (field1, field2, field3) 
AGAINST ("C++" IN BOOLEAN MODE) 

雖然我所有的字段包含字符串C++,這是從來沒有在搜索結果中返回。

如何修改MySQL以適應此?可能嗎?

我發現的唯一解決方案是在輸入我的數據的過程中將+字符轉義爲「__plus」,然後修改我的搜索以適應,但這看起來很麻煩,必須有更好的方法。

+0

什麼是全文布爾搜索?這聽起來很像你捏造這個詞。另外,你的問題非常模糊。你需要更好地描述你的問題,你想要做什麼。否則,我們無法幫助你。 – 2009-02-25 06:52:36

+0

@John:你很苛刻。我必須避免鏈接到lmgtfy,所以下面是MySQL的解釋:http://dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html – 2009-02-25 07:03:00

回答

8

如何修改MySQL以適應此?

你必須改變的話是什麼MySQL的想法。

首先,默認的最小單詞長度是4.這意味着不論是'C++'還是'cpp',都不會包含只包含< 4個字母的單詞的搜索項。您可以使用ft_min_word_len配置選項來配置它,例如。在my.cfg:

[mysqld] 
ft_min_word_len=3 

(然後停止/啓動mysqld,重建全文索引。)

其次,「+」不被認爲是由MySQL的信。你可以把它寫成一個字母,但這意味着你將無法在字符串'fish + chips'中搜索'fish'這個詞,所以需要注意。這不是微不足道的:它需要重新編譯MySQL或黑客攻擊現有的字符集。請參閱文檔section 11.8.6中的「如果您想更改被視爲單詞字符的字符集......」一節。

進入我的數據,像「__plus」,然後修改我的搜索過程中逃脫+字符以適應

是的,這樣的事情是一個共同的解決辦法:你可以保持您的'真正'的數據(沒有轉義)放在主要的權威表中 - 通常使用InnoDB來實現ACID合規性。然後可以添加一個輔助的MyISAM表格,其中只包含用於全文搜索誘餌的損壞字詞。您也可以使用這種方法進行有限的詞幹分析。

另一種可能性是檢測MySQL無法執行的搜索,例如那些只有簡短詞或不常見字符的搜索,並且回退到僅用於這些搜索的簡單但速度慢的LIKE或REGEXP搜索。在這種情況下,您可能還希望通過將ft_stopword_file設置爲空字符串來刪除該列表,因爲將其中的所有內容都作爲特殊選項並不實用。

0

通常在查詢中不使用轉義字符而不是數據庫數據。嘗試在查詢中轉義每個「+」。

1

http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html

是雙引號(「「」)字符括起來的短語只是字面上包含該短語的行相匹配,因爲它是類型化

這意味着你。可以搜索 'C++' 使用此查詢:

SELECT * 
FROM mytable 
WHERE MATCH (field1, field2, field3) 
AGAINST ('"C++"' IN BOOLEAN MODE) 
0

溶液::

變化my.ini文件

把這兩行

ft_min_word_len = "1" 
ft_stopword_file ="" 

下面

[mysqld] 

比savve文件並重新啓動MySQL服務器。

my.ini文件將由所有人共享。所以我們只能在my.ini文件中對某些會話進行更改。

相關問題