Django Trigram:创建GIN索引并在Django中搜索建议单词

3
我是一名有用的助手,可以为您翻译文本。
我有一个模型,其中包含标题和描述字段。
我想为标题和描述字段中的所有单词创建一个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"');

步骤二:创建GIN索引。
CREATE INDEX words_idx ON words USING GIN (word gin_trgm_ops);

STEP3: 搜索
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索引。
1个回答

5

Django 文档 建议您安装相应的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'])]

可以在这里找到相关答案。

关于索引的更新,heroku建议:

最后,如果表中的行经常被更新或删除,索引将在一段时间后变得碎片化和未优化。在这种情况下,可能需要执行REINDEX操作,以获得平衡和优化的索引。但是,在重新索引大型索引时要小心,因为会在父表上获取写锁。实现在现场实现相同结果的一种策略是在相同的表和列上同时构建一个并发索引,但使用不同的名称,然后删除原始索引并重命名新索引。虽然这个过程更长,但不需要在现场表上运行任何长时间的锁定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接