Эластичный поисковый запрос для массива в индексе - PullRequest
0 голосов
/ 15 марта 2019

у меня есть индекс (схема по умолчанию), который содержит поле «персонал», и это поле является массивом.

в индексе два объекта:

{"took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 0.8630463,
    "hits": [
      {
        "_index": "warehouse",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.8630463,
        "_source": {
          "order": 2,
          "status": "done",
          "personnel": [
            {
              "name": "mike",
              "function": "packer"
            },
            {
              "name": "henry",
              "function": "checker"
            } ] }
      },
      {
        "_index": "warehouse",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.8630463,
        "_source": {
          "order": 1,
          "status": "done",
          "personnel": [
            {
              "name": "jon",
              "function": "packer"
            },
            {
              "name": "mike",
              "function": "checker"
            }
 ] } } ] } }

и я хочу запросить его, чтобы получить заказ , где статус сделан, и человек, который упаковал этот заказ, - Майк.

У меня много запросов, но я всегда получаю два ордера, потому что майк существует в обоих ордерах (с разными функциями)

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

{"query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "status": "done"
                    }
                },
                {
                    "bool": {
                        "must": [
                            {
                                "term": {
                                    "personnel.name": "mike"
                                }
                            },
                            {
                                "term": {
                                    "personnel.function": "packer"
                                }
            } ] } } ] } } }

мой вопрос в том, как подготовить запрос, чтобы вернуть мне только один заказ, где Майк упаковщик

1 Ответ

0 голосов
/ 15 марта 2019

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

{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "status": "done"
                    }
                },
                {
                    "nested": {
                        "path": "personnel",
                        "query": {
                            "bool": {
                                "must": [
                                    {
                                        "term": {
                                            "personnel.name": "mike"
                                        }
                                    },
                                    {
                                        "term": {
                                            "personnel.function": "packer"
                                        }
                                    }
                                ]
                            }
                        }
                    }
                }
            ]
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...