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

时间:2015-05-11 19:10:23

标签: php mysql csv match match-against

我在一个名为' keywords'的字段中有一个关键字列表。在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查询时,我已经看到过目前为止的#39;有两种方法:a)像%% b)匹配

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

SELECT *其中关键字如'%apple%'从表

这会显示包含' apple'这个词的记录。包括上面的记录,但它不一定会给我任何更高或更低的序列。我必须在查询后过滤结果。

假设我在查询中更详细,并选择了“红苹果”#39;它仍会显示匹配,但我不一定会让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)如果我的查询是' apple'关键字列表1应首先显示

2)如果我的查询是' red apple'然后关键字列表2应该显示首先因为“红苹果”这个词#39; CLOSER是关键字列表的FRONT - 更接近字符串的开头。

但是因为LIKE %%

关键字列表3会显示,即使该匹配是“红苹果”'而不是红苹果'

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

3)假设我搜索红苹果'而且这里的错误是:我仍然可以在“红苹果”上找到一个匹配项目' (记录3) - 我不想要那个。记录2应显示,然后记录1,甚至不显示记录3.

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

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

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

到目前为止,每次尝试都会使关键字列表3显示高于2,即使红苹果和红苹果是由逗号分隔的两个不同的短语。

谢谢!我们来讨论吧!

1 个答案:

答案 0 :(得分: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;