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'