gpt4 book ai didi

php - 在 InnoDB 引擎的全文搜索中使用连字符?

转载 作者:行者123 更新时间:2023-12-03 00:13:35 25 4
gpt4 key购买 nike

我在零件编号表中进行全文搜索。有些零件号带有连字符。

表引擎是使用 MySQL 5.6 的 InnoDB。

我遇到的问题是 MySQL 将连字符 (-) 字符视为单词分隔符。

因此,我创建了一个新的 MySQL 字符集排序规则,而连字符被视为字母。

我遵循了本教程:http://dev.mysql.com/doc/refman/5.0/en/full-text-adding-collation.html

我使用链接底部的语法制作了一个测试表,但我使用了 InnoDB 引擎。我搜索“----”并收到“语法错误,意外的“-””

但是,如果我将引擎更改为 MyISAM,我会得到正确的结果。

如何让它与 InnoDB 引擎一起工作?

MySQL 似乎前进了一步,后退了两步。

编辑:我找到了 5.6 ( http://dev.mysql.com/doc/refman/5.6/en/full-text-adding-collation.html ) 的链接,这是使用 InnoDB 作为引擎的相同教程。

但这是我的测试:

create table test (a TEXT CHARACTER SET latin1 COLLATE latin1_fulltext_ci, FULLTEXT INDEX(a)) ENGINE=InnoDB

添加了一行“----”

select * from test where MATCH(a) AGAINST('----' IN BOOLEAN MODE)

语法错误,意外的“-”

删除表,MyISAM

create table test (a TEXT CHARACTER SET latin1 COLLATE latin1_fulltext_ci, FULLTEXT INDEX(a)) ENGINE=MyISAM

添加了一行“----”

select * from test where MATCH(a) AGAINST('----' IN BOOLEAN MODE)

1 个结果

编辑2,如果它有助于直观地看到,这是我的2个测试:

MyISAM

InnoDB

最佳答案

我最近遇到了这个问题。我之前已经根据文档添加了自定义排序规则,并且正在使用 MyISAM,并且运行良好。然后几周前切换到 InnoDB 并且一切停止工作。我尝试过:

  • 重建我的整理和 A/B 测试以确保它们正常工作
  • 通过将 innodb_ft_enable_stopword 设置为 0 禁用停用词
  • 重建我的全文表和索引

最后我采取了不同的方法,因为在全文索引方面,InnoDB 似乎并不遵循与 MyISAM 相同的规则。这有点 hacky,但适用于我的应用程序:

  1. 创建一个特殊的搜索列,其中包含我需要搜索的数据。该列有一个全文索引,其存在的唯一目的是进行全文搜索,这在具有数百万行的表上仍然非常快。
  2. 使用被视为“单词”字符的未使用字符搜索/替换我的搜索列中的所有-。请参阅我的问题:https://dba.stackexchange.com/questions/248607/which-characters-are-considered-word-characters 。弄清楚单词字符是什么并不那么容易,但这里有一些对我有用的字符:Ω œ π µ。这些字符可能不会在您需要搜索的数据中使用,但解析器会将它们识别为可搜索字符。就我而言,我将 - 替换为 Ω。由于我只需要行 ID,因此该列中的数据在人眼看来是什么样子并不重要。
  3. 修改我的更新和插入,以使搜索列数据和替换保持最新。就我而言,这很容易,因为应用程序中只有一个位置可以更新此特定表。还可以使用几个触发器来处理此问题:

    CREATE TRIGGER update_search BEFORE UPDATE ON animals
    FOR EACH ROW SET NEW.search = REPLACE(NEW.animal_name, '-', 'Ω');

    CREATE TRIGGER insert_search BEFORE INSERT ON animals
    FOR EACH ROW SET NEW.search = REPLACE(NEW.animal_name, '-', 'Ω');
  4. 将搜索查询中的 - 替换为 Ω

瞧。这是一个 fiddle 演示:https://www.db-fiddle.com/f/x1WZpZP6wcqbTTvTEFFXYc/0

上述解决方法可能不适用于每个应用程序,但希望它对某人有用。如果 InnoDB 能有一个真正的解决方案那就太好了。

关于php - 在 InnoDB 引擎的全文搜索中使用连字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25269278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com