# Elasticsearch
- [[ES Query String]]
- [[Elasticsearch Getting Started]]
- [[kibana]]
### 도큐먼트에서 텍스트 추출
도큐먼트에서 텍스트를 추출하는 데 특화된 라이브러리인 [[open:아파치 티카]]를 첨부 플러그인이 내부적으로 사용한다.
첨부 파일 필드는 아파치 티카의 메타데이터와 텍스트 추출기가 처리한 base64바이너리 스트림을 받는다.
이 필드는 하위 필드에 여러 내용을 저장하는 다중 필드처럼 보일 수 있다.
- file: 파일의 본문을 저장한다.
- date: 티카의 메타데이터가 추출한 파일 생성일을 저장한다.
- author: 티가의 메타데이터가 추출한 파일의 저자를 저장한다.
- keywords: 티카의 메타데이터가 추출한 파일의 키워드를 저장한다.
- content\_type: 파일의 본문 타입을 저장한다.
- title: 티카의 메타데이터가 추출한 파일의 제목을 저장한다.
### 기본 타입 매핑하기
매핑을 세밀하게 조정하면, 다음과 같은 장점이 있다.
- 디스크의 색인 크기가 줄어든다 (사용자 정의 필드의 기능을 비활성화)
- 관심 있는 필드만 색인한다 (일반적인 성능 향상)
- 빠른 검색 또는 (집계 같은) 실시간 분석을 위해 데이터를 미리 색인한다.
- 필드를 다중 토큰에서 분석해야 할지 또는 필드를 하나의 토큰으로 분석할지 여부를 올바로 정의한다.
### 색인 생성하기
일래스틱서치는 색인 이름을 저장소의 디렉토리로 매핑한다.
curl -XPUT http://127.0.0.1:9200/myindex -d '{
"settings": {
"index": {
"number_of_shards": 2,
"number_of_replicas": 1
}
}
}'
정상 동작, 리턴
{"acknowledged": true}
색인이 이미 존재한다면, 400 에러를 리턴
{
"error": "IndexAleardyExistsException[[myindex] Already exists]",
"status": 400
}
### 색인 삭제하기
색인의 삭제는 샤드, 매핑, 데이터를 삭제하는 것을 의미한다. 다음처럼 색인을 삭제해야 하는 일반적인 시나리오가 있다.
- 원하지 않거나 불필요한 데이터를 지우기 위해 색인 삭제하기 (예를 들어, 오래도니 로그스태시 색인)
- 테스트용 재시작 스크립트를 위한 색인 재설정하기
- 실패로 인해 데이터가 손실됐을 때, 클러스터를 올바른 상태로 되돌리기 위해 샤드의 색인 삭제하기
색인을 삭제하면, 색인과 관련된 모든 데이터가 디스크에서 제거되고 사라진다.
색인 삭제 시 샤드가 저장소에서 삭제되면 먼저 클러스터가 변경된다. 재귀적으로 삭제하는 파일시스템 구현 때문에 일래스틱서치 삭제 자업은 빠르다.
백업이 없다면, 삭제된 색인은 복원할 수 없다.
### 색인 열고 닫기
curl -XPOST http://127.0.0.1:9200/myindex/_close
curl -XPOST http://127.0.0.1:9200/myindex/_open
색인을 닫아야 하는 시나리오는 다음과 같다.
- 일부 날짜 기반 색인을 닫는다. 예를 들어 여러 색인을 온라인(최근 2달 동안)과 오프라인(2~6달)으로 유지하고 싶다면, 한 달, 한 주, 하루 동안으로 색인을 유지한다.
- 클러스터에서 열려 있는 모든 색인을 검색할 수 있지만, 일부 색인은 검색되지 않게 하고 싶다(이 경우에는 앨리어스를 사용하는 것이 가장 좋은 방법이지만, 색인을 닫아 못 쓰게 할 수도 있다.)
### 색인에 매핑 저장하기
curl -XPOST 'http://localhost:9200/myindex/_mapping' -d '{
"properties": {
...
}
}'
### 매핑 얻기
- http://server/\_mapping
- http://server/index\_name/\_mapping
- http://server/index\_name/type\_name/\_mapping
리턴된 매핑은 축소된 형태로서, 필드의 기본값은 리턴하지 않는다.
매핑 질의는 다음과 같은 여러 목적으로 쓰인다.
- 템플릿 레벨로 매핑할 때 디버깅하기
- 필드를 묵시적인 매핑으로 추측해 올바르게 파생됐는지 확인하기
- 타입과 관련된 정보를 저장하기 위해 매핑의 메타데이터를 얻기
- 매핑이 올바른지 간단하게 확인하기
### 매핑 삭제하기
매핑 삭제는 파괴적인 작업이며, 데이터 손실을 방지하도록 주의를 기울여 작업한다.
매핑 삭제가 필요한 시나리오는 다음과 같다.
- 사용하지 않는 타입: 데이터를 깨끗이 하기 위해 매핑을 삭제한다.
- 잘못된 매핑: 매핑을 변경해야 하지만, 일부 필드를 업그레이드 또는 삭제할 수 없다. 데이터를 백업하고 새로운 매핑을 생성한 후 백업에서 데이터를 읽는다.
- 타입의 빠른 정리: 매핑을 삭제하고 다시 생성할 수 있다.
### 색인 새로 고치기
curl -XPOST 'http://localhost:9200/myindex/_refresh'
## health
http://[URL]:[PORT]/_cat/indices?v&s=index
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open [index] [uuid] 1 1 2 0 10.6kb 10.6kb
## 모든 doc 조회
http://URL/INDEX/_search?pretty=true&q=*:*
## search query
http://[URL]:[PORT]/[INDEX]/_search?pretty
{
"from": 0,
"size": 1000,
"sort": [
{
"updated_at": {
"order": "asc"
}
}
],
"query": {
"match": {
"search": {
"query": "스커트 타임",
"fuzziness": "AUTO"
}
}
}
}
## count
http://[URL]:[PORT]/[INDEX]/_count?
{
"count": 34384,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
}
}
## ES와 RDBMS
^ ES ^ RDBMS ^
| Index | Database |
| Shard | Partition |
| Type | Table |
| Document | Row |
| Field | Column |
| Mapping | Schema |
| Query DSL | SQL |
[[Elastic Search]]는 기본적으로 [[http]]프로토콜로 접근
^ ES HTTP Method ^ RDBMS SQL ^
| GET | SELECT |
| PUT | INSERT |
| POST | UPDATE, SELECT |
| DELETE | DELETE |
| HEAD (인덱스 정보확인) | |
## ES의 특징
### 장점
- 오픈소스 검색엔진
- 전문검색
- 통계 분석
- Schemaless
- RESTful API
- Multi-tenancy
- Document-Oriented
- [[Inverted Index]] 역색인
- 확장성
### 단점
- 완전 실시간은 아니다.
- Transaction Rollback을 지원하지 않는다.
- 데이터의 업데이트를 제공하지 않는다.