Вложение ElasticSearch должно и должно - PullRequest
1 голос
/ 14 июня 2019

Я пытаюсь создать несколько фильтров для веб-приложения.Пользователи должны иметь возможность фильтрации по пользователям (флажки) и по типам (также флажки).

Мне нужно что-то вроде этого (в T-SQL) для Elasticsearch:

SELECT * from documents d
WHERE (
    d.user = 'user1' OR
    d.user = 'user2'
) AND (
    d.type = 'type1ID' OR 
    d.type = 'type2ID'
)

Ответы [ 2 ]

1 голос
/ 14 июня 2019

Не проверено, но вам нужно что-то вроде этого,

с term,

GET documents/_search
{
   "query" : {
      "constant_score" : { 
         "filter" : {
            "bool" : {
              "should" : [
                 { "term" : {"user" : "user1"}}, 
                 { "term" : {"user" : "user2"}} 
              ],
              "should" : {
                 { "term" : {"type" : "type1ID"}},
                 { "term" : {"type" : "type2ID"}}
              }
           }
         }
      }
   }
}

ИЛИ с terms

GET documents/_search
{
     "query" : {
        "constant_score" : { 
           "filter" : {
              "bool" : {
                 "should" : [
                    {"terms": {"user": ["user1","user2"]}}
                  ],
                 "should" : {
                    {"terms": {"type": ["type1ID","type2ID"]}}
                 }
              }
            }
         }
     }
}
0 голосов
/ 15 июня 2019

Вы должны объединить оба предложения must и must для достижения того, что вы ищете:

{
   "query":{
      "bool":{ 
         "must":{
            "match_all":{}
         },
         "filter":{
            "bool":{
               "must":[
                  {
                     "bool":{
                        "should":[
                           {
                              "term":{
                                 "user":"user1"
                              }
                           },
                           {
                              "term":{
                                 "user":"user2"
                              }
                           }
                        ]
                     }
                  },
                  {
                     "bool":{
                        "should":[
                           {
                              "term":{
                                 "type":"type1ID"
                              }
                           },
                           {
                              "term":{
                                 "type":"type2ID"
                              }
                           }
                        ]
                     }
                  }
               ]
            }
         }
      }
   }
}

В этом примере фильтр применяется к предложению match_all, которое является вашим «SELECT *». Первый уровень«must» действует как «И», и оба «уровня» должны действовать как ваше «ИЛИ».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...