<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">

  <channel>
    <title>Java on @johtaniの日記 3rd</title>
    <link>https://blog.johtani.info/tags/java/</link>
    <description>Recent content in Java on @johtaniの日記 3rd</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ja</language>
    <lastBuildDate>Thu, 21 Mar 2024 06:55:57 +0000</lastBuildDate><atom:link href="https://blog.johtani.info/tags/java/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Elasticsearchの新しいJavaクライアント（2024年3月版）</title>
      <link>https://blog.johtani.info/blog/2024/03/21/new-elasticsearch-java-client/</link>
      <pubDate>Thu, 21 Mar 2024 06:55:57 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2024/03/21/new-elasticsearch-java-client/</guid>
      <description>&lt;p&gt;以前、Elasticsearchの新しいJavaクライアントについて&lt;a href=&#34;https://blog.johtani.info/blog/2022/06/13/new-elasticsearch-java-client/&#34;&gt;ブログを書きました&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;あれから、ほぼ2年経ちましたが、差分を調べたのでブログに残しておきます。&lt;/p&gt;
&lt;h2 id=&#34;前回の問題点&#34;&gt;前回の問題点&lt;/h2&gt;
&lt;p&gt;前回のブログを書いている時点では、2点ほど気になることがありました。それぞれ解決しているので、まずはその紹介をしようと思います。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;以前、Elasticsearchの新しいJavaクライアントについて&lt;a href=&#34;https://blog.johtani.info/blog/2022/06/13/new-elasticsearch-java-client/&#34;&gt;ブログを書きました&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;あれから、ほぼ2年経ちましたが、差分を調べたのでブログに残しておきます。&lt;/p&gt;
&lt;h2 id=&#34;前回の問題点&#34;&gt;前回の問題点&lt;/h2&gt;
&lt;p&gt;前回のブログを書いている時点では、2点ほど気になることがありました。それぞれ解決しているので、まずはその紹介をしようと思います。&lt;/p&gt;
&lt;h3 id=&#34;どんなリクエストを投げているかが不明&#34;&gt;どんなリクエストを投げているかが不明&lt;/h3&gt;
&lt;p&gt;Elasticsearchの公式ドキュメントでは、各エンドポイントやクエリの書き方の紹介では、JSONのサンプルが紹介されています。
自分で書いたリクエストが想定した形になっているか？、プログラムで書いたクエリがJSONだとどんな形になっているか？というのを確認したくなります。
前回記事を書いた時点では、JSON文字列にするために&lt;code&gt;JsonGenerator&lt;/code&gt;を利用していくつか処理を書く必要がありました。
こんな感じに。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;printRequestBodyJsonForDebug&lt;/span&gt;(RequestBase request) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;//for debug&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Logger.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;** Debug print start **&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        StringWriter writer &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; StringWriter();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        SimpleJsonpMapper mapper &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; SimpleJsonpMapper();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        JsonGenerator generator &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; mapper.&lt;span style=&#34;color:#a6e22e&#34;&gt;jsonProvider&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;createGenerator&lt;/span&gt;(writer);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        mapper.&lt;span style=&#34;color:#a6e22e&#34;&gt;serialize&lt;/span&gt;(request, generator);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        generator.&lt;span style=&#34;color:#a6e22e&#34;&gt;close&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Logger.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(writer.&lt;span style=&#34;color:#a6e22e&#34;&gt;toString&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Logger.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;** Debug print finish **&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;v8.3から、各種&lt;code&gt;Request&lt;/code&gt;クラスに&lt;code&gt;toString()&lt;/code&gt;メソッドが実装され、簡単にJSON文字列が取り出せるようになっています。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;printRequestBodyJsonForDebug&lt;/span&gt;(RequestBase request) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;//for debug&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Logger.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;** Debug print start **&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Logger.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(request.&lt;span style=&#34;color:#a6e22e&#34;&gt;toString&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Logger.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;** Debug print finish **&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実際の出力内容は次のようになります。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;PutIndexTemplateRequest&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;PUT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_index_template&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;wikipedia&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;template&lt;/span&gt; {&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;index_patterns&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;wikipedia-*&amp;#34;&lt;/span&gt;],&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;template&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;mappings&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;properties&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;images&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;nested&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;properties&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;target_type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;},&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;link_target&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;},&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;taget&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;},&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;fields&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ignore_above&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;256&lt;/span&gt;}},&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;analyzer&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kuromoji&amp;#34;&lt;/span&gt;}}},&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;contents&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;fields&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ignore_above&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;256&lt;/span&gt;}},&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;analyzer&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kuromoji&amp;#34;&lt;/span&gt;},&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;headings&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;fields&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ignore_above&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;256&lt;/span&gt;}},&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;analyzer&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kuromoji&amp;#34;&lt;/span&gt;},&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;links&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;nested&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;properties&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;link_target&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;},&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;fields&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ignore_above&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;256&lt;/span&gt;}},&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;analyzer&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kuromoji&amp;#34;&lt;/span&gt;}}},&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;},&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;categories&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;},&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;fields&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ignore_above&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;256&lt;/span&gt;}},&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;analyzer&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kuromoji&amp;#34;&lt;/span&gt;},&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;revision_id&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;},&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;timestamp&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;date&amp;#34;&lt;/span&gt;}}},&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;settings&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;number_of_shards&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;3&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;number_of_replicas&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;0&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;refresh_interval&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;0&amp;#34;&lt;/span&gt;}}}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最初に&lt;code&gt;クラス名: &lt;/code&gt;があり、移行がKibanaのDev Toolですぐ使える形式になっています
（リクエストボディのJSONの前で改行するだけ）。
デバッグや確認などが簡単にできそうですね。&lt;/p&gt;
&lt;p&gt;変更された時のPull Requestは次のものになります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/elastic/elasticsearch-java/pull/269&#34;&gt;Add toString() implementations by swallez · Pull Request #269 · elastic/elasticsearch-java&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;プラグインなどで提供されるクエリが書けない&#34;&gt;プラグインなどで提供されるクエリが書けない&lt;/h3&gt;
&lt;p&gt;Elasticsearchはプラグインを使って拡張することができ、LtRプラグインなどでは、クエリの拡張が行われています。&lt;/p&gt;
&lt;p&gt;以前調査したタイミングでは&lt;a href=&#34;https://github.com/elastic/elasticsearch-specification&#34;&gt;elasticsearch-specification&lt;/a&gt;で定義されたリクエストしか受け取れない実装になっていました。
v8.5（実際には8.4.xにバックポートされている）からは、プラグインなどが追加しているクエリなどのカスタムな記述ができるようになっています。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;_custom()&lt;/code&gt;というメソッドが各所に追加されており、これを利用することで定義にないJSONの属性などが追加できるようになっています。
公式ドキュメントにも利用方法が追加されています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/variant-types.html#variant-types-custom&#34;&gt;Variant types | Elasticsearch Java API Client ［8.12］ | Elastic&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;レスポンスでも同様に&lt;code&gt;_custom()&lt;/code&gt;が追加されており、プラグイン独自のレスポンス形式などにも対応できます。&lt;/p&gt;
&lt;p&gt;変更された時のPull Requestは次のものになります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/elastic/elasticsearch-java/pull/370&#34;&gt;Add support for plugin-defined custom components in union types by swallez · Pull Request #370 · elastic/elasticsearch-java&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;それ以外に変更されたポイント&#34;&gt;それ以外に変更されたポイント&lt;/h2&gt;
&lt;p&gt;各バージョンで導入された変更点が&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/release-highlights.html&#34;&gt;リリースハイライト&lt;/a&gt;としてドキュメントにまとめてあります。
いくつかピックアップして簡単に紹介します。&lt;/p&gt;
&lt;h3 id=&#34;bulkingesterヘルパーの追加87&#34;&gt;BulkIngesterヘルパーの追加（8.7）&lt;/h3&gt;
&lt;p&gt;Bulk APIをより楽に利用することができるヘルパークラスです。Pythonのクライアントにあった&lt;code&gt;streaming_bulk&lt;/code&gt;などに似ています。
どのくらいの数・サイズの操作をまとめて送るか、定期的にrefreshするのか？などを設定してインスタンスを作った後は、インスタンスに&lt;code&gt;add()&lt;/code&gt;していくと、指定されたタイミングで定期的にBulkのリクエストを送信してくれます。
自分でループを回しながら定期的にAPIをたたくよりも便利です。
詳細についてはドキュメントがあるので参考にしてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/indexing-bulk.html#_streaming_ingestion_with_the_bulk_ingester&#34;&gt;Bulk： indexing multiple documents | Elasticsearch Java API Client ［8.12］ | Elastic&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;opentelemetry対応810&#34;&gt;OpenTelemetry対応（8.10）&lt;/h3&gt;
&lt;p&gt;OpenTelemetryを利用してトレースすることができるようになっています。JavaクライアントからEsへのHTTPのリクエストの処理時間やリクエスト本体をスパンに含めてくれるようになっています。
自分たちのプロジェクトがOpenTelemetryを利用していれば、Esのリクエストに関連する部分が追加でとれるようになっています。
詳細は公式ドキュメントに利用方法が記載されています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/opentelemetry.html&#34;&gt;Using OpenTelemetry | Elasticsearch Java API Client ［8.12］ | Elastic&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;約2年ぶり触ってみると、さらに便利になっていました。
前回はカスタムパラメータが利用できないなど、切り替えできない可能性もありましたが、だいぶ問題点は減っていそうです。&lt;/p&gt;
&lt;p&gt;とはいえ、利用しようとしている機能が使えない、バグなどがあるかもしれないので、何か気になる点があった場合は、Issueのリストをチェックするのがいいでしょう。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/elastic/elasticsearch-java/issues&#34;&gt;Issues · elastic/elasticsearch-java&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;とくに、新しくElasticsearchでリリースされたけど、Javaクライアントにはまだ利用できないパラメータなどが時々あります。
ということで、簡単ですが補足情報でした。&lt;/p&gt;
&lt;h2 id=&#34;参考&#34;&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://noti.st/johtani/aICL6l/elasticsearch-specification&#34;&gt;ElasticsearchクライアントライブラリとSpecification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/elastic/elasticsearch-specification&#34;&gt;elastic/elasticsearch-specification リポジトリ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/elastic/elasticsearch-java/&#34;&gt;elastic/elasticsearch-java リポジトリ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearchの新しいJavaクライアント</title>
      <link>https://blog.johtani.info/blog/2022/06/13/new-elasticsearch-java-client/</link>
      <pubDate>Mon, 13 Jun 2022 20:24:06 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2022/06/13/new-elasticsearch-java-client/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/7.16/introduction.html&#34;&gt;7.16で正式リリース&lt;/a&gt;されましたが、Elasticsearchの新しいJavaのクライアントが出ています。
