1

我如何使用 to_tsquery 查询部分单词匹配

例如记录

'hello old world'
'hello world'
'hi welcome'
'hi'

在这里,我想返回所有包含“你好”或“欢迎”的记录

SELECT * FROM accounts_order
WHERE name_tsvector @@ to_tsquery('english','hello | welcome');

这会正确返回。在这里,我尝试使用 django 'objects.extra' 查询来实现

queryset = Order.objects.extra(where=['name_tsvector @@ to_tsquery(%s|%s)'], params=['hello','welcome'])

此查询不起作用,出现异常

operator is not unique: unknown | unknown
LINE 1: ...nts_order" WHERE name_tsvector @@ to_tsquery(E'olmin'|E'20')
                                                            ^
HINT:  Could not choose a best candidate operator. You might need to add explicit type casts.

我怎样才能将此参数部分作为列表传递?

4

1 回答 1

1

看来您想要|字符串中的 ,即OR中的布尔值tsquery

regress=> select to_tsquery('english', 'olmin|20');
   to_tsquery   
----------------
 'olmin' | '20'
(1 row)

Django 正在扩展%sE'string'所以你不能写%s|%s;正如您所看到的,扩展为E'string1'|E'string2'which 被解释为OR两个字符串上的布尔值。您必须:

  • |在 Django中将两个字符串和(例如)params=['hello'+'|'+'welcome']和一个(%s)参数连接起来;或者
  • 让 Pg 将两个字符串与文字连接起来|,例如(%s||'|'||%s)

我推荐第一个选项;它要求您更改从 Python 传递的参数,但它会产生非常简单的 SQL。

原件无效,它试图OR对两个字符串文字执行布尔运算:

regress=> select to_tsquery('english', 'olmin'|'20');
ERROR:  operator is not unique: unknown | unknown
LINE 1: select to_tsquery('english', 'olmin'|'20');
                                            ^
HINT:  Could not choose a best candidate operator. You might need to add explicit type casts.
于 2013-04-08T06:29:40.870 回答