분산 검색 Elasticsearch - MultiSearch

4421 단어
MultiSearch는 ElasticSearch가 제공하는 여러 개의 조회 요청에 대한 조회 인터페이스입니다. 이 인터페이스는 여러 개의 다른 조회를 동시에 실행할 수 있지만 다음과 같은 문제가 있습니다.
        1. 인공적으로 페이지를 나누지 않는 한 최종 결과에 대해 페이지를 나눌 수 없습니다.
        2. 여러 SearchRequest가 조회한 결과 중 중복된 결과가 있을 수 있지만 MultiSearch는 중복되지 않습니다.
        org.elasticsearch.index.query.QueryBuilders는 다양한 Query를 동시에 실행할 수 있는 인터페이스를 제공합니다. 스스로 연구할 수 있습니다.
MultiSearch 예는 다음과 같습니다.
/**
 * @author Geloin
 */
package com.gsoft.gsearch.util;

import java.util.UUID;

import junit.framework.Assert;

import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.MultiSearchResponse;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.junit.Test;

import com.gsoft.gsearch.BaseTest;
import com.gsoft.gsearch.entity.Person;

/**
 * @author Geloin
 * 
 */
public class MultiSearchTest extends BaseTest {
	@Test
	public void multiSearchQuery() {
		try {

			//  
			BulkRequestBuilder builder = client.prepareBulk();

			for (int i = 0; i < 2; i++) {
				Person p = new Person();
				p.setId(UUID.randomUUID().toString());
				p.setAge(20);
				p.setIsStudent(false);
				p.setSex(" ");
				p.setName(" ");

				String source = ElasticSearchUtil.BeanToJson(p);

				IndexRequest request = client.prepareIndex().setIndex(index)
						.setType(type).setId(p.getId()).setSource(source)
						.request();

				builder.add(request);
			}
			for (int i = 0; i < 2; i++) {
				Person p = new Person();
				p.setId(UUID.randomUUID().toString());
				p.setAge(20);
				p.setIsStudent(false);
				p.setSex(" ");
				p.setName(" ");

				String source = ElasticSearchUtil.BeanToJson(p);

				IndexRequest request = client.prepareIndex().setIndex(index)
						.setType(type).setId(p.getId()).setSource(source)
						.request();

				builder.add(request);
			}

			BulkResponse bResponse = builder.execute().actionGet();
			if (bResponse.hasFailures()) {
				Assert.fail(" !");
			}

			//  
			QueryBuilder qb1 = QueryBuilders.matchQuery("name", " ");
			QueryBuilder qb2 = QueryBuilders.matchQuery("name", " ");
			QueryBuilder qb3 = QueryBuilders.matchQuery("name", " ");
			QueryBuilder qb4 = QueryBuilders.matchQuery("name", " ");

			SearchRequestBuilder searchRB1 = client.prepareSearch(index)
					.setTypes(type).setQuery(qb1).setFrom(0).setSize(8);
			SearchRequestBuilder searchRB2 = client.prepareSearch(index)
					.setTypes(type).setQuery(qb2).setFrom(0).setSize(9);
			SearchRequestBuilder searchRB3 = client.prepareSearch(index)
					.setTypes(type).setQuery(qb3).setFrom(0).setSize(11);
			SearchRequestBuilder searchRB4 = client.prepareSearch(index)
					.setTypes(type).setQuery(qb4).setFrom(0).setSize(12);

			MultiSearchResponse response = client.prepareMultiSearch()
					.add(searchRB1)
					.add(searchRB2)
					.add(searchRB3)
					.add(searchRB4)
					.execute().actionGet();
			
			for (MultiSearchResponse.Item item : response.responses()) {
				SearchResponse searchResponse = item.response();
				SearchHits hits = searchResponse.getHits();
				if (null == hits || hits.totalHits() == 0) {
					log.error(" matchPhraseQuery(\"name\", \"wa\") !");
				} else {
					for (SearchHit hit : hits) {
						String json = hit.getSourceAsString();

						Person newPerson = mapper.readValue(json, Person.class);
						System.out.println("id\t\t" + newPerson.getId());
						System.out.println("name\t\t" + newPerson.getName());
						System.out.println("sex\t\t" + newPerson.getSex());
						System.out.println("age\t\t" + newPerson.getAge());
						System.out.println("isStudent\t\t"
								+ newPerson.getIsStudent());
					}
				}
				System.out.println("============================================");
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (null != client) {
				client.close();
			}
			if (null != node) {
				node.close();
			}
		}
	}
}

좋은 웹페이지 즐겨찾기