如何在 MYSQL 中使用斜杠进行全文搜索

问题描述

如果可能的话,寻求这方面的帮助。我有一个如下所示的 MysqL 表:

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,我至少应该在前几场比赛中得到那个结果。我的表中大约有 100,000 行,但我没有通过 FULLTEXT Search 获得我需要的结果。我可以通过使用 LIKE 获得我需要的结果,但这意味着您必须按照它们存储在表中的顺序使用搜索词......我并不总是知道。

这是我的简单 SELECT 语句:

SELECT name 
FROM mydata_tbl 
WHERE MATCH (name) AGAINST ('"4/102"' IN BOOLEAN MODE);
Limit 5;

我认为正在发生的是 / 被忽略了。有没有解决的办法?您认为可能是什么问题?

感谢任何帮助。

谢谢, 卡尔

解决方法

A 计划:

您的配置中的“最小字长”是多少?大概是“3”。这意味着不能搜索“4”,但可以搜索“102”。

以下是在大表中查找“4/102”的最快方法:

std::max_element

由于它也得到“114/102”而您不希望出现这种情况,因此需要付出更多努力:WHERE MATCH(col) AGAINST('+102' IN BOOLEAN MODE) AND col LIKE '%4/102%' 有风险,因为它周围可能没有“空格”。这效果更好:LIKE ' 4/102 '(在 MySQL 8.0 中),否则 RLIKE '[[:<:]]4/102[[:<:]]'

计划 B:

准备数据,使单词看起来像单词。这可能需要您添加第二列——一列用于显示用户,另一列用于 FULLTEXT。

在这种情况下,将“4/102”转换为“4_102”,然后执行

RLIKE '\\b4/102\\b'

这需要您的努力,但速度会非常快。

,

全文搜索无法做到这一点 全文搜索是针对全词搜索,而不是根据需要进行部分词搜索。

使用

SELECT name 
FROM mydata_tbl 
WHERE name Like "%4/102%"

或正则表达式

,

在限制 5 后使用分号(;);那么查询将起作用。但它不会为“4/102”返回完全匹配的行。请检查并让我知道这是您要查找的内容:

SELECT name 
FROM mydata_tbl 
WHERE MATCH (name) AGAINST ('"4/102"' IN BOOLEAN MODE)
Limit 5;

enter image description here