[英]elastic search : Aggregating the specific nested documents only
我想聚合滿足給定查詢的特定嵌套文檔。
讓我通過一個例子來解釋它。 我在索引中插入了兩條記錄:
第一個文件是
{
"project": [
{
"subject": "maths",
"marks": 47
},
{
"subject": "computers",
"marks": 22
}
]
}
第二份文件是
{
"project": [
{
"subject": "maths",
"marks": 65
},
{
"subject": "networks",
"marks": 72
}
]
}
其中包含主題以及每個記錄中的標記。 從這些文檔中,我需要從給定的文檔中平均獲得一個maths
學科的平均水平。
我試過的查詢是:
{
"size": 0,
"aggs": {
"avg_marks": {
"avg": {
"field": "project.marks"
}
}
},
"query": {
"bool": {
"must": [
{
"query_string": {
"query": "project.subject:maths",
"analyze_wildcard": true,
"default_field": "*"
}
}
]
}
}
}
這將返回匯總所有不需要的平均分數的結果。
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 0,
"hits": []
},
"aggregations": {
"avg_marks": {
"value": 51.5
}
}
}
我只需要給定文檔的平均數學科目,預期結果是56.00
有關查詢或想法的任何幫助都將有所幫助。 提前致謝。
首先,您需要在映射中指定索引具有嵌套字段,如下所示:
PUT /nested-index {
"mappings": {
"document": {
"properties": {
"project": {
"type": "nested",
"properties": {
"subject": {
"type": "keyword"
},
"marks": {
"type": "long"
}
}
}
}
}
}
}
然后插入您的文檔:
PUT nested-index/document/1
{
"project": [
{
"subject": "maths",
"marks": 47
},
{
"subject": "computers",
"marks": 22
}
]
}
然后插入第二個文檔:
PUT nested-index/document/2
{
"project": [
{
"subject": "maths",
"marks": 65
},
{
"subject": "networks",
"marks": 72
}
]
}
然后進行聚合,但指定具有以下嵌套結構:
GET nested-index/_search
{
"size": 0,
"aggs": {
"subjects": {
"nested": {
"path": "project"
},
"aggs": {
"subjects": {
"terms": {
"field": "project.subject",
"size": 10
},
"aggs": {
"average": {
"avg": {
"field": "project.marks"
}
}
}
}
}
}
}
}
以及查詢為什么不起作用以及給出該結果的原因是,當您嵌套字段並進行平均時,如果一個數組中的某個關鍵字並不重要,而您只想按一個主題進行聚合,則對一個數組中的所有數字求和。
因此,如果您擁有這兩個文檔,因為在這兩個文檔中您都有數學主題,則avg的計算方式如下:
(47 + 22 + 65 + 72)/ 4 = 51.5
如果您想為網絡平均使用agg,它將返回您(因為在一個文檔中您具有網絡,但是它將對數組中的所有值進行平均):
65 + 72 = 68.5
因此在這種情況下,您需要使用嵌套結構。
如果您只對一個主題感興趣,那么可以僅對等於這樣的主題(主題等於“數學”)進行聚合:
GET nested-index/_search
{
"size": 0,
"aggs": {
"project": {
"nested": {
"path": "project"
},
"aggs": {
"subjects": {
"filter": {
"term": {
"project.subject": "maths"
}
},
"aggs": {
"average": {
"avg": {
"field": "project.marks"
}
}
}
}
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.