2015-12-21 3 views
0

Я использую Nest Упругие и построение запроса для логического поиска с помощью Head плагин, я комбинируя несколько запросовNest ElasticSearch: Boolean Поиск с помощью вложенных запросов и вложенных объектов

Заметки о DB структуры и упругих карт

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

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

SQL-запросов:.

Выберите ау *, d.name из документа г внутреннее соединение AttributeValue аи на 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, но с атрибутомId, отличным от 2 (неверно)

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

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

+0

Можешь вы разделяете образец документ и отображение индекса ? – Rob

+1

Можете ли вы попытаться удалить запрос '' match_all ": {}' из списка 'must'? Это совершенно не нужно, и я не удивлюсь, если из-за этого появится ошибка. – Sam

+0

@Sam 'match_all": {} 'не решила проблему – Coding

ответ

2

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

{ 
    "query": { 
    "nested": { 
     "path": "lstChildren", 
     "query": { 
     "bool": { 
      "must": [ 
      { 
       "match": { 
       "lstChildren.AttributeID":"2" 
       } 
      }, 
      { 
       "match": { 
       "lstChildren.IntValue": "31" 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 
Смежные вопросы