'Elastic/Elasticsearch'에 해당되는 글 343건

  1. 2019.07.30 [Elasticsearch] GC 설정 튜닝
  2. 2019.07.11 [Elasticsearch] Shard reroute (6.x)
  3. 2019.01.15 [Elasticsearch] 문서 모델링 펼치기
  4. 2018.12.20 [Elasticsearch] 인증과 알람을 위한 오픈소스 도구들
  5. 2018.12.19 [Elasticsearch] Keyword 와 Text 필드 간단 비교 설명
  6. 2018.12.19 [Elasticsearch] Settings/Mappings 테스트 템플릿
  7. 2018.10.04 [Elasticsearch] _analyze 예제 - 특수문자 제거
  8. 2018.08.01 [Elasticsearch] id max length
  9. 2018.07.25 [Elasticsearch] Dynamic template - _default_ deprecated.
  10. 2018.07.05 [Elasticsearch] Default field type 값.

[Elasticsearch] GC 설정 튜닝

Elastic/Elasticsearch 2019. 7. 30. 15:59

일부 6.x 버전을 사용하고 있는 클러스터가 있어서 GC 튜닝 설정 좋은 글이 있어 링크 공유 합니다.

 

https://medium.com/naukri-engineering/garbage-collection-in-elasticsearch-and-the-g1gc-16b79a447181

 

Garbage Collection in Elasticsearch and the G1GC - Naukri Engineering - Medium

Impact of Garbage collection in Elasticsearch and using the G1GC instead of the default CMS GC.

medium.com

이 글은 2018년 10월에 작성 된 글인데 읽어 보시고 적용해 보시면 확실히 개선 효과를 얻으실 수 있습니다.

 

구성된 클러스터에서 몇 가지 특징이 있는데 모든게 다 그렇지만 딱 들어 맞는건 어디에도 없습니다.

환경에 맞춰서 수정 하시고 적용 하셔야 낭패 보는 일이 없습니다.

 

...더보기

-XX:+UseG1GC
-XX:MaxGCPauseMillis=300
-XX:G1HeapRegionSize=16m

 

Trackbacks 0 : Comments 0

Write a comment


[Elasticsearch] Shard reroute (6.x)

Elastic/Elasticsearch 2019. 7. 11. 13:29

공식문서)

https://www.elastic.co/guide/en/elasticsearch/reference/7.2/cluster-reroute.html

 

Cluster Reroute | Elasticsearch Reference [7.2] | Elastic

The reroute command allows for manual changes to the allocation of individual shards in the cluster. For example, a shard can be moved from one node to another explicitly, an allocation can be cancelled, and an unassigned shard can be explicitly allocated

www.elastic.co

 

6.x 와 7.x 간에 차이 없이 사용 하실 수 있습니다.

 

POST _cluster/reroute
{
  "commands": [
    {
      "allocate_replica": {
        "index": "actlog-2019-07-05",
        "shard": 0,
        "node": "노드명"
      }
    }
  ]
}

POST _cluster/reroute
{
  "commands": [
    {
      "move": {
        "index": "actlog-2018-12-27",
        "shard": 0,
        "from_node": "노드명1",
        "to_node": "노드명2"
      }
    }
  ]
}

공식 문서에 설명이 잘 나와 있어서 제가 특별히 설명을 하지 않아도 될 것 같습니다.

 

move)

started shard 에 대해서 가능 합니다.

 

allocate_replica)

unassigned replica shard 에 대해서 가능 합니다.

 

이번에 제가 사용하게 된 이유는 데이터 노드 3개 중에 하나의 노드의 disk 가 85% 를 넘어서 replica shard 가 unassigned 되는 문제가 발생을 했습니다.

그래서 수동으로 임시 조치 하기 위해 reroute 했고요.

근본적인 해결 방법은 disk 용량을 확보 하시는 것입니다. 또는 85% 가 넘지 않도록 rolling 하시면 됩니다.

Trackbacks 0 : Comments 0

Write a comment


[Elasticsearch] 문서 모델링 펼치기

