1

Gilliam·2019년 10월 23일
0

http://www.yes24.com/Product/Goods/71893929?Acode=101

텍스트 추가엘라스틱서치 실무 가이드이미지 썸네일 삭제엘라스틱서치 실무 가이드
『엘라스틱서치 실무 가이드』는 오픈소스 검색엔진의 대표 주자인 엘라스틱서치에 대한 전반적인 내용을 다룬다. 하지만 단순히 엘라스틱서치의 기능을 단편적으로만 설명하고 끝내는 것이 아니라 한국 검색 시장에 맞게 한글 형태소 분석기를 이용하는 방법이나 한글 자동완성 구현 원리, 대용량 클러스터 운영을 위한 노하우까지도 아낌없이 설명하려고 노력했다. 이 책을 통해...

www.yes24.com

텍스트 추가
해당 포스팅은 '엘라스틱서치 실무 가이드('권택환, 김동우, 김흥래, 박진현, 최용호, 황희정 저', 위키북스)'을 스터디하며 정리한 내용입니다.

이 책은 Elasticsearc 6.4.3(Service release: November 6, 2018 https://www.elastic.co/guide/en/cloud/current/ec-release-notes-2018-11-06.html) 버전에 맞춰 쓰여진 책으로, 해당 포스팅이 작성된 시점 ( October 22, 2019 ) 에는 이미 Elasticsearc 7.4.0 (Service release: October 1, 2019 ) 버전이 릴리즈 되었으며, 관련한 변경내용은 엘라스틱 코리아의 김종민님의 블로그 포스팅 ( http://kimjmin.net/2019/04/2019-04-elastic-stack-7-release/ "Elastic Stack 7.0 출시 밎 지금까지의 변경들 - 지금까지 출시되었던 Elastic Stack 의 내용과 변경점들을 살펴봅니다. 특히 7.0부터 사라진 type 구조에 대해 자세히 설명합니다.")을 참고 하시면 도움이 될 겁니다.

텍스트 추가
텍스트 추가
02장 엘라스틱서치 살펴보기.

텍스트 추가

엘라스틱 서치? 아파치 루씬 기반의 검색엔진으로 실시간에 가까운 전문 검색(Full Text Search)(1), 멀티테넌시 지원의 특징을 가지며, NoSQL 저장소 역할을 담당. 단순 검색엔진뿐만 아니라, 데이터 수집,저장, 분석, 시각화까지 하는 데이터 분석 도구로 주목받는 중.

02장에서 다룰 내용

2.1 엘라스틱서치를 구성하는 개념

2.2 엘러스틱서치에서 제공하는 주요 API

텍스트 추가

텍스트 추가
2.1 엘라스틱서치를 구성하는 개념

텍스트 추가
엘라스틱서치 (이하 ES)는 기본적으로 분산시스템을 지향함. 엘라스틱서치의 주요 구성요소로 어떤 것이 있으며 이를 통해 다양한 개념을 알아볼 것

텍스트 추가대표사진 삭제
사진 설명을 입력하세요.

텍스트 추가
위의 그림처럼 크게 1. 인덱스, 2. 타입(7.0버전 부터 사라짐), 3. 도큐먼트, 4. 필드 구조로 되어 있음

텍스트 추가대표사진 삭제
사진 설명을 입력하세요.

텍스트 추가
1.인덱스

인덱스(INDEX)는 데이터 저장 공간, 위 그림에서 나와있는 것 처럼 RDB 구조로 이해하려한다면 DB라고 보면 됨.

하나의 인덱스는 하나의 타입을 가짐(6.0버전부터, 7.0버전 부터는 사라짐)

하나의 물리 노드에 여러 논리 인덱스 생성 가능

검색시, 인덱스 명으로 문서 데이터를 검색, 여러개의 인덱스 동시 검색도 가능

엘라스틱 서치를 분산환경 구성시 하나의 인덱스가 여러 노드에 분산 저장 및 관리 됨

이를 통해 분산 처리의 여러 이점을 누림

인덱스 생성시 기본적으로 5개의 프라이머리 샤드와 1개의 레플리카 샤드 세트를 생성함

각각의 샤드 수는 인덱스 생성시 옵션을 이용하여, 변경 가능

중요 (인덱스 이름은 반드시 소문자)

추가, 수정, 삭제, 검색은 위의 그림처럼 Restful API로 수행 가능

만약 인덱스가 없는 상태에서 데이터가 추가된다면, 데이터를 이용해 인덱스가 자동으로 생성됨

텍스트 추가셀 전체 선택
0열 선택0열 다음에 열 추가
0행 선택0행 다음에 행 추가
열 너비 조절행 높이 조절
https://www.elastic.co/guide/en/elasticsearch/reference/6.4/docs-index_.html

Automatic Index Creationedit

The index operation automatically creates an index if it does not already exist, and applies any index templates that are configured. The index operation also creates a dynamic type mapping for the specified type if one does not already exist. By default, new fields and objects will automatically be added to the mapping definition for the specified type if needed. Check out the mapping section for more information on mapping definitions, and the the put mapping API for information about updating type mappings manually.

Automatic index creation is controlled by the action.auto_create_index setting. This setting defaults to true, meaning that indices are always automatically created. Automatic index creation can be permitted only for indices matching certain patterns by changing the value of this setting to a comma-separated list of these patterns. It can also be explicitly permitted and forbidden by prefixing patterns in the list with a + or -. Finally it can be completely disabled by changing this setting to false.

셀 병합
행 분할
열 분할
너비 맞춤
삭제
텍스트 추가
2. 샤드

인덱싱된 문서는 하나의 인덱스에 담김

인덱스 내부에 인덱싱된 데이터는 물리적인 공간에 여러개의 파티션으로 나뉘어 구성 됨(이유는 하단 참고) 이를 엘라스틱서치에서는 샤드라고 부름.

엘라스틱 서치는 다수의 샤드로 문서를 분산 저장하므로, 데이터 손실 위험을 줄이 수 있음

텍스트 추가셀 전체 선택
0열 선택0열 다음에 열 추가
0행 선택0행 다음에 행 추가
열 너비 조절행 높이 조절
https://www.elastic.co/guide/en/elasticsearch/reference/6.4/getting-started-concepts.html

Shards & Replicas

An index can potentially store a large amount of data that can exceed the hardware limits of a single node. For example, a single index of a billion documents taking up 1TB of disk space may not fit on the disk of a single node or may be too slow to serve search requests from a single node alone.

To solve this problem, Elasticsearch provides the ability to subdivide your index into multiple pieces called shards. When you create an index, you can simply define the number of shards that you want. Each shard is in itself a fully-functional and independent "index" that can be hosted on any node in the cluster.

셀 병합
행 분할
열 분할
너비 맞춤
삭제
텍스트 추가
3. 타입

타입은 인덱스의 논리적은 구조, 인덱스 속성에 따라 분류 하기도 함

  1. 문서

문서는 엘라스틱서치의 데이터 저장 최소 단위, 기본적으로 JSON 포맷으로 저장됨

RDB에서 TABLE의 ROW에 해당함

하나의 문서 = 다수의 필드(RDB에서 TABLE의 COLUMN)로 구성

각 피드는 데이터 타입으로 정의가 되어야함

문서는 Nested Sturuct를 지원라여 문서안에 문서를 Nested하게 저장하는 것도 가능함

  1. 필드

필드는 문서를 구성하기 위한 속성

RDB column은 static한 반면 필드는 more dynamic한 데이터 타입

1개의 필드 = 다수의 데이터 타입을 가질 수 있음

  1. 매핑

매칭은 문서의 필드, 필드의 속성 정의, 이에 따른 색인 방법을 정의하는 프로세스

인덱스의 매피 정보에는 여러가지 데이터 타입 지정은 가능하나, 중복된 필드명 지정은 불가능하다.

텍스트 추가
2.1.2 노드의 종류

텍스트 추가
클러스터 = 물리적인 노드 인스턴스의 모임 , 모든 노드의 검색과 색인 작업을 관장하는 논리적인 개념

RDB는 모든 요청을 1개의 서버에서 처리 후 결과 제공. BUT! ES는 다수의 서버로 분산 처리가 가능하여, 대용량 데이터를 처리 할 수 있음.

분산처리를 위해, 다양한 형태의 노드들을 조합하여 클러스터를 구성해야함 (기본적으로 마스터 노드가 전체적인 클러스터 관리, 데이터 노드가 실제 데이터를 관리함)

ES는 각 설정에 따라 4가지 유형의 노드를 제공(아래 사진 참고)

텍스트 추가대표사진 삭제
사진 설명을 입력하세요.

텍스트 추가
설계 형태에 따라, 각 노드는 한 가지 타입 혹은 여러 타입을 겸할 수 있음

(1) 마스터 노드

인덱스 생성, 삭제 등 클러스터의 전반적인 작업 담당.

따라서 네트워크 속도가 가장 빠르고, 지연이 없는 노드가 되어야 함

다수의 노드를 마스터로 설정할 수 있으나, 결과적으로 하나의 노드가 마스터 노드로 선출되어 동작함(?PRIMARY MASTER? 찾아볼 것)

특정 노드를 마스터 노드 전용으로 셋팅하려면, ES 서버의 CONF 폴더 안의 elasticsearch.yml 파일을 아래와 같이 수정하면 됨

텍스트 추가

# 마스터 노드 전용 구성시 elasticsearch.yml

node.master: true
node.data: false
node.ingest: false
search.remotr.connect: false

'''
cluster.name : 클러스터 이름
node.name : 노드 이름
path.data : 인덱스 경로 지정, 미설정 시에 기본 값은 ES밑 data 디렉토리에 인덱스 생성
path.logs : 로그를 저장할 경로 지정
path.repo : ES 인덱스 백업을 위한 스냅샷의 경로 지정
network.host : 접속 허용할 IP를 설정 / 0.0.0.0 은 모든 접근을 허용 | 127.0.0.1은 개발모드에서 프로덕트 모드로 변경
http.port : 엘라스틱서치 서버에 접근할 수 있는 HTTP API 호출을 위한 포트번호 설정 / 기본 값은 9200
transport.tcp.port : 엘라스틱서치 클라이언트가 접근할 수 있는 TCP 포트, 기본 값은 9300
discovery.zen.ping.unicast.hosts : 노드가 여러개인 경우 유니캐스트로 활성화된 다른 서버를 찾음. 노드의 아이피를 [1.1.1.1, 2.2.2.2]와 같은 형식으로 넣어주면 된다.
discovery.zen.minimum_master_nodes : 마스터 노드의 선출 기준이 되는 노드의 수를 지정.
node.master : 마스터 노드로 동작 여부를 지정 true or false
node.data : 데이터 노드로 동작 여부를 지정 true or false
'''
내용을 입력하세요.
텍스트 추가
(2) 데이터노드

문서가 실제로 저장된(샤드가 배치된) 노드

색인 작업은 컴퓨팅 리소스(CPU,MEMORY, STORAGE 등)를 많이 소모 하므로, 리소스 모니터링이 필요.

기본적으로 데이터 노드와 마스터 노드는 분리하는 게 좋음, 단 규모가 작을 경우 함께 구성해도 상관없음

텍스트 추가
# 데이터 노드 전용 구성시 elasticsearch.yml

node.master: false
node.data: true
node.ingest: false
search.remotr.connect: false
내용을 입력하세요.
텍스트 추가
(3) 코디네이팅 노드

마스터, 데이터, 인제스트 노드의 역할을 하지않고 들어온 요청을 단순히 Round Robin 으로 분산시켜주는 노드.

텍스트 추가
#코디네이팅 노드 전용 구성시 elasticsearch.yml

node.master: false
node.data: false
node.ingest: false
search.remotr.connect: false
내용을 입력하세요.
텍스트 추가
(4) 인제스트 노드

인덱싱 하기 전에 데이터를 전처리 하는 노드.

데이터 포맷을 변경하기 위해, 스크립트로 전처리 파이프 라인을 구성하고 실행할 수 있음

텍스트 추가
#인제스트 노드 전용 구성시 elasticsearch.yml

node.master: false
node.data: false
node.ingest: true
search.remotr.connect: false
내용을 입력하세요.
텍스트 추가

텍스트 추가
2.1.3 클러스터, 노드, 샤드

텍스트 추가
클러스터와 노드의 관계는? 어떻게 묶여있는 걸까? 그림참조

하나의 ES 클러스터에 노드#1, 노드#2로 총 2개의 물리적 노드 존재.

ES는 인덱스의 문서를 조회할 때 마스터 노드를 통해 2개의 노드를 모두 조회 -> 데이터를 취합 -> 취합된 데이터를합쳐 하나의 결과로 제공

그림상 하나의 클러스터이나, 여러개의 클러스터를 연결 구성 하능하며, 이때는 클러스터를 이름으로 각각 구분함

클러스터의 이름이 명시되어 있지 않은 경우, ES 는 클러스트의 이름을 임의의 문자열로 지정함.

추가로 클러스터에 있는 노드는 실시간으로 추가, 제거가 가능하여, 가용성, 확장성 측면에서 매우 유연함.

텍스트 추가
2.2 엘라스틱서치에서 제공하는 주요 API

텍스트 추가
ES는 RESTful 방식의 API를 제공, JSON 기반으로 통신함.

텍스트 추가대표사진 삭제
사진 설명을 입력하세요.

텍스트 추가
기본 포트는 따로 설정하지 않을 시, HTTP 통신을 위해 9200번 포트를 사용함

4가지 주요 API를 제공함

● Indices API : 인덱스 관리

● Document API : 문서의 추가/수정/삭제

● Search API : 문서 조회

● Aggregation API : 문서 통계

문서를 인덱싱하기 위해서는 기본적으로 인덱스를 생성해야 함.

인덱스를 통하여 입력된 문서의 필드를 정의하고, 각 필드에 맞는 데이터 타입을 지정할 수 있다.

이러한 과정을 통해서 효율적인 색인이 가능해진다.

엘라스틱 서치의 스키마리스 기능

2.2.1 인덱스 관리 API

인덱스를 관리하기 위한 API. 인덱스 추가, 삭제를 할 수 있다.

HTTP 메서드를 지정하는 방식으로 사용 할 수 있다.

인덱스 생성

인덱스를 생성할 때, 매핑(문서와 문서에 포함된 필드, 필드 타이 등을 세세하게 지정하는 것이 가능한 설정 방식)이라는 세부 설정을 이용 할 수 있다.

인덱시 생성시 이러한 매핑정보를 추가 할 수 있다.

주의할 점! 한번 생성된 매핑 정보는 변경할 수 없다.

만약 잘 못 생성했거나, 변경을 원할시 데이터를 삭제하고 다시 인덱싱하는 방법 밖에 없다.

텍스트 추가
PUT /mobvie
내용을 입력하세요.
텍스트 추가
RESULT
내용을 입력하세요.
텍스트 추가
ES는 다양한 형태의 데이터 타입을 제공한다.

단순히 문자열로 저장을 원할 경우 keyword 타입, 형태소 분석을 원할 경우 text 타입을 사용하면 된다.

검색에 사용되는 필드는 형태소 분석을 할 수 있도록 text 타입으로 지정하는 것이 좋다.

인덱스 삭제

앞에서 생성한 인덱스를 DELETE 메서드로 삭제할 수 있다.

텍스트 추가
DELETE /movie
내용을 입력하세요.
텍스트 추가
{
"acknowledge": false
}
내용을 입력하세요.
텍스트 추가
만약 인덱스 이름이 잘못됐거나 없는 인덱스를 삭제하려 할 경우 다음과 같은 에러 메시지가 출력된다.

텍스트 추가
{
"error" : {
"rootcause" : [
{
"type" : "index_not_found_exception",
"reason" : "no such index [INDEX]",
"resource.type" : "index_or_alias",
"resource.id" : "INDEX",
"index_uuid" : "_na
",
"index" : "INDEX"
}
],
"type" : "indexnot_found_exception",
"reason" : "no such index [INDEX]",
"resource.type" : "index_or_alias",
"resource.id" : "INDEX",
"index_uuid" : "_na
",
"index" : "INDEX"
},
"status" : 404
}
내용을 입력하세요.
텍스트 추가
주의할 점!

인덱스는 한번 삭제하면 다시는 복구할 수 없으므로, 인덱스 삭제는 신중하게 해야한다.

2.2.2 문서관리 API

문서관리 API는 실제 문서를 인덱싱하고, 조회, 수정, 삭제를 지원하는 API다. 이를 이용해 문서를 인덱싱하고, 내용을 수정, 삭제할 수 있다. ES는 기본적으로 검색엔진이므로, 다양한 검색패턴을 지원하는 Search API를 따로 제공한다. 하지만 인덱싱된 문서의 ID를 기준으로 한 건의 문서를 다뤄야 하는 경우 문서 관리 API를 사용한다

문서관리 API는 아래와 같은 세부 기능을 제공한다.

● Index API : 한 건의 문서를 인덱싱

● GET API : 한 건의 문서를 조회

● Delete API : 한 건의 문서를 삭제

● Update API : 한 건의 문서를 업데이트

기본적으로 문서관리 API는 한건의 문서를 처리하기 위한 기능을 제공하여, Single document API라고도 부른다.

하지만 클러스터 운영 시에는 다수의 문서를 처리해야하는 경우도 종종 발생하므로

이를 위해 Multi-document API도 제공한다.

● Multi Get API : 다수의 문서를 조회

● Bulk API : 대량의 문서를 인덱싱

● Delete By Quert API : 다수의 문서를 삭제

● Update By Quert API : 다수의 문서를 업데이터

● Reindex API : 인덱스의 문서를 다시 인덱싱

문서생성

아래는 생성된 결과로 리턴된 JSON으로, "result" 항목의 값이 "created"로, 정상적으로 위에서 요청한 문서가 인덱싱되었음을 확인 할수 있다.

텍스트 추가
POST /movie/_doc/1
{
"movieCd":"1",
"movieNm":"살아남은 아이",
"movieNmEn":"Last Child",
"prdtYear":"2017",
"openDt":"2017-10-20",
"typeNm":"장편",
"prdtStatNm":"기타",
"nationAlt":"한국",
"genreAlt":"드라마,가족",
"repNationNm":"한국",
"repGenreNM":"드라마"
}

#결과
{
"_index" : "movie",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
내용을 입력하세요.
텍스트 추가
GET _cat/indices/*?v

#결과
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open movie OQE2XgyeQ1qpxiRrAKEewA 1 1 1 0 9.2kb 9.2kb
내용을 입력하세요.
텍스트 추가
문서조회

문서 ID를 "1"으로 줬기때문에 문서 ID "1"으로 조회가 가능하다

텍스트 추가
GET /movie/_doc/1

#결과
{
"_index" : "movie",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"movieCd" : "1",
"movieNm" : "살아남은 아이",
"movieNmEn" : "Last Child",
"prdtYear" : "2017",
"openDt" : "2017-10-20",
"typeNm" : "장편",
"prdtStatNm" : "기타",
"nationAlt" : "한국",
"genreAlt" : "드라마,가족",
"repNationNm" : "한국",
"repGenreNM" : "드라마"
}
}
내용을 입력하세요.
텍스트 추가
문서 삭제

#결과 아래의 리턴된 JSON을 보면 "result" 항목이 "delete" 값을 가지며, 정상적으로 삭제 됐음을 확인할 수 있다.

텍스트 추가
DELETE /movie/_doc/1

#결과
{
"_index" : "movie",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"result" : "deleted",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
}
}
내용을 입력하세요.
텍스트 추가
ID를 지정하지 않고 문서를 생성

문서를 추가할때 ID를 지정하지 않고 POST 명령을 날리면 어떻게 될까?

아래 #결과를 보면 "movie" 인덱스의 "_id"의 값이 랜덤하게 생성된 문자열 "n1eF920BHtPii3gkYJ_B"이고, 1건의 데이터 생성이 성공적으로 됐음을 알 수 있다.

URI에 인덱스명, 타입만 지정하여 POST메서드로 인덱스를 생성 했기 때문에 ES가 UUID를 통해 무작위로 "_id"의 값을 무작위로 생성한 것이다.

텍스트 추가
POST /movie/_doc/
{
"movieCd":"1",
"movieNm":"살아남은 아이",
"movieNmEn":"Last Child",
"prdtYear":"2017",
"openDt":"2017-10-20",
"typeNm":"장편",
"prdtStatNm":"기타",
"nationAlt":"한국",
"genreAlt":"드라마,가족",
"repNationNm":"한국",
"repGenreNM":"드라마"
}

#결과
{
"_index" : "movie",
"_type" : "_doc",
"_id" : "n1eF920BHtPii3gkYJ_B",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 5,
"_primary_term" : 1
}
내용을 입력하세요.
텍스트 추가
이렇게 ID를 지정하지 않고 문서를 생성하는 것이 편리할 수 있으나, 무작위로 생성된 ID값으로 인해, 해당 문서를 업데이트 할때 애로사항이 발생한다.

예를 들어, ES와 동기화된 DB의 데이터가 변경되었다고 가정할 때, 검색엔진은 주기적으로 해당 데이터베이스와 동기화 해야되므로, 변경된 내용을 따라 동기화 돼야한다. 이를 위해 인덱싱된 "_id" 값을 데이터베이스의 PK(Primary Key) 혹은 recognizable한 키 값과 매칭된 정보가 어딘가에 저장되어 관리되어야 한다.

하지만 수억건의 데이터에서 recognizable값과 매칭되는 데이터를 따로 어딘가에 별도 저장한다는 것은 사실상 불가하므로, 인덱싱된 문서의 "_id"값은 업데이트 상황까지 고려하여 DB 테이블의 recognizable 값과 맞춰 주는 것이 중요하다.

2.2.3 검색 API

ES의 검색 API의 사용방식은 크게 두가지로 나뉜다.

텍스트 추가셀 전체 선택
0열 선택0열 다음에 열 추가
0행 선택0행 다음에 행 추가
1행 선택1행 다음에 행 추가
열 너비 조절행 높이 조절
(1) HTTP URI (uniform Resource Identifier) 형태의 파라미터를 URI에 추가해 검색하는 방법

(2) RESTful API 방식인 QueryDSL을 사용해 요청 본문(Request Body)에 질의 내용을 추가해 검색하는 방법

셀 병합
행 분할
열 분할
너비 맞춤
삭제
텍스트 추가
Request Body 방식(2)은 URI 방식(1) 제약 사항이 적어, 실무에서는 (2) 방식을 더 선호한다.

(1)방식은 간단한 쿼리 검색을 하거나, 디버깅할 때 등 간편하게 사용하는 경우에 종종 사용된다.

간단한 표현식에서는 두가지 형식을 사용하는 것도 가능하다. 예를 들어 Query를 URI 방식으로 사용하고, 나머지 기능을 JSON 형태로 사용하는 것으로 아래 예제를 통해 알 수 있다.

아래 예제는 2017년 개봉한 영화를 영화 제목을 기준으로 정렬하여 보여준다

텍스트 추가
GET /movie/_doc/_search?q=prdtYear:2017
#ES 7버전부터 type이 삭제되었기 때문에
#아래 처럼 /_doc 부분을 날려주면 아래 Deprecation 경고가 나오지 않는다.
#GET /movie/_search?q=prdtYear:2017

#결과

#! Deprecation: [types removal] Specifying types in search requests is deprecated.
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.2876821,
"hits" : [
{
"_index" : "movie",
"_type" : "_doc",
"_id" : "n1eF920BHtPii3gkYJ_B",
"_score" : 0.2876821,
"_source" : {
"movieCd" : "1",
"movieNm" : "살아남은 아이",
"movieNmEn" : "Last Child",
"prdtYear" : "2017",
"openDt" : "2017-10-20",
"typeNm" : "장편",
"prdtStatNm" : "기타",
"nationAlt" : "한국",
"genreAlt" : "드라마,가족",
"repNationNm" : "한국",
"repGenreNM" : "드라마"
}
}
]
}
}
내용을 입력하세요.
텍스트 추가
URI 방식의 검색 쿼리

URI 방식의 검색 쿼리는 문서 ID인 "_id" 값을 사용해 문서를 조회하는 방식이다.

URI에 파라미터를 붙여 조회하는 식이다. 따라서 앞서 ID 없이 생성한 문서를 조회하려면 아래처럼 GET 메서드에 문서ID를 붙여 검색할 수 있다.

텍스트 추가
GET /movie/_doc/n1eF920BHtPii3gkYJ_B

#결과
{
"_index" : "movie",
"_type" : "_doc",
"_id" : "n1eF920BHtPii3gkYJ_B",
"_version" : 1,
"_seq_no" : 5,
"_primary_term" : 1,
"found" : true,
"_source" : {
"movieCd" : "1",
"movieNm" : "살아남은 아이",
"movieNmEn" : "Last Child",
"prdtYear" : "2017",
"openDt" : "2017-10-20",
"typeNm" : "장편",
"prdtStatNm" : "기타",
"nationAlt" : "한국",
"genreAlt" : "드라마,가족",
"repNationNm" : "한국",
"repGenreNM" : "드라마"
}
}
내용을 입력하세요.
텍스트 추가
q 파라미터를 사용해 해당 용어와 일피하는 문서만 조회한 예제이다.

POST 메서는 update와 select 의 기능을 다 수행한다

텍스트 추가
POST /movie/_search?q=장편

#결과

{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.2876821,
"hits" : [
{
"_index" : "movie",
"_type" : "_doc",
"_id" : "n1eF920BHtPii3gkYJ_B",
"_score" : 0.2876821,
"_source" : {
"movieCd" : "1",
"movieNm" : "살아남은 아이",
"movieNmEn" : "Last Child",
"prdtYear" : "2017",
"openDt" : "2017-10-20",
"typeNm" : "장편",
"prdtStatNm" : "기타",
"nationAlt" : "한국",
"genreAlt" : "드라마,가족",
"repNationNm" : "한국",
"repGenreNM" : "드라마"
}
}
]
}
}
내용을 입력하세요.
텍스트 추가
Request Body 방식의 검색 질의

2.2.4 집계 API

데이터 집계

데이터 집계 타입

텍스트 추가셀 전체 선택
0열 선택0열 다음에 열 추가
1열 선택1열 다음에 열 추가
2열 선택2열 다음에 열 추가
0행 선택0행 다음에 행 추가
1행 선택1행 다음에 행 추가
2행 선택2행 다음에 행 추가
3행 선택3행 다음에 행 추가
4행 선택4행 다음에 행 추가
5행 선택5행 다음에 행 추가
6행 선택6행 다음에 행 추가
열 너비 조절행 높이 조절
Search API

6.x 이전

7.0 이후

search

/{index}/{type}/_search

{index}/_search

msearch

/{index}/{type}/_msearch

/{index}/_msearch

count

/{index}/{type}/_count

/{index}/_count

explain

/{index}/{type}/{id}/_explain

/{index}/_explain/{id}

search template

/{index}/{type}/_search/template

/{index}/_search/template

msearch template

/{index}/{type}/_msearch/template

/{index}/_msearch/template

셀 병합
행 분할
열 분할
너비 맞춤
삭제
텍스트 추가셀 전체 선택
0열 선택0열 다음에 열 추가
1열 선택1열 다음에 열 추가
2열 선택2열 다음에 열 추가
0행 선택0행 다음에 행 추가
1행 선택1행 다음에 행 추가
2행 선택2행 다음에 행 추가
3행 선택3행 다음에 행 추가
4행 선택4행 다음에 행 추가
5행 선택5행 다음에 행 추가
6행 선택6행 다음에 행 추가
7행 선택7행 다음에 행 추가
8행 선택8행 다음에 행 추가
9행 선택9행 다음에 행 추가
열 너비 조절행 높이 조절
Document API

6.x 이전

7.0 이후

index

/{index}/{type}/{id}

/{index}/_doc/{id}

delete

/{index}/{type}/{id}

/{index}/_doc/{id}

get

/{index}/{type}/{id}

/{index}/_doc/{id}

update

/{index}/{type}/{id}/_update

/{index}/_update/{id}

get source

/{index}/{type}/{id}/_source

/{index}/_source/{id}

bulk

/{index}/{type}/_bulk

/{index}/_bulk

mget

/{index}/{type}/_mget

/{index}/_mget

termvectors

/{index}/{type}/{id}/_termvector

/{index}/_termvector/{id}

mtermvectors

/{index}/{type}/_mtermvectors

/{index}/_mtermvectors

셀 병합
행 분할
열 분할
너비 맞춤
삭제
텍스트 추가셀 전체 선택
0열 선택0열 다음에 열 추가
1열 선택1열 다음에 열 추가
2열 선택2열 다음에 열 추가
0행 선택0행 다음에 행 추가
1행 선택1행 다음에 행 추가
2행 선택2행 다음에 행 추가
3행 선택3행 다음에 행 추가
4행 선택4행 다음에 행 추가
5행 선택5행 다음에 행 추가
6행 선택6행 다음에 행 추가
열 너비 조절행 높이 조절
Index API

6.x 이전

7.0 이후

create index

/{index}

변경 없음

get mapping

/{index}/_mapping/{type}

/{index}/_mapping

put mapping

/{index}/_mapping/{type}

/{index}/_mapping

get field mapping

/{index}/{type}/_mapping/field/{fields}

/{index}/_mapping/field/{fields}

get template

/_template/{template}

변경 없음

put template

/_template/{template}

변경 없음

셀 병합
행 분할
열 분할
너비 맞춤
삭제
텍스트 추가

텍스트 추가
텍스트 추가
(1)

https://en.wikipedia.org/wiki/Full-text_search

텍스트 추가Full-text search - Wikipedia이미지 썸네일 삭제Full-text search - Wikipedia
hide This article has multiple issues. Please help improve it or discuss these issues on the talk page . ( Learn how and when to remove these template messages ) This article needs additional citations for verification . ( August 2012 ) This article may require cleanup to meet Wikipedia's quality st...

en.wikipedia.org

텍스트 추가
https://stackoverflow.com/questions/224714/what-is-full-text-search-vs-like

텍스트 추가What is Full Text Search vs LIKE이미지 썸네일 삭제What is Full Text Search vs LIKE
I just read a post mentioning "full text search" in SQL. I was just wondering what the difference between FTS and LIKE are. I did read a couple of articles but couldn't find anything that expla...

stackoverflow.com

텍스트 추가
Most full text search implementations use an "inverted index". This is an index where the keys are individual terms, and the associated values are sets of records that contain the term. Full text search is optimized to compute the intersection, union, etc. of these record sets, and usually provides a ranking algorithm to quantify how strongly a given record matches search keywords.

http://www.sqler.com/127400

텍스트 추가15. 전문검색(Full Text Search) - 1. 전문검색 이해이미지 썸네일 삭제15. 전문검색(Full Text Search) - 1. 전문검색 이해
안녕하세요. 코난 입니다. 정말 오래간만에 강좌를 적는군요. 그간 이런저런 코난이의 신상에 변화가 많이 있었습니다. 자세한 이야기는 차차 풀기로 하고 강좌 이야기를 진행 하도록 하지요. ^^ 이번에 소개해 드릴 내용은 전문검색 - Full Text Search 입니다. SQL7 강좌의 전문 검색을 보신 분들과 다른 책이나 미디어를 통해 전문검색을 이미 접하신 분들도 계실 겁니다. 또한 SQLER 바로 이곳의 게시판에서 검색을 한번이라도 해 보신분은 이 전문검색을 이미 사용해 보신 것이기도 하지요. ^^ 개인적으로는 이렇게 전문 ...

www.sqler.com

텍스트 추가
https://interconnection.tistory.com/95

텍스트 추가MySQL Full Text Search Index 사용하기이미지 썸네일 삭제MySQL Full Text Search Index 사용하기
전문 검색(Full Text Search)은 검색 기능을 서비스에 도입하고 싶은 분들에게 필요한 기능입니다. 기존의 인덱스와 다른 방식의 인덱스입니다. MySQL의 B-Tree Index ( 보통 그냥 Index 라고 불림 ) : Index의 경..

interconnection.tistory.com

텍스트 추가

profile
데이터 엔지니어

0개의 댓글