Вложенный фильтр в запросе агрегации Elasticsearch - PullRequest
0 голосов
/ 08 января 2020

Я выполняю следующий запрос агрегации с вложенным фильтром

GET <indexname>/_search
{
  "aggs": {
    "NAME": {
      "nested": {
        "path": "crm.LeadStatusHistory"
      },
      "aggs": {
        "agg_filter": {
          "filter": {
            "bool": {
              "must": [
                {
                  "nested": {
                    "path": "crm",
                    "query": {
                      "terms": {
                        "crm.City.keyword": [
                          "Rewa"
                        ]
                      }
                    }
                  }
                },
                {
                  "nested": {
                    "path": "crm",
                    "query": {
                      "terms": {
                        "crm.LeadID": [
                          27961
                        ]
                      }
                    }
                  }
                }
              ]
            }
          },
          "aggs": {
            "agg_terms":{
              "terms": {
                "field": "crm.LeadStatusHistory.StatusID",
                "size": 1000
              }
            }
          }
        }
      }
    }
  }
}

-----> у меня есть следующий документ

{
        "_index" : "crm",
        "_type" : "_doc",
        "_id" : "4478",
        "_score" : 1.0,
        "_source" : {
          "crm" : [
            {
              "LeadStatusHistory" : [
                {
                  "StatusID" : 3
                },
                {
                  "StatusID" : 2
                },
                {
                  "StatusID" : 1
                }
              ],
              "LeadID" : 27961,
              "City" : "Rewa"
            },
            {
              "LeadStatusHistory" : [
                {
                  "StatusID" : 1
                },
                {
                  "StatusID" : 3
                },
                {
                  "StatusID" : 2
                }
              ],
              "LeadID" : 27959,
              "City" : "Rewa"
            }
          ]
        }
      }]

Однако в ответ я получаю следующий результат

"aggregations" : {
    "NAME" : {
      "doc_count" : 4332,
      "agg_filter" : {
        "doc_count" : 1,
        "agg_terms" : {
          "doc_count_error_upper_bound" : 0,
          "sum_other_doc_count" : 0,
          "buckets" : [
            {
              "key" : 1,
              "doc_count" : 1
            }
          ]
        }
      }
    }
  }

Запрос ===> В соответствии с исходным документом у меня есть 3 вложенных документа 'crm.LeadStatusHistory' для crm.LeadID = 27961. Однако результаты для agg_filter равны 1 вместо 3. Не могли бы вы дайте мне знать причину этого дела.

Ответы [ 2 ]

0 голосов
/ 10 января 2020

Я не согласен с ответом, что в 'crm.LeadStatusHistory' есть одна операция c. Я запустил агрегационный запрос на crm.LeadstatusHistory без фильтров.

GET crm/_search
{
  "_source": ["crm.LeadID","crm.LeadStatusHistory.StatusID","crm.City"], 
  "size": 10000,
  "query": {
    "nested": {
      "path": "crm",
      "query": {
        "match": {
          "crm.LeadID": "27961"
        }
      }
    }
  }, 
  "aggs": {
    "agg_statuscount": {
      "nested": {
        "path": "crm.LeadStatusHistory"
      },
          "aggs": {
            "agg_terms":{
              "terms": {
                "field": "crm.LeadStatusHistory.StatusID",
                "size": 1000
              }
            }
          }
        }
      }
    }

Я получаю следующий ответ от вышеупомянутого запроса, который показывает 'agg_statuscount' в виде 6 документов без фильтров

{
  "took" : 6,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "crm",
        "_type" : "_doc",
        "_id" : "4478",
        "_score" : 1.0,
        "_source" : {
          "crm" : [
            {
              "LeadStatusHistory" : [
                {
                  "StatusID" : 3
                },
                {
                  "StatusID" : 2
                },
                {
                  "StatusID" : 1
                }
              ],
              "LeadID" : 27961,
              "City" : "Rewa"
            },
            {
              "LeadStatusHistory" : [
                {
                  "StatusID" : 1
                },
                {
                  "StatusID" : 3
                },
                {
                  "StatusID" : 2
                }
              ],
              "LeadID" : 27959,
              "City" : "Rewa"
            }
          ]
        }
      }
    ]
  },
  "aggregations" : {
    "agg_statuscount" : {
      "doc_count" : 6,
      "agg_terms" : {
        "doc_count_error_upper_bound" : 0,
        "sum_other_doc_count" : 0,
        "buckets" : [
          {
            "key" : 1,
            "doc_count" : 2
          },
          {
            "key" : 2,
            "doc_count" : 2
          },
          {
            "key" : 3,
            "doc_count" : 2
          }
        ]
      }
    }
  }
}

Следовательно с crm.LeadID = 27961 в фильтре агрегации, я ожидал 3 ' crm.LeadStatusHistory 'документы. В настоящее время ответ 1, как в моем первоначальном вопросе.

0 голосов
/ 09 января 2020

Ваш agg_filter находится на crm. Постройте запрос, который покажет это, и я буду отвечать на вашу проблему. Вы увидите разные doc_count для каждой агрегации.

{
  "size": 0,
  "aggs": {
    "NAME": {
      "nested": {
        "path": "crm"
      },
      "aggs": {
        "agg_LeadID": {
          "terms": {
            "field": "crm.LeadID"
          },
          "aggs": {
            "agg_LeadStatusHistory": {
              "nested": {
                "path": "crm.LeadStatusHistory"
              },
              "aggs": {
                "home_type_name": {
                  "terms": {
                    "field": "crm.LeadStatusHistory.StatusID"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

с этим вы можете их посчитать, с помощью скрипта (и при необходимости отфильтровать):

{
  "size": 0,
  "aggs": {
    "NAME": {
      "nested": {
        "path": "crm"
      },
      "aggs": {
        "agg_LeadID": {
          "terms": {
            "field": "crm.LeadID"
          },
          "aggs": {
            "agg_LeadStatusHistory": {
              "nested": {
                "path": "crm.LeadStatusHistory"
              },
              "aggs": {
                "agg_LeadStatusHistory_sum": {
                  "sum": {
                    "script": "doc['crm.LeadStatusHistory.StatusID'].values.length"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

примечание: если хотите узнать количество вложенных документов, посмотрите на inner_hits: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-body.html#request -body-search-inner-hit

...