php - SQL 全文查询仅适用于第一个关键字

标签 php mysql full-text-search full-text-indexing

我不是全文搜索方面的专家,所以我在谷歌上搜索了一个 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/

相关文章:

MySQL 在值更改时插入新行

javascript - 给定一个特定的日期,有没有办法在不知道日期以何种格式写入的情况下在自由文本文档中搜索该日期?

php - 在 PHP 中对三个数据库运行四个查询

php - 如何从多维数组中获取键名称

mysql - 简单的触发器,根据查询删除特定记录

mysql - AUTO_INCREMENT 导致语法错误

android - Android 中使用 Sqlite 全文搜索对非英语字符的 Unicode 支持

java - 针对大型数据集存储和匹配名称的有效方法

php - 从 XML 中捕获数据并保存在数据库中

php - echo 在输出浏览器端没有显示任何内容