Django trigram_similar 搜索 returns 无结果(Django 2.1 与 Postgresql 10.5 后端)
Django trigram_similar search returns no result (Django 2.1 with Postgresql 10.5 backend)
我按照 https://docs.djangoproject.com/en/2.1/ref/contrib/postgres/lookups/#std:fieldlookup-trigram_similar 上的说明在我的搜索引擎上安装了三元组搜索。我在 settings.py
中的 INSTALLED_APPS
中添加了 'django.contrib.postgres'
,并在我的 PostgreSQL 数据库上安装了 pg_trgm
扩展。卦象搜索returns没有结果,但也没有错误,只是该搜索结果的地方一片空白。我的搜索引擎可以很好地处理 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 shell 给我的:
In [6]: cross_currents.objects.filter(Title__trigram_similar='modern')
Out[6]: <QuerySet []>
HTML 页面也returns 没有。但是,当我
cross_currents.objects.filter(Title__icontains='modern')
出现了很多结果。知道为什么我的 trigram 搜索 returns 什么都没有吗?
问题是 Postgres 的默认相似度阈值设置为 0.3,这对于 return 在我的案例中的单词搜索结果来说太高了。我发现 0.01 的阈值对我的情况有效:
articles = articles.annotate(similarity=TrigramSimilarity('Title', search_term),).filter(similarity__gt=0.01).order_by('-similarity')
我按照 https://docs.djangoproject.com/en/2.1/ref/contrib/postgres/lookups/#std:fieldlookup-trigram_similar 上的说明在我的搜索引擎上安装了三元组搜索。我在 settings.py
中的 INSTALLED_APPS
中添加了 'django.contrib.postgres'
,并在我的 PostgreSQL 数据库上安装了 pg_trgm
扩展。卦象搜索returns没有结果,但也没有错误,只是该搜索结果的地方一片空白。我的搜索引擎可以很好地处理 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 shell 给我的:
In [6]: cross_currents.objects.filter(Title__trigram_similar='modern')
Out[6]: <QuerySet []>
HTML 页面也returns 没有。但是,当我
cross_currents.objects.filter(Title__icontains='modern')
出现了很多结果。知道为什么我的 trigram 搜索 returns 什么都没有吗?
问题是 Postgres 的默认相似度阈值设置为 0.3,这对于 return 在我的案例中的单词搜索结果来说太高了。我发现 0.01 的阈值对我的情况有效:
articles = articles.annotate(similarity=TrigramSimilarity('Title', search_term),).filter(similarity__gt=0.01).order_by('-similarity')