Elasticsearch: найдите всех родителей, у которых у всех детей есть свойство с определенной ценностью - PullRequest
0 голосов
/ 18 октября 2018

У меня есть текущая схема:

  • Объект parent со свойством date и n дочерних элементов child
  • Объект child содержит одно свойство foo

Я хочу получить все parent, где все child имеют свое свойство foo равно 0

Я пробовал другой подход, ночто бы я ни делал, некоторые parent извлекаются, а один child имеет свойство foo в 1

Пример моего запроса:

{
    "query": {
        "bool": {
            "must": [
                {
                    "range": {
                        "date": {
                            "lt": "2018-07-05T10:00:00.000Z"
                        }
                    }               
                },
                {
                    "nested": {
                        "path": "child",
                        "query": {
                            "bool": {
                                "must": {
                                    "term": {
                                        "child.foo": 0
                                    }       
                                }
                            }
                        }
                    }
                }
            ]
        }
    }
}

Я пытался с should, match, range ... даже must_not / should_not.Я также безуспешно пытался фильтровать, я получаю хиты со свойством foo на 1.

Я также попробовал путь агрегации, но я не понимаю, как применить его к моим потребностям.

РЕДАКТИРОВАТЬ: Я посмотрел на возможный дубликат.Хотя он не ответил на мой вопрос, он поставил меня на правильный путь.Моя проблема заключалась в том, что я думал по-SQL, с соединениями и тому подобным.Хотя я должен был думать упругим образом.

Таким образом, то, что я хотел сделать, не могло быть сделано.Мне нужно было искать parent, где хотя бы у одного child было свойство foo, равное 1 или более.Затем проигнорируйте эти результаты и возьмите другие.Таким образом, ответ прост: я просто добавляю, чтобы изменить must вложенного запроса на must_not, и все!

1 Ответ

0 голосов
/ 26 октября 2018

Как я объяснил при редактировании моего вопроса, ответ довольно прост, если вы начинаете думать правильно ./

{
    "query": {
        "bool": {
            "must": [
                {
                    "range": {
                        "date": {
                            "lt": "2018-07-05T10:00:00.000Z"
                        }
                    }               
                },
                {
                    "nested": {
                        "path": "child",
                        "query": {
                            "bool": {
                                "must_not": {
                                    "term": {
                                        "child.foo": 0
                                    }       
                                }
                            }
                        }
                    }
                }
            ]
        }
    }
}

Хитрость заключалась в том, чтобы просто установить must_not

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