在MySQL中使用FULLTEXT索引执行非结构化文本搜索的最佳方法



我有一个大的MySQL表,有20毫米的销售记录和10个左右的列。其中两列是POSTCODE街道和。我已经配置了表,以便在这2列上定义FULLTEXT索引。我的问题是,当我搜索这个表使用以下查询,我得到一堆随机结果,我希望得到更接近的匹配…例如:

SELECT * FROM table1 WHERE MATCH(postcode, street) AGAINST ('W4 RAVEN' IN NATURAL LANGUAGE MODE)

产生一系列结果(见下面的前5条)

tbody> <<tr>
邮编街道
WS5 3 pz乌鸦路
WD18 7DARAVEN CLOSE
DE55 5NRRAVEN AVENUE
IP28 7LFRAVEN CLOSE
WD18 7DBRAVEN CLOSE

我很抱歉地写道,比较两个查询的结果就像比较苹果和梨一样!

在第一个查询中搜索邮编的一部分街道名称的一部分。不知道为什么您会对它返回的行感到惊讶,其中搜索的字符串出现在街道名称列中!更不用说W4可能被忽略了,因为它对于一个单词来说太短了。innodb表默认的最小字长是3。如果您将此限制减少到2,并重新构建全文索引,那么您的搜索结果也可能更准确。

在第二个查询中,您只搜索特定的邮政编码,因此您的结果也将更加具体。

请记住,全文搜索不像谷歌搜索!它不使用机器学习或类似的数据科学技术来猜测搜索表达式的不同部分之间的关系!

  • 我怀疑IN NATURAL MODE是不合适的地址。建议用IN BOOLEAN MODE,或者在每一项前加(+)。
  • innodb_ft_min_token_size默认值为3。因此,"W4"会被忽略。你可以改变这一点,但是,这将意味着重建所有FT指数。
  • 我建议在邮政编码中有一个空格是适得其反的。在插入数据时,删除其中的所有标点符号。然后搜索+W4*
  • 对于只检查前缀的查询,' LIKE 'W4%'可能比FT更快。
  • 混合FT搜索和非FT搜索可能很慢。

最新更新