![](/img/trans.png)
[英]Best way to emulate fulltext search in a InnoDB/MySQL database using Codeigniter
[英]Best way to perform unstructured text search in MySQL using FULLTEXT Index
我有一张 MySQL 的大表,其中包含 20 毫米的销售记录和 10 列左右。 其中两列是POSTCODE和STREET 。 我已经配置了表,以便我在这两列上定义了一个 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*
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.