Elastic/Elasticsearch 2019. 1. 15. 19:13

상품 모델링을 하다 보니 부득이 flat 하게 펼쳐야 하는 이슈가 생겼습니다.

field 수만 수천개 ㅡ.ㅡ;

사실 C사에 있을 때 봤던 field 수가 1만개 이상 되었던 걸로 기억 하는데 어쩔 수 없이 저도 다르지만 비슷한 구조를 만들게 되었내요.


[원문]

https://www.elastic.co/guide/en/elasticsearch/reference/master/mapping.html#mapping-limit-settings


Elasticsearch 에서 기본 제약 사항은 아래와 같습니다.


index.mapping.total_fields.limit

The maximum number of fields in an index. Field and object mappings, as well as field aliases count towards this limit. The default value is 1000.


index.mapping.depth.limit

The maximum depth for a field, which is measured as the number of inner objects. For instance, if all fields are defined at the root object level, then the depth is 1. If there is one object mapping, then the depth is 2, etc. The default is 20.


index.mapping.nested_fields.limit

The maximum number of nested fields in an index, defaults to 50. Indexing 1 document with 100 nested fields actually indexes 101 documents as each nested document is indexed as a separate hidden document.


index.mapping.nested_objects.limit

The maximum number of nested json objects within a single document across all nested fields, defaults to 10000. Indexing one document with an array of 100 objects within a nested field, will actually create 101 documents, as each nested object will be indexed as a separate hidden document.


혹시라도 문서 모델링 하시다가 field limit 에 대한 정보가 궁금 할 것 같아 일단 북마킹 합니다.

모델링을 flat 하게 펼치게 된 이유는 시간에 대한 다양한 요구사항이 발생을 하다 보니 부득이 이와 같이 펼치게 되었습니다.

Trackbacks 0 : Comments 0

Write a comment


[Elasticsearch] 인증과 알람을 위한 오픈소스 도구들

Elastic/Elasticsearch 2018. 12. 20. 09:31

다양한 방법이 있을 수 있지만, 아래 도구를 잘 활용하는 것도 방법 입니다. :)


- elastalert

  https://elastalert.readthedocs.io/en/latest/


- readonlyrest

  https://readonlyrest.com/free/


- search guard

  https://search-guard.com/



Trackbacks 0 : Comments 0

Write a comment


[Elasticsearch] Keyword 와 Text 필드 간단 비교 설명

Elastic/Elasticsearch 2018. 12. 19. 10:12

초 간단 비교)

- 둘 다 searchable 합니다.

- keyword 는 형태소 분석을 하지 않습니다. (not analyzed)

- text 는 형태소 분석을 합니다. (analyzed)


시작 하기에 앞서 먼저 공홈에서 제공하는 레퍼런스 부터 보시죠.


[Keyword]

https://www.elastic.co/guide/en/elasticsearch/reference/current/keyword.html


[Text]

https://www.elastic.co/guide/en/elasticsearch/reference/current/text.html


사실 위 문서만 자세히 읽어 보셔도 두 필드의 용도와 차이점이 어떻게 되는지는 쉽게 아실 수 있습니다.

다만, 사용하다 보면 놓치는 부분이 발생을 하는데 여기서는 제가 놓친 부분에 대해서 같은 실수를 하지 않기 위해 글로 남겨 보려 합니다.


keyword 는 기본적으로 exact value 입니다.

문서에서는 이렇게 표현 하고 있습니다.


They are typically used for filtering (Find me all blog posts where status is published), for sorting, and for aggregations. Keyword fields are only searchable by their exact value.


- filtering

- sorting

- aggregations

- searchable

- exact value


이 내용만 보시면 어떤 부분이 빠져 있다는 걸 알아채셔야 합니다.

결과적으로 말씀 드리면, 검색에 대한 내용만 있고 색인에 대한 내용은 빠져 있습니다.


색인에 대한 내용은 사실 문서의 

https://www.elastic.co/guide/en/elasticsearch/reference/current/keyword.html#keyword-params

