Python 如何编写Django查询,在Postgres列中查找单词?

Python 如何编写Django查询,在Postgres列中查找单词?,python,django,python-3.x,postgresql,Python,Django,Python 3.x,Postgresql,我正在使用Django和Python 3.7。如何在Django查询中扫描单词?单词是由空格(或行首或行尾)包围的字符串。我有这个 def get_articles_with_words_in_titles(self, long_words): qset = Article.objects.filter(reduce(operator.or_, (Q(title__icontains=x) for x in long_words))) result = set(list(qset

我正在使用Django和Python 3.7。如何在Django查询中扫描单词?单词是由空格(或行首或行尾)包围的字符串。我有这个

def get_articles_with_words_in_titles(self, long_words):
    qset = Article.objects.filter(reduce(operator.or_, (Q(title__icontains=x) for x in long_words)))
    result = set(list(qset))
但如果“long_words”包含[“about”、“still”]之类的内容,它将与标题中包含“行踪”或“死胎”之类内容的文章相匹配。知道如何修改我的查询以合并单词边界吗?

试试iregex或regex

# Article.objects.filter(title__iregex=r"\y(still|about)\y")
words = "|".join(long_words)
Article.objects.filter(title__iregex=fr"\y({words})\y")
这应该适用于PostgreSQL

Django文件:

用于单词边界的Python正则表达式文档:

PostgreSQL关于单词边界的文档:

如果您的数据库是postgres,我建议您尝试使用postgres

看来django对这件事很感兴趣


如果你使用的是MySQL,根据这篇文章:你可能需要查找MySQL的单词边界处理方法。我使用的是PostGres,但即使如此,你的语句也不起作用。该查询生成的内容类似于“article”。“title”::text~*\\b(正确地说是canada | woman)\\b但当硬编码查询(如“title like“%canada%”)本身返回结果时,它不会返回任何结果。嗨,Dave,我已经更新了我的答案,似乎您需要使用Postgres的regex风格来定义单词边界。谢谢。你确定它是“\y”吗?Python告诉我“非法/不受支持的转义序列”。@Dave是的,我在我的应用程序中尝试过。Django不会将python正则表达式转换为Postgres的可能副本
from django.contrib.postgres.search import SearchVector, SearchQuery

search_vector = SearchVector('title')
search_query = SearchQuery('about') & SearchQuery('still')

Article.objects.annotate(
  search=search_vector
).filter(
  search=search_query
)