[스크랩] 신제품 개발 방법론.

Legacy 2015. 1. 15. 10:31

원문 글 : http://ryanplee.blog.me/140106802639




:

[Elasticsearch] SearchType.SCAN 기능 테스트

Elastic/Elasticsearch 2014. 12. 9. 18:58

일단 가볍게 코드 부터 keeping 합니다.


     SearchResponse searchResponse = client.prepareSearch(INDICE_NAME)

                .setSearchType(SearchType.SCAN)

                .setQuery(new MatchAllQueryBuilder())

                .setSize(FETCH_SIZE)

                .setScroll(TimeValue.timeValueMinutes(10))

                .execute().actionGet(TimeValue.timeValueMinutes(10));


        while (true) {

            searchResponse = client.prepareSearchScroll(searchResponse.getScrollId()).setScroll(TimeValue.timeValueMinutes(10)).execute().actionGet(TimeValue.timeValueMinutes(10));

                    

            if (searchResponse.getHits().hits().length == 0) {

                break;

            }

        }


뭐 간단 합니다.

shard 별로 FETCH_SIZE 만큼씩 요청시 데이터를 가져 오는 로직 입니다.

기타 응용이나 자세한 설명은 다음에.. ^^


로직만 확인하세요.

:

[Elasticsearch] dynamic template 이란?

Elastic/Elasticsearch 2014. 12. 5. 11:12

Elasticsearch에서 제공하는 편리한 기능 중 하나 입니다.

이해하기 위해서는 dynamic mapping 부터 보고 들어 가셔야 합니다.


[원본 링크]

Dynamic mapping

- http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/dynamic-mapping.html


☞ 간단 설명

색인 필드의 데이터에 대한 data type을 지정하지 않고 동적으로 elasticsearch 에서 적절한 type을 지정해 주는 기능 입니다.


예) 

field1:"1" 은 string 으로

field2: 1   은 long 으로 type 맵핑이 됩니다.


그럼 dynamic template 에 대해서 알아 보겠습니다.

elasticsearch에서는 customizing dynamic mapping 하위에 subset으로 기술 되어 있습니다.


[원본 링크]

Dynamic template

- http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/custom-dynamic-mapping.html#dynamic-templates


dynamic template 이란?

이 기능은 말 그대로 type mapping 을 사전에 기술해 놓지 않고 동적으로 dynamic mapping에 의해 정의 되는 시점에 동적으로 구성을 하게 되는 내용입니다.


쉽게 말해 mapping type을 미리 선언하지 않고 패턴이나 분석 특성에 맞춰 구성하게 되는 것입니다.

주로 사용하는 경우는 대략 2 가지 정도로 보입니다.


1) 같은 유형의 indice/type을 time series 로 생성 및 관리 할 때 매번 만들지 않고 자동으로 mapping 생성을 하고자 할때.

2) 특정 조건 또는 패턴에 일치하는 field에 대해 자동으로 mapping 속성을 지정하고자 할때.


[_default_]

- 이 type이 dynamic template의 기본 type이 됩니다.

- 별도 구성 없이 동적으로 type을 생성하게 되면 이 정보를 기준으로 mapping type 정의가 됩니다.


내부 properties 설명은 elasticsearch 샘플 자료로 설명을 하겠습니다.


PUT /my_index
{
   
"mappings": {
       
"my_type": {
           
"dynamic_templates": [
               
{ "es": {
                     
"match":              "*_es",
                     
"match_mapping_type": "string",
                     
"mapping": {
                         
"type":           "string",
                         
"analyzer":       "spanish"
                     
}
               
}},
               
{ "en": {
                     
"match":              "*",
                     
"match_mapping_type": "string",
                     
"mapping": {
                         
"type":           "string",
                         
"analyzer":       "english"
                     
}
               
}}
           
]
}}}

- "my_type" 기본 type 이외 사용자가 정의한 type에도 dynamic template 설정이 가능 합니다.

- "match" 는 field에 대한 동적 매칭을 정의 하는 것이며, 패턴 사용이 가능 합니다. 예제에서는 field 명에서 _es 로 끝나는 모든 필드를 의미 합니다.

- "match_mapping_type"은 dynamic mapping 을 통해서 지정된 type 이 뭔지 확인 하는 것입니다. 예제에서는 string 으로 mapping 된 것을 의미 하며, "match"와 함께 해석을 해야 합니다. 즉, *_es 필드명 이어야 하고 string type이면 아래 mapping 정보를 가진다는 의미가 됩니다.

- "mapping"은 type mapping 시 각 field 에 속성을 정의 하게 됩니다. 이 정의 하는 부분에 대한 값을 설정하게 됩니다.


