是否可以创建适用于多种语言的索引?
是的,但您需要第二列来标识文本的语言。假设您在表格中添加了 doc_language 列;然后你可以写:
CREATE INDEX title_idx ON shows USING gin(to_tsvector(doc_language, title));
当然,这需要您了解主题文本的语言,这在实践中可能很难做到。如果您不需要词干等,您可以使用语言simple,但我猜如果可以选择的话,您已经这样做了。
作为替代方案,如果您有一组固定且有限的语言,您可以连接不同语言的向量。例如:
regress=> SELECT to_tsvector('english', 'cafés') || to_tsvector('french', 'cafés') || to_tsvector('simple', 'cafés');
?column?
----------------------------
'caf':2 'café':1 'cafés':3
(1 row)
这将匹配使用这三种语言中的任何一种的cafés 的 tsquery。
作为索引:
CREATE INDEX title_idx ON shows USING gin((
to_tsvector('english', title) ||
to_tsvector('french', title) ||
to_tsvector('simple', title)
));
但这在查询中使用起来很笨拙,因为规划器在匹配索引质量方面不是很聪明。所以我会把它包装在一个函数中:
CREATE FUNCTION to_tsvector_multilang(text) RETURNS tsvector AS $$
SELECT to_tsvector('english', $1) ||
to_tsvector('french', $1) ||
to_tsvector('simple', $1)
$$ LANGUAGE sql IMMUTABLE;
CREATE INDEX title_idx ON shows USING gin(to_tsvector_multilang(title));
如果您愿意,您甚至可以花哨:将语言列表作为数组传递(但请记住,它必须完全与索引限定匹配的顺序相同)。使用setweight 的优先级,因此您更喜欢用英语匹配而不是用法语匹配。各种选择。