我不是全文搜索的专家,所以我在谷歌上搜索了一个按相关性排序的SQL查询,得出了这样的结果:
SELECT *, MATCH(fulltext_tags) AGAINST ('+blue' '+red') AS relevance FROM `products` WHERE MATCH(fulltext_tags) AGAINST ('+blue' '+red' IN BOOLEAN MODE) ORDER BY relevance DESC
问题是,只考虑第一个关键字。
假设我有这个产品表
+----------+------------------+
| name | fulltext_tags |
+----------+------------------+
| Product1 | Blue |
| Product2 | Red |
| Product3 | Blue Red |
| Product4 | Yellow |
+----------+------------------+
上面的查询只返回产品1和3,它完全忽略了第二个关键字'+red'。即使添加+黄色作为第三个关键字仍然会忽略它,因此它会忽略超过第一个关键字的任何内容。。。
如何使查询返回Product1 Product2和Product3,因为至少有一个或两个关键字在fulltext_tags字段中出现?
谢谢
最佳答案
您应该使用REGEXP '[[:<:]]Red[[:>:]]'
来查找准确的单词,所以请尝试下面的查询,希望它能够工作并满足您的要求。
SELECT * FROM `products`
WHERE fulltext_tags REGEXP '[[:<:]]Red[[:>:]]'
OR fulltext_tags REGEXP '[[:<:]]Blue[[:>:]]';
您可以看到DEMO Here。
更新1
试试这个问题,我可以看到你想做这样的事情,
SELECT *,
MATCH(fulltext_tags) AGAINST ('+blue' '+red')
AS relevance FROM `products`
WHERE MATCH(fulltext_tags) AGAINST('Red')
OR MATCH(fulltext_tags) AGAINST('Blue')
ORDER BY relevance DESC
请看这里ONLINE DEMO
关于php - SQL全文查询仅适用于第一个关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37650209/