mysql查询将句子与字段中的关键字进行匹配

时间:2012-02-24 03:27:09

标签: mysql sql full-text-search

我有一个mysql表,其中包含以下关键字列表:

id | keywords
---+--------------------------------
 1 | apple, oranges, pears
 2 | peaches, pineapples, tangerines

我正在尝试弄清楚如何使用以下输入字符串查询此表: 约翰喜欢吃苹果

是否有一个mysql查询类型可以使用句子查询字段并返回结果(在我的示例中,记录#1)?

5 个答案:

答案 0 :(得分:2)

一种方法是将apple, oranges, pears转换为apple|oranges|pears并使用RLIKE(即正则表达式)来匹配它。

例如,'John喜欢吃苹果'与正则表达式'apple | orange | pears'匹配。

首先,要将'apple,oranges,pears'转换为正则表达式,请将所有','替换为'|'使用REPLACE。然后使用RLIKE选择匹配的关键字条目:

SELECT * 
FROM keywords_table
WHERE 'John liked to eat apples' RLIKE REPLACE(keywords,', ','|');

但这取决于你的逗号分隔是否一致(即如果有一行看起来像apples,oranges这将无效,因为REPLACE会替换逗号后跟空格(如根据您的示例行。)

我也认为它不会很好地扩展。

而且,如果你有一个像'约翰喜欢吃菠萝'这样的句子,它会匹配上面的两行(因为它里面有'苹果')。然后你可以尝试在正则表达式中添加单词边界(即WHERE $sentence RLIKE '[[:<:]](apple|oranges|pears)[[:>:]]'),但是如果你有复数('apples'不匹配'[wordboundary] apple [wordboundary]'),这会搞砸匹配。 / p>

答案 1 :(得分:2)

希望这并不比你需要的更抽象,但也许是做得好的好方法。 我没有测试过这个,但我认为它会起作用。如果您可以使用PHP,则可以使用str_replace将空格转换为keyword LIKE '%apple%'

$sentence = "John liked to eat apples";

$sqlversion = str_replace(" ","%' OR Keyword like '%",$sentence );

$finalsql = "%".$sqlversion."%"; 

以上将回应:

 %John%' OR Keyword like '%liked%' OR Keyword like '%to%' OR Keyword like '%eat%' OR Keyword like '%apples%

然后只与你的SQl声明结合

SQL ="SELECT * 
FROM keywords_table
WHERE Keyword like" . $finalsql;

答案 2 :(得分:0)

我不知道对该类型查询的任何直接解决方案。但是Full Text Search是可能的。如果您对感兴趣的字段有全文索引,那么在句子中的每个单词之间使用OR进行搜索(虽然我认为隐含了OR运算符)会找到该记录...但它也可能找到比你想要的还要多。

答案 3 :(得分:0)

我真的不认为你想要的是完全可能的,但你可以查看全文搜索或SOUNDEX。例如,SOUNDEX可以做类似的事情:

WHERE SOUNDEX(sentence) = SOUNDEX('%'+keywords+'%');

我从来没有在这种情况下尝试过,但你应该让我知道它是如何运作的。

答案 4 :(得分:0)

存储逗号分隔的数据是......不太理想 如果你将“约翰喜欢吃苹果”的字符串分成单个单词,你可以使用FIND_IN_SET operator

WHERE FIND_IN_SET('apple', t.keywords) > 0

性能不会很好 - 此操作更适合Full Text Search