Как использовать агрегацию на вложенном объекте в Elastic Search? - PullRequest
0 голосов
/ 09 ноября 2018

Я новичок в упругом поиске и пытаюсь формировать запросы. Я столкнулся с некоторой проблемой при извлечении информации из эластичного хранилища. Ниже я пытаюсь сделать групповой в эластичный поисковый запрос ..

Допустим, у меня есть следующие данные:

[{

    "a" : {
        "b" : "xxx",
        "c" : "yyy"
    },
    "l" : {
        "m" : "zzz",
        "n" : "sss"
    }
},
{

    "a" : {
        "b" : "xxx",
        "c" : "qqq"
    },
    "l" : {
        "m" : "ttt",
        "n" : "jjj"
    }
}
]

Я хотел бы отобразить все строки, которые имеют значение «xxx» для ключа «b» в объекте «a».

В приведенном выше у меня есть две строки, которые соответствуют моим потребностям. Поэтому я хотел бы отобразить два выше. Это означает, что это «группа по a.b»

Как мне добиться этого гибкого поискового запроса? Поскольку ключ, который я ищу для группировки - это вложенный ключ, у меня возникают проблемы при формировании запроса.

Любые предложения будут оценены.

РЕДАКТИРОВАТЬ 1:

То, что я ищу, это не просто, если ключ «a.b» имеет значение «xxx». Я хочу сделать группу по. Поэтому, если есть две записи в «a.b» со значением «xxx» и еще две записи в «a.b» со значением «kkk», я бы хотел видеть их как две группы.

Как и в этом случае, результатом должны быть два объекта json, каждый из которых содержит результаты своей конкретной группы.

что-то вроде ниже:

{
{
    {    
        "a" : {
            "b" : "xxx",
            "c" : "yyy"
        },
        "l" : {
            "m" : "zzz",
            "n" : "sss"
        }
    },
    {
        "a" : {
            "b" : "xxx",
            "c" : "qqq"
        },
        "l" : {
            "m" : "ttt",
            "n" : "jjj"
        }
    }
},
{
    {    
        "a" : {
            "b" : "kkk",
            "c" : "..."
        },
        "l" : {
            "m" : "___",
            "n" : "---"
        }
    },
    {
        "a" : {
            "b" : "kkk",
            "c" : "..."
        },
        "l" : {
            "m" : "___",
            "n" : "---"
        }
    }
}
}

1 Ответ

0 голосов
/ 09 ноября 2018

Вот что я сделал.

Моя цепочка агрегации имеет следующий порядок

Вложенные -> Термины Агрегация -> Обратные Вложенные -> Лучшие хиты

Стрелки являются индикатором субагрегаций.

POST <your_index_name>/_search
{  
   "size":0,
   "query":{  
      "match_all":{  

      }
   },
   "aggs":{  
      "nesting":{  
         "nested":{  
            "path":"a"
         },
         "aggs":{  
            "grouping_by":{  
               "terms":{  
                  "field":"a.b"
               },
               "aggs":{  
                  "parent_docs":{  
                     "reverse_nested":{  

                     },
                     "aggs":{  
                        "mydocs":{  
                           "top_hits":{  
                              "size":10
                           }
                        }
                     }
                  }
               }
            }
         }
      }
   }
}

Это позволит вам выполнить groupby так, как вы ожидаете. Также обратите внимание, что я предполагаю, что поле b имеет ключевое слово типа.

Также обратите внимание, Top Hits показывает только первые 10 документов, вы можете увеличить их, если хотите просмотреть все документы.

Дайте мне знать, если это поможет!

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