Elasticsearch Java API для полнотекстового поиска с фильтрами

Я хочу выполнить полнотекстовый поиск по строке "пользователь", которая может соответствовать любому файлу в моем документе, а затем применить фильтр, чтобы я получал только записи, в которых значение x feild равно "abc" или "xyz".

Воздерживаясь от Sense, приведенный ниже запрос выполняет мое требование.

GET _search
{
   "query":{
      "filtered":{
         "query":{
             "query_string": {
                 "query": "user"
         }
         },
         "filter":
             [

                    {"term": { "x": "abc"}},
                     {"term": { "x": "xyz"}}              
            ]    
      }
   }
}

Но я хочу Java API, чтобы сделать вышеупомянутые вещи. Я искал эластичную документацию и SO, но не нашел то, что я ищу, так как API, как QueryBuilders.filteredQuery, кажется устаревшим. Я в настоящее время использую 2.3.4, но могу обновить.

1 ответ

Elasticsearch 2.x Java Api не имеет реализации для фильтрованного запроса. Согласно документации эластичного поиска, они предлагают вместо этого использовать запрос bool с предложением must для запроса и предложением filter для фильтра.

В Java вы можете создать метод для создания метода-оболочки для фильтрованного запроса. Это было бы как:

   public static QueryBuilder filteredQuery(QueryBuilder query, QueryBuilder filter){
        BoolQueryBuilder filteredQuery = QueryBuilders.boolQuery().must(query);
        return filteredQuery.filter(filter);

    }

где,

QueryBuilder query = QueryBuilders.queryStringQuery("user");
QueryBuilder filter = QueryBuilders.boolQuery().filter(QueryBuilders.boolQuery().should(QueryBuilders.termsQuery("x", "abc", "xyz")));

Этот запрос эквивалентен указанному выше. Надеюсь это поможет

Другие вопросы по тегам