ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 20. 엘라스틱서치 클라이언트 (JAVA Client)
    BackEnd/elasticsearch 2021. 10. 15. 18:29
    반응형
    엘라스틱서치에서 지원하는 언어별 라이브러리
      ■ Java REST Client
      ■ Java API
      ■ JavaScript API
      ■ Groovy API
      ■ .NET API
      ■ PHP API
      ■ Python API
      ■ Ruby API
      ■ Community Contributed Clients
      ■ 참고 : https://www.elastic.co/guide/en/elasticsearch/client/index.html

     

    자바 클라이언트 모듈

    1) REST 클라이언트

      > Java High Level REST Client라고도 불린다.

      > HTTP 방식을 이용해 엘라스틱서치와 통신한다.

      > 내부적으로는 HttpClient 모듈을 사용한다.

     

    2) Transport 클라이언트

      > Java Client라고도 불린다.

      > 초기부터 제공되던 클라이언트 방식으로, 상대적으로 빠른 속도를 보장한다.

      > 소켓을 이용해 엘라스틱서치와 통신한다.

      > 내부적으로는 Netty 모듈을 사용한다.

     

      엘라스틱서치 7.0부터는 Transport 클라이언트가 폐기 예정(Deprecated) 됐기 때문에 REST 클라이언트를 사용해야 합니다.

      > 클라이언트 예제 코드 (Transport / REST)

     

    High Level REST 클라이언트

    1. REST 클라이언트 연결

      1) 라이브러리 추가

    <!-- Maven의 경우 pom.xml -->
    <dependency>
    	<groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
        <version>6.7.1</version>
    </dependency>
    
    <!-- gradle의 경우 build.gradle -->
    dependencies {
    	compile 'org.elasticsearch.client:elasticsearch-rest-high-level-client:6.7.1'
    }

      2) RestClient를 이용해 엘라스틱서치 연결 (더 이상 사용되지 않는다면 생성한 객체를 반드시 닫아야 합니다.)

    // 9200번 HTTP 포트를 오픈한 두 개의 노드 연결
    RestHighLevelClient client = new RestHighLevelClient(
    	RestClient.builder(
        	new HttpHost("192.168.0.101", 9200, "http"),
            new HttpHost("192.168.0.1.2", 9200, "http")));
    
    ... 전송프로그램 작성 ...
    
    client.close();

     

    2. 매핑 API

      > 인덱스 생성 API

    // Sync 방식
    CreateIndexResponse createIndexResponse = 
    		client.indices().create(request, RequestOptions.DEFAULT);
            
    boolean acknowledged = createIndexResponse.isAcknowledged();
            
    // Async 방식
    ActionListener<CreateIndexResponse> listener = new ActionListener<CreateIndexResponse>() {
      @Override
      public void onResponse(CreateIndexResponse createIndexResponse) {
        // 성공했을 때 실행할 구문
      }
      
      @Override
      public void onFailure(Exception e) {
        // 실패했을 때 실행할 구문
      }
    };
    
    client.indices().createAsync(request, listener);

      > 인덱스 삭제 API

         (인덱스 생성과 마찬가지로 Sync 방식과 Async 방식을 선택적으로 사용할 수 있습니다.)

      > 인덱스 Open/Close API

     

    3. Document API

      > 문서 추가

      > 문서 조회

      > 문서가 존재하는지 검사

      > 문서 삭제

      > 문서 업데이트 1) 스크립트를 이용한 업데이트

      > 문서 업데이트 2) 문서의 일부분 업데이트

      > 문서 업데이트 3) UPSERT : 문서 존재 시 UPDATE, 미존재 시 INSERT

     

    4. BULK API

     

    5. 검색 API

      SearchRequest 클래스를 이용해 검색 요청을 할 수 있습니다. 쿼리에는 Query DSL 클래스를 사용할 수 있습니다.

      > SEARCH API (전체 문서를 검색해 5건을 출력하는 예)

      > SCROLL API : 검색 결과를 한 번에 제공하지 않고 페이지 단위로 나눠 순차적으로 제공하는 API

     

    6. Query DSL API

      Query DSL API는 URI 방식의 쿼리가 아닌 Request Body에 JSON 형태로 질의문을 실어서 보내는데 사용하는 API로 앞의 Search API와 함께 사용하는 API입니다.

     

    1) Match All Query

      아무 조건 없이 전체 데이터를 대상으로 질의하고 싶을 때 사용하는 쿼리입니다. 

            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            searchSourceBuilder.query(QueryBuilders.matchAllQuery());​

     

    2) Full Text Queries

      루씬에서 제공하는 쿼리 문법을 활용해 검색을 질의할 때 사용하는 API입니다.

     

    MATCH QUERY

      기본적인 형태소 분석을 통해 검색어를 분석해서 질의를 수행합니다. 분리된 텀 간에 AND 혹은 OR 연산을 선택해서 질의할 수 있습니다.

            String FIELD_NAME = "movieNm";
            String QUERY_KEYWORD = "아이";
    
            QueryBuilder queryBuilder = QueryBuilders.matchQuery(FIELD_NAME, QUERY_KEYWORD);

    COMMON TERMS QUERY

      많이 검색되는 단어와 적게 검색되는 단어 중 어떤 단어가 더 중요한지를 판단해서 검색 스코어링을 변경하는 알고리즘을 가지고 있는 쿼리입니다.

            String FIELD_NAME = "movieNm";
    
            //Family in the Bubble 검색
            String QUERY_KEYWORD = "Family";
            QueryBuilder queryBuilder = QueryBuilders.commonTermsQuery(FIELD_NAME, QUERY_KEYWORD);

    QUERY STRING QUERY

      검색할 때 연산자를 따로 지정하는 것이 아니라 쿼리문 자체에 AND, OR절을 사용해 질의하고 싶을 때 사용합니다. 혹은 특정 키워드를 필수 조건으로 넣거나 빼기 위해 사용하기도 합니다.

            String FIELD_NAME = "movieNm";
            String QUERY_KEYWORD = "버블 OR 하이";
    
            QueryBuilder queryBuilder = QueryBuilders.queryStringQuery(QUERY_KEYWORD).field(FIELD_NAME);

     

    3) Term level Queries

      특정 문자의 일부분만 알고 있거나 문자가 아닌 숫자의 범위 혹은 _id 값 등으로 조회하고 싶을 때 사용하는 API입니다.

     

    TERM QUERY

      지정된 필드에 정확한 텀이 들어있는 문서를 찾을 때 사용합니다. Keyword 타입으로 설정된 필드에서 문서를 찾을 때 사용합니다.

            String FIELD_NAME = "repNationNm";
            String QUERY_KEYWORD = "한국";
    
            QueryBuilder queryBuilder = QueryBuilders.termQuery(FIELD_NAME, QUERY_KEYWORD);

    WILDCARD QUERY

      특정 단어에 대해 정규 표현식을 이용해 전체 문서를 대상으로 조회하고 싶을 때 사용합니다.

            String FIELD_NAME = "movieNmEn";
            String QUERY_KEYWORD = "F?m*";
    
            QueryBuilder queryBuilder = QueryBuilders.wildcardQuery(FIELD_NAME,QUERY_KEYWORD);

     

    4) Compound Queries

      특정 쿼리와 다른 다수의 쿼리를 조합해서 사용하는 API를 말합니다. 어떤 필드는 AND 조건으로 검색하고 다른 필드는 OR 검색을 하고 싶을 때 사용할 수 있습니다. 또한 스코어의 계산 값을 다르게 하거나 각 필드별로 가중치를 각각 다르게 해서 값을 계산할 때도 유용합니다.

     

    BOOL QUERY

      특정 필드에서 질의문을 넣거나 뺄 때 사용하는 API 입니다. 여러 개의 쿼리를 조합할 수 있으며, must, mustNot, should, filter를 조합해서 쿼리를 구성할 수 있습니다.

            String FIELD_NAME_MUST = "repNationNm";
            String QUERY_KEYWORD_MUST = "한국";
    
            String FIELD_NAME_MUST_NOT = "repGenreNm";
            String QUERY_KEYWORD_MUST_NOT="드라마";
    
            String FIELD_NAME_SHOULD = "prdtYear";
            String QUERY_KEYWORD_SHOULD="2017";
    
            String FIELD_NAME_FIELTER = "movieCd";
            String QUERY_KEYWORD_FIELTER="20173732";
    
            QueryBuilder queryBuilder = QueryBuilders
                    .boolQuery()
                    .must(termQuery(FIELD_NAME_MUST, QUERY_KEYWORD_MUST))
                    .mustNot(termQuery(FIELD_NAME_MUST_NOT, QUERY_KEYWORD_MUST_NOT))
                    .should(termQuery(FIELD_NAME_SHOULD, QUERY_KEYWORD_SHOULD))
                    .filter(termQuery(FIELD_NAME_FIELTER, QUERY_KEYWORD_FIELTER));

    DISMAX QUERY

      tie_breaker를 사용해 스코어를 조정할 수 있는 API 입니다. 가장 많은 점수를 받은 필드를 제외하고 나머지 필드의 점수를 합산한 후 tie_breaker의 값으로 나눠서 스코어를 재계산하는 API 입니다.

            String FIELD_NAME1 = "repNationNm";
            String QUERY_KEYWORD1 = "한국";
    
            String FIELD_NAME2 = "repGenreNm";
            String QUERY_KEYWORD2="드라마";
    
            QueryBuilder queryBuilder = QueryBuilders
                    .disMaxQuery()
                    .add(termQuery(FIELD_NAME1, QUERY_KEYWORD1))
                    .add(termQuery(FIELD_NAME2, QUERY_KEYWORD2))
                    .boost(1.5f)
                    .tieBreaker(0.5f);

     

    5) Geo Queries

      좌푯값으로 특정 범위 내에 있는 문서를 검색할 때 사용하는 API 입니다. 특정한 점에서 얼마만큼의 거리에 있는지를 측정해서 문서를 검색할 수 있습니다.

     

    GEO_SHAPE QUERY

      지정된 지형과 교차하거나 포함된 지점의 문서를 찾습니다. API를 사용하기 위해서는 spatial4j와 jts 라이브러리가 필요합니다.

            String FIELD_NAME = "filmLocation";
    
            List<Coordinate> coodinates = new CoordinatesBuilder()        
    	        .coordinate(0, 0)
    	        .coordinate(0, 10)
    	        .coordinate(10, 10)
    	        .coordinate(10, 0)
    	        .coordinate(0, 0)
    	        .build();
            
            GeoShapeQueryBuilder queryBuilder = geoShapeQuery(
            		FIELD_NAME,                                      
                    new MultiPointBuilder(coodinates)
            );
            
            queryBuilder.relation(ShapeRelation.WITHIN);

    GEO BOUNDING BOX QUERY

      지리적 포인트가 지정한 사각형에 속하는 문서를 찾을 때 사용하는 API 입니다.

            String FIELD_NAME = "filmLocation";
    
            QueryBuilder queryBuilder = geoBoundingBoxQuery(FIELD_NAME)
                    .setCorners(40.73, -74.1, 40.717, -73.99);

    GEO DISTANCE QUERY

      특정 문서를 중심으로 일정 거리 내에 있는 지리적 정보가 있는 문서를 찾는 API 입니다.

            String FIELD_NAME = "filmLocation";
    
            QueryBuilder queryBuilder = geoDistanceQuery(FIELD_NAME)
                    .point(40, -70)
                    .distance(3, DistanceUnit.KILOMETERS);

    GEO POLYGON QUERY

      지정한 다각형 내의 지리적 포인트가 있는 문서를 찾는 API 입니다.

            String FIELD_NAME = "filmLocation";
    
            List<GeoPoint> points = new ArrayList<GeoPoint>();
            points.add(new GeoPoint(40, -70));
            points.add(new GeoPoint(30, -80));
            points.add(new GeoPoint(20, -90));
    
            QueryBuilder queryBuilder =  geoPolygonQuery(FIELD_NAME, points);
    반응형

    댓글

Designed by Tistory.