0

似乎无法弄清楚用复合类型的填充 hstore 的语法——注意:我不想将记录转换为 hstore。

select hstore('hello => ROW(1,2)');

我知道这很简单;然而,谷歌今天不是我的朋友。

用例:自定义倒排索引。

数据正在建模词位的倒排索引,复合数据类型是与我将用于实现文档聚类的词位相关的各种概率。有谁知道这样做的更好方法?如果允许将属性附加到倒排索引中的键->发布对,我愿意使用外部系统。

如果它对我正在尝试做的事情有坚实的支持,我会使用外部的东西,我怀疑每个元组坚持 3-10k 词位然后对它们进行批处理会很讨厌,因为整个 hstore 必须被解析和转换。

目前我的词位在每个元组 50-1k 的范围内,主要是几百个,我只是为我的研究算法做这件事。但是必须有更好的方法来做到这一点。

4

1 回答 1

1

中的字符串hstore是双引号的。hstore只支持文本值,没有别的,所以你必须存储其他类型作为它们的文本表示:

SELECT hstore('k => "(1,2)"');

例如:

regress=> SELECT (hstore('k => "(1,2)"')) -> 'k';
 ?column? 
----------
 (1,2)
(1 row)

这意味着您必须转换值才能使用它们,例如:

regress=> CREATE TYPE pair AS (a integer, b integer);
CREATE TYPE
regress=> SELECT ((hstore('k => "(1,2)"')) -> 'k')::pair;
 pair  
-------
 (1,2)
(1 row)

或使用数组来避免复合类型:

regress=> SELECT ((hstore('k => "{1,2}"')) -> 'k')::integer[];
 int4  
-------
 {1,2}
(1 row)

数组使用运算符从 1 开始索引[],例如[1].

这通常是非常低效的,因为每次都必须解析和转换这些值。当您没有对问题的性质以及为什么首先需要 hstore 进行过多说明时,建议替代方案并不实际。

于 2013-11-10T09:43:47.717 回答