我有标题和说明字段的模型。
我想为标题和说明字段中的所有单词创建一个GIN索引
所以我用以下方式使用SQL:
步骤1:使用简单配置
创建一个包含标题和描述中所有单词的表格CREATE TABLE words AS SELECT word FROM ts_stat('SELECT to_tsvector(''simple'',COALESCE("articles_article"."title", '''')) || to_tsvector(''simple'',COALESCE("articles_article"."description", '''')) FROM "articles_article"');
第2步:创建GIN索引
CREATE INDEX words_idx ON words USING GIN (word gin_trgm_ops);
第3步:搜索
SELECT word, similarity(word, 'sri') AS sml
FROM words
WHERE word % 'sri'
ORDER BY sml DESC, word;
Result:
word sml
sri 1
srila 0.5
srimad 0.428571
如何在DJANGO中执行此操作,我还必须不断更新GIN索引
答案 0 :(得分:2)
Django docs建议您安装相关的btree_gin_extension
并将以下内容附加到模型的Meta
类中:
from django.contrib.postgres.indexes import GinIndex
class MyModel(models.Model):
the_field = models.CharField(max_length=512)
class Meta:
indexes = [GinIndex(fields=['the_field'])]
可以找到相关的答案here。
关于索引的更新,heroku建议:
最后,索引将在某些情况下变得零散且未优化 时间,特别是如果表中的行经常更新或 已删除。在这些情况下,可能需要执行REINDEX 为您提供平衡且优化的索引。但是要小心 关于在父级上获得写锁时重新索引大索引 表。在实时网站上获得相同结果的一种策略是 同时在相同的表和列上建立索引,但带有 不同的名称,然后删除原始索引并重命名 新的一个。此过程虽然时间更长,但不需要任何时间 在活动表上运行锁。