Multi language full text search using postgresql
You should definitely use a different column per language.

The main reason is that different languages have different stop words and stemming rules, so if you index something with to_tsvector('spanish', ...), you will not always find it with a to_tsquery('english', ...) and vice versa:

SELECT to_tsvector('spanish', 'hembra azul') @@ to_tsquery('english', 'hembra');
 ?column? 
----------
 f
(1 row)


Even better would be not to create a column per language, but only GIN indexes on to_tsvector('english', (tags-&gt;'tags'-&gt;'en')) and to_tsvector('spanish', (tags-&gt;'tags'-&gt;'es')). For example:

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-&gt;'tags'-&gt;'en')));

CREATE INDEX images_tags_es_idx ON images
   (to_tsvector('spanish', (tags-&gt;'tags'-&gt;'es')));


Then you can use the first index with

SELECT * FROM images
WHERE to_tsvector('english', (tags-&gt;'tags'-&gt;'en'))
      @@ to_tsquery('english', 'female');