[ElasticSearch] 개요 – Lucene

Lucene 용어
 
용어 상세
Document
(DBMS의 record)
  • 기본적인 정보의 저장 단위로써, 수집한 row content를 Field의 집합으로 관리
  • Field  : Document를 구성하고 있는 항목
  • name, fieldType, value로 구성
Analyzer
  • Field의 value (text)로 부터 token을 추출
  • Analyzer 구성
  • CharFilter  : 전체 문자열 전처리 (복수)
  • Tokenizer  : 전체 문자열을 Token으로 분할
  • TokenFilter  : Token에 대한 필터링 처리 (복수)
Index
(DBMS의 database)
  • Directory  : Lucene 인덱스가 저장된 폴더
  • Segment  : Index를 구성하는 요소로 독립적인 index 정보를 가짐
  • Term  : 저장과 검색을 위한 기본 단위
  • field name과 word (text)로 구성
Query
  • 검색어 : Search String을 Lucene에서 사용하는 문법으로 변환한 것
  • 종류 : TermQuery, BooleanQuery, WildcardQuery, PhraseQuery, PrefixQuery, MultiPhraseQuery, FuzzyQuery, RegexpQuery, TermRangeQuery, NumericRangeQuery, ConstantScoreQuery, DisjunctionMaxQuery, MatchAllDocsQuery
Filter
  • 종류 : CachingWrapperFilter, DocTermOrdsRangeFilter, FieldCacheRangeFilter, FieldCacheTermsFilter, FieldValueFilter, MultiTermQueryWrapperFilter, NumericRangeFilter, PrefixFilter, QueryWrapperFilter, TermRangeFilter
TopDocs
  • 검색한 문서의 ID (docID)를 저장
Scorer
  • 종류 : BoostScorer, BulkScorer, ConjunctionScorer, DisjunctionMaxScorer, DisjunctionScorer, DisjunctionSumScorer, ExactPhraseScorer, FakeScorer, MinShouldMatchSumScorer, ReqExclScorer, ReqOptSumScorer, ScoreCachingWrappingScorer, SloppyPhraseScorer, TermScorer
  • Lucene Process 이해
LuceneProcess.png
  • Lucene Score

LuceneScore.png

파일

 

Elastic Search – JVM Plugin

 

 

jar 파일로 JVM Plugin을 구성 합니다.

es-plugin.properties 파일

  • plugin=org.elasticsearch.plugin.analysis.kr.AnalysisKoreanPlugin : Plugin 등록 파일
    • org.elasticsearch.plugins.AbstractPlugin 파일을 구현한 class
  • version=~ : Plugin 버전
  • description=~ : Plugin 설명
  • lucene=~ : Lucene 버전

Plugin 등록 파일 구성

종류 관련 class 상세
name() Plugin 이름
description() Plugin 설명
modules() Module Node level modules
org.elasticsearch.plugins.PluginsModule
indexModules() Module Per index modules
org.elasticsearch.plugins.IndexPluginsModule
shardModules() Module Per index shard module
org.elasticsearch.plugins.ShardPluginsModule
services() LifecycleComponent Node level services
indexServices() CloseableIndexComponent Per index services
shardServices() CloseableIndexComponent Per index shard services
processModule() Module
additionalSettings() Plugin이 로딩될 때 추가되는 node 설정
onModule(AnyModule module) 모듈이 로딩될 때, 실행되는 함수

 

파일

 

 

 

ElasticSearch Plugin 구조

 

 

ElasticSearch 폴더 구조

폴더 상세
bin
  • elasticsearch : ElasticSearch 실행 프로그램
  • plugin : 플러그인 설치 프로그램 (org.elasticsearch.plugins.PluginManager 프로그램이 실행됨)
  • 플러그인명/ : Plugin 설치 파일의 bin/ 폴더가 여기로 이동됨
config
  • elasticsearch.yml : ElasticSearch 환경 설정 파일
    • path.plugins : 플러그인 설치 폴더 (Default. plugins/)
  • logging.yml : 로깅 환경 설정 파일
  • 플러그인명/ : Plugin 설치 파일의 config/ 폴더가 여기로 이동됨
data
  • ElasticSearch 색인 저장
  • elasticsearch/nodes/
lib
  • 라이브러리 폴더
logs
  • 로그 파일 저장 폴더
plugins
  • 플러그인 설치 폴더
  • path.plugins 설정으로 위치를 변경할 수 있음
  • 플러그인명/ : Plugin 설치 파일에서 bin/ 폴더와 config/ 폴더를 제외한 파일이 설치되는 폴더
    • _site/

