postgresql - 在 PostgreSQL 中,如何为受限制的词素列表计算每个文档的词素频率?

标签 postgresql full-text-search

为了便于说明,我列出了 10 个预定义的词位。在我的 PostgreSQL 数据库中,我有一个表,其中每一行都有一个 tsvector 列。

对于每个 tsvectors,我如何确定我的 10 个列表中的词素的频率(出现次数)? (这听起来像 ts_stat,除了 1)我需要每个文档的统计信息和 2)我只需要它用于我列表中的词素。)

直觉上,我想计算每个文档的 ts_statJOIN 使用我的单词列表,但 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/

相关文章:

mysql搜索标题、描述和多行标签

.net - 最快的搜索技术/方法是什么? (在文件搜索的上下文中)

mysql - php mysql 按相关性排序全文搜索

mysql - 当我将数据库从 sqlite 迁移到 Postgresql 或其他数据库时,是否需要更改 Rails 中的代码

python - 如何在 SQLAlchemy 中实现仅附加的版本化模型

python - pgAdmin4 查询错误 "not enough values to unpack (expected 5, got 4)"

sql - Postgresql 使用 tsearch2 为两列 ts_vector 创建 TRIGGER

postgresql - 将压缩的 CSV 文件导入 PostgreSQL

php - Laravel Eloquent 截断 - 外键约束

perl - 搜索文件中的特定行并存储它们