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")));
Этот запрос эквивалентен указанному выше. Надеюсь это поможет