Plugin 설치 프로그램

설치 프로그램 : org.elasticsearch.plugins.PluginManager

옵션 상세
-u -url ~ Plugin 설치 파일 (~.zip) 다운로드 URL
-i -install ~ 설치할 Plugin 이름
plugins/Plugin_이름/ 폴더에 설치됨
-t -timeout ~ 타임아웃 설정 (30s, 1m, 1h, …)
-r -remove ~ 삭제할 Plugin 이름
-l -list 설치된 Plugin 목록 표시
-v -verbose 상세 정보 표시
-s -silent Silent 모드로 실행
-h -help 도움말 표시

Plugin 설치 파일 폴더 구조

~.zip 파일

폴더 상세
플러그인명-버전/
  • 기본적으로 모든 파일은 plugins/플러그인명/ 폴더에 배포 됩니다.
  • bin/, config/, _site/ 폴더가 없고
    • .class/.jar 파일이 없는 경우, plugins/플러그인명/_site/ 폴더에 배포 됩니다.
    • .class/.jar 파일이 있을 경우, plugins/플러그인명/ 폴더에 배포 됩니다.
_site/
  • index.html : 시작 페이지
bin/
  • bin/플러그인명/ 폴더에 배포 됩니다.
config/
  • config/플러그인명/ 폴더에 배포 됩니다.
_dict/

 

 

파일

 

ElasticSearch REST API 기본 구조

 

ElasticSearchREST (Representational State Transfer) API를 제공하여 다양한 환경에서 사용할 수 있습니다.

REST에서 Methods의 주요 용도

  • POST      : 등록 (Create)
  • PUT        : 수정 (Replace), 데이터가 없을 경우에는 등록 (Create)
  • DELETE   : 삭제 (Delete)
  • GET        : 조회 (List, Retrieve)

URI 기본 형태

  • http://localhost:9200/index/type/id?parameters
  • http://localhost:9200/[index/[type/]action?parameters]
    • index : DBMS에서 데이터베이스에 해당
    • type : DBMS에서 테이블에 해당
    • id : DBMS에서 레코드에 해당하는 Document의 ID
    • index, type, id를 여러개 지정할 경우 “,”를 사용하여 구분 합니다. “*”를 사용하여 모두 지정할 수 있습니다.
    • action : 특정 작업을 지시
    • 공통 parameters
      • pretty               : 반환 값이 있다면 JSON response를 표시
      • v                      : verbose. 상세 정보 표시
      • help                 : 사용 가능한 컬럼 정보 표시
      • h=컬럼1,컬럼2   : headers. 컬럼 표시
      • bytes=b            : 1kb 대신에 1024와 같이 숫자를 표시

Action

Action 상세
_cluster 클러스터 관련 작업
_nodes 노드 관련 작업
_aliases index alias 관련 작업
_analyze analyzer 관련 작업
_cache Cache 관련 작업
_flush Transaction log 또는 Memory free 작업
_optimize Segment 파일 병합 작업
_stats 시스템 또는 색인의 통계 정보
_search 검색 작업
_msearch Multi 검색 작업
_mget Multi Document petch 작업
_validate Query에 대한 유효성 검사 작업
_suggest 검색어 자동 완성
_bulk Bulk 색인 작업
_count 문서 count 작업
_settings elasticsearch.yml에 설정한 global settings 정보 조회
http://localhost:9200/index/_settings?pretty=true

  • number_of_shards : Shard 개수
  • number_of_replicas : Replica 개수
  • index.refresh_interval : Index 변경 후 검색 결과에 반영되는 시간 설정
  • snalysis :analyzer와 tokenizer 설정
  • store : 저장 옵션
_mapping 매핑 정보
http://localhost:9200/index/_mapping?pretty=true

Core Type Attribute

Attribute Default 상세
store no 원본 저장 여부
index analyzed 색인 방식 지정
no, not_analyzed, analyzed
term_vector no 색인어에 대한 메타 정보 저장 방식
yes, no, with_offsets, with_positions, with_positions_offsets
boost 1.0 Boost 값
null_value 필드의 값이 null일 경우의 default 값
omit_norms true Lucene의 norms 사용 여부
index_options positions 색인시 저장할 메타 정보 설정
positions, docs
analyzer 색인 및 검색 시 사용할 Global analyzer
index_analyzer 색인시 사용할 analyzer
search_analyzer 검색시 사용할 analyzer
include_in_all true _all 필드에 검색 가능한 모든 필드를 포함할지 여부
ignore_above 문자열 필드에서 정해진 크기를 넘는 문자는 무시하도록 설정
position_offset_gap Phrase 검색에서 전후 텍스트간의 간격 설정
precision_step 최대 number_term 설정
ignore_malformed false 잘못된 number, date 무시
format dateOptionalTime Date format

