如何使用to_tsquery查询部分单词匹配
例如 记录
'hello old world'
'hello world'
'hi welcome'
'hi'
在这里,我想返回包含“hello”或“welcome”字样的所有记录
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.
我如何将此params部分作为列表传递?
答案 0 :(得分:1)
您希望字符串中包含|
,即OR
中的布尔tsquery
:
regress=> select to_tsquery('english', 'olmin|20');
to_tsquery
----------------
'olmin' | '20'
(1 row)
Django正在将%s
扩展为E'string'
,因此您无法撰写%s|%s
;正如您所见,它扩展为E'string1'|E'string2'
,在两个字符串上被解释为布尔OR
。你必须:
|
与(例如)params=['hello'+'|'+'welcome']
和一个(%s)
参数连接起来;或|
连接两个字符串,例如(%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.