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

  1. 2021.11.25 [Elasticsearch] LowLevelRestClient 를 이용한 개발 시 Json 결과 처리
  2. 2021.10.27 [Elasticsearch] Term vs Terms Query
  3. 2021.10.18 [Elasticsearch] Deep Pagination.
  4. 2021.10.06 [Elasticsearch] Date Format & Logback Timestamp Format
  5. 2021.09.15 [Elasticsearch] _analyze API 예제 영단어 처리.
  6. 2021.09.07 [Elasticsearch] Shard Awareness Allocation 사용 시 주의점.
  7. 2021.09.01 [Elasticsearch] Sum Aggs vs Stats Aggs ...
  8. 2021.08.12 [Elasticsearch] _routing 활용에 따른 특정 shard 만 _forcemerge 하고 싶을 경우.
  9. 2021.08.12 [Elasticsearch] RESTful API + ID:PASSWORD 요청.
  10. 2021.08.11 [Elasticsearch] Contribute 하고 싶으세요.

[Elasticsearch] LowLevelRestClient 를 이용한 개발 시 Json 결과 처리

Elastic/Elasticsearch 2021. 11. 25. 14:08

보통 Elasticsearch LLRC 를 이용해서 RESTful API 요청 하게 되면
...중략...
Request request = new Request(...중략...);
Response response = esClient.getRestClient().performRequest(request);
String body = EntityUtils.toString(response.getEntity());
...중략...

String 으로 결과를 받아서 리턴 하게 되는데 이 과정에서 JSON String 변환 시 slash 가 추가 되는 불편함이 있을 수 있습니다.
이걸 해소 하려면
...중략...
String body = EntityUtils.toString(response.getEntity());
JsonNode jsonNode = ObjectMapper.readTree(body);
...중략...
readTree 해서 JsonNode Object 로 변환 한 후 처리 하시면 {}, [] 등 모두 깔끔하게 처리가 가능 합니다.

 

ASIS)

{
	"response": "{ \"alias\": \"henry\" }"
}

{
	"response": "[
    	{ \"alias1\": \"henry\" },
        { \"alias2\": \"jeong\" }
      ]"
}

 

TOBE)

{
	"response": { "alias": "henry" }
}

{
	"response": [
    	{ "alias1": "henry" },
        { "alias2": "jeong" }
      ]
}

 

:

[Elasticsearch] Term vs Terms Query

Elastic/Elasticsearch 2021. 10. 27. 16:14

보셔야 하는 클래스는

- TermQueryBuilder

- TermsQueryBuilder

입니다.

 

두 Query 의 큰 차이는 단독으로 사용 되었을 때 Scoring 이 어떻게 되느냐 인데요.

Term 은 Score 계산이 되어서 나오고 Terms 는 Constant Score Query 처럼 1.0 으로 나온다는 것입니다.

 

코드를 좀 더 따라 가다 보면 

- MapperFieldType

클래스 내 Query API 들에 대한 Interface 나 Implement 코드를 확인해 보실 수 있습니다.

 

아래는 Terms Query 에 대한 코드를 가져온 내용입니다.

    /** Build a constant-scoring query that matches all values. The default implementation uses a
     * {@link ConstantScoreQuery} around a {@link BooleanQuery} whose {@link Occur#SHOULD} clauses
     * are generated with {@link #termQuery}. */
    public Query termsQuery(Collection<?> values, @Nullable SearchExecutionContext context) {
        BooleanQuery.Builder builder = new BooleanQuery.Builder();
        for (Object value : values) {
            builder.add(termQuery(value, context), Occur.SHOULD);
        }
        return new ConstantScoreQuery(builder.build());
    }

뭐 혼자 기억 하기 위한 기록 이라서 이 정도까지만 기록해 두겠습니다.

 

:

[Elasticsearch] Deep Pagination.

Elastic/Elasticsearch 2021. 10. 18. 10:43

Elasticsearch 레퍼런스 문서 입니다.

 

