我不是全文搜索方面的专家,所以我在谷歌上搜索了一个 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
问题是,只考虑了第一个关键字。 假设我有这个 Product 表
+----------+------------------+
| name | fulltext_tags |
+----------+------------------+
| Product1 | Blue |
| Product2 | Red |
| Product3 | Blue Red |
| Product4 | Yellow |
+----------+------------------+
上面的查询只返回产品 1 和 3,它完全忽略了第二个关键字 '+red'。即使添加 +Yellow 作为第三个关键字仍然会忽略它,因此它会忽略第一个关键字之后的任何内容...
由于至少一个或两个关键字出现在 fulltext_tags 字段中,因此使用 +blue 和 +red 的查询返回 Product1 Product2 和 Product3,我该如何做到这一点?
谢谢
最佳答案
你应该使用 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/