검색엔진 스터디

01장 검색 시스템 이해하기

막이86 2023. 11. 8. 16:54
728x90

엘라스틱서치 실무 가이드 1장을 요약한 내용입니다.

1.1 검색 시스템의 이해

1.1.1 검색 시스템이란?

  • 검색엔진(Search Engine)
    • 웹에서 정보를 수집해 검색 결과를 제공하는 프로그램
    • 검색엔진은 검색 결과로 제공되는 데이터의 특성에 따라 구현 형태가 각각 달라진다.
  • 검색 시스템(Search System)
    • 대용량 데이터를 기반으로 신뢰성 있는 검색 결과를 제공하기 위해 검색엔진을 기반으로 구축된 시스템을 통칭
    • 수집기를 이용해 데이터를 수집하고 다수의 검색엔진을 이용해 색인하고 검색 결과를 UI로 제공
    • 시스템 내부의 정책에 따라 관련도가 높은 문서의 검색 결과의 상위에 배치할 수 있다.
    • 특정 필드나 문서에 가중치를 둬서 검색의 정확도를 높일수 있다.
  • 검색 서비스(Search Service)
    • 검색엔진을 기반으로 구축한 검색 시스템을 활용해 검색 결과를 서비스로 제공
  • 엘라스틱서치는 엄밀히 말하면 검색엔진이다.
  • 검색 서비스를 제공하기 위해 엘라스틱서치를 이용해 검색 시스템을 구축할 것

1.1.2 검색 시스템의 구성 요소

  • 수집기
    • 웹사이트, 블로그, 카페 등 웹에서 필요한 정보를 수집하는 프로그램
      • 크롤러, 스파이더, 웜, 웹 로봇 등으로 불리운다.
    • 웹상의 대부분의 정보가 수집 대상이다.
  • 스토리지
    • 데이터베이스에서 데이터를 저장하는 물리적인 저장소
    • 색인한 데이터를 스토리지에 보관
  • 색인기
    • 검색엔진이 수집한 정보에서 사용자 질의와 일치하는 정보를 찾으려면 수집된 데이터를 검색 가능한 구조로 가공하고 저장해야 한다.
    • 색인기는 다양한 형태소 분석기를 조합해 정보에서 의미가 있는 용어를 추출하고 검색에 유리한 역색인 구조로 데이터를 저장
  • 검색기
    • 사용자의 질의를 받아 색인기에서 저장한 역색인 구조에서 일치하는 문서를 찾아 결과로 반환
    • 질의와 문서가 일치하는지는 유사도 기반의 검색 순위 알고리즘으로 판단
    • 색인기와 마찬가지로 형태소 분석기를 이용해 사용자 질의에서 유의미한 용어를 추출해 검색
    • 사용하는 형태소 분석기에 따라 검색 품질이 달라진다

1.1.3 관계형 데이터베이스와 차이점

  • 데이터 베이스
    • 데이터베이스는 데이터를 통합 관리하는 데이터의 집합
    • 모든 데이터는 중복을 제거하고 정형 데이터로 구조화해 행과 열로 구성된 테이블에 저장
    • SQL문을 이용해 원하는 정보의 검색이 가능한데 텍스트 매칭을 통한 단순한 검색만 가능
    • 텍스트를 여러 단어로 변형하거나 여러 개의 동의어나 유의어를 활용한 검색은 불가능
  • 검색엔진
    • 데이터베이스에서 불가능한 비정형 데이터를 색인하고 검색할 수 있다.
    • 형태소 분석을 통해 사람이 구사하는 자연어의 처리가 가능해지고 역색인 구조를 바탕으로 빠른 검색 속도를 보장
  • 엘라스틱서치는 기본적으로 HTTP를 통해 JSON 형식의 RESTful API를 이용HTTP 메서드(엘라스틱서치) 기능 데이터베이스
    GET 데이터 조회 SELECT
    PUT 데이터 생성 INSERT
    POST 인덱스 업데이트, 데이터 조회 UPDATE, SELECT
    DELETE 데이터 삭제 DELETE
    HEAD 인덱스의 정보 확인  
  • HEAD 메서드를 이용해 특정 문서의 정보 유무를 확인할 수 있다.
  • 엘라스틱서치를 사용하기 위한 간단한 API 요청 구조
  • curl -X(메서드) <http://host>:port/(인덱스)/(타입)/(문서ID) -d `{json 데이터}`
  • 데이터 조회 방법
    • 데이터베이스에서 ‘가마돈’이라는 사용자 조회
    • SELECT * FROM USER WHERE Name like '%가마돈%'
    • 엘라스틱서치에서 ‘가마돈’이라는 사용자 조회
    • GET <http://localhost:9200/uesr/_serch?q=Name:가마돈>
  • 데이터 조회시 영문으로 저장되어 있다면 다른 결과가 나올수가 있다.
    • ‘가마돈’ → ‘Gamadon’ 경우 WHERE 절에 ‘%Garadon%’라고 대소문자를 명확히 입력해야 가능
    • 검색엔진의 경우 좀더 유연하게 대응이 가능
      • 역색인된 문자열 전체를 정책에 따라 소문자 혹은 대문자로 생성하고 쿼리가 들어오는 필터를 색인 시간에 동일하게 지정한다면 해당하는 쿼리에 어떻한 문자열이 들어와도 검색이 가능
  • 구조화되지 않은 비정형 데이터도 검색이 가능해진다.

