【问题标题】:MySQL fulltext split on letters/numbersMySQL全文拆分字母/数字
【发布时间】:2013-05-16 23:48:05
【问题描述】:

我有一张产品表,例如汽车。我希望用户能够使用多个术语进行搜索,例如用于自动完成。 LIKE %term% 会变慢,因为它是一个巨大的表。为了让它更快,我想使用 MySQL 的全文搜索。我使用 ft_min_word_lenght = 1。

假设产品名称是“Lexus RX450H”。然后索引两个词:“Lexus”和“RX450H”。

MATCH (productname) AGAINST ('+lex* +rx45*' IN BOOLEAN MODE) ')

..会匹配这个产品,很好。

但是

MATCH (productname) AGAINST ('+lex* +450*' IN BOOLEAN MODE) ')

不会,因为必须搜索单词的开头。

用户可能知道数字,但可能会忘记字母。我希望第二个查询匹配。

如果产品是: “Lexus RX 450 H”,那么最后一个查询就会匹配,问题就解决了。

我可以做的是在表格中创建第二列,并通过在它们之间放置一个空格来拆分所有字母/数字,例如使用正则表达式。然后,应该在这个列上进行搜索,瞧,问题解决了。

但是,(大)表将变得几乎两倍大,我想知道是否可以告诉 MySQL 执行所描述的索引,而无需创建额外的列。

【问题讨论】:

标签: mysql full-text-indexing


【解决方案1】:

看起来查询正在返回应有的行。

MATCH (productname) AGAINST ('+lex* +450*' IN BOOLEAN MODE)')

基本上说匹配以“lex”开头并“450”开头的文本。您的数据在“lex”上匹配,但在“450”上不匹配。删除“+405”上的星号,我相信这对你有用。

MATCH (productname) AGAINST ('+lex* +450' IN BOOLEAN MODE)')

应该返回“Lexus RX 450 H”和“Lexus RX450H”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-06
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多