Запрос Elasticsearch DSL как для вложенного, так и для обычного поля - PullRequest
0 голосов
/ 20 июня 2020

Мне нужна помощь в написании запроса для фильтрации документа со структурой ниже

{
"enviID" : 123,
"empID" : 456,
"projects" : [{"id": 123, "name":"abc"},{"id": 456, "name":"xyz"}],
tests : [{"id": 999, "name":"xxx"},{"id": 000, "name":"yyy"}]
}

Я хочу отфильтровать

envId, empId, project.Id, tests.id

также я проверяю документ сопоставления, в котором поле тестов не сопоставлено, но в документах есть это поле

1 Ответ

0 голосов
/ 20 июня 2020

Я хочу отфильтровать envId, empId, project.Id, tests.id

Поскольку вы не указали какой-либо конкретный фильтр, который хотите применить к поля поисковый запрос, показанный ниже, фильтрует документы на основе их Id

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

{
  "mappings": {
    "properties": {
      "enviID": {
        "type": "integer"
      },
      "empID": {
        "type": "integer"
      },
      "projects": {
        "type": "nested",
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "text"
          }
        }
      },
      "tests": {
        "type": "nested",
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "text"
          }
        }
      }
    }
  }
}

поискового запроса

{
  "query": {
    "bool": {
      "filter": [
        {
          "bool": {
            "must": [
              {
                "term": {
                  "enviID": {
                    "value": "123"
                  }
                }
              },
              {
                "term": {
                  "empID": {
                    "value": "456"
                  }
                }
              },
              {
                "nested": {
                  "path": "projects",
                  "query": {
                    "bool": {
                      "must": [
                        {
                          "match": {
                            "projects.id": 123
                          }
                        }
                      ]
                    }
                  }
                }
              },
              {
                "nested": {
                  "path": "tests",
                  "query": {
                    "bool": {
                      "must": [
                        {
                          "match": {
                            "tests.id": 999
                          }
                        }
                      ]
                    }
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

Результат поиска

"hits": [
            {
                "_index": "my_index",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.0,
                "_source": {
                    "enviID": 123,
                    "empID": 456,
                    "projects": [
                        {
                            "id": 123,
                            "name": "abc"
                        },
                        {
                            "id": 456,
                            "name": "xyz"
                        }
                    ],
                    "tests": [
                        {
                            "id": 999,
                            "name": "xxx"
                        },
                        {
                            "id": 0,
                            "name": "yyy"
                        }
                    ]
                }
            }
        ]

Вы можете обратиться к этому, чтобы узнать больше о контексте фильтра-запроса и Вложенных запросов фильтр

...