Nest ElasticSearch: логический поиск с использованием вложенных запросов и вложенных объектов

Я использую Nest Elastic и строю запрос для логического поиска с помощью плагина Head, я объединяю несколько запросов

Примечания о структуре БД и упругом отображении

  1. Каждый документ в базе данных связан с определенным profileId, который в свою очередь имеет несколько атрибутов
  2. Каждый документ имеет несколько значений атрибутов, связанных с ним

В этом запросе я пытаюсь получить все документы, которые имеют определенный профиль и значение атрибута> 30, имея в виду, что этот атрибут должен иметь только атрибут Id 2.

SQL-запрос:

Выберите значение av.*, D.name из документа.D Значение атрибута внутреннего соединения av на d.DocumentId = av.DocumentId, где d.profileid = 1 и av.AttributeId = 2 и av.Intvalue >30

Эластичный запрос

   { "query": {
    "bool": {
    "must": [
    {
       "term": { "Document.profileid": "1"  }
    }
    ,
    {
      "term": {"Document.lstChildren.AttributeID": "2" }
    }
    ,
    { 
      "range": { "Document.lstChildren.IntValue": { "gt": "30"} }
    }
    ,
    {
    "match_all": { }
    }
    ],
    "must_not": [ ],
    "should": [ ]
    }
    },   "from": 0, "size": 10, "sort": [ ], "facets": { }
    }

проблема

Результат также содержит документ, который имеет следующие значения атрибута

  1. Значение атрибута = 3 и attributeId = 2 (значение < 30)
  2. Значение атрибута = 34, но с attributeId, отличным от 2 (неверно)

Этот документ не должен быть включен, поскольку он не удовлетворяет моим потребностям.

Как я могу построить этот запрос?

1 ответ

Решение

Решение состоит в том, чтобы сначала изменить отображение, сделав lstChildren вложенным объектом. Тогда использование вложенного запроса обеспечит выполнение всех условий, как указано. Вложенный запрос ниже указывает два условия, которые возвращают только ожидаемые результаты, но я использовал "Равно" вместо "больше чем" для "IntValue", чтобы упростить его:

{
  "query": {
    "nested": {
      "path": "lstChildren",
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "lstChildren.AttributeID":"2"
              }
            },
            {
              "match": {
                "lstChildren.IntValue": "31"
              }
            }
          ]
        }
      }
    }
  }
}
Другие вопросы по тегам