2016-10-03 59 views
2

搜索條件= [''現場的ISBN編號'] 變量(列):句子,在MySQL表中。它包含許多不同的句子。如何使用模糊查找在SQL中查找句子?

我想要查找的句子是 「AutoLink功能附帶Google最新的工具欄,如果在網站上發現圖書的ISBN編號,則會在網頁上向Amazon.com提供鏈接。」

然而,當我使用下面的語句:

SELECT * FROM testtable 
where Sentence like "%ISBN number on site%" ; 

我無法得到的結果。這是因爲搜索詞(「網站上的國際標準書號」)缺少與該句子相比的一個詞(「the」)。

如何更改我的陳述以獲得我想要的句子?謝謝。 假設我們不改變[「現場ISBN號」]搜索詞=

+1

你可能想看看使用MySQL的全文搜索。 –

回答

4

這不是一個簡單的問題。你最好的選擇是使用某種類型的fulltext search。全文搜索可以配置爲包含停用詞(從搜索中省略的詞 - 如the),並且可以具有最小詞長度限制(搜索時也忽略了長度小於某些字符的詞)

但是,如果簡單地用

SELECT * FROM testtable 
WHERE MATCH (sentence) 
AGAINST ('ISBN number on site'); 

那麼MySQL將返回不只是你要找的值的記錄,但有一定的只有一行字的記錄,並以不同的順序,你們就有了一個會可能是排名最高的一個,但是不能保證它會排在最高排名第一。

您可能需要使用Boolean fulltext search和前面加上+每一個搜索詞來強制MySQL只返回擁有所有目前的搜索詞的那些記錄:

SELECT * FROM testtable 
WHERE MATCH (sentence) 
AGAINST ('+ISBN +number +on +site' IN BOOLEAN MODE); 

但是,on要麼是停止字(它是默認stipword列表),還是應該更短,最小的字長,所以應該從搜索表達式可以省略(你不回來任何結果):我知道

SELECT * FROM testtable 
WHERE MATCH (sentence) 
AGAINST ('+ISBN +number +site' IN BOOLEAN MODE); 

,這需要搜索表達的改變,但是這會讓你最好結果使用MySQL的內置功能。

另一種方法是使用其他全文搜索引擎,如sphinx來爲您執行搜索。

+0

非常感謝!我從你的回答中學到了很多東西。 – bob90937

+0

如果有人需要答案。 ALTER TABLE'testtable' ADD FULLTEXT('sentence'); SELECT * FROM testtable WHERE MATCH(sentence) AGAINST('+ ISBN + number + site'IN BOOLEAN MODE); – bob90937

1

嘗試:

SELECT * FROM testtable where Sentence like '%ISBN number on%site%' ; 

通配符可以在一個字符串中間去了。

+0

您如何知道在通用搜索表達式中將通配符放在哪裏? – Shadow

+0

非常感謝。有沒有其他方法可以做到這一點?因爲我們假設我們不改變搜索詞= ['現場的國際標準書號']。這是因爲我使用搜索詞作爲變量,所以如果我對搜索詞進行硬編碼,很難做到這一點 – bob90937

+0

@Shadow可以用一個替換每個空格。這會讓你猜我很長的路要走。直到訂單開始轉移。然後,也許你不得不根據空格分割你的字符串,並將每個單詞添加爲一個單獨的語句(WHERE ... AND ... AND ...) – Jens