🔷 엘라스틱서치 사용법에 대해 알아본다.
1. Image pull 받기
docker pull docker.elastic.co/elasticsearch/elasticsearch:latest
2. 컨테이너 실행 (단일 노드)
docker run -d --name elasticsearch \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e "xpack.security.enabled=false" \
docker.elastic.co/elasticsearch/elasticsearch:latest
-p 9200:9200
: HTTP 포트(9200) 매핑
-p 9300:9300
: 클러스터 통신 포트(9300) 매핑
-e "discovery.type=single-node"
: 단일 노드 모드로 실행
-e "xpack.security.enabled=false"
: 기본 보안 기능 비활성화
❗ 기본 보안 기능을 비활성화하지 않으면 8버전부터 SSH/TLS 사용이 필수적이기 때문에 https로 접근해야한다. 기본 생성된 비밀번호 확인도 해야하고 테스트 용으로만 사용할 때는 여러모로 귀찮기 때문에 비활성화로 우선 진행한다.
💡 그럼에도 보안 기능을 사용하고 싶다면 비활성화 부분을 제외하고 컨테이너를 실행한 다음, 컨테이너 내부에서 명령어로 비밀번호를 확인한다.
docker logs elasticsearch | grep "Password for"
-k
옵션으로 인증서 없이 https 접근을 할 수도 있겠지만 이미 테스트에서 마저 보안 설정을 하려하는 당신이라면 FM으로 인증서까지 사용하며 보안을 챙기는 변태일 가능성이 높다고 생각한다.docker exec -it elasticsearch ls /usr/share/elasticsearch/config/certs
엘라스틱서치는 자동 인증서 생성을 해주기 때문에 보통 저 위치에 인증서가 놓여있다. 호스트로 복사한 뒤에 인증서를 사용하여 https 요청을 해보자.
docker cp elasticsearch:/usr/share/elasticsearch/config/certs/인증서 ./elasticsearch-ca.crt curl --cacert elasticsearch-ca.crt -u elastic:abc123xyz "https://localhost:9200"
사실 진짜 FM은 인증서까지 직접 생성하여 운영하는게 맞다. 인증서 생성은...
3. 컨테이너를 열었다면 실행되었는지 확인해보자.
curl -X GET "http://localhost:9200"
// 대강 이런 응답이 날아온다.
{
"name": "elasticsearch",
"cluster_name": "docker-cluster",
"version": {
"number": "8.7.0",
"build_flavor": "default",
"build_type": "docker"
},
"tagline": "You Know, for Search"
}
엘라스틱서치도 결국은 데이터베이스임을 기억하는가?
그래서 일반적인 HTTP 방식과 비슷하게 통신하는데, GET
으로 조회,DELETE
로 삭제는 똑같다고 보면 되고 하나 조금 다른게 있다면 PUT
과 POST
이다.
데이터 수정은 _update
엔드포인트를 이용하고 여기서 PUT
은 인덱스 생성 시에 사용한다.
POST
는 데이터 저장은 물론, 검색 시에도 사용된다.
하나하나 알아보자.
1. 인덱스(Index)
생성
Elasticsearch에서 데이터를 저장하려면 먼저 인덱스
를 만들어야 한다.
curl -X PUT "http://localhost:9200/my_index" -H "Content-Type: application/json" -d '{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1
}
}'
만약 URL 방식 + Request Body 설정으로 진행하겠다면?
URL과 Header를 이와 같이 추가한 다음,
Body 설정 역시 이와 마찬가지로 하자.
Postman을 이용하여 간단하게 보여준 예시이다.
❗ 엘라스틱서치는 스키마리스를 제공하기 때문에 원래 인덱스를 생성하지 않아도 데이터 추가와 동시에 인덱스를 생성한다. 그럼에도 따로 생성해서 사용하는 이유는 스키마리스 사용시 불필요하게 낭비되는 메모리가 많기 때문에 일반적으로 잘 사용하지 않는다.
2. 데이터 삽입 (문서 추가)
Elasticsearch는 기본적으로 JSON 문서를 저장한다.
curl -X POST "http://localhost:9200/my_index/_doc/1" -H "Content-Type: application/json" -d '{
"title": "Elasticsearch 시작하기",
"content": "도커로 실행 후 첫 번째 문서 추가!",
"date": "2025-03-07"
}'
URL 방식 + Request Body 설정 시에는 인덱스 생성 시와 동일하게 URL, Header, Body 설정 이후 전송하면 성공한다. 아직 감 못 잡은 사람이 있다고..? 흠...
모를 수도 있다. 사람은 적응에 시간이 걸리는 동물이기 때문이다.
3. 데이터 검색 (조회)
이제 넣은 것을 조회를 해보자.
1) 특정 문서 조회 시
curl -X GET "http://localhost:9200/my_index/_doc/1"
URL 방식 사용 시 Header와 Body는 생략하면 된다.
🤖 응답 예시
{
"_index": "my_index",
"_id": "1",
"_source": {
"title": "Elasticsearch 시작하기",
"content": "도커로 실행 후 첫 번째 문서 추가!",
"date": "2025-03-07"
}
}
2) 전체 문서 검색 시 (match_all 쿼리)
❗
POST
를 사용함에 유의하자.
curl -X POST "http://localhost:9200/my_index/_search" -H "Content-Type: application/json" -d '{
"query": {
"match_all": {}
}
}'
URL 방식 사용 시, Header와 Body를 꼭 명시하자.
🤖 응답 예시
{
"hits": {
"total": 1,
"hits": [
{
"_index": "my_index",
"_id": "1",
"_source": {
"title": "Elasticsearch 시작하기",
"content": "도커로 실행 후 첫 번째 문서 추가!",
"date": "2025-03-07"
}
}
]
}
}
3) 특정 필드 검색 (title에 "Elasticsearch" 포함된 문서 찾기)
❗
POST
를 사용함에 유의하자.
curl -X POST "http://localhost:9200/my_index/_search" -H "Content-Type: application/json" -d '{
"query": {
"match": {
"title": "Elasticsearch"
}
}
}'
URL 방식 사용 시, Header와 Body를 꼭 명시하자.
🤖 응답 예시
{
"hits": {
"total": 1,
"hits": [
{
"_index": "my_index",
"_id": "1",
"_source": {
"title": "Elasticsearch 시작하기",
"content": "도커로 실행 후 첫 번째 문서 추가!",
"date": "2025-03-07"
}
}
]
}
}
4. 데이터 삭제
1) 특정 문서 삭제 (ID로 삭제)
curl -X DELETE "http://localhost:9200/my_index/_doc/1"
URL 방식 사용 시, Header와 Body는 필요 없다.
🤖 응답 예시
{
"_index": "my_index",
"_id": "1",
"result": "deleted"
}
2) 인덱스 삭제 (모든 데이터 삭제)
curl -X DELETE "http://localhost:9200/my_index"
URL 방식 사용 시, Header와 Body는 필요 없다.
🤖 응답 예시
{
"acknowledged": true
}
이로써 아주 기본적인 엘라스틱서치 활용을 보았다.
더 다양한 활용은 공식문서에 자세히 나와있으니 직접 이것저것 실험해보는 것이 좋겠다.
마지막 3편에서는 드디어, Spring Data Elasticsearch
를 다룬다. 실무에서 사용한 소스코드 일부를 가져와서 보여주도록 하겠다.