https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html
Deep pagination 기능 구현을 위해서는 Scroll API 를 더 이상 추천 하지 않습니다.
search_after API 를 이용해서 구현 하는 것을 추천 합니다.

Scroll API 는 실시간 서비스를 위한 용도가 아니며, 전체 데이터(대용량 데이터)에 대한 재색인 또는 재구성을 위한 용도로 사용을 합니다.

 

scroll 보다는 search_after 를 사용하라고 하고 있으며, 두 API 모두 전체 또는 특정 질의 조건에 따라 탐색 및 페이징 처리가 가능 합니다.

 

단, 이 기능을 사용 하실 경우

- Cluster 내 Node 의 자원이 충분한지 확인 하시고

- 실시간 서비스 용도로 사용을 하지 마시고

- 색인 요청은 없는지도 확인 하시고

사용 하시길 추천 드립니다.

:

[Elasticsearch] Date Format & Logback Timestamp Format

Elastic/Elasticsearch 2021. 10. 6. 12:18

Elasticsearch 에서 data field 를 이용해서 range 질의를 하기 위해서는 format 을 잘 맞춰 줘야 합니다.

Springboot 로 개발 한 WAS 에서 로그를 JSON 으로 찍으면서 timestamp 값에 대한 format 기 위한 설정에 대해서 기록 합니다.

 

참고문서)

https://www.elastic.co/guide/en/elasticsearch/reference/current/date.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html
http://logback.qos.ch/manual/layouts.html

 

Logback Timestamp Format & JSON 설정)

https://jjeong.tistory.com/1570

  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
      <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
        <timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSS'Z'</timestampFormat>
        <timestampFormatTimezoneId>Asia/Seoul</timestampFormatTimezoneId>
        <appendLineSeparator>true</appendLineSeparator>
        <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
          <prettyPrint>true</prettyPrint>
        </jsonFormatter>
      </layout>
    </encoder>
  </appender>

 

Timestamp Formet Index)

{
  "mappings": {
    "properties": {
      "timestamp": {
        "type":   "date",
        "format": "strict_date_optional_time||epoch_millis",
        "ignore_malformed": true
      }
    }
  }
}

위 foramt 설정은 별도로 하지 않아도 기본 설정 됩니다.

 

Document Put)

{
    "timestamp" : "2021-10-06T11:33:46.855Z"
}

Range Query )

[Case 1]
{
    "query": {
        "range" : {
            "ts": {
                "gte": "2021-10-06T11:33:36.000Z",
                "lte": "2021-10-06T11:34:38.000Z"
            }
        }
    }
}

[Case 2]
{
    "query": {
        "range" : {
            "ts": {
                "gte": "2021-10-06 11:33:36.000",
                "lte": "2021-10-06 11:34:38.000",
                "format": "yyyy-MM-dd HH:mm:ss.SSS"
            }
        }
    }
}

결국 입력 값이 정확 하면 질의 시 format 을 지정해서 편하게 검색이 가능 합니다.

 

:

[Elasticsearch] _analyze API 예제 영단어 처리.

Elastic/Elasticsearch 2021. 9. 15. 11:44

아리랑을 이용한 영단어 처리와 특수문자 제거 예제 입니다.

_analyze API 예제 이고 index 에는 settings 에 선언 하시면 됩니다.

{
    "tokenizer" : "arirang_tokenizer",
    "filter": [        
        "arirang_filter",
        {
            "type": "stemmer",
            "language": "possessive_english"
        },
        "lowercase",
        "classic",
        {
            "type": "stemmer",
            "language": "english"
        }
    ],
    "char_filter": {
        "type": "pattern_replace",
        "pattern": "\\p{Punct}",
        "replacement": ""
    },
    "text": ""
}

text 부분에 분석할 문자열을 넣으세요.

:

[Elasticsearch] Shard Awareness Allocation 사용 시 주의점.

Elastic/Elasticsearch 2021. 9. 7. 23:30

로컬에서 테스트 할 때 주의 해야 하는 점이 있습니다. 

