일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- IONQ
- JPA
- request cache
- java crawler
- TSLA
- Analyzer
- elasticsearch cache
- 양자컴퓨터
- aggs
- API
- file download
- KNN
- Cache
- api cache
- Selenium
- ann
- 테슬라
- Docker
- vavr
- aqqle
- 아이온큐
- Aggregation
- mysql
- java
- Query
- dbeaver
- redis
- Elastic
- Elasticsearch
- NORI
- Today
- Total
아빠는 개발자
[es] HighLevelClient, LowLevelClient 본문
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;
'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 |