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

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

Примечания о структуре БД и эластичном сопоставлении

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

В этом запросе я пытаюсь получить все документы с определенным профилем и значением атрибута> 30, имея в виду, что этот атрибут должен иметь только идентификатор атрибута 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 (неверно)

Этот документ нельзя включать, так как он мне не подходит.

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


person Hussein Salman    schedule 21.12.2015    source источник
comment
Не могли бы вы поделиться образцом документа и индексным картированием?   -  person Rob    schedule 21.12.2015
comment
Можете ли вы попробовать удалить "match_all": {} запрос из вашего must списка? Это совершенно не нужно, и я не удивлюсь, если из-за этого выскочит какая-нибудь ошибка.   -  person Sam    schedule 22.12.2015
comment
@Sam match_all": {} не решил проблему   -  person Hussein Salman    schedule 22.12.2015
comment
@Rob Я разместил сопоставление документа и индекса по этой ссылке [jsfiddle.net/hsalman/rknhsc58/# ] Отображение индекса в окне CSS и отображение документа в разделе JS   -  person Hussein Salman    schedule 22.12.2015
comment
Проблема в запросе DSL: он проверяет документы, которые должны иметь attributeId и IntValue в любом из его дочерних массивов. Но мы должны построить запрос так, чтобы он удовлетворял обоим условиям хотя бы для одного своего массива lstChildren.   -  person Hussein Salman    schedule 22.12.2015
comment
Решение состоит в том, чтобы сначала изменить отображение, сделав lstChildren вложенным объектом. Затем использование вложенного запроса обеспечит выполнение всех указанных условий.   -  person Hussein Salman    schedule 24.12.2015


Ответы (1)


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

{
  "query": {
    "nested": {
      "path": "lstChildren",
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "lstChildren.AttributeID":"2"
              }
            },
            {
              "match": {
                "lstChildren.IntValue": "31"
              }
            }
          ]
        }
      }
    }
  }
}
person Hussein Salman    schedule 24.12.2015