【问题标题】:How to search SubString in FullText index column?如何在全文索引列中搜索子字符串?
【发布时间】:2018-11-16 07:14:38
【问题描述】:

我想在全文索引列中搜索子字符串。

我的表格结构是:child_table

clustering_key int(10) unsigned NOT NULL AUTO_INCREMENT,    
Parent_id char(36) NOT NULL DEFAULT '',    
child_id char(36) NOT NULL DEFAULT '',    
data text,    
PRIMARY KEY (clustering_key),    
UNIQUE KEY child_index (child_id) USING BTREE,    
FULLTEXT KEY data_index (data),    
CONSTRAINT FK_child_table_parent_table FOREIGN KEY (Parent_id) REFERENCES parent_table (id) ON DELETE CASCADE ON UPDATE CASCADE )    
ENGINE=InnoDB AUTO_INCREMENT=100001 DEFAULT CHARSET=utf8;

假设样本数据是:

我观察到的一些案例:

案例 1: 当我在查询中使用此模式时 MATCH (data) AGAINST ('xy*' IN BOOLEAN MODE) 返回1 行

案例 2: 当我在查询中使用此模式时 MATCH (data) AGAINST ('zy*' IN BOOLEAN MODE) 返回2行

案例 3: 当我在查询中使用此模式时 MATCH (data) AGAINST ('*y*' IN BOOLEAN MODE)然后没有返回任何行,但我希望它会返回两行。

我认为使用 (*) 作为前缀它不起作用。

请帮我找到解决此问题的方法。

提前致谢

【问题讨论】:

    标签: mysql database


    【解决方案1】:

    这是正确的行为。来自manual

    星号用作截断(或通配符)运算符。与其他运算符不同,它附加到要受影响的单词上。如果单词以 * 运算符前面的单词开头,则单词匹配。

    换句话说,* 只能用在词尾,就像前两种情况一样(xy*zy*)。如果要在单词的两端使用通配符匹配,则需要使用LIKERLIKE,例如

    WHERE data LIKE '%y%'
    

    【讨论】:

    • 嗨@Nick,我在列上使用全文索引来避免所有行扫描。当我使用 LIKE 时,此查询会扫描所有行。
    • @Shubham 不幸的是,这是真的。但无论如何,索引不能在字符串开头使用通配符。
    • 你是对的,如果我在字符串的开头使用通配符,则列上的全文索引是无用的。请建议您对如何以最少的行扫描在大量数据列中搜索子字符串或如何克服当前表结构的问题有任何想法。
    • @Shubham 恐怕我认为这个问题没有答案,如果不了解您的data 列中的确切信息,很难就如何改进提出建议表结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多