2015-05-11 93 views
0

我有一个MySQL数据库例如所谓的“关键字”字段关键字的列表中记录的关键字字段包含3个样本记录MYSQL匹配关键字列表逗号分隔文本字段

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查询“到目前为止,”有两种方式:1)像%% b)针对

比赛比方说,我想请对单词的查询“苹果”

SELECT *从哪里表

LIKE“%苹果%”的关键字这将弹出包含单词“苹果”,包括以上,但它并不一定给我任何顺序记录记录更高或更低。我不得不做的结果后过滤查询。

假如我是在我的查询更详细,并选择了“红苹果”它仍然会显示一个比赛,但我不一定会得到具有关键字列表1比2或3

有人更相关使用对阵代替

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

这是朝着正确的方向肯定航向建议 - 但将不会通过精确匹配的结果被人发现更多相关的排序。相关性将基于关键字列表中出现“苹果”一词的多少次重复(这是所有搜索引擎选择完全忽略关键字的古老原因) - 您是否看到我要与此相伴?

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

下面是查询应该给它应该如何:

1)如果我的查询是“苹果”的关键字列表1应显示第一

2)如果我的查询是“红苹果”,那么关键字列表2应该显示首先是因为'red apple'这个词在关键字列表的FRONT处更接近于字符串的开头。

因为LIKE %%

关键字列表3会出现,而不是“红苹果”,即使比赛是“红色appleberry”,但

(这将是最简单的MySQL是否有某种'explode'函数可以指定逗号(',')作为匹配中的分隔符,但我不知道任何这样的方法,是吗?当然,您必须将整个结果列表读入3)假设我搜索'红苹果',这里是bug:我仍然会在'红苹果'(记录3)上找到一个匹配项, - 我不想那样。记录2应显示,然后记录1,甚至不显示记录3.

这是一个讨论和一个查询。任何人有任何建议?

我自己的答案: 包括在查询的 而不是搜索的“红苹果”搜索逗号“红苹果” 但如果用户把之间的空间 - 在末端或者其关键字列表?

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

尽管红苹果和红苹果是用逗号分隔的两个不同的短语,但到目前为止的每一次尝试仍将使关键字列表3显示高于2。

谢谢!来!我们讨论一下!

+0

栈是Q&A网站不是一个讨论参见[文章](http://meta.stackexchange.com/questions/13198/where-我可以找到有趣的编程讨论) – xQbert

+2

为什么这些关键字全部卡在一个列中而不是另一个表中? –

+1

您的数据库设计混乱了。有了这个设计,你就不会得到你想要的满足和高性能的方式。 – Reeno

回答

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; 
+0

谢谢。现在对于这个特定的搜索项目,我们有3个字段 - 它们与我们所熟悉的非常相似: 标题 - 描述 - 关键字 - 我正在创建的是一个声明,它创建一个基于这三个字段在给定搜索中的相关性。我意识到要做到这一点的方法是首先创建一个INDEX - 你有没有关于如何创建一个快速生成分数的FULL TEXT索引的见解? – Viktor

+0

我认为全文索引的想法是它会扫描您的文本,并根据关键字为您提供相关顺序的结果。直到您提供搜索关键字才有分数。 – Tim3880

相关问题