MySQL精确短语匹配
我正在使用Python和mysqldb模块来根据用户输入在数据库中搜索信息。 我已经测试了Python,并成功连接到了服务器和数据库。现在的问题出在SQL代码上。 我的SQL代码如下:
SELECT * FROM panda WHERE MATCH(Question) AGAINST('"{0}"')
因为我使用的是Python,所以{0}代表用户输入的内容,这部分是正常工作的。但是,不知道为什么,它无法精确匹配数据库中列的内容。例如,如果用户输入“See you”,数据库却把它匹配成“I want to see you”,而不是单纯的“See you”。有没有办法获取到这个特定的短语?我尝试过使用布尔模式和正则表达式,但都没有成功。
补充:谢谢大家。你们的方法都有效,只是我没有正确格式化SQL,抱歉给大家带来了麻烦。
4 个回答
MATCH ... AGAINST
,也叫做全文搜索,正如你所期望的那样在正常工作。它的目的是在大量文本中查找与你的查询匹配的内容。
要注意的是,全文索引只会查看列中大约前750个字符的内容。
这个功能很有用,因为即使文本中出现随机的标点符号或其他单词,它也能正常工作。而像WHERE column = 'value'
这样的查询则要求完全匹配。
你可以尝试这个查询:它会大致按照长度从短到长的顺序展示结果。这会让“See you”排在“I want to see you”前面。
SELECT *
FROM panda
WHERE MATCH(Question) AGAINST('"{0}"')
ORDER BY CEIL(LOG2(LENGTH(Question))) ASC,
MATCH(Question) AGAINST('"{0}"')
请注意,当你在SELECT
或ORDER BY
子句中使用MATCH(Question) AGAINST('"{0}"')
时,它会生成一个数字,表示匹配的接近程度。
还要注意,在你的ORDER BY
子句中,CEIL(LOG2(LENGTH(Question)))
这个表达式会根据长度将结果分组。它会把长度为3-4的结果放在一起,然后是长度为5-8、9-16,依此类推。
这是关于如何将Python和SQL结合起来使用的方法。我们要查找某一列名为'Question'的内容,并且这个内容的值要等于输入的变量inputVar。最后,我们会获取整行的数据。
import MySQLdb
db = MySQLdb.connect("localhost", "root", "password", "MY_DATABASE")
cursor=db.cursor()
sql="SELECT * FROM MY_TABLE WHERE Question = '%s';" %inputVar;
try:
cursor.execute(sql)
row = cursor.fetchall()
print row[0] #assuming 1st column is 'Question' column.
db.commit()
except:
print ("ROLLBACK!!!")
db.rollback()
那为什么不直接用 WHERE Question = '"{0}"' 呢?
看看这个关于 MATCH ... AGAINST 的文档。你想要的是一个简单的比较,可以试试这样的写法:
SELECT * FROM panda WHERE Question = {0};