匹配MySQL中分隔符的短语

时间:2011-09-06 13:50:03

标签: mysql database full-text-search pattern-matching

我希望在MySQL中指定的分隔符内对短语执行完全匹配。我在全文索引字段中有以下数据。

  

,花园家具,露台加热器,最佳优惠,最优惠的价格,

我正在执行以下查询,该查询返回上述记录。

SELECT id, tags
FROM Store 
WHERE MATCH(tags) AGAINST(',garden,' IN BOOLEAN MODE)

我只想返回包含以下值的记录:,garden,而不是,garden furniture,,country garden,等。

它当前正在执行贪婪匹配并忽略查询中指定的逗号分隔符。我试图逃避逗号以强制它们包含在查询中,但这不起作用。

是否可以指定非字母数字分隔符作为匹配的一部分?我希望能够执行完全匹配,就像正则表达式,'/,garden,/'

2 个答案:

答案 0 :(得分:2)

来自docs

修改字符集文件:这不需要重新编译。 true_word_char()宏使用“字符类型”表来区分字母和数字与其他字符。 。您可以在其中一个字符集XML文件中编辑<ctype><map>数组的内容,以指定','是“字母”。然后使用给定的FULLTEXT索引字符集。有关<ctype><map>数组格式的信息,请参见第9.3.1节“Character Definition Arrays”。

另一个选项是add a new collation

无论哪种方式,您都必须重建索引:

REPAIR TABLE Store QUICK;

答案 1 :(得分:1)

只有match against才能在搜索中使用索引 但是如果你的桌子不是太大,你可以使用:

SELECT id, tags
FROM Store 
WHERE tags LIKE "garden" OR tags LIKE "garden,%" OR tags LIKE "%, garden,%"

还有其他选项(find_in_set),但我真的不想进入这些选项,因为它们的性能比上面的SQL差。

真正的问题,永远不要在数据库中使用CSV!
在数据库中使用CSV是一个非常糟糕的主意,因为
•浪费,您的数据未正常化 •您无法加入CSV字段
•您不能在CSV字段上使用索引
•全文索引与分隔符不一致(如您所见)

创建2个额外表格的答案。

Table tag (innoDB)
----------
id integer primary key auto_increment
tag varchar(50)    //one tag per row!

Table tag_link (innoDB)
--------------
store_id integer foreign key references store(id)
tag_id integer foreign key references tag(id)  
primary key = (store_id + tag_id) //composite PK

现在,您可以轻松地对标签进行各种查询。

SELECT s.id, GROUP_CONCAT(t2.tag) FROM store s
INNER JOIN tag_link tl1 ON (s.id = tl1.store_id)
INNER JOIN tag t1 ON (t1.id = tl1.tag_id)
INNER JOIN tag_link tl2 ON (s.id = tl2.store_id)
INNER JOIN tag t2 ON (t2.id = tl2.tag_id)
WHERE t1.tag = 'garden'
GROUP BY s.id

这将选择一个名为garden 的标签(使用t1和tl1),查找链接到该标签的所有商店,然后获取链接到这些商店的所有商品(使用t2)和tl2)
非常快速且非常灵活。