如何在 MYSQL 中使用带斜杠的全文搜索
How do I use Fulltext Search in MYSQL with slashes
如果可能,正在寻求一些帮助。我有一个 MySQL table 看起来像这样:
CREATE TABLE mydata_tbl
(`name` varchar(92));
INSERT INTO mydata_tbl
(`name`)
VALUES
('https://www.google102.com'),
('1999 Pokemon BASE SET SHADOWLESS 84/102 PLUSPOWER UNCOMMON (SHADOWLESS)'),
('2018 Pokemon SUN MOON DRAGON MAJESTY 114/102 RESHIRAM GX ULTRA RARE'),
('2000 Pokemon GYM HEROES 1ST EDITION 110/102 ERIKAS PERFUME UNCOMMON 1ST EDITION'),
('2017 Pokemon SUN MOON CRIMSON INVASION 117/102 KARTANA GX HYPER RARE'),
('2016 Pokemon SUN MOON PROMOS SM158/102 CHARIZARD (STAFF) PRE RELEASE PROMO'),
('1999 Pokemon FOSSIL UNLIMITED 50/102 KABUTO COMMON UNLIMITED'),
('Pokemon BATTLE ACADEMY BOX SET 119/102 CYNTHIA PIKACHU DECK (PIKACHU SYMBOL 59)'),
('1999 Pokemon BASE SET 1ST EDITION 4/102 CHARIZARD HOLO');
CREATE FULLTEXT INDEX idx_1 ON mydata_tbl (`name`);
我的问题是我有时希望能够通过卡号进行搜索。所以,如果我搜索 4/102,我至少应该在前几场比赛中得到那个结果。我的 table 中大约有 100,000 行,但我无法通过 FULLTEXT 搜索获得所需的结果。我可以通过使用 LIKE 获得我需要的结果,但这意味着您必须按照它们存储在 table 中的顺序使用搜索词...我并不总是知道。
这是我的简单 SELECT 声明:
SELECT name
FROM mydata_tbl
WHERE MATCH (name) AGAINST ('"4/102"' IN BOOLEAN MODE);
Limit 5;
我认为正在发生的事情是 / 被忽略了。有没有解决的办法?您认为可能是什么问题?
感谢任何帮助。
谢谢,
卡尔
全文搜索无法做到这一点
全文搜索是针对全词搜索,而不是根据您的需要进行部分词搜索。
使用
SELECT name
FROM mydata_tbl
WHERE name Like "%4/102%"
或正则表达式
限制5后使用分号(;);然后查询将起作用。但它不会 return 与“4/102”完全匹配的行。请查看并告诉我您是否正在寻找:
SELECT name
FROM mydata_tbl
WHERE MATCH (name) AGAINST ('"4/102"' IN BOOLEAN MODE)
Limit 5;
方案A:
您的配置中的“最小字长”是多少?大概是“3”。也就是说“4”是搜不到的,但是“102”是可以的。
这是在大 table 中找到“4/102”的最快方法:
WHERE MATCH(col) AGAINST('+102' IN BOOLEAN MODE)
AND col LIKE '%4/102%'
由于它也得到“114/102”,而您不希望这样,因此需要更多的努力:LIKE ' 4/102 '
是有风险的,因为它周围可能没有“空格”。这样效果更好:RLIKE '[[:<:]]4/102[[:<:]]'
(在 MySQL 8.0 中),否则 RLIKE '\b4/102\b'
B计划:
准备数据,使单词看起来像单词。这可能需要您添加第二列——一列用于显示用户,一列为 FULLTEXT 量身定制。
在这种情况下,将“4/102”转换为“4_102”,然后执行
WHERE MATCH(col) AGAINST('+4_102' IN BOOLEAN MODE)
这需要您的努力,但会非常快。
如果可能,正在寻求一些帮助。我有一个 MySQL table 看起来像这样:
CREATE TABLE mydata_tbl
(`name` varchar(92));
INSERT INTO mydata_tbl
(`name`)
VALUES
('https://www.google102.com'),
('1999 Pokemon BASE SET SHADOWLESS 84/102 PLUSPOWER UNCOMMON (SHADOWLESS)'),
('2018 Pokemon SUN MOON DRAGON MAJESTY 114/102 RESHIRAM GX ULTRA RARE'),
('2000 Pokemon GYM HEROES 1ST EDITION 110/102 ERIKAS PERFUME UNCOMMON 1ST EDITION'),
('2017 Pokemon SUN MOON CRIMSON INVASION 117/102 KARTANA GX HYPER RARE'),
('2016 Pokemon SUN MOON PROMOS SM158/102 CHARIZARD (STAFF) PRE RELEASE PROMO'),
('1999 Pokemon FOSSIL UNLIMITED 50/102 KABUTO COMMON UNLIMITED'),
('Pokemon BATTLE ACADEMY BOX SET 119/102 CYNTHIA PIKACHU DECK (PIKACHU SYMBOL 59)'),
('1999 Pokemon BASE SET 1ST EDITION 4/102 CHARIZARD HOLO');
CREATE FULLTEXT INDEX idx_1 ON mydata_tbl (`name`);
我的问题是我有时希望能够通过卡号进行搜索。所以,如果我搜索 4/102,我至少应该在前几场比赛中得到那个结果。我的 table 中大约有 100,000 行,但我无法通过 FULLTEXT 搜索获得所需的结果。我可以通过使用 LIKE 获得我需要的结果,但这意味着您必须按照它们存储在 table 中的顺序使用搜索词...我并不总是知道。
这是我的简单 SELECT 声明:
SELECT name
FROM mydata_tbl
WHERE MATCH (name) AGAINST ('"4/102"' IN BOOLEAN MODE);
Limit 5;
我认为正在发生的事情是 / 被忽略了。有没有解决的办法?您认为可能是什么问题?
感谢任何帮助。
谢谢, 卡尔
全文搜索无法做到这一点 全文搜索是针对全词搜索,而不是根据您的需要进行部分词搜索。
使用
SELECT name
FROM mydata_tbl
WHERE name Like "%4/102%"
或正则表达式
限制5后使用分号(;);然后查询将起作用。但它不会 return 与“4/102”完全匹配的行。请查看并告诉我您是否正在寻找:
SELECT name
FROM mydata_tbl
WHERE MATCH (name) AGAINST ('"4/102"' IN BOOLEAN MODE)
Limit 5;
方案A:
您的配置中的“最小字长”是多少?大概是“3”。也就是说“4”是搜不到的,但是“102”是可以的。
这是在大 table 中找到“4/102”的最快方法:
WHERE MATCH(col) AGAINST('+102' IN BOOLEAN MODE)
AND col LIKE '%4/102%'
由于它也得到“114/102”,而您不希望这样,因此需要更多的努力:LIKE ' 4/102 '
是有风险的,因为它周围可能没有“空格”。这样效果更好:RLIKE '[[:<:]]4/102[[:<:]]'
(在 MySQL 8.0 中),否则 RLIKE '\b4/102\b'
B计划:
准备数据,使单词看起来像单词。这可能需要您添加第二列——一列用于显示用户,一列为 FULLTEXT 量身定制。
在这种情况下,将“4/102”转换为“4_102”,然后执行
WHERE MATCH(col) AGAINST('+4_102' IN BOOLEAN MODE)
这需要您的努力,但会非常快。