1.2 검색 시스템과 엘라스틱서치

  • 엘라스틱서치도 NoSQL의 일종으로서 분류가 가능
  • 분산 처리를 통해 실시간에 준하는 빠른 검색이 가능
  • 데이터베이스로 처리하기 어려운 대량의 비정형 데이터도 검색 가능
  • 전문(Full Text) 검색과 구조 검색 모두를 지원
  • 검색엔진이지만 대용량 스토리지로도 활용 가능

1.2.1 엘라스틱서치가 강한 이유

  • 오픈소스 검색엔진
    • 루씬을 기반으로 개발된 오픈소스 검색엔진
    • 2억 5천만번 이상 다운로드
    • 프로젝트가 많이 활성화 되어 있음
  • 전문 검색
    • 엘라스틱서치는 고차원적인 전문 검색(Full Text)이 가능
    • 전문 검색이란 내용 전체를 색인해서 특정 단어가 포함된 문서를 검색하는 것을 말한다
    • 엘라스틱서치는 다양한 기능별, 언어별 플러그인을 조합해 빠르게 검색할 수 있다.
  • 통계 분석
    • 비정형 로그 데이터를 수집하고 한곳에 모아 통계분석을 할 수 있다.
    • 엘라스틱서치와 키바나를 연결하면 실시간으로 쌓이는 로그를 시각화하고 분석할 수 있다.
  • 스키마리스
    • 정형화되지 않은 다양한 형태의 문서도 자동으로 색인하고 검색할 수 있다.
  • RESTfull API
    • HTTP기반의 RESTful API를 지원하고 요청뿐 아니라 응답에도 JSON 형식을 사용
    • 개발 언어, 운영체제, 시스템에 관계 없이 이기종 플랫폼에서도 이용 가능
  • 멀티테넌시(Multi tenancy)
    • 서로 상이한 인덱스일자라도 검색할 필드명만 같으면 여러 개의 인덱스를 한번에 조회 가능
  • Document-Oriented
    • 여러 계층의 데이터를 JSON 형식의 구조화된 문서로 인덱스에 저장할 수 있다.
    • 계증 구조로 문서도 한번의 쿼리로 쉽게 조회할 수 있다.
  • 역색인
    • 엘라스틱서치는 역색인을 지원한다.
    • MongoDB, 카산드라 같은 일반적인 NoSQL은 역색인을 지원하지 않음
    • 다른 NoSQL 대비 엘라스틱서치의 매우 큰 장점
  • 확장성과 가용성
    • 엘라스틱서치를 분산 구성해서 확장한다면 대량의 문서를 좀 더 효율적으로 처리할 수 있다.
    • 분산 환경에서 데이터는 샤드라는 작은 단위로 나뉘어 제공
    • 인덱스를 만들 때마다 샤드의 수를 조절할 수 있다.

1.2.2 엘라스틱서치의 약점

  • ‘실시간’이 아니다.
    • 색인된 데이터는 통상적으로 1초 뒤에나 검색이 가능해진다.
    • 색인된 데이터는 내부적으로 커밋과 플러시 같은 복잡한 과정을 거치기 떄문에 실시간이 아니다
    • 준 실시간이라고 할 수 있다.
  • 트랜잭션과 롤백 기능을 제공하지 않는다.
    • 전체적인 클러스터의 성능 향상을 위해 시스템적으로 비용 소고가 큰 롤백과 트랜잭션을 지원하지 않기 때문에 최악의 경우 데이터 손실의 위험이 있다.
  • 데이터의 업데이트를 제공하지 않는다.
    • 업데이트 명령이 요청될 경우 기존 문서를 삭제하고 변경된 내용으로 새로운 문서를 생성하는 방식을 사용
    • 단순 업데이트에 비해 상대적으로 많은 비용이 발생
    • 단, 불변적이라는 이점을 취할 수 있다.

1.3 실습 환경 구축

엘라스틱서치 실행

$ docker pull elasticsearch:6.4.3
$ docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --name elasticsearchTest elasticsearch:6.4.3 -v /Users/chihwan/Downloads/elastic-book-snapshot-master:/es/book_backup 

// 예제 코드 추가 
$ docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -v /Users/chihwan/Downloads/elastic-book-snapshot-master:/usr/share/elasticsearch/data/es/book_backup --name elasticsearchTest docker.elastic.co/elasticsearch/elasticsearch:6.4.3

