php - MySQL 全文搜索 - 搜索具有精确匹配和通配符的单词,但首先获得精确匹配其他匹配

标签 php mysql laravel

我使用 bool 全文搜索来搜索数据库列中的单词。 我想要获取与我的记录完全匹配的记录,还包括通配符搜索。我得到了正确的结果,但我想首先通过精确匹配设置该结果的顺序。有什么可能的方法来实现这一目标吗?

我还想对每个单词执行搜索并按相关性获取记录。

我尝试使用以下查询,但它不起作用,因为它给出了错误的记录排名。

    SELECT
      id,
      search_tags,
      MATCH(search_tags) AGAINST(REPLACE(concat("'car'"," ")," ","* ")  IN BOOLEAN MODE) AS relevance_rank
    FROM
      images
    WHERE
      MATCH(search_tags) AGAINST(REPLACE(concat("'car'"," ")," ","* ")  IN BOOLEAN MODE)
    ORDER BY relevance_rank DESC;

我期望查询的输出是

   id  search_tag             relevance_rank
   11  car,cards,food,code    2.1669161319732666
   12  car,water,sky          2.1669161319732665
   13  carrier,food,drink     2.1669161319732664

,但实际输出是这样的

   id  search_tag             relevance_rank1
   11  carrier,food,drink     2.1669161319732666
   12  car,cards,food,code    2.1669161319732666
   13  car,water,sky          2.1669161319732666

最佳答案

此查询对整个单词的记录进行排名较高,但 car,cards 的排名与 car 相同,因此它仍然不是最佳的。

SELECT id, search_tags, 
    MATCH(search_tags) AGAINST('car *') + 
    MATCH(search_tags) AGAINST('car') AS relevance_rank
FROM images
WHERE MATCH(search_tags) AGAINST('car *') 
OR MATCH(search_tags) AGAINST('car')
ORDER BY 3 DESC
+----+---------------------+----------------+
| id |     search_tags     | relevance_rank |
+----+---------------------+----------------+
| 12 | car,cards,food,code | 0.1677478002   |
| 13 | car,water,sky       | 0.1677478002   |
| 11 | carrier,food,drink  | 0.0093915509   |
+----+---------------------+----------------+

This next query also looks at the number of times the exact word occurs in the string. Better result, but perhaps a bit too convoluted.

SELECT id, search_tags, 
    MATCH(search_tags) AGAINST('car *') + 
    MATCH(search_tags) AGAINST('car') AS relevance_rank,
    LENGTH(search_tags) - 
    LENGTH(REPLACE(search_tags, 'car', space(LENGTH('car')) -1 )) AS occurences
FROM images
WHERE MATCH(search_tags) AGAINST('car *') 
OR MATCH(search_tags) AGAINST('car')
ORDER BY 3 DESC, 4 DESC
+----+---------------------+----------------+------------+
| id |     search_tags     | relevance_rank | occurences |
+----+---------------------+----------------+------------+
| 12 | car,cards,food,code | 0.1677478002   |          2 |
| 13 | car,water,sky       | 0.1677478002   |          1 |
| 11 | carrier,food,drink  | 0.0093915509   |          1 |
+----+---------------------+----------------+------------+

关于php - MySQL 全文搜索 - 搜索具有精确匹配和通配符的单词,但首先获得精确匹配其他匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57288023/

相关文章:

具有旧输入和默认值的 Laravel 复选框无法正常工作

php - 使用 redis 驱动程序时如何更改 Laravel 4 的连接信息?

php - 使用完整或部分在表中搜索

php - 如何从我的成员表中选择所有用户名?

php - 使用Google Plus API在MYSQL数据库中存储流数据

mysql - 在 MYSQL 中使用 GROUP_CONCAT 的问题

php - 获取树中节点的总数

php - 按元素大小对多维数组排序

PHP/MySQL 注入(inject)示例

php - 如何在Laravel 5.8中扩展或制作自定义PasswordBroker sendResetLink()方法?