使ってみたので、ちょっとだけ紹介でもしてみようかな。&lt;/p&gt;
&lt;p&gt;このクライアントが出るまでは、ElasticsearchのJavaクライアント（REST版）はElasticsearch本体の一部として実装・管理されていました（&lt;a href=&#34;https://github.com/elastic/elasticsearch/tree/7.16/client&#34;&gt;Elasticsearchのリポジトリにあるclientディレクトリ&lt;/a&gt;）。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/7.16/introduction.html&#34;&gt;7.16で正式リリース&lt;/a&gt;されましたが、Elasticsearchの新しいJavaのクライアントが出ています。
使ってみたので、ちょっとだけ紹介でもしてみようかな。&lt;/p&gt;
&lt;p&gt;このクライアントが出るまでは、ElasticsearchのJavaクライアント（REST版）はElasticsearch本体の一部として実装・管理されていました（&lt;a href=&#34;https://github.com/elastic/elasticsearch/tree/7.16/client&#34;&gt;Elasticsearchのリポジトリにあるclientディレクトリ&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;HTTP経由でElasticsearchにアクセスするクライアントだったのですが、Elasticsearch本体のリポジトリで管理されていることもあり、Elasticsearch本体で利用されているクラスを使用していました。
このため、クライアントライブラリなのですが、Elasticsearch本体のJarが必要になりサイズが大きくなっていました。
また、JavaのObjectへの詰め替えなどの機能も備えておらず、すこし古臭い感じでもあります。
この辺りを刷新する目的もあり新しいクライアントが公開されたようです。
3月くらいに触った時はまだ、ドキュメントが揃ってなかったのですが利用方法などが増えているので移行も楽になってきているようです。
根本的に作り直されたため、これまでのREST Clientとは使い方が違います。ですので、jarだけの差し替えでこれまで動いていたプログラムを移行ができるわけではないので注意が必要です。&lt;/p&gt;
&lt;h2 id=&#34;どの辺が便利&#34;&gt;どの辺が便利？&lt;/h2&gt;
&lt;h3 id=&#34;順次移行が可能&#34;&gt;順次移行が可能&lt;/h3&gt;
&lt;p&gt;これまでのRESTクライアントとはパッケージ名もjarも別モノになっています。
ですので、少しずつ新しいJava Clientに切り替えていくことが可能になっています。
根本的に使い方が変わっているので、大きなシステムのクライアントを全部切り替えるのは結構大変かと思います。
ですので、Indexをしている部分だけとか、検索部分だけなどといった部分的な置き換えをしつつ新しいクライアントに慣れていくことができます。&lt;/p&gt;
&lt;h3 id=&#34;ラムダっぽく書ける&#34;&gt;ラムダっぽく書ける&lt;/h3&gt;
&lt;p&gt;検索のクエリのサンプルを見るとわかりますが、こんな感じでクエリが書けます(&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/searching.html#_simple_search_query&#34;&gt;公式ドキュメントより抜粋&lt;/a&gt;)。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SearchResponse&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Product&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; response &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; esClient.&lt;span style=&#34;color:#a6e22e&#34;&gt;search&lt;/span&gt;(s &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; s
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .&lt;span style=&#34;color:#a6e22e&#34;&gt;index&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;products&amp;#34;&lt;/span&gt;) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .&lt;span style=&#34;color:#a6e22e&#34;&gt;query&lt;/span&gt;(q &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; q      
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .&lt;span style=&#34;color:#a6e22e&#34;&gt;match&lt;/span&gt;(t &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; t   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .&lt;span style=&#34;color:#a6e22e&#34;&gt;field&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .&lt;span style=&#34;color:#a6e22e&#34;&gt;query&lt;/span&gt;(searchText)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Product.&lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;      
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;また、最後で渡している&lt;code&gt;Product.class&lt;/code&gt;は、検索結果をどのクラスのインスタンスにして返すかの指定です。
Elasticsearchのレスポンス（JSON）から値をコピーして返してくれるようになっています。
ですので、値を入れ替える処理を書く必要がなくなっています。&lt;/p&gt;
&lt;h3 id=&#34;json文字列をそのまま使える&#34;&gt;JSON文字列をそのまま使える&lt;/h3&gt;
&lt;p&gt;触り始めてからリリース（7.17.2より後なら使える）された、&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/loading-json.html&#34;&gt;JSON文字列からリクエストを作る機能&lt;/a&gt;もあります。&lt;/p&gt;
&lt;p&gt;これまでのREST Clientだと、Elasticsearchへのリクエストを必ずJavaのメソッドで構築する必要がありました。
今回のこの機能を利用すると、JSON文字列（やファイル）からリクエストオブジェクトを作るためのメソッド&lt;code&gt;.withJson()&lt;/code&gt;が提供されています。
例えば、スキーマや設定変更用のリクエストのJSONなどは、Kibanaやcurlから試験的に投げたリクエスト（JSON）と同じものを使いたいことが多いです。また、ElasticsearchのAPIは数が多く、ドキュメントを見ながら利用方法を調べてJSONでまず試行錯誤することが多いです。
この&lt;code&gt;withJson&lt;/code&gt;メソッドを利用することで、動作確認などをしたJSONがそのままソースにも利用できるので、リクエスト変更時の確認なども容易になると思います。&lt;/p&gt;
&lt;h2 id=&#34;使ってみて困ったのは&#34;&gt;使ってみて困ったのは？&lt;/h2&gt;
&lt;p&gt;便利な面も多いのですが、使っていて少し困ったこともあったのでそれもメモを残しておきます。&lt;/p&gt;
&lt;h3 id=&#34;どんなリクエストを投げているかが不明&#34;&gt;どんなリクエストを投げているかが不明&lt;/h3&gt;
&lt;p&gt;先ほども書きましたが、Elasticsearchのリクエストを試行錯誤するときは公式ドキュメントを見ながら、Kibanaなどを利用して試すことが多いです。
ですので、自分がやりたいことのJSONは手元にあることが多いです。
ただ、プログラムでクエリを組み立てる必要も出てきます。この時、実際にRESTリクエストとしてどんなJSONを投げているのかを知りたいことがあります（実際、検索クエリ作っててメソッドの使い方がうまくいかなくて四苦八苦してました）。
4月時点では簡単にリクエストで投げているJSONを文字列としてログに出すメソッドなどは用意されていないようでした。
デバッグ用に次のようなメソッドを書いてみました。
Elasticsearchへ投げるRequestのクラス（例：CreateTemplateRequestとか）を引数に渡すことで、JSON文字列に変換できるようになっています（StringWriterに書き出されてる）。
ここの&lt;code&gt;Logger&lt;/code&gt;はサンプルです。&lt;code&gt;writer.toString()&lt;/code&gt;で取り出せる文字列がJSON文字列になっているので、ログに出してみるなり、ファイルに落とすなりしてデバッグのお供にしてください。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.io.StringWriter;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; co.elastic.clients.elasticsearch._types.RequestBase;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; co.elastic.clients.json.SimpleJsonpMapper;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; jakarta.json.stream.JsonGenerator;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;printRequestBodyJsonForDebug&lt;/span&gt;(RequestBase request) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;//for debug&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Logger.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;** Debug print start **&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        StringWriter writer &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; StringWriter();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        SimpleJsonpMapper mapper &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; SimpleJsonpMapper();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        JsonGenerator generator &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; mapper.&lt;span style=&#34;color:#a6e22e&#34;&gt;jsonProvider&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;createGenerator&lt;/span&gt;(writer);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        mapper.&lt;span style=&#34;color:#a6e22e&#34;&gt;serialize&lt;/span&gt;(request, generator);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        generator.&lt;span style=&#34;color:#a6e22e&#34;&gt;close&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Logger.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(writer.&lt;span style=&#34;color:#a6e22e&#34;&gt;toString&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Logger.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;** Debug print finish **&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;プラグインなどで提供されるクエリが書けない&#34;&gt;プラグインなどで提供されるクエリが書けない&lt;/h3&gt;
&lt;p&gt;LtRプラグインなどは、Elasticsearchの検索クエリを拡張しています。
残念ながら、現時点（2022/06/13）ではカスタムクエリを新しいJavaクライアントで利用しようとした場合、エラーが発生してしまいます（知らないJSONだと判断されてしまいます）。&lt;/p&gt;
&lt;p&gt;GitHubのIssueとして「&lt;a href=&#34;https://github.com/elastic/elasticsearch-java/issues/252&#34;&gt;［roadmap］ Add support for plugin-defined custom components · Issue #252 · elastic/elasticsearch-java&lt;/a&gt;」があります。
これに対応されたら、拡張されたクエリも利用できるようになるでしょう。
プラグインなどで拡張されているものを使いたい場合は、残念ながら既存のRESTクライアントを当面は使うことになりそうです。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;新しいElasticsearchのJavaクライアントを簡単ですが触ってみて、気になった点を記事にしました。
JavaのObjectに詰め替えてくれる機能など便利になっているので使ってみてください。
ドキュメントもちょっとずつ増えているようで、使い方も分かりやすくなっていました（触った時はレスポンスの扱い方などがJavaDocしか用意されてなかったんです）。
説明が欲しいなぁと思うことがあれば、GitHubにIssueを上げてみるといいかもです。&lt;/p&gt;
&lt;h2 id=&#34;参考&#34;&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/introduction.html&#34;&gt;公式ドキュメント&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.google.com/presentation/d/1dd93-5N5OkNuvpxbEB8HY_XEzXSRvdpAj3c9x_VcSbA/present?slide=id.g10a773dc4cc_0_2262&#34;&gt;Java Clientチームの人がカンファレンスで利用したスライド&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>JVM Operation Casual Talksに参加しました #jvmcasual</title>
      <link>https://blog.johtani.info/blog/2014/04/07/attend-jvm-casual-1/</link>
      <pubDate>Mon, 07 Apr 2014 19:24:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/04/07/attend-jvm-casual-1/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://atnd.org/events/48999&#34;&gt;JVM Operation Casual Talks&lt;/a&gt;に参加しました。
あんまり、運用とかやってないので、ついていけるか不安ですが、楽しそうだったので。
懇親会は予定されてないらしい。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;http://atnd.org/events/48999&#34;&gt;JVM Operation Casual Talks&lt;/a&gt;に参加しました。
あんまり、運用とかやってないので、ついていけるか不安ですが、楽しそうだったので。
懇親会は予定されてないらしい。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;stanaka15分でわかるjvmのメモリ管理&#34;&gt;@stanaka	15分でわかるJVMのメモリ管理&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://speakerdeck.com/stanaka/understanding-memory-management-of-javavm-in-15-minutes&#34;&gt;https://speakerdeck.com/stanaka/understanding-memory-management-of-javavm-in-15-minutes&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JVMの基礎知識&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;某研究所で。。。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Elasticsearch、Solrの名前が！&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JVM困りどころ。ネットの情報が古いのが多いとか。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使いこなすにはきちんと知識が必要。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;memory-model&#34;&gt;Memory Model&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;困ったらJava8に。。。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Heapのチューニングが重要&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Heapの構成やGC処理の説明&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CMSでもすべて並列ではない&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OlgGenがフラグメントして確保が遅くなっていく&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;G1GCの概念図。YoungやOld、Survivorの区別がない？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;リージョン？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;リファレンスリストすばらしい。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;oraniecassandra運用で実施しているjvm監視について&#34;&gt;@oranie	Cassandra運用で実施しているJVM監視について&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/oranie/jvm-operation-casual-talks-33218856&#34;&gt;http://www.slideshare.net/oranie/jvm-operation-casual-talks-33218856&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cassandra(1.1)で運用中。&lt;/li&gt;
&lt;li&gt;35TBとか&lt;/li&gt;
&lt;li&gt;エンジニアブログ読め。&lt;/li&gt;
&lt;li&gt;Cassandraの監視って何すればいいの？&lt;/li&gt;
&lt;li&gt;GC頻度とかグラフで見れる&lt;/li&gt;
&lt;li&gt;VisualVM便利って教えてもらった。
&lt;ul&gt;
&lt;li&gt;VisualVMでどんな値があるか見ながら調べて、取りたい値を考える。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SNMPで頑張るの辛い＝JMXかな？＝Javaで叩くの？＝Jolokia&lt;/li&gt;
&lt;li&gt;どんなことやってる？
&lt;ul&gt;
&lt;li&gt;Nagios+Jenkins＋。。。あとでスライド&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;yohoushi+GrowthForecastも便利。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;waysakusprayakka運用でjvmをcpuスケールさせるために行った事&#34;&gt;@waysaku	Spray(Akka)運用でJVMをCPUスケールさせるために行った事&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/waysaku/jvm-operation-casual-talks&#34;&gt;http://www.slideshare.net/waysaku/jvm-operation-casual-talks&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://spray.io&#34;&gt;Spray&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Akkaアプリケーションの運用を任されちゃった人&lt;/li&gt;
&lt;li&gt;カットオーバー直前の負荷試験でびっくりするくらいスループットでない。。。
&lt;ul&gt;
&lt;li&gt;いろんなActorが特定のActorに処理を投げた状態で待ってるという状況。。。&lt;/li&gt;
&lt;li&gt;スレッドダンプ追っかけてる様子を追体験してる。&lt;/li&gt;
&lt;li&gt;ログ出力がBLOCKしてた&lt;/li&gt;
&lt;li&gt;I/Oを伴う処理は非常にセンシティブ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;以下lt&#34;&gt;以下、LT&lt;/h2&gt;
&lt;h2 id=&#34;oinume運用に効くjvmオプション三選&#34;&gt;@oinume	運用に効く！JVMオプション三選&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/oinume/jvm-operationcasualtalks20140407&#34;&gt;http://www.slideshare.net/oinume/jvm-operationcasualtalks20140407&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;サーバに入らなくても見れるのは
&lt;ul&gt;
&lt;li&gt;VisualVM&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;最終形Java Mission Control
&lt;ul&gt;
&lt;li&gt;Flight Recorder（商用だと有償）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;y_uuki1なにもわからないところから始めるjvmモニタリング&#34;&gt;@y_uuki1	なにもわからないところから始めるJVMモニタリング&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://speakerdeck.com/yuukit/nanimowakaranaitokorokarashi-merujvmmonitaringu&#34;&gt;https://speakerdeck.com/yuukit/nanimowakaranaitokorokarashi-merujvmmonitaringu&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ブログ：&lt;a href=&#34;http://yuuki.hatenablog.com/entry/2014/04/08/074507&#34;&gt;http://yuuki.hatenablog.com/entry/2014/04/08/074507&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;なんでここにいるかわかりませんが。&lt;/li&gt;
&lt;li&gt;色んな所記事とかのリンクがある。&lt;/li&gt;
&lt;li&gt;Graphiteに放り込んでるらしい。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;tagomorisnorikraのjvmチューンで苦労している話&#34;&gt;@tagomoris	NorikraのJVMチューンで苦労している話&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/tagomoris/norikrajvm&#34;&gt;http://www.slideshare.net/tagomoris/norikrajvm&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Norikraで困ったので開催したらみんなしゃべりに来てくれてありがたい世の中ですね。&lt;/li&gt;
&lt;li&gt;デフォルト設定で運用。mx4096mで4ヶ月は元気に動いてた&lt;/li&gt;
&lt;li&gt;年末に崩壊 -&amp;gt; harukaさんのQiita見ながら設定してほったからした。&lt;/li&gt;
&lt;li&gt;3月にまた崩壊OOM
&lt;ul&gt;
&lt;li&gt;SoftRefが悪さしてるのか？&lt;/li&gt;
&lt;li&gt;nekopさんのブログにヒントが。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;shot6jvm的なナニカを話すgc戦略をそえて&#34;&gt;@shot6	JVM的なナニカを話す、GC戦略をそえて&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/shot6/jvm-33248312&#34;&gt;http://www.slideshare.net/shot6/jvm-33248312&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;某A社からきました。&lt;/li&gt;
&lt;li&gt;CMSを中心が良い&lt;/li&gt;
&lt;li&gt;CPUコア少ないとCMS Incremental&lt;/li&gt;
&lt;li&gt;G1GCは6GB以上とかもっと大きい場合のほうが良さそう（雑感）&lt;/li&gt;
&lt;li&gt;基本的に、ドキュメントに書いてあるけど、つらいので、まとめてみました。&lt;/li&gt;
&lt;li&gt;後で見たいな、このスライドも。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;kazeburowebアプリケーションとメモリ&#34;&gt;@kazeburo	Webアプリケーションとメモリ&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/kazeburo/jvm-casual&#34;&gt;http://www.slideshare.net/kazeburo/jvm-casual&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Javaは1行も書いたことありません。&lt;/li&gt;
&lt;li&gt;Java運用したけど、まぁ、ひどい目にあってます。&lt;/li&gt;
&lt;li&gt;ということで、PerlとApacheの話？
&lt;ul&gt;
&lt;li&gt;bumpyなんとかってのは頭良くプロセスの処理回数とかをなんとかしてくれる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;JVMとかどうなの？
&lt;ul&gt;
&lt;li&gt;ということで、CA社の人が釣れたので良かったですね。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;tbdjvmの運用について話す会パネル&#34;&gt;TBD	JVMの運用について話す会(パネル)&lt;/h2&gt;
&lt;p&gt;なんでJVM？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;全文検索だとJVMだなぁ。SolrとかElasticsearchとか&lt;/li&gt;
&lt;li&gt;入社したらあった。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;JVMこまったところは？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;突然Dioが出てくる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;JVMいいところは？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;うーん、あえて言うと。。。スレッド処理&lt;/li&gt;
&lt;li&gt;型がある言語を調べるとJVM。というよりScala。&lt;/li&gt;
&lt;li&gt;飛び入り参加。落ちないところ。人殺しは良くないｗ&lt;/li&gt;
&lt;li&gt;簡単には殺せないところに使えるのは良いのでは。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;チューンはどこまでやる？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;7,8割でやめたほうが良い？&lt;/li&gt;
&lt;li&gt;そんなに突き詰めなくてもいいのかな。&lt;/li&gt;
&lt;li&gt;Cassandraだと、FullGCが走ってる時点で再起動しかない場合が多いです。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;言語のランタイムについてチューンすることってJVMの他ある？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rubyくらい？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;自分たちで何とかできないものを相手にしている人たちは苦労してるんじゃないか&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CaなんとかさんとかHBなんとかさんは困ってる人が多い&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最後に一言&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;モニタリングツール参考にしたい&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;最後に&#34;&gt;最後に&lt;/h2&gt;
&lt;p&gt;「やりたくなったら誰かやってください。」ということみたいです。&lt;/p&gt;
&lt;p&gt;基礎から監視まで結構幅広くキーワードが出てきたので楽しかったです。&lt;/p&gt;
&lt;p&gt;その他に話に出てきてた方のブログもリンクしとこうかな。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://d.hatena.ne.jp/nekop/&#34;&gt;nekopの日記&lt;/a&gt;&lt;/p&gt;
</content:encoded>
    </item>
    
  </channel>
</rss>
