我在 MYSQL 数据库中名为“keywords”的字段中有一个关键字列表,例如记录中的关键字字段包含 3 个示例记录
KEYWORD LIST 1: tree,apple,banana,cherry,flower,red apple,pink cherry,cat,mouse
KEYWORD LIST 2: cat,mouse,apple,red apple,flower,red appleberry
KEYWORD LIST 3: apple, red appleberry, flower
关键字列表不是一个数组 - 只是 mysql 数据库中的一个文本字段,其中包含许多其他字段。
当我从“到目前为止”看到的内容运行 MYSQL SELECT 查询时,有两种方法:a) like %% b) 匹配
假设我想对“apple”一词运行查询
SELECT * 表中的关键字如“%apple%”
这将显示包含“apple”一词的记录,包括上面的记录,但它不一定会给我任何更高或更低的序列。我必须对查询后的结果进行过滤。
假设我的查询更详细,并选择“红苹果”,它仍然会显示匹配项,但我不一定会得到关键字列表 1 比 2 或 3 更相关的结果。
有人建议使用“匹配”来代替
SELECT *, MATCH(Keywords) AGAINST('apple') AS Score
FROM table
WHERE Keywords like '%red apple%'
ORDER BY score DESC;
这肯定是朝着正确的方向前进 - 但是它不会按照更相关的精确匹配对结果进行排序。相关性将基于关键字列表中出现的“苹果”一词的重复次数(这是所有搜索引擎选择完全忽略关键字的古老原因) - 你明白我的意思了吗?
我正在寻找的是处理 MYSQL 中的大部分逻辑,而不是像其他人建议的那样将其读入数组并在 PHP 中处理。因此就有了这个简单的例子。
以下是查询应该如何进行的:
1) 如果我的查询是“apple”,则关键字列表 1 应首先显示
2) 如果我的查询是“red apple”,那么关键字列表 2 应该首先显示,因为“red apple”一词更靠近关键字列表的前面 - 更靠近字符串的开头。
但是因为喜欢%%
即使匹配项是“red appleberry”而不是“red apple”,关键字列表 3 也会显示
(如果 MySQL 有某种“爆炸”功能,您可以指定逗号(',')作为匹配中的分隔符,那将是最简单的,但我不知道有任何这样的方法,是吗?当然,您必须将整个结果列表读入数组,然后在 PHP 中分解它们。
3) 假设我搜索“红苹果”,错误如下:我仍然有一个关于“红苹果莓”的匹配项(记录 3) - 我不希望这样。应先显示记录 2,然后显示记录 1,甚至不显示记录 3。
这是一次讨论和询问。大家有什么建议吗?
我自己的答案: 在查询中包含逗号 不要搜索“红苹果”,而是搜索“红苹果”, 但是如果用户在 - 之间放置一个空格或者如果它位于关键字列表的末尾怎么办?
问题: 我们如何在 MYSQL 中的逗号分隔文本字段中搜索特定 SCORE,该字段使用确切的单词(而不是片段)来得出有序的结果列表。
到目前为止,尽管 red appleberry 和 red apple 是两个用逗号分隔的不同短语,但迄今为止的每次尝试仍会使关键字列表 3 显示的排名高于 2。
谢谢!我们来讨论一下!
最佳答案
对于小型项目,你可以这样做
SELECT *,
case when keyword like '%red apple%' then 1 else 0 end exact_match,
MATCH(Keywords) AGAINST('apple') AS Score
FROM table
where keywords like '%apple%'
ORDER BY exact_match DESC, score DESC;
关于php - MYSQL 匹配关键字列表逗号分隔文本字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30175749/