같은 shard 가 같은 host 장비에 할당 되게 하려고 아래와 같은 설정을 합니다.

 

cluster.routing.allocation.same_shard.host: true

 

그런데 이 설정으로 인해서 shard allocation 적용 시 동작 하지 않게 됩니다.

사용 시 위 설정에 대해서 반드시 확인 하고 사용 하세요.

(같은 실수를 몇 번 하는 지 ㅡ.ㅡ;;)

:

[Elasticsearch] Sum Aggs vs Stats Aggs ...

Elastic/Elasticsearch 2021. 9. 1. 14:41

코드만 봤을 때는 sum 보다 stats 가 느려야 하는게 정상으로 보입니다.

실제 문서의 구조와 질의를 어떻게 사용 했는지를 모르는 상황에서는 sum 보다 stats 가 빠르다는 부분에 대해서는 판단 하기가 어렵네요.

 

일단 sum, stats 와 같은 aggs 를 잘 사용하기 위해서는 아래 내용 정도 인지 하고 사용 하시면 좋을 것 같아 기록해 봅니다.

 

  • field data 유형이 numeric, geopoint, range 그 이외 유형이거나 null 이 아니도록 처리 합니다.
  • null 에 대한 처리를 위해 missing parameter 를 적용 합니다.
  • if else 구조로 성능 이슈 있을 수 있습니다.
:

[Elasticsearch] _routing 활용에 따른 특정 shard 만 _forcemerge 하고 싶을 경우.

Elastic/Elasticsearch 2021. 8. 12. 14:07

그냥 pull request 날렸습니다.

https://github.com/elastic/elasticsearch/pull/76400


그러나 Contributor Agreement 를 안했다고 하는데 이것 참.. 
했는데 왜 저게 나오는지 도대체 Docu Sign 을 몇 번을 했는지 모르겠네요 ㅡ.ㅡ;


코드를 확인해 보니 _forcemerge API 에는 특정 shard 만 지정 하는 기능은 없었습니다.

뭐 어떻게 보면 당연한 이야기지만, 그래도 _routing 을 사용 하면서 특정 shard 로 operation 이 집중되게 되면 해당 shard 의  segments 파일이 많이 생성 될 수도 있습니다.

 

그래서 코드를 좀 고쳤습니다.

contribute 을 위해 pull request 를 올려야 하는데 이 귀차니즘을 어찌 하죠.

암튼 별건 아니라서 일단 코드 부터 올려 놓습니다. 

 

 

:

[Elasticsearch] RESTful API + ID:PASSWORD 요청.

Elastic/Elasticsearch 2021. 8. 12. 13:18

분명 어딘가에 기록해 두었는데 이걸 왜 못찾고 있는 거지..ㅡ.ㅡ;

 

http://elastic:password@localhost:9200/test-index

 

elasticsearch 에서 기본 인증을 사용 할 경우 API token 사용 이런게 아니라면 단순하게는 저렇게 보낼 수 있습니다.

 

https://www.ietf.org/rfc/rfc2617.txt

공식 스펙은 위 문서 참고 하시면 됩니다. (Basic Authentication)

 

URL 로 보내기 싫으시면 header 로 보내시면 됩니다.

 

elastic:password 를 base64 인코딩 하시고 "Authorization" 헤더로 값을 보내시면 되겠습니다.

 

KEY : Authorization

VALUE : Basic ZWxhc3RpYzpwYXNzd29yZA==

 

:

[Elasticsearch] Contribute 하고 싶으세요.

Elastic/Elasticsearch 2021. 8. 11. 14:00

Quick 하게 아래 처럼 일단 시작 부터 해봅시다.

 

[Elasticsearch Contribute]
https://github.com/elastic/elasticsearch/blob/master/CONTRIBUTING.md

소스코드 내려 받고 elasticsearch 7.14.0 빌드 및 실행
운영 환경에서 실행 시 jdk 11 로 가능 하지만 빌드 시는 jdk 16 을 요구 합니다.

% jenv local 16
% ./gradlew :run

 

: