Какой должен быть путь сегмента для агрегирования вложенных терминов? - PullRequest
0 голосов
/ 14 марта 2020

Я хочу выполнить агрегацию конвейера на моей агрегации эластичного поиска. Вот мое тело запроса

{
  "aggs": {
    "user_info": {
      "terms": {
        "field": "user_id"
      },
      "aggs": {
        "product_info": {
          "terms": {
            "field": "product_id"
          },
          "aggs": {
            "total_item_price": {
              "sum": {
                "field": "selling_price"
              }
            }
          }
        }
      }
    },
    "price_percentile": {
      "percentiles_bucket": {
        "buckets_path": "user_info.product_info.total_item_price"
      }
    }
  }
}

Это дает мне ошибку, что No aggregation found for path [user_info.product_info.total_item_price] Каким должен быть путь для сегмента, если существует такая вложенная агрегация? Или невозможно найти процентили для такого расположения ковшей в эластичном поиске.

PS Я использую эластичный поиск 6,5

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

@ jzzfs ответ также несколько прав. Я подошел к этому по-другому. Я поменял свои агрегации, и это выполнило мой вариант использования. Но в целом, вы не можете делать вложенные процентили ведра пока.

{
  "aggs": {
    "product_info": {
      "terms": {
        "field": "product_id"
      },
      "aggs": {
        "user_info": {
          "terms": {
            "field": "user_id"
          },
          "aggs": {
            "total_item_price": {
              "sum": {
                "field": "selling_price"
              }
            }
          }
        },
        "pb": {
          "percentiles_bucket": {
            "buckets_path": "user_info>total_item_price"
          }
        }
      }
    }
  }
}
0 голосов
/ 14 марта 2020

Во-первых, не используйте точки в пути - вместо этого используйте >:

GET stack/_search
{
  "aggs": {
    "user_info": {
      "terms": {
        "field": "user_id"
      },
      "aggs": {
        "product_info": {
          "terms": {
            "field": "product_id"
          },
          "aggs": {
            "total_item_price": {
              "sum": {
                "field": "selling_price"
              }
            }
          }
        }
      }
    },
    "pb": {
      "percentiles_bucket": {
        "buckets_path": "user_info>product_info>total_item_price"
      }
    }
  }
}

, что дает "buckets_path must reference either a number value or a single value numeric metric aggregation, got: [Object[]] at aggregation [product_info]", так что это не сработает.


Вот наши варианты:

  1. Агрегировать по всему миру, но только под информацией о продукте (без пользователей):
GET stack/_search
{
  "aggs": {
    "product_info": {
      "terms": {
        "field": "product_id"
      },
      "aggs": {
        "total_item_price": {
          "sum": {
            "field": "selling_price"
          }
        }
      }
    },
    "pb": {
      "percentiles_bucket": {
        "buckets_path": "product_info>total_item_price"
      }
    }
  }
}
Используйте отфильтрованные агрегации, чтобы имитировать c исходное намерение:
GET stack/_search
{
  "aggs": {
    "user_123": {                        <-- keeping the agg name consistent w/ the filter
      "filter": {
        "term": {
          "user_id": 123                 <-- actual filter
        }
      },
      "aggs": {
        "product_info": {
          "terms": {
            "field": "product_id"
          },
          "aggs": {
            "total_item_price": {
              "sum": {
                "field": "selling_price"
              }
            }
          }
        },
        "pb": {
          "percentiles_bucket": {
            "buckets_path": "product_info>total_item_price"
          }
        }
      }
    }
  }
}

После этого вы можете иметь столько user_xyz субагрегаций, сколько захотите - при условии, что вы заранее соберете их идентификаторы. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...