我使用来自不同组织的内容源,这些组织都提供元数据标签。我想要一个由不同组织提供的术语列表。
Elasticsearch中的数据样本:
doc1: {
"tags":["tag1", "tag5", "tag6", "tag4"],
"organization" : "A"
}
doc2: {
"tags":["tag1", "tag2", "tag4"],
"organization" : "B"
}
所需的查询结果:
{
"tag": "tag1",
"organization" : ["A", "B"]
},
{
"tag": "tag4",
"organization" : ["A", "B"]
}
到目前为止我得到了什么
根据下面的建议,我得到了一个结果列表,其中包含一个组织使用的关键字以及不同组织使用的关键字。
澄清一下,这是结果的一部分:
{
"key": "someKeyWord",
"doc_count": 66,
"organization_list": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "Organization A",
"doc_count": 62
},
{
"key": "Organization B",
"doc_count": 4
}
]
}
},
{
"key": "someOtherKeyword",
"doc_count": 62,
"organization_list": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "Organization A",
"doc_count": 62
}
]
}
}
现在我只想要第一个结果,它有来自organization_list聚合的两个桶。因为该关键字由两个不同的组织使用。
我试过这样:
"number_buckets_filter": {
"bucket_selector": {
"buckets_path": {
"my_var": "organization_list"
},
"script": "params.my_var > 1"
}
}
但这让我有一个例外:" buckets_path必须引用数值或单值数值度量聚合,得到:org.elasticsearch.search.aggregations.bucket.terms.StringTerms"
有没有办法过滤结果?提前感谢您的帮助。
亲切的问候, Oskar uit de Bos
答案 0 :(得分:1)
您可以使用以下查询首先在标签上进行存储,然后再到组织上的子存储桶
{
"size": 0,
"aggs": {
"tags_list": {
"terms": {
"field": "tags",
"size": 100
},"aggs": {
"organization_list": {
"terms": {
"field": "organization",
"size": 100
}
}
}
}
}
}
映射
{
"mappings": {
"product": {
"properties": {
"tags": {
"type": "text",
"fielddata": true
},
"organization": {
"type": "text",
"fielddata": true
}
}
}
}
}
注意 - 确保标记和组织都没有进行聚合分析。还在映射中设置fielddata=true
以避免重度内存使用。