使用MYSQL高效地搜索多种语言中的精确单词

hjqgdpho  于 2023-01-04  发布在  Mysql
关注(0)|答案(1)|浏览(133)

我有一个简单的数据库表,它存储了id,语言和文本。我想搜索任何单词/字符,并寻找一个精确的匹配。问题是我有超过1000万行。
例如,搜索词i将返回具有包含“i”的文本的行,如“信息是坏的”和“我喜欢狗”。
这也需要对停止词和其他不使用空格的语言起作用。
我的第一个直接想法是只做LOWERCASE(text) LIKE %word%与小写索引的文本,但在谷歌搜索后,它似乎会做一个完整的表扫描,我正在使用planetscale,所以我必须支付一个完整的表扫描,这根本不能工作,因为我会用完使用快。
我的下一个想法是一个布尔型全文搜索,但后来我遇到了问题,停止词被忽略的英语和必须使用一个ngram解析器的语言,如中文,然后必须找出什么语言正在提交和什么索引应该使用。
有人有更好的主意吗?

8cdiaqws

8cdiaqws1#

  • 使用CHARACTER SET utf8mb4
  • 对该字符集使用最新可用的COLLATION--utf8mb4_unicode_520_ciutf8mb4_0900_ai_ci,或者对最新的MariaDB使用其他字符集。
  • 不要使用LOWERCASELOWER(等等),而是让排序规则来处理这些问题(注意排序规则名称中的"ci")。
  • 是的,对于某些亚洲语言,您可能需要ngram而不是FULLTEXT
  • 非索引字表可以关闭。
  • 最小字长可以改变--但要付出代价。
  • 您的应用代码可以查看编码以决定是否使用ngram of fulltext。
  • This provides a list of hex values: http://mysql.rjweb.org/doc.php/charcoll#diagnosing_charset_issues Note that E3-EA is mostly "wordless" languages.
  • 我建议使用应用程序代码进行决策和构建SQL查询。在某些情况下,它甚至可能退化为LIKE '%word%'REGEXP '\\bword\\b'。请注意,REGEXP通常比LIKE慢,但如果搜索字符串包含多个单词,则提供"单词边界"测试。
  • 在适用的情况下,FULLTEXT比任何其他技术都要快得多。
  • 当执行WHERE ... AND MATCH ...时,将首先执行匹配,即使WHERE的其余部分更具选择性。
  • LIKE '%...'和所有(?)REGEXP测试将读取并测试您的10M行中的每一行(除非存在LIMIT)。

相关问题