Django SearchVector使用icontains

时间:2018-04-16 22:51:33

标签: python django postgresql

我正在尝试在postgres中搜索多列中的值列表(通过django)。我能够使用SearchQuery和SearchVector,如果其中一个搜索值与一个完整的单词匹配,这个效果很好。我希望使用icontains,以便在搜索中也可以使用部分字符串。这是否可能,如果是这样,有人会指出我正确的方向。以下是我的方法示例。

示例数据:

Superhero.objects.create(superhero='Batman', publisher='DC Comics', alter_ego="Bruce Wayne")
Superhero.objects.create(superhero='Hulk', publisher='Marvel Comics', alter_ego="Bruce Banner")

Django过滤器:

from django.contrib.postgres.search import SearchQuery, SearchVector

    query = SearchQuery('man') | SearchQuery('Bruce') 
    vector = SearchVector('superhero', 'alter_ego', 'publisher')
    self.queryset = self.queryset.annotate(search=vector).filter(search=query)

这将返回Hulk记录,但我希望我能以某种方式使用'icontains',这样当搜索'man'时,蝙蝠侠记录也将被返回。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:1)

因此,SearchQuery和SearchVector是Django全文搜索功能的一部分,它看起来不像你可以实现我想要用这些功能做的事情。由于Julian Phalip的方法,我采取了不同的方法。https://www.julienphalip.com/blog/adding-search-to-a-django-site-in-a-snap/

答案 1 :(得分:1)

您可以将icontains应用于过滤器,例如:

self.queryset = self.queryset.annotate(search=vector).filter(search__icontains=query)