http://localhost:9200/ 호출

  • cluster_name은 엘라스틱서치 클러스터를 구분하는 중요한 속성
    • 이름이 같으면 충돌할 수 있으므로 반드시 수정해야 한다.
{
  "name" : "d4585ae638e2",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "WWmF3u1ZSBysWjic675zhw",
  "version" : {
    "number" : "7.17.13",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "2b211dbb8bfdecaf7f5b44d356bdfe54b1050c13",
    "build_date" : "2023-08-31T17:33:19.958690787Z",
    "build_snapshot" : false,
    "lucene_version" : "8.11.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

설정 파일 수정

  • config/elasticserch.yml 파일에서 수정
    • cluster.name: "javacafe-cluster"
    • node.name: “javacafe-node1"
      • 엘라스틱서치 노드명을 설정
    • path.data
      • 인덱스 경로를 지정
        • 설정하지 않으면 기본적으로 엘라스틱서치 하위의 data 디렉터리에 인덱스가 생성
    • path.logs
      • 노드와 클러스터에서 생성되는 로그를 저장할 경로를 지정
        • 기본경로는 /path/to/logs
    • path.repo: [
      • 엘라스틱서치 인덱스를 백업하기 위한 스냅숏의 경로를 지정
      • 예제로 제공되는 스냅숏의 경로를 지정하자
    • network.host: 0.0.0.0
      • 특정 IP만 엘라스틱서치에 접근하도록 허용할 수 있다.
      • 선택적으로 IP를 허용해야하는 경우 [1.1.1.1, 2.2.2.2]와 같이 지정
      • 모든 IP를 허용한다면 0.0.0.0
      • 127.0.0.1을 설정하면 개발모드에서 프로덕트 모드로 자동으로 변경된다.
    • http.port: 9200
      • 서버에 접속할수 있는 포트
      • 기본값은 9200
    • transport.tcp.port
      • 엘라스틱서치 클라이언트가 접근할 수 있는 TCP 포트
      • 기본값은 9300
    • discovery.zen.ping.unicast.hosts
      • 노드가 여러개인 경우 유니캐스트로 활성화된 다른 서버를 찾는다.
      • 클러스터로 묶인 노드의 IP를 지정하면된다.
    • discovery.zen.minimum_master_nodes
      • 마스터 노트의 선출 기준이 되는 노드의 수를 지정한다.
    • node.master: true
      • 마스터 노드로 동작여부를 지정
    • node.data: true
      • 데이터 노드로 동작여부를 지정
cluster.name: "javacafe-cluster"
node.name: "javacafe-node1"
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
node.master: true
node.data: true
path.repo: ["/usr/share/elasticsearch/data/es/book_backup/search_example", "/usr/share/elasticsearch/data/es/book_backup/agg_example"]

도커에서 설정파일 변경 방법

$ docker ps
CONTAINER ID   IMAGE                                                 COMMAND                  CREATED          STATUS         PORTS                                            NAMES
647bee871ade   docker.elastic.co/elasticsearch/elasticsearch:6.4.3   "/usr/local/bin/dock…"   11 seconds ago   Up 7 seconds   0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   elasticsearchTest

$ docker exec -it 647bee871ade /bin/bash
$ vi config/elasticsearch.yml

vi가 없는 경우 
$ apt-get update
$ apt-get install vim

도커 재시작
$ docker container restart 647bee871ade

도커 내부에서 파일 다운로드 
curl -O <https://github.com/javacafe-project/elastic-book-snapshot/archive/refs/heads/master.zip>

http://localhost:9200/ 호출

{
  "name" : "d4585ae638e2",
  "cluster_name" : "javacafe-cluster",
  "cluster_uuid" : "WWmF3u1ZSBysWjic675zhw",
  "version" : {
    "number" : "7.17.13",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "2b211dbb8bfdecaf7f5b44d356bdfe54b1050c13",
    "build_date" : "2023-08-31T17:33:19.958690787Z",
    "build_snapshot" : false,
    "lucene_version" : "8.11.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

예제 데이터

  • 에제 인덱스 스냅숏

https://github.com/javacafe-project/elastic-book-snapshot

  • 예제 프로젝트

https://github.com/javacafe-project/elastic-book

search_example 디렉터리 데이터를 활성화

PUT /_snapshot/javacafe HTTP/1.1
Host: localhost:9200
Content-Type: application/json
Cookie: JSESSIONID=AD2B3C365C0D6C662D6D42645B2382A8
Content-Length: 153

{
    "type": "fs",
    "settings": {
        "location": "/usr/share/elasticsearch/data/es/book_backup/search_example",
        "compress": true
    }
}

 

728x90

'검색엔진 스터디' 카테고리의 다른 글

07장 한글 검색 확장 기능  (1) 2023.11.08
05장 데이터 집계  (3) 2023.11.08
04장 데이터 검색  (1) 2023.11.08
03장 데이터 모델링  (1) 2023.11.08
02장 엘라스틱서치 살펴보기  (4) 2023.11.08