아빠는 개발자

[es] HighLevelClient, LowLevelClient 본문

Elastic/elasticsearch

[es] HighLevelClient, LowLevelClient

father6019 2023. 8. 27. 19:01
728x90
반응형

900gle 의 개발 환경을 es8 로 바꾸고 나서 부터 문제가 발생했다. 

high level client 의 버전은 7.17 버전이후 8버전이 알파상태라 써도 되나 .. 싶은..

 

maven repository

 

900gle 이 맛이 갔는데 이게 다 업데이트 때문이라는... es8.8.1 도 카피를 떳더니 충돌나서 데몬이 올라오지도 않고

암튼 ann 쿼리로 900gle 을 업데이트 하려고 했는데 이 쿼리가 es 8 부터 실행되는... 8.6 이상이였나.. 

아무튼 7.15 를 8.8.1 로 업데이트 하니..  끝.. (해결이 아닌 맛이감)

 

문제의 쿼리 

{
  "query": {
    "match_all": {}
  },
  "knn": {
    "field": "name_vector",
    "query_vector": ${query_vector},
    "k": 5,
    "num_candidates": 50,
    "boost": 0.1
  },
  "size": ${SEARCH_SIZE}
}

 

elasticsearch java api 를 사용하라는 문서를 어디서 본거 같은데 출처가 어디였더라.. 

암튼 elasticsearch-java 는 업데이트도 잘해줘서 8.9 까지도 있고.. 이걸쓰고 high level client 를 안써야 하나 

하는 쓰잘때기 없는 고민을 하다가

 

둘다 사용할수 있는 환경을 만들어 보기로..

 

 이래저래 건들다 보니 low level 을 사용하려면 아래 라이브러리는 필수로 받아야 할듯하고 

    implementation group: 'co.elastic.clients', name: 'elasticsearch-java', version: '8.8.1'
    implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.12.3'
    implementation group: 'jakarta.json', name: 'jakarta.json-api', version: '2.1.2'

여기에 추가로 high level 용 라이브러리 하나 더 받으면

implementation group: 'org.elasticsearch.client', name: 'elasticsearch-rest-high-level-client', version: '7.17.4'

 

대충 이거 4개면 테스트 가능 우선 클라이언트 객체 부터 생성해보자  

high level client 의 코드를 마이그레이션 한 low level client 생성 

@Configuration
public class HighlevelClient extends Client{
    @Bean
    public RestHighLevelClient getHighClient() throws UnknownHostException {

// Create the HLRC
        RestHighLevelClient high_client = new RestHighLevelClientBuilder(getHttpClient())
                .setApiCompatibilityMode(true)
                .build();
        return high_client;
    }
}
@Bean
public ElasticsearchClient getLowClient() throws UnknownHostException {
    // Create the Java API Client with the same low level client
    ElasticsearchTransport transport = new RestClientTransport(
            getHttpClient(),
            new JacksonJsonpMapper()
    );

    ElasticsearchClient low_client = new ElasticsearchClient(transport);
    return low_client;
}

공통

public class Client {

    @Value("#{'${elasticsearch.host}'.split(',')}")
    protected List<String> hosts;

    @Value("${elasticsearch.port}")
    protected int port;

    @Value("${elasticsearch.id}")
    protected String id;

    @Value("${elasticsearch.password}")
    protected String password;

    @Bean
    protected RestClient getHttpClient(){
        // Create the low-level client
        RestClient httpClient = RestClient.builder(
                new HttpHost(hosts.get(0), port)
        ).setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
            @Override
            public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                return httpClientBuilder.setDefaultCredentialsProvider(getCredentialsProvider());
            }
        }).build();
        return httpClient;
    }

    protected CredentialsProvider getCredentialsProvider() {
        CredentialsProvider credentialsProvider =
                new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY,
                new UsernamePasswordCredentials(id, password));
        return credentialsProvider;
    }
}

이렇게 클라이언트를 생성해서 인덱스만 퀵하고 샥 하게 만들어 보면

public void index(){
     try {
        low.indices().create(c -> c.index("low-level"));
         CreateIndexRequest request = new CreateIndexRequest("high-level");
         CreateIndexResponse createIndexResponse = high.indices().create(request, RequestOptions.DEFAULT);
     } catch (IOException e) {
         e.printStackTrace();
     }
}

low level 과 high level 각 1개씩 만들었는데 low level 이 더  깔끔해 보이는건.. 뭔지..

실행결과

뭐가 나은건지는 모르겠지만..

버전관리가 잘되고있는 elasticsarch-java 만 사용해서 작업하는것도 나쁘지는 않을 것 같은데..

 

아무튼 json 파일로 setting 과 mapping 을 관리 하려고 하는데 자꾸 필드 맵핑 어쩌고 에러가 계속 난다. 

문제는 json 파일의 구조가 아니라 

 

import 되는 라이브러리의 문제 같은이름이라 지멋대로 아주.. 근ㅇ..

import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;

아래와 같이 수정하면 해결 

import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
 
 
728x90
반응형

'Elastic > elasticsearch' 카테고리의 다른 글

[es] Elasticsearch multi node cluster docker compose  (0) 2023.09.02
[es] scripts, caching, and search speed  (0) 2023.08.31
[es] script query  (1) 2023.08.31
[es] aggregation - Pipeline Aggregations  (0) 2023.08.27
[es] nori analyzer test  (0) 2023.08.27