MYSQL 匹配关键字列表逗号分隔的文本字段

MYSQL match keyword list Comma Delimited Text Field

我在 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 查询我所看到的 'so far' 时,有两种方法:a) like %% b) match against

假设我想运行查询单词'apple'

SELECT * 其中关键字如“%apple%”来自 table

这会调出包含单词 'apple' 的记录,包括上面的记录,但它不一定会给我任何更高或更低的顺序。我必须对 post 查询的结果进行过滤。

假设我在查询中更详细,并选择 'red apple' 它仍然会显示匹配项,但我不一定会得到 KEYWORD LIST 1 be more relevant than 2 or 3.

有人建议改用 Match Against

SELECT *, MATCH(Keywords) AGAINST('apple') AS Score
FROM table
WHERE Keywords like '%red apple%'
ORDER BY score DESC;

这肯定是在朝着正确的方向前进 - 但是它不会根据发现的更相关的精确匹配对结果进行排序。相关性将基于关键字列表中单词 'apple' 的重复次数(这是所有搜索引擎选择完全忽略关键字的古老原因) - 你明白我要去哪里了吗这个?

我正在寻找的是处理 MYSQL 中的大部分逻辑,而不是像其他人建议的那样将其读入数组并在 PHP 中处理。因此,这个简单的例子。

查询应该是这样的:

1) 如果我的查询是 'apple' 关键字列表 1 应该首先显示

2) 如果我的查询是 'red apple' 那么关键字列表 2 应该首先显示,因为单词 'red apple' 更靠近关键字列表的前面 - 更接近字符串的开头。

但是因为喜欢 %%

关键字列表 3 会显示,即使匹配项是 'red appleberry' 而不是 'red apple'

(如果 MySQL 具有某种 'explode' 函数,您可以将逗号 (',') 指定为匹配中的分隔符,但我不知道任何这样的方法,是吗?当然,您必须将整个结果列表读入一个数组,然后将它们分解为 PHP.

3) 假设我搜索 'red apple' 并且这是错误:我仍然在 'red appleberry' 上有一个匹配(记录 3)——我不想要那个。应该显示记录 2,然后显示记录 1,甚至不显示记录 3。

这是讨论和询问。有人有什么建议吗?

我自己的答案: 在查询中包含逗号 而不是搜索 'red apple' 搜索 'red apple,' 但是,如果用户在 - 之间放置一个 space 或者它位于关键字列表的末尾怎么办?

问题: 我们如何在 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;