2015-05-12 5 views
2

Я относительно новичок в ElasticSearch, и мне нужен совет. После нескольких попыток я не нашел решение, и именно поэтому я вам нужен.Условный запрос в ElasticSearch?

Я хочу сделать условный запрос на основе содержимого документа.

Позвольте мне объяснить, у меня есть эти документы в ES:

{ 
    "name": "Product n°1", 
    "type": "Mail", 
    "sub": "Letter" 
}, 
{ 
    "name": "Product n°2", 
    "type": "Video", 
    "sub": null 
}, 
{ 
    "name": "Product n°3", 
    "type": "Mail", 
    "sub": "Postcard" 
} 

Пользователь может фильтровать по типам и подразделам с флажками (так, пользователь может искать более одного типа и к югу, в то же время)

Edited

Клиенты могут выбирает с флажком типы продуктов, которые они хотят получить от ES (для Ex: видео, изображения, почта), они могут выбрать все из них.

Тип «Документ» имеет 4 подтипа: Letter, Postal Card, Paper, Printed, и они могут выбирать, какой тип субтитров они хотят получить.

Итак, мы признаем клиента выбранным видео и почтой, а Letter - подтипом Mail.

Я хочу, чтобы ES возвращал все документы в выбранных типах и только буквы, когда документ является типом «Почта».

Извините за свои ошибки, я очень новичок в ES.

Спасибо всем, кто пытается помочь!


UPDATE 2

Вот мой запрос с решением Андрея Стефана

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "match_all": [] 
     }, 
     "filter": { 
     "bool": { 
      "should": [ 
      { 
       "terms": { 
       "type": [ 
        "Video", 
        "Mail" 
       ] 
       } 
      }, 
      { 
       "bool": { 
       "must": [ 
        { 
        "term": { 
         "type": Mail 
        } 
        }, 
        { 
        "terms": { 
         "sub": [ 
         "Letters" 
         ] 
        } 
        } 
       ] 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

ES возвращает все документы типа видео и почты, он не применяет fillter Letters, когда тип это Mail.

+0

Вы можете перефразировать или предоставить более подробную информацию о «Я хочу, чтобы сделать условный запрос вроде этого: Я хочу, чтобы получить продукты, имеющие 1 или 2 в типе, но если документ имеет тип 1 Пусть я хочу извлекать только документы, имеющие 2 в sub. "? –

+0

я уверенный может. К сожалению, для моего английского языка. Не мой родной язык. – ChainList

+0

Хорошо, я попытался проясниться, надеюсь, вы поймете. – ChainList

ответ

1

Тысяча танков @Andrei Стефан. Разница между обновлением 2 заключается в том, что мне пришлось удалить «Mail» из первого запроса «should».

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "match_all": [] 
     }, 
     "filter": { 
     "bool": { 
      "should": [ 
      { 
       "terms": { 
       "type": [ 
        "Video" 
       ] 
       } 
      }, 
      { 
       "bool": { 
       "must": [ 
        { 
        "term": { 
         "type": Mail 
        } 
        }, 
        { 
        "terms": { 
         "sub": [ 
         "Letters" 
         ] 
        } 
        } 
       ] 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
}