Как объединить свойства нескольких вложенных объектов уровня одного уровня в агрегированные термины, Elasticsearch - PullRequest
0 голосов
/ 16 октября 2019

У нас есть сценарий использования с Elasticsearch, для структуры индекса у нас есть несколько вложенных объектов на уровне одного уровня, а для нашего варианта использования: нам нужно объединить более одного свойства вложенных объектов в агрегировании терминов, скажем,Свойство 1 вложенного объекта + свойство 2 другого вложенного объекта в виде единственного ключевого элемента,

Например, структура документа:

{
 "OuterProperty1":"value",
 "NestedObject1" : {
              "Property1" : value 1,
              "Property2" : value 2
            },
 "NestedObject2" : {
              "Property1" : value 1,
              "Property2" : value 2
            }
}

и для агрегирования терминов с вложенными объектами. , мы хотим использовать следующий скрипт,

  "script":{
          "source":"""
           String aggKey= (doc['NestedObject1.Property1'].value.toString())+'_'+(doc['NestedObject2.Property2'].value.toString());
             return aggKey;
          """
        ,
          "lang":"painless"
        },
        "size":10000

и для доступа к свойствам различных вложенных объектов для комбинированного ключа, мне нужно предоставить связанные "пути" вложенных объектов, поэтому мой вопрос, есть лиспособ предоставления нескольких путей или с использованием какого-либо подстановочного знака для указания пути для нескольких вложенных объектов в нескольких вложенных объектах в агрегации и для достижения комбинированного результата запроса?

Что я хочу использовать, так это в терминах агрегации,термины ключи должны быть как комбинация «NestedObject1.Property1 + NestedObject2.Property1», чтоМы хотим достичь чего-то вроде:

    "buckets" : [
          {
            "key" : "NestedObject1.Property1_NestedObject2.Property1",
            "doc_count" : 14
          },
          {
            "key" : "NestedObject1.Property1_NestedObject2.Property2",
            "doc_count" : 4
          }...  
        ]

Мы пробовали выполнить следующие запросы: Запрос 1:

{
    "query":{
    "bool":{
     "some filter..."
  }},
     "aggs":{
    "TopLevelAggs":{
      "nested":{
          "path":"NestedObject1"
        },
      "aggs":{
    "TestTopHitsAggs":{
              "nested": {
                "path": "NestedObject2"
              },
              "aggs":{
            "TopHitsAggs":{
      "terms": {
         "script":{
          "source":"""
           String TestLinkIdD= (doc['NestedObject1.Property1'].value.toString())+'_'+(doc['NestedObject2.Property2'].value.toString());
             return TestLinkIdD;
          """
        ,
          "lang":"painless"
        },
        "size":10000
      }
    }
          }
}
}
}
}
}

- Вышеупомянутый запрос, кажется, не обеспечиваетлюбые результаты. - вывод, который мы получаем:

"aggregations" : {
    "ReportedProblemsTopLevelAggs" : {
      "doc_count" : 0,
      "TestTopHitsAggs" : {
        "doc_count" : 0,
        "TopHitsAggs" : {
          "doc_count_error_upper_bound" : 0,
          "sum_other_doc_count" : 0,
          "buckets" : [ ]
        }
      }
    }
  }

Способ 2: Мы также пытались получить доступ к NestedObject2 с помощью «агрегации с обратным переносом», но не работали с вариантом использования. Любая помощь будет оценена!

...