루씬(Lucene) 검색 엔진의 구조 (FST, Burst Trie, 역 인덱스)
·
ElasticSearch
ElasticSearch는 아파치 루씬(Apache Lucene)이라는 검색 엔진 라이브러리를 활용해 분산 환경에서의 고성능 검색 기능을 제공한다.고성능 검색 기능은 루씬(Lucene)의 저수준 API를 조립해 REST API로 제공하는 것인데, 루씬은 어떤 방식을 사용하길래 대용량 데이터를 디스크에서 빨리 읽을 수 있는 걸까? 루씬의 구조를 파악해 보자.사전 지식 1. 역 인덱스역 인덱스는 위의 이미지처럼 Hash Table로 되어있지 않지만 단어(Term)로 문서의 아이디를 찾을 수 있는 자료구조라고 이해하자.사전 지식 2. 루씬은 최소 단위로 세그먼트를 사용한다.루씬(Lucene)은 색인의 최소 단위로 세그먼트(segment)를 사용한다. 다시 세그먼트는 여러 문서(Document)로 되어있는데,..
ElasticSearch 역 인덱스(Inverted Index)
·
ElasticSearch
Token, TokenizingTokenizing: 문서(document)에 포함된 텍스트를 특정 기준(예시에선 공백)으로 나누는 것을 말한다.Token(또는 Term): 토크나이징에 의해 나눠진 문자열 덩어리 하나를 토큰(또는 Term)이라고 부른다.Inverted Index위의 설명에서 1번 문서(Document 1)에 포함된 "Hello I am yelly"를 토크나이징한 결과가 "Hello", "I", "am", "yelly"라는 토큰으로 분리되었다. 마찬가지로 2번 문서(Document 2)에 포함된 "Hello You are jelly" "Hello", "You", "are", "jelly"라는 토큰으로 분리되었다. 색인이때 토큰과 문서 정보(Document ID)를 매핑해서 저장한 자료구조..
ElasticSearch 7.8부터 사용하는 Index template과 Component template
·
카테고리 없음
2025.01.10 - [ElasticSearch] - ElasticSearch 클러스터 설정과 인덱스 설정 변경하기 ElasticSearch 클러스터 설정과 인덱스 설정 변경하기클러스터 API설정 변경ElasticSearch 클러스터의 설정은 클러스터 API인 `/_cluster/settings`로 변경할 수 있습니다.클러스터 API는 클러스터 전체에 설정을 적용할 때 사용하는데, 아래 예시처럼 `persistentdev-gallery.tistory.com이전 포스팅에서 살펴봤던 인덱스 설정은 API를 통해 변경했습니다.만약 인덱스가 생성될 때마다 API를 통해 설정하려면 꽤나 번거롭습니다.ElasticSearch는 이 번거로움을 해결하기 위해 template API를 제공하는데요, 기존 templat..
ElasticSearch Cluester API & Index API - 클러스터 설정과 인덱스 설정 변경하기
·
ElasticSearch
클러스터 API설정 변경ElasticSearch 클러스터의 설정은 클러스터 API인 `/_cluster/settings`로 변경할 수 있습니다.클러스터 API는 클러스터 전체에 설정을 적용할 때 사용하는데, 아래 예시처럼 `persistent`, `transient` 필드를 포함해 JSON 포맷으로 요청을 보냅니다. (두 필드 중 하나만 입력할 수 있습니다.)PUT /_cluster/settings{ "persistent": { "cluster.routing.allocation.node_concurrent_recoveries": 4 # 동시에 복구할 노드 수 }, "transient": { "cluster.routing.allocation.enable": "new_primaries" #..
ElasticSearch 샤드 배치 방식 변경하기
·
ElasticSearch
샤드 배치는 대부분 ElasticSearch가 알아서 해줍니다.하지만 unassinged 샤드가 발생해서 5회 이상 재할당이 실패한 경우 더 이상 자동으로 할당이 되지 않습니다. 또 다른 상황으로 마이그레이션을 할 때 샤드를 다른 노드로 배치해야 하는 경우도 있습니다. 이런 상황에서 샤드 배치 방식을 수동으로 변경해야 하는데, 그 방법에 대해 알아보겠습니다. 샤드 배치 명령어샤드를 배치하는 방법은 4가지가 있습니다.`reroute`: 샤드 하나를 특정 노드에 배치`allocation`: 샤드 배치 방식을 클러스터 전체에 적용`rebalance`: 샤드 재분배 방식을 클러스터 전체에 적용`filtering`: 특정 조건에 해당하는 샤드들을 특정 노드에 배치이 중에서 샤드 하나를 특정 노드에 배치하는 `re..
ElasticSearch 클러스터 설정 톺아보기
·
ElasticSearch
ElasticSearch 기본 환경 설정클러스터의 환경 설정은 `elasticsearch.yml` 파일로 할 수 있습니다.Cluster 영역클러스터 내의 모든 노드들은 동일한 클러스터의 이름을 사용하는데, 그 이름을 설정합니다.설정하면 클러스터 전체에 적용됩니다.cluster.name: myCluserName- 아무 값도 설정하지 않으면 `elasticsearch`라는 이름으로 설정됩니다.Node 영역해당 노드에만 적용되는 설정입니다.node.name: myNode1노드의 이름은 클러스터 내에서 유니크해야 합니다.7.x 버전부터 기본값으로 `${HOSTNAME}`을 사용합니다.Path 영역데이터와 로그를 저장하는 위치를 설정할 수 있습니다.이 위치 설정 값이 없으면 ElasticSearch가 실행되지 않..
ElasticSearch 기본 개념
·
ElasticSearch
클러스터와 노드클러스터는 여러 대의 컴퓨터나 구성 요소를 논리적으로 연결한 전체를 하나인 것처럼 사용하게 하는 기술을 말합니다.ElasticSearch 클러스터여러 ElasticSearch 프로세스들을 논리적으로 연결해 하나의 프로세스처럼 사용하게 하는 기술고유한 클러스터 이름과 `UUID`를 갖는다.노드클러스터를 구성하는 하나의 ElasticSearch 프로세스고유한 노드 이름과 `UUID`를 갖는다.(노드 이름을 설정하지 않으면 7.x 부터 `${HOSTNAME}`을 사용. 이전 버전은 랜덤 값 사용)클러스터 내에서 서로 동일한 클러스터의 이름을 인식한다.위 그림의 각 노드들은 하나의 ElasticSearch로 동작하기 때문에 어떤 노드에 요청을 보내더라도 동일한 응답과 응답 속도를 보장받을 수 있습..
bulk API 수행 시 'Malformed content, found extra data after parsing: START_OBJECT' 에러 해결하는 방법
·
ElasticSearch
환경- OS: macOS m1- ElasticSearch version: `8.16.2` (Docker Image: `elasticsearch:8.16.2`)문제 발생인덱싱하려는 JSON 파일{"index": {"_id" : "1"}}{"title": "Kubernetes: Up and Running", "reviews": 10, ...생략 }{"index": {"_id" : "2"}}{"title": "Cloud Native Java", "reviews": 33, ...생략 }... 생략 인덱싱하려는 JSON 파일은 아래 ElasticSearch 공식 문서에 있는 형식을 지켰습니다. 공식 문서에 나와있는 입력 형태action_and_meta_data\noptional_source\naction_and_..