필드 타입

  • string, number, boolean, date
  • ip

필드 종류

  • _id : Document의 primary key
  • _source : 색인된 document의 모든 필드 저장
  • _all :
  • Search Field : 검색 대상이 되는 일반 필드
  • Facet Field : 검색 결과에 대한 Group by 연산을 수행
    • terms : 지정한 필드 목록으로 group by 연산
    • statistical : 지정한 필드 목록에 대한 통계
    • terms statistical facet : key 필드에 대한 value 필드의 통계
  • Sort Field : 정렬 필드, Default로 _score 필드의 내림차순으로 정렬
  • Boost Field : 부스트용 필드
  • Highlight Field : 강조 필드

등록/수정/삭제/조회 사례

등록
(POST / PUT)
  • customer 인덱스 생성
curl -XPUT 'node201.hadoop.com:9200/customer?pretty' curl -GET 'node201.hadoop.com:9200/_cat/indices?v' 
  • external 타입으로 문서 추가
  • 문서 번호는 자동으로 생성
curl -XPOST 'node201.hadoop.com:9200/customer/external?pretty' -d ' { "name": "Mountain Lover" }' curl -XGET 'node201.hadoop.com:9200/customer/external/1lz2jL6CQui07FnZGd_R9w?pretty' 
  • external 타입으로 1번 문서 추가
curl -XPUT 'node201.hadoop.com:9200/customer/external/1?pretty' -d ' { "name": "Mountain Lover" }' curl -XGET 'node201.hadoop.com:9200/customer/external/1?pretty'
수정
(PUT / POST)
  • external 타입으로 1번 문서 수정
curl -XPOST 'node201.hadoop.com:9200/customer/external/1/_update?pretty' -d ' { "doc": { "name": "Mountain Lover!", "age": 20 } }' curl -XGET 'node201.hadoop.com:9200/customer/external/1?pretty' 
  • external 타입으로 1번 문서 수정
curl -XPUT 'node201.hadoop.com:9200/customer/external/1?pretty' -d ' { "name": "Mountain Lover!" }' curl -XGET 'node201.hadoop.com:9200/customer/external/1?pretty' 
삭제
(DELETE)
  • 문서 삭제
curl -XDELETE 'node201.hadoop.com:9200/customer/external/1?pretty' curl -XGET 'node201.hadoop.com:9200/customer/external/1?pretty' curl -XDELETE 'node201.hadoop.com:9200/customer/external/_query?pretty' -d ' { "query": { "match": { "name": "Mountain Lover!" } } }' curl -XGET 'node201.hadoop.com:9200/customer/external/1?pretty' 
  • customer 인덱스 삭제
curl -XDELETE 'node201.hadoop.com:9200/customer?pretty' curl -GET 'node201.hadoop.com:9200/_cat/indices?v' 
조회
(GET)
  • 조회
curl -GET 'node201.hadoop.com:9200/_cat/indices?v' curl -XGET 'node201.hadoop.com:9200/customer/external/1?pretty' 
  • 조회되는 데이터 구조
  • _index
  • _type
  • _id
  • _version : 1, 2, 3, …
  • _source : { name1: value1, name2: value2 }
검색
(GET / POST)
  • REST request URI
curl -XGET 'node201.hadoop.com:9200/customer/_search?q=*&pretty' 
  • REST request body
curl -XPOST 'node201.hadoop.com:9200/customer/_search?pretty' -d ' { "query": { "match_all": {} } }' 

파일

 

 

 

 

ElasticSearch 폴더 구조와 설정

 

ElasticSarch 폴더 구조

폴더 설정 변수 상세
bin 윈도우용 실행 파일

  • elasticsearch.bat : ElasticSearch 실행
  • service.bat : Service 형태로 ElasticSearch 실행
    service.bat install | remove | start | stop | manager [SERVICE_ID]
  • plugin.bat : Plugin Manager 실행

Linux용 실행 파일

  • elasticsearch : ElasticSearch 실행
  • plugin : Plugin Manager 실행
config path.conf 설정 파일 폴더

  • elasticsearch.yml : ElasticSearch 설정 파일
  • logging.yml : 로그 설정 파일
