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.

この params 部分をリストとして渡すにはどうすればよいですか?

4

1 に答える 1

1

|文字列内にが必要なようです。つまり、 内にブール値ORが必要tsqueryです。

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

Django は に拡張%sされているためE'string'、 と書くことはできません%s|%s。これまで見てきたように、これは 2 つの文字列E'string1'|E'string2'のブール値として解釈される に展開されORます。次のいずれかを行う必要があります。

  • 2 つの文字列を連結し|、Django で (eg)params=['hello'+'|'+'welcome']と 1 つの(%s)引数を使用します。また
  • Pg を取得して、2 つの文字列をリテラル|で連結します。(%s||'|'||%s)

最初のオプションをお勧めします。Python から渡すパラメーターを変更する必要がありますが、非常に単純な SQL が生成されます。

ORオリジナルは無効です。2 つの文字列リテラルに対してブール値を実行しようとしています。

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 に答える