Is it possible to create an index that works for several languages ?
是的,但您需要第二列標識文本的語言。假設你在表格中添加了一列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)
));
但是這是笨拙在查詢中使用,作爲策劃人是不是匹配指數quals很聰明。所以我把它包在一個函數:
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
的優先順序,所以你比較喜歡英語的一個法語比賽。各種選擇。
謝謝,我不知道tsvectors是否能夠合併。那很棒。從我Upvote :) – knitti
偉大的深入答案! –
最後一行代碼中有一個額外的「(」(不能編輯少於6個字符......) – Victor