繁体   English   中英

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

[英]Best way to perform unstructured text search in MySQL using FULLTEXT Index

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

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

产生一堆结果(见下面的前 5 个)

邮政编码 街道
WS5 3PZ 乌鸦路
WD18 7DA 乌鸦关闭
DE55 5NR 乌鸦大道
IP28 7LF 乌鸦关闭
WD18 7DB 乌鸦关闭

事实上,如果我运行这个查询,我会得到下面的结果,这对我来说看起来比上面的结果更相关......?

SELECT postcode, street  from table1 where postcode LIKE "W4 5EQ%" LIMIT 5
邮政编码 街道
W4 5情商 拉文斯科夫特路
W4 5情商 拉文斯科夫特路
W4 5情商 拉文斯科夫特路
W4 5情商 拉文斯科夫特路
W4 5情商 拉文斯科夫特路

我误解了搜索的工作原理吗?

我希望上面的两个查询都能返回非常相似的结果。 我想使用第一个的原因是因为有时用户可能只搜索RAVEN有时只搜索W4 ,所以我不想将它们限制为列类型。

编辑澄清:鉴于我的表有类似于第二个查询给出的记录,我希望第一个查询给出比它返回的更相似的东西(“更接近”匹配)

很抱歉,比较两个查询的结果就像比较苹果和梨!

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM