我有一个数据库的文章,我想搜索。我一直在使用普通的Django ORM进行搜索,搜索速度越来越慢,然后我对Django中的Indexes有了一点了解。我使用的是MySQL,现在我知道,使用MYSQL,我不能像我所面对的TextField那样将索引字段放入TextField中。但是,在我的例子中,我不能将它更改为CharField。
我在读MyQSL文档,上面写着
MySQL不能索引指定的LONGTEXT列,而在键部件上没有前缀长度,并且在功能键部件中不允许前缀长度。
因此,我的理解是,由于Django中的TextField是MYSQL的LONGTEXT,所以我遇到了这个Django-MySQL 这里的包裹,并认为如果我可以使用这个包将LONGTEXT更改为MEDIUMTEXT,那么这个问题可能会得到解决。所以我更新的模型我做了这个
class MyModel(Model):
........
document = SizedTextField(size_class=3)然而,在应用python manage.py makemigrations时,我仍然看到相同的错误。
django.db.utils.OperationalError:(1170年,"BLOB/TEXT列‘文档’在密钥规范中使用,没有密钥长度“)
我该怎么解决这个问题?
发布于 2022-02-21 17:31:29
返回包含客户端传递的给定单词的所有项目。因此,从文本包含搜索词的文章中选择*
添加
FULLTEXT(text)并使用
WHERE MATCH(text) AGAINST("searchword")或者也许
WHERE MATCH(text) AGAINST("+searchword" IN BOOLEAN MODE)它会跑得很快。有一些警告--短词和“停止”词(如"the")被忽略了。
(如果DJango不能提供方便,则必须使用"raw SQL“。)
发布于 2022-02-19 18:09:53
所有这些相关类型( TEXT、MEDIUMTEXT和LONGTEXT )都太大,无法在不指定前缀的情况下进行索引。索引前缀意味着索引中只包含字符串的第一个N个字符。如下所示:
create table mytable (
t text,
index myidx (t(200))
);此示例中的前缀长度为200个字符。因此,索引中只包含前200个字符。通常,这足以帮助性能,除非您有大量的字符串,它们在前200个字符中是相同的。
MySQL支持的最长前缀取决于存储引擎和行格式。旧版本的MySQL支持索引前缀最多可达768字节,这意味着根据是否使用多字节字符集(如utf8或utf8mb4 ),字符数量会减少。最近版本的MySQL默认为更现代的行格式,该格式支持索引最多3072字节,再次将每个字符的字节减少3或4个字节。
我不是一个普通的Django用户,所以我尝试浏览文档来定义模型类的索引。但是,考虑到几秒钟的阅读时间,我看不到为长字符串列上的索引声明前缀的选项。
我认为你的选择如下:
https://stackoverflow.com/questions/71187245
复制相似问题