2015-07-28 2 views
1

У меня есть следующий запрос:Elasticsearch BOOL фильтр с заводной апи

GET /index/type/_search 
{ 
    "query": { 
    "filtered": { 
     "query": { 
     "match": { 
      "project": "ABC" 
     } 
     }, 
     "filter": { 
     "bool": { 
      "must": [ 
      {"term": { 
       "subtech": 2 
      }}, 
      { 
       "term": { 
       "tech": 1 
       } 
      }, 
      { 
       "term": { 
       "country": 1 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

И ответ имеет 50 хитов. Все хорошо, потому что у меня есть 100 документов с технологией: 1, страна: 1 и пятьдесят пятьдесят субтемов: 1, субтекс: 2

Когда я пишу этот запрос с groovy api, я отфильтровал с последним значением термина: - последнее значение subtech, ударяется = 50 - последнее значение технологии, ударяется = 100 - последняя страна значение, ударяется = 100

запрос:

client.search { 
      indices 'index' 
      types 'type' 
      source { 
       query { 
        filtered { 
         query { 
          match(project: 'ABC') 
         } 
         filter { 
          bool {         
           must { 
            term(subtech:2)          
           } 
           must { 
            term(tech:1)          
           } 
           must { 
            term(country:1) 
           } 
          } 
         } 
        } 
       } 
      } 
     } 

Любое предложение.

ответ

1

Поддерживаемый Groovy DSL очень похож на JSON.

{ 
    indices "index" 
    types "type" 
    source { 
    query { 
     filtered { 
     query { 
      match { 
      project = "ABC" 
      } 
     } 
     filter { 
      bool { 
      must [ 
       { 
       term { 
        subtech = 2 
       } 
       }, 
       { 
       term { 
        tech = 1 
       } 
       }, 
       { 
       term { 
        country = 1 
       } 
       } 
      ] 
      } 
     } 
     } 
    } 
    } 
} 

В вашей версии Groovy я заметил, что ваши фильтры были разными, чем у JSON. В частности, ваши условия от JSON указаны для subtech, tech и country. Для Groovy API вы фильтруете файл с agent, subtech и country.

Вы также переназначаете must в пределах bool, а не назначаете ему массив фильтров.

must { 
    term(agent:1) 
} 
must { 
    term(subtech:2) 
} 
must { 
    term(country:1) 
} 

Обратитесь к приведенному выше примеру, чтобы узнать, как это сделать. Это переназначение/вызов must, это проблема здесь. Передача в Map действительна, хотя я лично рекомендую более точно отразить JSON.

+0

Спасибо за ваш ответ, я исправил пример, и результат тот же :(. – jripoll

+0

Я попробую с вашим примером, и у меня есть исключение: 'org.elasticsearch.search.SearchParseException: [index] [4]: from [-1], size [-1]: Parse Failure [Не удалось разобрать источник [{"query": {"filter": {"query": {"match": {"project": "ABC"}} , "фильтр": { "BOOL": { "must.getAt": [{ "термин": { "subtech": 2}}, { "термин": { "технология": 1}}, { "термин" : {"country": 1}}]}}}}}]] ' – jripoll

+0

Какую версию клиента Groovy вы используете? Также попробуйте изменить его на' must = ['from' must ['. – pickypg

Смежные вопросы