小编All*_*cor的帖子

在Django模型中使用Trigram(gin_trgm_ops)创建Gin索引

django.contrib.postgres的新TrigramSimilarity功能非常适合我遇到的问题.我将它用于搜索栏以找到难以拼写的拉丁名字.问题是有超过200万个名字,搜索需要的时间比我想要的要长.

我想在postgres文档https://www.postgresql.org/docs/9.6/static/pgtrgm.html中创建一个关于三元组的索引.

但我不知道如何以Django API使用它的方式来做到这一点.对于postgres文本搜索,有关于如何创建索引的描述.但不是因为三元组的相似性. https://docs.djangoproject.com/en/1.11/ref/contrib/postgres/search/#performance

这就是我现在所拥有的:

class NCBI_names(models.Model):
    tax_id          =   models.ForeignKey(NCBI_nodes, on_delete=models.CASCADE, default = 0)
    name_txt        =   models.CharField(max_length=255, default = '')
    name_class      =   models.CharField(max_length=32, db_index=True, default = '')

    class Meta:
        indexes = [GinIndex(fields=['name_txt'])]
Run Code Online (Sandbox Code Playgroud)

然后在vieuw的get_queryset中我做:

class TaxonSearchListView(ListView):    
    #form_class=TaxonSearchForm
    template_name='collectie/taxon_list.html'
    paginate_by=20
    model=NCBI_names
    context_object_name = 'taxon_list'

    def dispatch(self, request, *args, **kwargs):
        query = request.GET.get('q')
        if query:
            try:
                tax_id = self.model.objects.get(name_txt__iexact=query).tax_id.tax_id
                return redirect('collectie:taxon_detail', tax_id)
            except (self.model.DoesNotExist, self.model.MultipleObjectsReturned) as e:
                return super(TaxonSearchListView, self).dispatch(request, *args, **kwargs)
        else:
            return super(TaxonSearchListView, self).dispatch(request, *args, **kwargs)

    def get_queryset(self): …
Run Code Online (Sandbox Code Playgroud)

python django postgresql indexing similarity

11
推荐指数
5
解决办法
1894
查看次数

标签 统计

django ×1

indexing ×1

postgresql ×1

python ×1

similarity ×1