elasticsearch中的Significant Terms聚合类型允许通过script
属性在存储桶级运行自定义脚本以对每个存储桶进行评分。
有没有办法访问significant_terms
的单度量子聚合的值,还是只有在桶评分后计算的子聚合,对于未淘汰的桶?
此外,是否可以对背景设置项进行子聚合,而不是子设置项?
我正在尝试计算文本中所有术语与文本集合中的Okapi BM25分数。 完整的设置稍微复杂一些,但为了便于说明,我将简化它并假设索引中存储了两种类型的文档:单词和文档。
示例文档:
{
_id: "somecollection/somedocument",
collection: "somecollection",
text: "this is a rather short text for the purpose of illustration"
}
示例字
{
_id: "somecollection/somedocument:1",
value: "this",
collection: "somecollection",
document: "somecollection/somedocument",
index: 1
}
我想说我想在somecollection / somedocument中找到的条件得分。
我可以查询文档中的单词,然后根据value
属性进行汇总:
GET myindex/word/_search
{
query: {
filtered: {
filter: {
term: {
document: "somecollection/somedocument"
}
}
}
},
size: 0,
aggs: {
bm25: {
significant_terms: {
field: "value",
background_filter: {
term: { collection : "somecollection" }
},
script: "???"
}
}
}
}
在脚本中,对于每个字词,_subset_freq
在文档中提供术语频率(因为这里是ES"文档" =单个字),_subset_size
提供了文档_superset_freq
在集合中提供术语频率,_superset_size
提供集合中的单词总数。
但是,BM25评分还需要包含该集合中单词的文档数量(例如,匹配该存储桶的超集中单词的document
字段的基数)。
另一种方法是最初查询文档。另外,让我们同时为集合中的每个文档执行此操作,因为这是我真正想要的:
GET myindex/document/_search
{
query: {
filtered: {
filter: {
term: {
collection: "somecollection"
}
}
}
},
size: 0,
aggs: {
documents: {
terms: {
field: "_id"
},
aggs: {
bm25: {
significant_terms: {
field: "text",
background_filter: {
term: { collection : "somecollection" }
},
script: "???"
}
}
}
}
}
}
现在,_subset_freq
和_subset_size
都是1,_superset_freq
提供包含该术语的集合中的文档数量,_superset_size
提供的文档总数为集合。我们错过了文档中的术语频率和集合中的总术语频率。因此,查询文档确实无济于事。
有没有办法做我想做的事情?
我现在能看到的唯一解决方案是预先计算并存储每个单词的额外统计数据,这意味着在添加,编辑或删除文档时这些统计数据将不同步。 此外,这排除了使用动态集合的可能性,动态集合可能基于涉及多个字段的搜索过滤器。