Postgresql

使用 postgresql 進行多語言全文搜尋

  • January 27, 2020

我正在嘗試使用 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');

引用自:https://dba.stackexchange.com/questions/258260