Php MySQL全文搜索-搜索精确匹配的单词&;通配符,但先获得精确匹配,然后再进行其他匹配
我使用布尔全文搜索从数据库列中搜索单词。 我希望获得与我的记录完全匹配的记录&还包括通配符搜索。我得到了正确的结果,但我想先通过精确匹配来设置结果的顺序。有什么可能的方法来实现这一点吗 我还想对每个单词进行搜索&通过相关性获取记录 我尝试过使用下面的查询,但它不起作用,因为它为记录提供了错误的排名Php MySQL全文搜索-搜索精确匹配的单词&;通配符,但先获得精确匹配,然后再进行其他匹配,php,mysql,laravel,Php,Mysql,Laravel,我使用布尔全文搜索从数据库列中搜索单词。 我希望获得与我的记录完全匹配的记录&还包括通配符搜索。我得到了正确的结果,但我想先通过精确匹配来设置结果的顺序。有什么可能的方法来实现这一点吗 我还想对每个单词进行搜索&通过相关性获取记录 我尝试过使用下面的查询,但它不起作用,因为它为记录提供了错误的排名 SELECT id, search_tags, MATCH(search_tags) AGAINST(REPLACE(concat("'car'"," ")
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
使用联合时应能正常工作:
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;
此查询将记录的整个单词排名较高,但
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 |搜索|标记|相关性|排名|出现次数|
+----+---------------------+----------------+------------+
|12 |汽车、卡片、食品、代码| 0.1677478002 | 2|
|13 |汽车、水、天空| 0.1677478002 | 1|
|11 |载体、食品、饮料| 0.0093915509 | 1|
+----+---------------------+----------------+------------+
我认为你应该使用laravel Scout:@DharmeshRakholia-但我已经使用了全文搜索,laravel Scout使用了相同的搜索。我没有使用MVC结构,所以不可能继续使用Laravel Scout。你还有别的办法吗?可能是@JorisJ1的复制品-我的问题不仅是为了秩序,而且我还有相同等级的混乱。你知道为什么它会有相同的排名吗?对不起,我删除了重复的旗帜。不,我还没有答案,但今天晚些时候我会再看一遍。 +----+---------------------+----------------+ | id | search_tags | relevance_rank | +----+---------------------+----------------+ | 12 | car,cards,food,code | 0.1677478002 | | 13 | car,water,sky | 0.1677478002 | | 11 | carrier,food,drink | 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
+----+---------------------+----------------+------------+
| 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 |
+----+---------------------+----------------+------------+