gpt4 book ai didi

MySQL:进行向后全文搜索的最佳方法?

转载 作者:行者123 更新时间:2023-11-29 08:57:48 27 4
gpt4 key购买 nike

我正在尝试基本上进行反向完整测试搜索,但不知道执行此操作的最佳方法。

基本上我有一个如下所示的关键短语表:
id - 短语
1 - “ Hello World ”
2 - “再见世界”
3 - “这是我的世界”

然后我有一个设置的字符串,例如“Welcome to the hello world group”。我想查找表中与短语完全匹配的所有行的 ID。意思是“o the”将不匹配,因为该词是“to the”。另外“ello”也不会匹配,因为世界是“hello”。

使用全文搜索,可以通过搜索以下内容轻松实现:
反对( bool 模式下的“ Hello World ”);

问题是,我不相信我可以使用全文搜索,因为全文搜索会找到包含单个短语的所有行。我想要匹配一组的所有短语(来自一组已知的短语)。

我知道如何使用正则表达式执行此操作,但速度很慢。在包含 400,000 个关键短语的表上,花费了超过 40 秒的时间:

其中“我知道我要搜索的数据位于此处”REGEXP CONCAT('[[:<:]]', phrases, '[[:>:]]')

我需要的是一种更优化的方法来做到这一点。即使我必须暂时将其添加到表中,而不实际单独执行循环检查每个关键字,我如何才能将其作为全文搜索来执行。

我非常感谢您的反馈,因为这确实导致我的网站在添加新数据方面滞后。

最佳答案

如果您愿意考虑从数据库中读取短语并构建用于优化短语检测的单独数据结构的解决方案,则有两种主要技术可以解决该问题。哪一种最适合您取决于多种因素,特别是:

  1. 短语列表的更新频率
  2. 在运行短语检测之前是否以及如何对文本进行标记
  3. 目标字符串的长度

选项 1:短语的哈希表 这意味着您只需将每个短语作为键插入哈希表(又名字典 HashMap ) 在许多编程语言中)。短语 id 成为值。更新既快速又简单,但检测给定字符串中的短语可能很困难:首先,您需要对字符串进行标记,并确保短语仅出现在标记边界之间。其次,您不仅需要在哈希中查找每个标记,还需要查找每对、三重、四重等连续标记。如果目标字符串通常很短,这仍然很有效。您还可以在磁盘上维护哈希表的副本,例如使用伯克利数据库。大多数编程语言的标准库中都有现成可用的模块。

选项 2:搜索 trie(或者稍微高级一点,最小化搜索 trie 或有限状态机)。这可以通过非常节省空间的方式实现,但通常比哈希表大(尽管 400k 条目根本不会成为问题)。短语检测期间的一大优点是,在进行查找之前无需剪切标记(或标记边界之间的候选短语)。相反,您在文本中的每个候选起始位置执行最长匹配查找。存储在磁盘上是可能的,尽管在大多数编程语言中不存在用于此的标准库模块。在 trie 中更新非常容易,但在最小化 trie 或 FST 中可能会变得困难(并且可能耗时)。

两个选项都允许在磁盘上维护数据结构(或将其副本存储在磁盘上,而实际查找发生在内存中)。但您不会获得交易安全性或容错性(我知道您并不寻求这些)。

关于MySQL:进行向后全文搜索的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9455890/

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