data path.data 데이터와 인덱스를 저장하는 폴더

  • path.data: /path/to/data1,/path/to/data2
lib ElasticSearch용 라이브러리

  • Lucene 검색 엔진 라이브러리
  • Sigar 라이브러리 : CPU, Memory, Disk 등을 모니터링
logs path.logs 로그 폴더
plugins path.plugins ElasticSearch 플러그인 폴더
work path.work 임시 작업용 폴더
  • path.home : ElasticSearch가 설치된 폴더를 지정하는 설정 변수

ElasticSearch 구성

YAML 문법에 따라 elasticsearch.yml 파일에서 설정 변수를 구성 합니다.

설정 변수 Default 상세
cluster.name elasticsearch Cluster 이름
data/Cluster 이름/ 폴더가 생성됨
node.name 0, 1, 2, …
(자동 생성)
Node 이름
data/Cluster 이름/nodes/Node 이름/ 폴더가 생성됨
node.masternode.data

node.client

truetrue

false

Node 종류

  • Master node
    • node.master: true
    • Cluster와 Node의 상태 정보를 관리
    • Index와 Shard의 조정자 역할
  • Data node
    • node.data: true
    • 색인 데이터를 저장
  • Load Balance node
    • node.master: false, node.data: false
    • 검색 요청을 받아 분산 처리
  • Client node
    • node.client: true, node.master: false
    • Master node로 사용하지 않고 Client node로 사용하고자 할 경우
index.number_of_shards 5 Shard 개수
index.number_of_replicas 1 Replica 개수
http.enabled true http 서비스를 활성화 합니다.
http.port 9200 http 서비스에서 사용하는 port
transport.tcp.port 9300 netty의 Transport에서 사용하는 port
transport.tcp.compress true이면 Transport에서 압축 허용
network.bind_host Client의 요청을 접수할 IP 주소
network.host ElasticSearch Node의 IP 주소
gateway.type local Cluster의 메타 정보와 Index 설정, Mapping 정보 등을 어디서 관리할 것인지 지정Gateway 종류

  • local
  • shared fs
  • hadoop
  • s3
discovery.zen.minimum_master_nodes 1 최소 Master node 개수 (2개 이상 권장)
discovery.zen.ping.timeout 3s
discovery.zen.ping.multicast.enabled true
discovery.zen.ping.unicast.hosts Unicast 사용시 검색할 서버와 포트
예) [“host1”, “host2:port”]

 

파일

 

 

 

Windows에서 ElasticSearch 설치

ElasticSearch 설치

