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
,所以你更喜欢英语和法语匹配.各种选择.
归档时间: |
|
查看次数: |
3958 次 |
最近记录: |