3

我有带有标题和描述字段的模型。

我想为标题和描述字段中的所有单词创建一个 GIN 索引

因此,我使用 SQL 以下列方式执行此操作:

STEP1:使用简单的配置创建一个包含标题和描述中所有单词的表

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"');

STEP2:创建 GIN 索引

CREATE INDEX words_idx ON words USING GIN (word gin_trgm_ops);

第三步:搜索

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 索引

4

1 回答 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 ,从而为您提供平衡和优化的索引。但是,在重新索引大索引时要小心,因为在父表上获得了写锁。在实时站点上实现相同结果的一种策略是在相同的表和列上同时建立一个索引,但名称不同,然后删除原始索引并重命名新索引。这个过程虽然要长得多,但不需要对活动表进行任何长时间运行的锁定。

于 2018-08-29T20:20:39.083 回答