0

我在 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 SELECT 查询时,有两种方法:a)像 %% b)匹配

假设我想对“苹果”这个词进行查询

从表中选择 * where 关键字,如 '%apple%'

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

假设我在查询中更详细,并选择了“红苹果”,它仍然会显示匹配项,但我不一定会得到 KEYWORD LIST 1 比 2 或 3 更相关。

有人建议改用 Match Against

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

这肯定是朝着正确的方向前进 - 但是它不会通过发现更相关的完全匹配来对结果进行排序。相关性将基于关键字列表中出现的“苹果”一词的重复次数(这是所有搜索引擎选择完全忽略关键字的古老原因) - 你知道我要去哪里吗?

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

这是查询应该是什么:

1)如果我的查询是“苹果”关键字列表 1 应该首先出现

2) 如果我的查询是“红苹果”,那么关键字列表 2 应该首先显示,因为“红苹果”这个词更靠近关键字列表的前面 - 更靠近字符串的开头。

但是因为 LIKE %%

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

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

3) 假设我搜索“red apple”,而这就是错误:我仍然会匹配“red appleberry”(记录 3)——我不希望这样。记录 2 应该出现,然后是记录 1,甚至不显示记录 3。

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

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

问题:我们如何在 MYSQL 的逗号分隔文本字段中搜索特定的 SCORE,该字段使用确切的单词(不是片段)来得出一个有序的结果列表。

尽管 red appleberry 和 red apple 是用逗号分隔的两个不同的短语,但到目前为止,每次尝试都会使关键字列表 3 显示高于 2。

谢谢!让我们讨论!

4

1 回答 1

1

对于小项目,你可以做这样的事情

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;
于 2015-05-11T19:17:51.483 回答