И запрос вложенных объектов - PullRequest
1 голос
/ 10 июля 2019

Полный отказ от ответственности: тут эластичный поиск noob.

Я использую вложенное поле value_per_id для массива объектов.Каждый объект имеет свойства: value и id.Например,

"value_per_id": [
  {
    "id": 2,
    "value": "positive"
  },
  {
    "id": 23,
    "value": "positive"
  },
  {
    "id": 65,
    "value": "neutral"
  }
]

У меня есть запрос, который выглядит так (отредактировано для ясности):

{
  "query" : {
    "bool" : {
      "filter" : [
        {
          "bool" : {
            "must" : {
              "nested" : {
                "path" : "value_per_id",
                "query" : [
                  {"terms" : {"value_per_id.value" : <MY_VALUES>}},
                  {"terms" : {"value_per_id.id" : <MY_IDS>}},
                ]
              }
            }
          }
        }
      ]
    }
  }
}

С помощью этого запроса я получаю все элементы, которые имеют объект со значением в MY_VALUESИЛИ идентификатор в MY_IDS.

Я хочу, чтобы все элементы, которые имеют значение в MY_VALUES для любого идентификатора в MY_IDS.

(Например, если MY_VAULES = ['positive', 'neutral'] и MY_IDS = [1, 2], я хочу те, которые имеютобъект с 1 - положительным, 1 - отрицательным, 2 - положительным или 2 - отрицательным).

Какой синтаксис для этого?

РЕДАКТИРОВАТЬ - Неверный формат

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Вам нужно использовать bool во вложенном запросе так:

{
    "query": {
        "bool": {
            "filter": [{
                "nested": {
                    "path": "value_per_id",
                    "query": {
                        "bool": {
                            "must": [
                                {"term": {"value_per_id.value": 1}},
                                {"term": {"value_per_id.id": 2}}
                            ]
                        }
                    }
                }
            }]
        }
    }
}
1 голос
/ 10 июля 2019

Используйте must или filter в запросе bool.

Если вы используете must, подзапросы будут влиять на счет, если вы используете filter, они не будут. Также, если вы используете filterasticsearch сможет кешировать результаты.

{
    "bool": {
        "must": [
            {
                "nested": {
                    "path": "value_per_id",
                    "query": {
                        "terms": {
                            "value_per_id.value": <MY_VALUES>
                        }
                    }
                }
            },
            {
                "nested": {
                    "path": "value_per_id",
                    "query": {
                        "terms": {
                            "value_per_id.id": <MY_IDS>
                        }
                    }
                }
            }
        ]
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...