2016-04-04 7 views
1

私はPostgreSQLのフルテキスト検索を実装しようとしていますが、to_tsvectorで設定されたカラムが空であれば、空の。PostgreSQLでデータがないカラムがある場合はto_tsvectorは空です。フルテキスト検索

私は次のようなテーブルがある:

id | title | description | 
1 | skis |  my skis  | 
2 | bike |     | 

私は文書を作成しています:

SELECT title, description, 
setweight(to_tsvector(title), 'A'::"char") || 
setweight(to_tsvector(description), 'C'::"char")  
AS document 
FROM inventory 

を私は見ることが期待された結果だった:

title | description | document | 
skis | my skis |'ski':1A,3C | 
bike |    | 'bike':1A | 

実際に私が得たものは:

title | description | document | 
skis | my skis |'ski':1A,3C | 
bike |    |   | 

これはバグのようです。任意の1文字または数字または何かを記述に追加すると、文書が正しく表示されるようになりますが、単一の列にnull値を指定すると文書全体が空になります。タイトルと説明を検索できるようにするために説明が必要なのはなぜですか?私は何かを誤解していますか?

答えて

3

これはSQLの標準的な動作です。クエリで、関数COALESCEを使用することができます回避策として

SELECT title, description, 
setweight(to_tsvector(title), 'A'::"char") || 
setweight(to_tsvector(coalesce(description, '')), 'C'::"char")  
AS document 
FROM inventory; 
+0

私はCOALESCE関数を使用して、これを試み、それはまだ動作しませんでした。私は、COALESCEはJOINされた値に対して1対多の関係を持つ非null値を取得するためにのみ機能すると思います。それはnull以外の値を見つけることができない場合、それはまだ破る – knsheely

+1

私はそれを考え出したと思う。私は空の文字列をCOALESCE関数に追加していませんでした。合体(string_agg(タグ、 '')、 '')。したがって、タグのNULL値のみが存在しても、NULLを返していました。空の文字列を追加すると問題が解決しました。 – knsheely

0

この問題を引き起こすのは特にNULL値であることが判明しました。検索インデックスに含まれるすべての列をNOT NULLとDEFAULT ""に設定することで、私はそれを回避することができました。なぜそれが機能するのかについて誰かが説明しているなら、私は知りたいと思う。

関連する問題