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의 파라미터로 사용되어 네트워크로 전송됩니다.
- 종류
- CriteriaQuery
- StringQuery
- 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