Elasticsearch 1.0.0 설치와 사용 방법

Apr 10, 2017

Elasticsearch와 관련해서 참고할 만한 내용을 기록했다. 오래된 프로젝트를 다시 세팅하면서 썼고, Elasticsearch 버전은 1.0.0이다.

설치하기

우선 Elasticsearch 다운로드 페이지에서 파일을 내려받는다.

# Java 설치
yum install -y java-1.8.0-openjdk

# 설치하기
cd /usr/local
unzip elasticsearch-1.0.0.zip
rm elasticsearch-1.0.0.zip

# 설정파일 수정 (cluster.name, node.name, node.rack, index.number_of_shards, index.number_of_replicas)
cd elasticsearch-1.0.0
vi config/elasticsearch.yml 

# 데몬 실행
bin/elasticsearch

# 플러그인 목록 보기
bin/plugin --list

# 플러그인 설치 (head)
# http://localhost:9200/_plugin/head/
bin/plugin -install mobz/elasticsearch-head

기본

# 버전 확인하기
curl -XGET http://localhost:9200/ 

# 검색
curl -XPOST http://localhost:9200/_search?pretty \
-H 'Content-Type: application/json;charset=UTF-8'  \
-d '{
    "from": 0,
    "size": 100,
    "query": {
        "match": {
            "_id": "gAfBdpp0SOWkNzOdIEXc1g"
        }
    }
}'

curl -XPOST http://localhost:9200/_search \
-H 'Content-Type: application/json;charset=UTF-8'  \
-d '{
    "from": 0,
    "size": 100,
    "query": {
        "query_string": {
            "query": ["_id:gAfBdpp0SOWkNzOdIEXc1g"]
        }
    }
}'

Query String Query

Query String Query 관련 공식 페이지

질의 문자열은 단어와 연산자의 연속으로 이뤄진다.

기본 형태는 다음과 같다. QUERY_STRING_SYNTAX라고 되어 있는 부분에 질의를 사용할 수 있다.

GET /_search
{
    "query": {
        "query_string": {
            "query": "QUERY_STRING_SYNTAX"
        }
    }
}

Query String 문법 기본:

# status 필드에 active가 있을 때
status:active

# title에 quick 또는 brown이 있을 때
title:(quick OR brown)

# author 필드에 정확하게 "john smith"라는 문장이 있을 때
author:"John Smith"

# 와일드카드. ?는 문자 하나, *는 0개 이상의 문자들을 대체한다.
qu?ck bro*

# 정규식. //로 감쌈
name:/joh?n(ath[oa]n)/

# book.title, book.content, book.date이 quick 이나 brown을 포함하는 필드가 있을 때. 
# 백슬래시로 *를 escape하는 것에 주의
book.\*:(quick brown)

이런 식으로 복잡한 질의도 사용할 수 있다.

curl -XPSOT http://192.168.0.106:9200/index_name/type_name/_search?pretty=true \
-H 'Content-Type: application/json;charset=UTF-8'  \
-d '{
    "from": 0,
    "size": 10,
    "fields": ["_id", "user_id", "user_name"],
    "query": {
        "query_string": {
            "query": "foo_field.bar_field:/regexp_example/",
            "analyze_wildcard": true,
            "allow_leading_wildcard": true
        }
    }
}'

allow_leading_wildcard 옵션은 *이나 ?를 첫 번째 문자로 허용여부를 설정할 수 있다. 기본값은 True다. 정규식에서는 이 옵션의 영향을 받지 않는다. 다음과 같은 쿼리는 Elasticsearch가 인덱스의 모든 단어를 강제로 찾는다.

/.*n/

analyze_wildcard 옵션은 기본적으로 검색어에 있는 와일드카드를 분석하지 않는다. 세팅을 true로 하면 와일드카드를 분석하려고 최대한 노력하게 된다.

토큰화와 관련해서 검색시 주의할 점

예를들어 다음과 같은 데이터가 있다.

{
    files: [
        {
            ...
            "f_name": "C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe VV11.0.14.16VV"
            ...
        },
        ...
    ]
}

f_name이 AcroRd32라는 단어와 VV11.0.14.16VV라는 단어가 모두 포함된 경우를 찾으려고 했다. 그래서 이런 식으로 검색하면 될 줄 알았다.

f_name:/.*AcroRd32 VV11.0.14.16VV/

안된다. 표준 토크나이저로 토큰화되므로 필드의 본래의 텍스트에 검색하는 것이 아니라 토큰화된 단어를 검색한다. 따라서 다른 토크나이저로 변경할 필요가 있다.

스냅숏과 스냅숏을 통한 복원

공식 페이지 문서

스냅숏 저장소를 만들고, 현재 상태를 스냅숏해서, 저장소 디렉터리에 보관이 되고, 이것을 다른 클러스터에서 복원 할 수 있다.

# 스냅숏 저장소 만들기
curl -XPUT http://localhost:9200/_snapshot/my_backup \
-H 'Content-Type: application/json;charset=UTF-8'  \
-d '{
    "type": "fs",
    "settings": {
        "compress": true,
        "location": "/home/es_snapshot"
    }
}'

# 등록된 스냅숏 저장소 보기
curl -XGET http://localhost:9200/_snapshot/_all

# 스냅숏 하기 - 끝날때까지 기다리기
curl -XPUT http://localhost:9200/_snapshot/my_backup/snapshot_1?wait_for_completion=true

# 스냅숏 상태 확인
curl -XGET http://localhost:9200/_snapshot/my_backup/snapshot_1

# 스냅숏 삭제하기
curl -XDELETE http://localhost:9200/_snapshot/my_backup/snapshot_1

# 스냅숏으로부터 복원
## 스냅숏한 디렉터리를 다른 클러스터로 가져와서 그 클러스터의 스냅숏 디렉터리에 둔다.
curl -XPOST http://localhost:9200/_snapshot/my_backup/snapshot_1/_restore

Reroute

위에서 다른 클러스터로 복원했을 때, 리플리케이션과 샤드 세팅이 다르면 Unassigned 상태가 된다. 이런 경우 Unassigned 상태를 정상적인 상태로 만들고 싶을 때 reroute를 사용한다. reroute 커맨드는 클러스터가 reroute 할당 명령을 실행하도록 해준다.

스냅숏 했던 서버의 상태:

  • replication : 5
  • shard : 2

복원 할 서버 상태:

  • replication : 0
  • shard : 1

index를 만들지 않은 상태에서 복원해서 그럴 수도 있는데, 그건 테스트하지 않았다.

# 리플리케이션 조절
curl -XPUT localhost:9200/index_name/_settings \
-d '{
    "number_of_replicas": 0
}'

# unassigned된 샤드를 재할당. 샤드를 다른 노드로 보낼 수도 있다.
curl -XPOST http://localhost:9200/_cluster/reroute \
-H 'Content-Type: application/json;charset=UTF-8'  \
-d '{
    "commands": [
        {
            "allocate": {
                "index": "index_name",
                "shard": 1,
                "node": "node_name",
                "allow_primary": true
            }
        }
    ]
}'
See Also