이번에 할당받은 프로젝트는 검색엔진 내재화에 필요한 '검색 사전 관리도구' 프로젝트이다. Elasticsearch는 전체 텍스트 검색과 분석 기능을 제공하는 오픈 소스 검색 엔진이다. ES를 사용하여 검색엔진을 구현하는 과정에서 검색 사전 관리도구는 특히 검색 쿼리의 결과를 최적화하고 개선하기 위해 사용자 정의 사전이나 분석기 설정을 관리하는 데 중요하다.
키워드, 동의어, 스톱워드 등의 사전을 관리할 수 있다. 사용자가 직접 텍스트를 입력하거나 파일을 업로드하여 사전을 추가하고, 필요에 따라 수정하거나 삭제할 수 있다.
2-1. 분석기 구성: Elasticsearch는 다양한 내장 분석기를 제공하며, 사용자는 자신의 요구에 맞는 분석기를 선택하고 설정할 수 있다. 사용자 정의 분석기를 생성하여 특정 언어 처리 규칙, 토크나이저, 필터 등을 설정할 수 있다.
2-2. 분석기 테스트: 입력된 텍스트에 대한 분석 결과를 실시간으로 확인할 수 있도록 해, 설정된 분석기의 동작을 테스트하고 결과를 검증할 수 있다.
3-1. 쿼리 실행 및 테스트: 사용자가 작성한 쿼리를 실행하여 실제 Elasticsearch 인덱스에 대한 검색 결과를 확인할 수 있다. 이를 통해 사전과 분석기 설정의 효과를 직접 확인할 수 있다.
4-1. 인덱스 설정 및 최적화: 인덱스 생성, 삭제, 매핑 설정 변경 등 인덱스 관리 기능을 제공한다. 특히, 사전이나 분석기 설정 변경 후 인덱스를 재구성할 필요가 있을 때 유용하다.
5-1. 웹 기반 인터페이스: 사용자가 웹 브라우저를 통해 쉽게 사전 및 분석기 설정을 관리할 수 있도록 하는 사용자 친화적인 인터페이스를 제공한다.
5-2. 대시보드 및 리포팅: 설정 변경, 검색 결과, 인덱스 성능 등을 모니터링하고 리포팅할 수 있는 대시보드 기능을 포함한다.
아래의 파일을 docker-compose.yml
으로 만든 뒤 docker-compose up
명령어를 실행한다.
version: '3.6'
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.2
container_name: es01
environment:
- node.name=es01
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms1g -Xmx1g"
- discovery.type=single-node
- xpack.security.enabled=false
- http.cors.enabled=true
- http.cors.allow-origin="*"
- http.cors.allow-methods=OPTIONS,HEAD,GET,POST,PUT,DELETE
- http.cors.allow-headers=X-Requested-With,Content-Type,Content-Length,Authorization
- http.cors.allow-credentials=true
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data01:/home/search/elastic_workspace
ports:
- 9200:9200
- 9300:9300
networks:
- elastic
kibana:
image: docker.elastic.co/kibana/kibana:8.12.2
container_name: kibana
ports:
- 5601:5601
environment:
- ELASTICSEARCH_HOSTS=["http://es01:9200"]
depends_on:
- es01
networks:
- elastic
volumes:
data01:
driver: local
networks:
elastic:
driver: bridge
'3.6'은 사용 중인 Docker Compose 파일의 버전을 나타낸다.
이 파일은 두 개의 주요 서비스, es01 (Elasticsearch)와 kibana (Kibana)를 정의하고 있다.
3-1. image: 사용할 Elasticsearch의 Docker 이미지와 태그이다. 여기서는 elasticsearch:8.12.2를 사용한다.
3-2. container_name: 컨테이너의 이름을 es01로 설정한다.
3-3. environment: Elasticsearch 인스턴스의 환경 변수 설정:
node.name=es01: 노드의 이름을 es01로 설정한다.
bootstrap.memory_lock=true: 메모리 스와핑을 방지한다.
ES_JAVA_OPTS: Java 옵션으로 초기 및 최대 힙 메모리 크기를 1GB로 설정한다.
discovery.type=single-node: 단일 노드 클러스터로 설정, 클러스터링을 사용하지 않는다.
xpack.security.enabled=false: X-Pack 보안 기능을 비활성화한다.
http.cors.enabled 및 관련 CORS 설정: 다양한 출처에서의 HTTP 요청을 허용한다.
3-4. ulimits: 메모리 락 관련 제한 설정.
3-5. volumes: 호스트와 컨테이너 간에 볼륨을 마운트하여 데이터를 영구적으로 보존한다.
3-6. ports: 호스트와 컨테이너 간 포트 매핑. 9200은 HTTP 통신, 9300은 노드 간 통신용이다.
3-7. networks: elastic 네트워크에 연결한다.
4-1. image: 사용할 Kibana의 Docker 이미지와 태그이다. 여기서는 kibana:8.12.2를 사용한다.
4-2. container_name: 컨테이너의 이름을 kibana로 설정한다.
4-3. ports: 5601 포트를 매핑하여 Kibana 접근을 허용한다.
4-4. environment: Kibana가 Elasticsearch 서비스를 찾을 수 있도록 환경 변수를 설정한다.
4-5. depends_on: Kibana가 Elasticsearch 서비스 es01에 의존하며, es01이 먼저 시작된 후에 Kibana가 시작되도록 한다.
4-6. networks: elastic 네트워크에 연결한다.
5-1. data01: Elasticsearch 데이터 저장을 위한 볼륨을 정의하고, 로컬 드라이버를 사용하여 관리한다.
6-1. elastic: 컨테이너 간 통신을 위해 브리지 드라이버를 사용하는 사용자 정의 네트워크를 설정한다.
ES7버전 이후부턴 ElasticSearch의 보안이 강화되어 username과 password를 꼭 입력해야한다. 하지만 docker-compose파일의 ES설정에서 xpack.security.enabled=false
옵션을 준다면 username과 password를 입력하지 않아도 된다. 이는 로컬 개발환경에선 별다른 보안이 필요없기때문에 설정한 옵션이다.
또, http.cors.allow-origin="*"
옵션을 설정하여 로컬 개발 환경에서의 CORS에러가 발생하지 않도록 했다.
로컬 개발환경에서 검색 사전을 실험해보기 위해 ElasticSearch와 Kibana를 Docker 환경에서 실행했다. Kibana를 ElasticSearch와 함께 설치한 이유는 다음 글에서 적을 예정이다.
Docker를 사용하지 않고 ElasticSearch와 Kibana를 직접 로컬에 설치한다면 JVM과 Node.js부터 시작해서 ElasticSearch와 Kibana의 실행에 필요한 모든 것들을 설치해야하지만, Docker의 image를 사용해 쉽게 실행할 수 있었다.