Как добавить matchQuery динамически? - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь создать сервис, который запрашивает мой сервис 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
    }
  }
}

Как видите, в запрос попадает только последний параметр ввода.

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