Поиск вложенного объекта в запросе ElasticSearch - PullRequest
0 голосов
/ 07 января 2019

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

У меня есть древовидная структура:

{

    "id": 4,
    "sora": [
        {
            "pContext": {
                "context": {
                    "sT": "D3",
                    "uT": "ST"
                },
                "entities": [
                    {
                        "name": "premium",
                        "bName": "premium",
                        "fT": "site",
                        "eT": "F_P",
                        "children": [
                            {
                                "name": "capa",
                                "bName": "capa",
                                "fT": "site",
                                "eT": "FFT",
                                "children": []
                            },
                            {
                                "name": "code",
                                "bName": "Codes",
                                "fT": "site",
                                "eT": "FFT",
                                "children": []
                            },
                            {
                                "name": "selection A",
                                "fT": "site",
                                "eT": "SELECTION_A",
                                "children": [
                                    {
                                        "name": "A1",
                                        "fT": "site",
                                        "eT": "ADD",
                                        "children": []
                                    },
                                    {
                                        "name": "A2",
                                        "fT": "site",
                                        "eT": "ADD",
                                        "children": []
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }
        },
        {
            "pContext": {
                "context": {
                    "sT": "D2",
                    "uT": "ST"
                },
                "entities": [
                    {
                        "name": "112",
                        "bName": "112",
                        "eT": "D_TYPE",
                        "children": []
                    }
                ]
            }
        }
    ]
}

Моя структура может иметь больше уровней.

У меня много документов, как описано выше. Чтобы отфильтровать мой документ, я могу использовать синтаксис простого запроса:

{
    "_source": {
        "excludes": [
            "*.context"
        ]
    },
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "sora.pContext.context.sT": "D3"
                    },
                    "match": {
                        "sora.pContext.entities.name": "premium"
                    },
                    "match": {
                        "sora.pContext.entities.fT": "site"
                    }
                }
            ]
        }
    }
}
  • Я хотел бы знать, как я могу получить вложенный объект, который соответствует моему запросу и их детям. Мне нужен объект, который соответствует Обязательный фильтр. Это возможно?
  • Как я могу найти поле без указания пути?

Спасибо

# РЕДАКТИРОВАТЬ

Мое сопоставление:

{
    "mappings": {
        "abc": {
            "properties": {
                "id": {
                    "type": "integer"
                },
                "sora": {
                    "type": "nested",
                    "properties": {
                        "pContext": {
                            "type": "nested",
                            "properties": {
                                "context": {
                                    "type": "nested",
                                    "properties": {
                                        "sT": {
                                            "type": "text"
                                        },
                                        "uT": {
                                            "type": "text"
                                        }
                                    }
                                },
                                "entities": {
                                    "type": "nested",
                                    "properties": {
                                        "name": {
                                            "type": "text"
                                        },
                                        "bName": {
                                            "type": "text"
                                        },
                                        "fT": {
                                            "type": "text"
                                        },
                                        "eT": {
                                            "type": "text"
                                        },
                                        "children": {
                                            "type": "object"                                    
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Ну, если кто-то еще сталкивается с той же проблемой, мое решение было добавлено все потомки в том же пути / уровне, что и родительский, но сохранить сопоставление с родителем и их потомками. Благодаря этому я могу искать и извлекать части родительского элемента по своему усмотрению.

0 голосов
/ 08 января 2019

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

Ваш запрос будет выглядеть следующим образом:

{
  "_source": {
    "excludes": [
      "*.context"
    ]
  },
  "query": {
    "bool": {
      "filter": [
        {
          "nested": {
            "inner_hits": {},
            "path": "sora.pContext",
            "query": {
              "bool": {
                "must": [
                  {
                    "nested": {
                      "path": "sora.pContext.context",
                      "query": {
                        "bool": {
                          "must": [
                            {
                              "match": {
                                "sora.pContext.context.sT": "D3"
                              }
                            }
                          ]
                        }
                      }
                    }
                  },
                  {
                    "nested": {
                      "path": "sora.pContext.entities",
                      "query": {
                        "bool": {
                          "must": [
                            {
                              "match": {
                                "sora.pContext.entities.name": "premium"
                              }
                            },
                            {
                              "match": {
                                "sora.pContext.entities.fT": "site"
                              }
                            }
                          ]
                        }
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

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

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