簡體   English   中英

彈性搜索:僅聚合特定的嵌套文檔

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM