Я пытаюсь создать сервис, который запрашивает мой сервис ElasticSearch.
Этот сервис должен получить список фильтров (класс, который по сути является Map<String, Set<String>>
) и для каждой записи на карте добавить необходимый запрос. Ключ карты соответствует имени поля, массив - это возможные значения, к которым я должен запросить.
Я должен признать, что я совсем новичок в ElasticSearch, поэтому я думаю в терминах реляционных БД, таких как:
Для каждого (entryInMap) добавьте -> где ключ = значения [] (это просто иллюстрация моего мыслительного процесса, а не действительный запрос, я знаю.)
У меня естьпопытался добавить запрос, используя queryBuilder.withQuery()
, но для каждого цикла в моей итерации по карте критерии соответствия перезаписываются, а не добавляются.
NativeSearchQueryBuilder queryBuilder;
@Autowired
ElasticsearchOperations elasticsearchOperations;
// Меня интересует объект Taskв возвращении. В этих // целях я не думаю, что это полезно описывать, но, пожалуйста, дайте мне // знать. public List queryAll (FilterList filters) {// FilterList - это класс Wrapper, у которого есть список фильтров. // Таким образом, если бы здесь не было классов, мы получили бы это как входные параметры: // Список >>
SearchQuery searchQuery = null;
queryBuilder = new NativeSearchQueryBuilder();
// Very dirty iteration.
for (Filter filter: filters.getFilters()) {
for (String value: filter.getValues()) {
//Everytime this line executes, the match query gets REPLACED
queryBuilder.withQuery(addANDQuery(filter.getField(), value));
}
}
searchQuery = queryBuilder.build();
return elasticsearchOperations.queryForList(searchQuery, Task.class);
}
private MatchQueryBuilder addANDQuery(String field, String value){
return matchQuery(field, value).operator(AND);
}
Пример ввода здесь будет:
{"filters":[
{"field":"name",
"values":["foo"]
},
{"field":"lastName",
"values":["bar"]
}
]}
Срезультирующий запрос выглядит следующим образом:
{
"match" : {
"lastName" : {
"query" : "bar",
"operator" : "AND",
"prefix_length" : 0,
"max_expansions" : 50,
"fuzzy_transpositions" : true,
"lenient" : false,
"zero_terms_query" : "NONE",
"auto_generate_synonyms_phrase_query" : true,
"boost" : 1.0
}
}
}
Как видите, в запрос попадает только последний параметр ввода.