我在mySQL数据库中的字段中有一个名为'关键字'的关键字列表,例如记录中的关键字字段包含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选择查询时,有两种方法:a)%% b)与
匹配假设我想对"苹果"一词进行查询
选择 *关键字从表
等关键字之类的关键字这将提出包含"苹果"一词的记录,包括上面的记录,但不一定会给我任何更高或更低的顺序。我必须进行查询后结果的过滤。
假设我在查询中更详细,并且选择了"红苹果",它仍然会显示一项匹配项,但我不一定会有关键字列表1比2或3更相关。
。有人建议使用比赛反对
SELECT *, MATCH(Keywords) AGAINST('apple') AS Score
FROM table
WHERE Keywords like '%red apple%'
ORDER BY score DESC;
这肯定是朝着正确的方向前进 - 但是,它不会通过发现更相关的确切匹配来对结果进行排序。相关性将基于"苹果"一词在关键字列表中出现多少个重复(这是所有搜索引擎都选择完全忽略关键字的古老原因) - 您看到我要去哪里?
我正在寻找的是在MySQL中进行大多数逻辑处理,而不是像其他人建议的那样将其读取为阵列并在PHP中处理它。因此,这个简单的例子。
这是应如何应对的疑问:
1)如果我的查询是"苹果"关键字列表1应该首先显示
2)如果我的查询是"红色苹果",则关键字列表2应该首先出现,因为"红色苹果"一词更靠近关键字列表的正面 - 更靠近字符串的开头。
但是由于类似%%
关键字列表3即使比赛是"红色苹果贝里"而不是"红色苹果"
,也会显示出3个(如果MySQL具有某种"爆炸"函数,您可以将逗号(',')指定为比赛中的定界符,但我不知道任何这样的方法,这将是最简单的当然,您必须在数组中读取整个结果列表,然后在php中爆炸。
3)假设我搜索"红色苹果",这是错误:我仍然可以在"红苹果贝里"上进行匹配(记录3) - 我不想要那个。记录2应该显示,然后记录1,甚至不显示记录3。
这是一个讨论和询问。有人有任何建议吗?
我自己的答案:在查询中包括逗号而不是搜索"红苹果"搜索"红苹果",而是但是,如果用户在关键字列表的尾部末端放置一个空间?
问题:我们如何在MySQL中的逗号界限文本字段中搜索特定分数,该分数使用确切的单词(而不是片段)来提出有序的结果列表。
到目前为止,每次尝试的每次尝试仍然都会有关键字列表3显示出高于2的关键字列表,即使Red Appleberry和Red Apple是两个不同的短语,逗号分隔了。
谢谢!让我们讨论!
对于小项目,您可以做类似的事情
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;