Das neue TrigramSimilarity-Feature des django.contrib.postgres war großartig für ein Problem, das ich hatte. Ich benutze es für eine Suchleiste, um schwer zu finden, lateinische Namen zu buchstabieren. Das Problem ist, dass es über 2 Millionen Namen gibt und die Suche länger dauert, als ich möchte.Erstellen eines Gin-Index mit Trigram (gin_trgm_ops) im Django-Modell
Ich mag einen Index für die Trigrams zu erzeugen, wie in der Postgres-Dokumentation descibed https://www.postgresql.org/docs/9.6/static/pgtrgm.html
Aber ich bin nicht sicher, wie dies in einer Art und Weise zu tun, dass der Django API Gebrauch macht. Für die Postgres-Textsuche gibt es eine Beschreibung, wie ein Index erstellt wird. Aber nicht für die Trigrammähnlichkeit. https://docs.djangoproject.com/en/1.11/ref/contrib/postgres/search/#performance
Das ist, was ich jetzt haben:
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'])]
und dann in der get_queryset des vieuw i tun:
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):
result = super(TaxonSearchListView, self).get_queryset()
#
query = self.request.GET.get('q')
if query:
result = result.exclude(name_txt__icontains = 'sp.')
result = result.annotate(similarity=TrigramSimilarity('name_txt', query)).filter(similarity__gt=0.3).order_by('-similarity')
return result
bearbeiten stellen die gesamte Ansichtsklasse in
Added der Index mit der Option mit postgresql Frontend, schien nicht, etwas zu ändern.Könnte es mit der Art und Weise, wie die Abfrage gemacht wird, zu tun haben? – Allcor