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

San*_*idi 3 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"');
Run Code Online (Sandbox Code Playgroud)

STEP2:创建GIN索引

CREATE INDEX words_idx ON words USING GIN (word gin_trgm_ops);
Run Code Online (Sandbox Code Playgroud)

第三步:搜索

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
Run Code Online (Sandbox Code Playgroud)

如何在 DJANGO 中执行此操作,而且我还必须不断更新 GIN 索引

rar*_*iru 5

Django 文档建议您安装相关btree_gin_extension并将以下内容附加到模型的Meta类中:

\n\n
from django.contrib.postgres.indexes import GinIndex\n\nclass MyModel(models.Model):\n    the_field = models.CharField(max_length=512)\n\n    class Meta:\n        indexes = [GinIndex(fields=[\'the_field\'])]\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n
\n

最后,在一段时间后,索引将变得碎片化且未优化,尤其是在表中的行经常被更新或删除的情况下。在这些情况下,可能需要执行REINDEX \n 为您留下平衡且优化的索引。不过,对大索引重新建立索引时要小心,因为会在父表上获取写锁。在实时站点上实现相同结果的一种策略是在相同的表和列上同时构建索引,但名称不同,然后删除原始索引并重命名新索引。此过程虽然要长得多,但\xe2\x80\x99 不需要对活动表进行任何长时间运行的锁定。

\n
\n