Как сделать И + ИЛИ запрос в ElasticSerch & Java - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь выполнить Elastic эквивалентный следующему в SQL:

select * from Pets 
where type is 'cat'
and age > 10
and name in ("Barry", "Oscar", .....)  

У меня есть следующий код Java:

SearchRequest searchRequest = new SearchRequest(elasticIndexName);
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.must(QueryBuilders.termQuery("type", "cat"));
queryBuilder.must(QueryBuilders.rangeQuery("age").from("10"));
queryBuilder.must(QueryBuilders.termQuery("name", "Oscar"));
queryBuilder.must(QueryBuilders.termQuery("name", "Barry"));

Но, если я правильно понимаю,последние два «обязательных» утверждения противоречат друг другу.Я пытался использовать термин «должен», но, кажется, он приносит все имена кошек.

Ответы [ 2 ]

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

вместо термина запрос, я думаю, вы должны попробовать это, это поможет вам получить наилучшие результаты.

BoolQueryBuilder boolQueryBuilder = boolQuery();
boolQueryBuilder.must(QueryBuilders.matchQuery("type", cat));
boolQueryBuilder.must(QueryBuilders.rangeQuery("age").gt(10));
boolQueryBuilder.must(QueryBuilders.multiMatchQuery(String.join(" ", Arrays.asList("Barry", "Oscar"), name).type(Type.BEST_FIELDS));
0 голосов
/ 11 июня 2018

Вы почти у цели, вам нужно сделать это следующим образом (т.е. использовать запрос terms):

SearchRequest searchRequest = new SearchRequest(elasticIndexName);
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.must(QueryBuilders.termQuery("type", "cat"));
queryBuilder.must(QueryBuilders.rangeQuery("age").from("10"));
queryBuilder.must(QueryBuilders.termsQuery("name", "Oscar", "Barry"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...