【问题标题】:MySQL Full-Text Search- Search words with exact match & wildcard but get exact match first other matchMySQL 全文搜索 - 使用完全匹配和通配符搜索单词,但首先获得完全匹配的其他匹配项
【发布时间】:2019-07-31 09:54:25
【问题描述】:

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

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

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

    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

【问题讨论】:

  • 我认为你应该使用 laravel 侦察兵:laravel.com/docs/5.8/scout
  • @DharmeshRakholia - 但我已经使用过全文搜索,Laravel Scout 使用相同的搜索。我没有使用 MVC 结构,因此无法继续使用 Laravel Scout。你还有什么办法吗?
  • @JorisJ1 - 我的问题不仅是为了秩序,而且我也对同等级的困惑。你知道为什么它会获得相同的排名吗?
  • 抱歉,我删除了重复的标志。不,我还没有答案,但我会在今天晚些时候再看一遍。

标签: php mysql laravel


【解决方案1】:

此查询将整个单词的记录排名更高,但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
+----+----------+----------------+ |编号 |搜索标签 |相关性排名 | +----+----------+----------------+ | 12 |汽车、卡片、食品、代码| 高分辨率照片| CLIPARTO 0.1677478002 | | 13 |汽车,水,天空| 高分辨率照片| CLIPARTO 0.1677478002 | | 11 |载体、食品、饮料| 高分辨率照片| CLIPARTO 0.0093915509 | +----+----------+----------------+

下一个查询还会查看确切单词在字符串中出现的次数。更好的结果,但可能有点太复杂了。

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
+----+---------------------+----------------+----- --------+ |编号 |搜索标签 |相关性排名 |事件 | +----+---------------------+----------------+----- --------+ | 12 |汽车、卡片、食品、代码| 高分辨率照片| CLIPARTO 0.1677478002 | 2 | | 13 |汽车,水,天空| 高分辨率照片| CLIPARTO 0.1677478002 | 1 | | 11 |载体、食品、饮料| 高分辨率照片| CLIPARTO 0.0093915509 | 1 | +----+---------------------+----------------+----- --------+

【讨论】:

    【解决方案2】:

    在使用 Union 时应该可以工作:

    SELECT
      id,
      search_tags,
      MATCH(search_tags) AGAINST(REPLACE(concat("'car'"," ")," "," ")  IN BOOLEAN MODE) AS relevance_rank,
    1 as prio -- sort by priority first
    FROM
      images
    WHERE
      MATCH(search_tags) AGAINST(REPLACE(concat("'car'"," ")," "," ")  IN BOOLEAN MODE)
    ORDER BY relevance_rank DESC 
    UNION SELECT
      id,
      search_tags,
      MATCH(search_tags) AGAINST(REPLACE(concat("'car'"," ")," ","* ")  IN BOOLEAN MODE) AS relevance_rank,
     2 as prio -- sort by priority first
    FROM
      images
    WHERE
      MATCH(search_tags) AGAINST(REPLACE(concat("'car'"," ")," ","* ")  IN BOOLEAN MODE)
    ORDER BY prio, relevance_rank DESC;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-22
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      • 2020-04-18
      • 2011-02-14
      • 2011-12-19
      相关资源
      最近更新 更多