2017-01-03 3 views
1

Существует несколько документов, содержащих около 100 полей каждый. Я хотел бы выполнить следующий поиск через elasticsearch Java API 5.x:Elasticsearch запрос нескольких условий с использованием java api

Есть 3 поля я хотел бы использовать для этого поиска т.е.

department 
job 
name 

Я хотел бы искать возвращение документы, соответствующие поля, как "отдел: D1", "отдел: D2", "работа: J1", "работа: J2", "имя: N1"

Я пытался сделать это таким образом

String[] departments = ["d1","d2","d3"]; 
String[] jobs = ["j1","j2","j3"]; 
String[] names = ["n1"]; 

MultiSearchRequestBuilder requestbuilder; 

requestBuilder.add(client.prepareSearch().setQuery(QueryBuilders.termsQuery("department", departments))); 
requestBuilder.add(client.prepareSearch().setQuery(QueryBuilders.termsQuery("job", jobs))); 
requestBuilder.add(client.prepareSearch().setQuery(QueryBuilders.termsQuery("name", names))); 

MultiSearchResponse response = requestBuilder.get(); 

Однако запросы выполняются как если бы каждый был индивидуальным запросом, то есть в этом примере, когда j3 существует в d4, документ с d4 будет также сопоставлен

Как выполнить поиск, как я упомянул? Я пробовал много разных запросов, и ничего не работает, есть ли что-то, чего я не вижу?

ответ

3

Вы не хотите использовать MultiSearchRequestBuilder, вам просто нужно объединить три ограничения в bool/filter запроса:

BoolQueryBuilder query = QueryBuilders.boolQuery() 
    .filter(QueryBuilders.termsQuery("department", departments)) 
    .filter(QueryBuilders.termsQuery("job", jobs)) 
    .filter(QueryBuilders.termsQuery("name", names)); 
SearchResponse resp = client.prepareSearch().setQuery(query).get(); 
+0

, используя код, который вы указали. Я не получаю результатов вообще, даже пытался сузить его только для фильтрации по отделам, но все же список хитов пуст. если ваш код правильный, то знаете ли вы, что может быть причиной? – Zerg

+0

Анализируются ваши поля или нет? термин запрос является точным совпадением, поэтому ваши условия должны быть точно такими же, как индексы, которые были проиндексированы в полях, которые вы пытаетесь сопоставить – Val

+0

Мне пришлось использовать .setSize() в ответ, и это было не в том месте цепи. он работает сейчас. – Zerg

0

Для Elasticsearch 5.6.4 использования HighRestClient, добавьте необходимое количество sourcebuilder ...

static RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http"))); 
public static void multisearch() throws IOException{ 
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); 
    sourceBuilder.query(QueryBuilders.termQuery("name", "vijay1")); 
    SearchSourceBuilder sourceBuilder1 = new SearchSourceBuilder(); 
    sourceBuilder.query(QueryBuilders.termQuery("name", "vijay")); 
    SearchRequest searchRequest = new SearchRequest(); 
    searchRequest.indices("posts-1","posts-2").source(sourceBuilder).source(sourceBuilder1); 
    SearchResponse searchResponse = client.search(searchRequest); 
    RestStatus status = searchResponse.status(); 
    System.out.println(searchResponse.toString());