Nowa funkcja TrigramSimilarity w django.contrib.postgres była świetna z powodu mojego problemu. Używam go do paska wyszukiwania, aby znaleźć trudne do przeliterowania łacińskie nazwy. Problem polega na tym, że istnieje ponad 2 miliony nazw, a wyszukiwanie trwa dłużej, niż chcę.Tworzenie indeksu ginu z trygramem (gin_trgm_ops) w modelu Django
Chciałbym utworzyć indeks na trygramów jak descibed w dokumentacji postgres https://www.postgresql.org/docs/9.6/static/pgtrgm.html
ale nie jestem pewien, jak to zrobić w taki sposób, że API Django korzysta z niego. W przypadku wyszukiwania tekstu postgresów znajduje się opis tworzenia indeksu. Ale nie dla trygrafii similarety. https://docs.djangoproject.com/en/1.11/ref/contrib/postgres/search/#performance
To co mam teraz:
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'])]
a potem w get_queryset w Vieuw jest zrobić:
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
edit umieścić całą klasę widok w
dodał indeksu z opcją z PostgreSQL przednim końcu, nie wydaje się, aby cokolwiek zmienić.Czy ma to związek ze sposobem, w jaki jest wykonywane zapytanie? – Allcor