2017-02-03 9 views
0

to_tsvector言語(たとえば「フランス語」)を設定して、FTSベクトルをレンダリングするときに適切な辞書を使用するようにします。Postgres UPDATE to_tsvectorがすべての行を同じ値に更新する

表メッセージにはlocale_idという列があり、これはlocales表にあります。次に、localesテーブルをlocale_idのlanguagesテーブルに結合して、実際の言語名を取得する必要があります。

このUPDATEはmessages内のすべての行をループになっ及びvector列= to_tsvector(joined language name, message)を設定し、まだそれは同じ値と同じ言語辞書(例えば、各列を更新します。to_tsvector('french', stringX)

なぜ、これはそれぞれのでしょうか?行が異なるmessage文字列と異なるlocale_id(意味、異なる言語名)を持つ

だから私は単にpg_dictionaryの言語設定を無視して行う場合:

UPDATE messages 
    SET vector = to_tsvector(message); 

表の結果:

メッセージ:

message | locale_id | vector 
----------------------------- 
Hi there | 1   | 'hi':1 
Is a test | 2   | 'test':3 
Le french | 3   | 'french':2 'le':1 --'le' SHOULD BE omitted since it's a stop word in French pg_dictionary 

これが正常に動作します。明らかに、それは各行のための正しい言語辞書にロードされていません。ただし、次の操作を実行すると、各行に対して同じ結果が得られます

WITH messages_languages as (
    select t3.language, t1.message 
    from messages as t1 
    inner join locales as t2 on (t1.locale_id = t2.id) 
    inner join languages as t3 on (t2.language_id = t3.id) 
) 
    UPDATE messages 
    SET vector = to_tsvector(messages_languages.language::regconfig, messages_languages.message) 
    FROM messages_languages; 

表の結果:

メッセージ:

UPDATE messages 
    SET vector = to_tsvector(messages_languages.language::regconfig, messages_languages.message) 
    FROM (
    select t3.language, t1.message 
    from messages as t1 
    inner join locales as t2 on (t1.locale_id = t2.id) 
    inner join languages as t3 on (t2.language_id = t3.id) 
) messages_languages; 

を私はWITH、同じ結果でそれをも試してみました

message | locale_id | vector 
----------------------------- 
Hi there | 1   | 'french':2 
Is a test | 2   | 'french':2 
Le french | 3   | 'french':2 --'le' omitted correctly in french pg_dictionary as it's a STOP word 

'french'の場合、pg_dictionary_name = 'フランス語'の場合、唯一の 'french':2この表のベクトル結果、まだすべての行が同じ

ロケールは、次のとおりです。

id  | language_id  
------------------ 
1   | 4   
2   | 5  
3   | 6 

言語:あなたが行にエイリアスサブクエリのIDを確認する必要があります

id  | language  
------------------ 
4   | 'English'   
5   | 'German'  
6   | 'French'  

答えて

0

それは結局のところ、あなたUPDATEで同じテーブルの上を反復「再:

UPDATE messages 
    SET vector = to_tsvector(messages_languages.language::regconfig, messages_languages.message) 
    FROM (
    select t1.id, t3.language, t1.message 
    from messages as t1 
    inner join locales as t2 on (t1.locale_id = t2.id) 
    inner join languages as t3 on (t2.language_id = t3.id) 
) messages_languages 
    -- Need to make sure you're referencing the same row in the subquery by comparing IDs 
    WHERE messages.id = messages_languages.id; 
1
  • あなたが、結果行に
をソースクエリを関連付ける必要があり
  • (ターゲット表が範囲テーブルにすでにある)、あなたがメッセージを再度選択する必要はありませんサブクエリ
  • を必要といけません
    UPDATE messages msg 
        SET vector = to_tsvector(lang.language::regconfig, msg.message) 
        FROM locales as loco 
        JOIN languages as lang ON loco.language_id = lang.id 
        WHERE msg.locale_id = loco.id 
        ; 
    
  • 関連する問題