2011-03-20 64 views
0

我有一個表,其中具有這種結構的MySQL數據庫:MySQL查詢匹配相似的單詞/句子

CREATE TABLE `papers` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`title` varchar(1000) COLLATE utf8_bin DEFAULT NULL, 
`booktitle` varchar(300) COLLATE utf8_bin DEFAULT NULL, 
`journal` varchar(300) COLLATE utf8_bin DEFAULT NULL, 
PRIMARY KEY (`id`), 
FULLTEXT KEY `title_fulltext` (`title`), 
FULLTEXT KEY `booktitle_fulltext` (`booktitle`), 
FULLTEXT KEY `journal_fulltext` (`journal`) 
) ENGINE=MyISAM AUTO_INCREMENT=1601769 DEFAULT CHARSET=utf8 COLLATE=utf8_bin 

現在我知道在列標題中,地方的數百萬行的範圍內,有一個排它包含字符串

nFOIL: Integrating Naïve Bayes and FOIL. 

我想尋找

my_string = "nFOIL: integrating Naïve Bayes and FOIL" 

,並找到裏ght行。您看到它必須是不區分大小寫的搜索,並且查詢中末尾的點不存在。我如何實現這一點?

我試圖

SELECT id FROM papers WHERE UPPER(title) LIKE %s 

,並轉換my_string在Python上的情況下,把一個「%」在my_string結束,但這並不縫處理一個很好的方式。它也沒有工作。 =)

感謝您的任何建議!

回答

2

我看到你已經添加了FULLTEXT索引,儘管你已經知道MATCH AGAINST的MySQL語法。

你應該嘗試

SELECT id FROM papers 
WHERE MATCH (title,booktitle,journal) AGAINST ('nFOIL: integrating Naïve Bayes and FOIL' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION); 
+0

+1。我不知道「QUERY EXPANSION」。我只是閱讀手冊。 :) – 2011-03-20 19:18:21

+0

我試過了。事實證明,查詢讓我獲得了很多結果。我想要的結果是所有結果的第三位。如果我將這部分查詢放在「WITH QUERY EXPANSION」中,也有許多結果,但我希望的結果是結果的第一行。有什麼不同? – Aufwind 2011-03-20 19:22:01

+0

在http://dev.mysql.com/doc/refman/5.0/en/fulltext-query-expansion.html上閱讀關於WITH QUERY EXPANSION的更多信息 – Pentium10 2011-03-20 19:26:48

0

更改您在utf8_general_ci中的整理。 通過這種方式,您的搜索將不區分大小寫。

+0

是否有可能改變現有數據的整理? – Aufwind 2011-03-20 19:10:30

+0

在更改數據庫/表結構之前進行備份總是一個好主意。你的情況是。但是,在更改任何內容之前,請嘗試遵循Pentium10的建議。 – 2011-03-20 19:20:49

+0

也謝謝! @ Pentium10s的回答讓我走上了正軌! – Aufwind 2011-03-20 19:56:28