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)