多语言列上的全文搜索索引

Fra*_*amp 14 postgresql sequel

我有一个DB,其中有一个shows带有多语言列的表title.我想通过添加如下索引来优化全文搜索:

CREATE INDEX title_idx ON shows USING gin(to_tsvector(title));
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

ERROR:  functions in index expression must be marked IMMUTABLE
Run Code Online (Sandbox Code Playgroud)

它基本上要求我添加语言参数以使to_tsvector不可变.结果将是:

 CREATE INDEX title_idx ON shows USING gin(to_tsvector(LANGUAGE, title));
Run Code Online (Sandbox Code Playgroud)

哪里LANGUAGE是我的目标语言之一.

是否可以创建适用于多种语言的索引?

Cra*_*ger 38

是否可以创建适用于多种语言的索引?

是的,但您需要第二列来标识文本的语言.假设您doc_language在表中添加了一列; 你可以写:

CREATE INDEX title_idx ON shows USING gin(to_tsvector(doc_language, title));
Run Code Online (Sandbox Code Playgroud)

当然,这要求您了解主题文本的语言,这在实践中很难做到.如果你不需要词干等,你可以使用这种语言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)
Run Code Online (Sandbox Code Playgroud)

这将与cafés这三种语言中的任何一种语言相匹配.

作为索引:

CREATE INDEX title_idx ON shows USING gin((
    to_tsvector('english', title) || 
    to_tsvector('french', title) || 
    to_tsvector('simple', title)
));
Run Code Online (Sandbox Code Playgroud)

但是在查询中使用这一点很笨拙,因为规划人员对匹配索引码不是很聪明.所以我将它包装在一个函数中:

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));
Run Code Online (Sandbox Code Playgroud)

如果你想要你甚至可以获得幻想:将语言列表作为一个数组传递(但请记住,它必须与索引质量匹配的工作顺序完全相同).使用优先级setweight,所以你更喜欢英语和法语匹配.各种选择.