Я изо всех сил пытаюсь построить этот запрос с помощью аннотации @Query для данных о пружине:
{
"bool" : {
"must" : [
{
"query_string" : {
"query" : "123",
}
},
{
"bool" : {
"should" : [
{
"term" : {
"username" : {
"value" : "admin"
}
}
},
{
"terms" : {
"groups" : ["abc"],
}
}
],
}
}
]
}
}
Я пробовал это:
@Query("{\"bool\": {\"must\": [{\"query_string\": {\"query\": \"?0\"}}, {\"bool\": { \"should\": [ {\"term\" : {\"username\" : \"?2\"}}, {\"terms\" : {\"groups\" : \"?1\"} } ] } } ] }}")
Page<Device> findByTermAndGroupOrUser(String term, List<String> groups, String username, Pageable pageable);
Но это не удается с:
ParsingException [[term] запрос не поддерживает [groups]]
Попытка изменить запрос на:
@Query("{\"bool\": {\"must\": [{\"query_string\": {\"query\": \"?0\"}}, {\"bool\": { \"should\": [ {\"term\" : {\"username\" : \"?2\"}}, {\"terms\" : {\"groups\" : [\"?1\"]} } ] } } ] }}")
Page<Device> findByTermAndGroupOrUser(String term, List<String> groups, String username, Pageable pageable);
Это работает, но группы, кажется, неоценены.Документы, содержащие данную группу, не найдены.
Тот же запрос, созданный с помощью QueryBuilder, работает следующим образом (но в этом случае я пропускаю подкачку данных Spring)
BoolQueryBuilder qb = QueryBuilders.boolQuery();
QueryBuilder should1 = QueryBuilders.termQuery("username", username);
QueryBuilder should2 = QueryBuilders.termsQuery("groups", groups);
BoolQueryBuilder should = qb.should(should1).should(should2);
QueryStringQueryBuilder termQuery = QueryBuilders.queryStringQuery(term);
BoolQueryBuilder must = QueryBuilders.boolQuery().must(termQuery).must(should);
SearchResponse searchResponse = elasticsearchTemplate.getClient()
.prepareSearch()
.setQuery(must)
.setFrom(pageable.getPageNumber() * pageable.getPageSize())
.setSize(pageable.getPageSize())
.get();
Что яделать неправильно?