我有一个简单的数据库表,它存储了id,语言和文本。我想搜索任何单词/字符,并寻找一个精确的匹配。问题是我有超过1000万行。
例如,搜索词i将返回具有包含“i”的文本的行,如“信息是坏的”和“我喜欢狗”。
这也需要对停止词和其他不使用空格的语言起作用。
我的第一个直接想法是只做LOWERCASE(text) LIKE %word%
与小写索引的文本,但在谷歌搜索后,它似乎会做一个完整的表扫描,我正在使用planetscale,所以我必须支付一个完整的表扫描,这根本不能工作,因为我会用完使用快。
我的下一个想法是一个布尔型全文搜索,但后来我遇到了问题,停止词被忽略的英语和必须使用一个ngram解析器的语言,如中文,然后必须找出什么语言正在提交和什么索引应该使用。
有人有更好的主意吗?
1条答案
按热度按时间8cdiaqws1#
CHARACTER SET utf8mb4
COLLATION
--utf8mb4_unicode_520_ci
或utf8mb4_0900_ai_ci
,或者对最新的MariaDB使用其他字符集。LOWERCASE
或LOWER
(等等),而是让排序规则来处理这些问题(注意排序规则名称中的"ci")。FULLTEXT
。LIKE '%word%'
或REGEXP '\\bword\\b'
。请注意,REGEXP通常比LIKE慢,但如果搜索字符串包含多个单词,则提供"单词边界"测试。FULLTEXT
比任何其他技术都要快得多。WHERE ... AND MATCH ...
时,将首先执行匹配,即使WHERE的其余部分更具选择性。LIKE '%...'
和所有(?)REGEXP
测试将读取并测试您的10M行中的每一行(除非存在LIMIT
)。