이 부분을 보시면 되긴 합니다.

하지만 이 내용을 보더라도 쉽게 놓칠 수 있는 부분이 있습니다.

바로 형태소 분석이 어떻게 이루어 지느냐 입니다.


기본 analyzer 설정을 하지 않으면 standard analyzer 로 지정이 됩니다.

이 analyzer 는 기본적으로 lowercase filter 적용이 되어 있습니다.

그럼 keyword field 의 value 는 모두 lowercase filter 적용이 되겠지요?


뭐 아시겠지만 lowercase filter 적용이 되지 않습니다.

parameter 설정을 찾아 보셔서 아시겠지만 analyzer 설정 하는 내용이 없습니다.

text 의 경우 per field analyzer 설정이 가능 합니다.

하지만 keyword 는 설정을 할 수가 없습니다.

이 말은 keyword field 의 value 는 입력 상태 그대로의 값이 저장 된다고 보시면 됩니다.

별도의 token filter 적용이 되지 않는 다는 것입니다.


[KeywordFieldMapper]

public static class Defaults {
public static final MappedFieldType FIELD_TYPE = new KeywordFieldType();

static {
FIELD_TYPE.setTokenized(false);
FIELD_TYPE.setOmitNorms(true);
FIELD_TYPE.setIndexOptions(IndexOptions.DOCS);
FIELD_TYPE.freeze();
}

public static final String NULL_VALUE = null;
public static final int IGNORE_ABOVE = Integer.MAX_VALUE;
}


여기서 그럼 이 야기를 왜 하는 것일까요?

한글은 대소문자 구분이 없어서 상관 없지만 영문자와 같은 경우 대소문자 구분이 된다는 이야기를 드리기 위해서 이렇게 서론이 길었습니다.



결론)

Keyword 필드의 Value 는 Token filter 적용이 되지 않습니다.

대소문자 구분에 주의 해서 사용 하셔야 합니다.



Trackbacks 0 : Comments 0

Write a comment


[Elasticsearch] Settings/Mappings 테스트 템플릿

Elastic/Elasticsearch 2018. 12. 19. 09:46

그냥 뭐 급하게 테스트 할 때 필요해서 올려 놓고 쓰려고 합니다.

(git 에 올리면 될 것을 ㅡ.ㅡ;;)


http://localhost:9200/helloworld

{

    "settings": {

        "index": {

            "number_of_shards": 1,

            "number_of_replicas": 0,

            "analysis": {

                "analyzer": {

                    "custom_analyzer": {

                        "tokenizer": "standard",

                        "filter": [

                            "lowercase",

                            "trim",

                            "custom_synonym"

                        ]

                    },

                    "cnori_analyzer" : {

                    "type" : "custom",

                    "tokenizer" : "cnori_tokenizer"

                    }

                },

                "tokenizer" : {

                "cnori_tokenizer" : {

                "type": "nori_tokenizer",

            "decompound_mode": "mixed"

                }

                },

                "filter": {

                    "custom_synonym": {

                        "type": "synonym_graph",

                        "synonyms": []

                    }

                }

            }

        }

    },

    "mappings": {

        "_doc": {

            "properties": {

                "title": {

                    "type": "text",

                    "analyzer" : "cnori_analyzer",

                    "fielddata" : true

                },

                "name": {

                    "type": "keyword"

                },

                "age": {

                    "type": "integer"

                },

                "created": {

                    "type": "date",

                    "format": "strict_date_optional_time||epoch_millis"

                }

            }

        }

    }

}



Trackbacks 0 : Comments 0

Write a comment


[Elasticsearch] _analyze 예제 - 특수문자 제거

Elastic/Elasticsearch 2018. 10. 4. 08:02

색인 시점에 text 에 포함된 특수 문자를 제거 하기 위한 예시 입니다.


[실행]

