<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>jjeong</title>
    <link>https://jjeong.tistory.com/</link>
    <description>실무 예제로 배우는
Elasticsearch
검색엔진</description>
    <language>ko</language>
    <pubDate>Tue, 14 Apr 2026 17:04:55 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>jjeong</managingEditor>
    <image>
      <title>jjeong</title>
      <url>https://t1.daumcdn.net/cfile/tistory/2204FE3C53314B8F21</url>
      <link>https://jjeong.tistory.com</link>
    </image>
    <item>
      <title>앞으로도 업데이트는 당분간 힘들것 같습니다.</title>
      <link>https://jjeong.tistory.com/1640</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;거의 관리를 못하고 있고 기술 블로그 글도 못 올리고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사에서 못하게 하고 있고, 이런걸로 문제가 되는 것도 싫어서 저도 안올리고 있는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 있는 곳에서는 계속 어려울 것 같고, 이직을 하게 되면 그 나마 가능 하지 않을까 싶네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로 얼마나 더 걸릴지 모르겠지만, 재미가 너무 없어서 그냥 끄적여 봤습니다.&lt;/p&gt;</description>
      <category>ITWeb/개발일반</category>
      <author>jjeong</author>
      <guid isPermaLink="true">https://jjeong.tistory.com/1640</guid>
      <comments>https://jjeong.tistory.com/1640#entry1640comment</comments>
      <pubDate>Thu, 14 Nov 2024 09:36:21 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Script 기반 파이썬 개발 진행</title>
      <link>https://jjeong.tistory.com/1638</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬을 사용 할 때 라이브러리라 환경에 따라 동작이 제대로 되지 않는 경우가 있어서 개발 환경에 대한 표준화를 고민 하는게 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 스크립트만 작성해서 실행 하고 싶을 때라도 기본 vitualenv 환경에서 구성하고 실행 하는게 좋겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;패키지구조)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1670979754010&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ㄴ hello_world.py
ㄴ requirements.txt
ㄴ venv_wrapper.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;venv_wrapper.sh)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1670979766525&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python3 -m venv venv
. venv/bin/activate
pip3 install -r requirements.txt
python3 hello_world.py&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 방식이 싫다면 도커 기반으로 구성을 해도 좋습니다.&lt;/p&gt;</description>
      <category>ITWeb/개발일반</category>
      <category>python</category>
      <category>venv</category>
      <category>virtualenv</category>
      <author>jjeong</author>
      <guid isPermaLink="true">https://jjeong.tistory.com/1638</guid>
      <comments>https://jjeong.tistory.com/1638#entry1638comment</comments>
      <pubDate>Wed, 14 Dec 2022 10:04:37 +0900</pubDate>
    </item>
    <item>
      <title>[Elasticsearch] Accessing document field on scripts</title>
      <link>https://jjeong.tistory.com/1637</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;아는 것도 시간이 지나면 다 까먹는 나이!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[레퍼런스]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting-fields.html#_search_and_aggregation_scripts&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting-fields.html#_search_and_aggregation_scripts&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting-expression.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting-expression.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;접근 유형에 따른 성능)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;doc value 가 가장 빠르고 _source 와 _fields 는 비슷 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;QueryDSL 예제)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1669190850600&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;GET /kibana_sample_data_ecommerce/_search
{
  &quot;query&quot;: {
    &quot;script_score&quot;: {
      &quot;query&quot;: {
        &quot;bool&quot;: {
          &quot;filter&quot;: {
            &quot;term&quot;: {
              &quot;products.product_name&quot;: &quot;shirt&quot;
            }
          }
        }
      },
      &quot;script&quot;: {
          &quot;lang&quot;: &quot;expression&quot;,
          &quot;source&quot;: &quot;_score * doc['taxless_total_price']&quot;
        }
    }
  }
}