전체적으로 위 예제의 의미는 모든 문자열 필드에 대한 형태소분석기는 english를 적용하고, 필드명에 _es 가 들어간 문자열 필드에 대해서는 형태소분석기로 spanish를 적용하라는 것입니다.


dynamic template 과 mapping 기능은 매우 유용하게 활용이 가능 합니다.

이해 하시는데 도움이 되면 좋겠내요.



:

[Elasticsearch] simple dynamic template 테스트

Elastic/Elasticsearch 2014. 12. 4. 18:01


[Setting 설정]

{

"settings" : {

"number_of_shards" : 3,

"number_of_replicas" : 0

}

}


- 생성

curl -XPUT 'http://localhost:9200/dynamic_template -d @setting.json


[Mapping 설정]

{

"_source" : {

"enabled" : "true"

},

"_all" : {

"enabled" : "false"

},

        "dynamic_templates": [

        {

            "string_match": {

                "mapping": {

                    "index": "not_analyzed",

                    "type": "string"

                },

                "match_mapping_type": "string",

                "match": "*"

            }

        }

      ],

     "properties" : {}

}


- 생성

curl -XPUT http://localhost:9200/dynamic_template/test1/_mapping -d @mapping.json

curl -XPUT http://localhost:9200/dynamic_template/test2/_mapping -d @mapping.json


[Add document]

curl -XPOST http://127.0.0.1:9200/dynamic_template/test1 -d '{"docid" : "1"}'

curl -XPOST http://127.0.0.1:9200/dynamic_template/test2 -d '{"docid" : 1}'



이후 test1과 test2에 설정된 docid 필드에 대한 type을 확인을 해보면 아래와 같이 나오게 된다.


{

   "dynamic_template": {

      "mappings": {

         "test2": {

            "dynamic_templates": [

               {

                  "string_match": {

                     "mapping": {

                        "index": "not_analyzed",

                        "type": "string"

                     },

                     "match": "*",

                     "match_mapping_type": "string"

                  }

               }

            ],

            "_all": {

               "enabled": false

            },

            "properties": {

               "docid": {

                  "type": "long"

               }

            }

         },

         "test1": {

            "dynamic_templates": [

               {

                  "string_match": {

                     "mapping": {

                        "index": "not_analyzed",

                        "type": "string"

                     },

                     "match": "*",

                     "match_mapping_type": "string"

                  }

               }

            ],

            "_all": {

               "enabled": false

            },

            "properties": {

               "docid": {

                  "index": "not_analyzed",

                  "type": "string"

               }

            }

         }

      }

   }

}



:

[Elasticsearch] embedded elasticsearrch server 테스트.

Elastic/Elasticsearch 2014. 11. 19. 16:59

내가 만드는 application 에 es 를 포함시켜 놓고 사용하고 싶을 때 사용하시면 됩니다.

이걸 어디에 사용하느냐는 알아서들 하시구요. ^^


기본 로직만 담아서 main 함수에 넣었으니 입맛에 맞게 수정 하시면 되겠내요.


[Embedded Elasticsearch Server]

public class EmbeddedElasticsearchServer {


    public static void main(String[] args) {

        ImmutableSettings.Builder settings = ImmutableSettings.settingsBuilder();

        settings.put("node.name", "embedded-local-node");

        settings.put("path.data", "data/index");


        Node node = NodeBuilder.nodeBuilder()

            .settings(settings)

            .clusterName("embedded-local-cluster")

            .data(true)

            .local(true)

            .node();


        Client client = node.client();


        CreateIndexRequest request = Requests.createIndexRequest("embedded-index").settings(settings);

        CreateIndexResponse response = client.admin().indices().create(request).actionGet();


        client.close();


        // node.close() 가 호출 되면 embedded elasticsearch daemon 은 stop 된다.

        node.close();

    }

}


보시면 기본 flow 는 이렇습니다.


1. elasticsearch.yml 을 대신 할 settings를 설정 합니다.

2. 1번 settings 정보를 갖는 node 를 생성 합니다.

----> 여기까지만 하면 es daemon 이 실행 됩니다.

3. embedded es server 로 접속할 client를 생성 합니다.

4. client를 이용해 index를 생성 합니다.

5. client 접속을 끊습니다.

----> client 가 close 되었지 daemon 은 그대로 listen 하고 있습니다.

6. embedded es server 를 종료 합니다.

----> node.close() 해야만 데몬이 종료 합니다.


여기까지가 기본 이구요.

활용은 각자 알아서 하시는 걸로 ^^

: