使用 postgresql 进行多语言全文搜索

mel*_*kki 6 postgresql full-text-search string-searching

我正在尝试使用 postgresql 为某些图像实现全文搜索。我正在将有关我的图像的一些信息存储到我表中的 json 字段中。这个 json 有一个tags键,我有多种语言,每种语言都有标签(关键字),如下所示:

"tags": {
    "en": ["blue female", "red female"],
    "es": ["hembra azul", "hembra roja"]
}
Run Code Online (Sandbox Code Playgroud)

tsvector考虑到我有更多语言,此时我还不清楚如何存储。

一个最初的想法是将所有这些连接tsvectors成一个,并将其存储在我表中的一列中。

第二个想法是为每种语言创建一个不同的列,并将对应向量存储到该列中。

哪个会更好?也许还有另一种更好的方法?

Lau*_*lbe 5

您绝对应该为每种语言使用不同的列。

主要原因是不同的语言有不同的停用词和词干提取规则,所以如果你用 索引某些东西to_tsvector('spanish', ...),你不会总是用 a 找到它,to_tsquery('english', ...)反之亦然:

SELECT to_tsvector('spanish', 'hembra azul') @@ to_tsquery('english', 'hembra');
 ?column? 
----------
 f
(1 row)
Run Code Online (Sandbox Code Playgroud)

更好的是不要为每种语言创建一个列,而只在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')));
Run Code Online (Sandbox Code Playgroud)

然后你可以使用第一个索引

SELECT * FROM images
WHERE to_tsvector('english', (tags->'tags'->'en'))
      @@ to_tsquery('english', 'female');
Run Code Online (Sandbox Code Playgroud)