我正在使用php和mySQL创建一个在线常见问题类型的系统。下面的SQL用于根据用户输入的$term查找相关问题。
当用户搜索某项内容并单击相关问题以显示答案时,他们将有机会根据所搜索的内容对给定的问题进行评分。
SQL的第一部分从实际的问题表中获取相关的问题ID。第二部分查看评分表,并尝试匹配人们之前搜索的内容,以找到相关的问题ID。
然后使用这些结果的联合来获得存储在数据库中的实际问题标题。
(SELECT id_question,
MATCH(question, tags) AGAINST ('%$term%') as rank
FROM question
WHERE MATCH(question, tags) AGAINST ('%$term%')
AND category = '$category')
UNION
(SELECT id_question,
MATCH(customer_search_query) AGAINST ('%$term%') as rank
FROM rating
WHERE MATCH(customer_search_query) AGAINST ('%$term%')
AND (customer_rating = 1))
ORDER BY rank DESC LIMIT 5;");我遇到的问题是系统没有真正正确地学习。例如,如果我键入"three users",系统将在问题表中找到匹配项。
如果我键入"3 users",系统将在问题表中找到匹配项(基于关键字"users")。如果我点击“是,这回答了我的问题”,它会在评级表中存储"3个用户“,将其与问题”3个用户“相关联。
问题是"3“只与”三个用户“相关联。在这种情况下,有没有办法将数字3与单词“3”的每个实例相关联?
发布于 2011-10-03 19:54:38
在自然语言模式(默认)下,您不能在match against中使用通配符。
请改用以下查询:
(SELECT id_question,
MATCH(question, tags) AGAINST ('$term') as rank
FROM question
WHERE MATCH(question, tags) AGAINST ('$term')
AND category = '$category')
UNION ALL <<-- faster than UNION.
(SELECT id_question,
MATCH(customer_search_query) AGAINST ('$term') as rank
FROM rating
WHERE MATCH(customer_search_query) AGAINST ('$term')
AND (customer_rating = 1))
ORDER BY rank DESC LIMIT 5;");您可以使用搜索修饰符in boolean mode进行搜索。
此外,匹配对象将不会搜索停用词和少于4个字符的单词。
当您使用$term = "3 users"时,MySQL将只查找users而忽略3。
如果你想搜索3,你必须返回到LIKE '% 3 %'
请参见:
http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html
http://dev.mysql.com/doc/refman/5.0/en/fulltext-stopwords.html
https://stackoverflow.com/questions/7634486
复制相似问题