gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:12:45 27 4
gpt4 key购买 nike

我有一个数据库,其中有一个表shows,其中有一个多语言列title。我想通过添加如下索引来优化全文搜索:

CREATE INDEX title_idx ON shows USING gin(to_tsvector(title));

我收到这个错误:

ERROR:  functions in index expression must be marked IMMUTABLE

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

 CREATE INDEX title_idx ON shows USING gin(to_tsvector(LANGUAGE, title));

LANGUAGE 是我的目标语言之一。

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

最佳答案

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)
));

但这在查询中使用起来很笨拙,因为规划器在匹配索引质量方面不是很聪明。所以我将它包装在一个函数中:

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 一起使用,因此您更喜欢英语匹配而不是法语匹配。各种选择。

关于sql - 多语言列上的全文搜索索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21288591/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com