ElasticSearch는 JDK 7 이상에서 실행되는 Java 기반의 애플리케이션으로 별도의 설치 과정 없이 소스를 다운로드 받아 실행하면 됩니다. 다운로드 사이트(http://www.elasticsearch.org/download/)에서 최신 버전(elasticsearch-1.3.2.zip)의 ElasticeSearch를 다운로드 합니다. 압축을 풀어 c:/appl/elasticsearch/ 폴더를 생성 합니다.

실행 및 확인

bin/ 폴더에서 elasticsearch.bat 파일을 실행 합니다.

브라우저에서 http://localhost:9200/ 로 접속하여 확인 합니다.

ElasticSearch_Install_Windows_001.png

Cluster 정보 확인

Node 정보 확인

한글 형태소 분석기 Plugin

Korean Analysis for ElasticSearch (http://github.com/chanil1218/elasticsearch-analysis-korean) 사이트에서 한글 형태소 분석기 Plugin을 설치 합니다. ElasticSearch용 한글 형태소 분석기 Plugin은 “루씬 한글분석기 오픈소스 프로젝트”를 가져와 작성이 되었습니다.

루씬 한글분석기 오픈소스 프로젝트

한글 형태소 분석기 Plugin 설치

bin/plugin -install chanil1218/elasticsearch-analysis-korean/1.3.0

만일 위 명령어로 설치시 오류가 발생하면 아래와 명령어로 설치를 다시 진행 합니다.
bin/plugin -url https://dl-web.dropbox.com/spa/grpekzky9x5y6mc/elastic-analysis-korean/public/elasticsearch-analysis-korean-1.3.0.zip -install analysis-korean

설치가 정상적으로 완료되면 plugins/analysis-korean/elasticsearch-analysis-korean-1.3.0.jar 파일을 확인할 수 있습니다.

파일

 

ElasticSearch 개요

Lucene은 널리 알려진 Java 기반의 오픈소스 검색 엔진 라이브러리 입니다. 많은 곳에서 사용 되고 있지만 라이브러리 형태라 사용에 불편함이 있고 BigData 시대를 맞아 분산 환경을 지원하지 않아 새로운 대안 솔루션이 필요하게 되었습니다. 오픈소스 진영에서는 분산 환경을 지원하는 SolrElasticSearch가 Lucene 기반으로 작성이 되었습니다. ElasticSearch는 RESTful API를 지원하는 특성으로 인하여 여러 환경으로 포팅이 될 수 있어서 사용이 편리한 분산 검색 엔진 입니다.

ElasticSearch의 특징

  • 실시간 검색 및 분석
  • 분산 구성 및 병렬 처리
  • index (Database)와 Type (Table)을 사용하여 다양한 문서 처리
  • JSON을 사용하는 RESTful API 지원
  • Plugin 방식의 기능 확장

ElasticSearch 용어

용어 상세
Cluster
  • Node의 집합으로 유일한 이름을 가짐
Node
  • Cluster를 이루는 물리적인 서버
Index
(indice)
  • 유사한 특징을 가진 문서들의 모음으로 DBMS에서 데이터베이스와 유사한 개념
  • Term, Count, Docs로 구성
Shard
  • Index의 subset 개념으로 Lucene을 사용하여 구성
  • 실제 데이터와 색인을 저장하고 있으며 Primary Shard와 Replica Shard로 분류
  • Primary Shard : Shard를 구성하는 기본 인덱스
  • Replica Shard : 분산된 다른 node에 저장된 Primary Shard의 복제본
    • 서비스 장애시 서비스의 영속성 보장
Type
(Document Type)
  • 데이터 (Document)의 종류로 index 내에서의 논리적인 category/partition
  • DBMS에서 테이블과 유사한 개념
Mapping
  • DBMS에서 테이블 스키마와 유사한 개념
Route
  • 색인 필드 중 unique key에 해당하는 값을 routing path로 지정한 후, 이 path를 사용하여 인덱싱과 검색에 사용할 shard를 지정하여 성능할 향상할 수 있습니다.
  • Routing Field : 스토어 옵션을 yes로 index not_analyzed로 설정
Document
  • ElasticSearch에서 관리하는 기본적인 데이터(정보)의 저장 단위
  • JSON (JavaScript Object Notaion)으로 표현
  • DBMS에서 레코드와 유사한 개념
Field
  • Document를 구성하고 있는 항목으로 name과 value로 구성
  • DBMS에서 컬럼과 유사한 개념
Gateway
  • Cluster 상태, Index 설정 등의 정보를 저장
Query
  • 검색어
TermQuery
  • 검색어의 종류
Term
  • 검색어의 항목
Token
  • 검색어의 항목을 구성하는 요소

ElasticSearch의 개념적 구성도

ElasticSearch.png
파일:LuceneIndex01.png

  • ElasticSearch Architecture

ElasticSearchArchitecture.png

  • _index : index 이름
  • _type : type 이름
  • _id : Document ID
  • _score
  • _source : Document 저장
  • properties
  • 필드명 (field)
  • type : string

ElasticSearch 관련 오픈소스

ElasticSearch Environment.png

 

 

파일

 

[ElasticSearch] Solr 관련 오픈소스

 
Solr Concept.png
 
 
파일

 

 

 
 

[ElasticSearch] Lucene Advanced Search

 
 
Lucene Advanced Search 발표 자료를 첨부 합니다.
 
 
 
 
 
파일

 

 

 

 
 

[ElasticSearch] 2014년 6월 21일 스터디 후기

ElasticSearch 스터디를 시작한 후
정규 표현식과 자연어처리를 살펴 보았습니다.
금주는 처음으로 검색 엔진에 대해서 살펴 보는 시간을 가졌습니다.
 
Lucene 개요와 Indexing와 Searching 프로세스의 개념적인 부분을 살펴 보았습니다.
ElasticSearch의 구성 요소 중 하나인 Lucene은 버전에 따라 구현 방식이
조금씩 다르기 때문에 개념적인 측면에서 동작 방식을 이해하는데 초점을 맞추어서 진행을 하였습니다.
 
원래 3시간 스터디 일정이었는데
참여한 사람들이 열정이 넘쳐서 5시간 30분 동안 진행이 되었습니다.
 
 
다음주에는 Tika를 사용한 데이터 수집과 
MySQL을 사용한 검색 서비스 구축을 하기로 되어 있어 많이 기대 됩니다.
 
 
 
  • Lucene Process 이해
LuceneProcess
  • Lucene Score

LuceneScore

 
 
 
파일