Поиск Django trigram_similar не дает результата (Django 2.1 с серверной частью Postgresql 10.5)

Я следовал инструкциям на https://docs.djangoproject.com/en/2.1/ref/contrib/postgres/lookups/#std:fieldlookup-trigram_similar, чтобы установить поиск триграмм в моей поисковой системе. Я добавил 'django.contrib.postgres' в свой INSTALLED_APPS в settings.py и установил расширение pg_trgm в свою базу данных PostgreSQL. Поиск по триграмме не дает результата, но и ошибки нет, просто пробел там, где должны быть результаты поиска. Моя поисковая система нормально работала с icontain поисковыми запросами. Вот код моей поисковой системы с trigram_similar:

def query_search(request):
    articles = cross_currents.objects.all()
    search_term = ''
    if 'keyword' in request.GET:
        search_term = request.GET['keyword']
        articles = articles.filter(Title__trigram_similar=search_term)  

Title это CharField в моей модели cross_currents:

class cross_currents(models.Model):
    Title = models.CharField(max_length=500)

Вот что мне дала оболочка Django:

In [6]: cross_currents.objects.filter(Title__trigram_similar='modern')
Out[6]: <QuerySet []>

HTML-страница также ничего не возвращает. Однако, когда я делаю

cross_currents.objects.filter(Title__icontains='modern') 

появляется много результатов. Есть идеи, почему мой поиск по триграмме ничего не возвращает?


person Ashley Liu    schedule 20.01.2019    source источник


Ответы (1)


Проблема заключалась в том, что порог сходства по умолчанию в Postgres установлен на 0,3, что слишком велико для возврата результатов поиска по одному слову в моем случае. Я считаю порог 0,01 эффективным в моем случае:

articles = articles.annotate(similarity=TrigramSimilarity('Title', search_term),).filter(similarity__gt=0.01).order_by('-similarity')
person Ashley Liu    schedule 22.01.2019
comment
Я думаю, что 0,01 — это слишком мало, и он улавливает почти все в результатах поиска. Разве не должно быть 0,1? - person Vipin Gupta; 08.04.2019