Django Trigram:创建杜松子酒索引并在Django中搜索建议的单词

时间:2018-02-10 13:34:56

标签: django postgresql trigram

我有标题和说明字段的模型。

我想为标题和说明字段中的所有单词创建一个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索引

1 个答案:

答案 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   为您提供平衡且优化的索引。但是要小心   关于在父级上获得写锁时重新索引大索引   表。在实时网站上获得相同结果的一种策略是   同时在相同的表和列上建立索引,但带有   不同的名称,然后删除原始索引并重命名   新的一个。此过程虽然时间更长,但不需要任何时间   在活动表上运行锁。