为了便于说明,我列出了 10 个预定义的词位。在我的 PostgreSQL 数据库中,我有一个表,其中每一行都有一个 tsvector 列。
对于每个 tsvectors,我如何确定我的 10 个列表中的词素的频率(出现次数)? (这听起来像 ts_stat
,除了 1)我需要每个文档的统计信息和 2)我只需要它用于我列表中的词素。)
直觉上,我想计算每个文档的 ts_stat
,JOIN
使用我的单词列表,但 ts_stat
的设计目的是应用于生成一组文档的 SELECT
。
与此同时,我通过一个最小的例子取得了一些进展:
create table tsv_test (tsv tsvector, document_id int, freqs jsonb);
-- populated with some documents and tsvectors
create temp table lexemes (word text, ndoc int, nentry int);
-- calculate word frequencies over groups of documents
insert into lexemes select * from ts_stat('select tsv from tsv_test') ORDER BY nentry DESC LIMIT 10;
例如,我现在可以轻松地遍历表格并将其 freqs
列设置为当前 document_id 的 json 表示形式:
UPDATE tsv_test SET freqs =
(select to_json(document_id))::jsonb
where tsv_test.document_id IN (1,2,3);
但假设我想用 ts_stat
信息每个文档填充freqs
(JOIN 只显示在文档和词位表中):
UPDATE tsv_test SET freqs =
(select array_to_json(array_agg(row)) from (select ts_stat.word, ts_stat.nentry from lexemes JOIN ts_stat('select tsv from tsv_test where document_id=???') ON lexemes.word = ts_stat.word ORDER BY ts_stat.nentry DESC) row)::jsonb
where tsv_test.document_id IN (1,2,3);
看到 UPDATE
已经遍历了我需要更新的文档集,ts_stat
内部 SQL 查询应该如何完成?
最佳答案
经过多次实验,这似乎可以解决问题:
UPDATE tsv_test SET freqs =
(select array_to_json(array_agg(row)) from
(select ts_stat.word, ts_stat.nentry from lexemes
JOIN ts_stat('select tsv from tsv_test where document_id=' || tsv_test.document_id) ON lexemes.word = ts_stat.word
ORDER BY ts_stat.nentry DESC) row)::json
where tsv_test.document_id IN (1,2,3);
JOIN
确保只显示出现在 lexemes
表中的单词数。 UPDATE
将每个文档中的每个文档字数统计结果存储为 json 字段,ts_stat
内部查询必须使用字符串连接 || tsv_test.document_id
这样它只计算当前文档的单词数。
关于postgresql - 在 PostgreSQL 中,如何为受限制的词素列表计算每个文档的词素频率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25162923/