我使用 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/