GET /kibana_sample_data_ecommerce/_search
{
  &quot;query&quot;: {
    &quot;script_score&quot;: {
      &quot;query&quot;: {
        &quot;bool&quot;: {
          &quot;filter&quot;: {
            &quot;term&quot;: {
              &quot;products.product_name&quot;: &quot;shirt&quot;
            }
          }
        }
      },
      &quot;script&quot;: {
          &quot;lang&quot;: &quot;painless&quot;,
          &quot;source&quot;: &quot;_score * doc['taxless_total_price'].value&quot;
        }
    }
  }
}

GET /kibana_sample_data_ecommerce/_search
{
  &quot;query&quot;: {
    &quot;script_score&quot;: {
      &quot;query&quot;: {
        &quot;bool&quot;: {
          &quot;filter&quot;: {
            &quot;term&quot;: {
              &quot;products.product_name&quot;: &quot;shirt&quot;
            }
          }
        }
      },
      &quot;script&quot;: {
          &quot;lang&quot;: &quot;painless&quot;,
          &quot;source&quot;: &quot;_score * params._source.taxless_total_price&quot;
        }
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;expression 과 painless 에 따라 다르기 때문에 사용에 주의 하세요.&lt;/p&gt;</description>
      <category>Elastic/Elasticsearch</category>
      <category>elastic</category>
      <category>elasticsearch</category>
      <category>Expression</category>
      <category>painless</category>
      <category>script</category>
      <author>jjeong</author>
      <guid isPermaLink="true">https://jjeong.tistory.com/1637</guid>
      <comments>https://jjeong.tistory.com/1637#entry1637comment</comments>
      <pubDate>Wed, 23 Nov 2022 17:08:21 +0900</pubDate>
    </item>
    <item>
      <title>[Elasticsearch] Date Type 사용 시</title>
      <link>https://jjeong.tistory.com/1636</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Elastic Stack 에서 Date Field Type 사용 시 내용을 인지 하고 사용 하셔야 데이터에 대해서 기대한 결과를 얻을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선, Elasticsearch 는 기본 UTC 시간을 사용 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;색인 되는 Date 값은 모두 UTC 로 저장 된다고 보시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 기본 질의 시 사용 하는 값도 UTC 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, Kibana 를 사용 하다 보면 UTC 에 대한 사용이 불편해서 브라우저 TZ 설정이나 사용자 정의 TZ 설정으로 Date 값을 사용 할 때가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 주의 해야 할 점은 실제 색인된 데이터에 대한 변형이나 조작이 있는게 아닌 Client 단에서 TZ 설정에 따른 질의 시 Date 값 변환이나 화면에서의 조작을 한다는 것을 알아야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 설명은 그냥 저 혼자 기억하기 위해서 풀어 쓴걸 올려 둔 내용 입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1669035402940&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- kibana 에서는 실제 색인된 date 유형의 값에 대한 tz 설정으로 화면에서 변환 된 정보로 보여 주는 것이며,
실제 질의는 utc 데이터로 질의가 이루어 집니다.
  ㄴ 결국 query dsl 작성 시 utc 기준으로 작성이 되어야 하기 때문에
     본인이 속한 tz 값을 계산 해서 질의 값에 반영이 되어야 합니다.
  ㄴ 단순 tz 설정만 하고 현재 속한 tz 값 기준으로 질의를 작성 하게 되면
     KST 기준으로는 미래에 대한 datetime 값으로 질의를 하게 되어 데이터가 존재 하지 않을 수 있습니다.

  QueryDSL UTC 값 변환을 위한 TZ 설정과 값은 아래와 같이 해야 동작 합니다.
    KST 기준으로 오전 11시 보다 큰 값으로 질의 하고자 할 때 Elasticsearch 는 UTC 기준으로
    오전 2시 보다 큰 값으로 질의가 되어야 합니다.
      &quot;time_zone&quot;: &quot;+09:00&quot;,
      &quot;gte&quot;: &quot;2022-11-18T11:00:00.000&quot;
      to
      &quot;gte&quot;: &quot;2022-11-18T02:00:00.000&quot;
    와 같이 실제 Elasticsearch 에 저장 되는 UTC 값으로 변환 되어 질의하게 됩니다.
    아래와 같이 설정 되면 동작 하지 않습니다.
      &quot;time_zone&quot;: &quot;+09:00&quot;,
      &quot;gte&quot;: &quot;2022-11-18T11:00:00.000Z&quot;
    Z 가 들어 가게 되면 TZ 설정이 적용 무시 되고 값 자체를 UTC 값으로 질의 하게 됩니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Z 는 java.time 아래 클래스 관련 설명이 되어 있습니다. (소스코드 참고하세요.)&lt;/p&gt;</description>
      <category>Elastic/Elasticsearch</category>
      <category>date</category>
      <category>elastic</category>
      <category>elasticsearch</category>
      <category>querydsl</category>
      <category>UTC</category>
      <author>jjeong</author>
      <guid isPermaLink="true">https://jjeong.tistory.com/1636</guid>
      <comments>https://jjeong.tistory.com/1636#entry1636comment</comments>
      <pubDate>Mon, 21 Nov 2022 21:59:28 +0900</pubDate>
    </item>
    <item>
      <title>[Elasticsearch] Document Count 정보가 필요해.</title>
      <link>https://jjeong.tistory.com/1635</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;용도와 목적에 맞게 선택해서 사용 하면 될 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Date Histogram&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-datehistogram-aggregation.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-datehistogram-aggregation.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Count API&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.elastic.co/guide/en/elasticsearch/reference/8.5/cat-count.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.elastic.co/guide/en/elasticsearch/reference/8.5/cat-count.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.elastic.co/guide/en/elasticsearch/reference/8.5/search-count.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.elastic.co/guide/en/elasticsearch/reference/8.5/search-count.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. Stats API&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.elastic.co/guide/en/elasticsearch/reference/8.5/indices-stats.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.elastic.co/guide/en/elasticsearch/reference/8.5/indices-stats.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서 수가 가끔 필요할 때가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제공 하는 API 를 활용해서 목적에 맞게 사용 하면 될 것 같습니다.&lt;/p&gt;</description>
      <category>Elastic/Elasticsearch</category>
      <category>count</category>
      <category>document</category>
      <category>elastic</category>
      <category>elasticsearch</category>
      <author>jjeong</author>
      <guid isPermaLink="true">https://jjeong.tistory.com/1635</guid>
      <comments>https://jjeong.tistory.com/1635#entry1635comment</comments>
      <pubDate>Wed, 16 Nov 2022 11:25:51 +0900</pubDate>
    </item>
    <item>
      <title>[Elasticsearch] Keword Field 내 Normalizer 선언 시 주의 사항.</title>
      <link>https://jjeong.tistory.com/1634</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공홈 레퍼런스 문서)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.elastic.co/guide/en/elasticsearch/reference/8.5/term-level-queries.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.elastic.co/guide/en/elasticsearch/reference/8.5/term-level-queries.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.elastic.co/guide/en/elasticsearch/reference/8.5/normalizer.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.elastic.co/guide/en/elasticsearch/reference/8.5/normalizer.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한 줄 요약)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Keyword field 의 경우 normalizer 선언을 할 경우 index analyzer 뿐만 아니라 search analyzer 에도 동일하게 적용 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 Keyword field 사용 시 term level query 를 사용하게 되면 검색어에 대한 형태소 분석 없이 token 에 대한 exact matching 을 한다고 가정 하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우에 해당 하기 위해서는 keyword field 선언 시 normalizer 선언이 없어야 적용이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 관련 코드에 대해서 일부 snippet 한 내용입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1668428272681&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;NamedAnalyzer normalizer = Lucene.KEYWORD_ANALYZER;
NamedAnalyzer searchAnalyzer = Lucene.KEYWORD_ANALYZER;
NamedAnalyzer quoteAnalyzer = Lucene.KEYWORD_ANALYZER;
String normalizerName = this.normalizer.getValue();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;KeywordFieldMapper 클래스에 선언된 코드 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보시면 기본 Search Analyzer 는 Keyword Analyzer 입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1668428366563&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...중략...
searchAnalyzer = quoteAnalyzer = normalizer;
...중략...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 중간에 들어가 보면 이와 같이 선언 된 것을 보실 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고&amp;nbsp;노말라이저&amp;nbsp;선언이&amp;nbsp;없으면&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1668428426220&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;searchAnalyzer = Lucene.WHITESPACE_ANALYZER;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Whitespace Analyzer 로 선언 되는 것도 확인이 가능 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;보시면&amp;nbsp;아시겠지만&amp;nbsp;기본적으로 Keyword&amp;nbsp;type&amp;nbsp;에&amp;nbsp;선언&amp;nbsp;되는 Search Analyzer&amp;nbsp;는&amp;nbsp;Lucene.KEYWORD_ANALYZER&amp;nbsp;로&amp;nbsp;선언&amp;nbsp;되게&amp;nbsp;되어&amp;nbsp;있습니다.&lt;br /&gt;즉, Normalizer&amp;nbsp;선언이&amp;nbsp;없으면&amp;nbsp;기본이&amp;nbsp;키워드&amp;nbsp;인거죠.&amp;nbsp;그래서&amp;nbsp;별도&amp;nbsp;형태소&amp;nbsp;분석&amp;nbsp;과정이&amp;nbsp;없다보&amp;nbsp;인식&amp;nbsp;하는&amp;nbsp;건데&amp;nbsp;사실&amp;nbsp;없다고&amp;nbsp;보기&amp;nbsp;어렵고 Keyword Analyzer&amp;nbsp;의 Token Filter&amp;nbsp;를&amp;nbsp;따른다고&amp;nbsp;이해&amp;nbsp;하는게&amp;nbsp;맞습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;a href=&quot;https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-keyword-analyzer.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-keyword-analyzer.html&lt;/a&gt;&lt;br /&gt;이&amp;nbsp;분석기는&amp;nbsp;아무런&amp;nbsp;선언을&amp;nbsp;하지&amp;nbsp;않으면&amp;nbsp;noop&amp;nbsp;에&amp;nbsp;&amp;nbsp;정확히&amp;nbsp;텍스트가&amp;nbsp;일치해야&amp;nbsp;하는&amp;nbsp;분석기&amp;nbsp;입니다.&lt;br /&gt;근데&amp;nbsp;색인&amp;nbsp;시점에&amp;nbsp;whitespace&amp;nbsp;를&amp;nbsp;포함한&amp;nbsp;텍스트를&amp;nbsp;keyword&amp;nbsp;로&amp;nbsp;선언&amp;nbsp;하고&amp;nbsp;이걸&amp;nbsp;whitespace&amp;nbsp;로&amp;nbsp;토큰&amp;nbsp;분해&amp;nbsp;하고&amp;nbsp;싶을&amp;nbsp;경우&amp;nbsp;&lt;b&gt;&quot;split_queries_on_whitespace&quot;&lt;/b&gt;&amp;nbsp;이&amp;nbsp;옵션을&amp;nbsp;&lt;b&gt;true&lt;/b&gt;&amp;nbsp;로&amp;nbsp;해주시면&amp;nbsp;됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;그럼&amp;nbsp;KeywordAnalyzer/Tokenizer&amp;nbsp;이넘의&amp;nbsp;기본&amp;nbsp;형태소&amp;nbsp;분석은&amp;nbsp;그냥&amp;nbsp;텍스트를&amp;nbsp;하나의&amp;nbsp;토큰으로&amp;nbsp;분석&amp;nbsp;한다고&amp;nbsp;이해&amp;nbsp;하시면 되겠습니다.&lt;br /&gt;여기서&amp;nbsp;whitespace&amp;nbsp;단위로&amp;nbsp;분해하고&amp;nbsp;싶으면&amp;nbsp;바로&amp;nbsp;위에&amp;nbsp;옵션&amp;nbsp;활용,&amp;nbsp;그리고&amp;nbsp;normalizer&amp;nbsp;는&amp;nbsp;토큰에&amp;nbsp;적용&amp;nbsp;되는데&amp;nbsp;search&amp;nbsp;analyzer&amp;nbsp;에&amp;nbsp;반영&amp;nbsp;된다는&amp;nbsp;걸&amp;nbsp;기억&amp;nbsp;하면&amp;nbsp;됩니다.&lt;br /&gt;문서에&amp;nbsp;나와&amp;nbsp;있던&amp;nbsp;내용&amp;nbsp;그대로&amp;nbsp;이고요.&amp;nbsp;코드&amp;nbsp;상으로는&amp;nbsp;어떻게&amp;nbsp;되어&amp;nbsp;있을까&amp;nbsp;궁금해서&amp;nbsp;찾아본&amp;nbsp;내용&amp;nbsp;공유&amp;nbsp;드립니다.&amp;nbsp;^^&lt;br /&gt;&lt;br /&gt;보셔야&amp;nbsp;하는&amp;nbsp;클래스는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;KeyowrdFieldMapper&lt;/li&gt;
&lt;li&gt;KeywordAnalyzer&lt;/li&gt;
&lt;li&gt;KeywordTokenizer&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Elastic/Elasticsearch</category>
      <author>jjeong</author>
      <guid isPermaLink="true">https://jjeong.tistory.com/1634</guid>
      <comments>https://jjeong.tistory.com/1634#entry1634comment</comments>
      <pubDate>Mon, 14 Nov 2022 21:23:04 +0900</pubDate>
    </item>
    <item>
      <title>[Groovy] Jenkins Pipeline Job 생성 시 bash 사용</title>
      <link>https://jjeong.tistory.com/1633</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;jenkins pipeline job 을 생성하고 groovy 스크립트 내부에서 일반 shell script 를 사용 할 때가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 아래와 같이 많이 사용 하는데요.&lt;/p&gt;
&lt;pre id=&quot;code_1667261653651&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sh '''
echo &quot;Hello World!&quot;
'''&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bash 를 지정해서 사용 하고자 할 때는 아래와 같이 적용을 해줘야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1667261714673&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sh '''#!/bin/bash
echo &quot;Hello Bash!!&quot;
'''&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 사용 시 주의사항은 #!/bin/bash 를 ''' 에 붙혀서 작성을 해줘야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ITWeb/개발일반</category>
      <author>jjeong</author>
      <guid isPermaLink="true">https://jjeong.tistory.com/1633</guid>
      <comments>https://jjeong.tistory.com/1633#entry1633comment</comments>
      <pubDate>Tue, 1 Nov 2022 09:16:40 +0900</pubDate>
    </item>
    <item>
      <title>[Beats] Filebeat Output.logstash 전송 방식.</title>
      <link>https://jjeong.tistory.com/1632</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Filebeats&amp;nbsp;output.logstash&amp;nbsp;는&amp;nbsp;기본&amp;nbsp;async&amp;nbsp;로&amp;nbsp;전송&amp;nbsp;합니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;공홈&amp;nbsp;문서)&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://www.elastic.co/guide/en/beats/filebeat/current/logstash-output.html#_pipelining&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.elastic.co/guide/en/beats/filebeat/current/logstash-output.html#_pipelining&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;pipelining&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1666678647426&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Configures the number of batches to be sent asynchronously to Logstash while waiting for ACK from Logstash.
Output only becomes blocking once number of pipelining batches have been written. 
Pipelining is disabled if a value of 0 is configured.
The default value is 2.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;소스코드)&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/elastic/beats/blob/main/libbeat/outputs/logstash/logstash.go&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/elastic/beats/blob/main/libbeat/outputs/logstash/logstash.go&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1666678672303&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if config.Pipelining &amp;gt; 0 {
  client, err = newAsyncClient(beat, conn, observer, config)
} else {
  client, err = newSyncClient(beat, conn, observer, config)
}&lt;/code&gt;&lt;/pre&gt;
&lt;figure id=&quot;og_1666678593234&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Configure the Logstash output | Filebeat Reference [8.4] | Elastic&quot; data-og-description=&quot;If ILM is not being used, set index to %{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd} instead so Logstash creates an index per day, based on the @timestamp value of the events coming from Beats.&quot; data-og-host=&quot;www.elastic.co&quot; data-og-source-url=&quot;https://www.elastic.co/guide/en/beats/filebeat/current/logstash-output.html#_pipelining&quot; data-og-url=&quot;https://www.elastic.co/guide/en/beats/filebeat/current/logstash-output.html#_pipelining&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.elastic.co/guide/en/beats/filebeat/current/logstash-output.html#_pipelining&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.elastic.co/guide/en/beats/filebeat/current/logstash-output.html#_pipelining&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Configure the Logstash output | Filebeat Reference [8.4] | Elastic&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;If ILM is not being used, set index to %{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd} instead so Logstash creates an index per day, based on the @timestamp value of the events coming from Beats.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.elastic.co&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내용과 코드를 보시면 쉽게 이해가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pipelining 설정은 기본 2 이고 이 값이 0 보다 크면 async 로 전송 하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더불어ㅏ서 pipelining 값은 core 크기와 동일하게 맞춰서 사용 하시면 성능적 효과를 얻을 수 있습니다.&lt;br /&gt;(정답은 아니고 장비에 대한 용도와 올라가는 어플리케이션에 따라 다를 수 있으니 성능 테스트는 꼭 해보시기 바랍니다.)&lt;/p&gt;</description>
      <category>Elastic/Beats</category>
      <category>beats</category>
      <category>elastic</category>
      <category>filebeat</category>
      <category>logstash</category>
      <category>output</category>
      <author>jjeong</author>
      <guid isPermaLink="true">https://jjeong.tistory.com/1632</guid>
      <comments>https://jjeong.tistory.com/1632#entry1632comment</comments>
      <pubDate>Tue, 25 Oct 2022 15:19:52 +0900</pubDate>
    </item>
    <item>
      <title>[Elasticsearch] Elasticsearch ES-Hadoop 내 Spark Bulk Request Error Handler</title>
      <link>https://jjeong.tistory.com/1631</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Spark&amp;nbsp;을&amp;nbsp;이용해서&amp;nbsp;Elasticsearch&amp;nbsp;로&amp;nbsp;Bulk&amp;nbsp;Request&amp;nbsp;를&amp;nbsp;사용할&amp;nbsp;경우&amp;nbsp;내부에서는&amp;nbsp;BulkProcessor&amp;nbsp;를&amp;nbsp;이용해서&amp;nbsp;요청을&amp;nbsp;하게&amp;nbsp;됩니다.&lt;br /&gt;보통 BulkRequest 사용 시 색인 요청한 문서중 일부 오류가 발생 하는 경우 전체 문서 색인이 실패 하는 것이 아닌 오류 문서만 색인이 안되고, 나머지&amp;nbsp;문서들은&amp;nbsp;색인이&amp;nbsp;완료&amp;nbsp;되는데요.&amp;nbsp;&lt;br /&gt;ES-Hadoop&amp;nbsp;내&amp;nbsp;Spark&amp;nbsp;의&amp;nbsp;경우&amp;nbsp;기본&amp;nbsp;Error&amp;nbsp;Handler&amp;nbsp;가&amp;nbsp;AbortOnFailure&amp;nbsp;라서&amp;nbsp;요청한&amp;nbsp;모든&amp;nbsp;문서가&amp;nbsp;색인이&amp;nbsp;실패&amp;nbsp;하게&amp;nbsp;됩니다.&lt;br /&gt;이를&amp;nbsp;변경&amp;nbsp;하기&amp;nbsp;위해서는&amp;nbsp;Error&amp;nbsp;Handler&amp;nbsp;설정을&amp;nbsp;아래와&amp;nbsp;같이&amp;nbsp;변경하고&amp;nbsp;사용&amp;nbsp;하시면&amp;nbsp;됩니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[참고문서]&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://www.elastic.co/guide/en/elasticsearch/hadoop/8.4/errorhandlers.html#errorhandlers-bulk-use&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.elastic.co/guide/en/elasticsearch/hadoop/8.4/errorhandlers.html#errorhandlers-bulk-use&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[설정]&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1663644811721&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;example)
es.write.data.error.handlers = log

SparkSession.builder().appName(&quot;...&quot;).config(&quot;es.write.rest.error.handlers&quot;, &quot;log&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;[참고코드]&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1663644841878&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// BulkWriteHandlerLoader / BulkWriteErrorHandler

@Override
protected IBulkWriteErrorHandler loadBuiltInHandler(AbstractHandlerLoader.NamedHandlers handlerName) {
    ErrorHandler&amp;lt;BulkWriteFailure, byte[], DelayableErrorCollector&amp;lt;byte[]&amp;gt;&amp;gt; genericHandler;
    switch (handlerName) {
        case FAIL:
            genericHandler = AbortOnFailure.create();
            break;
        case LOG:
            genericHandler = DropAndLog.create(new BulkLogRenderer());
            break;
        case ES:
            genericHandler = ElasticsearchHandler.create(getSettings(), new BulkErrorEventConverter());
            break;
        default:
            throw new EsHadoopIllegalArgumentException(
                    &quot;Could not find default implementation for built in handler type [&quot; + handlerName + &quot;]&quot;
            );
    }
    return new DelegatingErrorHandler(genericHandler);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로는 BulkRequest 와 BulkProcessor 에 대해서 문서를 찾아 보시면 도움이 되실 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Thanks, 캉테&lt;/p&gt;</description>
      <category>Elastic/Elasticsearch</category>
      <category>Bulk</category>
      <category>elastic</category>
      <category>elasticsearch</category>
      <category>es-hadoop</category>
      <category>Processor</category>
      <category>request</category>
      <category>Spark</category>
      <author>jjeong</author>
      <guid isPermaLink="true">https://jjeong.tistory.com/1631</guid>
      <comments>https://jjeong.tistory.com/1631#entry1631comment</comments>
      <pubDate>Tue, 20 Sep 2022 12:35:17 +0900</pubDate>
    </item>
    <item>
      <title>[Kibana] Discover 생성 후 삭제</title>
      <link>https://jjeong.tistory.com/1630</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Discover 를 새로 만들어서 저장하는 문서는 아래를 참고하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.elastic.co/guide/en/kibana/current/save-open-search.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.elastic.co/guide/en/kibana/current/save-open-search.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성 후 삭제를 하고 싶은데 관련 내용은 별도 문서를 찾기 못해서 기록해 둡니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Stack Management&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Kibana &amp;gt; Saved Objects&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에 들어가서 삭제 하고 싶은 discover 를 찾아서 삭제 하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 추가적으로 Recently viewed 에 나오는 항목에 대한 삭제는 localStorage 에 저장 되기 때문에 직접 찾아서 삭제 하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직까지 삭제 기능을 제공 하고 있지는 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Elastic/Kibana</category>
      <category>delete</category>
      <category>Discover</category>
      <category>elastic</category>
      <category>kibana</category>
      <author>jjeong</author>
      <guid isPermaLink="true">https://jjeong.tistory.com/1630</guid>
      <comments>https://jjeong.tistory.com/1630#entry1630comment</comments>
      <pubDate>Mon, 29 Aug 2022 11:20:53 +0900</pubDate>
    </item>
  </channel>
</rss>