본문 바로가기
Programming/Elasticsearch

[Elasticsearch] ElasticsearchOperations로 요청 보내기

by peter paak 2021. 3. 16.
728x90

ElasticsearchOperations

  • Query를 받아서 Elasticsearch에 요청을 보내는 역할을 합니다
  • High Level Rest Client를 Spring Data Elasticsearch의 ElasticsearchOperations로 감싸 추가 기능을 제공합니다.
  • High Level Rest Client는 Elasticsearch 내부적으로 Low Level Rest Client를 사용하고 있습니다
  • 그래서 ElasticsearchOperations로, High Level Rest Client 둘 중 하나를 골라서 사용해도 무방합니다.
  • 아래 Operations를 결합합니다
    • DocumentOperations : id를 기반으로 entity를 저장, 업데이트, 조회
    • SearchOperations : query를 사용하여 여러 entity를 검색
    • 두 기능을 결합하여 entity를 저장, 업데이트, 조회, 검색을 편하게 해줍니다
  • 구현체 : ElasticsearchRestTemplate을 사용한다
    • elasticsearchTemplate은 4.0 버전에서 deprecate되었습니다.
    • 테스트에서는 elasticsearchTemplate과 elasticsearchRestTemplate이 검색되므로 Qualifier로 후자를 선택해줍니다.
@Qualifier("elasticsearchTemplate")
@Autowired
private ElasticsearchOperations elasticsearchOperations;

  • 내부적으로는 High Level REST Client를 사용합니다.
    • RestHighLevelClient은 AbstractElasticsearchConfiguration을 통해 생성됩니다.
    • 이미 기본적으로 elasticsearchRestTemplate을 사용하고 있습니다.
    • elasticsearchOperations와 ealsticsearchTemplate 이름으로 빈이 등록되어 있으므로 둘 중 하나의 방법으로 사용해도 무방합니다

  • 스프링부트에서 기본 구현체를 제공해줍니다.
  • application.yml에서 spring.elasticsearch.rest.uris: http://[host]:[port]으로 기본 host와 port를 설정하면 알아서 주입을 해줍니다.
@Configuration
public class RestClientConfig extends AbstractElasticsearchConfiguration {

  @Override
  public RestHighLevelClient elasticsearchClient() {       
    return RestClients.create(ClientConfiguration.localhost()).rest();
  }
}
AbstractElasticsearchConfiguration -> RestHighLevelClient
ElasticsearchOperations -> ElasticsearchRestTemplate

Query

  • elasticsearch의 query
  • ElasticsearchOperations의 파라미터로 사용되어 네트워크로 전송됩니다.
  • 종류
    1. CriteriaQuery
    2. StringQuery
    3. NativeQuery

NativeSearchQuery

  • Spring Data Elasticsearch의 QueryDSL!
  • 다른 두 쿼리와 다르게 String으로 쿼리를 작성하는 것이 아니라 자바로 작성할 수 있습니다.
  • (이는 High Level Rest Client도 마찬가지 입니다)
  • 여러 QueryBuilder들을 사용할 수 있습니다.
  • 궁극적으로 elasticsearch 라이브러리를 사용하기 때문에 "native"라는 이름이 붙었다고 합니다.
  • 개인적으로는 ElasticsearchOperations은 스프링에서 제공하는 편의 메소드 정도라고 생각합니다.

Example

@SpringBootTest
public class ElasticsearchTest {

    @Qualifier("elasticsearchTemplate")
    @Autowired
    private ElasticsearchOperations elasticsearchOperations;

    @Test
    void elasticsearchOperationsTest() {

                // Builder
        GeoDistanceQueryBuilder geoBuilder = QueryBuilders
                .geoDistanceQuery("location")
                .point(37.125, 127.216)
                .distance(10, KILOMETERS);

                // Query 
                // NativeSearchQuery는 여러 builder를 받아 Query를 생성한다.
        NativeSearchQuery searchQuery = new NativeSearchQuery(geoBuilder);

                // ElasticsearchOperations
                // ElasticsearchOperations는 Query를 받아 index를 받아온다
        List<PlaceDocument> placeDocuments = elasticsearchOperations.queryForList(searchQuery, PlaceDocument.class);

        System.out.println(placeDocuments);
        assertThat(placeDocuments.size()).isEqualTo(10);
    }
}
  • geoDistanceQueryBuilder라는 geoDistance라는 쿼리를 사용
  • 해당 쿼리는 한지점을 기준으로 반경 10km이내의 모든 poi들을 검색
  • 생성된 QueryBuilder는 NativeSearchQuery에 주입되어 ElasticsearchOperations에 사용
  • ElasticsearchOperations은 ElasticsearchRestTemplate을 사용하여 elasticsearch에 쿼리를 보냄

위의 테스트를 실행하면 잘 실행됩니다.

출처

728x90