curl -X POST \

  http://localhost:9200/_analyze \

  -H 'cache-control: no-cache' \

  -H 'content-type: application/json' \

  -d '{

  "tokenizer": "arirang_tokenizer",

  "filter":[

              "lowercase",

              "trim",

              "arirang_filter"

            ],

  "char_filter" : [{

          "type": "pattern_replace",

          "pattern": "\\p{Punct}|\\d",

          "replacement": " "

        }],

  "text": "애플(&<>,./^!@+=;:%)파이"

}'



[결과]

{

    "tokens": [

        {

            "token": "애플",

            "start_offset": 0,

            "end_offset": 2,

            "type": "korean",

            "position": 0

        },

        {

            "token": "파이",

            "start_offset": 18,

            "end_offset": 20,

            "type": "korean",

            "position": 1

        }

    ]

}


Trackbacks 0 : Comments 0

Write a comment


[Elasticsearch] id max length

Elastic/Elasticsearch 2018. 8. 1. 13:19

IndexRequest 클래스에 보면 id 에 대한 max length 제한이 들어 있습니다.

혹시 몰라 코드 올려 봅니다.


if (id != null && id.getBytes(StandardCharsets.UTF_8).length > 512) {
validationException = addValidationError("id is too long, must be no longer than 512 bytes but was: " +
id.getBytes(StandardCharsets.UTF_8).length, validationException);
}


최대 512 bytes

Trackbacks 0 : Comments 0

Write a comment


[Elasticsearch] Dynamic template - _default_ deprecated.

Elastic/Elasticsearch 2018. 7. 25. 09:49

늘 그렇지만 다 기억 못합니다.


https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-templates.html

https://www.elastic.co/guide/en/elasticsearch/reference/current/default-mapping.html


_default_ 가 deprecated 되었습니다.


이와 더불어 사용시 아래와 같은 에러가 발생을 경험 할 수 있는데요.


org.elasticsearch.index.mapper.MapperParsingException: Failed to parse mapping [_default_]: No field type matched on [integer], possible values are [object, string, long, double, boolean, date, binary]


"mappings": {
"_default_": {
"dynamic_templates": [
{

...중략...

우선  _default_ 는 다른 type name 을 작성해 주시면 됩니다.

원문에서와 같이 _doc 이나 _log 나 default 와 같은...


그리고 저 위에 에러는 dynamic templates 사용 시 field type 정보를 보시면 이해가 되실 겁니다.

우리가 흔히 알고 있는 mapping field type 과 조금 다르기 때문에 잘 인지 하고 계시면 삽질은 피하실 수 있습니다.


https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-templates.html#match-mapping-type


match_mapping_type

The match_mapping_type matches on the datatype detected by dynamic field mapping, in other words, the datatype that Elasticsearch thinks the field should have. Only the following datatypes can be automatically detected: boolean, date, double, long, object, string. It also accepts * to match all datatypes.


더불어서 잘못 생성된 템플릿을 삭제해야 할 필요가 있습니다.

가끔 아래와 같은 에러가 발생 하는데 이럴 경우 템플릿을 삭제 후 다시 등록 하시면 됩니다.


https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-templates.html

https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-templates.html#delete


java.lang.IllegalArgumentException: Rejecting mapping update to [monitoring-20180725] as the final mapping would have more than 1 type: [log, doc]


DELETE /_template/template_1


Trackbacks 0 : Comments 0

Write a comment


[Elasticsearch] Default field type 값.

Elastic/Elasticsearch 2018. 7. 5. 11:04

elasticsearch 문서 모델링 하면서 잘 알고 있다고 생각 하지만 늘 그렇듯 잘 잊어버립니다.

그래서 올려 봅니다. (어딘가에 글 올려 놓은게 있긴 할테지만.. )



우선, FieldMapper 클래스를 확인 합니다.

여기서 보면 MappedFieldType 클래스로 넘어 가게 됩니다.


그래서 default field type 은 아래와 같습니다.


public MappedFieldType() {
setTokenized(true);
setStored(false);
setStoreTermVectors(false);
setOmitNorms(false);
setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS);
setBoost(1.0f);
}


Trackbacks 0 : Comments 0

Write a comment