2016-10-03 398 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