Postgresql
使用 postgresql 進行多語言全文搜尋
我正在嘗試使用 postgresql 對某些圖像進行全文搜尋。我正在將有關我的圖像的一些資訊儲存到表中的 json 欄位中。這個 json 有一個
tags
鍵,我有多種語言,每種語言都有標籤(關鍵字),如下所示:"tags": { "en": ["blue female", "red female"], "es": ["hembra azul", "hembra roja"] }
tsvector
考慮到我有更多的語言,目前我還不清楚如何儲存。一個最初的想法是將所有這些連接
tsvectors
成一個並將其儲存在我表中的一列中。第二個想法是為每種語言創建一個不同的列,並將對應的向量儲存到該列中。
哪個會更好?也許還有另一種更好的方法?
您絕對應該為每種語言使用不同的列。
主要原因是不同的語言有不同的停用詞和詞幹規則,所以如果你用 索引某些東西
to_tsvector('spanish', ...)
,你不會總是用 a 找到它,to_tsquery('english', ...)
反之亦然:SELECT to_tsvector('spanish', 'hembra azul') @@ to_tsquery('english', 'hembra'); ?column? ---------- f (1 row)
更好的是不要為每種語言創建一個列,而只在
to_tsvector('english', (tags->'tags'->'en'))
和上創建 GIN 索引to_tsvector('spanish', (tags->'tags'->'es'))
。例如:CREATE TABLE images ( id bigint PRIMARY KEY GENERATED ALWAYS AS IDENTITY, image bytea NOT NULL, tags jsonb NOT NULL ); CREATE INDEX images_tags_en_idx ON images (to_tsvector('english', (tags->'tags'->'en'))); CREATE INDEX images_tags_es_idx ON images (to_tsvector('spanish', (tags->'tags'->'es')));
然後你可以使用第一個索引
SELECT * FROM images WHERE to_tsvector('english', (tags->'tags'->'en')) @@ to_tsquery('english', 'female');