вложенный поиск эластичности с родительским полем доступа для субагрегации - PullRequest
0 голосов
/ 15 сентября 2018

У меня есть следующие сопоставления

PUT prod_nested
{
  "mappings": {
    "default": {
      "properties": {
        "pkey": {
          "type": "keyword"
        },
        "original_price": {
          "type": "float"
        },
        "tags": {
          "type": "nested",
          "properties": {
            "category": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 30
                }
              }
            },
            "attribute": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 30
                }
              }
            },
            "original_price": {
              "type": "float"
            }
          }
        }
      }
    }
  } 
}

Я пытаюсь сделать что-то вроде следующего агрегирования SQL

select tag_attribute,
       tag_category,
       avg(original_price)
FROM products
GROUP BY tag_category, tag_attribute

Я могу выполнить группирование по частям, используя вложенную агрегацию по тегам, но не могу получить доступ к original_price при субагрегации. Одним из вариантов может быть дублирование original_price внутри вложенного документа тегов, но у меня есть миллионы записей для обработки. Моя текущая агрегация

GET prod_nested/_search?size=0
{
    "aggs": {
        "tags": {
          "nested": {
            "path": "tags"
          },
          "aggs": {
            "categories": {
              "terms": {
                "field": "tags.category.keyword",
                "size": 30
              },
              "aggs": {
                "attributes": {
                  "terms": {
                    "field": "tags.attribute.keyword",
                    "size": 30
                  },
                  "aggs": {
                    "price": {
                      "avg": {
                        "field": "original_price"
                      }
                    }
                  }
                }

              }
            }
          }
        }
      }
}

Спасибо, заранее.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Мне удалось получить желаемые результаты с помощью агрегации reverse_nested.

GET prod_nested/_search?size=0
{
  "aggs": {
    "tags": {
      "nested": {
        "path": "tags"
      },
      "aggs": {
        "categories": {
          "terms": {
            "field": "tags.category.keyword",
            "size": 10
          },
          "aggs": {
            "attributes": {
              "terms": {
                "field": "tags.attribute.keyword",
                "size": 10
              },
              "aggs": {
                "parent_doc_price": {
                  "reverse_nested": {},
                  "aggs": {
                    "avg_price": {
                      "avg": {
                        "field": "original_price"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
0 голосов
/ 15 сентября 2018

я думаю, что вы хотите, это невозможно. а как насчет изменения вашего отображения?

{
  "mappings": {
    "default": {
      "properties": {
        "pkey": {
          "type": "keyword"
        },
        "original_price": {
          "type": "float"
        },
        "tags": {
          "type": "nested",
          "properties": {
            "category_attribute": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 30
                }
              }
            },
            "category": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 30
                }
              }
            },
            "attribute": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 30
                }
              }
            },
            "original_price": {
              "type": "float"
            }
          }
        }
      }
    }
  }
}

вы можете использовать category_attribute. и ваша агрегация будет ниже.

GET prod_nested/_search?size=0
{
  "aggs": {
    "tags": {
      "nested": {
        "path": "tags"
      },
      "aggs": {
        "category_attribute": {
          "terms": {
            "field": "tags.category_attribute.keyword",
            "size": 30
          },
          "aggs": {
            "price": {
              "avg": {
                "field": "original_price"
              }
            }
          }
        }
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...