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

标签 php mysql csv match match-against

我在 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/

相关文章:

python - 在不丢失列对齐的情况下将 csv 转换为 txt

php - Laravel 密码重置不起作用

php - MVC : Should the view always receive arrays instead of objects?

切换到 utf8mb4 后 MySQL INSERT 丢失信息

java - 具有该位置 [5] 的参数不存在;

python - 如果字段包含特定列中的值,则将字段移动到新列

Php 使用 mysql_fetch_array 排序

php - Mysql基于类别和分支的排名

php - 在一对多关系中获取字符串值而不是外部 id

java - 使用 Jackson CsvMapper 序列化 POJO 时省略字段