[Database] Elasticsearch (2)

Bzeromo·2025년 3월 7일
0

DB

목록 보기
7/8
post-thumbnail

⚡ Spring Data Elasticsearch (2)


📌 두번째 포스팅에선...

🔷 엘라스틱서치 사용법에 대해 알아본다.


📌 Elasticsearch 사용하기

⭐ 서버 열기

Docker를 이용해 서버를 열 것이니 Docker 다운로드 및 실행은 필수적이다.

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로 삭제는 똑같다고 보면 되고 하나 조금 다른게 있다면 PUTPOST이다.
데이터 수정은 _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를 다룬다. 실무에서 사용한 소스코드 일부를 가져와서 보여주도록 하겠다.

profile
Hodie mihi, Cras tibi

0개의 댓글