Spring data ElasticSearch @Query - PullRequest
       4

Spring data ElasticSearch @Query

0 голосов
/ 06 июня 2018

Я изо всех сил пытаюсь построить этот запрос с помощью аннотации @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();

Что яделать неправильно?

...