【问题标题】:How to convert tsvector?如何转换tsvector?
【发布时间】:2016-07-02 11:23:26
【问题描述】:

tsvectot 的一个典型且相关的应用是查询和总结有关出现的单词集合及其频率的信息......而 JSONB 是自然选择 (!) 来表示这些“查询”的 tsvectot 数据类型应用程序”...所以,

有一个简单的解决方法可以将 tsvector 转换为 JSONB

示例:计算缓存的 tsvectot 单词的全局频率,类似于此查询

 SELECT r.key as word, SUM(r.value) as occurrences
 FROM (
     SELECT jsonb_each(kx_tsvectot::jsonb) as r FROM terms
 ) t
 GROUP BY 1;

【问题讨论】:

    标签: postgresql jsonb tsvector


    【解决方案1】:

    您可以使用 ts_stat() 函数,它会为您提供所需的一切

    word text — 词位的值
    ndoc integer — 单词出现在
    nentry中的文档数(tsvectors) strong> integer — 单词出现的总次数

    示例如下:

    CREATE TABLE t (
      tsv TSVECTOR
    );
    INSERT INTO t VALUES
      ('word'::TSVECTOR),
      ('second word'::TSVECTOR),
      ('third word'::TSVECTOR);
    
    SELECT * FROM
      ts_stat('SELECT tsv FROM t');
    

    结果:

      word  | ndoc | nentry 
    --------+------+--------
     word   |    3 |      3
     third  |    1 |      1
     second |    1 |      1
    (3 rows)
    

    如果您仍想将其转换为 jsonb,您可以使用将 wordtext 转换为 jsonb

    【讨论】:

    • 感谢帮助! My link 没有提到 ts_stats,所以 +1 提及,并以教学形式向读者公开使用(!)......这不是公认的答案,只是因为它是不是“我的梦想” :-) 梦想是一个简单而快速的转换为内部二进制表示,它们非常相似,所以需要快速转换。让我们看看另一个是否显示了更多关于这个问题的线索。
    • 好吧,在这种情况下,您需要首先执行以下操作 ((tsvector_val)::TEXT),但技巧将是使用 regexp_split_to_array() 以便从 TEXT 获取所有词位和比执行强制转换为 JSONB 并与 count() @PeterKrauss 聚合
    • 是的,它有效,但是正则表达式转换比简单的内部转换更消耗 CPU,我被解释为...二进制信息在那里,没有理由不使用它。
    猜你喜欢
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 2016-11-02
    • 2011-09-03
    • 1970-01-01
    相关资源
    最近更新 更多