我在一个名为' 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,即使红苹果和红苹果是由逗号分隔的两个不同的短语。
谢谢!我们来讨论吧!
答案 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;