<?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>@johtaniの日記 3rd</title>
    <link>https://blog.johtani.info/</link>
    <description>Recent content on @johtaniの日記 3rd</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ja</language>
    <lastBuildDate>Tue, 04 Aug 2026 07:54:42 +0000</lastBuildDate><atom:link href="https://blog.johtani.info/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>カンファレンスの録画をGemini Notebookを使ってチェックする</title>
      <link>https://blog.johtani.info/blog/2026/08/04/check-conference-recordings-with-notebook/</link>
      <pubDate>Tue, 04 Aug 2026 07:54:42 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2026/08/04/check-conference-recordings-with-notebook/</guid>
      <description>&lt;p&gt;6月の話だったのですが、今年も&lt;a href=&#34;https://2026.berlinbuzzwords.de/&#34;&gt;Berlin Buzzwords&lt;/a&gt;にオンラインで参加していました。
検索に関する話題が多めの毎年ベルリンで開催されているカンファレンスです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;6月の話だったのですが、今年も&lt;a href=&#34;https://2026.berlinbuzzwords.de/&#34;&gt;Berlin Buzzwords&lt;/a&gt;にオンラインで参加していました。
検索に関する話題が多めの毎年ベルリンで開催されているカンファレンスです。&lt;/p&gt;
&lt;p&gt;カンファレンスが終わってすぐに、録画が&lt;a href=&#34;https://www.youtube.com/playlist?list=PLq-odUc2x7i82TFm2NLewyoGOsHRkBLsq&#34;&gt;YouTubeにプレイリスト&lt;/a&gt;としてアップもされています。
うれしいことに、トラックが複数あるため参加中にすべてのセッションを聞けるわけではありません。&lt;/p&gt;
&lt;p&gt;ただ、録画すべてを見るのも大変です。
カンファレンスのページにセッション概要やタイトルも掲載されていますが、どのセッションが自分の興味に合いそうか？を探すのもある程度大変ですよね。
とくにBerlin Buzzwordsは検索だけではなく、そのほかの技術に関する話題もありセッション数が多いです。&lt;/p&gt;
&lt;p&gt;ですので今年は、YouTubeのプレイリストをもとに、Gemini Notebook（旧NotebookLM）を利用してYouTubeの録画をもとに一覧を作ってみました。
実際に作ったリストは検索技術勉強会でも紹介しているSlackにも投稿したのですが、こんな感じで作ったというのを来年の自分のために残しておきます。&lt;/p&gt;
&lt;p&gt;検索に関するSlackへのリンクはこちら。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;検索技術に関する情報交換を目的とした Slack を立ち上げました！こちらの招待リンクからご参加ください。 &lt;a href=&#34;https://t.co/Tca70vuMff&#34;&gt;https://t.co/Tca70vuMff&lt;/a&gt;&lt;/p&gt;&amp;mdash; takuya-a (@takuya_b) &lt;a href=&#34;https://x.com/takuya_b/status/1377219737457860610?ref_src=twsrc%5Etfw&#34;&gt;March 31, 2021&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;h2 id=&#34;作業手順&#34;&gt;作業手順&lt;/h2&gt;
&lt;p&gt;作業手順といっても簡単です。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;YouTubeのプレイリストから、各セッションの録画へのリンクの一覧を作る&lt;/li&gt;
&lt;li&gt;リンクの一覧をGemini Notebookのソースに入力&lt;/li&gt;
&lt;li&gt;一覧からプロンプトで資料を作ってもらう&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;という指示で出来上がったのが、次のようなMarkdownの資料です。
最初の2行のリンクや動画へのリンクは個別に修正したりしてますが、メモの中身はこの作業で出来上がったものです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://gist.github.com/johtani/a94942bde22bd6d1f48ff8ac6c896858&#34;&gt;Berlin Buzzwords 2026メモ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;リンクの一覧&#34;&gt;リンクの一覧&lt;/h3&gt;
&lt;p&gt;最初はプレイリストのリンクを1つだけ渡して指示を出してみたのですが、どうやら個別の動画ではなくプレイリストにあるタイトルだけをもとに概要などを作るようでした。
なので、実際に話した内容とはすこし異なるものが出てきました。
プレイリストからURLの一覧を作るのは手でやってもいいですし、スクリプトを組んだりもできるかなと。&lt;/p&gt;
&lt;h3 id=&#34;ソースの入力&#34;&gt;ソースの入力&lt;/h3&gt;
&lt;p&gt;Gemini Notebookのソースには、1で作ったURLを改行区切り下リストを渡すだけでOKです。
Gemini Notebookの左側にソースとしてYouTubeのアイコンで始まるセッションがならびます。
次のプロンプトを実行するタイミングでは、すべて選択した状態にしておきます。&lt;/p&gt;
&lt;h3 id=&#34;プロンプト&#34;&gt;プロンプト&lt;/h3&gt;
&lt;p&gt;最後は次のようなプロンプトを使いました。Berlin Buzzwordsでは検索以外のトピックもあるので、判別できるような指示を入れてあります。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;それぞれの動画に関して解説を作ってください。5行程度の説明文と10個程度のトピックとなるキーワードをお願いします。出力形式はMarkdownで、それぞれの動画へのリンクもつけてください。少なくとも検索関するトピックかどうかがわかるようにキーワードを必ず付与するようにしてください。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;これで先ほどのMarkdownの説明が出来上がりです。
これをもとに、気になるセッションから録画を見ていくことができて便利でした。
Gemini NotebookからYouTubeのリンクもたどれますし。&lt;/p&gt;
&lt;h2 id=&#34;gemini-notebookで作る便利な点&#34;&gt;Gemini Notebookで作る便利な点&lt;/h2&gt;
&lt;p&gt;さらに、Gemini Notebookを使っていて便利だったのは、この後セッションを見ながら、個別のセッションについて質問したりもできる点です。
見ているセッションだけをソースでチェックを入れた状態で質問をしていくと、どんなことをしゃべっているのか？という深堀もできます。&lt;/p&gt;
&lt;h2 id=&#34;おまけ&#34;&gt;おまけ&lt;/h2&gt;
&lt;p&gt;Berlin Buzzwords以外にも海外で検索に関連するカンファレンスの動画がアップされています。
海外の企業がどんな検索で困っているのか？今どんなことがはやっているのか？というのをチェックするのに便利です。
ということで、5月に開催されていた&lt;a href=&#34;https://archive.haystackconf.com/2026/&#34;&gt;Haystack US 2026&lt;/a&gt;やBerlin Buzzwordsと同じ週に開催されていた&lt;a href=&#34;https://mices.co/&#34;&gt;MICES 2026&lt;/a&gt;についてもメモを作っていたので、こちらもリンクを置いておきます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://gist.github.com/johtani/ce2237a3dfab7071280d6b619bd463c3&#34;&gt;Haystack US 2026のメモ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gist.github.com/johtani/2519cb35e96800653004f9b70a05d54c&#34;&gt;MICES 2026のセッションのYouTubeをもとにざっくりまとめてもらった&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ほかにもこんなカンファレンスがあるよ、こんな録画があったよなどあれば、共有してもらえると嬉しいです！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>プレゼン公開をブログの仕組みに含めるようにした話</title>
      <link>https://blog.johtani.info/blog/2026/07/31/presentations/</link>
      <pubDate>Fri, 31 Jul 2026 07:54:20 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2026/07/31/presentations/</guid>
      <description>&lt;p&gt;全然ブログ書いてなかったですね。。。&lt;/p&gt;
&lt;p&gt;2月にやってた内容なんですが、忘れないように書き残しておこうかなと。
プレゼンの公開には、&lt;a href=&#34;https://noti.st/johtani&#34;&gt;noti.st&lt;/a&gt;を使っていました。&lt;/p&gt;
&lt;p&gt;そんなところに元同僚がこんなブログを書いてました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;全然ブログ書いてなかったですね。。。&lt;/p&gt;
&lt;p&gt;2月にやってた内容なんですが、忘れないように書き残しておこうかなと。
プレゼンの公開には、&lt;a href=&#34;https://noti.st/johtani&#34;&gt;noti.st&lt;/a&gt;を使っていました。&lt;/p&gt;
&lt;p&gt;そんなところに元同僚がこんなブログを書いてました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://david.pilato.fr/posts/2026-01-10-13-years-migrating-to-hugo-with-cursor/&#34;&gt;🎂 13 years： Migrating my speaker page with AI | David Pilato&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;おなじく、noti.stを使っていたのですが、コーディングエージェントを使って作業して、自分のブログに移行したと。&lt;/p&gt;
&lt;p&gt;noti.stは有料サービスなんですが、最近あまり外向けでしゃべることもなくなっているのにサブスクしてました。
コーディングエージェントを触ってみるいい機会になりそうだな？というのもあって、自分もチャレンジしてみることに。&lt;/p&gt;
&lt;p&gt;実際に出来上がった&lt;a href=&#34;https://blog.johtani.info/presentation/&#34;&gt;プレゼンの一覧はこちら&lt;/a&gt;です。&lt;/p&gt;
&lt;p&gt;私のブログサイトはHugoを使ってビルドしたものをGitHub Pagesで公開しています。
今回Claude Codeに作ってもらったのは次のようなものです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;noti.stからPDFをダウンロードしてHugo用のmdファイルを作るスクリプト&lt;/li&gt;
&lt;li&gt;PDFからスライドコンテンツからHugo用のmdファイルを作るスクリプト&lt;/li&gt;
&lt;li&gt;SpeakerDeckに公開しているスライドをiframe embedのHugo用mdファイルを作るスクリプト&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;それぞれがPythonスクリプトになっています。
また、Hugo向けにpresentationというパスでスライドを公開するためのテンプレートなども作ってもらいました。&lt;/p&gt;
&lt;h2 id=&#34;notistのスライドたち&#34;&gt;noti.stのスライドたち&lt;/h2&gt;
&lt;p&gt;noti.stにPDFでアップロードしていました。
ダウンロードもできるようになっています。
また、noti.stにはいつのスライドで、どのイベントでしゃべったのか？スライドの簡単な概要なども入力してあります。&lt;/p&gt;
&lt;p&gt;ということで、スライドのタイトル、日付をダウンロード時に取得してプレゼンページのパスやタイトルに利用できるようにしてもらいました。
また、スライドを作るときにはリンクなどを埋め込んでいるのですが、PDFにもこの情報が入っています。
これらも抜き出して、スライドを表示するページに参考リンクとして表示できるようにしてあります。&lt;/p&gt;
&lt;p&gt;PDFから画像としてスライドを1枚ずつ抜き出しつつ、pngに変換したものを生成しています。
画像ファイルはそれなりの枚数でサイズも大きくなるため、スライドのPDFと画像ファイルだけGit LFSで管理する形にしてもらっています。&lt;/p&gt;
&lt;p&gt;スライドの公開ページでは、ページめくりのタイプのビューアと一覧ですべてのスライドを閲覧できる2種類を作ってあります。
コーディングエージェントにお願いすればやってくれるの本当に助かりますよね。。。
Git LFSの操作もやってくれるし。&lt;/p&gt;
&lt;h2 id=&#34;今後のスライド用に処理の切り出し&#34;&gt;今後のスライド用に処理の切り出し&lt;/h2&gt;
&lt;p&gt;また、今後もスライドを作って公開する場合はPDFで作成する予定です。
ということで、noti.stの処理のPDFから生成するところだけを切り出したスクリプトも作ってもらいました。
この仕組みに変更した後にスライドを作るタイミングがないためまだこれを試してはいないですが。。。&lt;/p&gt;
&lt;h2 id=&#34;speakerdeckはiframe-embed&#34;&gt;SpeakerDeckはiframe embed&lt;/h2&gt;
&lt;p&gt;せっかくなので、SpeakerDeckで公開しているスライドも掲載してしまおうと思い相談したところ、
SpeakerDeckはiframe embedで取り込むことができそうだということで、PDFから生成するのではない形にしてもらいました。&lt;/p&gt;
&lt;p&gt;なので、&lt;a href=&#34;https://blog.johtani.info/presentation/2014/lucenetori-ben-yu-falsejian-suo/&#34;&gt;古いスライドのページ&lt;/a&gt;についてはビューアがちょっとおしゃれです。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;2月にやってた作業についてメモを残す程度に思い出しながら書いてみました。
最初はClaude Codeと壁打ちをしながらどうするのがいいかというのを詰めていき、大体まとまったところで、Issueを作ってそれをもとに作業をやってもらう形でやっています。
いったんページめくりのものが出来上がってから、参考リンクを抜き出してみたり、一覧の仕組みも追加してもらったりしました。&lt;/p&gt;
&lt;p&gt;忘れないように、作ったスクリプトやディレクトリ構成、Git LFSなどに関してはメモを作ってもらっています（すごい便利）。
ちなみに、プレゼンページを作る前に、Hugoの環境をdevcontainer化してほかの環境でも楽に再現できるようにしたり、Hugoのバージョンやテーマの最新化などもやっていました。気が向いたらその辺も書くかも？（たぶん書かない。。。）&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>今年の振り返りと来年の抱負（2025）</title>
      <link>https://blog.johtani.info/blog/2025/12/31/review-2025/</link>
      <pubDate>Wed, 31 Dec 2025 11:07:18 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2025/12/31/review-2025/</guid>
      <description>&lt;p&gt;家族でカタンやったけど勝てない。。。
ってことで、毎年恒例の紅白見つつブログです。&lt;/p&gt;
&lt;h2 id=&#34;振り返り2024年に書いた抱負から&#34;&gt;振り返り（2024年に書いた抱負から）&lt;/h2&gt;
&lt;p&gt;まずは振り返りです。&lt;/p&gt;
&lt;h3 id=&#34;フリーランス継続&#34;&gt;フリーランス継続&lt;/h3&gt;
&lt;p&gt;今年も無事フリーランスとして終えられました。
継続していただいているお客さんのおかげで助けられてます。
今年は、調べものにGeminiやChatGPTを使いつつという感じです。最近の検索システムの流れなどを調べたりというのが便利にできています。
ちょっとだけ海外のお手伝いもできました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;家族でカタンやったけど勝てない。。。
ってことで、毎年恒例の紅白見つつブログです。&lt;/p&gt;
&lt;h2 id=&#34;振り返り2024年に書いた抱負から&#34;&gt;振り返り（2024年に書いた抱負から）&lt;/h2&gt;
&lt;p&gt;まずは振り返りです。&lt;/p&gt;
&lt;h3 id=&#34;フリーランス継続&#34;&gt;フリーランス継続&lt;/h3&gt;
&lt;p&gt;今年も無事フリーランスとして終えられました。
継続していただいているお客さんのおかげで助けられてます。
今年は、調べものにGeminiやChatGPTを使いつつという感じです。最近の検索システムの流れなどを調べたりというのが便利にできています。
ちょっとだけ海外のお手伝いもできました。&lt;/p&gt;
&lt;h3 id=&#34;プログラミング継続&#34;&gt;プログラミング継続&lt;/h3&gt;
&lt;p&gt;夏ごろまではAtCoderを続けていたのですが、体調を崩したタイミングで休止しています。
あとは、自分がプログラミングというよりは、Amazon Qを利用してプログラミングをしてもらっています。
翻訳とかの小ネタ用のプログラミングもやってたりします。
AtCoderではGoを使っていますが、LLM活用となるとPythonをさわることが増えてる気がするなぁ。&lt;/p&gt;
&lt;h3 id=&#34;weaviateをもと触る&#34;&gt;Weaviateをもと触る&lt;/h3&gt;
&lt;p&gt;こちらは勉強会用のグループを作ったけど、うまく回せてないです。
ただ、Weaviateをバックエンドにしながら時分用の備忘録用のツールをAmazon Qと書いています。
もうちょっといろいろと使い勝手とか考えたほうがいいんだけどなぁ。&lt;/p&gt;
&lt;h3 id=&#34;本を読んだブログを書く&#34;&gt;本を読んだブログを書く？&lt;/h3&gt;
&lt;p&gt;本はちょっとずつ読んでるんですが、ブログはかけてないですね。。。
とりあえず、本を読むだけじゃなく、簡単な感想を書けるように自分用のSlackでメモを取る仕組みは作ってあり、読んだところのコメントをちょっとずつは書いています。それをまとめてないだけです。。。&lt;/p&gt;
&lt;p&gt;あとは、友人と輪読してる本については簡単にまとめました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2025/12/08/reading-circle/&#34;&gt;今年の輪読会で読んだ本 | @johtaniの日記 3rd | @johtani&amp;rsquo;s blog 3rd edition&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;勉強会の録画をマスターする&#34;&gt;勉強会の録画をマスターする？&lt;/h3&gt;
&lt;p&gt;これは、大失敗でしたよ。。。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;悲報。録画ボタン押し忘れるという大ポカをやってしまいました、、、スライドは順次公開していただいているのでリンクを見つけては資料の一覧に貼り付けていきます。すみませんでした！ &lt;a href=&#34;https://t.co/ymtNSnAj15&#34;&gt;https://t.co/ymtNSnAj15&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1984052061378605433?ref_src=twsrc%5Etfw&#34;&gt;October 31, 2025&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;&lt;a href=&#34;https://search-tech.connpass.com/event/378445/&#34;&gt;1月末にやる勉強会&lt;/a&gt;ではリベンジします！
応援してて。。。あと、会場で気づいた人は声かけて。。。&lt;/p&gt;
&lt;h2 id=&#34;振り返り今年あった出来事&#34;&gt;振り返り（今年あった出来事）&lt;/h2&gt;
&lt;h3 id=&#34;ゲーム&#34;&gt;ゲーム&lt;/h3&gt;
&lt;p&gt;ゲームも夏に体調を崩してからはちょっと抑え気味でした。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;産業キャプテン&lt;/li&gt;
&lt;li&gt;デス・ストランディング2（クリア）&lt;/li&gt;
&lt;li&gt;ゴースト・オブ・ヨーテイ（クリア）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;産業キャプテンは原子力発電作ったところくらいで止まってる。。。
ロケット打ち上げできるんだろうか？？&lt;/p&gt;
&lt;h3 id=&#34;プラモデル&#34;&gt;プラモデル&lt;/h3&gt;
&lt;p&gt;仕事を始める前に説明書の1コマ分を組み立てるという習慣を&lt;a href=&#34;https://blog.johtani.info/blog/2024/03/22/daily-routine/&#34;&gt;続ける思考を読んでから&lt;/a&gt;続けています。&lt;/p&gt;
&lt;p&gt;今年はRGのガンダムVer.2.0、RGのバンシィ・ノルンを作って、今はRGのフルアーマーユニコーンを作ってるとこです。ユニコーン、パーツが多いので、春くらいかもなぁ完成は。&lt;/p&gt;
&lt;h3 id=&#34;仕事&#34;&gt;仕事&lt;/h3&gt;
&lt;p&gt;今年も家で仕事してました。オンラインで仕事させてもらえるの本当にいい（運動不足だが）。
夏に体調を崩したけども、家でオンラインで仕事ができるのでそれほど迷惑をかけずに済んだのは本当に良かった（だいぶ復調しました）。&lt;/p&gt;
&lt;p&gt;メインPCは昨年組み立てたんだけど、サーバーに使っていたDesk Miniが５月後半に電源が入らなくなったので、MinisforumのAI X1に急遽買い換えました。
前よりも小さくなったけども、性能よくなったしSSDは生きていたので、データの移植は簡単に終わって致命傷にならずに済みました。&lt;/p&gt;
&lt;p&gt;今ではローカルLLMをllm-swapで動かしたりもしています。便利。Plamoの翻訳用LLMとかも動かせてすごく便利です。以下のブログを参考にさせてもらいました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://light-of-moe.ddo.jp/~sakura/diary/?p=2242&#34;&gt;ローカルLLMをEVO X2でホストする方法まとめ – さくらんぼの技術備忘録&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;勉強会&#34;&gt;勉強会&lt;/h3&gt;
&lt;p&gt;年4回のペース絵勉強会をやりたかったのですが、2回のみ（&lt;a href=&#34;https://search-tech.connpass.com/event/345134/&#34;&gt;2月&lt;/a&gt;と&lt;a href=&#34;https://search-tech.connpass.com/event/370754/&#34;&gt;10月&lt;/a&gt;）となってしまいました。&lt;/p&gt;
&lt;p&gt;10月の勉強会では10分セッションのみで開催を予告してからスピーカーを募集してみました。
25分のセッションよりも集まりがよい気がしたので、10分のセッションを毎回盛り込みたいなと考えています。
また、定期開催したいので、開催日をほぼ固定して早めに告知しつつスピーカーを募集する形に変えてみようかなと考えています。
まずは、1月末に予定です。そのあとはうまくいけば4月、7月、10月とやりたいなと。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://search-tech.connpass.com/event/378445/&#34;&gt;Search Engineering Tech Talk 2026 Winter - connpass&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;来年の抱負&#34;&gt;来年の抱負&lt;/h2&gt;
&lt;p&gt;さて、最後は来年の豊富です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;フリーランス継続&lt;/li&gt;
&lt;li&gt;プログラミング継続&lt;/li&gt;
&lt;li&gt;新しいプロダクトを触る&lt;/li&gt;
&lt;li&gt;本を読んだブログを書く？&lt;/li&gt;
&lt;li&gt;勉強会を4回開催＋録画をマスターする？&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;p&gt;プログラミングは今年と同じ感じでAmazon Qを使いつつ続けていければなと。
作りたいものをサクっと作れるのはほんと便利になったなぁ。
こんなの作りたいなぁって思いながら重い腰が上がらなかったけどその障壁が低くなってるのは楽しいですね。&lt;/p&gt;
&lt;p&gt;OpenSearchを触ったり調べたりはしているんですが、Elasticsearchの系統ではあるのでもう少し違うものも触っていきたいなぁと。
最近はオブジェクトストレージを経由する検索エンジンなども増えてきているので、そのあたりの仕組みを調べつつ触っていくのがよさそうかなぁ。&lt;/p&gt;
&lt;p&gt;読書はコメントを残しているのをちょっとだけまとめてブログにする習慣づけが必要かな。&lt;/p&gt;
&lt;p&gt;勉強会4回開催のために、日付をほぼ決め打ち（上に書いた月末に開催できるように場所を交渉）してスピーカーを募集しつつ集まらなかったらアンカンファレンスか懇親会のみで会場で話したい人を募集する感じにしたいな。
録画は。。。ワイヤレスマイクまで買ったので絶対やります。。。
あと、録画とかのノウハウある人と話したいなぁ。
今は、スピーカーの方にGoogle Meetに接続してもらってから録画している感じです。&lt;/p&gt;
&lt;p&gt;産業キャプテンはまぁ、がんばります。
イージーモード？でやってるので、鉄道のモチベーションが出てこないのがちょっとあれだけど。ロケット発射台はできてるので、ロケット用の材料をコツコツ作っていくだけだから。。。&lt;/p&gt;
&lt;p&gt;50歳になったし、これまでやってないことも始めたいなぁと考え中です。
楽器かなぁ？サイレントでできるような楽器か、デジタル音楽かもっと他のものか。
来年の年末ブログで何を始めたか紹介できればなぁと。&lt;/p&gt;
&lt;p&gt;さて、back numberを聞きながら締めをと。&lt;/p&gt;
&lt;p&gt;ということで、今年もあと少しというところでブログが書き終わった。
来年は体調に気を付けつつ、ちょっとずつ外に出かけるようにしようと。
来年もよろしくお願いいたします、よいお年をー&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Named Queryとスコア</title>
      <link>https://blog.johtani.info/blog/2025/12/19/include-named-queries-score/</link>
      <pubDate>Fri, 19 Dec 2025 08:26:56 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2025/12/19/include-named-queries-score/</guid>
      <description>&lt;p&gt;この記事は&lt;a href=&#34;https://qiita.com/advent-calendar/2025/elasticsearch&#34;&gt;Elastic Stack (Elasticsearch) Advent Calendar 2025&lt;/a&gt;の19日目の記事になります。&lt;/p&gt;
&lt;p&gt;なんとなく思い立ったので、Named Queryのことでも書いてみようかな。&lt;/p&gt;
&lt;h2 id=&#34;named-queryとは&#34;&gt;named queryとは？&lt;/h2&gt;
&lt;p&gt;ElasticsearchのBoolクエリを書いていて、条件が複数ある場合にどの条件が検索結果に出てきたドキュメントに影響があるのか？というのを知りたくなることがあります。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;この記事は&lt;a href=&#34;https://qiita.com/advent-calendar/2025/elasticsearch&#34;&gt;Elastic Stack (Elasticsearch) Advent Calendar 2025&lt;/a&gt;の19日目の記事になります。&lt;/p&gt;
&lt;p&gt;なんとなく思い立ったので、Named Queryのことでも書いてみようかな。&lt;/p&gt;
&lt;h2 id=&#34;named-queryとは&#34;&gt;named queryとは？&lt;/h2&gt;
&lt;p&gt;ElasticsearchのBoolクエリを書いていて、条件が複数ある場合にどの条件が検索結果に出てきたドキュメントに影響があるのか？というのを知りたくなることがあります。&lt;/p&gt;
&lt;p&gt;例えば、タイトルと説明文に検索するようなBoolクエリを書いてみます。&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;GET&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;esci&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;sample&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_search&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:#e6db74&#34;&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;bool&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;should&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;match&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;product_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;ライトニングケーブル&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;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:#e6db74&#34;&gt;&amp;#34;match&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;product_description&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;ライトニングケーブル&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;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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;_source&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;product_title&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;took&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;timed_out&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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:#e6db74&#34;&gt;&amp;#34;_shards&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;successful&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;skipped&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;failed&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;hits&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&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:#e6db74&#34;&gt;&amp;#34;relation&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;eq&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;max_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3.4320617&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:#e6db74&#34;&gt;&amp;#34;hits&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;_index&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;esci-sample&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:#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;B07RJQJDY1&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3.4320617&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;product_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-Cケーブル Micro USB ケーブル 3in1 充電ケーブル 3A急速充電 データ転送 高耐久編組ナイロン USB Type C/ライトニング/Micro USB iOS / Androidに多機種対応1.2m (ブラック)&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;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:#e6db74&#34;&gt;&amp;#34;_index&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;esci-sample&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:#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;B086HNZN58&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2.949997&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:#e6db74&#34;&gt;&amp;#34;_ignored&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;product_bullet_point.keyword&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;product_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;Allroundo® ライトニングケーブル 伸縮式 3in1 充電ケーブル 1.8A急速充電 高速データ転送 USB Type-C/Lightning/MicroUSB 多機種対応 高耐久 断線防止 絡み防止 持ち運びに便利 収納ボックス付き&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;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:#e6db74&#34;&gt;&amp;#34;_index&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;esci-sample&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:#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;B0829TWWMM&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2.697413&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:#e6db74&#34;&gt;&amp;#34;_ignored&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;product_bullet_point.keyword&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;product_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;ライトニングケーブル 3in1 巻き取り 充電ケーブル 3in1 3A 急速充電 高速データ転送（ios） USB Type-C/ライトニング/Micro USB 充電ケーブル 一本三役 iOS/Android 同時給電可能 iPhone/Galaxy/Huawei/Macbook等全機種対応 120cm 1年間品質保証 (ブラック)&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;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:#e6db74&#34;&gt;&amp;#34;_index&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;esci-sample&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:#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;B08913D1SL&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2.5449233&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:#e6db74&#34;&gt;&amp;#34;_ignored&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;product_bullet_point.keyword&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:#e6db74&#34;&gt;&amp;#34;product_description.keyword&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;product_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;【Quick Charge 3.0】Amuvec 車載充電器 USB2ポートカーチャージャー シガーソケットチャージャ しがらいたーソケット usb 急速充電（6A/40W) LightningとタイプCデュアル80cm 巻取り式ケーブル ために iPhone XS/ Max/ XR/ X/ 8 /7/ 6/ Plus /Galaxy S9/ S8/ Note 8 LG V30 Google Pixel 2 XL/SamSung 対応 (赤) …&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;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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そういう時に便利な機能としてNamed Queryと呼ばれるものがあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-bool-query#named-queries&#34;&gt;Boolean query | Reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;GET&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;esci&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;sample&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_search&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:#e6db74&#34;&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;bool&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;should&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;match&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;product_title&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;query&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;ライトニングケーブル&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:#e6db74&#34;&gt;&amp;#34;_name&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;match_title&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;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:#e6db74&#34;&gt;&amp;#34;match&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;product_description&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;query&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;ライトニングケーブル&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:#e6db74&#34;&gt;&amp;#34;_name&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;match_description&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;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&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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;match&lt;/code&gt;のクエリの書き方が少し変わっていて、フィールド名のあとがオブジェクトになっています（&lt;code&gt;_name&lt;/code&gt;もこの中に指定するため）。
この中に、&lt;code&gt;_name&lt;/code&gt;というのがNamed Queryになります。
クエリの結果が次のようになります（titleが長いので、省いちゃいます）。&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;took&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;timed_out&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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:#e6db74&#34;&gt;&amp;#34;_shards&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;successful&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;skipped&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;failed&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;hits&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&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:#e6db74&#34;&gt;&amp;#34;relation&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;eq&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;max_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3.4320617&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:#e6db74&#34;&gt;&amp;#34;hits&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;_index&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;esci-sample&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:#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;B07RJQJDY1&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3.4320617&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:#e6db74&#34;&gt;&amp;#34;matched_queries&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;match_title&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;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:#e6db74&#34;&gt;&amp;#34;_index&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;esci-sample&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:#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;B086HNZN58&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2.949997&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:#e6db74&#34;&gt;&amp;#34;_ignored&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;product_bullet_point.keyword&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;matched_queries&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;match_title&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;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:#e6db74&#34;&gt;&amp;#34;_index&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;esci-sample&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:#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;B0829TWWMM&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2.697413&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:#e6db74&#34;&gt;&amp;#34;_ignored&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;product_bullet_point.keyword&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;matched_queries&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;match_title&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;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:#e6db74&#34;&gt;&amp;#34;_index&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;esci-sample&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:#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;B08913D1SL&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2.5449233&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:#e6db74&#34;&gt;&amp;#34;_ignored&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;product_bullet_point.keyword&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:#e6db74&#34;&gt;&amp;#34;product_description.keyword&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;matched_queries&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;match_description&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;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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;結果を見ていただくと、各ドキュメントに&lt;code&gt;matched_queries&lt;/code&gt;という属性が増えています。
ここに、ヒットしたクエリの名前が入るようになります。
今回の検索結果の場合、3件目まではタイトルにヒットしていますが、4件目は説明文にヒットしていることがわかります。&lt;/p&gt;
&lt;h2 id=&#34;じゃあスコアは&#34;&gt;じゃあ、スコアは？&lt;/h2&gt;
&lt;p&gt;ここまではどの条件が検索結果に関係があったかどうか？だけがわかる仕組みでした。
Elasticsearchの8.8から更なるオプションとして&lt;a href=&#34;https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-search#operation-search-include_named_queries_score&#34;&gt;&lt;code&gt;include_named_queries_score&lt;/code&gt;&lt;/a&gt;が追加されました（追加の時の&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/94564&#34;&gt;PRはこちら&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;_search&lt;/code&gt;エンドポイントのクエリパラメータとして（URLの一部）指定します
（効果をわかりやすくするために、上記のクエリとは文字列を変えています）。&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;GET&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;esci&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;sample&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_search&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;include_named_queries_score&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;true&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:#e6db74&#34;&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;bool&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;should&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;match&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;product_title&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;query&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;USBケーブル&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:#e6db74&#34;&gt;&amp;#34;_name&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;match_title&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;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:#e6db74&#34;&gt;&amp;#34;match&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;product_description&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;query&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;USBケーブル&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:#e6db74&#34;&gt;&amp;#34;_name&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;match_description&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;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&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;took&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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:#e6db74&#34;&gt;&amp;#34;timed_out&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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:#e6db74&#34;&gt;&amp;#34;_shards&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;successful&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;skipped&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;failed&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;hits&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;19&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:#e6db74&#34;&gt;&amp;#34;relation&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;eq&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;max_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;16.192907&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:#e6db74&#34;&gt;&amp;#34;hits&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;_index&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;esci-sample&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:#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;B07ZNCJB3B&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;16.192907&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:#e6db74&#34;&gt;&amp;#34;_ignored&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;product_bullet_point.keyword&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;matched_queries&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;match_description&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8.697643&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:#e6db74&#34;&gt;&amp;#34;match_title&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;7.495263&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;_index&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;esci-sample&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:#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;B07SG28ZS8&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;12.9889765&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:#e6db74&#34;&gt;&amp;#34;_ignored&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;product_bullet_point.keyword&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;matched_queries&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;match_description&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4.4317617&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:#e6db74&#34;&gt;&amp;#34;match_title&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8.557215&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;単なるNamed Queryの時は&lt;code&gt;matched_queries&lt;/code&gt;の部分はクエリの名前がリストで返ってきていました。
が、今回はオブジェクトに変わっており、クエリの名前に対してそのクエリのスコアが返ってくるようになっています。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;explain&lt;/code&gt;パラメータを使って、スコアの内訳をみることもできますがレスポンスが肥大化してしまいますし、見るのがつらいことが多いです。
簡易的に、どの条件がどのくらいスコアとして寄与しているのか？を見るためにはこちらのオプションを利用するのが便利でしょう。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ElasticsearchのNamed Queryがどんなものなのか？と8.8から追加された&lt;code&gt;include_named_queries_score&lt;/code&gt;パラメータについて簡単に紹介しました。
Elasticsearchでの検索結果改善の参考になればと。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Weaviateを使って個人的備忘録を作ってる</title>
      <link>https://blog.johtani.info/blog/2025/12/18/grimoire-keeper/</link>
      <pubDate>Thu, 18 Dec 2025 12:41:50 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2025/12/18/grimoire-keeper/</guid>
      <description>&lt;p&gt;本記事は、&lt;a href=&#34;https://qiita.com/advent-calendar/2025/search&#34;&gt;情報検索・検索技術Advent Calendar 2025&lt;/a&gt;の19日目の記事です（今年はなんか参加者が少なくてさみしいけど、きっと検索の人たちは検索流行ってて忙しいんだなということにしておこう）。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;本記事は、&lt;a href=&#34;https://qiita.com/advent-calendar/2025/search&#34;&gt;情報検索・検索技術Advent Calendar 2025&lt;/a&gt;の19日目の記事です（今年はなんか参加者が少なくてさみしいけど、きっと検索の人たちは検索流行ってて忙しいんだなということにしておこう）。&lt;/p&gt;
&lt;p&gt;こちらの&lt;a href=&#34;https://search-tech.connpass.com/event/370754/&#34;&gt;秋の検索勉強会&lt;/a&gt;で話をした内容になります。
録画に失敗したので記事を書いておくかなと。。。&lt;/p&gt;
&lt;p&gt;発表の資料と作ってるGitHubのリポジトリです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://noti.st/johtani/vzlnig/weaviate#s25Odsj&#34;&gt;Weaviateを使って個人的備忘録（まだ途中）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/grimoire-keeper&#34;&gt;johtani/grimoire-keeper&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://blog.johtani.info/top/about/&#34;&gt;検索システムに関するコンサルなどをやっていたりします&lt;/a&gt;）、検索に関する記事をよく読んでいます。
Xだったり、どこかのSlackだったり、Googleニュースだったりといろんなところから出てくる記事になんとなく目を通したり、仕事で調べた検索に関する各社の公式ブログや論文などにも目を通しています。&lt;/p&gt;
&lt;p&gt;それなりの量を日々読んでいて、お客さんの話や質問で上がってくる内容に関連しそうな記事があったなぁと思うことが多々あります。
ただ、最近読んだことは覚えていても、どの記事だったかが見つけられないことがあるんです（年齢的な問題？）。&lt;/p&gt;
&lt;p&gt;なので、なんとなく読んで面白かった記事について、ブックマーク＋メモを残す仕組みをWeaviateを使って作ってみているという話です。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ちなみに、コードやドキュメントはAmazon QのVS Code拡張を使いながら書いてもらっています。
個人ツールはそれっぽい名前を付けてもらうために、作りたいものの概要を説明してから「中二病っぽい名前の候補を10個作って」とLLMにお願いして名前を付けています。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;なんでweaviate&#34;&gt;なんでWeaviate？&lt;/h2&gt;
&lt;p&gt;ベクトル検索を主体にしたいなぁというのがあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;うろ覚えなのでなんとなくで検索できるようにしたい&lt;/li&gt;
&lt;li&gt;絞り込み検索もしたい（どのサイトとかは覚えてたりする）&lt;/li&gt;
&lt;li&gt;Weaviateを宣伝したい（&lt;a href=&#34;https://weaviate.connpass.com/&#34;&gt;Community作ろうとしてます&lt;/a&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;スライドではUIや前段のスクレイピングなどの話も記載していますが、今回のブログではWeaviateの部分を簡単に紹介する形にします。
Weaviateに登録する前段で記事の要約をして、関連するキーワードをLLMをつかって抽出する処理を入れてあります。&lt;/p&gt;
&lt;h3 id=&#34;スキーマの定義&#34;&gt;スキーマの定義&lt;/h3&gt;
&lt;p&gt;Weaviateでは、コレクションに対してデータを登録すれば&lt;a href=&#34;https://docs.weaviate.io/weaviate/config-refs/collections#auto-schema&#34;&gt;自動的にデータに合わせてスキーマを定義してくれる機能&lt;/a&gt;があります。
この場合、コレクションに作られるベクトル空間は1つとなります。&lt;/p&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-python&#34; data-lang=&#34;python&#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:#75715e&#34;&gt;# コレクション作成&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;client&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;collections&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;create(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;GrimoireChunk&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    description&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Grimoire Keeperで管理するWebページのチャンク&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    properties&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;[
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Property(name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;pageId&amp;#34;&lt;/span&gt;, data_type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;DataType&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;INT),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Property(name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;chunkId&amp;#34;&lt;/span&gt;, data_type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;DataType&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;INT),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Property(name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;, data_type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;DataType&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;TEXT),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Property(name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt;, data_type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;DataType&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;TEXT),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Property(name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;memo&amp;#34;&lt;/span&gt;, data_type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;DataType&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;TEXT),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Property(name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;, data_type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;DataType&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;TEXT),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Property(name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;summary&amp;#34;&lt;/span&gt;, data_type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;DataType&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;TEXT),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Property(name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;keywords&amp;#34;&lt;/span&gt;, data_type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;DataType&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;TEXT_ARRAY),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Property(name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;createdAt&amp;#34;&lt;/span&gt;, data_type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;DataType&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;DATE),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Property(name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;isSummary&amp;#34;&lt;/span&gt;, data_type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;DataType&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;BOOL),
&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;    vector_config&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;[
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Configure&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Vectors&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;text2vec_openai(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;content_vector&amp;#34;&lt;/span&gt;, source_properties&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;content&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Configure&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Vectors&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;text2vec_openai(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;title_vector&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            source_properties&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;summary&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Configure&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Vectors&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;text2vec_openai(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;memo_vector&amp;#34;&lt;/span&gt;, source_properties&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;memo&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;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;https://github.com/johtani/grimoire-keeper/blob/main/apps/api/src/grimoire_api/services/vectorizer.py#L185-L215&#34;&gt;GitHubのコードはこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;コレクションの定義をしている部分のコードです。
コレクションの名前（&lt;code&gt;name&lt;/code&gt;）、説明文（&lt;code&gt;description&lt;/code&gt;）、プロパティ（&lt;code&gt;properties&lt;/code&gt;：フィールド、カラムのようなもの）をまず定義しています。
プロパティにも説明を書いた方がいいのですが、今回は記述していないです
（ &lt;a href=&#34;https://docs.weaviate.io/agents/query&#34;&gt;Query Agent | Weaviate Documentation&lt;/a&gt;という機能も提供されており、エージェントがコレクションを検索するときのヒントになるので、コレクションやプロパティに説明を付けてあげたほうが今後の役に立つことになります）。&lt;/p&gt;
&lt;p&gt;ここまでは、よくあるスキーマの定義になりますが、最後の&lt;code&gt;vector_config&lt;/code&gt;がこのコレクションのベクトルに関する設定になります。&lt;/p&gt;
&lt;p&gt;今回は名前を付けたベクトル（&lt;a href=&#34;https://docs.weaviate.io/weaviate/config-refs/collections#named-vectors&#34;&gt;named vectors&lt;/a&gt;）を3つ設定しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;title_vector&lt;/code&gt;：タイトルと要約から生成するベクトル空間&lt;/li&gt;
&lt;li&gt;&lt;code&gt;content_vector&lt;/code&gt;：記事本文をチャンキングしたものから生成するベクトル空間&lt;/li&gt;
&lt;li&gt;&lt;code&gt;memo_vector&lt;/code&gt;：メモから生成するベクトル空間&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;すべて、入力としては&lt;code&gt;properties&lt;/code&gt;で定義したデータの型（今回はすべてテキスト）のデータになります。
Weaviateの内部で、ベクトル化モジュールがOpenAIのembeddingモデルをAPI経由で呼び出して、テキストからベクトルに変換して保存してくれます。
アプリとしては、タイトルや要約などはテキストとしてWeaviateにデータを登録するだけになります。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.weaviate.io/weaviate/model-providers/openai/embeddings#select-a-model&#34;&gt;&lt;code&gt;model&lt;/code&gt;パラメータを設定する&lt;/a&gt;ことで、自分でモデルの選択もできますが、今回はデフォルトのモデルを使用するようにしています。&lt;/p&gt;
&lt;h3 id=&#34;データの登録&#34;&gt;データの登録&lt;/h3&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-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; client&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;collections&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;GrimoireChunk&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:#66d9ef&#34;&gt;for&lt;/span&gt; i, chunk &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; enumerate(chunks):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    weaviate_object &lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;pageId&amp;#34;&lt;/span&gt;: page_data&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;id,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;chunkId&amp;#34;&lt;/span&gt;: i,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;: page_data&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;url,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: page_data&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;title,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;memo&amp;#34;&lt;/span&gt;: page_data&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;memo &lt;span style=&#34;color:#f92672&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&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:#e6db74&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;: chunk,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;summary&amp;#34;&lt;/span&gt;: page_data&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;summary &lt;span style=&#34;color:#f92672&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&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:#e6db74&#34;&gt;&amp;#34;keywords&amp;#34;&lt;/span&gt;: json&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;loads(page_data&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;keywords &lt;span style=&#34;color:#f92672&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;[]&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:#e6db74&#34;&gt;&amp;#34;createdAt&amp;#34;&lt;/span&gt;: (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            page_data&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;created_at&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;replace(tzinfo&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;isoformat() &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Z&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:#66d9ef&#34;&gt;if&lt;/span&gt; page_data&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;created_at&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;tzinfo &lt;span style=&#34;color:#f92672&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&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;else&lt;/span&gt; page_data&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;created_at&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;isoformat()
&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:#e6db74&#34;&gt;&amp;#34;isSummary&amp;#34;&lt;/span&gt;: i &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;    result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; collection&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;data&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;insert(properties&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;weaviate_object)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;https://github.com/johtani/grimoire-keeper/blob/main/apps/api/src/grimoire_api/services/vectorizer.py#L83-L139&#34;&gt;GitHubのコードはこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;登録の処理の抜粋です。
前処理として本文の部分（&lt;code&gt;content&lt;/code&gt;）をチャンクに分割しているので、それらを登録しています。
それとは別に、&lt;code&gt;title_vector&lt;/code&gt;や&lt;code&gt;memo_vector&lt;/code&gt;のベクトル空間を検索した時に、不要なデータが表示されないように&lt;code&gt;isSummary&lt;/code&gt;ということで、最初のチャンクにフラグを立てて、それで絞り込めるようにしてあります。&lt;/p&gt;
&lt;h3 id=&#34;検索処理&#34;&gt;検索処理&lt;/h3&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-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                collection &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; client&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;collections&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;GrimoireChunk&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#75715e&#34;&gt;# フィルター条件構築&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                where_filter &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_build_weaviate_filter(filters) &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; filters &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                exclude_filter &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_build_exclude_filter(exclude_keywords) &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; exclude_keywords &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&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:#75715e&#34;&gt;# ベクトル別フィルター追加&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                summary_filter &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&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;if&lt;/span&gt; vector_name &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;content_vector&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:#f92672&#34;&gt;from&lt;/span&gt; weaviate.classes.query &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; Filter
&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;                    summary_filter &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Filter&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;by_property(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;isSummary&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;equal(&lt;span style=&#34;color:#66d9ef&#34;&gt;True&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:#75715e&#34;&gt;# フィルター結合&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                filters_list &lt;span style=&#34;color:#f92672&#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;if&lt;/span&gt; where_filter:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    filters_list&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append(where_filter)
&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;if&lt;/span&gt; summary_filter:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    filters_list&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append(summary_filter)
&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;if&lt;/span&gt; exclude_filter:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    filters_list&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append(exclude_filter)
&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;                final_filter &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&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;if&lt;/span&gt; len(filters_list) &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    final_filter &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; filters_list[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;elif&lt;/span&gt; len(filters_list) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    final_filter &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Filter&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;all_of(filters_list)
&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;# クエリ実行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                response &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; collection&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;query&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;near_text(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    query&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;query,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    target_vector&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;vector_name,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    limit&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;limit,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    filters&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;final_filter,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    return_metadata&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;MetadataQuery(certainty&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;True&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:#75715e&#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;return&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_convert_search_results_v4(response)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;https://github.com/johtani/grimoire-keeper/blob/main/apps/api/src/grimoire_api/services/search_service.py#L61-L99&#34;&gt;GitHubのコードはこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;検索処理です。入力されたキーワードや文章をベクトル検索するのには&lt;code&gt;near_text&lt;/code&gt;メソッドを利用します。
&lt;code&gt;target_vector&lt;/code&gt;が検索対象となるベクトル空間の名前（例：&lt;code&gt;title_vector&lt;/code&gt;）の指定です。
クエリ実行前にいくつかのフィルタ条件を組み立てて、条件として追加してあります（期間だったり除外するキーワードなどの条件）。&lt;/p&gt;
&lt;p&gt;検索するときもこちらでベクトルに変換するなどの処理は行っておらず、テキストを&lt;code&gt;query&lt;/code&gt;に渡せば、よしなにWeaviate側でベクトル空間の設定をもとにエンベディングして検索をしてくれます。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;とりあえず、トラディショナルな感じのRAGのベースを自分でも試してみるかな？と思いながら作ってます。
が、いろいろと使ってみて気づくことが多いなとなってるところです。&lt;/p&gt;
&lt;p&gt;データはWeaviateに入れる前の時点でファイルとして保存するような作りにしているので、いろいろと改善できそうなことに手を出しながら触っていこうかなと思います（late interactionっぽいことやってみたり、チャットのUIを用意したり、チャンキングの仕組みを変えてみたり）。&lt;/p&gt;
&lt;p&gt;なんとなく、Weaviateの使い方がこんな感じかな？というイメージを持ってもらえたら幸いです。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>今年の輪読会で読んだ本</title>
      <link>https://blog.johtani.info/blog/2025/12/08/reading-circle/</link>
      <pubDate>Mon, 08 Dec 2025 14:18:59 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2025/12/08/reading-circle/</guid>
      <description>&lt;p&gt;johtaniです。この記事は、&lt;a href=&#34;https://adventar.org/calendars/11686&#34;&gt;pyspa Advent Calendar 2025&lt;/a&gt; の9日目です。&lt;/p&gt;
&lt;p&gt;昨日はrokujyouhitomaさんの「&lt;a href=&#34;https://rokujyouhitoma.hatenablog.com/entry/2025/12/08/000000&#34;&gt;守る力を強化した本年の話 - rokujyouhitoma&amp;rsquo;s blog&lt;/a&gt;」でした。資格取得すごいなぁ。全然とってない。。。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;johtaniです。この記事は、&lt;a href=&#34;https://adventar.org/calendars/11686&#34;&gt;pyspa Advent Calendar 2025&lt;/a&gt; の9日目です。&lt;/p&gt;
&lt;p&gt;昨日はrokujyouhitomaさんの「&lt;a href=&#34;https://rokujyouhitoma.hatenablog.com/entry/2025/12/08/000000&#34;&gt;守る力を強化した本年の話 - rokujyouhitoma&amp;rsquo;s blog&lt;/a&gt;」でした。資格取得すごいなぁ。全然とってない。。。&lt;/p&gt;
&lt;h2 id=&#34;輪読&#34;&gt;輪読&lt;/h2&gt;
&lt;p&gt;知り合いと毎週1回のペースでオンラインで気になる技術書の輪読してます。
それぞれ忙しいしということで、事前に読んでくる形じゃなくてその場で読む感じ（読み上げる感じ）でやってます。&lt;/p&gt;
&lt;p&gt;放っておくと、書籍が積みあがって読まないのもあって、毎週1回そのタイミングを作る感じです。&lt;/p&gt;
&lt;p&gt;今年は以下の3冊を読みました（最後の1冊はまだ途中）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.oreilly.co.jp/books/9784814400669/&#34;&gt;Real World HTTP 第3版 - O&amp;rsquo;Reilly Japan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://book.impress.co.jp/books/1123101144&#34;&gt;Go言語で学ぶ並行プログラミング　他言語にも適用できる原則とベストプラクティス - インプレスブックス&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.oreilly.co.jp/books/9784814400126/&#34;&gt;オブザーバビリティ・エンジニアリング - O&amp;rsquo;Reilly Japan&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;real-world-http-第3版&#34;&gt;Real World HTTP 第3版&lt;/h3&gt;
&lt;p&gt;Goの勉強もしてたので、Goでサンプルが出てくるのがよかったです。
あと、知らないことが結構ありました。
昔はそんなのあったねぇみたいなのも思い出したりしましたが。
最近はこう変わってるよなどの話や、セキュリティに関する話など普段はあまり縁がないので勉強になりました。&lt;/p&gt;
&lt;h3 id=&#34;go言語で学ぶ並行プログラミング&#34;&gt;Go言語で学ぶ並行プログラミング&lt;/h3&gt;
&lt;p&gt;輪読してる知り合いがGoに精通しているのもあって、教えてもらいながら読みました。
大学のころにセマフォとか聞いた気がするなぁと思いながら読んでました。
チャネルに関する話に触れられたので、今後のGoのプログラムを読んだりするのに役立ちそうかな。
自分で並行処理を書くことがあるかは不明だけど。&lt;/p&gt;
&lt;h3 id=&#34;オブザーバビリティエンジニアリング&#34;&gt;オブザーバビリティ・エンジニアリング&lt;/h3&gt;
&lt;p&gt;先週時点で16章まで読みました。
オブザーバビリティの話自体は、Elasticsearchなどでも触れていたのですが、勘所やモニタリングとかとの違いを明確に勉強してたわけでもないし、OpenTelemetryもキーワードとしてちょっと知ってたくらいなので勉強になってます。
副読本としてSLOの本も読んだ方がいいんだろうなぁ。&lt;/p&gt;
&lt;p&gt;あと、ローカルでさくっと動かせる環境があるとさらに便利なんだろうなぁと思いつつ、まだ手元に環境はできてない。
実際に個人で作ってるツールでも、なんかうまく動いてないのがあるなぁ？みたいなことがあるので（外部要因が多かったりする）、環境を整えたいなと思っているところ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://zenn.dev/ymtdzzz/articles/a3a809ca1ba440&#34;&gt;ターミナルでOpenTelemetryのトレースを閲覧できるツール「otel-tui」を作りました&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こういうのもあるみたいだし。&lt;/p&gt;
&lt;p&gt;先週、「効率的なデータストア」のところを読んだのだけど、「リアルタイムでデータをクエリーする」がまだしっくり来てない。
Elasticsearchの仕組みを知ってるおかげで想像がつく部分は多々あるんだけども。&lt;/p&gt;
&lt;p&gt;今年中に読み終わるかなぁ？と思ってたけど無理そうかな（週1章のペースでは進んでるんだけども）&lt;/p&gt;
&lt;h2 id=&#34;来年も続けていたい習慣&#34;&gt;来年も続けていたい習慣&lt;/h2&gt;
&lt;p&gt;もうあんまり覚えてないんだけど、10年以上続いてるので、今後の10年も続けていきたいなと思っている習慣です。
最近はオンラインだし、どこ読んでるかわかるように声に出して読み上げてるんだけど、誤植を見つけやすかったりします。&lt;/p&gt;
&lt;p&gt;その代わりの犠牲といってはあれだけど、読む方に注力してしまって、メモが取れてないんだよなぁ。
ほんとはメモ取るといいんだけど、そこができてないんだよなぁ。
なんかいい手を思いつけばいいんだけども。。。&lt;/p&gt;
&lt;p&gt;ということで、知り合いのおかげで思ったよりも長続きしている習慣の話でした。&lt;/p&gt;
&lt;h2 id=&#34;明日のpyspa-advent-calendar-2025&#34;&gt;明日の&lt;a href=&#34;https://adventar.org/calendars/11686&#34;&gt;pyspa Advent Calendar 2025&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;明日はotiai10さんです。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Weaviateを使って個人的備忘録（まだ途中）</title>
      <link>https://blog.johtani.info/presentation/2025/weaviate/</link>
      <pubDate>Thu, 30 Oct 2025 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2025/weaviate/</guid>
      <description></description>
      <content:encoded></content:encoded>
    </item>
    
    <item>
      <title>Weaviate入門（Quickstart - Go言語編）</title>
      <link>https://blog.johtani.info/blog/2025/07/14/intro-weaviate-quickstart/</link>
      <pubDate>Mon, 14 Jul 2025 09:41:28 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2025/07/14/intro-weaviate-quickstart/</guid>
      <description>&lt;p&gt;いくつか用語も説明したので（&lt;a href=&#34;https://blog.johtani.info/blog/2025/07/01/intro-weaviate/&#34;&gt;ベクトルデータベース&lt;/a&gt;、&lt;a href=&#34;https://blog.johtani.info/blog/2025/07/04/intro-weaviate-collection/&#34;&gt;オブジェクト、コレクション&lt;/a&gt;、&lt;a href=&#34;https://blog.johtani.info/blog/2025/07/08/intro-weaviate-modules/&#34;&gt;モジュール&lt;/a&gt;）、そろそろちょっと触ってみる、クイックスタートを紹介します。&lt;/p&gt;
&lt;p&gt;英語で書かれた&lt;a href=&#34;https://docs.weaviate.io/weaviate/quickstart&#34;&gt;Quickstart (with cloud resources) | Weaviate Documentation&lt;/a&gt;もあるのですが、実は日本語のページが用意されてます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://weaviate.io/ja&#34;&gt;Weaviate ベクトルデータベース | Weaviate&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こちらに沿って、簡単ですがクイックスタートを紹介します。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;いくつか用語も説明したので（&lt;a href=&#34;https://blog.johtani.info/blog/2025/07/01/intro-weaviate/&#34;&gt;ベクトルデータベース&lt;/a&gt;、&lt;a href=&#34;https://blog.johtani.info/blog/2025/07/04/intro-weaviate-collection/&#34;&gt;オブジェクト、コレクション&lt;/a&gt;、&lt;a href=&#34;https://blog.johtani.info/blog/2025/07/08/intro-weaviate-modules/&#34;&gt;モジュール&lt;/a&gt;）、そろそろちょっと触ってみる、クイックスタートを紹介します。&lt;/p&gt;
&lt;p&gt;英語で書かれた&lt;a href=&#34;https://docs.weaviate.io/weaviate/quickstart&#34;&gt;Quickstart (with cloud resources) | Weaviate Documentation&lt;/a&gt;もあるのですが、実は日本語のページが用意されてます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://weaviate.io/ja&#34;&gt;Weaviate ベクトルデータベース | Weaviate&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こちらに沿って、簡単ですがクイックスタートを紹介します。&lt;/p&gt;
&lt;p&gt;日本語のクイックスタートでは、Weaviateのクラスターに対して、「Jeopardy!」のデータを登録し、VectorizerモジュールとGeneratorモジュールにOpenAIのAPIを利用して、簡単なベクトル検索とRAG（検索拡張生成）を体験できます。&lt;/p&gt;
&lt;h2 id=&#34;0-openaiのapiキーの取得&#34;&gt;0 OpenAIのAPIキーの取得&lt;/h2&gt;
&lt;p&gt;このクイックスタートではOpenAIのAPIを利用します。
クイックスタートの「3.簡単なデータの取り込み」の「登録はこちら」リンクからOpenAIにサインアップするか、すでにOpenAIのAPIを利用されている方は、今回のためにAPIキーを生成して用意してください。&lt;/p&gt;
&lt;h2 id=&#34;1-weaviateデータベースの作成&#34;&gt;1 Weaviateデータベースの作成&lt;/h2&gt;
&lt;p&gt;マネージドサービスとして、&lt;a href=&#34;https://docs.weaviate.io/cloud/quickstart&#34;&gt;Weaviate Cloud&lt;/a&gt;が用意されています。&lt;/p&gt;
&lt;p&gt;ちょっと触ってみるのにはアカウントを作成してから、Sandboxクラスターを利用するのが簡単です。アカウント作成やSandboxクラスターの作成方法は以下のドキュメントを参考にしてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.weaviate.io/cloud/platform/create-account&#34;&gt;Create a user account | Weaviate Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.weaviate.io/cloud/manage-clusters/create&#34;&gt;Create a cluster | Weaviate Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;なお、Sandboxクラスターは14日間で自動で削除されるのでそこだけ注意が必要です。
容量の制限もあるので、大量データで利用する場合は別途、Serverlessなどを選択する必要があります。&lt;/p&gt;
&lt;h2 id=&#34;2-weaviate-clientライブラリのインストール&#34;&gt;2 Weaviate Clientライブラリのインストール&lt;/h2&gt;
&lt;p&gt;クイックスタートで選択できる言語は以下の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;JavaScript / TypeScript&lt;/li&gt;
&lt;li&gt;Go&lt;/li&gt;
&lt;li&gt;Java（最近クライアントが新しくなった）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;各言語向けのクライアントのインストール方法が表示されています。
Dockerなどで環境を用意してインストールをしてもいいですし、ローカルにインストールすることもできます。&lt;/p&gt;
&lt;p&gt;私は、Pythonを利用する場合はDevContainerの環境を用意したりします。
GoやJavaだとローカルで済ますかな？&lt;/p&gt;
&lt;p&gt;たとえば、Goのプロジェクトを作っておいて以下を実行します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;go get github.com/weaviate/weaviate-go-client/v5
go install
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;3-簡単なデータの取り込み&#34;&gt;3. 簡単なデータの取り込み&lt;/h2&gt;
&lt;h3 id=&#34;クライアントの接続&#34;&gt;クライアントの接続&lt;/h3&gt;
&lt;p&gt;まずは、Weaviate Cloudのクラスターへの接続情報が必要にです。&lt;/p&gt;
&lt;p&gt;1.で作成したクラスターをクリックし、Cluster detailsの画面で以下の情報をコピーし、環境変数に設定します。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Informationのセクションの「REST Endpoint」の文字列を環境変数&lt;code&gt;WEAVIATE_URL&lt;/code&gt;に設定&lt;/li&gt;
&lt;li&gt;API Keysのセクションで、「+ Create API Key」ボタンをクリックし、出てきたダイアログで
&lt;ol&gt;
&lt;li&gt;Name：なんでもOK（例：&lt;code&gt;go-sample-client&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;Role：&lt;code&gt;admin&lt;/code&gt;を選択&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;生成されたAPIキーをコピーして、環境変数&lt;code&gt;WEAVIATE_API_KEY&lt;/code&gt;に設定（APIキーは生成するタイミングでダウンロードもできます）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Weaviateにあるモジュールを経由して、OpenAIのAPIを実行するために、OpenAIのAPIキーをリクエストヘッダ経由で設定します。実際の値は&lt;code&gt;OPENAI_API_KEY&lt;/code&gt;という環境変数から取得しますので、APIキーを環境変数&lt;code&gt;OPENAI_API_KEY&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-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;cfg&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;weaviate&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Config&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;Host&lt;/span&gt;:       &lt;span style=&#34;color:#a6e22e&#34;&gt;os&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Getenv&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;WEAVIATE_URL&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;Scheme&lt;/span&gt;:     &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https&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;AuthConfig&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;auth&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ApiKey&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;Value&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;os&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Getenv&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;WEAVIATE_API_KEY&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;Headers&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;]&lt;span style=&#34;color:#66d9ef&#34;&gt;string&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:#e6db74&#34;&gt;&amp;#34;X-OpenAI-Api-Key&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;os&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Getenv&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;OPENAI_API_KEY&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;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;クイックスタートで使用する環境変数は以上の3つ（&lt;code&gt;WEAVIATE_URL&lt;/code&gt;、&lt;code&gt;WEAVIATE_API_KEY&amp;quot;&lt;/code&gt;、&lt;code&gt;OPENAI_API_KEY&lt;/code&gt;）です。&lt;/p&gt;
&lt;p&gt;ここまでのプログラムも実行できるので、実行してみましょう。
Weaviateへの接続情報に問題がなければ、「true」とだけ表示されます（現時点ではOpenAIのAPIへの接続は未確認です）。
（このあとには、&lt;code&gt;// Check the connection&lt;/code&gt;の処理の部分は変更します）&lt;/p&gt;
&lt;h3 id=&#34;データコレクションの作成&#34;&gt;データコレクションの作成&lt;/h3&gt;
&lt;p&gt;Weaviateでは、データを登録する前にコレクションを作成しておく必要があります。
今回の処理では、&lt;code&gt;models.Class&lt;/code&gt;という構造体を使ってスキーマを定義します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コレクションの名前（&lt;code&gt;Class&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;使用するベクトライザー（&lt;code&gt;text2vec-openai&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;使用するモジュール（&lt;code&gt;text2vec-openai&lt;/code&gt;、&lt;code&gt;generative-openai&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;使用するベクトライザーは、このコレクションでエンベディングのベクトル生成に利用するデフォルトのベクトライザーになります。&lt;/p&gt;
&lt;p&gt;このクイックスタートでは、プロパティについては、データ登録時に自動で設定するようにしています。プロパティ個別にベクトライザーやその他の設定を行うこともできます（&lt;a href=&#34;https://docs.weaviate.io/weaviate/manage-collections/collection-operations#create-a-collection-and-define-properties&#34;&gt;Basic collection operations | Weaviate Documentation&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;なお、今回の処理では、エラーが出力されなければ問題なくコレクションが作成されたということになります。エラー出ない場合のメッセージの処理がないためです。&lt;/p&gt;
&lt;p&gt;Weaviate Cloudのコンソールで「Collections」をクリックし、先ほど作成したクラスターを選択した後に、「Question」というコレクションが表示されているかを確認することで処理の成功を確認できます。&lt;/p&gt;
&lt;h3 id=&#34;データ登録&#34;&gt;データ登録&lt;/h3&gt;
&lt;p&gt;コレクションの作成もおわったので、Jeopardyのデータを登録します。
処理の流れとしては次のようになっています。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Weaviateのクライアント接続&lt;/li&gt;
&lt;li&gt;JSONファイルのダウンロードしてmapの配列に&lt;/li&gt;
&lt;li&gt;1データずつ、&lt;code&gt;models.Object&lt;/code&gt;の構造体に変換&lt;/li&gt;
&lt;li&gt;ObjectsBatcher()を利用して、バッチ登録
&lt;ol&gt;
&lt;li&gt;Weaviateがデータを受け取って、&lt;code&gt;text2vec-openai&lt;/code&gt;モジュールを使ってベクトルに変換してからベクトルインデックスに登録&lt;/li&gt;
&lt;li&gt;JSONのプロパティからWeaviateのスキーマを自動で生成してくれる&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;3の構造体を作るときに、JSONの文字列のデータを入れているだけで、このタイミングではベクトルは生成していません。
4.1に書いたように、Weaviate内部でOpenAIのAPIを利用してエンベディングの生成を行います。
ですので、この処理を実行するときにはOpenAIのAPIキーを設定しておく必要があります。&lt;/p&gt;
&lt;p&gt;コレクションの作成と同様に、エラーがなければ成功です。&lt;/p&gt;
&lt;p&gt;ちなみに、OpenAIのAPIキーを設定せずに実行すると、次のようなエラーが出ます。&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-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;panic&lt;/span&gt;: ([]&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;models&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ErrorResponseErrorItems0&lt;/span&gt;) &lt;span style=&#34;color:#ae81ff&#34;&gt;0xc000008870&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:#a6e22e&#34;&gt;goroutine&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; [&lt;span style=&#34;color:#a6e22e&#34;&gt;running&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;main&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;main&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;...&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;weaviate&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;quickstart&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;go&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;.&lt;span style=&#34;color:#66d9ef&#34;&gt;go&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;68&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x745&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記のサンプルのままでは、&lt;code&gt;res.Result.Errosrs.Error&lt;/code&gt;は配列のためエラーが発生してしまいました。&lt;/p&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-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;range&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;batchRes&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;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Result&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Errors&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&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;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;items0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;range&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Result&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Errors&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Error&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				println(&lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Sprintf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Error is %v&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;items0&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;APIキーの設定を忘れているとこんな感じのエラーメッセージになります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Error is &amp;amp;{API Key: no api key found neither in request header: X-Openai-Api-Key nor in environment variable under OPENAI_APIKEY}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;データ登録できたかどうかは、この後のクエリで確認もできますし、先ほどのコンソールでのコレクションを見ると「10 objects」となってデータが登録されているのも分かります。&lt;/p&gt;
&lt;h2 id=&#34;4-クエリ方法&#34;&gt;4. クエリ方法&lt;/h2&gt;
&lt;p&gt;最後は検索です。
クイックスタートでは、ベクトル検索とRAG（検索拡張生成）を試すことができます。&lt;/p&gt;
&lt;h3 id=&#34;ベクトル検索&#34;&gt;ベクトル検索&lt;/h3&gt;
&lt;p&gt;入力テキストからベクトライザーでベクトルを生成して、そのベクトルをもとにベクトルインデックスを検索する処理です。&lt;/p&gt;
&lt;p&gt;今回のクイックスタートでは、検索には次の情報が指定されています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;検索結果に含めるプロパティ（フィールド）
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[]graphql.Field&lt;/code&gt;に指定しているもの&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;クエリ文字列
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nearText&lt;/code&gt;に調べたい文章（今回は&lt;code&gt;biology&lt;/code&gt;という単語）を設定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;検索対象のクラス名（コレクション名）
&lt;ul&gt;
&lt;li&gt;「Question」&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;取得する件数（最もベクトルが近いものn件）
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;WithLimit&lt;/code&gt;に&lt;code&gt;2&lt;/code&gt;を指定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;返却される&lt;code&gt;result&lt;/code&gt;に検索結果が入っています。中身はWebに掲載されています（ローカルだとインデントされてないですが）。&lt;/p&gt;
&lt;h3 id=&#34;rag&#34;&gt;RAG&lt;/h3&gt;
&lt;p&gt;ベクトル検索では、入力のテキストに近いオブジェクトを取得するだけでした。
RAGのサンプルコードでは、ベクトル検索をして結果を取得するところまでは同じ流れですが、
取得した後に、それぞれのオブジェクトのデータを使って文章の生成をモジュールを使用して行う処理が追加されています（&lt;code&gt;WithGenerativeSearch()&lt;/code&gt;メソッド）。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;generativeSearch := graphql.NewGenerativeSearch().SingleResult(&amp;#34;Explain {answer} as you might to a five-year-old.&amp;#34;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;{answer}&lt;/code&gt;に、ベクトル検索の結果のオブジェクトの&lt;code&gt;answer&lt;/code&gt;プロパティの文字列が入ります。
そして、生成モジュールを通して、テキストが生成され、その結果が&lt;code&gt;_additional&lt;/code&gt;の&lt;code&gt;generate&lt;/code&gt;の中に帰ってきています。&lt;/p&gt;
&lt;p&gt;クライアントアプリ側では、特にOpenAIのAPIの呼び出しを行っていませんが、文字列の生成までできています。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、&lt;a href=&#34;https://weaviate.io/ja&#34;&gt;日本語に翻訳されたクイックスタート&lt;/a&gt;についてGo言語のサンプルコードをもとに紹介をしました。
数件しかデータを入れていないですが、簡単に動作を確認できるかと思います。&lt;/p&gt;
&lt;p&gt;クイックスタートはまだほんの入り口にすぎません。Weaviateでできることはほかにもあるので、ちょっとずつこれからも紹介していこうかと思います。&lt;/p&gt;
&lt;h2 id=&#34;最後に&#34;&gt;最後に&lt;/h2&gt;
&lt;p&gt;日本のコミュニティとしてConnpassにグループを作りました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://weaviate.connpass.com/&#34;&gt;Weaviate JP Community - connpass&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;どうやってイベントをやるかはまだ考え中ですが、興味がある方は登録しておいていただければと。&lt;/p&gt;
&lt;p&gt;どんな情報、どんなイベントがあれば興味をもっていただけるか？Weaviateを使ってみようと思うけど何から始めよう？など疑問に思うことがあればXやブログのコメントなどをいただければと思います。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Weaviate入門（モジュール）</title>
      <link>https://blog.johtani.info/blog/2025/07/08/intro-weaviate-modules/</link>
      <pubDate>Tue, 08 Jul 2025 08:25:32 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2025/07/08/intro-weaviate-modules/</guid>
      <description>&lt;p&gt;今回も用語の話です。
今回は仕組みの用語「モジュール」です。&lt;/p&gt;
&lt;h2 id=&#34;モジュール&#34;&gt;モジュール&lt;/h2&gt;
&lt;p&gt;Weaviateを利用する際にいくつかの機能についてモジュール化されています。
根幹となるベクトルデータベース周りに便利な処理を提供するのがモジュールです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今回も用語の話です。
今回は仕組みの用語「モジュール」です。&lt;/p&gt;
&lt;h2 id=&#34;モジュール&#34;&gt;モジュール&lt;/h2&gt;
&lt;p&gt;Weaviateを利用する際にいくつかの機能についてモジュール化されています。
根幹となるベクトルデータベース周りに便利な処理を提供するのがモジュールです。&lt;/p&gt;
&lt;h3 id=&#34;ベクトライザーモジュール&#34;&gt;ベクトライザーモジュール&lt;/h3&gt;
&lt;p&gt;たとえば、Weaviateはベクトルデータベースですが、登録するデータのベクトルを生成する「ベクトライザー」と呼ばれるモジュールを備えています。
これにより、データ登録や検索時にアプリケーション側で独自にベクトルを生成してからWeaviateに問い合わせる必要がなくなり、より簡単に検索やデータ登録をできるようになっています。
ベクトライザーと呼ばれるモジュールには、様々なモデルやモデルプロバイダー（OpenAIやCohere、Weaviate、Jina AI、Hugging Faceなど）のモジュールが用意されています。&lt;a href=&#34;https://docs.weaviate.io/weaviate/configuration/modules#enable-vectorizer-modules&#34;&gt;必要に応じてモジュールを有効にする&lt;/a&gt;ことができます。&lt;/p&gt;
&lt;p&gt;また、&lt;a href=&#34;https://docs.weaviate.io/weaviate/modules/custom-modules&#34;&gt;カスタムモジュール&lt;/a&gt;ということで、独自のモジュールを作成できるようにもなっています。利用可能なモデルプロバイダーがなかったり、機能の追加をしたい場合はドキュメントをご覧ください。&lt;/p&gt;
&lt;p&gt;もちろん、ベクトライザーを使用せずに、独自のベクトルのデータを登録したり、検索に使用することも可能です。&lt;/p&gt;
&lt;h3 id=&#34;生成モジュール&#34;&gt;生成モジュール&lt;/h3&gt;
&lt;p&gt;ベクトライザーはエンベディングの生成の用途でしたが、生成モジュール（生成AIモジュール？）と呼ばれるものもあります。
こちらは、検索した結果をもとに、回答を生成することもできます。RAGのGenerateの部分です。
検索するだけでなく、回答の生成のためにLLMを呼び出す仕組みも用意されています。&lt;/p&gt;
&lt;h2 id=&#34;weaviateの公式ドキュメント&#34;&gt;Weaviateの公式ドキュメント&lt;/h2&gt;
&lt;p&gt;今回はモジュールについて少しだけ紹介しました。
モジュールの概念に関するWeaviateのドキュメントを&lt;a href=&#34;https://docs.weaviate.io/weaviate/concepts/modules&#34;&gt;Modules | Weaviate Documentation&lt;/a&gt;ご覧いただくとそのほかのモジュールについても記載があります。
また、モデルプロバイダーに関するページも参考にしてください（&lt;a href=&#34;https://docs.weaviate.io/weaviate/model-providers&#34;&gt;Model provider integrations | Weaviate Documentation&lt;/a&gt;）。&lt;/p&gt;
&lt;h2 id=&#34;最後に&#34;&gt;最後に&lt;/h2&gt;
&lt;p&gt;日本のコミュニティとしてConnpassにグループを作りました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://weaviate.connpass.com/&#34;&gt;Weaviate JP Community - connpass&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;どうやってイベントをやるかはまだ考え中ですが、興味がある方は登録しておいていただければと。&lt;/p&gt;
&lt;p&gt;どんな情報、どんなイベントがあれば興味をもっていただけるか？Weaviateを使ってみようと思うけど何から始めよう？など疑問に思うことがあればXやブログのコメントなどをいただければと思います。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Weaviate入門（オブジェクト、コレクション）</title>
      <link>https://blog.johtani.info/blog/2025/07/04/intro-weaviate-collection/</link>
      <pubDate>Fri, 04 Jul 2025 03:16:01 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2025/07/04/intro-weaviate-collection/</guid>
      <description>&lt;p&gt;ソフトウェアやサーバーによって用語って変わりますよね？
ベクトルデータベースのWeaviateも、私がこれまで触ってきたものとは違う用語が使われているので、いくつかの用語を紹介しようと思います。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ソフトウェアやサーバーによって用語って変わりますよね？
ベクトルデータベースのWeaviateも、私がこれまで触ってきたものとは違う用語が使われているので、いくつかの用語を紹介しようと思います。&lt;/p&gt;
&lt;h2 id=&#34;データオブジェクト&#34;&gt;データオブジェクト&lt;/h2&gt;
&lt;p&gt;1件のデータのことをデータオブジェクトと呼びます。
データオブジェクトはプロパティ（名前とデータ型）を持っており、コレクション（クラスと呼ばれることもある）と呼ばれるデータの集合（RDBでいうテーブルのようなもの）に属します。
データオブジェクトはJSONドキュメントとして表現されます。
データオブジェクトを登録する場合は、コレクションに対して登録します。&lt;/p&gt;
&lt;p&gt;ベクトルデータベースなので、データオブジェクトに直接自分で作成したベクトルを含めて登録することもできますが、Weaviateでは、&lt;a href=&#34;https://weaviate.io/developers/weaviate/modules#vectorizer-reranker-and-generative-ai-integrations&#34;&gt;ベクトライザー&lt;/a&gt;と呼ばれるベクトルエンベディングをWeaviateのモジュールが生成してくれる機能があります（OpenAIのAPIを利用したエンベディングなど、さまざまなエンベディングのAPIを呼ぶ設定ができるようになっている）。
コレクションの作成時にこのベクトライザーを定義しておくと、コレクションにデータを登録するとベクトルを生成して検索できるようにしてくれます。&lt;/p&gt;
&lt;h2 id=&#34;コレクション&#34;&gt;コレクション&lt;/h2&gt;
&lt;p&gt;RDBでいうテーブルのようなものです。
コレクションに対してデータオブジェクトを登録、更新などを行えます。
コレクションにはスキーマが定義されており、コレクションに属するデータオブジェクトがどのようなプロパティを持っているのかがわかります。&lt;/p&gt;
&lt;p&gt;コレクション作成時にスキーマを定義することもできますが、チュートリアルなどでは、自動生成されるスキーマを利用している場合があります。
また、上記でも説明したようにベクトライザーと呼ばれるベクトル生成のためのモジュールの設定などもこちらで定義できます。&lt;/p&gt;
&lt;p&gt;コレクションごとにベクトル空間があり、その中でベクトル検索ができるようになっています。
また、バージョン1.24からは、&lt;a href=&#34;https://weaviate.io/developers/weaviate/concepts/data#multiple-vector-embeddings-named-vectors&#34;&gt;名前付きベクトル&lt;/a&gt;と呼ばれる機能が追加され、1つのコレクションに対して複数のベクトル空間を作ることもできるようになっています。&lt;/p&gt;
&lt;p&gt;ベクトル以外にも、&lt;a href=&#34;https://weaviate.io/developers/weaviate/concepts/indexing#inverted-indexes&#34;&gt;転置インデックス&lt;/a&gt;の設定もできるようになっており、いわゆるハイブリッド検索（転置インデックスを利用した検索＋ベクトル検索）も可能になっています。&lt;/p&gt;
&lt;h2 id=&#34;weaviateの公式ドキュメント&#34;&gt;Weaviateの公式ドキュメント&lt;/h2&gt;
&lt;p&gt;今回紹介したデータの概念などに関するWeaviateのドキュメントは&lt;a href=&#34;https://weaviate.io/developers/weaviate/concepts/data&#34;&gt;Data structure | Weaviate&lt;/a&gt;にあります。&lt;/p&gt;
&lt;p&gt;図などもありますので、参考にしていただければと。&lt;/p&gt;
&lt;h2 id=&#34;最後に&#34;&gt;最後に&lt;/h2&gt;
&lt;p&gt;日本のコミュニティとしてConnpassにグループを作りました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://weaviate.connpass.com/&#34;&gt;Weaviate JP Community - connpass&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;どうやってイベントをやるかはまだ考え中ですが、興味がある方は登録しておいていただければと。&lt;/p&gt;
&lt;p&gt;どんな情報、どんなイベントがあれば興味をもっていただけるか？Weaviateを使ってみようと思うけど何から始めよう？など疑問に思うことがあればXやブログのコメントなどをいただければと思います。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Weaviate入門（ベクトルデータベース、ベクトル）</title>
      <link>https://blog.johtani.info/blog/2025/07/01/intro-weaviate/</link>
      <pubDate>Tue, 01 Jul 2025 06:11:01 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2025/07/01/intro-weaviate/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://weaviate.io/&#34;&gt;Weaviate&lt;/a&gt;って聞いたことありますか？&lt;/p&gt;
&lt;p&gt;Goで書かれたOSSのベクトルデータベースです（&lt;a href=&#34;https://github.com/weaviate/weaviate&#34;&gt;GitHubリポジトリはこちら&lt;/a&gt;）。
&lt;a href=&#34;https://blog.johtani.info/blog/2024/12/17/japanese-search-with-weaviate/&#34;&gt;昨年、Kagomeを使えるようにPRを送って、発表をしてきました&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;改めて、Weaviateはどんなものなのか？というのを少しずつアウトプットしていこうかと思いブログを書き始めたところです（日本で広めていく手伝いもすることになったので）。
まずは、用語などの説明から少しずつ始めていこうと思います。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://weaviate.io/&#34;&gt;Weaviate&lt;/a&gt;って聞いたことありますか？&lt;/p&gt;
&lt;p&gt;Goで書かれたOSSのベクトルデータベースです（&lt;a href=&#34;https://github.com/weaviate/weaviate&#34;&gt;GitHubリポジトリはこちら&lt;/a&gt;）。
&lt;a href=&#34;https://blog.johtani.info/blog/2024/12/17/japanese-search-with-weaviate/&#34;&gt;昨年、Kagomeを使えるようにPRを送って、発表をしてきました&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;改めて、Weaviateはどんなものなのか？というのを少しずつアウトプットしていこうかと思いブログを書き始めたところです（日本で広めていく手伝いもすることになったので）。
まずは、用語などの説明から少しずつ始めていこうと思います。&lt;/p&gt;
&lt;h2 id=&#34;ベクトルデータベース&#34;&gt;ベクトルデータベース？&lt;/h2&gt;
&lt;p&gt;最近では、RAG（Retrieval-Augmented Generation）などで利用されるものというイメージが多いかもしれないです。&lt;/p&gt;
&lt;p&gt;ベクトルデータベースとは、データオブジェクトとそれを表現するベクトルを保存してベクトルの近いものを検索することができるものです。
データオブジェクトはベクトルのもととなるテキストなどに加えて、メタデータを含んだ情報です。&lt;/p&gt;
&lt;p&gt;検索する際に、クエリをベクトルに変換したものに近いベクトルを持ったデータオブジェクトを探してくることができます。
近いベクトルというのは、類似のベクトルを探してくると言い換えることもできます。
これにより、ベクトルとして似ているものを検索して並べることが可能となります。&lt;/p&gt;
&lt;p&gt;ベクトルデータベースは、大量のベクトルデータに対してさまざまな技術を用いて素早く検索をする仕組みを提供します。&lt;/p&gt;
&lt;h2 id=&#34;ベクトル&#34;&gt;ベクトル？&lt;/h2&gt;
&lt;p&gt;RAGという観点だとテキストの検索のイメージがありますが、ベクトルにできるものはテキストだけではありません。
画像、動画、音声、何かしらの特徴量をベクトルにするといったことも可能です。
LLMの流行の前から画像の検索などにベクトルが用いられてきました。&lt;/p&gt;
&lt;p&gt;また、LLMの活用によってテキスト情報をベクトル埋め込みと呼ばれる手法でベクトルにすることで、これまでのキーワードによるテキストや単語の完全一致ではなく、意味的な類似によって情報を検索できるようになってきています。
このため、ベクトル検索はセマンティック検索（意味的な検索）とも呼ばれています。&lt;/p&gt;
&lt;p&gt;ベクトル空間に異なるデータのベクトルを統合することで、マルチモーダルなベクトル検索を可能にすることなどもできます（昨年やったデモはキーワードで画像を検索してみました）。&lt;/p&gt;
&lt;h2 id=&#34;weaviateの公式ブログ&#34;&gt;Weaviateの公式ブログ&lt;/h2&gt;
&lt;p&gt;Weaviateの公式ブログにはさらっと私が書いたこと以上にベクトルデータベースに関する記事（ &lt;a href=&#34;https://weaviate.io/blog/what-is-a-vector-database&#34;&gt;A Gentle Introduction to Vector Databases | Weaviate&lt;/a&gt;）やベクトル検索に関する記事（&lt;a href=&#34;https://weaviate.io/blog/vector-search-explained&#34;&gt;Bring your own vectors | Weaviate&lt;/a&gt;）が公開されています。
こちらも参考になるかと。&lt;/p&gt;
&lt;p&gt;これ以外にもWeaviateのブログではLLMやRAGにまつわる技術の紹介などがされているので興味がある方はご覧いただければと（たとえば、&lt;a href=&#34;https://weaviate.io/blog/late-interaction-overview&#34;&gt;Late Interactionの話とか&lt;/a&gt;）。&lt;/p&gt;
&lt;h2 id=&#34;最後に&#34;&gt;最後に&lt;/h2&gt;
&lt;p&gt;ということで？、日本のコミュニティとしてConnpassにグループを作りました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://weaviate.connpass.com/&#34;&gt;Weaviate JP Community - connpass&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;どうやってイベントをやるかはまだ考え中ですが、興味がある方は登録しておいていただければと。&lt;/p&gt;
&lt;p&gt;どんな情報、どんなイベントがあれば興味をもっていただけるか？Weaviateを使ってみようと思うけど何から始めよう？など疑問に思うことがあればXやブログのコメントなどをいただければと思います。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>今年の振り返りと来年の抱負（2024）</title>
      <link>https://blog.johtani.info/blog/2024/12/31/review-2024/</link>
      <pubDate>Tue, 31 Dec 2024 01:27:20 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2024/12/31/review-2024/</guid>
      <description>&lt;p&gt;いやー、紅白のB&amp;rsquo;zよかったですね（毎年恒例のブログを紅白見ながら書いてます）。&lt;/p&gt;
&lt;h2 id=&#34;振り返り2023年に書いた抱負から&#34;&gt;振り返り（2023年に書いた抱負から）&lt;/h2&gt;
&lt;p&gt;まずは振り返りです。&lt;/p&gt;
&lt;h3 id=&#34;フリーランス継続&#34;&gt;フリーランス継続&lt;/h3&gt;
&lt;p&gt;今年は出だしはそれほど忙しくなかったのですが、後半は新規のお客さんも増えて、個人事業主としてやって行けてます。
今のところそのまま、来年も継続していただける感じなのでありがたいことです。
調べものして、レクチャーするというのが多いかな？&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;いやー、紅白のB&amp;rsquo;zよかったですね（毎年恒例のブログを紅白見ながら書いてます）。&lt;/p&gt;
&lt;h2 id=&#34;振り返り2023年に書いた抱負から&#34;&gt;振り返り（2023年に書いた抱負から）&lt;/h2&gt;
&lt;p&gt;まずは振り返りです。&lt;/p&gt;
&lt;h3 id=&#34;フリーランス継続&#34;&gt;フリーランス継続&lt;/h3&gt;
&lt;p&gt;今年は出だしはそれほど忙しくなかったのですが、後半は新規のお客さんも増えて、個人事業主としてやって行けてます。
今のところそのまま、来年も継続していただける感じなのでありがたいことです。
調べものして、レクチャーするというのが多いかな？&lt;/p&gt;
&lt;h3 id=&#34;プログラミング継続&#34;&gt;プログラミング継続&lt;/h3&gt;
&lt;p&gt;昨年末はTypeScriptって書いてましたが、結局Goがメインで時々C#のサンプル書いたりって感じです。
あとは、AtCoderを初めて見ました。そんなにできる気はしないんですがいい刺激になるかなと。
やりっぱなしで、復習してないからそこは改善しないとかもな。
あとは、この後の話にも続きますが、PythonもLLMや検証結果を提示するためにJupyter Notebook書いたりに使ってます。
全然Java触ってないな、そういえば。&lt;/p&gt;
&lt;h3 id=&#34;ベクトル検索の使い方をいろいろ試す&#34;&gt;ベクトル検索の使い方をいろいろ試す&lt;/h3&gt;
&lt;p&gt;試せてる？とまでは行けてないですが、&lt;a href=&#34;https://blog.johtani.info/blog/2024/12/17/japanese-search-with-weaviate&#34;&gt;Weaviateをちょっとずつ触ってます&lt;/a&gt;。
ベクトル検索に関して調査したりはしてますが、使い倒すところまではいけてないなぁ。
進化が早いのもあって、追いつけてない気がする。。。&lt;/p&gt;
&lt;h3 id=&#34;本を読んだブログを書く&#34;&gt;本を読んだブログを書く&lt;/h3&gt;
&lt;p&gt;ブログに書いたのは1冊だ。。。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2024/03/22/daily-routine/&#34;&gt;「続ける思考」を読んだ | @johtaniの日記 3rd | @johtani&amp;rsquo;s blog 3rd edition&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ただ、この本のおかげで歯磨き読書は続いています。&lt;/p&gt;
&lt;h2 id=&#34;振り返り今年あったできごと&#34;&gt;振り返り（今年あったできごと）&lt;/h2&gt;
&lt;p&gt;今年もおかげさまでずっと自宅で仕事してました。
仕事で外出したのは数回かな。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ゲーム
&lt;ul&gt;
&lt;li&gt;FactorioのSpace Explorationは途中で仕事が忙しくなって放置してしまった&lt;/li&gt;
&lt;li&gt;FF16（クリア）&lt;/li&gt;
&lt;li&gt;ゼルダのカリモノ（クリア）&lt;/li&gt;
&lt;li&gt;バイオRE2（クリア）&lt;/li&gt;
&lt;li&gt;ELDEN RINGのDLC&lt;/li&gt;
&lt;li&gt;TUNIC&lt;/li&gt;
&lt;li&gt;DEATHLOOP&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;結構やってるな、前半暇があったからかも？
FactorioのDLCが待ってるので頑張らないとなぁ。
バイオRE3も待ってる。&lt;/p&gt;
&lt;p&gt;仕事環境としてはPC組み替えました。4年前に組んだPCでもそれほど問題ないのですが、ローカルでLLM動かしたりもしたいなと思いつつ。
移行でWSL2の環境を吹っ飛ばしてしまったので痛い目にあいましたが。。。
今回は空冷で、黒いケースで、光らないPCにしました。&lt;/p&gt;
&lt;p&gt;今年はZOZOさん向けにElasticsearchのハンズオンをやりました。
ハンズオン資料はLLMを使ってざっくり作るということをやってみました（&lt;a href=&#34;https://blog.johtani.info/blog/2024/12/05/with-ai/&#34;&gt;ブログ：AI活用しきれていない話&lt;/a&gt;）。
知ってる内容だととても便利ですね（おかしいところは自分で補完できるし）。
改めて、利用している機能、していない機能に関係なくハンズオンしてもらうことで、何かのヒントになればという感じで。&lt;/p&gt;
&lt;p&gt;検索技術勉強会もリアルに参加して、&lt;a href=&#34;https://blog.johtani.info/blog/2024/06/01/searchtechjp-2024-spring/&#34;&gt;5月&lt;/a&gt;と&lt;a href=&#34;https://blog.johtani.info/blog/2024/10/31/searchtechjp-2024-summer/&#34;&gt;10月&lt;/a&gt;に2回ほど司会をさせていただきました。
来年も企画中なので楽しみにしていてください。
もちろん、&lt;a href=&#34;http://bit.ly/SpeakerSearchTechTalk&#34;&gt;絶賛スピーカーを募集中&lt;/a&gt;です。&lt;/p&gt;
&lt;h2 id=&#34;来年の抱負&#34;&gt;来年の抱負&lt;/h2&gt;
&lt;p&gt;さて、最後は来年の豊富です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;フリーランス継続&lt;/li&gt;
&lt;li&gt;プログラミング継続&lt;/li&gt;
&lt;li&gt;Weaviateをもと触る&lt;/li&gt;
&lt;li&gt;本を読んだブログを書く？&lt;/li&gt;
&lt;li&gt;勉強会の録画をマスターする？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今年はありがたいことに後半に仕事が増えてPC組み替えたりもできました。
つながりのないところから舞い込んだ仕事などもあったりと、大変ありがたいことで。&lt;/p&gt;
&lt;p&gt;プログラミングはGoをメインで継続していくつもりです。
AtCoderもGoで書いてますし、WeaviateもGoで書かれているのもありちょうどよい題材かなと。あとは、PythonはLLM周りで使うんだろうなぁ。
AtCoderは復習を緒とはするようにしないと伸び悩みそう。。。&lt;/p&gt;
&lt;p&gt;Weaviateに日本語のトークナイザーのコントリビュートをしましたが、ほかにもいろいろと触っていきたいなぁと。プログラミングの勉強にもなるのでソース読んだり、ほかの機能のコントリビュートしたりもやっていきたいなぁ。
新しいことを触ることで自分へ刺激になるのが一番の理由だったりします。&lt;/p&gt;
&lt;p&gt;読んだ本のブログのネタを集めるために、Slackのボットを書いて、読書で気になった点や面白かった点を書き出すような仕組みを作りました。
これを改良しつつ、ブログに簡単にまとめられるようにしたいな。
あとは、読書にもChatGPTなどを活用していきたいな（&lt;a href=&#34;https://shiumachi.hatenablog.com/entry/how-to-read-docs-with-ai&#34;&gt;知り合いの真似をしながら&lt;/a&gt;）&lt;/p&gt;
&lt;p&gt;勉強会で録画させていただいているのですが、今回は音声がいまいちだったかなぁと。
ノートPCでMeetに録画しながらやってみたんですが、ノイズキャンセリングのせい＋ノートPCのマイクだったので、もっとよい環境で録画、録音できるようなノウハウを手に入れたいですね。&lt;/p&gt;
&lt;p&gt;来年の抱負も固定化してきつつあるから、やっぱり何か刺激を入れないとなぁ。&lt;/p&gt;
&lt;p&gt;ということで、とりあえず今年もあと少しというところでブログが書きあがりました。
来年も&lt;a href=&#34;https://search-tech.connpass.com/&#34;&gt;検索技術勉強会&lt;/a&gt;を開催するつもりなので楽しみです（自分がいろんな話を聞きたいからやってる）
来年もよろしくお願いいたします。よいお年をー&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>ElasticsearchのRetrieverについて調べたので雑にメモ</title>
      <link>https://blog.johtani.info/blog/2024/12/27/about-retriever/</link>
      <pubDate>Fri, 27 Dec 2024 04:09:21 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2024/12/27/about-retriever/</guid>
      <description>&lt;p&gt;ElasticsearchにRetrieverという仕組みが8.16でGAしたので、ざっくり調べた時のメモを残しておこうかなと。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;elasticsearchのretriever&#34;&gt;ElasticsearchのRetriever&lt;/h2&gt;
&lt;p&gt;Retrieverという検索の機能が8.16でGAリリースされた。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ElasticsearchにRetrieverという仕組みが8.16でGAしたので、ざっくり調べた時のメモを残しておこうかなと。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;elasticsearchのretriever&#34;&gt;ElasticsearchのRetriever&lt;/h2&gt;
&lt;p&gt;Retrieverという検索の機能が8.16でGAリリースされた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/8.16/retrievers-overview.html&#34;&gt;Retrievers - 公式ドキュメント&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/search-labs/blog/elasticsearch-retrievers-ga-8.16.0&#34;&gt;Elasticsearch retrievers are generally available with Elasticsearch 8.16.0! - Search Labs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/search-labs/blog/elasticsearch-retrievers&#34;&gt;Introducing Retrievers - Search All the Things! - Search Labs (8.14.0)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/search-labs/blog/semantic-reranking-with-retrievers&#34;&gt;Semantic reranking in Elasticsearch with retrievers - Search Labs (8.14.0)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/search-labs/blog/semantic-search-query-rules&#34;&gt;Ensuring business rules work seamlessly with semantic search - Elasticsearch Labs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;retrieverとは&#34;&gt;Retrieverとは？&lt;/h2&gt;
&lt;p&gt;これまでの検索処理（&lt;code&gt;_serach&lt;/code&gt;エンドポイント）では、検索して&lt;code&gt;search_after&lt;/code&gt;で検索結果を絞り込む（Aggregationは最初の検索処理の結果）ことや、&lt;code&gt;rescore&lt;/code&gt;で検索結果の一部を別のクエリでスコアリングして並べ替えるといったことが可能でした。
しかし、複数の検索処理それぞれ実施してその結果を並べ替えたり、入れ子にした検索の処理を行ったりといった検索パイプラインのような処理はできませんでした。&lt;/p&gt;
&lt;p&gt;8.16でリリースされたRetrieverは1回のリクエストで、複数のクエリを実行した結果をRRFで結合したり、rerankerでリランキングしたりといったことが可能になります。
rrfがリリースされたタイミング（&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/8.8/release-highlights.html#add_support_for_reciprocal_rank_fusion_rrf_to_search_api&#34;&gt;8.8&lt;/a&gt;）では1つのパターンのみが考慮されていました。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;query&lt;/code&gt;が通常の転地インデックスを利用した検索、&lt;code&gt;knn&lt;/code&gt;がベクトル検索、&lt;code&gt;rank&lt;/code&gt;が2つの検索結果を統合するために&lt;code&gt;rrf&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-javascript&#34; data-lang=&#34;javascript&#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:#e6db74&#34;&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;match&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;product&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;query&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;brown shoes&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;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:#e6db74&#34;&gt;&amp;#34;knn&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;field&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;product-vector&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:#e6db74&#34;&gt;&amp;#34;query_vector&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [&lt;span style=&#34;color:#ae81ff&#34;&gt;54&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&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:#e6db74&#34;&gt;&amp;#34;k&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;20&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:#e6db74&#34;&gt;&amp;#34;num_candidates&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;75&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:#e6db74&#34;&gt;&amp;#34;rank&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;rrf&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;window_size&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&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:#e6db74&#34;&gt;&amp;#34;rank_constant&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;20&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この形以外で検索結果を統合する自由度がありません。
また、rankについてもrrfのみのでGAしていません。
これらの拡張性を提供する形でRetrieverが提供されています。&lt;/p&gt;
&lt;p&gt;上記のクエリは次のようなRetrieverとなります。&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;retriever&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;rrf&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;retrievers&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;standard&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;match&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;product&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;query&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;brown shoes&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;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&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:#e6db74&#34;&gt;&amp;#34;knn&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;field&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;product-vector&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:#e6db74&#34;&gt;&amp;#34;query_vector&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [&lt;span style=&#34;color:#ae81ff&#34;&gt;54&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&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:#e6db74&#34;&gt;&amp;#34;k&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;20&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:#e6db74&#34;&gt;&amp;#34;num_candidates&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;75&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;rank_constant&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;20&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:#e6db74&#34;&gt;&amp;#34;rank_window_size&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;それぞれ検索結果のリストを返すものを「Retriever」と呼び、rrfなどは、複数の検索結果を混ぜて返すため、入れ子で別のRetrieverを読んでいる形となります。&lt;/p&gt;
&lt;p&gt;複数のretreiverをパイプライン処理のようにつなぎたい場合は、入れ子にしていくことで前段のretrieverの結果をもとに、後段のretrieverの処理を実施可能です。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;GET retrievers_example/_search
{
    &amp;#34;retriever&amp;#34;: {
        &amp;#34;text_similarity_reranker&amp;#34;: {
            &amp;#34;retriever&amp;#34;: {
                &amp;#34;text_similarity_reranker&amp;#34;: {
                    &amp;#34;retriever&amp;#34;: {
                        &amp;#34;knn&amp;#34;: {
                            &amp;#34;field&amp;#34;: &amp;#34;vector&amp;#34;,
                            &amp;#34;query_vector&amp;#34;: [
                                0.23,
                                0.67,
                                0.89
                            ],
                            &amp;#34;k&amp;#34;: 3,
                            &amp;#34;num_candidates&amp;#34;: 5
                        }
                    },
                    &amp;#34;rank_window_size&amp;#34;: 100,
                    &amp;#34;field&amp;#34;: &amp;#34;text&amp;#34;,
                    &amp;#34;inference_id&amp;#34;: &amp;#34;my-rerank-model&amp;#34;,
                    &amp;#34;inference_text&amp;#34;: &amp;#34;What are the state of the art applications of AI in information retrieval?&amp;#34;
                }
            },
            &amp;#34;rank_window_size&amp;#34;: 10,
            &amp;#34;field&amp;#34;: &amp;#34;text&amp;#34;,
            &amp;#34;inference_id&amp;#34;: &amp;#34;my-other-more-expensive-rerank-model&amp;#34;,
            &amp;#34;inference_text&amp;#34;: &amp;#34;Applications of Large Language Models in technology and their impact on user satisfaction&amp;#34;
        }
    },
    &amp;#34;_source&amp;#34;: false
}
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;提供されているretriever&#34;&gt;提供されているRetriever&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;standard&lt;/code&gt;: これまでの検索クエリの実行を行うretriever。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;knn&lt;/code&gt;: knn検索のためのretriever。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rrf&lt;/code&gt;: RRFを用いて検索結果を生成するretriever。
&lt;ul&gt;
&lt;li&gt;複数のRetrieverを呼び出せる。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;text_similarity_reranker&lt;/code&gt;: NLPモデルを利用して検索結果の上位k件を並べ替えるretriever。
&lt;ul&gt;
&lt;li&gt;inference APIで登録してあるものを呼び出すもの。&lt;/li&gt;
&lt;li&gt;別のRetriever（1つだけ）の結果を指定したRerankerで並び変える&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rule&lt;/code&gt;: &lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/search-using-query-rules.html#query-rules&#34;&gt;クエリルール&lt;/a&gt;を利用して、特定のクエリに対して処理を実施する
&lt;ul&gt;
&lt;li&gt;8.17時点では、pinnedとexcludeのみ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;text-similarity-re-ranker-retriever817時点&#34;&gt;Text Similarity Re-ranker Retriever（8.17時点）&lt;/h4&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/put-inference-api.html&#34;&gt;Create inference API&lt;/a&gt;を利用して、text_similarity_rerankerのエンドポイントを設定。こちらは、テキストの類似性を計算できるもの。&lt;/p&gt;
&lt;p&gt;現在利用できるRerankerは次の通り&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/infer-service-elasticsearch.html#inference-example-elastic-reranker&#34;&gt;Elastic Reranker&lt;/a&gt;： Elasticが作ったクロスエンコーダモデル。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/infer-service-cohere.html&#34;&gt;Cohere Rerank inference endpoint&lt;/a&gt;:Cohereのrerankタスクを利用&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/infer-service-google-vertex-ai.html&#34;&gt;Google Vertex AI inference endpoint&lt;/a&gt;:Vertex AIのrerankタスクを利用&lt;/li&gt;
&lt;li&gt;Elandというツールを使って、アップしたモデルを利用（&lt;a href=&#34;https://www.elastic.co/guide/en/machine-learning/8.17/ml-nlp-model-ref.html#ml-nlp-model-ref-text-similarity&#34;&gt;サポートされてるモデルに制限あり&lt;/a&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Elandを利用するパターンはサポートされているモデルは現状2種類なので、あまり選択肢がないと思われる。
Vertex AIで定義したものがどのくらい自由度があるのかは別途調査する必要がある。
&lt;strong&gt;Enterpriseの契約&lt;/strong&gt;でなければInference APIが利用できない。&lt;/p&gt;
&lt;h3 id=&#34;使い方例&#34;&gt;使い方（例）&lt;/h3&gt;
&lt;p&gt;既存の検索の仕組みとの組み合わせの例などが記載してある（ハイライト、collapse、inner_hits、aggsなど）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/_retrievers_examples.html&#34;&gt;Retrievers examples | Elasticsearch Guide ［8.17］ | Elastic&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;queryのrescorerは&#34;&gt;QueryのRescorerは？&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/filter-search-results.html#query-rescorer&#34;&gt;Query Rescorer&lt;/a&gt;という仕組みが用意されており、通常の全文検索のqueryに対して、上位N件の結果を別のクエリを用いてスコア計算をする方法が用意されている。&lt;/p&gt;
&lt;p&gt;このquery rescorerはretrieverでは現時点（8.17）では利用できない模様（&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues/118327&#34;&gt;Issue 118327&lt;/a&gt;）
これに対し、&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/118585&#34;&gt;すでにPRが作成され、次期バージョンに取り込まれるrescoreと呼ばれるretrieverが実装されている&lt;/a&gt;。&lt;/p&gt;
&lt;h4 id=&#34;elasticのltrとretrieverの組み合わせはどうなるのか&#34;&gt;ElasticのLtRとRetrieverの組み合わせはどうなるのか？&lt;/h4&gt;
&lt;p&gt;上記の&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/118585&#34;&gt;PR&lt;/a&gt;が実装されることで、「おそらく」ElasticのLtRの検索もrescoreのretrieverで呼び出せるはず（要確認）。&lt;/p&gt;
&lt;h4 id=&#34;o19nのltrは&#34;&gt;O19nのLtRは？&lt;/h4&gt;
&lt;p&gt;こちらもRescoreで呼び出す形であれば、上記のPRで対応されるのでは（要確認）。&lt;/p&gt;
&lt;h2 id=&#34;そのほかに気になる観点そのうち調べるかも&#34;&gt;そのほかに気になる観点（そのうち調べるかも？）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;使えないクエリとかあるのか？
&lt;ul&gt;
&lt;li&gt;Retrieverと現在の&lt;code&gt;_search&lt;/code&gt;の組み合わせに関しては&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/retriever.html#retriever-restrictions&#34;&gt;制限の記載あり&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;個別のRetriever内部で制限があるかは未調査&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Query Profileとかどうなるのか？&lt;/li&gt;
&lt;li&gt;分散トレーシングのSpanとかはどうなるのか？どのRetrieverがどのくらいの処理時間みたいなのがわかるのか？&lt;/li&gt;
&lt;li&gt;SlowQueryはShardに対してなので、末端（葉）のクエリの処理での計測になるのか？
&lt;ul&gt;
&lt;li&gt;Fetchも同様か？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Fetchはどのタイミングで実行されるのか？一番最後？&lt;/li&gt;
&lt;li&gt;Rescoreとの違い、組み合わせはどうなるのか？
&lt;ul&gt;
&lt;li&gt;そのうちなくなりそう、rescore?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;クエリの実行順序を明確に指定できる形にできるから、処理早くしたりできる？？？&lt;/li&gt;
&lt;li&gt;複数Shardの場合の処理の流れってどんな感じ？&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;とりあえず、雑に調べてたので、雑にメモに残しておきます。
まだちゃんとしたデータで動かしてないので、それは宿題かなぁ。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Weaviateで日本語を利用した検索という話をしました</title>
      <link>https://blog.johtani.info/blog/2024/12/17/japanese-search-with-weaviate/</link>
      <pubDate>Tue, 17 Dec 2024 13:22:01 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2024/12/17/japanese-search-with-weaviate/</guid>
      <description>&lt;p&gt;この記事は&lt;a href=&#34;https://qiita.com/advent-calendar/2024/search&#34;&gt;情報検索・検索技術 - Qiita Advent Calendar 2024 - Qiita&lt;/a&gt;の17日目（ちょっと遅刻？）の記事となります。&lt;/p&gt;
&lt;p&gt;「&lt;a href=&#34;https://weaviate-japan-event.peatix.com/&#34;&gt;【日本初主催】新世代のソフトウェアのためのAIネイティブデータベース Weaviate Japan Summit | Peatix&lt;/a&gt;」というイベントで&lt;a href=&#34;https://github.com/ikawaha/kagome&#34;&gt;Kagome&lt;/a&gt;でテキスト検索できる仕組みを実装したものを取り込んでもらった話をしてきました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://weaviate.io/&#34;&gt;Weaviate&lt;/a&gt;とは、ベクトル検索やキーワード検索、RAGなどを手軽に体験できるデータベースになります。
OSSで公開されており、SaaSも提供されています。Goで実装されていることもあり、日本語の検索に&lt;a href=&#34;https://github.com/ikawaha/kagome&#34;&gt;Kagome&lt;/a&gt;が利用できるかも？ということでちょっと調べて実装してみました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;この記事は&lt;a href=&#34;https://qiita.com/advent-calendar/2024/search&#34;&gt;情報検索・検索技術 - Qiita Advent Calendar 2024 - Qiita&lt;/a&gt;の17日目（ちょっと遅刻？）の記事となります。&lt;/p&gt;
&lt;p&gt;「&lt;a href=&#34;https://weaviate-japan-event.peatix.com/&#34;&gt;【日本初主催】新世代のソフトウェアのためのAIネイティブデータベース Weaviate Japan Summit | Peatix&lt;/a&gt;」というイベントで&lt;a href=&#34;https://github.com/ikawaha/kagome&#34;&gt;Kagome&lt;/a&gt;でテキスト検索できる仕組みを実装したものを取り込んでもらった話をしてきました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://weaviate.io/&#34;&gt;Weaviate&lt;/a&gt;とは、ベクトル検索やキーワード検索、RAGなどを手軽に体験できるデータベースになります。
OSSで公開されており、SaaSも提供されています。Goで実装されていることもあり、日本語の検索に&lt;a href=&#34;https://github.com/ikawaha/kagome&#34;&gt;Kagome&lt;/a&gt;が利用できるかも？ということでちょっと調べて実装してみました。&lt;/p&gt;
&lt;p&gt;先週の発表に利用した資料は次のリンク先で公開してあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スライド：&lt;a href=&#34;https://noti.st/johtani/9399yD/weaviate&#34;&gt;Weaviateの日本語対応とマルチモーダル・多言語検索デモ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;セッションでは、日本語のキーワード検索だけではなく、ベクトル検索やキーワードとベクトルを組み合わせたハイブリッド検索をデモしました。
今回はセッションで話をあまりしていない、デモの仕組みに関してブログにまとめようと思います。&lt;/p&gt;
&lt;h2 id=&#34;デモデータについて&#34;&gt;デモデータについて&lt;/h2&gt;
&lt;p&gt;今回は日本語を用いたデモ（今回取り込んでもらった機能を紹介するデモ）が必須であったため、次のような要件でデモを考えていました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;日本語テキストに対してキーワード検索&lt;/li&gt;
&lt;li&gt;ベクトル化したデータも検索（Weaviateの得意分野）&lt;/li&gt;
&lt;li&gt;せっかく日本でやるイベントなので日本語を使ったベクトル検索がいい&lt;/li&gt;
&lt;li&gt;ハイブリッド検索やフィルタ検索（ベクトル検索した結果をキーワードでフィルタリング）のデモをやりたい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;テキストだけで当初はデータを探そうと思っていたのですが、ベクトル検索とキーワードの検索での違いが分かりにくくなりそうかも？という懸念がありました。
それよりも、画像を日本語で検索でき、画像に日本語の文章の説明がついているデータがデモをするときの流れも作りやすいのでは？と思い、まずは、Weaviateのマルチモーダルのデモを探すことに。&lt;/p&gt;
&lt;h3 id=&#34;デモのシステムのベース&#34;&gt;デモのシステムのベース&lt;/h3&gt;
&lt;p&gt;Weaviateの方たちは様々なデモを用意してくれており、マルチモーダル検索のデモも用意されていました。
ベースとしたのは、次のリンク先で公開されているサンプルになります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/weaviate/weaviate-examples/blob/main/clip-multi-modal-text-image-search/README.md&#34;&gt;weaviate-examples/clip-multi-modal-text-image-search/README.md at main · weaviate/weaviate-examples&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このサンプルは3つの要素から構成されています。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Weaviate Server&lt;/li&gt;
&lt;li&gt;CLIPモデルを用いたServer（&lt;a href=&#34;https://github.com/weaviate/multi2vec-clip-inference/tree/main&#34;&gt;Hugging Faceを利用したサービス&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;Node.jsによるフロントエンド&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最初の2つはDockerで起動するコンテナとなっています。&lt;/p&gt;
&lt;p&gt;Weaviateにはモジュールという概念があります。このモジュールの中で、入力されたデータをもとにベクトル化するものを&lt;a href=&#34;https://weaviate.io/developers/weaviate/configuration/modules#vectorizer-modules&#34;&gt;Vectorizer&lt;/a&gt;と呼んでいます。
今回は&lt;code&gt;multi2vec-clip&lt;/code&gt;というVectorizerを利用して、Weaviateから2のCLIPモデルを用いたサービスを呼び出し、画像やテキストをベクトル化してWeaviateに保存したり利用する形をとっています。&lt;/p&gt;
&lt;p&gt;上記のサンプルでは、特定のディレクトリ（&lt;code&gt;images&lt;/code&gt;）に入れた画像をWeaviateに登録する処理（&lt;a href=&#34;https://github.com/weaviate/weaviate-examples/blob/main/clip-multi-modal-text-image-search/import/go/cmd/main.go&#34;&gt;Goで書かれたコマンド&lt;/a&gt;）が用意されています。&lt;/p&gt;
&lt;p&gt;フロントエンドでは、検索窓が用意されておりテキストを入力すると、画像が検索結果として出てくるデモです。&lt;/p&gt;
&lt;p&gt;テキストを入力としてベクトル検索をするデモの部分はこれでよいのですが、今回はこれに加えてキーワードで検索できるようなデータが必要となります。&lt;/p&gt;
&lt;h3 id=&#34;デモデータの準備&#34;&gt;デモデータの準備&lt;/h3&gt;
&lt;p&gt;キーワード検索をするために、画像＋テキスト（しかも日本語がよい）ということで、いくつか物色した結果、採用したでものデータは次のものになりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://cocodataset.org/#home&#34;&gt;MS COCO&lt;/a&gt;データセット&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://captions.stair.center/&#34;&gt;日本語のキャプションデータ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MS COCOと呼ばれる、画像に対していくつかのメタデータを追加してあるデータセットが公開されています。
追加されてデータは次のようなものになります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;オブジェクト（画像内の位置と移っているオブジェクトのカテゴリ名）&lt;/li&gt;
&lt;li&gt;キャプション（画像に関する説明文が5つ）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ただし、キャプションデータはもちろん英語となっています。
このデータに対して、千葉工業大学の研究センターの方が日本語でキャプションデータを生成したものを公開してくれています。&lt;/p&gt;
&lt;p&gt;MS COCOの画像のうち商用利用可能なライセンスの画像を今回のデモ用に利用させていただきました。
それぞれのファイルをダウンロードし、MS COCOの画像ファイル名をキーにして英語と日本語のキャプションデータを配列で持つようなJSONデータを生成し、それをもとにWeaviateにデータ登録する形です。&lt;/p&gt;
&lt;p&gt;処理の内容は省きますが、上記のデータセットをもとに次のような1ファイル1JSONを作って、JSONLファイル（1行1JSON）として保存したものを読み込んでWeaviateに登録しています。&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-JSON&#34; data-lang=&#34;JSON&#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;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;200109&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:#f92672&#34;&gt;&amp;#34;license_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;4&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:#f92672&#34;&gt;&amp;#34;license_name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Attribution License&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:#960050;background-color:#1e0010&#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;&amp;#34;filename&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;COCO_val2014_000000200109.jpg&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:#f92672&#34;&gt;&amp;#34;date_captured&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2013-11-22 02:26:57&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:#f92672&#34;&gt;&amp;#34;caption_en&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;645817&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:#f92672&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;A slice of pizza partially obscuring a cell phone.&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#f92672&#34;&gt;&amp;#34;caption_jp&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;41320&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:#f92672&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;食事をしながらメールチェックをする&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#f92672&#34;&gt;&amp;#34;category&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:#960050;background-color:#1e0010&#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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;英語のキャプションは登録はしましたが、今回のデモには利用しませんでした（日本語で検索できるところを見せたかったので）&lt;/p&gt;
&lt;h2 id=&#34;スキーマの定義&#34;&gt;スキーマの定義&lt;/h2&gt;
&lt;p&gt;上記のデータをもとに考えたWeaviateのスキーマは次のようなものになります。
Weaviateで利用できる日本語のトークナイザーのうち、GSEとKagomeを利用してデモをできるようにそれぞれをTokenizationに指定したフィールドを&lt;code&gt;caption_ja_gse&lt;/code&gt;、&lt;code&gt;caption_ja&lt;/code&gt;として用意しました。&lt;/p&gt;
&lt;p&gt;画像からベクトルを生成して保存する定義は、&lt;code&gt;Vectorizer&lt;/code&gt;という部分の&lt;code&gt;multi2vec-clip&lt;/code&gt;になります。
実際に、画像からベクトルを生成するのは、&lt;code&gt;multi2vec-clip&lt;/code&gt;という名前のコンテナで動いているCLIPのモデルを通して処理をします（&lt;a href=&#34;https://github.com/weaviate/multi2vec-clip-inference/tree/main&#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-Go&#34; data-lang=&#34;Go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;multiModal&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;models&lt;/span&gt;.&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 style=&#34;color:#a6e22e&#34;&gt;Class&lt;/span&gt;:       &lt;span style=&#34;color:#a6e22e&#34;&gt;ClassName&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;Description&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Sample class holding all the images&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;ModuleConfig&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;]&lt;span style=&#34;color:#66d9ef&#34;&gt;interface&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:#e6db74&#34;&gt;&amp;#34;multi2vec-clip&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;]&lt;span style=&#34;color:#66d9ef&#34;&gt;interface&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:#e6db74&#34;&gt;&amp;#34;imageFields&amp;#34;&lt;/span&gt;: []&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;image&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;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:#a6e22e&#34;&gt;VectorIndexType&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;flat&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;Vectorizer&lt;/span&gt;:      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;multi2vec-clip&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;Properties&lt;/span&gt;: []&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;models&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Property&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:#a6e22e&#34;&gt;DataType&lt;/span&gt;:    []&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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;Description&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;The name of the file&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;Name&lt;/span&gt;:        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;filename&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;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:#a6e22e&#34;&gt;DataType&lt;/span&gt;:    []&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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;Description&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;The Flickr URL&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;Name&lt;/span&gt;:        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;flickr_url&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;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:#a6e22e&#34;&gt;DataType&lt;/span&gt;:    []&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;blob&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;Description&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Base64 encoded image&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;Name&lt;/span&gt;:        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;image&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;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:#a6e22e&#34;&gt;DataType&lt;/span&gt;:     []&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;schema&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;DataTypeTextArray&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&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;Description&lt;/span&gt;:  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Caption in English&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;Name&lt;/span&gt;:         &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;caption_en&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;Tokenization&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;models&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;PropertyTokenizationLowercase&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:#a6e22e&#34;&gt;DataType&lt;/span&gt;:     []&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;schema&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;DataTypeTextArray&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&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;Description&lt;/span&gt;:  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Caption in Japanese&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;Name&lt;/span&gt;:         &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;caption_ja_gse&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;Tokenization&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;models&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;PropertyTokenizationGse&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:#a6e22e&#34;&gt;DataType&lt;/span&gt;:     []&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;schema&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;DataTypeTextArray&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&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;Description&lt;/span&gt;:  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Caption in Japanese&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;Name&lt;/span&gt;:         &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;caption_ja&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;Tokenization&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kagome_ja&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#75715e&#34;&gt;// TODO 1.28リリース時には定数を利用可能&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:#a6e22e&#34;&gt;DataType&lt;/span&gt;:     []&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;schema&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;DataTypeTextArray&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&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;Description&lt;/span&gt;:  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Category in English&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;Name&lt;/span&gt;:         &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;category&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;Tokenization&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;models&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;PropertyTokenizationLowercase&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あとは、GoのWeaviateのSDKを利用してデータを登録するだけです。
&lt;a href=&#34;https://github.com/weaviate/weaviate-examples/blob/main/clip-multi-modal-text-image-search/import/go/data/objects.go#L32&#34;&gt;登録処理はサンプル&lt;/a&gt;をもとに、上記のフィールドのデータを追加した程度です。&lt;/p&gt;
&lt;p&gt;これで、Weaviateに日本語と画像のベクトルのデータが保存できました。あとは検索です。&lt;/p&gt;
&lt;h2 id=&#34;検索処理&#34;&gt;検索処理&lt;/h2&gt;
&lt;p&gt;参考にしたサンプルでは、Node.jsで処理が書いてあるのですが、私自身はあまりNode.jsを記述したことがありません。
ということで、さくっと作るためにStreamlitを利用して検索画面を作成しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://gist.github.com/johtani/a68b0d63b2bc6aec9c1ee32577206f3e&#34;&gt;コードはこちら&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Weaviateの接続部分は簡略化（別の便利関数を作った）してありますが、流れはなんとなくわかっていただけるかな？&lt;/p&gt;
&lt;p&gt;デモのできることとしては次のような検索です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GSEのフィールドでキーワード検索&lt;/li&gt;
&lt;li&gt;Kagomeのフィールドでキーワード検索&lt;/li&gt;
&lt;li&gt;ベクトル検索（テキストをCLIPでベクトル化して検索）&lt;/li&gt;
&lt;li&gt;ハイブリッド検索（ベクトル検索＋Kagomeフィールドでキーワード検索）&lt;/li&gt;
&lt;li&gt;ベクトル検索＋Kagomeのフィールドでキーワードでフィルタリング&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;駆け足ですが、Weaviateで日本語のマルチモーダル検索をやるときにどんなデモデータでどんなデモをやったかを紹介しました。
完全なものではないので恐縮ですが。。。&lt;/p&gt;
&lt;p&gt;Weaviate 1.28（2024/12現在最新版）からKagome JAという日本語のキーワード検索用のトークナイザーが利用できるようになっています。
興味がある方は、ちょっと触ってみてはどうでしょうか？&lt;/p&gt;
&lt;p&gt;もう少し時間が取れて整理整頓出来たら、Docker Composeなども含めた形でリポジトリで公開しようと思います。
Weaviateで動かしてみようとしたり、ブログで不明点などがあればXなどで連絡をいただければと。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Weaviateの日本語対応とマルチモーダル・多言語検索デモ</title>
      <link>https://blog.johtani.info/presentation/2024/weaviate/</link>
      <pubDate>Wed, 11 Dec 2024 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2024/weaviate/</guid>
      <description></description>
      <content:encoded></content:encoded>
    </item>
    
    <item>
      <title>AI活用しきれていない話</title>
      <link>https://blog.johtani.info/blog/2024/12/05/with-ai/</link>
      <pubDate>Thu, 05 Dec 2024 15:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2024/12/05/with-ai/</guid>
      <description>&lt;p&gt;この記事は&lt;a href=&#34;https://adventar.org/calendars/10523&#34;&gt;pyspa アドベントカレンダー 2024&lt;/a&gt;の6日目です。&lt;/p&gt;
&lt;p&gt;公私ともにAIを活用しきれてないけど、こんな感じで使いましたというお話です。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;elasticsearchのハンズオン&#34;&gt;Elasticsearchのハンズオン&lt;/h2&gt;
&lt;p&gt;お客さん向けにElasticsearchのハンズオンを1時間 x 15回という形で提供しました。
新しい人も入ってきたので慣れてもらうために、また、知ってる人もハンズオンすることで普段は触らない・知らない機能を触って刺激になってアイデアが浮かぶかもしれないしという感じのモチベーションです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;この記事は&lt;a href=&#34;https://adventar.org/calendars/10523&#34;&gt;pyspa アドベントカレンダー 2024&lt;/a&gt;の6日目です。&lt;/p&gt;
&lt;p&gt;公私ともにAIを活用しきれてないけど、こんな感じで使いましたというお話です。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;elasticsearchのハンズオン&#34;&gt;Elasticsearchのハンズオン&lt;/h2&gt;
&lt;p&gt;お客さん向けにElasticsearchのハンズオンを1時間 x 15回という形で提供しました。
新しい人も入ってきたので慣れてもらうために、また、知ってる人もハンズオンすることで普段は触らない・知らない機能を触って刺激になってアイデアが浮かぶかもしれないしという感じのモチベーションです。&lt;/p&gt;
&lt;p&gt;ただ、資料作成にそれほど時間をかけるのももったいないですよねとお客さんとの会話にも出たので、そういう時にこそAIでしょ！となり、使ってみました。&lt;/p&gt;
&lt;p&gt;こんな感じで。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;Google AI StudioのGeminiに壁打ちの相手してもらってるところだけど、賢いなぁ（驚き屋みたいになってるな） &lt;a href=&#34;https://t.co/swyvbTdYxt&#34;&gt;pic.twitter.com/swyvbTdYxt&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1785521250955346202?ref_src=twsrc%5Etfw&#34;&gt;May 1, 2024&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;このツイートではGoogleのAI Studioを使っていますが、ChatGPTでも同じように作ってもらって、最終的にはChatGPTで最後の回までを作ってもらいました。
プロンプトを工夫したりはできていないので、まだまだ使い切れてる感じはしないですが。。。&lt;/p&gt;
&lt;p&gt;流れとしては、次のような感じで作ってもらいました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;15回で初心者向けのハンズオンの流れを考えてもらう
&lt;ul&gt;
&lt;li&gt;「Elasticsearchのハンズオンを15回程度で考えているところです。全文検索のユースケースを想定しています。カリキュラムを考えてみてください」&lt;/li&gt;
&lt;li&gt;戻ってきた答えにはロギングなどのユースケースも混ざっちゃってたので何度かやり取りして直してもらいました&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;大体出来上がったらそれぞれの回のハンズオンについて詳しく書き下してもらいます
&lt;ul&gt;
&lt;li&gt;最初の流れでは、1行程度の説明しかなかったので、ここでそれぞれのハンズオンでの流れが出来上がります&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;あとは、個別にさらにいくつか会話をしていって、仕上げていきました
&lt;ul&gt;
&lt;li&gt;「図を用いて説明して」「手順を書いて」「Dockerを使う形のインストールだと？」&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;題材がElasticsearchということもあり、世の中に資料がたくさんあって学習されているようで、REST APIやクエリもなんとなく作ってくれます。
おかげでハンズオン資料もそれなりの形にできたのではかどりました（出てきたクエリなどは個別に確認しますが、ざっくりした項目は上げてあるのであとは説明すればいい）。&lt;/p&gt;
&lt;p&gt;ただ、Elasticsearchはバージョンアップも頻繁なので、「資料があふれている＝古いバージョンの書き方もある」という状況がよく起こります。
私はある程度知っている内容なので、「ここがおかしい」「これは古い」という形で自分ですぐに修正が入れられるので良いのですが、知らない分野だとそれぞれの調査で時間がかかるだろうなぁという感じです。&lt;/p&gt;
&lt;p&gt;慣れてる内容を再度まとめたり、文章を書いてもらってちょっと修正などは作業がすごく楽になって助かりました。&lt;/p&gt;
&lt;h2 id=&#34;goでslackのボット作成第2弾&#34;&gt;GoでSlackのボット作成（第2弾）&lt;/h2&gt;
&lt;p&gt;もう一つの使い方としてプログラムも書いてもらいました。
こっちはうまく指示が出せずに失敗という感じになってしまいましたが。。。&lt;/p&gt;
&lt;p&gt;3月に&lt;a href=&#34;https://blog.johtani.info/blog/2024/03/22/daily-routine/&#34;&gt;「続ける思考」を読んだ&lt;/a&gt;記事を書きました。
で、本をちょっとずつ読んだり、ガンプラをちょっとずつ作ったりしています。
それらの記録をつけるのに、Slackのボットを作ってみるか→じゃあ、AIに手伝ってもらいながらコーディング？という流れで、壁打ちしながらコードも書いてもらってみたのですが。。。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;ペアプロってこんな感じなのだろうか？ &lt;a href=&#34;https://t.co/KWxYERNgX3&#34;&gt;pic.twitter.com/KWxYERNgX3&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1785487886374285768?ref_src=twsrc%5Etfw&#34;&gt;May 1, 2024&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;G.W.に壁打ちしながらコードは書いてもらったんですが、実際にGoLandにもってきて動かそうとすると、まぁ、うごかないのです。。。
（そもそもmainの関数なのにpackage mainになってないとか。。。）
結局、お蔵入りして8月に骨格をもとにしながら最低限（Google Driveじゃなくてローカルファイルに保存）の実装にして動くようになって活用していますが。&lt;/p&gt;
&lt;p&gt;反省点はこんな感じ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;複数ファイルにまたがるような形で設計してもらおうとしたのがよくなかった&lt;/li&gt;
&lt;li&gt;そもそも指示の出し方がよくない？（プロンプト書くのが下手？）&lt;/li&gt;
&lt;li&gt;GitHub CopilotのようなIDEで使えるもののほうがよさそう（もってきて動かすのがめんどくさい）&lt;/li&gt;
&lt;li&gt;テストとか書いてもらうのがいいのかなぁ？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;もちろん、メリットもありました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プロジェクト、プログラムの命名
&lt;ul&gt;
&lt;li&gt;「こんなプログラムを作りたいんだけど名前をいくつか考えて？」「もっと中二っぽい名前がいいな」という感じ会話をして10個くらい名前を考えてもらってそこから採用した&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;変数名、関数名などの命名&lt;/li&gt;
&lt;li&gt;READMEの記述&lt;/li&gt;
&lt;li&gt;REST APIのレスポンスJSONとかをもとに構造体作ってもらったり&lt;/li&gt;
&lt;li&gt;書いてもらったプログラムの個々のパーツは書き方の参考になった&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;あとは、JetBrainsのAIアシスタントに課金はしていないのですが、GoLandの補完が賢くなっており、定型的なエラー処理やログメッセージなどを予測して補完してくれるのがすごく楽ですね。テストケース書く時もいい感じに補完してくれるのかしら？（書きなさいよテストケース）&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;まだまだうまく使えてない自信があります（なんだそれ）。
プロンプトを工夫したりなどはしていないので、なんとなく会話してもらってAIに壁打ちしてもらう形程度にしか使えてないと思っています。
あとは、プログラミングでの活用も課金してたりはしていないので、試してみないとなぁ。&lt;/p&gt;
&lt;p&gt;世の中的には、プロンプトエンジニアリング、RAG、エージェントRAG、グラフRAG、画像生成などいろいろ流行っていますが、なんとなく概念を知っているかな？くらいになっています。
来年はRAGだとかエージェントRAGだとかをもっと触って使ってみたり作ってみたりしないとですね。
（本も買って積んでるし。。。）&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>検索技術勉強会2024 Summerで司会しました</title>
      <link>https://blog.johtani.info/blog/2024/10/31/searchtechjp-2024-summer/</link>
      <pubDate>Thu, 31 Oct 2024 13:12:49 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2024/10/31/searchtechjp-2024-summer/</guid>
      <description>&lt;p&gt;どーも、johtaniです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://search-tech.connpass.com/event/331560/&#34;&gt;Search Engineering Tech Talk 2024 Summer&lt;/a&gt;を10/10にビズリーチさんの新オフィスで開催し、また司会をしてきました。
今年2度目になります。
資料と録画をべ協会のページの資料のところにアップロードしてありますので、当日参加できなかった方、気になっている方は見ていただければと思います。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;どーも、johtaniです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://search-tech.connpass.com/event/331560/&#34;&gt;Search Engineering Tech Talk 2024 Summer&lt;/a&gt;を10/10にビズリーチさんの新オフィスで開催し、また司会をしてきました。
今年2度目になります。
資料と録画をべ協会のページの資料のところにアップロードしてありますので、当日参加できなかった方、気になっている方は見ていただければと思います。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;発表内容については資料などを見ていただくこととし、今回も運営周りでのメモを残しておこうかなと。
司会はあいかわらず緩い感じだったので、もう少しちゃんとやらないと。。。&lt;/p&gt;
&lt;h2 id=&#34;継続したいこと&#34;&gt;継続したいこと&lt;/h2&gt;
&lt;h3 id=&#34;スピーカーとslackでやりとり&#34;&gt;スピーカーとSlackでやりとり&lt;/h3&gt;
&lt;p&gt;前回同様に、スピーカーの方たちに初手の連絡は、&lt;a href=&#34;http://bit.ly/SpeakerSearchTechTalk&#34;&gt;スピーカー登録フォーム&lt;/a&gt;に記載していただいた連絡先に連絡を入れましたが、
その後は、search-tech-jpのSlackでやり取りをさせていただき、スムーズにやり取りができました。
スタッフとも共有しやすいので便利でした。
発表当日の連絡や、その後の動画の確認などもこちらが使えるのは楽ですね。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;検索技術に関する情報交換を目的とした Slack を立ち上げました！こちらの招待リンクからご参加ください。 &lt;a href=&#34;https://t.co/Tca70vuMff&#34;&gt;https://t.co/Tca70vuMff&lt;/a&gt;&lt;/p&gt;&amp;mdash; takuya-a (@takuya_b) &lt;a href=&#34;https://x.com/takuya_b/status/1377219737457860610?ref_src=twsrc%5Etfw&#34;&gt;March 31, 2021&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;h3 id=&#34;会場へのアクセスのスライドを用意&#34;&gt;会場へのアクセスのスライドを用意&lt;/h3&gt;
&lt;p&gt;会場提供をしていただいている方には少し負担になっているかもしれないですが、渋谷の新しいビルということもありスライドを用意してもらいました。
オフィス入り口は商用のテナントとは別の入り口だったりするので迷子になることも多いと思います。
私自身はスライドのおかげですんなり会場に到着できました。ほかの皆さんはどうだったんだろう？&lt;/p&gt;
&lt;h3 id=&#34;名札を印刷&#34;&gt;名札を印刷&lt;/h3&gt;
&lt;p&gt;今回も次のツールを使って名札を印刷しつつ、ネームホルダーを用意してみました。懇親会で首からぶら下げていただいたのでよかったかな？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/MasayaAoyama/connpass-nametag-generator&#34;&gt;MasayaAoyama/connpass-nametag-generator： Connpass のイベント参加者の名札を生成するツール群&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;飲食提供をやめてみました&#34;&gt;飲食提供をやめてみました&lt;/h3&gt;
&lt;p&gt;会場での飲食自体はOKだったので、おなかがすいた人は食べながら聞いてもらうのもありにしてみました。
といっても、食事してる人はいなかったかも？懇親会にも結構な人が残っていただき大変盛り上がりました。
今後もこれでいいのかもな。&lt;/p&gt;
&lt;h2 id=&#34;改善点&#34;&gt;改善点&lt;/h2&gt;
&lt;h3 id=&#34;録音環境の改善&#34;&gt;録音環境の改善&lt;/h3&gt;
&lt;p&gt;録音したものを見ていただくとわかりますが、音がこもっています。
スピーカーの方にGoogle Meetで入って画面共有してもらいつつ録画し、私のノートPCのマイクだけをONにして録音してみました。
録画自体は会場のWi-fiをスピーカー限定で利用したので途切れたりすることもなくきれいに録画できていました。&lt;/p&gt;
&lt;p&gt;ただ、音に関してはノートPCのマイクだから＋圧縮されたりノイズキャンセル機能が動いていたりで少しこもった感じがしています。
会場のマイク経由での音はそれなりに拾えていますが、マイクなしでの声や拍手は入っていなかったりです。&lt;/p&gt;
&lt;p&gt;携帯できるマイクもあったので、次回は持って行って再チャレンジかな？
みんなどうしているんだろう？この辺のノウハウが足りないし、3か月に1度の開催なので身についてない気がする。&lt;/p&gt;
&lt;h3 id=&#34;summerfall&#34;&gt;Summer?Fall？&lt;/h3&gt;
&lt;p&gt;Summerという名前を付けてしまいましたが、当日は寒かったかもなぁ。。。&lt;/p&gt;
&lt;h2 id=&#34;そのほか&#34;&gt;そのほか&lt;/h2&gt;
&lt;h3 id=&#34;connpassのqrコード読み取りを活用&#34;&gt;connpassのQRコード読み取りを活用&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://help.connpass.com/organizers/event-admin#qr&#34;&gt;参加者の管理と受付 — connpassご利用ガイド ドキュメント&lt;/a&gt;にあるQRコードを利用した受付をしました。
私自身は受付をしてないので、スムーズだったかどうかは定かではないのですが、受付人数の確認がものすごく楽です。
名札を印刷しているのもあるので、参加者数は把握できるのですが、実際にどなたが来ていたのか？などがすぐにわかるのは大変便利ですね。
Connpassの開発者の方ありがとうございます！&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;話をしていただいたスピーカーの皆さん、参加していただいた参加者の皆さん、会場を提供していただいたビズリーチさん、準備で奔走してもらったスタッフの皆さん、ありがとうございました。
おかげさまで今回も楽しめました（&lt;a href=&#34;https://blog.johtani.info/blog/2019/02/26/start-search-engineering-tech-talk/&#34;&gt;自分が楽しむために開催してます&lt;/a&gt;）。
そのあと風邪をひいてしまったのでブログや録画の公開が遅くなってしまい申し訳なかったです。&lt;/p&gt;
&lt;p&gt;さて、次回も3か月後くらいに開催できるようにスピーカー探し頑張らないとな。
スピーカーおまちしております！（&lt;a href=&#34;http://bit.ly/SpeakerSearchTechTalk&#34;&gt;スピーカー登録フォーム&lt;/a&gt;）&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>OpenSearchのderivedフィールドタイプについて</title>
      <link>https://blog.johtani.info/blog/2024/07/24/derived-field-type-in-opensearch/</link>
      <pubDate>Wed, 24 Jul 2024 04:55:34 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2024/07/24/derived-field-type-in-opensearch/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://opensearch.org/docs/latest/field-types/supported-field-types/derived/&#34;&gt;Derivedフィールドタイプ&lt;/a&gt;とは、OpenSearch 2.15から導入された新しいフィールドタイプです。&lt;/p&gt;
&lt;p&gt;以下の記事は、2.15.0のドキュメントおよびOpenSearchを利用して確認した内容になります。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://opensearch.org/docs/latest/field-types/supported-field-types/derived/&#34;&gt;Derivedフィールドタイプ&lt;/a&gt;とは、OpenSearch 2.15から導入された新しいフィールドタイプです。&lt;/p&gt;
&lt;p&gt;以下の記事は、2.15.0のドキュメントおよびOpenSearchを利用して確認した内容になります。&lt;/p&gt;
&lt;h2 id=&#34;どういうもの&#34;&gt;どういうもの？&lt;/h2&gt;
&lt;p&gt;既存のフィールド（_sourceのフィールドもしくはdoc valuesから）新しいフィールドを「動的」に作成できます。
derivedフィールドタイプを利用できるできないの設定が用意されており、不要であればオフにすることも可能です。
デフォルトでは利用可能な状態になっています。&lt;/p&gt;
&lt;p&gt;スクリプトを定義して、元のフィールドから特定の箇所の文字列などを抜き出し、特定の型（&lt;code&gt;date&lt;/code&gt;とか&lt;code&gt;long&lt;/code&gt;とか）として扱えるようにします。
例えば、date型の場合はformatを指定することで、日付文字列としてパースしたりといった具合です。&lt;/p&gt;
&lt;h2 id=&#34;なにができるの&#34;&gt;なにができるの？&lt;/h2&gt;
&lt;p&gt;通常、OpenSearchの検索条件に利用するフィールドは指定されたフィールド型でインデックスに登録され、検索用のデータ構造が生成されている必要があります。
これは、データ登録を行う時点でどんなデータがあり、どういった検索をしたいか？というのを決めておく必要があるということです（Schema on Write）。
例えば、ログなどを保存しておいて解析したい場合に、あらかじめ、ログ文字列から必要な情報（日付、サーバ名、IPアドレス、ユーザID、サービス名など）を抜き出してインデックスイン登録してあげる必要があるということです。
あとから、ログ文字列の中から特定の項目を取り出して検索したい場合は、これまでの場合はスキーマにフィールドを追加してから、データの再登録（再インデックス）を行う必要がありました。&lt;/p&gt;
&lt;p&gt;このderived fieldを利用することで、データ登録時ではなく、データ利用時にデータをパースしながら検索できるようになります（Schema on Read）。
あらかじめデータを切り出して保存する必要がないため、保存しているデータ量の削減ができます。その代わり、検索時に毎回パース処理が実行されるため検索時のコストが増えます。&lt;/p&gt;
&lt;p&gt;derived fieldを定義する方法は2つ用意されています。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;インデックスのマッピングに定義する&lt;/li&gt;
&lt;li&gt;検索リクエストで定義する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;derivedフィールドの利用方法も現時点では2種類あります。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;検索条件のフィールドとして利用&lt;/li&gt;
&lt;li&gt;検索結果のデータに含めるフィールドとして利用&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;データ登録時点ではスキーマが決まっている必要がない
&lt;ul&gt;
&lt;li&gt;通常、検索や集計に利用する場合は、登録時にスキーマ（フィールドの型）が決まっている必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;prefilter_fieldを指定することで、元のフィールドを用いた絞り込みを実行できる
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://opensearch.org/docs/latest/field-types/supported-field-types/derived/#prefilter-field&#34;&gt;Prefilter field / Derived - OpenSearch Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;前提条件&#34;&gt;前提条件&lt;/h3&gt;
&lt;p&gt;前提条件として、derivedの対象とする元のフィールドは以下を満たす必要があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;_sourceもしくはdoc valuesが存在する（元データを取り出す必要があるため）
&lt;ul&gt;
&lt;li&gt;スクリプトを利用してデータを抜き出すから&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;search.allow_expensive_queries: trueが設定されている（クラスターの設定）
&lt;ul&gt;
&lt;li&gt;処理が重くなるので、コストのかかるクエリがオフの設定の場合は動作しない仕組みとなっている（&lt;a href=&#34;https://github.com/opensearch-project/OpenSearch/blob/e749424db053ad31db1c4f1ab9374251ca9b737d/server/src/main/java/org/opensearch/index/mapper/DerivedFieldResolverFactory.java#L19&#34;&gt;ソースコード&lt;/a&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;derivedが利用可能になっている
&lt;ul&gt;
&lt;li&gt;cluster/indexレベルでそれぞれオンオフの設定がある(どちらも動的設定)
&lt;ul&gt;
&lt;li&gt;indexレベル：index.query.derived_field.enabled&lt;/li&gt;
&lt;li&gt;clusterレベル：search.derived_field.enabled&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;パフォーマンスに関する考慮が必要
&lt;ul&gt;
&lt;li&gt;参考：&lt;a href=&#34;https://opensearch.org/docs/latest/field-types/supported-field-types/derived/#performance&#34;&gt;Performance節&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;何ができないの&#34;&gt;何ができないの？&lt;/h2&gt;
&lt;p&gt;制限事項がいくつかあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Aggregationやスコアリング、ソートにはまだ未対応（対応する予定がありそう（&lt;a href=&#34;https://github.com/opensearch-project/OpenSearch/issues/12281&#34;&gt;[META] Derived Fields #12281&lt;/a&gt;））&lt;/li&gt;
&lt;li&gt;OpenSearch Dashboardの表示には未対応。フィルタリングは仕組みを知っていれば利用できる&lt;/li&gt;
&lt;li&gt;derived fieldに対して、2つ以上のパースの設定はできない&lt;/li&gt;
&lt;li&gt;join field typeは未対応&lt;/li&gt;
&lt;li&gt;concurrent segment searchには未対応&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;データはどういう持ち方なの&#34;&gt;データはどういう持ち方なの？&lt;/h2&gt;
&lt;p&gt;derived field自体はデータを持っているのではなく、次のような情報を定義する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;type&lt;/code&gt; : &lt;code&gt;script&lt;/code&gt;でパースした後のデータの型を指定&lt;/li&gt;
&lt;li&gt;&lt;code&gt;script&lt;/code&gt; : フィールドのデータを作り出すためのスクリプト。基本的には元になる別のフィールドを使って、パースする処理となる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;あとは、&lt;code&gt;type&lt;/code&gt;に合わせていくつかのオプションがあるが詳細は&lt;a href=&#34;https://opensearch.org/docs/latest/field-types/supported-field-types/derived/#parameters&#34;&gt;parameters&lt;/a&gt;を参照。&lt;/p&gt;
&lt;p&gt;動作としては、検索時に検索対象となるデータに対して、&lt;code&gt;script&lt;/code&gt;を実行して&lt;code&gt;type&lt;/code&gt;に変換し、&lt;code&gt;type&lt;/code&gt;ごとに対応するクエリの処理が実行され、derived fieldのクエリにヒットするかどうかの判定が行われる。
あくまでも検索時に実行される処理となるため、データ登録時には特にエラーなどは起きない。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ignore_malformed&lt;/code&gt;というオプションが用意されており、クエリ実行時にエラーがある場合はそのデータを無視するオプションが用意されています（詳細は後述）。&lt;/p&gt;
&lt;h2 id=&#34;実際に検証してみる&#34;&gt;実際に検証してみる&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://opensearch.org/docs/latest/field-types/supported-field-types/derived/#example-setup&#34;&gt;公式ドキュメントに簡単なサンプルが用意されており&lt;/a&gt;、それを試してみることで簡単な動作の確認ができます。
ただし、次のような場合にどんな挙動になるのか？というのが気になったので確認してみました。
以下のサンプルとして提示するクエリはOpenSearch Dashboardで実行できる形式を模しています（私自身はVS CodeのRest Client拡張を普段利用しているのでそこから編集して転記しています）。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;一部のデータに参照している元のフィールドがない場合にどうなるのか？&lt;/li&gt;
&lt;li&gt;一部のデータがパースに失敗する場合はどうなるか？&lt;/li&gt;
&lt;li&gt;上記のようなパースに失敗するデータがある場合に、それ以外のデータだけを対象とするような条件とderived fieldを利用した場合はどうなるか？&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;1-一部のデータに参照している元のフィールドがない場合にどうなるのか&#34;&gt;1. 一部のデータに参照している元のフィールドがない場合にどうなるのか？&lt;/h3&gt;
&lt;p&gt;公式ドキュメントのサンプルにあるデータは必ず対象となるフィールド（&lt;code&gt;request&lt;/code&gt;）にデータが入っています。
対象となるフィールドがあったりなかったりする場合もあると思いますが、その時にどういう扱いになるかを確認します。
公式ドキュメントのサンプルインデックスに次のデータを追加します（公式ドキュメントのExample Setupから&lt;a href=&#34;https://opensearch.org/docs/latest/field-types/supported-field-types/derived/#searching-derived-fields-defined-in-index-mappings&#34;&gt;「Searching derived fields defined in index mappings」&lt;/a&gt;まで1度実施済みとします）。&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;PUT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;logs&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_doc&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8&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:#e6db74&#34;&gt;&amp;#34;clientip&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;61.177.2.0&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;データ登録時には特に何も言われません。derivedフィールドはデータ登録時には動作しないためです。&lt;/p&gt;
&lt;p&gt;まずは、「検索結果のデータに含めるフィールドとして利用」するサンプルです。
検索リクエストで、&lt;code&gt;fields&lt;/code&gt;パラメータにderivedフィールドを含めた全件検索を実施します。&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;GET&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;logs&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_search&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:#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;request&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;clientip&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;timestamp&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;error&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;root_cause&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;script_exception&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:#e6db74&#34;&gt;&amp;#34;reason&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;runtime error&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:#e6db74&#34;&gt;&amp;#34;script_stack&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;org.opensearch.index.fielddata.ScriptDocValues$Strings.get(ScriptDocValues.java:555)&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:#e6db74&#34;&gt;&amp;#34;org.opensearch.index.fielddata.ScriptDocValues$Strings.getValue(ScriptDocValues.java:571)&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:#e6db74&#34;&gt;&amp;#34;emit(Long.parseLong(doc[\&amp;#34;request.keyword\&amp;#34;].value.splitOnToken(\&amp;#34; \&amp;#34;)[0]))&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:#e6db74&#34;&gt;&amp;#34;                                          ^---- HERE&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;script&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;emit(Long.parseLong(doc[\&amp;#34;request.keyword\&amp;#34;].value.splitOnToken(\&amp;#34; \&amp;#34;)[0]))&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:#e6db74&#34;&gt;&amp;#34;lang&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;painless&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:#e6db74&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;offset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;42&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:#e6db74&#34;&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;end&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;71&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#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;search_phase_execution_exception&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;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:#e6db74&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;400&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;同様に、クエリにderivedフィールドを利用する方法も試します。&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;GET&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;logs&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_search&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:#e6db74&#34;&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;range&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;timestamp&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;gte&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;1970-01-11T08:20:30.400Z&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:#e6db74&#34;&gt;&amp;#34;lte&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;1970-01-12T08:26:00.400Z&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;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:#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;request&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;clientip&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;code&gt;script&lt;/code&gt;が動作した時に対象データが&lt;code&gt;request.keyword&lt;/code&gt;というフィールドを持っていないためにエラーとなります。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://opensearch.org/docs/latest/field-types/supported-field-types/derived/#parameters&#34;&gt;公式ドキュメントのパラメータ&lt;/a&gt;に、先ほども説明した&lt;code&gt;ignore_malformed&lt;/code&gt;というオプションがあります。
マッピングの修正用のリクエストです。デフォルトでは、&lt;code&gt;ignore_malformed&lt;/code&gt;は&lt;code&gt;false&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-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;PUT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;logs&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_mapping&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;Content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;application&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;json&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:#e6db74&#34;&gt;&amp;#34;derived&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;timestamp&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;format&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;MM/dd/yyyy HH:mm:ss&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:#e6db74&#34;&gt;&amp;#34;script&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;source&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;emit(Long.parseLong(doc[\&amp;#34;request.keyword\&amp;#34;].value.splitOnToken(\&amp;#34; \&amp;#34;)[0]))&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ignore_malformed&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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:#e6db74&#34;&gt;&amp;#34;method&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;script&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;source&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;emit(doc[\&amp;#34;request.keyword\&amp;#34;].value.splitOnToken(\&amp;#34; \&amp;#34;)[1])&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ignore_malformed&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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:#e6db74&#34;&gt;&amp;#34;size&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;long&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:#e6db74&#34;&gt;&amp;#34;script&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;source&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;emit(Long.parseLong(doc[\&amp;#34;request.keyword\&amp;#34;].value.splitOnToken(\&amp;#34; \&amp;#34;)[5]))&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ignore_malformed&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記を実行後、先ほどの2種類（&lt;code&gt;fields&lt;/code&gt;に指定する利用方法、クエリに利用する方法）を試してみると、クエリを利用する方法（&lt;code&gt;range&lt;/code&gt;クエリ）については、フィールドが存在しないデータ以外のデータが検索に返ってくることがわかります。
ただ、残念ながら、&lt;code&gt;fields&lt;/code&gt;に利用したクエリについては、同じエラーが出てしまいました。
ドキュメントの&lt;code&gt;ignore_malformed&lt;/code&gt;の説明には以下のような記述があります。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A Boolean value that specifies whether to ignore malformed values when running a query on a derived field.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;残念ながらクエリの処理についてのみ対象としているのかもしれないですが、バグなような気も。。。（あとでIssue作っておくかな）&lt;/p&gt;
&lt;p&gt;回避する方法についてはエラーにヒントが含まれています。
上のエラー例では省略しましたが、次のようなメッセージがエラーに含まれていました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  &amp;#34;type&amp;#34;: &amp;#34;illegal_state_exception&amp;#34;,
  &amp;#34;reason&amp;#34;: &amp;#34;A document doesn&amp;#39;t have a value for a field! Use doc[&amp;lt;field&amp;gt;].size()==0 to check if a document is missing a field!&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;公式のサンプルでは、簡略化もかねてなのか&lt;code&gt;script&lt;/code&gt;の処理でいきなり&lt;code&gt;emit()&lt;/code&gt;を呼び出していますが、安全のためにフィールドの存在確認をするほうがよいでしょう。
ということで、上記のチェック処理を入れたサンプルは次の通りです。
&lt;code&gt;emit()&lt;/code&gt;の処理の外側に&lt;code&gt;if&lt;/code&gt;文でフィールドのデータのサイズが0ではない（フィールドが存在する場合）という条件を記述することで、フィールドが存在しない場合は処理がなくなる仕組みとなります。&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:#960050;background-color:#1e0010&#34;&gt;###&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;インデックスマッピングでderivedを定義&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;ignore_malformed&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;trueかつフィールド存在チェック処理追加&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;PUT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;logs&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_mapping&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:#e6db74&#34;&gt;&amp;#34;derived&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;timestamp&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;format&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;MM/dd/yyyy HH:mm:ss&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:#e6db74&#34;&gt;&amp;#34;script&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;source&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;if(doc[\&amp;#34;request.keyword\&amp;#34;].size() != 0) {emit(Long.parseLong(doc[\&amp;#34;request.keyword\&amp;#34;].value.splitOnToken(\&amp;#34; \&amp;#34;)[0]))}&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ignore_malformed&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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:#e6db74&#34;&gt;&amp;#34;method&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;script&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;source&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;if(doc[\&amp;#34;request.keyword\&amp;#34;].size() != 0) {emit(doc[\&amp;#34;request.keyword\&amp;#34;].value.splitOnToken(\&amp;#34; \&amp;#34;)[1])}&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ignore_malformed&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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:#e6db74&#34;&gt;&amp;#34;size&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;long&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:#e6db74&#34;&gt;&amp;#34;script&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;source&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;if(doc[\&amp;#34;request.keyword\&amp;#34;].size() != 0) {emit(Long.parseLong(doc[\&amp;#34;request.keyword\&amp;#34;].value.splitOnToken(\&amp;#34; \&amp;#34;)[5]))}&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ignore_malformed&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記の修正後はエラーになっていた&lt;code&gt;fields&lt;/code&gt;を指定するリクエストに関してもエラーにならなずに検索結果が返ってくるようになります。
&lt;code&gt;request.keyword&lt;/code&gt;のないデータは検索結果には&lt;code&gt;timestamp&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-javascript&#34; data-lang=&#34;javascript&#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:#e6db74&#34;&gt;&amp;#34;_index&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;logs&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:#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;8&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;clientip&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;61.177.2.0&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;span style=&#34;display:flex;&#34;&gt;&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;clientip&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;61.177.2.0&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;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;2-一部のデータがパースに失敗する場合はどうなるか&#34;&gt;2. 一部のデータがパースに失敗する場合はどうなるか？&lt;/h3&gt;
&lt;p&gt;フィールド自体が存在しない場合は検証しました。
次は想定していないデータが対象となるフィールドに存在する場合について考えます。&lt;/p&gt;
&lt;p&gt;フィールド自体が存在しない場合は検証しました。
次は想定していないデータが対象となるフィールドに存在する場合について考えます。
1.で登録したデータや変更などを一度削除して、公式ドキュメントのサンプルインデックスに次のデータを追加します（公式ドキュメントのExample Setupから&lt;a href=&#34;https://opensearch.org/docs/latest/field-types/supported-field-types/derived/#searching-derived-fields-defined-in-index-mappings&#34;&gt;「Searching derived fields defined in index mappings」&lt;/a&gt;まで1度実施済みとします）。&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;PUT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;logs&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_doc&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;7&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:#e6db74&#34;&gt;&amp;#34;request&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;hoge GET /english/images/france98_venues.gif HTTP/1.0 200 778&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:#e6db74&#34;&gt;&amp;#34;clientip&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;61.177.2.0&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;1.の時と同様に、データ登録時には特にエラーなどは出ませんが、検索時に登録したデータが処理されるとエラーがでます。&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;GET&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;logs&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_search&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:#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;request&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;clientip&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;timestamp&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;1.とは異なり、フィールド自体は存在しますがパース処理で失敗するため、次のようなエラーになります。&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;error&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;root_cause&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;search_phase_execution_exception&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:#e6db74&#34;&gt;&amp;#34;reason&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;all shards failed&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:#e6db74&#34;&gt;&amp;#34;phase&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;query&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:#e6db74&#34;&gt;&amp;#34;grouped&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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:#e6db74&#34;&gt;&amp;#34;failed_shards&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;shard&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;index&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;logs&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:#e6db74&#34;&gt;&amp;#34;node&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;gKwPMrF9SHSfoNzKdMSWoA&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:#e6db74&#34;&gt;&amp;#34;reason&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;script_exception&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:#e6db74&#34;&gt;&amp;#34;reason&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;runtime error&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:#e6db74&#34;&gt;&amp;#34;script_stack&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)&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:#e6db74&#34;&gt;&amp;#34;java.base/java.lang.Long.parseLong(Long.java:709)&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:#e6db74&#34;&gt;&amp;#34;java.base/java.lang.Long.parseLong(Long.java:832)&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:#e6db74&#34;&gt;&amp;#34;emit(Long.parseLong(doc[\&amp;#34;request.keyword\&amp;#34;].value.splitOnToken(\&amp;#34; \&amp;#34;)[0]))&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:#e6db74&#34;&gt;&amp;#34;                                                                  ^---- HERE&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;script&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;emit(Long.parseLong(doc[\&amp;#34;request.keyword\&amp;#34;].value.splitOnToken(\&amp;#34; \&amp;#34;)[0]))&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:#e6db74&#34;&gt;&amp;#34;lang&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;painless&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:#e6db74&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;offset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;66&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:#e6db74&#34;&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;end&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;71&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:#e6db74&#34;&gt;&amp;#34;caused_by&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;number_format_exception&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:#e6db74&#34;&gt;&amp;#34;reason&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;For input string: \&amp;#34;hoge\&amp;#34;&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;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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;400&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;caused_by&lt;/code&gt;の部分で「hoge」という文字列を&lt;code&gt;Long.parseLong()&lt;/code&gt;で処理しようとしてエラーが出ていることがわかります。&lt;/p&gt;
&lt;p&gt;こちらも1.と同様に、&lt;code&gt;&amp;quot;ignore_malformed&amp;quot;: true&lt;/code&gt;を付与すると、検索クエリで該当データが出てきた場合はエラーが無視されてそれ以外のデータが検索結果に帰ってくるようになりますが、
&lt;code&gt;fields&lt;/code&gt;に指定した場合はエラーになります。&lt;/p&gt;
&lt;p&gt;次のようにtry-catchで例外発生時には値を返さない処理を追加するとエラーなく検索できるようになります。
もちろんエラーの出るデータについては検索結果には出てきません。&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;PUT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;logs&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_mapping&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:#e6db74&#34;&gt;&amp;#34;derived&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;timestamp&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;format&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;MM/dd/yyyy HH:mm:ss&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:#e6db74&#34;&gt;&amp;#34;script&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;source&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;if(doc[\&amp;#34;request.keyword\&amp;#34;].size() != 0) {try{emit(Long.parseLong(doc[\&amp;#34;request.keyword\&amp;#34;].value.splitOnToken(\&amp;#34; \&amp;#34;)[0]))} catch(NumberFormatException e) {return}}&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ignore_malformed&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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:#e6db74&#34;&gt;&amp;#34;method&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;script&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;source&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;if(doc[\&amp;#34;request.keyword\&amp;#34;].size() != 0) {emit(doc[\&amp;#34;request.keyword\&amp;#34;].value.splitOnToken(\&amp;#34; \&amp;#34;)[1])}&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ignore_malformed&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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:#e6db74&#34;&gt;&amp;#34;size&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;long&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:#e6db74&#34;&gt;&amp;#34;script&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;source&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;if(doc[\&amp;#34;request.keyword\&amp;#34;].size() != 0) {try{emit(Long.parseLong(doc[\&amp;#34;request.keyword\&amp;#34;].value.splitOnToken(\&amp;#34; \&amp;#34;)[5]))} catch(NumberFormatException e) {return}}&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ignore_malformed&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;3-上記のようなパースに失敗するデータがある場合にそれ以外のデータだけを対象とするような条件とderived-fieldを利用した場合はどうなるか&#34;&gt;3. 上記のようなパースに失敗するデータがある場合に、それ以外のデータだけを対象とするような条件とderived fieldを利用した場合はどうなるか？&lt;/h4&gt;
&lt;p&gt;derivedフィールドは検索時に処理が実行されます。
ということは、1.や2.でエラーとなるデータを追加していても、そのデータが含まれない検索条件で検索した場合はエラーが出ないと想定されます。
こちらも確認してみましょう。&lt;/p&gt;
&lt;p&gt;まずは、公式ドキュメントのサンプルデータの状態に戻します。公式ドキュメントのサンプルインデックスに次のデータを追加します（公式ドキュメントのExample Setupから&lt;a href=&#34;https://opensearch.org/docs/latest/field-types/supported-field-types/derived/#searching-derived-fields-defined-in-index-mappings&#34;&gt;「Searching derived fields defined in index mappings」&lt;/a&gt;まで1度実施済みとします）。
次に、1.と2.のデータを追加します。&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;PUT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;logs&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_doc&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;7&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:#e6db74&#34;&gt;&amp;#34;request&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;hoge GET /english/images/france98_venues.gif HTTP/1.0 200 778&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:#e6db74&#34;&gt;&amp;#34;clientip&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;61.177.2.0&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;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:#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;logs&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_doc&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8&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:#e6db74&#34;&gt;&amp;#34;clientip&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;61.177.2.0&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;GET&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;logs&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_search&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:#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;request&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;clientip&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;timestamp&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;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-javscript&#34; data-lang=&#34;javscript&#34;&gt;GET /logs/_search
{
  &amp;#34;query&amp;#34;: {
    &amp;#34;bool&amp;#34;: {
      &amp;#34;must_not&amp;#34;: [
        {
          &amp;#34;ids&amp;#34;: {
            &amp;#34;values&amp;#34;: [7,8]
          }
        }
      ]
    }
  },
  &amp;#34;fields&amp;#34;: [&amp;#34;request&amp;#34;, &amp;#34;clientip&amp;#34;, &amp;#34;timestamp&amp;#34;]
}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;新しく追加されたderivedフィールドについて簡単に調べてみました。
きれいなデータであればスクリプトもシンプルですみますが、検索時にエラーが出ないようにする場合は、きちんと各所でチェックを入れるスクリプトの書き方が重要になってくるかと思います。
とくに&lt;code&gt;ignore_malformed&lt;/code&gt;の挙動が検索クエリの時のみに限定されているので、安全なスクリプトにするほうが良いと思います。&lt;/p&gt;
&lt;p&gt;また、インデックスのmappingsにderivedフィールドを定義する場合は、定義のタイミングではコンパイルなどはされないため構文エラーなどの発生もすべて検索するタイミングとなります。
さらに、後から来たデータでエラーになることも考えられますので、利用するのは注意しながらがよいかなと思います。&lt;/p&gt;
&lt;p&gt;ただ、これまでよりも柔軟にデータ登録してあとから検索を考えるなどができるので便利になりそうですね。&lt;/p&gt;
&lt;h2 id=&#34;残課題&#34;&gt;残課題&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;JSONオブジェクトをderivedフィールドに指定する例もドキュメントにあるのでそれの使用感&lt;/li&gt;
&lt;li&gt;大量データを入れて、速度的にどのくらい影響が出るのか？
&lt;ul&gt;
&lt;li&gt;prefilter_fieldを使うといい感じになりそうか？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;検索時にエラーにならないスクリプトの書き方の説明をしたが、エラーになるようなデータがあるかどうかを調べるにはどうするか？&lt;/li&gt;
&lt;li&gt;derivedフィールドが使えないバージョンで作成したインデックスに対してderivedフィールドを作ろうとするとどうなるのか？
&lt;ul&gt;
&lt;li&gt;おそらくエラーになると思われる。ローカルでインデックス作ってデータを入れて、バージョンアップをして検証してみる？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>検索技術勉強会2024 Springで司会しました</title>
      <link>https://blog.johtani.info/blog/2024/06/01/searchtechjp-2024-spring/</link>
      <pubDate>Sat, 01 Jun 2024 13:31:37 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2024/06/01/searchtechjp-2024-spring/</guid>
      <description>&lt;p&gt;どーも、johtaniです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://search-tech.connpass.com/event/318126/&#34;&gt;Search Engineering Tech Talk 2024 Spring&lt;/a&gt;を5/31にLegalOn Technologiesさんの新オフィス（渋谷サクラステージ）で開催し、司会をしてきました。昨年末の12月に4年ぶりの復活開催から2回目（計6回目）となります。フリーランスになってからこういう場で司会をしたのは初めてかも？&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;どーも、johtaniです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://search-tech.connpass.com/event/318126/&#34;&gt;Search Engineering Tech Talk 2024 Spring&lt;/a&gt;を5/31にLegalOn Technologiesさんの新オフィス（渋谷サクラステージ）で開催し、司会をしてきました。昨年末の12月に4年ぶりの復活開催から2回目（計6回目）となります。フリーランスになってからこういう場で司会をしたのは初めてかも？&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;前回は諸事情で裏方スタッフとして手伝っていましたが、今回はオープニングと司会をやってきました。
ひさびさにオフラインで人前でしゃべったので、ちょっとグダグダ感が出てしまったかもですが、面白い話をいろいろ聞けて楽しかったです。&lt;/p&gt;
&lt;p&gt;今回（前回も含め）はいくつか新しい試みも行ったので自分用のメモとして記録しておこうかなと（セッションの感想などは参加者の皆さんにおまかせします！）。&lt;/p&gt;
&lt;h2 id=&#34;新しい試み&#34;&gt;新しい試み&lt;/h2&gt;
&lt;h3 id=&#34;スピーカーとの連絡方法&#34;&gt;スピーカーとの連絡方法&lt;/h3&gt;
&lt;p&gt;スピーカー登録については、知り合いに声をかけてみたり、勉強会のページに用意してある&lt;a href=&#34;http://bit.ly/SpeakerSearchTechTalk&#34;&gt;Googleフォーム&lt;/a&gt;で登録をしてもらっています。
こちらのGoogleフォームに登録されると、メールやTwitterでコンタクトをとり、今回の開催で日程が合うかどうかを調整しています。&lt;/p&gt;
&lt;p&gt;実際に登壇していただく形になったあとに、前回からはsearch-tech-jp（以下のツイートから参加可能なはず）のSlackでプライベートチャンネルを作って連絡をするようにしています。
個別に連絡するよりもスタッフの誰かが反応できるようになっているので便利になったかなと。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;検索技術に関する情報交換を目的とした Slack を立ち上げました！こちらの招待リンクからご参加ください。 &lt;a href=&#34;https://t.co/Tca70vuMff&#34;&gt;https://t.co/Tca70vuMff&lt;/a&gt;&lt;/p&gt;&amp;mdash; takuya-a (@takuya_b) &lt;a href=&#34;https://x.com/takuya_b/status/1377219737457860610?ref_src=twsrc%5Etfw&#34;&gt;March 31, 2021&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;h3 id=&#34;会場へのアクセススライドを用意してもらった&#34;&gt;会場へのアクセススライドを用意してもらった&lt;/h3&gt;
&lt;p&gt;新しいビルでかつ新しいオフィス（すごくかっこいいオフィスエントランスだった！）ということもあり、入り口がわかりにくいかも？という話が事前のスタッフ打ち合わせで出ました。
他社のブログに写真付きでオフィス受付ロビーへの案内を作られているものがあったのですが、さすがに流用するのもわるいですよね？ということになり、スタッフでLegalOn Technologiesの方にスライドを作成していただきました（&lt;a href=&#34;https://docs.google.com/presentation/d/1lpkYvu8Is_GT1j79BG_SQSm6i1S3KEjN0WFvQ9uXqRk/edit?usp=sharing&#34;&gt;案内スライド&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;そのうち会社としてアクセスのわかりやすいページなどもできると思いますが、わかりにくい入り口などの場合はこういうのを用意すると便利かもなと。&lt;/p&gt;
&lt;p&gt;当日は何人かLegalOn Technologiesのかたに誘導役として経路に立っていただいたので、そちらもわかり安かったのではないかなと思っていますがどうでしょう？（感想聴くの忘れてた。。。）&lt;/p&gt;
&lt;h3 id=&#34;名札を印刷して持って行った&#34;&gt;名札を印刷して持って行った&lt;/h3&gt;
&lt;p&gt;懇親会で交流してもらいやすくするために次のリポジトリで公開されている名札生成ツールを利用させていただきました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/MasayaAoyama/connpass-nametag-generator&#34;&gt;MasayaAoyama/connpass-nametag-generator： Connpass のイベント参加者の名札を生成するツール群&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;できたものはこんな感じ（名札に入れた写真を撮り忘れた。。。）。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;さてと。便利なツールありがとうございます！&lt;a href=&#34;https://t.co/Q0r84v0ZDp&#34;&gt;https://t.co/Q0r84v0ZDp&lt;/a&gt; &lt;a href=&#34;https://t.co/IcSQRZtVf6&#34;&gt;pic.twitter.com/IcSQRZtVf6&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1796393829286949206?ref_src=twsrc%5Etfw&#34;&gt;May 31, 2024&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;当日に印刷して裁断して持参しました。
アイコンが登録してあると見やすくていいですね。&lt;/p&gt;
&lt;p&gt;スタッフ、スピーカーについては参加者一覧には出てこなかったため、別途追加して印刷するところだけは次回以降も忘れないようにしないとかな。
（うまくやれば、Connpassの参加者一覧としてダウンロードできるCSVにスタッフやスピーカーも追加できたりするのかな？）&lt;/p&gt;
&lt;h3 id=&#34;ltもあり&#34;&gt;LTもあり&lt;/h3&gt;
&lt;p&gt;前回まではスピーカーに登録していただくのは25分のセッションのみとしていました。
ただ、これだと初めての方やちょっとしたこと（ちょっと困ってること、こんなこと試してみたよ）を話したい方にはハードルが高いかもしれないなと。あと、LTあればスピーカーするのにという声も見かけました。&lt;/p&gt;
&lt;p&gt;当日参加のLTではありませんが、スピーカー登録フォームにLT枠も設けてみました。
実際に今回はLTを2本用意していただくことができましたし、いろいろな話題も含められそうだなと。&lt;/p&gt;
&lt;p&gt;事前の調整などもあるので今後も当日飛び込みのLTの予定はないですが、LT枠への募集は行っていく予定です。&lt;/p&gt;
&lt;h3 id=&#34;懇親会が15h&#34;&gt;懇親会が1.5h&lt;/h3&gt;
&lt;p&gt;今回は開始時間を19時からとしたため、懇親会の時間を長くとることができました（ちょっと懇親会の準備に手間取ってしまいましたが）。
そのため、いつもよりもスピーカーや参加者の皆さんの間で話が弾んだんじゃないかな？と思っています。
どうだろう？&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;オフィスに入るためにセキュリティゲート前に受付を用意し、記名と引き換えにQRコードを渡して会場まで来ていただき、会場の後ろの机に名札を広げておいて置く形にしました。&lt;/p&gt;
&lt;p&gt;印刷したあとで気づいたのですが、受付票にある番号も名札に印刷しておくと名札を受付で渡せたのかもしれないな？と思いました。
効率よく名札をつけてもらいつつ入ってもらうのにはどうするのがいいのかなぁ？
悩ましいところです。番号あったほうがいいのかな？&lt;/p&gt;
&lt;h3 id=&#34;スピーカーとのファーストコンタクト&#34;&gt;スピーカーとのファーストコンタクト&lt;/h3&gt;
&lt;p&gt;Googleフォームで入力してもらったX（旧Twitter）あてに連絡を入れようとして、フォローされていない方にDMが打てないことがありました。
連絡がつかないとしょうがないので、メンションをしたのですがそれでも返信がもらえずに連絡取れないという状況になっていたりします。&lt;/p&gt;
&lt;p&gt;メールアドレスのみにするか、search-tech-jpのSlackに登録してもらい、そのアカウントを記入していただくようにしてSlack上でDMをやり取りをしたほうがいいのかもしれないと考えているところです。&lt;/p&gt;
&lt;p&gt;事前にSlackに登録していただく必要が出てきてしまうとスピーカー登録のハードルが上がってしまわないかが心配ですが、連絡が取れないよりはいいのかなぁ？どうしたものか。&lt;/p&gt;
&lt;p&gt;とりあえず、GoogleフォームにSlackへの導線とSlackアカウントでもOKという記載をして試してみるのがいいのかもな。&lt;/p&gt;
&lt;h3 id=&#34;開始時間&#34;&gt;開始時間&lt;/h3&gt;
&lt;p&gt;19時開始となったために、キャンセルしてしまった方とかいるかどうか？というのはちょっと気になる所です。
スタッフのみんなにもセッションを聞いてもらいたいので、受付は基本的に勉強会開始のタイミングで閉じるようにしているので。
できれば遅いほうがいいなどの意見があるようだったら聞いてみたいけど、そういう人はいたのだろうか？
次回開催時にアンケートみたいなのをとるのがいいのかなぁ？&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;話をしていただいたスピーカーの皆さん、参加していただいた参加者の皆さん、会場やフードを提供していただいたLegalOn Technologiesさん、準備で奔走してもらったスタッフの皆さん、ありがとうございました。
おかげさまで今回も楽しめました（&lt;a href=&#34;https://blog.johtani.info/blog/2019/02/26/start-search-engineering-tech-talk/&#34;&gt;自分が楽しむために開催してます&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;いくつかチャレンジしてみたこと、チャレンジしてみたいことまだまだありますが、次回の改善につなげられればいいなということでメモを残してみました。&lt;/p&gt;
&lt;p&gt;3ヶ月ごとに1度が目標なので、スピーカーや会場探しを次回に向けてがんばらないとなー。&lt;/p&gt;
&lt;p&gt;今後も定期的に開催したいので、&lt;a href=&#34;http://bit.ly/SpeakerSearchTechTalk&#34;&gt;スピーカー登録&lt;/a&gt;、&lt;a href=&#34;http://bit.ly/SponsorSearchTechTalk&#34;&gt;会場やドリンクスポンサー登録&lt;/a&gt;をお待ちしております！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>デイリールーティーン（その後）</title>
      <link>https://blog.johtani.info/blog/2024/04/05/routine/</link>
      <pubDate>Fri, 05 Apr 2024 07:36:45 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2024/04/05/routine/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2024/03/22/daily-routine/&#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;今のルーティーンはこんな感じです。歯磨き読書までは午前中（起きて仕事前）に必ずやってますが、それより後の項目については、仕事の様子なども見ながら、午前中だったり午後だったり、仕事が一区切りついてからやっているので、タイミングはまちまちです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2024/03/22/daily-routine/&#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;今のルーティーンはこんな感じです。歯磨き読書までは午前中（起きて仕事前）に必ずやってますが、それより後の項目については、仕事の様子なども見ながら、午前中だったり午後だったり、仕事が一区切りついてからやっているので、タイミングはまちまちです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ヤクルト飲んで体重計&lt;/li&gt;
&lt;li&gt;歯磨きしながら読書（今はリモートワーク大全読んでる）&lt;/li&gt;
&lt;li&gt;アニメ見ながらorゲームしながら30分ほどフットステップ&lt;/li&gt;
&lt;li&gt;フットステップ後にストレッチ（4種類）（※）&lt;/li&gt;
&lt;li&gt;マンガのスキャン（1日1冊）（※）&lt;/li&gt;
&lt;li&gt;スキャン後にプラモデル1コマ（※）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;※が最後についている、後半3つが追加でき継続できています。&lt;/p&gt;
&lt;p&gt;プラモはこちらのツイートに返信していってます。時々ツイート忘れちゃうので、「昨日」になってたりするけど。
ここまでは2週間続いてます。まぁ、忘れないようにこれからも続けていければと。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;昨日のプラモ。 &lt;a href=&#34;https://t.co/9Hfl8ASXKR&#34;&gt;pic.twitter.com/9Hfl8ASXKR&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1771407843503325604?ref_src=twsrc%5Etfw&#34;&gt;March 23, 2024&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;h2 id=&#34;追加で来てないこと&#34;&gt;追加で来てないこと&lt;/h2&gt;
&lt;p&gt;追加しようと思ってできていないのがこちら。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MediumのDaily Digestを読む&lt;/li&gt;
&lt;li&gt;Software Designを読む&lt;/li&gt;
&lt;li&gt;Factorio&lt;/li&gt;
&lt;li&gt;ブログ書く&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;さて、どうやって入れようかなぁ？&lt;/p&gt;
&lt;p&gt;ちょっと別の作業もかねて、LiteLLMを使って英語を翻訳してみたりしていたので、
MediumのDigestなどはこれを使って、翻訳＋要約させてストレッチのあととかに差し込むのがいいかも？&lt;/p&gt;
&lt;p&gt;Factorioの代わりに風来のシレンは続いているかも？毎日じゃないけど。
Factorioはセーブデータが大きくなってるのもあり、起動に時間がかかるのでちょっとやるみたいなのに向かなくなってるから、なんか考えないとなぁ。&lt;/p&gt;
&lt;p&gt;あとは、「Software Designを読む」などは、ルーティーンに組み込もうとして忘れてしまっているので、どうやって思い出せる仕組みにするかを考える必要がありそうです。
Google KeepとかSlackのリマインダー使うといいのかなぁ？時間は固定しないけれど、思い出す仕組みってほかになにができるだろうか？
という感じで、悩み中です。&lt;/p&gt;
&lt;h2 id=&#34;記録のつけ方&#34;&gt;記録のつけ方&lt;/h2&gt;
&lt;p&gt;歯磨き読書の記録は前回書いた&lt;a href=&#34;https://journey.cloud/&#34;&gt;Journey&lt;/a&gt;につけています。
プラモデルはツイートしてる感じです。
日々やったことは、PCで起動しているVS Codeのメモを4年くらいつけているので、それに書いている感じです。
ただ、やはり、スマホでSlackに投げ込む仕組みを書こうかなぁと考えているところです。
Journeyに課金をしていないのもあり、検索ができない不便さもあるので。。。&lt;/p&gt;
&lt;p&gt;ということで、現状でした。
毎週これについてブログ書くと、ブログを書くことも続けられて一石二鳥かもなぁ。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>「続ける思考」を読んだ</title>
      <link>https://blog.johtani.info/blog/2024/03/22/daily-routine/</link>
      <pubDate>Fri, 22 Mar 2024 09:11:10 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2024/03/22/daily-routine/</guid>
      <description>&lt;p&gt;「続ける思考」という本を読みました。
続けるのが結構苦手だし、やろうかな？と思ってることで積んであるものがいくつかあったしということで。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4799330004/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41AdiF2myQL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4799330004/?tag=johtani-22&#34;&gt;
      Amazon | 「やりたいこと」も「やるべきこと」も全部できる！ 続ける思考 | 井上 新八 
      &lt;/a&gt;
    &lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;「続ける思考」という本を読みました。
続けるのが結構苦手だし、やろうかな？と思ってることで積んであるものがいくつかあったしということで。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4799330004/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41AdiF2myQL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4799330004/?tag=johtani-22&#34;&gt;
      Amazon | 「やりたいこと」も「やるべきこと」も全部できる！ 続ける思考 | 井上 新八 
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;読了して簡単な感想をツイートしたのがこちら。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;「続ける思考」読み終わった。なにかとセットにしてやることで、継続しやすくなるとのことだったので、朝歯磨きしながらこの本を読んでた。&lt;br&gt;読みやすい本でわかりやすかった。&lt;br&gt;歯磨きしながらの読書のほかにもいくつかルーティーンに組み込んでみよう。&lt;a href=&#34;https://t.co/nNdbG9HG28&#34;&gt;https://t.co/nNdbG9HG28&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1770623327566241857?ref_src=twsrc%5Etfw&#34;&gt;March 21, 2024&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;とても読みやすく、サクッと読めました。
「毎日やること」、「なにかとセットにすること」というのがいいとのことだし、
実践しないと続かないよなということで、毎日続けていこうかなぁと思っているルーティーンを記録しておこうかなと。&lt;/p&gt;
&lt;h2 id=&#34;ルーティーン&#34;&gt;ルーティーン&lt;/h2&gt;
&lt;p&gt;とりあえず、数日前から始めたことを。仕事前にやってることになります。とりあえず1週間は続いたかな？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;起きたらヤクルトを飲んだら体重計に乗る&lt;/li&gt;
&lt;li&gt;朝食後に、歯磨きをしながらちょっと読書する
&lt;ul&gt;
&lt;li&gt;「続ける思考」を読んでる途中で思いついて始めました。今はリモートワーク大全（積んどくしてあったやつ）を読んでいます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;アニメ見ながらorゲームしながら30分ほどフットステップ
&lt;ul&gt;
&lt;li&gt;「ダンジョン飯」とかを録画しているので、ついでにということで。ゲームは「風来のシレン」&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;（お約束のアフィリンク貼っておきますね）&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B08NC5KH2L/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51hQiLGHTqL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B08NC5KH2L/?tag=johtani-22&#34;&gt;
      Amazon | リモートワーク大全 電子書籍: 壽かおり: Kindleストア
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B00S0E4JW8/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/61Kzw4xKfpL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B00S0E4JW8/?tag=johtani-22&#34;&gt;
      Amazon | ダンジョン飯 1巻 (HARTA COMIX) | 九井 諒子 | 青年マンガ | Kindleストア 
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B0CJXK6MQS/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51oYBFLpBML._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B0CJXK6MQS/?tag=johtani-22&#34;&gt;
      Amazon | 不思議のダンジョン 風来のシレン6 とぐろ島探検録 -Switch : ゲーム
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;追加しようと思ってること&#34;&gt;追加しようと思ってること&lt;/h2&gt;
&lt;p&gt;まだ、どのタイミングにしようかは悩んでいますが、ルーティーンに追加しようとしていることがいくつかあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プラモデル
&lt;ul&gt;
&lt;li&gt;ちょっとずつやるってことで、1日1マス？手順？を昼食後とかにやろうかな？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;マンガのスキャン
&lt;ul&gt;
&lt;li&gt;本棚があふれてきたので。。。1冊ずつ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ストレッチ
&lt;ul&gt;
&lt;li&gt;フットステップの後に入れるといいかな？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MediumのDaily Digestを読む
&lt;ul&gt;
&lt;li&gt;これは、仕事前に入れたいな&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Software Designを読む
&lt;ul&gt;
&lt;li&gt;定期購読してるけど、読んでない記事が大量にあるので。。。これも仕事前？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Factorio
&lt;ul&gt;
&lt;li&gt;ダラダラやっちゃうから時間を決めてすこしずつ進めていくのがよさそう。次はここまでとか、これをやるみたいなメモを残しつつ。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ブログ書く
&lt;ul&gt;
&lt;li&gt;気を抜くと間が空いちゃうので。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;とりあえず、「やりたいこと」が優先されてるような感じになってますが。ほかにも慣れてきたらちょっとずつ追加していく感じかなぁ？&lt;/p&gt;
&lt;h2 id=&#34;記録のつけ方をどうしようかな&#34;&gt;記録のつけ方をどうしようかな？&lt;/h2&gt;
&lt;p&gt;仕事などでPCの前で作業している場合は、VS Codeに簡単な作業メモのようなものをつけています。
本当に簡単なメモをGoogle Driveに月ごとのファイルで。&lt;/p&gt;
&lt;p&gt;ただ、読書したりアニメ見たりしたとき、外出してるときなどのログを残すのにスマホで何かできないかなぁと。
iPhoneだとジャーナルアプリがあるようなのですが、Androidユーザーなのでほかのツールを探しています。&lt;/p&gt;
&lt;p&gt;欲しい機能、やりたいことは今のところこんな感じ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;タイムスタンプ付きでメモをとれる&lt;/li&gt;
&lt;li&gt;サクッと起動して書ける&lt;/li&gt;
&lt;li&gt;記録する内容ごとにタグのようなものが付けられる&lt;/li&gt;
&lt;li&gt;画像が貼り付けられる（読んだ本の表紙とか、組み立てたプラモとか）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;とりあえず、&lt;a href=&#34;https://journey.cloud/&#34;&gt;Journey&lt;/a&gt;というツールをインストールして試用中という感じです。
無料の範囲で使ってるので、エクスポートとかはできなそうだけど。&lt;/p&gt;
&lt;p&gt;Slackに種類＝チャンネルって感じで投げ込んで、ボットで収集するとかもありかもなぁ？Slackの使い方としてちょっと変かもだけど。&lt;/p&gt;
&lt;p&gt;みんなはこういうログ、記録とかどうやってつけてるんだろうか？&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ？&lt;/h2&gt;
&lt;p&gt;ということで、続くといいですね（続けるぞ？ｗ）&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2024/04/05/routine/&#34;&gt;【4/5】追記：続きをかいた&lt;/a&gt;&lt;/p&gt;
</content:encoded>
    </item>
    
    <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>Slackボットで音楽検索＆再生</title>
      <link>https://blog.johtani.info/blog/2024/03/14/search-api-owntone/</link>
      <pubDate>Thu, 14 Mar 2024 09:24:04 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2024/03/14/search-api-owntone/</guid>
      <description>&lt;p&gt;年末に、&lt;a href=&#34;https://blog.johtani.info/blog/2023/12/08/smarthome-bot/&#34;&gt;GoでSlackのボットを作った&lt;/a&gt;という記事を書きましたが、少し改良したので話の続きを。&lt;/p&gt;
&lt;p&gt;やってみたいこととして、キーワードを指定して再生する仕組みを上げていました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;キーワードに関連する曲の再生
&lt;ul&gt;
&lt;li&gt;OwnTone自体に検索の仕組みがついているので、キーワードを受け付けてそれに関する曲を流す&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;コマンドの判別の仕組みの変更&#34;&gt;コマンドの判別の仕組みの変更&lt;/h2&gt;
&lt;p&gt;これまでは、単純なコマンドを実行してもらう形で実装していたため、Slackで入力された文字列をそのままコマンド名にマッチするかどうかの判定だけをしていました（レーベンシュタイン距離でタイポ対応はしてましたが）。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;年末に、&lt;a href=&#34;https://blog.johtani.info/blog/2023/12/08/smarthome-bot/&#34;&gt;GoでSlackのボットを作った&lt;/a&gt;という記事を書きましたが、少し改良したので話の続きを。&lt;/p&gt;
&lt;p&gt;やってみたいこととして、キーワードを指定して再生する仕組みを上げていました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;キーワードに関連する曲の再生
&lt;ul&gt;
&lt;li&gt;OwnTone自体に検索の仕組みがついているので、キーワードを受け付けてそれに関する曲を流す&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;コマンドの判別の仕組みの変更&#34;&gt;コマンドの判別の仕組みの変更&lt;/h2&gt;
&lt;p&gt;これまでは、単純なコマンドを実行してもらう形で実装していたため、Slackで入力された文字列をそのままコマンド名にマッチするかどうかの判定だけをしていました（レーベンシュタイン距離でタイポ対応はしてましたが）。&lt;/p&gt;
&lt;p&gt;この場合、やってみたいことに挙げていた「キーワードを受け付けて」の部分が想定から抜けています。
なので、コマンド名の判別処理を入力文字列そのままではなく、次のような処理にしました（&lt;a href=&#34;https://github.com/johtani/smarthome/pull/43/files&#34;&gt;処理切り替え時のPR&lt;/a&gt;）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;入力された文字列をスペース区切りでSplitして配列に&lt;/li&gt;
&lt;li&gt;登録済みのコマンド名もスペース区切りでSplitして配列に&lt;/li&gt;
&lt;li&gt;入力の配列に登録済みコマンドの配列が含まれていればコマンドにマッチした
&lt;ul&gt;
&lt;li&gt;入力の配列の残り（コマンド部分を抜いたもの）をスペースで連結してからコマンドの引数として渡す&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;また、このタイミングでコマンド名を1つの文字列にするために使っていたハイフンも除去することにしました（コマンドと引数の切れ目をわかりやすくしようと思ってハイフンを入れていたのですが、連結しておく必要もなくなったので）。&lt;/p&gt;
&lt;h2 id=&#34;キーワードを受け取って検索&#34;&gt;キーワードを受け取って検索&lt;/h2&gt;
&lt;p&gt;コマンドごとに引数をどのように利用するかは異なるので、コマンド側で引数の処理を行います。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://owntone.github.io/owntone-server/json-api/#search-by-search-term&#34;&gt;Owntoneには単語で簡単に検索できるAPI&lt;/a&gt;が用意されています。
とりあえずは、引数の部分の文字列をそのままこのAPIの&lt;code&gt;query&lt;/code&gt;パラメータに渡すだけの簡単な処理を実装しました。
取得件数（&lt;code&gt;limit&lt;/code&gt;）などもありますが、まずは固定で&lt;code&gt;5&lt;/code&gt;として実装しました
（&lt;a href=&#34;https://github.com/johtani/smarthome/pull/45/files&#34;&gt;その時のPRはこちら&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;APIのレスポンスには、アーティスト、アルバム、曲ごとに項目が返ってくるので、それを表示しています。
「検索するだけ(&lt;code&gt;search music&lt;/code&gt;)」のコマンドと「検索した結果を再生する&lt;code&gt;search play&lt;/code&gt;」コマンドの2種類を追加しました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Search Results...
# Artists (1)
 Southern All Stars
# Albums (4)
 Paint The Sky With Stars: The Best Of Enya / Enya
 SOUTHERN ALL STARS / サザンオールスターズ
 STARS / Superfly &amp;amp; トータス松本
 江ノ島 (SOUTHERN ALL STARS GOLDEN HITS MEDLEY) / Z団
# Tracks (20)
 All Of The Stars / Ed Sheeran
 ...
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;簡易版のクエリパーサーを追加&#34;&gt;簡易版のクエリパーサーを追加&lt;/h2&gt;
&lt;p&gt;ちょっと使ってみると、ほかにもできそうなことが出てきます。&lt;/p&gt;
&lt;p&gt;検索結果を見るとわかりますが、情報のタイプごとに結果が返ってきています。
検索のAPIの仕様に、このタイプを絞り込む条件も渡すことができるようになっています。&lt;/p&gt;
&lt;p&gt;いろんな曲が混ざるのもいいのですが、アルバム名で指定したかったり、アーティストで指定して曲をかけたくなります。
また、取得件数も指定できるのがいいかも？ということで、引数にちょっとだけパース処理を入れてみました（&lt;a href=&#34;https://github.com/johtani/smarthome/blob/69373b9b38c4a92f8693cd6be18a2f0508b27658/subcommand/action/owntone/search.go#L118&#34;&gt;Parse関数&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;パーサー用のライブラリなども調べてみましたが、そこまで凝った条件を書くわけでもないので、スペース区切りで分割した後に、
「limit:数値」や「type:artist」など特殊なキーが単語の先頭についているかどうかの判断をする処理でお茶を濁しました。。。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;search music stars type:artist&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;と入れた場合は、「stars」を含むアーティストだけが結果としてかえるようになります。&lt;/p&gt;
&lt;h2 id=&#34;そして新たな課題&#34;&gt;そして新たな課題&lt;/h2&gt;
&lt;p&gt;とりあえずなんとなく検索して再生できるようになりました。
ただ、OwntoneはSQLiteに入っているデータに対して、入力された単語で部分一致検索をしているだけのようです。
また、曲ごとに異なるアーティスト名になっている場合にアルバムのアーティストがVarious Artistsのようになっており、
いい感じに検索できないこともあります（トラックごとのアーティストにも検索してほしい）。&lt;/p&gt;
&lt;p&gt;また、私の問題なのですが、海外の歌手名のつづりを覚えていなかったりもするので、もうちょっといい感じに検索できる仕組みが欲しくなってきています。&lt;/p&gt;
&lt;p&gt;ということで、今後は類義語（英語名の歌手のカタカナ名とか）や細かなアーティスト名やコンポーザーなどでも検索できるようになにかしらの検索エンジンにデータをいれて、検索はそちらでやりつつ、音楽を流せるような仕組みを作りたくなってきました。&lt;/p&gt;
&lt;p&gt;曲のメタデータを増やしたりどうやってやるのがいいかなぁ？&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>kagome-botのユーザーサービス化</title>
      <link>https://blog.johtani.info/blog/2024/01/25/kagome-bot-as-a-user-service/</link>
      <pubDate>Thu, 25 Jan 2024 09:30:53 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2024/01/25/kagome-bot-as-a-user-service/</guid>
      <description>&lt;p&gt;日常でよく、形態素解析したくなることがありますよね？
そして、Slackも日常的に立ち上がってますよね？
ということは、Slackのボットとして常駐してもらえばできるのでは？&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;日常でよく、形態素解析したくなることがありますよね？
そして、Slackも日常的に立ち上がってますよね？
ということは、Slackのボットとして常駐してもらえばできるのでは？&lt;/p&gt;
&lt;h2 id=&#34;kagome-bot&#34;&gt;kagome-bot&lt;/h2&gt;
&lt;p&gt;知り合いが&lt;a href=&#34;https://github.com/ikawaha/kagome&#34;&gt;kagome&lt;/a&gt;という形態素解析ライブラリを開発しています。
その知り合いが、ボットにもしてくれています（複数辞書対応してみたかったので、PR作って取り込んでもらいました）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/ikawaha/kagome-bot&#34;&gt;https://github.com/ikawaha/kagome-bot&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ただ、デプロイはしてなかったので、我が家にあるUbuntuのサーバーにデプロイして動かすことにしました。
ボットについては、上記のリポジトリを見てもらえればいいかなと。&lt;/p&gt;
&lt;p&gt;とりあえず動けばいいや、ということで、適当なshell scriptに&lt;code&gt;nohup&lt;/code&gt;で起動していたのですが、Ubuntuの更新後の再起動で毎回ログインしてスクリプトの実行はめんどくさいな？ということでググって調べてみました。&lt;/p&gt;
&lt;h2 id=&#34;systemdでユーザーのサービスとして登録&#34;&gt;systemdでユーザーのサービスとして登録&lt;/h2&gt;
&lt;p&gt;参考ブログにある手順ほぼそのままでした。知見ありがたいです。&lt;/p&gt;
&lt;p&gt;サービスの登録自体は、指定のディレクトリにファイルを作るのではなく、systemdコマンドをしようしました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ systemctl --user --force --full edit kagome
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これで、参考ブログにあるように&lt;code&gt;kagome.service&lt;/code&gt;というファイルが&lt;code&gt;~/.config/systemd/user/&lt;/code&gt;ディレクトリに作られます。
ファイルの内容などはほぼ参考ブログにある通りです。こんなかんじ。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[Unit]
Description=kagome bot

[Service]
ExecStart=/home/johtani/kagome-bot/start_kagomebot_service.sh
ExecStop=/bin/kill ${MAINPID}
Restart=always

[Install]
WantedBy=default.target
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;start_kagomebot_service.sh&lt;/code&gt;の中で、kagome-botコマンドを実行しますが、こちらは絶対パスで記述しておきました。
サービス起動時のパスは&lt;code&gt;~/&lt;/code&gt;のようなのですが、念のために。&lt;/p&gt;
&lt;p&gt;あとは、次の手順でサービスを登録して開始します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ systemctl --user enable kagome
$ systemctl --user start kagome
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ログを見るのは&lt;code&gt;journalctl&lt;/code&gt;コマンドです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ journalctl --user -u kagome
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;あとは、以下のコマンドを実行しないと、マシン再起動後にログインするまでサービスが起動しないので忘れないようにしましょう。
（忘れてログインしてみて起動してるじゃん？というコントみたいなことをしてしまいました）。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo loginctl enable-linger username
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;参考ブログ本当にありがたいですね。
備忘録のついでにブログにしておきます。&lt;/p&gt;
&lt;h2 id=&#34;参考ブログ&#34;&gt;参考ブログ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://pyopyopyo.hatenablog.com/entry/2021/04/30/233755&#34;&gt;ユーザー権限で systemd のサービスを稼働させる方法 - pyopyopyo - Linuxとかプログラミングの覚え書き -&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>今年の振り返りと来年の抱負（2023）</title>
      <link>https://blog.johtani.info/blog/2023/12/31/review-2023/</link>
      <pubDate>Sun, 31 Dec 2023 07:49:21 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2023/12/31/review-2023/</guid>
      <description>&lt;p&gt;今年も振り返りブログをリビングで書いています（ドミノ倒しすごいな）。
FMVのキーボードで書いているのでタイポがつらい。。。&lt;/p&gt;
&lt;h2 id=&#34;振り返り2022年に書いた抱負から&#34;&gt;振り返り（2022年に書いた抱負から）&lt;/h2&gt;
&lt;p&gt;まずは振り返りをと。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今年も振り返りブログをリビングで書いています（ドミノ倒しすごいな）。
FMVのキーボードで書いているのでタイポがつらい。。。&lt;/p&gt;
&lt;h2 id=&#34;振り返り2022年に書いた抱負から&#34;&gt;振り返り（2022年に書いた抱負から）&lt;/h2&gt;
&lt;p&gt;まずは振り返りをと。&lt;/p&gt;
&lt;h3 id=&#34;フリーランス継続&#34;&gt;フリーランス継続&lt;/h3&gt;
&lt;p&gt;今年も個人事業主として乗り越えられました。
ZOZOさんには今年も引き続きお世話になっている感じです。
そのほかにベクトル検索のお手伝いをしたり、OpenSearchを調べたりといった仕事を手伝っています。
今年も完全にリモートで作業していましたが、イベントに出かけたりできました。
来年はもう少し出かける感じになるかな？
今年はすこしのんびり仕事をしていたので、来年はもう少し仕事探さないとかな（営業しないとなあ）&lt;/p&gt;
&lt;h3 id=&#34;プログラミング&#34;&gt;プログラミング&lt;/h3&gt;
&lt;p&gt;今年はプログラムを書いたほうかなと。
Goで個人用ですが、Slackのボットを書いてみたり（&lt;a href=&#34;https://blog.johtani.info/blog/2023/12/08/smarthome-bot/&#34;&gt;GoでSlackのボットを作った話 | @johtaniの日記 3rd | @johtani&amp;rsquo;s blog 3rd edition&lt;/a&gt;）、公開されているAmazonのプロダクトデータを使って検索アプリを書いてみたり。
プロダクト用のアプリを書いているわけではないですが、ちょっとずつコードを読んだり書いたりしています。&lt;/p&gt;
&lt;h3 id=&#34;ベクトル検索まわりをさわる&#34;&gt;ベクトル検索まわりをさわる&lt;/h3&gt;
&lt;p&gt;がっつりとまではいかないですが、Elasticsearchのベクトル検索の調査をやったりしました。
Amazonのプロダクトデータを使ってもうちょっとやろうと思いつつ、そこまでは手が回せてない感じですが。
速度という面でどうやって折り合いをつけつつ導入するのか？
どういうシーンでつかうのがいいのか？
どのモデル選ぶのか？とか気になることだらけ。
なんか、みなさんがどうしてるのか気になってしょうがないので、話をしてもいいよという方は連絡をもらえるとうれしいかもなぁ。
ベクトル検索とかLLMの周りの動きがはやすぎてついていけてるのかどうか。。。&lt;/p&gt;
&lt;h3 id=&#34;本を読む&#34;&gt;本を読む&lt;/h3&gt;
&lt;p&gt;今年は比較的読んだかも？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;単体テストの考え方/使い方&lt;/li&gt;
&lt;li&gt;ユーザーの問題解決とプロダクトの成功を導く　エンジニアのためのドキュメントライティング&lt;/li&gt;
&lt;li&gt;ザ・ダークパターン ユーザーの心や行動をあざむくデザイン&lt;/li&gt;
&lt;li&gt;これまでの仕事 これからの仕事&lt;/li&gt;
&lt;li&gt;機械学習による検索ランキング改善ガイド&lt;/li&gt;
&lt;li&gt;ソフトウェア設計のトレードオフと誤り&lt;/li&gt;
&lt;li&gt;初めてのGo言語&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;買って読んでない本ももっとあるんですが。。。&lt;/p&gt;
&lt;h2 id=&#34;振り返り今年あったできごと&#34;&gt;振り返り(今年あったできごと)&lt;/h2&gt;
&lt;p&gt;ここからは今年の出来事を。
今年もずっと自宅でしごとしてました。
あとは少し仕事が少なめだったのでゲームが多くなってしまったかも？（本読めばいいのに。。。）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ゲーム（ONI、ゼルダ、FactorioのSpace Exploration）&lt;/li&gt;
&lt;li&gt;Dev container導入&lt;/li&gt;
&lt;li&gt;検索技術勉強会の再開&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ゼルダの新作面白かったですね。年初はOxigen Not Includedをやっていたのに、ゼルダが出てからはご無沙汰中です。ゼルダが終わった後は、ゼルダロスになってPythonを書いたりしていたのですが、うっかりFactorioのSpace Explorationを始めてしまい大変なことに。。。
全然終わる気配がないｗ&lt;/p&gt;
&lt;p&gt;ローカルでの開発環境などをDev containerにちょっとずつしています。
Slackのボット、検索の遊び場、このブログ環境など。Dockerが必要にはなりますが、VSCodeとDev containerで環境を隔離できるし、VSCodeの拡張もコンテナごとに入れるのもできたりと便利です。&lt;/p&gt;
&lt;p&gt;最後は、検索技術勉強会を再開したことです。再始動という感じで4年ぶり？に再開しました（&lt;a href=&#34;https://search-tech.connpass.com/event/303330/&#34;&gt;12月に開催した時のページ&lt;/a&gt;）。残念ながら私は裏方をしてただけで、当日は参加できてないのですが、次回（たぶん4月くらい）は参加するつもりです。再開の声を上げてくれた&lt;a href=&#34;https://twitter.com/takuya_b&#34;&gt;@takuya_a&lt;/a&gt;さんありがとう。&lt;a href=&#34;http://bit.ly/SpeakerSearchTechTalk&#34;&gt;絶賛スピーカーを募集中&lt;/a&gt;です。&lt;/p&gt;
&lt;h2 id=&#34;来年の抱負&#34;&gt;来年の抱負&lt;/h2&gt;
&lt;p&gt;さて、来年の抱負です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;フリーランス継続&lt;/li&gt;
&lt;li&gt;プログラミング継続&lt;/li&gt;
&lt;li&gt;ベクトル検索の使い方をいろいろ試す&lt;/li&gt;
&lt;li&gt;本を読んだブログを書く&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今年もなんとかフリーランスを継続できましたが、そろそろ営業をしないといけないのかも？
ということで、外でしゃべったりもしていかないとなぁと。
あとは、検索ってどうやって導入すればいいのか？検索どうすれば改善できる？みたいなところのお手伝いをもっとしたいと思っています。
昨年出したこの本もあるので（&lt;a href=&#34;https://www.lambdanote.com/collections/ir-system&#34;&gt;『検索システム ― 実務者のための開発改善ガイドブック』 – 技術書出版と販売のラムダノート&lt;/a&gt;）、勉強会をやろうとしているところに顔を出したりしたいなあ。
外部の人を呼んで社内勉強会とかをできるというところがあれば参加したいので、声をかけてもらえればと。&lt;/p&gt;
&lt;p&gt;プログラミングはGo言語を触ったし、今年後半には検索の画面回りのプロダクトを触ってTypeScriptを勉強していこうかなという気になっています（なっているだけかもしれない？）。&lt;/p&gt;
&lt;p&gt;ベクトル検索の使い方は、LLMだったりRAGだったりが世の中を席巻しているのもあり、いろんな記事が出てきて全然追いつけていません。だれか、少人数で勉強会とかやると興味ある人とかいるかなぁ？
こんなブログ見つけたよ、こんな論文があったよ、こんな使い方したらよかったよとかの共有をやるとみんな楽になったりしないかなぁ？&lt;/p&gt;
&lt;p&gt;今年は時々出かけて移動するタイミングで書籍を読んでいました。
読んだだけになってるのもあるので、少しでもいいからブログか何かに残しとかないとな。&lt;/p&gt;
&lt;p&gt;さて、今年は少しゆっくりできたので、来年はもうちょっといろんなところに顔を出しつつ、新しい仕事もできるといいなぁ。
勉強会もスピーカー集めをがんばるぞと。&lt;/p&gt;
&lt;p&gt;ということで、今年もあと少しというところで無事書き終わりました。
来年もよろしくお願いいたします。よいお年をー&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Oramaという検索エンジンでブログ検索を作ってみた</title>
      <link>https://blog.johtani.info/blog/2023/12/15/introduce-orama-to-blog/</link>
      <pubDate>Fri, 15 Dec 2023 00:00:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2023/12/15/introduce-orama-to-blog/</guid>
      <description>&lt;p&gt;この記事は、&lt;a href=&#34;https://adventar.org/calendars/8678&#34;&gt;情報検索・検索技術 Advent Calendar 2023&lt;/a&gt;の15日目の記事です。&lt;/p&gt;
&lt;p&gt;昨年に続き2回目の情報検索のAdvent Calendar参戦です。&lt;/p&gt;
&lt;p&gt;今年は、&lt;a href=&#34;https://blog.johtani.info/blog/2023/06/21/attend-berlin-buzzwords-2023/&#34;&gt;夏にオンライン参加&lt;/a&gt;した&lt;a href=&#34;https://berlinbuzzwords.de&#34;&gt;Berlin Buzzwords&lt;/a&gt;の&lt;a href=&#34;https://program.berlinbuzzwords.de/berlin-buzzwords-2023/talk/73UNZD/&#34;&gt;「The Debate Returns (with more vectors) Which Search Engine?」&lt;/a&gt;というセッションでPhilippさんが話題に出した&lt;a href=&#34;https://www.oramasearch.com/&#34;&gt;Orama search&lt;/a&gt;という検索エンジンを紹介してみようと思います（Oramaが正式名称なのかな？）。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;この記事は、&lt;a href=&#34;https://adventar.org/calendars/8678&#34;&gt;情報検索・検索技術 Advent Calendar 2023&lt;/a&gt;の15日目の記事です。&lt;/p&gt;
&lt;p&gt;昨年に続き2回目の情報検索のAdvent Calendar参戦です。&lt;/p&gt;
&lt;p&gt;今年は、&lt;a href=&#34;https://blog.johtani.info/blog/2023/06/21/attend-berlin-buzzwords-2023/&#34;&gt;夏にオンライン参加&lt;/a&gt;した&lt;a href=&#34;https://berlinbuzzwords.de&#34;&gt;Berlin Buzzwords&lt;/a&gt;の&lt;a href=&#34;https://program.berlinbuzzwords.de/berlin-buzzwords-2023/talk/73UNZD/&#34;&gt;「The Debate Returns (with more vectors) Which Search Engine?」&lt;/a&gt;というセッションでPhilippさんが話題に出した&lt;a href=&#34;https://www.oramasearch.com/&#34;&gt;Orama search&lt;/a&gt;という検索エンジンを紹介してみようと思います（Oramaが正式名称なのかな？）。&lt;/p&gt;
&lt;h2 id=&#34;oramaという検索エンジン&#34;&gt;Oramaという検索エンジン&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.oramasearch.com/&#34;&gt;公式サイト&lt;/a&gt;のトップにも記載がありますが、エッジで動作する全文検索＆ベクトル検索エンジンというもののようです。
なにそれ？という感じがしますが、&lt;a href=&#34;https://docs.oramasearch.com/open-source/&#34;&gt;オープンソース版のドキュメント&lt;/a&gt;を見るともう少しわかりやすい説明になっています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Orama is a fast, batteries-included, full-text and vector search engine entirely written in TypeScript, with zero dependencies.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;OramaはTypeScriptで書かれた、依存なしで利用できる検索エンジンということです（&lt;em&gt;batteries-included&lt;/em&gt;って初めて見たかも。「必要なものがそろってる」とかいう意味みたい（参考：&lt;a href=&#34;https://en.wiktionary.org/wiki/batteries-included&#34;&gt;英語のWikipedia&lt;/a&gt;））。&lt;/p&gt;
&lt;p&gt;以下は公式サイトにあるサンプルです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;create&lt;/code&gt;でスキーマの定義をした検索エンジンのインスタンスを生成します。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;insert&lt;/code&gt;で先ほど生成した検索エンジンにデータをインデックスします（後で紹介しますが、一括でインデックスするメソッドも用意されています）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;search&lt;/code&gt;で検索し、検索した結果が返ってきます。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以上です。あとは、必要に応じてGUIを用意するだけです。&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-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;create&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;insert&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;search&lt;/span&gt; } &lt;span style=&#34;color:#66d9ef&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;@orama/orama&amp;#39;&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;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;db&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;create&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;schema&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#a6e22e&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;string&amp;#39;&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;director&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;string&amp;#39;&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;isFavorite&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;boolean&amp;#39;&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;year&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;number&amp;#39;&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;insert&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;db&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;title&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;The Prestige&amp;#39;&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;director&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Christopher Nolan&amp;#39;&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;isFavorite&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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;year&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;2006&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;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;searchResults&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;search&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;db&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;term&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;prestige&amp;#39;&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;where&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#a6e22e&#34;&gt;isFavorite&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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;year&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#a6e22e&#34;&gt;between&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [&lt;span style=&#34;color:#ae81ff&#34;&gt;2000&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;2008&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;サクッと動きそうですよね？依存関係がなくTypeScriptで書かれているということは静的なサイトなどでコンテンツを検索するのに使えるのでは？&lt;/p&gt;
&lt;p&gt;ということで、自分のブログに組み込んでみました。
今回は組み込んだ時の流れと気になった点などを紹介します。
Hugoに組み込む際になるべく簡単にしたかったので、unpkg.comで公開されているJavaScriptだけを利用する形で検索ページを作ってみました。
JavaScriptやTypeScriptは不慣れなので効率がよくなかったり、間違っている点があればコメントなどをいただけると嬉しいです。&lt;/p&gt;
&lt;h2 id=&#34;構成&#34;&gt;構成&lt;/h2&gt;
&lt;p&gt;私のブログサイトはHugoで生成（&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/22/intro-hugo-and-theme/&#34;&gt;参考：Hugo導入時の記事&lt;/a&gt;）して、GitHub Pagesとして公開しています。
現在のブログ検索にはAlgoliaを利用しているのですが、テスト目的としてOramaも使えるようにしてみました（右上のメニューでOramaをクリックすると以下で説明するOramaによる検索を試すことができます。&lt;/p&gt;
&lt;p&gt;今回実装してみたのは次のような流れです（日本語検索対応については後で説明します）。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;HugoでJSONのリストを生成（これまでと一緒）&lt;/li&gt;
&lt;li&gt;1.で生成したリストをもとにNodeのスクリプトでOramaのインデックスファイルを作成&lt;/li&gt;
&lt;li&gt;2.で作成したファイルを公開&lt;/li&gt;
&lt;li&gt;画面で3.のファイルをダウンロードして検索&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;1-hugoでjsonのリストを生成これまでと一緒&#34;&gt;1. HugoでJSONのリストを生成（これまでと一緒）&lt;/h3&gt;
&lt;p&gt;HugoでJSONのリストを生成します。Algoliaに記事を登録するのにも利用している仕組みです。
検索に利用する記事の情報を1記事を1つのオブジェクトとして出力します。1つの配列に記事ごとのオブジェクトが入っているJSONファイルになります。&lt;/p&gt;
&lt;script src=&#34;https://gist.github.com/johtani/3e40c6738424f95f38c117e18181a010.js?file=list.orma.json.gohtml&#34;&gt;&lt;/script&gt;

&lt;p&gt;少しだけ特殊なことをしています。
ブログ記事に&lt;code&gt;Tags&lt;/code&gt;というフィールドのありなしで処理を分岐しています。
Oramaが配列にNullを受け取った場合にうまく動かなかったので出力するJSON側で調整しています（あとで再確認してIssueあげておかないと）&lt;/p&gt;
&lt;h3 id=&#34;2-1で生成したリストをもとにnodeのスクリプトでoramaのインデックスファイルを作成&#34;&gt;2. 1.で生成したリストをもとにNodeのスクリプトでOramaのインデックスファイルを作成&lt;/h3&gt;
&lt;p&gt;最初に紹介した公式のサンプルの場合、毎回Oramaのインスタンスを生成した後にインデックス登録の処理を行わなければいけません。
ただ、Hugoで生成したコンテンツは特に動的に更新があるわけでもないので、検索画面を表示するたびにインデックス登録するのも無駄が多い気がします。
Orama単体で最初に実装した時には、1.で作成した記事一覧のJSONをOramaで実装した検索ページのスクリプトが呼ばれたタイミングでフェッチし、&lt;code&gt;insertMultiple&lt;/code&gt;（複数登録用のメソッド）を呼び出す実装にしていました。&lt;/p&gt;
&lt;p&gt;Oramaでは、あらかじめ作成したOramaのデータベースを永続化・リストアするための&lt;a href=&#34;https://docs.oramasearch.com/open-source/plugins/plugin-data-persistence.html&#34;&gt;Data Persistenceプラグイン&lt;/a&gt;が提供されています。
インデックスに登録する処理コストはHugoでコンテンツを生成した直後に行い、検索画面では作成済みのインデックスファイルをフェッチしてリストアする形にすることにしました。インデックスと記事のJSONデータを含んだファイルになるので、元の記事一覧のJSONよりはファイルサイズが大きくなってしまいますが、処理時間も含めて考えると許容できるサイズではないかなと。&lt;/p&gt;
&lt;p&gt;次のスクリプトは1.で生成したJSONファイルを読み込んで、Oramaでインデックスした後に&lt;a href=&#34;https://www.jsdelivr.com/package/npm/dpack&#34;&gt;&lt;code&gt;dpack&lt;/code&gt;というバイナリ形式&lt;/a&gt;でファイルに保存しています。
こののプラグインで選択できる形式は現時点では&lt;code&gt;json&lt;/code&gt;、&lt;code&gt;binary&lt;/code&gt;（デフォルト＝msgpack）、&lt;code&gt;dpack&lt;/code&gt;の3種類になります。
残念ながら今回試したところ、&lt;code&gt;binary&lt;/code&gt;ではエラーが発生したので、&lt;code&gt;dpack&lt;/code&gt;を使用しました。&lt;/p&gt;
&lt;script src=&#34;https://gist.github.com/johtani/3e40c6738424f95f38c117e18181a010.js?file=persist_orama.mts&#34;&gt;&lt;/script&gt;

&lt;h3 id=&#34;3-2で作成したファイルを公開&#34;&gt;3. 2.で作成したファイルを公開&lt;/h3&gt;
&lt;p&gt;単にGitHub Pagesに公開しているだけです。
ブラウザが2.で作成したインデックスファイルをフェッチしてから利用するためです。&lt;/p&gt;
&lt;h3 id=&#34;4-画面で3のファイルをダウンロードして検索&#34;&gt;4. 画面で3.のファイルをダウンロードして検索&lt;/h3&gt;
&lt;p&gt;あとは検索画面です（長すぎるので、styleの部分は省略しています）。&lt;/p&gt;
&lt;p&gt;まず、必要なライブラリなどを読み込みます（下のソースコードの1行目から14行目）。&lt;/p&gt;
&lt;p&gt;Oramaだけであれば問題ないのですが、OramaのプラグインがOramaをモジュールとして参照しているため、&lt;a href=&#34;https://developer.mozilla.org/ja/docs/Web/HTML/Element/script/type/importmap&#34;&gt;importmap&lt;/a&gt;として定義しています。
Oramaのプラグインがいくつか利用しているものがあったので、まとめてimportmapに定義してあります。&lt;/p&gt;
&lt;p&gt;次に、検索窓（&lt;code&gt;search-searchbar&lt;/code&gt;）や検索結果（&lt;code&gt;search-hits&lt;/code&gt;）などのHTMLタグを用意します。
ヒット件数と検索にかかった時間も取れるので、表示する場所として&lt;code&gt;stats&lt;/code&gt;も用意してあります。&lt;/p&gt;
&lt;p&gt;22行目からが実際の処理になります。&lt;/p&gt;
&lt;p&gt;28行目で、手順2.で作成したインデックスのファイルをフェッチします。
32行目でフェッチしたファイルから取り出した文字列をリストアして、Oramaのインスタンスを生成します。
34行目のtokenizerに関しては日本語対応で説明します。&lt;/p&gt;
&lt;p&gt;48行目の&lt;code&gt;query&lt;/code&gt;関数がクエリの組み立て＋検索の処理です。&lt;code&gt;search-input&lt;/code&gt;で入力されたテキストを&lt;code&gt;term&lt;/code&gt;として渡して検索をしています（56行目）。
検索した結果のリストをもとに検索結果のHTMLタグを組み上げていきます。
検索結果には後述する&lt;code&gt;@orama/highlight&lt;/code&gt;のモジュールを利用してスニペットを追加しています。&lt;/p&gt;
&lt;script src=&#34;https://gist.github.com/johtani/3e40c6738424f95f38c117e18181a010.js?file=search-orama.html&#34;&gt;&lt;/script&gt;

&lt;h2 id=&#34;日本語対応&#34;&gt;日本語対応&lt;/h2&gt;
&lt;p&gt;残念ながらOramaは公式には日本語をサポートしていません（&lt;a href=&#34;https://github.com/oramasearch/orama/blob/7456e32455a22ac7f8d29760dcd149246c4af1a8/packages/orama/src/components/tokenizer/languages.ts#L1&#34;&gt;サポートしているスキーマに設定できる&lt;code&gt;language&lt;/code&gt;の一覧&lt;/a&gt;（＝STEMMERSにあるものだけ&lt;a href=&#34;https://github.com/oramasearch/orama/blob/7456e32455a22ac7f8d29760dcd149246c4af1a8/packages/orama/src/components/tokenizer/index.ts#L86&#34;&gt;指定可能&lt;/a&gt;）。一覧と実装分けたほうがいい気がするけど？）。
ただ、&lt;a href=&#34;https://docs.oramasearch.com/open-source/internals/components.html#tokenizer&#34;&gt;tokenize関数を変更できるようにしてくれています&lt;/a&gt;。これを利用して、少しトリッキーな形で日本語対応しました。&lt;/p&gt;
&lt;p&gt;先ほどの手順2.でOramaの&lt;code&gt;create&lt;/code&gt;関数として、&lt;code&gt;components&lt;/code&gt;に次の&lt;code&gt;tokenizer&lt;/code&gt;を渡します。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;language&lt;/code&gt;は&lt;code&gt;english&lt;/code&gt;ですが、日本語をtokenizeする処理に次のように書き換えました。
&lt;code&gt;stemming&lt;/code&gt;は今回は行わない（＝用意されているstemmerを使えない）ので&lt;code&gt;false&lt;/code&gt;、&lt;code&gt;normalizationCache&lt;/code&gt;は空のMapを用意しておかないとエラーが出るので、&lt;code&gt;new Map()&lt;/code&gt;しています。
この設定を使ってcreateすることで、&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;components&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#a6e22e&#34;&gt;tokenizer&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#a6e22e&#34;&gt;language&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;english&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;stemming&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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;normalizationCache&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Map&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;tokenize&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;raw&lt;/span&gt;) =&amp;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;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;tokenize&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;raw&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;少しわかりにくいですが、&lt;code&gt;tokenizer&lt;/code&gt;の&lt;code&gt;tokenize&lt;/code&gt;関数の中で呼び出している&lt;code&gt;return tokenize(raw)&lt;/code&gt;の部分は&lt;a href=&#34;https://github.com/yuhsak/wakachigaki&#34;&gt;wakachigaki&lt;/a&gt;というライブラリのtokenize関数となっています。&lt;/p&gt;
&lt;h3 id=&#34;wakachigakiというライブラリ&#34;&gt;wakachigakiというライブラリ&lt;/h3&gt;
&lt;p&gt;Elasticsearchなどのサーバー上で動作させる検索エンジンではkuromojiなどの辞書を内包した形態素解析器を利用するのが通常です。
ただ、今回はブラウザだけで完結した簡単な検索を行う仕組みをOramaを使って提供しようと考えました（&lt;a href=&#34;https://github.com/takuyaa/kuromoji.js&#34;&gt;kuromoji.js&lt;/a&gt;というのもありますが、辞書のサイズがそこそこのサイズです）。
ですので、辞書ファイルのない軽量の形態素解析ライブラリとして、&lt;a href=&#34;https://github.com/yuhsak/wakachigaki&#34;&gt;wakachigaki&lt;/a&gt;というライブラリ（＝6.2Kbの軽量日本語分かち書きライブラリ）を利用してみました。&lt;/p&gt;
&lt;p&gt;最初は&lt;a href=&#34;https://github.com/leungwensen/tiny-segmenter&#34;&gt;TinySegmenter&lt;/a&gt;の利用をしていたのですが、wakachigakiのサイトにもあるように、TypeScriptやES Moduleでも利用できる形式となっていたのでこちらに切り替えました。&lt;/p&gt;
&lt;p&gt;辞書もっていないため、品詞でのフィルタリングや読みを利用した処理はできませんが、日本語の文章を分かち書きしてくれます。&lt;/p&gt;
&lt;h3 id=&#34;tokenize関数の設定&#34;&gt;tokenize関数の設定&lt;/h3&gt;
&lt;p&gt;Oramaの&lt;a href=&#34;https://github.com/oramasearch/orama/blob/7456e32455a22ac7f8d29760dcd149246c4af1a8/packages/orama/src/types.ts#L741&#34;&gt;Tokenizerインタフェースの&lt;code&gt;tokenize&lt;/code&gt;&lt;/a&gt;は入力の文字列を&lt;code&gt;string[]&lt;/code&gt;として返すことを期待しています。
wakachigakiの&lt;code&gt;tokenize&lt;/code&gt;も文字列を引数にとり、&lt;code&gt;string[]&lt;/code&gt;を返すので、そのまま呼び出すだけにしてあります。&lt;/p&gt;
&lt;p&gt;ただ、今回のブログ検索の実装では、検索窓に入力された文字列も特に何も処理せずに&lt;code&gt;tokenize&lt;/code&gt;に渡す形にしています。
クエリパーサーなどを考える場合は、検索窓に入力された文字列を前処理したりする必要がありますが今回はいったんこれで。。。&lt;/p&gt;
&lt;h3 id=&#34;data-persistenceはcomponentsはpersistしない&#34;&gt;data-persistenceはcomponentsはpersistしない&lt;/h3&gt;
&lt;p&gt;手順2.で導入した、data-persistenceプラグインですが、現在の実装ではOramaが生成したデータベース（転置インデックス）&lt;strong&gt;だけ&lt;/strong&gt;を永続化しています。
独自に設定した&lt;code&gt;tokenizer&lt;/code&gt;は残念ながら含まれていませんでした。
手順4.の検索画面のコードの34行目の部分（下記）で、フェッチしたインデックスデータから&lt;code&gt;restore&lt;/code&gt;した後のOramaのインスタンスの&lt;code&gt;tokenizer&lt;/code&gt;に手順2.と同じ設定の&lt;code&gt;tokenizer&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-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;db&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;tokenizer&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#a6e22e&#34;&gt;language&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;english&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;stemming&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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;normalizationCache&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Map&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;tokenize&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;raw&lt;/span&gt;) =&amp;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;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;tokenize&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;raw&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;tokenizer&lt;/code&gt;はOramaの検索エンジンのインスタンスに紐づく設定となっているので、フィールドごとに切り替えるといったことも現在では想定されていない気がします。&lt;/p&gt;
&lt;h2 id=&#34;ハイライト&#34;&gt;ハイライト&lt;/h2&gt;
&lt;p&gt;ハイライトのために、インデックスデータに単語のポジションを保存するためのプラグインも提供されています。
このポジションは検索の単語がヒットしドキュメントのどの位置に出てくるのか？をあらかじめデータとして保存しておくことで、ハイライトのたびに単語の位置を毎回計算しなくてもよくするためのものと思われます。&lt;/p&gt;
&lt;p&gt;これを利用してもよかったのですが、今回は&lt;a href=&#34;https://github.com/oramasearch/highlight&#34;&gt;&lt;code&gt;@orama/highlight&lt;/code&gt;というモジュール&lt;/a&gt;を利用することにしました。
検索にヒットしたドキュメントの元の文章と検索のキーワードを入力すると検索キーワードの周りにハイライトのHTMLタグを埋め込んでくれるライブラリを利用しました。これは普通に他でも便利かも？&lt;/p&gt;
&lt;p&gt;余力があればプラグインを利用した時のインデックスのサイズの違いや検索時の速度の違いを調べてみるのもいいかもしれないです。&lt;/p&gt;
&lt;h2 id=&#34;そのほかの機能&#34;&gt;そのほかの機能&lt;/h2&gt;
&lt;p&gt;今回は利用していませんが、Oramaにはそのほかの機能も用意されています（&lt;a href=&#34;https://docs.oramasearch.com/open-source/usage/search/introduction.html&#34;&gt;公式ドキュメントの検索の紹介のページ&lt;/a&gt;）。詳細は公式ドキュメントをご覧ください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Typo tolerance&lt;/li&gt;
&lt;li&gt;Facet/Filter&lt;/li&gt;
&lt;li&gt;Vector Search&lt;/li&gt;
&lt;li&gt;Geo Search&lt;/li&gt;
&lt;li&gt;Grouping&lt;/li&gt;
&lt;li&gt;Threshold&lt;/li&gt;
&lt;li&gt;Preflight&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;oramaでまだできないこと&#34;&gt;Oramaで（まだ？）できないこと&lt;/h2&gt;
&lt;p&gt;今回触ってみて、現在のOramaの実装ではできなそうなことがいくつかあったので書き出しておきます。
あくまでも現時点のことです。今後実装される可能性もあります。&lt;/p&gt;
&lt;p&gt;デフォルトでは、&lt;code&gt;search&lt;/code&gt;の&lt;code&gt;term&lt;/code&gt;に渡した文字列を&lt;code&gt;tokenize&lt;/code&gt;し、出力されたトークン列（単語の配列）のそれぞれのトークン（単語）にヒットしたドキュメントが&lt;strong&gt;全て&lt;/strong&gt;検索結果に含まれます。
検索結果のドキュメントは&lt;a href=&#34;https://docs.oramasearch.com/open-source/usage/search/bm25-algorithm.html&#34;&gt;&lt;code&gt;BM25&lt;/code&gt;でスコアリング&lt;/a&gt;されるので、多くのトークンが含まれるものが上位に来る可能性が高いです。&lt;/p&gt;
&lt;p&gt;ただ、特定の単語を含まない検索、ANDやOR検索など凝ったクエリは現在は書けないようです（&lt;a href=&#34;https://github.com/oramasearch/orama/issues/295&#34;&gt;Issueがある&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;filterは別途用意されているので、例えばファセットで表示したカテゴリで絞り込んだ状態にするといったことはできそうです。&lt;/p&gt;
&lt;h2 id=&#34;残課題&#34;&gt;残課題&lt;/h2&gt;
&lt;p&gt;とりあえず日本語をなんとなく検索できるようにすることはできました。
が、気になることもいっぱいありました。
時間を見つけてTypeScriptなどを勉強しながら探っていく感じでしょうか。&lt;/p&gt;
&lt;h3 id=&#34;インデックスを小さくする方法&#34;&gt;インデックスを小さくする方法&lt;/h3&gt;
&lt;p&gt;今回はブログ記事のサマリー（Hugoで生成されるSummary）でインデックスを作ったので、インデックスのサイズはまだ小さくなっています（といっても1MB超えてるけど）。ブログ記事全体を検索できるようにする場合は、インデックスファイルが大きくなります。&lt;/p&gt;
&lt;p&gt;これは、OramaがデフォルトではインデックスしたJSON自体もインデックス（ドキュメントストア）に保存しているためです。
ですので、Oramaに登録したJSONデータ＋検索用のインデックスがインデックスファイルとなります。
ただ、検索だけができればよい場合は、出来上がったインデックスがあればドキュメントのIDは取得できます。&lt;/p&gt;
&lt;p&gt;公式ドキュメントでもそのことに触れているページがあります（参考：&lt;a href=&#34;https://docs.oramasearch.com/open-source/usage/insert.html#remote-document-storing&#34;&gt;Remote document storing&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;まだちゃんと実装を見ていませんが、ブログ記事本体の文字列はドキュメントストアに保存しないようにすれば検索はできるが、容量が大きくならないといった工夫ができそうです。&lt;/p&gt;
&lt;p&gt;ただ、検索結果にハイライトを含んだスニペットを表示したい場合は、コンテンツ文字列が必要になってくるので、代わりに何かしらの仕組みを考える必要が出てきます（例えばサマリー部分の文字列だけ保存しておいて、ハイライトはそこだけを対象とするなど）。&lt;/p&gt;
&lt;h3 id=&#34;そのほか&#34;&gt;そのほか&lt;/h3&gt;
&lt;p&gt;そのほかに思いつくのはこの辺でしょうか？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;オートコンプリート：Oramaというよりも、JavaScriptやTypeScriptでうまく実装できるのか？という話のような気がしますが。。。&lt;/li&gt;
&lt;li&gt;ファセット対応：機能としては存在していますが、今回は実装が間に合いませんでした。&lt;/li&gt;
&lt;li&gt;Vector Search：検索キーワードのベクトルをどうやって作るのか？という問題が残りそう。コンテンツのベクトルだけで関連ページの表示みたいなことはできるかも？（動的にやる必要がないので、事前計算して各ページに埋め込むほうがよさそうだけど）&lt;/li&gt;
&lt;li&gt;Geo Search：緯度経度があるデータを探し出してこないと？&lt;/li&gt;
&lt;li&gt;relevanceの処理の変更：BM25以外に切り替えることができるかどうか（Oramaのソースとにらめっこしないといけなそう）&lt;/li&gt;
&lt;li&gt;tokenizeの改良：辞書を利用する形態素解析ライブラリやAPIを利用してみたり、「てにをは」といった1文字のひらがなを削ることで、無駄な検索ヒットを減らしてみたり。大文字小文字の正規化も必要。&lt;/li&gt;
&lt;li&gt;検索ログの解析：検索ログを保存する仕組みなどはないので、Google AnalyticsやほかのAPIなどを用意する？&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、Oramaという検索エンジン？ライブラリ？を利用して日本語のブログ検索を実装してみました。
まだ、機能が少ない部分もありますが、少数のデータをブラウザだけで簡単に検索できる仕組みをGitHub Pagesだけで提供することができそうです。
今回は静的なファイルだけで完結する形にしましたが、TypeScriptで利用できる簡単な検索エンジンライブラリとして使ってみるとまた別の面白さもあるかもしれないです。
まだ触っていない機能は思いついたこと（＝残課題に書いたこと）もあるので、ちょっと試行錯誤してみようかなぁ。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch簡易検索UI構築　～Searchkit編～</title>
      <link>https://blog.johtani.info/presentation/2023/elasticsearch-ui-searchkit/</link>
      <pubDate>Wed, 13 Dec 2023 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2023/elasticsearch-ui-searchkit/</guid>
      <description></description>
      <content:encoded></content:encoded>
    </item>
    
    <item>
      <title>GoでSlackのボットを作った話</title>
      <link>https://blog.johtani.info/blog/2023/12/08/smarthome-bot/</link>
      <pubDate>Fri, 08 Dec 2023 00:00:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2023/12/08/smarthome-bot/</guid>
      <description>&lt;p&gt;PySpaアドベントカレンダーの12/08のエントリーです。昨日は&lt;a href=&#34;https://gist.github.com/shibukawa/af62f192033cb6d500017505f503ca18&#34;&gt;渋川さんのアンラーニングで失敗した話&lt;/a&gt;でした。&lt;/p&gt;
&lt;p&gt;私は、今年は&lt;a href=&#34;https://blog.johtani.info/blog/2022/12/15/music-server-on-mac-mini/&#34;&gt;昨年の続き&lt;/a&gt;っぽい話を。&lt;/p&gt;
&lt;h2 id=&#34;音楽の再生とか停止とか&#34;&gt;音楽の再生とか停止とか&lt;/h2&gt;
&lt;p&gt;今年もリモートで仕事を継続しています。
昨年、OwnToneという音楽サーバーを導入しましたが、ミーティング開始時や終了後に音楽の停止や再生をするのに、ブラウザで操作するのはちょっと面倒です。
加えて、ミーティングする際には実際には&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;PySpaアドベントカレンダーの12/08のエントリーです。昨日は&lt;a href=&#34;https://gist.github.com/shibukawa/af62f192033cb6d500017505f503ca18&#34;&gt;渋川さんのアンラーニングで失敗した話&lt;/a&gt;でした。&lt;/p&gt;
&lt;p&gt;私は、今年は&lt;a href=&#34;https://blog.johtani.info/blog/2022/12/15/music-server-on-mac-mini/&#34;&gt;昨年の続き&lt;/a&gt;っぽい話を。&lt;/p&gt;
&lt;h2 id=&#34;音楽の再生とか停止とか&#34;&gt;音楽の再生とか停止とか&lt;/h2&gt;
&lt;p&gt;今年もリモートで仕事を継続しています。
昨年、OwnToneという音楽サーバーを導入しましたが、ミーティング開始時や終了後に音楽の停止や再生をするのに、ブラウザで操作するのはちょっと面倒です。
加えて、ミーティングする際には実際には&lt;/p&gt;
&lt;ul&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;音楽を再生する&lt;/li&gt;
&lt;li&gt;アンプの音は音楽再生用の音量にする&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;といった複数のことを行います。&lt;/p&gt;
&lt;p&gt;基本的にPCの前にいるし、Slackを常に開いているからSlackのBotを作ると便利になるのでは？
ということで、自分専用のSlack Botを作ってみました。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:400&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20231208/slack-bot-start-music.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20231208/slack-bot-start-music.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h3 id=&#34;githubリポジトリ&#34;&gt;GitHubリポジトリ&lt;/h3&gt;
&lt;p&gt;全く誰の役にも立たないけど、公開しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/smarthome&#34;&gt;https://github.com/johtani/smarthome&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;goで実装&#34;&gt;Goで実装&lt;/h3&gt;
&lt;p&gt;知り合いに勧められたということもあり、Goをあまり触ったことがなかったので、Goでやってみました。時々新しい言語を触ってみたくなるので。。。&lt;/p&gt;
&lt;p&gt;コマンドパターンのような作りで、コマンド（操作）を増やしていく感じで実装してはみたのですが、この書き方がいいのかはまだよくわかっていないです。&lt;/p&gt;
&lt;p&gt;Actionという単体の操作(例：&lt;a href=&#34;https://github.com/johtani/smarthome/blob/master/subcommand/action/owntone/pause.go&#34;&gt;OwnToneの一時停止&lt;/a&gt;)を、操作したい機器の操作ごとに作成しています。
インターフェースとしてはRunだけを定義しています。&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-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Action&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;interface&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;Run&lt;/span&gt;() (&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;error&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;それらの操作（Action）をひとまとめにしたものをSubcommandという形で定義して、SlackのBotにはSubcommandの名前を送って処理を実行する形にしています。&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-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Subcommand&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&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;Definition&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;actions&lt;/span&gt;     []&lt;span style=&#34;color:#a6e22e&#34;&gt;action&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Action&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;ignoreError&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&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;h3 id=&#34;宅内ネットワーク&#34;&gt;宅内ネットワーク&lt;/h3&gt;
&lt;p&gt;音楽サーバーのOwnToneもですが、YAMAHAのアンプのAPIも見つけたのでこれらの操作をボットから行っています。どちらも自宅のネットワークにあるので、今回作成したボットも同じネットワークで動作します。&lt;/p&gt;
&lt;p&gt;外部に公開されたHTTPのエンドポイントがあればよいのですが、今回は用意していません。
SlackのAPIではこれに対応したアプリを作るときのために&lt;a href=&#34;https://api.slack.com/apis/connections/socket&#34;&gt;Socket Mode&lt;/a&gt;を用意してくれています。&lt;/p&gt;
&lt;p&gt;ドキュメントがしっかりしているのもあり、チュートリアルなどを見つつ特に迷うことなく構築できました。&lt;/p&gt;
&lt;p&gt;基本的には「特定のチャンネルでボットがメンションされたら動作する」という挙動だけしか実装していないので、特に今回はこれで困ることもありませんでした（世の中の人たちはもっとすごいSlackの使い方をしていそうだけど。。。）。&lt;/p&gt;
&lt;h3 id=&#34;対象となるものたち&#34;&gt;対象となるものたち&lt;/h3&gt;
&lt;p&gt;ボットから操作しているのは今のところ3種類です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SwitchBot&lt;/li&gt;
&lt;li&gt;OwnTone&lt;/li&gt;
&lt;li&gt;YAMAHAのアンプ&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;switchbot&#34;&gt;SwitchBot&lt;/h4&gt;
&lt;p&gt;SwitchBotについては、&lt;a href=&#34;https://github.com/nasa9084/go-switchbot&#34;&gt;go-siwtchbot&lt;/a&gt;を利用しています。
電気、エアコン、空気清浄機、サーキュレーターのオンオフをSwitchBot経由でやっています。&lt;/p&gt;
&lt;p&gt;室内灯の明るさのために、SwitchBot側でシーンを設定している（一番暗い明るさで電気をつける）ので、そこが少しと特殊でしょうか？&lt;/p&gt;
&lt;p&gt;あとは、SwitchBotの温湿度計を3つ（室内2つ、室外1つ）おいてあるので、これらの温度を表示するコマンドも用意しました。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:400&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20231208/display-temperature.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20231208/display-temperature.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;それぞれの機器の電池残量（電池の絵文字の右側）を表示してます（書斎が2つあるように見えますが、温湿度計の名前なので、同じ部屋においてあります。。。温度が高いほうがデスクトップPCの近くにある）。
防水の温湿度計があるので、外の気温もわかるのは便利です。&lt;/p&gt;
&lt;h4 id=&#34;owntone&#34;&gt;OwnTone&lt;/h4&gt;
&lt;p&gt;&lt;a href=&#34;https://owntone.github.io/owntone-server/json-api/&#34;&gt;JSONのAPIが用意されています&lt;/a&gt;が、特にクライアントライブラリなどは用意されていません。
今回は、用意されているAPIのごく一部だけを利用するので、net/httpのClientでJSONを投げています。
必要になったらowntone/clientにメソッドを追加していく感じです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/smarthome/blob/master/subcommand/action/owntone/client.go#L45&#34;&gt;https://github.com/johtani/smarthome/blob/master/subcommand/action/owntone/client.go#L45&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;再生、一時停止、プレイリストの取得、音量指定あたりを実装しています。
音の出力先はAirPlay（次に出てくるYamahaのアンプ）になっています。&lt;/p&gt;
&lt;p&gt;あと、JSON APIのサンプルをChatGPTに渡して、「このJSONをレスポンスに受け取る処理をGoで書いてください」と聞いて処理を書いたりしました（細かいのはどう聞いたか覚えてないけど）。&lt;/p&gt;
&lt;h4 id=&#34;yamahaのアンプ&#34;&gt;YAMAHAのアンプ&lt;/h4&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/rsc-dev/pyamaha/blob/master/doc/YXC_API_Spec_Basic_v2.0.pdf&#34;&gt;ググって探してきましたが&lt;/a&gt;、利用しているYAMAHAのアンプにYXC（Yamaha Extented Control）と呼ばれるAPIが用意されていました。
PDFでAPIの仕様が公開されていたので、この資料とにらめっこしながら、必要そうなAPIを実行するクライアントを実装しました。
こちらは、OwnToneのAPIの処理をすでに書いた後だったので、それをもとに必要な実装を追加しただけです。&lt;/p&gt;
&lt;p&gt;ちなみに、アンプの電源をONにするAPIは実装していません。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OwnToneで音楽を再生する(AirPlayで信号が送られるみたい)&lt;/li&gt;
&lt;li&gt;シーン選択（Nintendo SwitchやPS5のシーンを用意している）のAPIを呼び出す&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;という処理をすると自動で電源がONになりました。スタンバイしている状態でもAPIはリクエストを受け付ける状態になっているようです。
また、PS5のシーンを呼び出したら、PS5自体も起動するのが便利だったりします。HDMI経由で信号が飛んでるのかな？
「ミーティング開始」や「音楽停止」コマンドではアンプの電源をオフするAPIを呼び出すようにしています。&lt;/p&gt;
&lt;h3 id=&#34;タイポ対応&#34;&gt;タイポ対応&lt;/h3&gt;
&lt;p&gt;「入力間違いしちゃうんです、人間だもの。。。」&lt;/p&gt;
&lt;p&gt;ということで、&lt;a href=&#34;https://github.com/johtani/smarthome/pull/34&#34;&gt;10月にタイポ対応の処理&lt;/a&gt;を入れてみました。
タイポ対応前の実装では、入力された文字列がコマンドの文字列と完全一致した場合にだけ、コマンドが実行される形になっていました。
結構タイポしちゃうので、完全一致で見つからない場合の処理として、入力された文字列とコマンド名のレーベンシュタイン距離が&lt;strong&gt;2&lt;/strong&gt;以下のものを探し、その中で距離が一番小さな値のコマンドを実行する形にしてみました。
コマンド数はたかが知れているのでコマンドのリストを全部チェックする形にしています。
タイポするとこんな感じ。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:400&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20231208/did-you-mean.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20231208/did-you-mean.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;レーベンシュタイン距離の計算には&lt;a href=&#34;https://pkg.go.dev/github.com/hbollon/go-edlib#section-readme&#34;&gt;Go-edlib&lt;/a&gt;を利用しています。OSS便利ですね。&lt;/p&gt;
&lt;h2 id=&#34;やってよかったこと&#34;&gt;やってよかったこと&lt;/h2&gt;
&lt;p&gt;ミーティング開始時などのいくつかの手順が簡素化できたので満足しています。
SwitchBotの操作もスマホをわざわざ操作しなくてもいいですし（仕事してるとキーボードとSlackは常に使ってるし）。
また、副次的な効果として、部屋の外から電源を切り忘れていたり、エアコンの切り忘れなどの場合に、スマホから遠隔でまとめた処理ができるのが便利です。&lt;/p&gt;
&lt;h2 id=&#34;今後やってみたいこと&#34;&gt;今後やってみたいこと&lt;/h2&gt;
&lt;p&gt;こういうのがあるともうちょっと便利かもなぁ？というのもあるので今後も気が向いたらコマンドなどを追加していく予定です。
今のところこんなことやりたいなというのがいくつかあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;キーワードに関連する曲の再生
&lt;ul&gt;
&lt;li&gt;OwnTone自体に検索の仕組みがついているので、キーワードを受け付けてそれに関する曲を流す&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/09/08/update-working-facility/#%E3%83%87%E3%82%B9%E3%82%AF&#34;&gt;Flexispotの操作&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;ミーティングの時は立ち上がっているので、机をスタンディングの状態にしたい&lt;/li&gt;
&lt;li&gt;電子工作しないとだめかも？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://amzn.to/3GxIw94&#34;&gt;Webカメラ用ライト&lt;/a&gt;の点灯
&lt;ul&gt;
&lt;li&gt;ミーティング時に明かりが必要なのですが、物理スイッチのOn/Off&lt;/li&gt;
&lt;li&gt;これも電子工作かな？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;定期的に温度をBotに表示させると面白いかも？&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、新しいプログラミング言語にも触れたし、作業環境も便利になって一石二鳥でした。
新しいプログラミング言語触るのはやっぱたのしいですね。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch簡易検索UI構築 - Search UI編-</title>
      <link>https://blog.johtani.info/presentation/2023/elasticsearch-ui-search-ui/</link>
      <pubDate>Tue, 05 Dec 2023 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2023/elasticsearch-ui-search-ui/</guid>
      <description></description>
      <content:encoded></content:encoded>
    </item>
    
    <item>
      <title>機械学習による検索ランキング改善ガイドを読みました</title>
      <link>https://blog.johtani.info/blog/2023/09/25/read-search-raking-guide/</link>
      <pubDate>Mon, 25 Sep 2023 03:32:24 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2023/09/25/read-search-raking-guide/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.oreilly.co.jp/books/9784814400300/&#34;&gt;「機械学習による検索ランキング改善ガイド」&lt;/a&gt;を読みました。&lt;/p&gt;
&lt;p&gt;著者の鈴木さんより献本いただいたのを読み終わったのでレビューと、あとおまけです。&lt;/p&gt;
&lt;h2 id=&#34;紹介とレビュー&#34;&gt;紹介とレビュー&lt;/h2&gt;
&lt;p&gt;どんな本なのか？は打田さんが書かれたブログ、「&lt;a href=&#34;https://medium.com/@mocobeta/%E3%83%96%E3%83%83%E3%82%AF%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC-%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AB%E3%82%88%E3%82%8B%E6%A4%9C%E7%B4%A2%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0%E6%94%B9%E5%96%84%E3%82%AC%E3%82%A4%E3%83%89-295fa4ec780f&#34;&gt;ブックレビュー：『機械学習による検索ランキング改善ガイド』 - Tomoko Uchida - Medium&lt;/a&gt;」に詳しく書かれているので、そちらも参考にしてもらうほうがわかりやすいと思います（丸投げ）。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://www.oreilly.co.jp/books/9784814400300/&#34;&gt;「機械学習による検索ランキング改善ガイド」&lt;/a&gt;を読みました。&lt;/p&gt;
&lt;p&gt;著者の鈴木さんより献本いただいたのを読み終わったのでレビューと、あとおまけです。&lt;/p&gt;
&lt;h2 id=&#34;紹介とレビュー&#34;&gt;紹介とレビュー&lt;/h2&gt;
&lt;p&gt;どんな本なのか？は打田さんが書かれたブログ、「&lt;a href=&#34;https://medium.com/@mocobeta/%E3%83%96%E3%83%83%E3%82%AF%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC-%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AB%E3%82%88%E3%82%8B%E6%A4%9C%E7%B4%A2%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0%E6%94%B9%E5%96%84%E3%82%AC%E3%82%A4%E3%83%89-295fa4ec780f&#34;&gt;ブックレビュー：『機械学習による検索ランキング改善ガイド』 - Tomoko Uchida - Medium&lt;/a&gt;」に詳しく書かれているので、そちらも参考にしてもらうほうがわかりやすいと思います（丸投げ）。&lt;/p&gt;
&lt;p&gt;読みながらいくつかツイートしていたので、そちらも参考のために貼っておきいます。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;オライリーの検索ランキング本、負荷テストのことも書いてある、すごい&lt;a href=&#34;https://t.co/YPnB6kxFY2&#34;&gt;https://t.co/YPnB6kxFY2&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1695981601858232661?ref_src=twsrc%5Etfw&#34;&gt;August 28, 2023&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;h3 id=&#34;私のレビュー&#34;&gt;私のレビュー&lt;/h3&gt;
&lt;p&gt;わかりやすく検索の基本を紹介しつつ、本書のメインであるランキング改善について全体の流れが書かれています。
ランキング改善のやり方といっても、手法の話だけではなく、プロジェクトとしてどの様に進めていくべきなのか？また、関係するものはどんなものがあり（システムだけではなくチームについても書かれていたり）、どういう判断をもちながら運用していくのか？、負荷テストにまで言及されています。&lt;/p&gt;
&lt;p&gt;読んでいて特に私が気に入ったのは以下のような話でした&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ランキング改善を進める前にきちんと解ける問題なのか？それ以前にやることはないのかを考えましょう
&lt;ul&gt;
&lt;li&gt;マッチング改善についても少しだけ触れられているが、メインはランキングについてだと明記されている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;実際に体験されたのであろう落とし穴の話&lt;/li&gt;
&lt;li&gt;負荷テストについて1章設けてある！
&lt;ul&gt;
&lt;li&gt;ハンズオンのパートでもレイテンシの話がされている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;付録としてベクトル検索についても触れてある&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;日本語でまとまって読める本があるのは本当に幸せですよね。&lt;/p&gt;
&lt;h2 id=&#34;おまけ&#34;&gt;おまけ&lt;/h2&gt;
&lt;p&gt;書籍ではハンズオンで、Elasticsearchと&lt;a href=&#34;https://github.com/o19s/elasticsearch-learning-to-rank&#34;&gt;ランキング学習のプラグインであるelasticsearch-learning-to-rank&lt;/a&gt;を利用しています（GitHubにサンプルが公開されています）。
書籍ではElasticsearchが7.13.4、プラグインが1.5.7-es7.13.4というバージョンになっていました。&lt;/p&gt;
&lt;p&gt;ブログを書いている時点でのElasticsearchは8.x系になっています。せっかくなので、書籍を読みながら現時点で最新のものに置き換えてみるというのをやってみました。&lt;/p&gt;
&lt;p&gt;Elasticsearchは8.10.2が最新なのですが、ランキング学習のプラグインはサードパティ製で、1.5.8-es8.8.2が最新版となっています。
ハンズオンのサンプルコードをフォークして、以下の構成にして動くようにしてみました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Elasticsearch : 8.8.2&lt;/li&gt;
&lt;li&gt;learning-to-rankプラグイン : 1.5.8-es8.8.2&lt;/li&gt;
&lt;li&gt;Kibana : 8.8.2&lt;/li&gt;
&lt;li&gt;Python : 3.10&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;elasticsearchプラグインkibanaのアップグレード&#34;&gt;Elasticsearch、プラグイン、Kibanaのアップグレード&lt;/h3&gt;
&lt;p&gt;Elastic社が提供しているDockerイメージが利用されているので、バージョン番号を書き換えました。
あとは、learning-to-rankプラグインのバージョンを書き換えるついでに、elasticsearch-pluginコマンドで直接ダウンロードさせる形に書き換えました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/johtani/building-search-app-w-ml/blob/es8/part2/app/search-engine/Dockerfile&#34;&gt;https://github.com/johtani/building-search-app-w-ml/blob/es8/part2/app/search-engine/Dockerfile&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;python310にアップグレード&#34;&gt;Python3.10にアップグレード&lt;/h3&gt;
&lt;p&gt;本当は必要なかったのですが、Pythonのイメージもついでに3.10にしました。
ただ、このおかげでインストールされるXGBoostのバージョンも1系から2系に上がってしまい、XGBoostを利用してモデル生成をする処理でエラーが出るようになってしまいました。。。&lt;/p&gt;
&lt;p&gt;2系へのアップグレードは手間がかかりそうだということで、pipコマンドでのインストールでのバージョンを&lt;code&gt;&amp;lt;2&lt;/code&gt;として、1系をインストールすることで回避しました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/johtani/building-search-app-w-ml/blob/es8/part2/app/workspace/Dockerfile&#34;&gt;https://github.com/johtani/building-search-app-w-ml/blob/es8/part2/app/workspace/Dockerfile&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;elasticsearch-pyのアップグレード&#34;&gt;elasticsearch-pyのアップグレード&lt;/h3&gt;
&lt;p&gt;Elasticsearchを8系にしたので、クライアントライブラリ側も8系に書き換えました（元は7.17以下に固定されていた）。
pipで7系に固定されていたものを外して最新のもの（8系）をインストールするようにしました。
これだけでも特に問題なく動いたのですが、「DeprecationWarning」が出ている部分が1か所だけあります（サンプルではDeprecationWarningが出力されない形になっていましたが、出力するように変更しました）。&lt;/p&gt;
&lt;p&gt;Elastic公式のドキュメントに&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/client/python-api/current/migration.html&#34;&gt;Migrate to 8.0&lt;/a&gt;というページが公開されています。Pythonクライアントのアップグレードを行う際はこちらを参考にすると指針が記載されています。&lt;/p&gt;
&lt;p&gt;今回のサンプルコードでは&lt;code&gt;search&lt;/code&gt;の時の引数として&lt;code&gt;body&lt;/code&gt;を渡していたのですが、8系のクライアントライブラリからこちらが廃止になり、&lt;code&gt;query&lt;/code&gt;や&lt;code&gt;rescore&lt;/code&gt;など個別の引数を渡す形に変更されています（&lt;a href=&#34;https://elasticsearch-py.readthedocs.io/en/v8.10.0/api.html#elasticsearch.Elasticsearch.search&#34;&gt;search APIのリファレンス&lt;/a&gt;）。
ですので、&lt;code&gt;body&lt;/code&gt;を&lt;code&gt;**body&lt;/code&gt;でアンパックして渡すようにしただけです。サンプルコードがわかりやすく書かれているので変更も少しで済みました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/johtani/building-search-app-w-ml/blob/es8/part2/app/workspace/collect_responses.py#L59&#34;&gt;https://github.com/johtani/building-search-app-w-ml/blob/es8/part2/app/workspace/collect_responses.py#L59&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一応、これでエラーが出ないで動きました。
すべて適用した、フォークして修正したブランチは&lt;a href=&#34;https://github.com/johtani/building-search-app-w-ml/tree/es8&#34;&gt;https://github.com/johtani/building-search-app-w-ml/tree/es8&lt;/a&gt;で公開しています。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;すごくわかりやすいうえに、手を動かしながらどんなデータを使ってどんなことをやるのかが体験できる良い本でした。
理論的な話だけでなく、システムとしてどういうものが必要で、どういうことをやらないといけないのか？というのがわかるのがイメージできるのは重要だと思います。&lt;/p&gt;
&lt;p&gt;最後は広告ですが、ランキング改善以外の検索システムについて学べる本を&lt;a href=&#34;https://www.lambdanote.com/collections/frontpage/products/ir-system&#34;&gt;検索システム ― 実務者のための開発改善ガイドブック – 技術書出版と販売のラムダノート&lt;/a&gt;出していますので、こちらも参考書として読んでいただけるとうれしいです。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>search-UIとSearchkitと検索画面</title>
      <link>https://blog.johtani.info/blog/2023/08/23/search-ui-and-searchkit/</link>
      <pubDate>Wed, 23 Aug 2023 05:32:44 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2023/08/23/search-ui-and-searchkit/</guid>
      <description>&lt;p&gt;趣味？（&lt;a href=&#34;https://github.com/johtani/search-research&#34;&gt;検索エンジンに関する趣味プロジェクト&lt;/a&gt;）でPythonのプログラムを書いています。
ベクトル検索などの確認なども含めて、Jupyter Notebookで簡単なAPIの呼び出しを書いていましたが、検索はやはり画面があるほうがにぎやかでいいですよね。
ということで、画面周りで調べものをしていた時のことを後日の自分のためのメモとして残しておきます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;趣味？（&lt;a href=&#34;https://github.com/johtani/search-research&#34;&gt;検索エンジンに関する趣味プロジェクト&lt;/a&gt;）でPythonのプログラムを書いています。
ベクトル検索などの確認なども含めて、Jupyter Notebookで簡単なAPIの呼び出しを書いていましたが、検索はやはり画面があるほうがにぎやかでいいですよね。
ということで、画面周りで調べものをしていた時のことを後日の自分のためのメモとして残しておきます。&lt;/p&gt;
&lt;h2 id=&#34;search-uiとsearchkit&#34;&gt;Search UIとSearchkit&lt;/h2&gt;
&lt;p&gt;ということで、それほど手がかからないで検索の画面をサクッと作る方法がないか？ということでちょっとだけ探してみました。
最初にElasticsearchを利用していることもあり、すぐに検索の画面を作れるライブラリ・フレームワーク・コンポーネントがないかな？ということで思いついたのが次の2つでした。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.elastic.co/search-ui/overview&#34;&gt;Elastic Search UI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.searchkit.co/&#34;&gt;Searchkit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;どちらも直接Elasticsearchに接続して検索をすることができるコンポーネントです。
Elasticsearchだけで完結していればそれでおしまいだったのですが、今回はバックエンド経由でElasticsearchに検索を書ける必要があります（ベクトル検索の仕組みもデモをしたいため、クエリの文字列をLLMなどでベクトルにしてからknn検索をすることになります）。&lt;/p&gt;
&lt;h3 id=&#34;search-uiの構成&#34;&gt;Search UIの構成&lt;/h3&gt;
&lt;p&gt;もともとSearch UIはElasticのApp SearchのGUI構築向けのコンポーネントとして作られました。
最近になって、直接Elasticsearchに接続できるコネクターを提供しています（ベータだけど）。
このコネクターを利用した場合は、ざっくりですが、このような流れになります。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20230822/search-ui_simple.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20230822/search-ui_simple.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;また、Search UIはCustom Connectorの仕組みも用意しており（ConnectorのAPIが宣言されているのでそのAPIで独自実装が可能）、これを利用することで、ブラウザではなく&lt;a href=&#34;https://docs.elastic.co/search-ui/api/connectors/elasticsearch#nodejs-integration&#34;&gt;バックエンド（Node）でElasticsearch Connectorを利用する&lt;/a&gt;ような構成も取れるようになっています。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20230822/search-ui_custom_connector.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20230822/search-ui_custom_connector.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h2 id=&#34;改めて要件をまとめると&#34;&gt;改めて要件をまとめると&lt;/h2&gt;
&lt;p&gt;ということで、やりたいことは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;簡単にUIが作れる&lt;/li&gt;
&lt;li&gt;バックエンドはPythonを経由して検索したい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;となります。
Searchkitも調べようかと思いましたが、いったんはSearch UIのCustom ConnectorでPythonでFastAPIでバックエンドのAPIを実装して、Search UIの想定しているリクエスト・レスポンスに変換すればいいかな？ということにしました。&lt;/p&gt;
&lt;p&gt;とりあえずSearch UI＋Custom Connectorからのリクエスト・レスポンス（フロントからバックエンドへの出入りの部分）を記録し、
Search UI＋Elasticsearch Connectorのときのリクエスト・レスポンス（バックエンドからEsへの出入りの部分）も記録して、
参考にしながらバックエンドを実装しようと試みました。
Search UIのCustom Connectorのサンプルとなっていた、Node上でElasticsearch Connectorを動かしている部分をPythonで簡単に再実装しようという試みです（まったく同じ実装にする必要はなく、必要最低限の機能（検索窓、ファセット、ページング）が動作するところを目指します）。&lt;/p&gt;
&lt;h2 id=&#34;elasticsearch-api-connectorの調査&#34;&gt;Elasticsearch API connectorの調査&lt;/h2&gt;
&lt;p&gt;方針が決まったので、Search UIがElasticsearch API Connectorに渡しているリクエストをブラウザのデバッグ機能を使って追いかけてみると。。。
&lt;a href=&#34;https://github.com/elastic/search-ui/blob/main/packages/search-ui-engines-connector/src/handlers/search/index.ts#L27&#34;&gt;内部でSearchkitを読んでいる？？&lt;/a&gt;ことがわかりました。&lt;/p&gt;
&lt;p&gt;Elasticsearch API Connectorがリクエストを変換しているのかと思っていたのですが、実は内部にもう一段変換が行われていました。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20230822/searchkit_v3.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20230822/searchkit_v3.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;方針を決めたつもりが、Searchkitが出てきてしまったので、Searchkitも調べてみることに。。。
なお、&lt;a href=&#34;https://github.com/elastic/search-ui/pull/651&#34;&gt;Search UIにElasticsearch API Connectorを導入した&lt;/a&gt;のがどうやら、Searchkitの作者で、現在はElasticのエンジニアになられているようです。&lt;/p&gt;
&lt;h3 id=&#34;searchkitとは&#34;&gt;Searchkitとは？&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/elastic/search-ui/blob/main/packages/search-ui-engines-connector/package.json#L46&#34;&gt;Search UIが利用しているSearchkitは、3.0&lt;/a&gt;ですが、Searchkit本家の&lt;a href=&#34;https://github.com/searchkit/searchkit/tags&#34;&gt;リポジトリ&lt;/a&gt;を見ると4.x.0となっています。&lt;/p&gt;
&lt;p&gt;どうして新しいものをSearch UIで使っていないのかな？と思いつつ調べてみたところ、&lt;a href=&#34;https://blog.searchkit.co/searchkit-v4-search-ui-for-elasticsearch-with-instantsearch-f1297ab5a3d&#34;&gt;Searchkit V4のブログ&lt;/a&gt;を発見しました。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Searchkit V4 integrates with Algolia’s Instantsearch library, which is a Search UI library built by Algolia. Instantsearch is an amazing library, and it’s been used by many companies and supports many frameworks like React, Vue and Angular.
ブログより引用&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;どうやら、V4ではコンセプトをガラッと変更されたようで、Algoliaがオープンソースとして開発している&lt;a href=&#34;https://github.com/algolia/instantsearch&#34;&gt;InstantSearch&lt;/a&gt;のコネクター（アダプター）としてSearchkit V4を開発しているようです。
これは最近出てきている検索エンジンの&lt;a href=&#34;https://typesense.org/&#34;&gt;Typesense&lt;/a&gt;や&lt;a href=&#34;https://www.meilisearch.com/&#34;&gt;Meilisearch&lt;/a&gt;の戦略にもなっています。&lt;/p&gt;
&lt;p&gt;なお、SearchkitのGitHubリポジトリやSearch UIのリポジトリを見ていると、Search UIの開発（およびSearchkitの3系）は現在は活発に行われていないように見えました。
Searchkit V4はちょっとずつ開発が進んでいるようです。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ？&lt;/h2&gt;
&lt;p&gt;一応Searchkit V4の現状やInstantSearchもすこしだけ見てみたのですが、今回の私のプロジェクトでは検索画面はまだそこまで重要度は高くないので、いったん調べていたSearch UI＋Pythonのバックエンドの構成で動作する最小限を実装したところで終わりにしました。
なので、Searchkit V4＋InstantSearchの構成はまた今度という感じです。&lt;/p&gt;
&lt;p&gt;なお、Search UIの方は5月からコミットがされていないようです。どうも開発しているチームが別件で忙しそうだなというのを感じました。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>VS CodeとDev Container(コンテナ名の指定)</title>
      <link>https://blog.johtani.info/blog/2023/07/27/container-name-in-devcontainer/</link>
      <pubDate>Thu, 27 Jul 2023 01:22:49 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2023/07/27/container-name-in-devcontainer/</guid>
      <description>&lt;p&gt;いくつかある環境をDev Containerで動くように変えていますが、最初に導入した時に疑問点だった「コンテナ名」について解消したのでメモを残しておきます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;いくつかある環境をDev Containerで動くように変えていますが、最初に導入した時に疑問点だった「コンテナ名」について解消したのでメモを残しておきます。&lt;/p&gt;
&lt;h2 id=&#34;コンテナ名の指定&#34;&gt;コンテナ名の指定&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2023/07/13/introduce-vs-code-and-dev-container/#container%E3%81%AE%E5%90%8D%E5%89%8D&#34;&gt;最初のDev Container導入の記事&lt;/a&gt;で、起動したコンテナの名前が自動で付与されて、ランダムに変わるという疑問点を書いていました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2023/07/21/multi-containers-with-dev-container/#%E5%89%AF%E6%AC%A1%E7%9A%84%E3%81%AA%E5%8A%B9%E6%9E%9C&#34;&gt;docker-compose.yml対応の記事では&lt;/a&gt;docker-compose.ymlを利用すると、コンテナ名はファイル内で定義されたサービス名で起動されて見やすくなると気づきました。&lt;/p&gt;
&lt;p&gt;やはり、Dev Containerでイメージを指定している場合もわかりやすいコンテナ名がいいなと思ったところで、「&lt;code&gt;runArgs&lt;/code&gt;」を思い出しました。
Dev Containerからコンテナを起動するときに渡す引数が書けるじゃないですか。そういえば、むかしdockerコマンドを使う時に名前を指定した記憶があったなと。ということで、Google検索です。「docker command args container name」で検索しましたｗ&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.docker.com/engine/reference/run/#name---name&#34;&gt;&lt;code&gt;--name&lt;/code&gt;というオプション&lt;/a&gt;で起動時のコンテナの名前の指定ができます。ということで、このブログを生成するためのdevcontainer.jsonに&amp;quot;runArgs&amp;quot;でコンテナ名を指定してコンテナ起動ができるようになりました（「&lt;a href=&#34;https://blog.johtani.info/blog/2023/07/24/introduce-dev-container-to-hugo-env/&#34;&gt;ブログ記述環境としてのDev Container&lt;/a&gt;」という記事のdevcontainer.jsonにrunArgsの行を追加しただけ）。&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-json&#34; data-lang=&#34;json&#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;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hugo - blog generator&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:#f92672&#34;&gt;&amp;#34;image&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;mcr.microsoft.com/devcontainers/javascript-node:16&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:#f92672&#34;&gt;&amp;#34;runArgs&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;--name&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;blog_generator&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:#f92672&#34;&gt;&amp;#34;postCreateCommand&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/bin/sh ./.devcontainer/postCreateCommand.sh&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:#960050;background-color:#1e0010&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded>
    </item>
    
    <item>
      <title>ブログ記述環境としてのDev Container</title>
      <link>https://blog.johtani.info/blog/2023/07/24/introduce-dev-container-to-hugo-env/</link>
      <pubDate>Mon, 24 Jul 2023 09:10:32 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2023/07/24/introduce-dev-container-to-hugo-env/</guid>
      <description>&lt;p&gt;このブログの生成には、&lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt;を利用しています。
&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/22/intro-hugo-and-theme/&#34;&gt;ブログ移行日記（その1）&lt;/a&gt;に書いてありますが、当時は&lt;code&gt;brew&lt;/code&gt;でインストールしていました。
また、Windowsに移行したタイミングで、WSL2のUbuntuに&lt;code&gt;apt&lt;/code&gt;でhugoをインストールして利用していました。
WSL2の環境が壊れなければこのままでもいいのですが、最近Dev Containerを触っていたので、このブログを書く環境（おもにHugo）もDev Containerにできるのでは？と気づきました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;このブログの生成には、&lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt;を利用しています。
&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/22/intro-hugo-and-theme/&#34;&gt;ブログ移行日記（その1）&lt;/a&gt;に書いてありますが、当時は&lt;code&gt;brew&lt;/code&gt;でインストールしていました。
また、Windowsに移行したタイミングで、WSL2のUbuntuに&lt;code&gt;apt&lt;/code&gt;でhugoをインストールして利用していました。
WSL2の環境が壊れなければこのままでもいいのですが、最近Dev Containerを触っていたので、このブログを書く環境（おもにHugo）もDev Containerにできるのでは？と気づきました。&lt;/p&gt;
&lt;p&gt;ということで、Hugo＋αの環境をDev Container化したので、そのメモです。&lt;/p&gt;
&lt;h2 id=&#34;必要なもの&#34;&gt;必要なもの&lt;/h2&gt;
&lt;p&gt;ブログを書いて、記事を構築して、公開するところまでに利用するのは次のようなものです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;git&lt;/li&gt;
&lt;li&gt;Hugo&lt;/li&gt;
&lt;li&gt;node&lt;/li&gt;
&lt;li&gt;atomic-algolia&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GitHubのプライベートリポジトリでHugoのプロジェクトを管理しています。
また、GitHub Pagesで公開しており、生成したHTMLもgitコマンドを利用してGitHubにpushしています。
このため、gitコマンドが必要です。&lt;/p&gt;
&lt;p&gt;コンテンツの生成はHugoコマンドを利用します（テーマの適用とかいろいろ）。&lt;/p&gt;
&lt;p&gt;あと、Algoliaでブログを検索できるようにしており（&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/28/introduce-algolia/&#34;&gt;ブログ移行日記（その4）参照&lt;/a&gt;）、Algoliaへドキュメントのデータをアップロードするために、atomic-algoliaを利用しています。こちらは、nodeのモジュールであるので、nodeの環境も必要です。&lt;/p&gt;
&lt;h2 id=&#34;ベースにするイメージ&#34;&gt;ベースにするイメージ&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/devcontainers/templates/&#34;&gt;Dev Container Templates&lt;/a&gt;というリポジトリが公開されています。
こちらを探すと、元となるdevcontainer.jsonが見つかることがあります。
Hugoのものがあるか探してみましたが、残念ながら見つかったのはJekyllのテンプレートでした。
今回は、nodeの環境が必要なので&lt;a href=&#34;https://github.com/devcontainers/templates/tree/main/src/javascript-node&#34;&gt;javascript-node&lt;/a&gt;を元に編集していきます。&lt;/p&gt;
&lt;p&gt;手元のUbuntuのnodeのバージョンが16だったので、バージョン16のイメージを指定します(devcontainer.jsonは後述)。&lt;/p&gt;
&lt;h2 id=&#34;hugoの追加&#34;&gt;Hugoの追加&lt;/h2&gt;
&lt;p&gt;Hugoのテンプレートはなかったのですが、&lt;a href=&#34;https://github.com/devcontainers/features/blob/main/README.md&#34;&gt;Dev Container Features&lt;/a&gt;に&lt;a href=&#34;https://github.com/devcontainers/features/tree/main/src/hugo&#34;&gt;Hugoのfeature&lt;/a&gt;が用意されていました。
&lt;code&gt;features&lt;/code&gt;に1行追加するだけでコンテナにHugoをインストールしてくれる便利ものです。&lt;/p&gt;
&lt;h2 id=&#34;markdownの環境&#34;&gt;Markdownの環境&lt;/h2&gt;
&lt;p&gt;Dev Container Templatesを探索していて&lt;a href=&#34;https://github.com/devcontainers/templates/tree/main/src/markdown&#34;&gt;見つけたMarkdownのテンプレート&lt;/a&gt;も参考にしてみました。
VS CodeのMarkdown向けの拡張機能がいくつかリストアップされていたので、ついでに追加です。
&lt;code&gt;markdown-all-in-one&lt;/code&gt;や&lt;code&gt;markdownlint&lt;/code&gt;はこれまでも利用していたので、他のものも便利だろうということで。
他の物はどんなものかを後で調べてみる予定です。&lt;/p&gt;
&lt;h2 id=&#34;作ったdevcontainerの設定はこちら&#34;&gt;作った.devcontainerの設定はこちら&lt;/h2&gt;
&lt;p&gt;ということで、出来上がった設定は以下の通りです。&lt;/p&gt;
&lt;h3 id=&#34;devcontainerjson&#34;&gt;devcontainer.json&lt;/h3&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-json&#34; data-lang=&#34;json&#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;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hugo - blog generator&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:#f92672&#34;&gt;&amp;#34;image&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;mcr.microsoft.com/devcontainers/javascript-node:16&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:#f92672&#34;&gt;&amp;#34;postCreateCommand&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/bin/sh ./.devcontainer/postCreateCommand.sh&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:#f92672&#34;&gt;&amp;#34;features&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:#f92672&#34;&gt;&amp;#34;ghcr.io/devcontainers/features/hugo:1&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;customizations&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:#f92672&#34;&gt;&amp;#34;vscode&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:#f92672&#34;&gt;&amp;#34;extensions&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:#e6db74&#34;&gt;&amp;#34;yzhang.markdown-all-in-one&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:#e6db74&#34;&gt;&amp;#34;streetsidesoftware.code-spell-checker&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:#e6db74&#34;&gt;&amp;#34;DavidAnson.vscode-markdownlint&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:#e6db74&#34;&gt;&amp;#34;shd101wyy.markdown-preview-enhanced&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:#e6db74&#34;&gt;&amp;#34;bierner.github-markdown-preview&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;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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;postCreateCommand.sh&lt;/code&gt;では、npm installで、必要なモジュールのインストールをコンテナビルド後に実行できるようにしました。
（&lt;code&gt;apt update&lt;/code&gt;はなくてもいいな）&lt;/p&gt;
&lt;h3 id=&#34;postcreatecommandsh&#34;&gt;postCreateCommand.sh&lt;/h3&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-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/sh
&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;# postCreateCommand.sh&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;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;START Install&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo chown -R vscode:vscode .
&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;npm install
&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;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;FINISH Install&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、ここ最近Dev Containerについて色々調べていたのでサクッとDev Container化ができました。
まぁ、HugoのFeatureが用意されていて、他に大したことをやっていないというのが大きいのですが。
このブログは今回構築したDev Containerで生成して公開した記事になります。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>WSL2のディストリビューションの環境移行</title>
      <link>https://blog.johtani.info/blog/2023/07/24/move-distribution-to-another-disk/</link>
      <pubDate>Mon, 24 Jul 2023 06:28:48 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2023/07/24/move-distribution-to-another-disk/</guid>
      <description>&lt;p&gt;WSL2にUbuntuを入れて、開発とかはこちらを利用しています。
また、Docker DesktopもWSL2のバックエンドエンジンを利用しています。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;WSL2にUbuntuを入れて、開発とかはこちらを利用しています。
また、Docker DesktopもWSL2のバックエンドエンジンを利用しています。&lt;/p&gt;
&lt;p&gt;知り合いとの話で、Ubuntuの外付けのSSDをマウントしたという話が出てきて、それだと遅くない？Ubuntu自体を移動できるんじゃないかな？という
流れになりました。
知り合いは、特に移動とかは考えてなかったのですが、自分のディスクの容量が今どのくらい使われているのかが気になり、調べてみると、
Cドライブの使用率が90%を超えてるじゃないですか。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://diskanalyzer.com/&#34;&gt;WizTree&lt;/a&gt;というソフトを&lt;a href=&#34;https://twitter.com/johtani/status/1565250490329608197&#34;&gt;前回入れていたのを思い出して&lt;/a&gt;、再度調べてみたところUbuntuらしき&lt;code&gt;vhdx&lt;/code&gt;ファイルのサイズが171GB、Docker Desktopのデータ領域の&lt;code&gt;vhdx&lt;/code&gt;ファイルのサイズが81GBと、結構な割合です。&lt;/p&gt;
&lt;p&gt;前回は、Hyper-V管理ツールで仮想ディスクの圧縮処理を行ったのですが、Dドライブに移行したほうが安心できそうな気がしたので、移動の方法を調べました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://learn.microsoft.com/ja-jp/windows/wsl/basic-commands&#34;&gt;WSLコマンドのドキュメント&lt;/a&gt;が公式で公開されています。こちらのコマンドを元に作業をしました。
また、ググって出てきた記事も参考にさせていただきました。ありがとうございます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.ojisan.io/wsl-reinstall-d/&#34;&gt;wsl をDドライブに入れ直してディスク拡張する | blog.ojisan.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://qiita.com/shinsaka/items/71a234e71ebca3daf3c9&#34;&gt;WSL2環境をコピー（複製）する方法 - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まずは確認と停止&#34;&gt;まずは確認と停止&lt;/h2&gt;
&lt;p&gt;WSL2で使っているディストリビューションを確認します。コマンドは以下の通り。
実行した結果も含まれています。コマンドの実行にはコマンドプロンプトを使用しました。公式ドキュメントのドキュメントではスニペットはPower Shellと書かれてますが、コマンドプロンプトでも大丈夫そうでした。&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-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;D:\&amp;gt;wsl -l -v
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  NAME                   STATE           VERSION
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;* Ubuntu                 Running         2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  docker-desktop         Running         2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  docker-desktop-data    Running         2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;残念ながら、wslのコマンドでは実体がどこにあるのかを調べることができなかったですが、WizTreeでディレクトリ名などを見ていたのでなんとなう予測ができました。
（これ、他に知る方法あるのかなぁ？）&lt;/p&gt;
&lt;p&gt;ディストリビューションの移動は次のような手順になります。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;wslのshutdown&lt;/li&gt;
&lt;li&gt;エクスポート（ディストリビューションのコピー）&lt;/li&gt;
&lt;li&gt;今あるディストリビューションを削除&lt;/li&gt;
&lt;li&gt;インポート（今ある名前で2.のファイルをインポート）&lt;/li&gt;
&lt;/ol&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-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;D:\&amp;gt;wsl --shutdown
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;エクスポート&#34;&gt;エクスポート&lt;/h2&gt;
&lt;p&gt;次にエクスポートです。
今回は以下の2種類の仮想環境をエクスポートします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ubuntu&lt;/li&gt;
&lt;li&gt;docker-desktop-data&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;エクスポートでは、元のディストリビューションのファイル（Cドライブにあるファイル）が消えることはありません。
また、エクスポートの形式として、&lt;code&gt;tar&lt;/code&gt;と&lt;code&gt;vhdx&lt;/code&gt;の2種類が指定できます。
エクスポートのコマンドのデフォルトは&lt;code&gt;tar&lt;/code&gt;形式ですが、エクスポート元のファイルが&lt;code&gt;vhdx&lt;/code&gt;なので、&lt;code&gt;vhdx&lt;/code&gt;でエクスポートしたほうがCPUにやさしかったです。
ちなみに、&lt;code&gt;docker-desktop-data&lt;/code&gt;は&lt;code&gt;tar&lt;/code&gt;形式でエクスポートしてインポートしました。&lt;code&gt;tar&lt;/code&gt;形式の場合は、ディスクのサイズが小さくなる可能性があるみたいです（不要なデータが&lt;code&gt;vhdx&lt;/code&gt;の中に残っていたりする影響かと）。&lt;/p&gt;
&lt;p&gt;コマンドは以下の通りです（&lt;a href=&#34;https://learn.microsoft.com/ja-jp/windows/wsl/basic-commands#import-and-export-a-distribution&#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-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;D:\&amp;gt;wsl --export Ubuntu .\wsl\Ubuntu\ext4.vhdx --vhd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;docker-desktop-dataはtar形式です。&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-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;D:\&amp;gt;wsl --export docker-desktop-data .\Docker\ docker-desktop-data.tar
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;ディストリビューションの削除こわい&#34;&gt;ディストリビューションの削除（こわい？）&lt;/h2&gt;
&lt;p&gt;今ついているディストリビューション名を利用したいので、いったん、Cドライブ上にあるディストリビューションを削除する必要があります。
&lt;a href=&#34;https://learn.microsoft.com/ja-jp/windows/wsl/basic-commands#unregister-or-uninstall-a-linux-distribution&#34;&gt;コマンドは公式ドキュメントにある&lt;code&gt;--unregister&lt;/code&gt;&lt;/a&gt;オプションを利用します。
以下のコマンドはUbuntuですが、docker-desktop-dataもやりました。&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-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;D:\&amp;gt;wsl --unregister Ubuntu
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ちなみに、このコマンドを実行すると、Cドライブの容量がいきなり空きました。
コマンドいっぱつでなくなりました。きちんとエクスポートしてから実行しましょう。
（なんなら、一度、別名でインポートして動作確認するのもいいかもしれないです。私はしましたｗ）&lt;/p&gt;
&lt;h2 id=&#34;インポート&#34;&gt;インポート&lt;/h2&gt;
&lt;p&gt;インポートするオプションも2種類あります。&lt;code&gt;vhdx&lt;/code&gt;ファイルの場合は、インプレースでのインポート（vhdxファイルをそのまま利用する形式）が可能です。
Ubuntuについてはこちらを利用しました。この場合、vhdxファイルがそのまま利用されるため、バックアップとしては利用できなくなります。今回は170GBもあるので、これでいいかと。&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-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;D:\&amp;gt;wsl --import-in-place Ubuntu .\wsl\Ubuntu\ext4.vhdx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;tarファイル（docker-desktop-data）の場合は、通常のインポートを行いました。&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-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wsl --import docker-desktop-data D:\Docker\docker-desktop-data\ D:\Docker\docker-desktop-data.tar
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この場合、tarファイルは残ったままで、新たに&lt;code&gt;D:\Docker\docker-desktop-data\&lt;/code&gt;ディレクトリに&lt;code&gt;ext4.vhdx&lt;/code&gt;ファイルが作られました。
バックアップも取りつつ移行したい場合は&lt;code&gt;--import&lt;/code&gt;がいいかもしれません。
また、WSLはバージョン1とバージョン2があり、インポートの際にこの部分も気にする必要があるようです。
今回はすべてバージョン2で、かつ、wslのデフォルトのバージョンを2にしてあったので特に意識していません。&lt;/p&gt;
&lt;h2 id=&#34;ubuntu起動ユーザーの指定と注意点&#34;&gt;Ubuntu起動ユーザーの指定と注意点&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://learn.microsoft.com/ja-jp/windows/wsl/basic-commands#change-the-default-user-for-a-distribution&#34;&gt;公式ドキュメントに&lt;/a&gt;、既存のユーザーを変更するコマンドの記載があります。
インポートしたディストリビューションは、デフォルトユーザーがrootになっていることがあるようなので、Ubuntuのユーザーを次のようなコマンドで変更しました。&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-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ubuntu config --default-user johtani
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;公式ドキュメントの警告にもありますが、実行可能ランチャーがない場合があります。
今回の&lt;code&gt;ubuntu&lt;/code&gt;は、WSL2でUbuntuをインストールした時に作成されたコマンドで、unregisterした後にimportしてもきちんと動いたので問題にはなりませんでした。これは、インポートするときに、既存のディストリビューション名を利用したためと思われます。&lt;/p&gt;
&lt;p&gt;エクスポートやインポートの検証するために、&lt;code&gt;NewUbuntu&lt;/code&gt;という名前で別途インポートした時には、&lt;code&gt;NewUbuntu&lt;/code&gt;という実行可能ランチャーは作成されず、上記のデフォルトユーザーの設定は別の方法が必要になります（罠だ）&lt;/p&gt;
&lt;p&gt;docker-desktop-dataのほうは、特に変更してないけど動いてそうだからいいのかな？
前の設定の確認とかやっておくのがいいんだろうな、本当は。。。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、Cドライブに300GB近い空きができて、心の余裕もできました。
今回は、同じPC内で別のドライブへの移動でしたが、他のPCにもこれで移行ができそうですね。
たまにはバックアップをとっておくのもいいのかも？と思いました（やるかどうかはまた別の話）&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>VS CodeとDev Container（docker-compose.yml対応）</title>
      <link>https://blog.johtani.info/blog/2023/07/21/multi-containers-with-dev-container/</link>
      <pubDate>Fri, 21 Jul 2023 10:13:30 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2023/07/21/multi-containers-with-dev-container/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2023/07/13/introduce-vs-code-and-dev-container/&#34;&gt;前回の記事&lt;/a&gt;で、VS Code＋Dev Containerを導入しました。
残課題として「マルチコンテナ化」があるという話もしました。今回はDev Containerのdocker-compose.yml対応をした話をメモとして残しておきます。
実際、VS Code + Dev Containerに移行した後に、Esを起動してアプリからつなげるというのがうまくいかないというのがあったので対応がんばりました。。。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2023/07/13/introduce-vs-code-and-dev-container/&#34;&gt;前回の記事&lt;/a&gt;で、VS Code＋Dev Containerを導入しました。
残課題として「マルチコンテナ化」があるという話もしました。今回はDev Containerのdocker-compose.yml対応をした話をメモとして残しておきます。
実際、VS Code + Dev Containerに移行した後に、Esを起動してアプリからつなげるというのがうまくいかないというのがあったので対応がんばりました。。。&lt;/p&gt;
&lt;h2 id=&#34;dev-containerのdocker-compose設定&#34;&gt;Dev Containerのdocker compose設定&lt;/h2&gt;
&lt;p&gt;この記事ではすでにdocker-compose.ymlが存在している状態の話をします。
変更する前は、devcontainer.jsonでベースのコンテナイメージの指定、マウントの設定などを行っていましたが、docker-compose.ymlにいくつかを移動しないといけません。
対応した時の作業の流れは以下のような感じです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ワークスペース用のDockerfileの作成&lt;/li&gt;
&lt;li&gt;docker-compose.ymlにワークスペース用のサービスを追加&lt;/li&gt;
&lt;li&gt;devcontainer.jsonをdokcer-compose.ymlを利用する形に書き換え&lt;/li&gt;
&lt;li&gt;アプリでの接続文字列をlocalhostからdocker-compose.ymlのサービス名に変更&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;参考：&lt;a href=&#34;https://github.com/johtani/search-research/pull/17/commits/b6e75b1d641bbea74ff57d5914020929d70d2c42&#34;&gt;対応した時のコミットです&lt;/a&gt;。差分などはこちらをごらんください。&lt;/p&gt;
&lt;p&gt;devcontainerのリポジトリに&lt;a href=&#34;https://github.com/microsoft/vscode-dev-containers/tree/main/containers/python-3-postgres&#34;&gt;Python+PostgreSQLのサンプル&lt;/a&gt;が公開されており、こちらを参考にしながら作業をしました。&lt;/p&gt;
&lt;h3 id=&#34;1-dockerfileの作成&#34;&gt;1. Dockerfileの作成&lt;/h3&gt;
&lt;p&gt;docker-compose.ymlだけでも完結するのかもしれないですが、いろいろやりたいことも出てくるかもしれないので別のファイルに切り出しました。
といっても、コンテナのイメージはdevcontainer.jsonに記述していたものを使っています。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ARG VARIANT=3.11-bookworm
FROM mcr.microsoft.com/devcontainers/python:${VARIANT}

ENV PYTHONUNBUFFERED 1
ENV TZ Asia/Tokyo
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;TZ&lt;/code&gt;はdevcontainer.jsonで指定していたものを、こちらに移行した形になります。
&lt;code&gt;PYTHONUNBUFFERED&lt;/code&gt;は参考にしたDockerfileの記載です。標準出力・エラーをバッファリングしない指定になっています。&lt;/p&gt;
&lt;h3 id=&#34;2-dokcer-composeymlにサービス追加&#34;&gt;2. dokcer-compose.ymlにサービス追加&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;backend&lt;/code&gt;という名前のサービスをdevcontainer（VS Code）から接続するコンテナのサービス名にしています。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;services:
  backend:
    build:
      context: .
      dockerfile: .devcontainer/Dockerfile
    init: true
    environment:
      - TZ=Asia/Tokyo
    command: sleep infinity
    volumes:
      - .:/workspace/search-research:cached
      - venv-search-research-backend:/workspace/search-research/.venv
...
volumes:
  venv-search-research-backend:
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;1.で作成したDockerfileを利用します。docker-compose.ymlファイル自体は、プロジェクトのルートディレクトリに配置していますが、Dockerfileは&lt;code&gt;.devcontainer&lt;/code&gt;ディレクトリに入れたため、&lt;code&gt;context&lt;/code&gt;と&lt;code&gt;dockerfile&lt;/code&gt;はこのような指定になっています。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;init&lt;/code&gt;は、&lt;code&gt;devcontainer.json&lt;/code&gt;で指定していた&lt;code&gt;&amp;quot;runArgs&amp;quot;: [&amp;quot;--init&amp;quot;],&lt;/code&gt;の設定になります。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;command&lt;/code&gt;の部分は、コンテナが起動したままにしておくための設定です。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;volumes&lt;/code&gt;では2つのボリュームに関しての指定があります。
1つ目の&lt;code&gt;/workspace...&lt;/code&gt;は、VS Codeがコンテナにプロジェクトをマウントする場所の指定です。
&lt;code&gt;devcontainer.json&lt;/code&gt;だけを利用していた場合は意識していませんでしたが、&lt;code&gt;/workspace/プロジェクト名&lt;/code&gt;というディレクトリにプロジェクトがマウントされていました。
docker-compose.ymlを利用する場合は、明示的に指定が必要です。
2つ目の&lt;code&gt;venv-...&lt;/code&gt;は&lt;code&gt;.venv&lt;/code&gt;のディレクトリをコンテナの中だけのものにする設定を移植したものになります。
前回の記事ではコンテナIDをボリューム名に含めていましたが、こちらのほうがわかりやすいかと思い、プロジェクトの名前とサービス名をつけるようにしてみました。
Dev Containerで起動した場合は&lt;code&gt;search-research_venv-search-research-backend&lt;/code&gt;という名前がついています（最初の部分はDev Containerがつけてるのかな？）&lt;/p&gt;
&lt;h3 id=&#34;3-dovcontainerjsonの変更&#34;&gt;3. dovcontainer.jsonの変更&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;devcountainer.json&lt;/code&gt;から呼び出すものの準備ができたので、&lt;code&gt;devcontainer.json&lt;/code&gt;を書き換えます。
&lt;a href=&#34;https://containers.dev/implementors/json_reference/#compose-specific&#34;&gt;公式のドキュメントとしてDocker Compose向けのプロパティが紹介されています&lt;/a&gt;。
変更したものは次のような形です。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{
  &amp;#34;name&amp;#34;: &amp;#34;search-research&amp;#34;,
  &amp;#34;dockerComposeFile&amp;#34;: &amp;#34;../docker-compose.yml&amp;#34;,
  &amp;#34;service&amp;#34;: &amp;#34;backend&amp;#34;,
  &amp;#34;workspaceFolder&amp;#34;: &amp;#34;/workspace/search-research&amp;#34;,
  &amp;#34;postCreateCommand&amp;#34;: &amp;#34;/bin/sh ./.devcontainer/postCreateCommand.sh&amp;#34;,
  &amp;#34;customizations&amp;#34;: {
...
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;dockerComposeFile : 利用するdocker-compose.ymlのファイルパス&lt;/li&gt;
&lt;li&gt;service：VS Codeが利用するワークスペース用のサービス名&lt;/li&gt;
&lt;li&gt;workspaceFoldeer：VS Codeがコンテナに接続したときに開くフォルダのパス&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;を指定します。これで、VS Codeでこのプロジェクトを開いた時に、Dev Containerがdocker-compose.ymlを使ってコンテナの起動（ビルドとか）を行ってくれます。&lt;/p&gt;
&lt;h3 id=&#34;4-アプリの接続文字列の書き換え&#34;&gt;4. アプリの接続文字列の書き換え&lt;/h3&gt;
&lt;p&gt;こちらはおまけです。
PythonのアプリからElasticsearchに接続するときの文字列として、Dev Container化の前は、&lt;code&gt;http://localhost:9200&lt;/code&gt;と指定をしていました。
Elasticsearch用のサービス（&lt;code&gt;es&lt;/code&gt;）で、ポートフォワードをしていたためです。&lt;/p&gt;
&lt;p&gt;アプリ側もコンテナ化したので、Docker Composeが名前の解決をしてくれるので、&lt;code&gt;http://es:9200&lt;/code&gt;という接続文字列で接続ができるようになりました。&lt;/p&gt;
&lt;p&gt;ということで、ここまでで、VS Codeでプロジェクトを開くと、2つのコンテナ（&lt;code&gt;backend&lt;/code&gt;と&lt;code&gt;es&lt;/code&gt;）が起動してVS Code上でPythonアプリからEsへの接続ができるようになりました。&lt;/p&gt;
&lt;h2 id=&#34;追加の変更&#34;&gt;追加の変更&lt;/h2&gt;
&lt;p&gt;参考のプルリクでは、上記まででしたがさらにいくつかの変更をそのあとやっています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;起動するサービスの指定(開発だけするときはEsを起動したくない)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;devcontainer.json&lt;/code&gt;で&lt;code&gt;runServices&lt;/code&gt;を使って指定できます（&lt;a href=&#34;https://containers.dev/implementors/json_reference/#compose-specific&#34;&gt;公式ドキュメント&lt;/a&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;GPUをコンテナから利用できるように
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;devcontainer.json&lt;/code&gt;で&lt;code&gt;features&lt;/code&gt;の&lt;code&gt;nvidia-cuda&lt;/code&gt;を指定し、docker-compose.ymlで&lt;code&gt;nvidia&lt;/code&gt;のドライバーなどを設定することで対応しました。&lt;/li&gt;
&lt;li&gt;nvidiaが公開しているcuda対応のコンテナイメージでもよかったのですが、こちらのほうが楽そうだったという理由です。&lt;code&gt;features&lt;/code&gt;とコンテナのビルド、postCreateCommandの順序などはもうちょっと勉強しないといけない気がしています。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらの対応は&lt;a href=&#34;https://github.com/johtani/search-research/commit/10a4741ab6fa2003f6f050864758a8176a9090cb&#34;&gt;こちらのコミット&lt;/a&gt;で対応しています。&lt;/p&gt;
&lt;p&gt;GPUの対応は、私個人の環境はこれでいいのですが、複数の人がこのリポジトリを使う場合はどうやって切り替えたりするんだろう？という疑問が残っています。。。
今回はrinna/japanese-clipのモデルを使って、テキストからベクトルを生成する部分の処理のためにGPUを使いたいというモチベーションがあり、コンテナでもGPUを使えるようにしています（CPUだと時間がすごくかかる。。。）。&lt;/p&gt;
&lt;h3 id=&#34;サービス起動の新たな問題点&#34;&gt;サービス起動の新たな問題点&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;runServices&lt;/code&gt;で起動するサービス名を指定したのはよかったのですが、Elasticsearchのサービスを起動して、データ登録や検索の確認を行おうと思った時に、EsのコンテナをVS Codeだけで起動する方法がまだわかっていません。。。
一度コンテナをビルドした後なら、「Remote Explorer」でOther Containerというくくりで表示され、右クリックで起動や停止ができそうなのだけど、新規サービスをdocker-compose.ymlに追加した場合は、自分でターミナルなどでコンテナのビルドをしないといけないかもしれないです。もうちょっと調べてみないとなぁ。&lt;/p&gt;
&lt;h2 id=&#34;副次的な効果&#34;&gt;副次的な効果&lt;/h2&gt;
&lt;p&gt;Docker Compose対応をしたことで、前回の記事での疑問点のうち、「コンテナ名」「VolumeのID」については懸念点がなくなりました。&lt;/p&gt;
&lt;p&gt;「コンテナ名」は、docker-compose.ymlのサービス名がコンテナ起動時に名前として利用されるため、Docker Desktopで見た時などの探しにくさはなくなりました。
ただ、「イメージ名」については、いまだに2つできています。「-uid」がつかないものの代わりに、&lt;code&gt;search-research-backend&lt;/code&gt;というイメージが作られています。
ただし、実際に利用されるのは前回の記事に書いたような&lt;code&gt;vsc-search-research-bf04371c017c8d2f1dd5ad2529841b02e9ea1d1aaa4354c19edf53cef3f0c13b-uid&lt;/code&gt;という名前のイメージです。&lt;/p&gt;
&lt;p&gt;「VolumeのID」については、docker-compose.ymlのファイルで自分で名前をつけるようにしたので、コンテナのIDが利用されなくなったという次第です。
代わりに、プロジェクト名である「search-research」という名前を直接記述しているので、変数などで置き換えたほうがいいのかも？という気がしています。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、複数のコンテナを利用するプロジェクトでVS Code+Dev Container対応ができそうだということがわかりました。
ついでに、GPU対応もできたのでこれで、やっと他の検索エンジン対応などができる気がしています。
（その前にpre-commitを保存時にチェックする形に変更かなぁ）
やりたいことからちょっとずつ外れている気もするけれど、新しいことを調べるのは楽しいですね。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>VS CodeとDev Containerの導入（まだ途中）</title>
      <link>https://blog.johtani.info/blog/2023/07/13/introduce-vs-code-and-dev-container/</link>
      <pubDate>Thu, 13 Jul 2023 22:15:23 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2023/07/13/introduce-vs-code-and-dev-container/</guid>
      <description>&lt;p&gt;前回の記事で、&lt;code&gt;pre-commit&lt;/code&gt;と&lt;code&gt;PyCharm&lt;/code&gt;と&lt;code&gt;Windows&lt;/code&gt;の組み合わせで困っていることを書きました。
これについて、知り合いとチャットで話をしていて、それほどPyCharmにこだわりもないよなぁということになり、
であれば、ISIDのブログ（&lt;a href=&#34;https://tech.isid.co.jp/entry/2023/05/02/Dev_Container%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%83%90%E3%82%A4%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%A7%E4%BD%9C%E3%82%8BPython%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1&#34;&gt;Dev Containerを使ってステップバイステップで作るPythonアプリケーション開発環境 - ISID テックブログ&lt;/a&gt;）を試してみるとすっきりするかもしれないとなり、Dev Container対応をブログを参考に行ってみました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;前回の記事で、&lt;code&gt;pre-commit&lt;/code&gt;と&lt;code&gt;PyCharm&lt;/code&gt;と&lt;code&gt;Windows&lt;/code&gt;の組み合わせで困っていることを書きました。
これについて、知り合いとチャットで話をしていて、それほどPyCharmにこだわりもないよなぁということになり、
であれば、ISIDのブログ（&lt;a href=&#34;https://tech.isid.co.jp/entry/2023/05/02/Dev_Container%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%83%90%E3%82%A4%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%A7%E4%BD%9C%E3%82%8BPython%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1&#34;&gt;Dev Containerを使ってステップバイステップで作るPythonアプリケーション開発環境 - ISID テックブログ&lt;/a&gt;）を試してみるとすっきりするかもしれないとなり、Dev Container対応をブログを参考に行ってみました。&lt;/p&gt;
&lt;p&gt;順を追ってブログで説明されているので、どういう仕組みなのか、どの設定が何を意味しているのか？がとてもよくわかりやすくすんなり対応することができました。&lt;/p&gt;
&lt;p&gt;ブログの手順をなぞっているところでいくつか固有の手順や疑問点が出てきたのでブログに書き記しておきます。
結果は、コミットしてあるものを見てください。&lt;/p&gt;
&lt;h2 id=&#34;ブログとは違う手順&#34;&gt;ブログとは違う手順&lt;/h2&gt;
&lt;p&gt;まずはISIDのブログとは違う点をいくつか。&lt;/p&gt;
&lt;h3 id=&#34;venvはいったん削除&#34;&gt;.venvはいったん削除&lt;/h3&gt;
&lt;p&gt;ブログでは新規のプロジェクトを作成していく過程で、コンテナ化した環境を作った後に&lt;code&gt;.venv&lt;/code&gt;をDockerコンテナのボリュームにして、最後に仮想環境のPythonを生成していました。
私の場合は、すでにホストOS（実際にはWSL2のUbuntuだけど）で&lt;code&gt;.venv&lt;/code&gt;のディレクトリを作成してある状態だったので、いったん削除する必要がありました。
すでに存在する&lt;code&gt;.venv&lt;/code&gt;がbindマウントされてしまっている状態になるため、Dockerのボリュームとの整合性が取れなくなるようです。&lt;/p&gt;
&lt;p&gt;この作業を行う前か、途中でDev Containerを停止した状態で、&lt;code&gt;.venv&lt;/code&gt;を削除することで問題なくDockerのボリュームに仮想環境のPythonが登録されるようになります。&lt;/p&gt;
&lt;h3 id=&#34;postcreatecommandshの呼び出し方&#34;&gt;postCreateCommand.shの呼び出し方&lt;/h3&gt;
&lt;p&gt;ファイルに実行権限がないと、実行権限エラーが出ました。
実行権限を与えるか、次のような記述で動くようになりました。
今は、ファイルに実行権限をつけるのではなく、次のような記述にしていますが、何か問題あるかな？&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; &amp;#34;postCreateCommand&amp;#34;: &amp;#34;/bin/sh ./.devcontainer/postCreateCommand.sh&amp;#34;,
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;実際に動作しているログを見ると&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/bin/sh -c /bin/sh ./.devcontainer/postCreateCommand.sh&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;となっているので、少し気持ち悪いのだけれども。。。&lt;/p&gt;
&lt;h3 id=&#34;postcreatecommandshの追加処理&#34;&gt;postCreateCommand.shの追加処理&lt;/h3&gt;
&lt;p&gt;今回Dev Containerを適用したプロジェクトでは、&lt;code&gt;sentencepiece&lt;/code&gt;を利用します。
この、&lt;code&gt;sentencepiece&lt;/code&gt;を&lt;code&gt;poetry&lt;/code&gt;がインストールするタイミングで、&lt;code&gt;cmake&lt;/code&gt;を要求してきました。
今回利用しているDocker Imageには&lt;code&gt;cmake&lt;/code&gt;は含まれていないため、以下の処理を追加しています。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt update
sudo apt-get install cmake -y
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;また、&lt;code&gt;rinna/japanese-clip&lt;/code&gt;も利用しているのですが、こちらは、&lt;code&gt;poetry&lt;/code&gt;で追加してインストールでは依存するパッケージがインストールされないため、&lt;code&gt;pip&lt;/code&gt;コマンドを利用するようにしています。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pip install git+https://github.com/rinnakk/japanese-clip.git
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;コンテナイメージを作った後にやりたいことを、自由にスクリプトで書けるのは便利ですね。&lt;/p&gt;
&lt;h3 id=&#34;pre-commitのスクリプトの再生成&#34;&gt;pre-commitのスクリプトの再生成&lt;/h3&gt;
&lt;p&gt;こちらも、既存の環境が残っているとPythonへのパスの違いの問題が出たので、作り直しました。
&lt;code&gt;.git/hooks/pre-commit&lt;/code&gt;のファイルを削除し、&lt;code&gt;pre-commit install&lt;/code&gt;をやったものをリポジトリにコミットしてあります。&lt;/p&gt;
&lt;h2 id=&#34;疑問点&#34;&gt;疑問点&lt;/h2&gt;
&lt;p&gt;作業をしていて疑問点もいくつか出てきたのでメモを残しておきます。ちなみに、これらの疑問について実際に調べるまでには至っていません。
時間を見て解決できればなぁと（できるのか？）。&lt;/p&gt;
&lt;h3 id=&#34;imageが2つ&#34;&gt;Imageが2つ&lt;/h3&gt;
&lt;p&gt;Dev Containerの設定を書いた後に、コンテナをビルドすると、Docker DesktopのImagesにイメージが出来上がります。
この時、イメージが2つできあがっています（なぜ？）。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;REPOSITORY                                                                                          TAG       IMAGE ID       CREATED      SIZE
vsc-search-research-bf04371c017c8d2f1dd5ad2529841b02e9ea1d1aaa4354c19edf53cef3f0c13b-features-uid   latest    25c7e23416ec   3 days ago   1.69GB
vsc-search-research-bf04371c017c8d2f1dd5ad2529841b02e9ea1d1aaa4354c19edf53cef3f0c13b-features       latest    fcf9eaeb2187   3 days ago   1.69GB
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;こんな感じで、最後に&lt;code&gt;-uid&lt;/code&gt;がついているかいないかの違いです。
実際にコンテナ起動時に利用されるのは&lt;code&gt;-uid&lt;/code&gt;がついているものになります。
なぜ2つになっているのか、1つにする設定などがあるのか？といったところが気になるところです。&lt;/p&gt;
&lt;h3 id=&#34;containerの名前&#34;&gt;Containerの名前&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;devcontainer.json&lt;/code&gt;の設定を書き換えて、コンテナをリビルドすると起動したコンテナの名前が自動で割り振られているようです。
今は、&lt;code&gt;fervent_hopper&lt;/code&gt;となっています。ランダムにつけられているようなのですが、名前を付ける方法はないのかなぁ？と。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;devcontainer.json&lt;/code&gt;には&lt;code&gt;name&lt;/code&gt;というプロパティもあるのですが、この値がどこで使われているのかはよくわかっていません。
Remote Explorerでコンテナの一覧が見えますが、ここでは、リポジトリ名が利用されているようです。&lt;/p&gt;
&lt;h3 id=&#34;volumeのidはどこから&#34;&gt;VolumeのIDはどこから？&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;devcontainer.json&lt;/code&gt;で次のような記述で、&lt;code&gt;.venv&lt;/code&gt;のディレクトリようにDockerにボリュームを作っています。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  &amp;#34;mounts&amp;#34;: [
    &amp;#34;source=venv-${devcontainerId},target=${containerWorkspaceFolder}/.venv,type=volume&amp;#34;
  ],
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;実際にコンテナでマウントされている情報を見ると&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/workspaces/search-research/.venv
/var/lib/docker/volumes/venv-04emir9hi2caivtjunfe3l17452hkbb3hdut1qflbrn8n924ho5c/_data
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;となっています。
&lt;code&gt;04emir9hi2caivtjunfe3l17452hkbb3hdut1qflbrn8n924ho5c&lt;/code&gt;が&lt;code&gt;devcontainerId&lt;/code&gt;に相当するのだとは思うのですが、誰がつけたものかなどがまだよくわかっていません。
もうちょっとわかりやすいものが使えるほうが嬉しいかも？と思っていたりします。
（複数Dev Containerを使い始めると、Docker Desktopで見ると、どのボリュームがどのDev Containerに紐づいているかがぱっと見ではわからない）&lt;/p&gt;
&lt;h3 id=&#34;vscodeディレクトリどうしよう&#34;&gt;.vscodeディレクトリどうしよう？&lt;/h3&gt;
&lt;p&gt;たぶん、VS Codeを触っている過程で、何かの設定をしてしまったのだとは思うのですが、
&lt;code&gt;.vscode/settings.json&lt;/code&gt;というファイルができており、次のような内容になっています。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{
  &amp;#34;git.ignoreLimitWarning&amp;#34;: true
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;何か意味があるかも？ということで、コミットしてリポジトリに入れたのですが、いらないのかもしれないなぁと。&lt;/p&gt;
&lt;h2 id=&#34;残作業&#34;&gt;残作業&lt;/h2&gt;
&lt;p&gt;とりあえず、VS CodeでPython環境ができて、VS CodeのTerminalでPythonのプログラムが実行できるのはわかった段階です。
いくつか、今後調べながらやる必要があるものが残っているのでメモとして残しておきます。&lt;/p&gt;
&lt;h3 id=&#34;マルチコンテナ化&#34;&gt;マルチコンテナ化&lt;/h3&gt;
&lt;p&gt;今回Dev Containerに対応したプロジェクトでは、検索エンジンもDockerのコンテナとして起動して、Pythonのプログラムから接続したいと思っています。
となると、docker composeでいろいろと起動するほうがネットワークなどの設定も楽になるのでは？と思っているところです。
Dev Containerのテンプレートがいくつか用意されており、その中に&lt;a href=&#34;https://github.com/devcontainers/templates/blob/main/src/postgres/README.md&#34;&gt;「Python 3 &amp;amp; PostgreSQL (postgres)」&lt;/a&gt;というのを見つけたので、このあたりが参考になるのでは？と考えているところです。&lt;/p&gt;
&lt;h3 id=&#34;pre-commitではなく保存時にフォーマット&#34;&gt;pre-commitではなく、保存時にフォーマット&lt;/h3&gt;
&lt;p&gt;pre-commit＋localのコマンドも動くようにはなったのですが、保存時にフォーマットなどをかける設定もISIDのブログで記載がありました。
コミットしようとして、怒られるよりも、保存時に怒られたりするほうがいいかも？という気分になってきています。
どこまでが切り替え可能なのか？なども見ながら対応してみようかなと。&lt;/p&gt;
&lt;h3 id=&#34;もう少し開発してみて改善点を探っていく&#34;&gt;もう少し開発してみて改善点を探っていく&lt;/h3&gt;
&lt;p&gt;とりあえず動いたという段階です。
PyCharmとの違いがあるはずで（たとえば、git周りのGUIの違いとか）、そのあたりでどんな違いがあり、どんなものがあると嬉しいのか？といったものを調べる必要もあるかなと考えています。
Terminalで&lt;code&gt;Ctrl+r&lt;/code&gt;がうまく使えなかったり(Auto Hot Keyで検索のショートカットに割り当ててしまっているから。。。)などもあるので、この辺も調べていきたいなと。
Windows Terminalを使えたりするのかなぁ？&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;さて、とりあえず、VS CodeでPythonのDev Container環境を作って動くところまでは来ました。
PyCharmを使いこなしていなかったのもあり、それほど違和感なく移行できるような気がしています。
調べることはまだまだあるし、プログラム書くつもりが、環境を整える方向に話がずれている気もしますが、まぁ面白いのでよしとするかなぁ。
いろいろまだまだ知らないことだらけです。。。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>pre-commitとvenvとPyCharm（困ったな？）</title>
      <link>https://blog.johtani.info/blog/2023/07/10/pre-commit-and-python/</link>
      <pubDate>Mon, 10 Jul 2023 10:55:48 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2023/07/10/pre-commit-and-python/</guid>
      <description>&lt;p&gt;最近、趣味（&lt;a href=&#34;https://github.com/johtani/search-research&#34;&gt;検索エンジンに関する趣味プロジェクト&lt;/a&gt;）でPythonのプログラムを書き始めました。&lt;/p&gt;
&lt;p&gt;きちんとPythonのプログラムをプロジェクトとして書いたことがないので、
Pythonのプロジェクトのディレクトリ構成などを手探りで進めているところです。
コードのフォーマットとかもやらないとなぁ？と知り合いのいるSlackでつぶやいたところ、gitのpre-commitフェーズで&lt;code&gt;black&lt;/code&gt;などのフォーマットやスタイルを修正してくれるツールを実行する方法を教えてもらいました（PRまで送ってもらえたのでありがたい）。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;最近、趣味（&lt;a href=&#34;https://github.com/johtani/search-research&#34;&gt;検索エンジンに関する趣味プロジェクト&lt;/a&gt;）でPythonのプログラムを書き始めました。&lt;/p&gt;
&lt;p&gt;きちんとPythonのプログラムをプロジェクトとして書いたことがないので、
Pythonのプロジェクトのディレクトリ構成などを手探りで進めているところです。
コードのフォーマットとかもやらないとなぁ？と知り合いのいるSlackでつぶやいたところ、gitのpre-commitフェーズで&lt;code&gt;black&lt;/code&gt;などのフォーマットやスタイルを修正してくれるツールを実行する方法を教えてもらいました（PRまで送ってもらえたのでありがたい）。&lt;/p&gt;
&lt;p&gt;で、pre-commit周りの設定などを変えている段階で遭遇した問題点についてログを残しておこうと重いブログを書いています。
残念ながら現時点では解決してないんですけどね。。。&lt;/p&gt;
&lt;h2 id=&#34;手元の環境&#34;&gt;手元の環境&lt;/h2&gt;
&lt;p&gt;簡単に環境を書いておくとこんな感じです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows上のPyCharmを開発で使用&lt;/li&gt;
&lt;li&gt;プロジェクトのディレクトリはWSL2のUbuntu上&lt;/li&gt;
&lt;li&gt;Python、gitはUbuntuのものを利用&lt;/li&gt;
&lt;li&gt;プロジェクトのルートディレクトリにある&lt;code&gt;.venv&lt;/code&gt;にvenvでPythonの仮想環境を作成してある&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;問題点&#34;&gt;問題点&lt;/h2&gt;
&lt;p&gt;遭遇した&lt;code&gt;pre-commit&lt;/code&gt;の問題点は次の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pre-commitの設定で&lt;code&gt;repo:local&lt;/code&gt;でローカルのプロジェクトにインストールしたコマンドを利用するように変更&lt;/li&gt;
&lt;li&gt;すると、PyCharmでコミットすると、&lt;code&gt;black&lt;/code&gt;などのコマンドが見つからない&lt;/li&gt;
&lt;li&gt;ターミナルでコミットするときはきちんと動作する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;色々調べて試行錯誤した結果、現在は&lt;code&gt;repo:local&lt;/code&gt;でのローカルコマンドを使用する方法はあきらめました。
移行は、作業記録みたいなものです。どういう流れでpre-commitを取り込み、ローカルに切り替え、切り戻したかという話です。&lt;/p&gt;
&lt;h2 id=&#34;pre-commitとpre-commit&#34;&gt;pre-commitとpre-commit&lt;/h2&gt;
&lt;p&gt;最初に少し戸惑ったのは、&lt;code&gt;pre-commit&lt;/code&gt;というツールと&lt;code&gt;git&lt;/code&gt;の&lt;code&gt;pre-commitフック&lt;/code&gt;です。
gitのpre-commitのフックのために作られたPython製の&lt;code&gt;pre-commit&lt;/code&gt;というツールがあります。&lt;/p&gt;
&lt;p&gt;このPython製のツールを利用することで、プロジェクトに&lt;code&gt;.pre-commit-config.yaml&lt;/code&gt;という設定ファイルを置けば設定に記述されたツールをgit commitのタイミングで実行してくれます。
実際には、&lt;code&gt;pre-commit&lt;/code&gt;というツールの初期設定のタイミングで&lt;code&gt;pre-commit install&lt;/code&gt;というコマンドを実行して
&lt;code&gt;.git/hooks/pre-commit&lt;/code&gt;というスクリプトが生成されます。
gitコマンドはcommitされた時に（commit前のフェーズ）でこのスクリプトを実行し、そこで&lt;code&gt;.pre-commit-config.yaml&lt;/code&gt;が参照されています。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.pre-commit-config.yaml&lt;/code&gt;の記述は次のようなものになります（最初にもらったPRより）。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;repos:
  - repo: https://github.com/psf/black
    rev: 23.3.0
    hooks:
      - id: black
        args: [&amp;#34;--line-length&amp;#34;, &amp;#34;120&amp;#34;, &amp;#34;.&amp;#34;]
  - repo: https://github.com/pycqa/flake8
    rev: 6.0.0
    hooks:
      - id: flake8
  - repo: https://github.com/pycqa/isort
    rev: 5.12.0
    hooks:
      - id: isort
        args: [&amp;#34;--profile&amp;#34;, &amp;#34;black&amp;#34;, &amp;#34;--filter-files&amp;#34;, &amp;#34;--multi-line&amp;#34;, &amp;#34;3&amp;#34;]
  - repo: https://github.com/pre-commit/mirrors-mypy
    rev: v1.4.1
    hooks:
      - id: mypy
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;実際に、PRを取り込んで動かしてみたところ、&lt;code&gt;black&lt;/code&gt;などが動いて行末のスーペースの除去や未使用のimportについて指摘をしてくれました。
便利だなと思ったのですが、ここで疑問が。&lt;/p&gt;
&lt;p&gt;今回は対象とするプロジェクトは&lt;code&gt;poetry&lt;/code&gt;で依存パッケージの管理を行っています。
今回、上記を動かすために&lt;code&gt;poetry&lt;/code&gt;に追加されたものは&lt;code&gt;pre-commit&lt;/code&gt;だけでした。
「あれ？&lt;code&gt;black&lt;/code&gt;とかはどこにあって、どうやって動いてるんだ？」という疑問が出てきます。
コンフィグファイルにはパスなどの記載をせず、それぞれのgithubリポジトリの記載とバージョンがあるからです。&lt;/p&gt;
&lt;h2 id=&#34;pre-commitが使用するツールのインストール先&#34;&gt;pre-commitが使用するツールのインストール先&lt;/h2&gt;
&lt;p&gt;調べてみたところ、どうやらホームディレクトリにある&lt;code&gt;.cache/pre-commit&lt;/code&gt;に&lt;code&gt;black&lt;/code&gt;などのコマンドが見つかりました。
&lt;code&gt;pre-commit&lt;/code&gt;ツールが設定ファイルを基に、必要なコマンドをgithubからダウンロードしてきて実行時に利用しているようです。
pre-commitは便利なのだけど、せっかくPythonのプロジェクトだしそれぞれのツールはpoetryでpyproject.tomlでバージョンや設定を管理したほうがすっきりするのではないか？ということで、少し調べてみました。&lt;/p&gt;
&lt;p&gt;同じようなことを考えている方がブログを残していてくれました（&lt;a href=&#34;https://rcmdnk.com/blog/2023/02/07/computer-python/&#34;&gt;Pythonレポジトリ用のpre-commit環境を整える&lt;/a&gt;）。
設定をpyproject.tomlに移行し、そのあと、ローカルのpetryで&lt;code&gt;black&lt;/code&gt;などのコマンド類をインストールして利用する設定に書き換えています。
先人の肩に乗っかって、手元で同じように&lt;code&gt;pre-commit&lt;/code&gt;の設定ファイルの&lt;code&gt;repo&lt;/code&gt;を&lt;code&gt;local&lt;/code&gt;に書き換えていき（&lt;a href=&#34;https://github.com/johtani/search-research/commit/565f5ad84bf1006659047c8d23014b5b0502b03a&#34;&gt;その時のコミット&lt;/a&gt;）、ターミナルで&lt;code&gt;poetry run pre-commit run -a&lt;/code&gt;で動作確認できました。&lt;/p&gt;
&lt;h2 id=&#34;pycharmでコミットしたらエラー&#34;&gt;PyCharmでコミットしたらエラー&lt;/h2&gt;
&lt;p&gt;ですが、実際に変更した状態でPyCharmからコミットしたら、コマンドが見つかりませんというエラーが出ます。。。
WSL2のターミナルで&lt;code&gt;git commit&lt;/code&gt;した場合は問題ありません。
どうして？となりますよね。。。。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.git/hooks/pre-commit&lt;/code&gt;はPyCharm、ターミナルのどちらからも実行されています。
ですが、PyCharmではblackなどが見つからないというエラーが出ました。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.git/hooks/pre-commit&lt;/code&gt;を見てみると、python実行するためのpythonのパスはプロジェクトにある&lt;code&gt;.venv/bin/python&lt;/code&gt;を指定しています。
デバッグのために、このスクリプトに&lt;code&gt;echo $PATH&lt;/code&gt;を差し込んで、git commitをPyCharmとターミナルからそれぞれ実行してみたところ、大きな違いがあります。&lt;/p&gt;
&lt;p&gt;ターミナルで実行した場合は、&lt;code&gt;&amp;lt;プロジェクトのディレクトリ&amp;gt;/.venv/bin&lt;/code&gt;もPATH環境変数に存在していました。このため、&lt;code&gt;.venv/bin&lt;/code&gt;にある&lt;code&gt;black&lt;/code&gt;などを実行できています。&lt;/p&gt;
&lt;p&gt;PyCharmはWindowsから起動しています。プロジェクトのインタプリタとしては、WSL2のUbuntuにある&lt;code&gt;.venv/bin/python&lt;/code&gt;を指定しているためもあり（？）、出力されたパスは&lt;code&gt;/mnt/c/&lt;/code&gt;などのWindowsのパスなども入っていたりしますが、&lt;code&gt;&amp;lt;プロジェクトのディレクトリ&amp;gt;/.venv/bin&lt;/code&gt;は見つかりません。&lt;/p&gt;
&lt;p&gt;ここからはソースコードは読んでいないので憶測ですが、&lt;code&gt;.git/hooks/pre-commit&lt;/code&gt;で呼び出されている&lt;code&gt;pre-commit&lt;/code&gt;ツール（Python製）は、設定ファイルで指定されたコマンド（&lt;code&gt;black&lt;/code&gt;など）を、コマンドとして今の呼び出されたコンテキストで実行しているのではないかということです。
実際、ターミナル上でも&lt;code&gt;source .venv/bin/activate&lt;/code&gt;を実行していない状態だとコマンドが見つからないというエラーが出ました。&lt;/p&gt;
&lt;h2 id=&#34;対処方法は&#34;&gt;対処方法は？&lt;/h2&gt;
&lt;p&gt;ということで、今考えられる対処方法としては次の通りです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;.git/hooks/pre-commit&lt;/code&gt;のスクリプトを修正して、&lt;code&gt;&amp;lt;プロジェクトのディレクトリ&amp;gt;/.venv/bin&lt;/code&gt;のパスを見えるようにする&lt;/li&gt;
&lt;li&gt;PyCharmで何かしらの設定を探す&lt;/li&gt;
&lt;li&gt;PyCharmではgit操作しない&lt;/li&gt;
&lt;li&gt;&lt;code&gt;repo:local&lt;/code&gt;はあきらめて、&lt;code&gt;.pre-commit-config.yaml&lt;/code&gt;で&lt;code&gt;black&lt;/code&gt;などは管理して、&lt;code&gt;pyproject.toml&lt;/code&gt;からは除外する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;1.ですが、&lt;code&gt;.git/hooks/pre-commit&lt;/code&gt;は&lt;code&gt;precommit intall&lt;/code&gt;を実行すると自動で生成されるスクリプトです。自分の環境で書き換えたとしても他の人が同じ環境を作るときにパッチを当てるなどをしないといけなくなります。&lt;/p&gt;
&lt;p&gt;2.はそれらしい設定を見つけることができませんでした。&lt;/p&gt;
&lt;p&gt;3.はめんどくさいですよね。。。ターミナルでgitのコメントを日本語で書くためにいくつか他の設定を考えないといけないです。。。&lt;/p&gt;
&lt;p&gt;ということで、今回は4.の対処をとりました。やりたいことは、ツールや環境をそろえるのではなく、プロジェクトでやりたいことをやることなので。。。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;最終的には元に戻ってしまいました（&lt;code&gt;pyproject.toml&lt;/code&gt;に設定周りは移動した）。
Windows環境がちょっとややこしくしてるかもな？というのと、個人のプロジェクトなのでそこまで気にしなくてもいいのでは？というのもありそうです。
それにしても、世の中の皆さんはフォーマッターとかどのタイミングで動かしてるんだろう？とかどういう環境構築してるんだろう？とか気になってます。
最近だとこういうディレクトリ構造にする、こういうツールを使うと便利などあれば、コメントいただけると嬉しいです。&lt;/p&gt;
&lt;p&gt;教えてもらったISIDのブログ（&lt;a href=&#34;https://tech.isid.co.jp/entry/2023/05/02/Dev_Container%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%83%90%E3%82%A4%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%A7%E4%BD%9C%E3%82%8BPython%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1&#34;&gt;Dev Containerを使ってステップバイステップで作るPythonアプリケーション開発環境 - ISID テックブログ&lt;/a&gt;）も参考にさせてもらおうと思ってるところです。Pythonの環境をコンテナに移動したいなぁというのもあるので。ただ、PyCharmだからこのブログの通りには行かないけど（VS Codeに移るのも検討したほうがいいのかなぁ）。&lt;/p&gt;
&lt;h2 id=&#34;参考サイト&#34;&gt;参考サイト&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF&#34;&gt;Git - Git フック&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pre-commit.com/&#34;&gt;pre-commit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://rcmdnk.com/blog/2023/02/07/computer-python/&#34;&gt;Pythonレポジトリ用のpre-commit環境を整える&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://tech.isid.co.jp/entry/2023/05/02/Dev_Container%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%83%90%E3%82%A4%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%A7%E4%BD%9C%E3%82%8BPython%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1&#34;&gt;Dev Containerを使ってステップバイステップで作るPythonアプリケーション開発環境 - ISID テックブログ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>今年もオンラインでBerlin Buzzwordsに参加した</title>
      <link>https://blog.johtani.info/blog/2023/06/21/attend-berlin-buzzwords-2023/</link>
      <pubDate>Wed, 21 Jun 2023 01:30:45 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2023/06/21/attend-berlin-buzzwords-2023/</guid>
      <description>&lt;p&gt;今年もこの季節がやってきました。
&lt;a href=&#34;https://2023.berlinbuzzwords.de/&#34;&gt;Berlin Buzzwords&lt;/a&gt;にオンラインで出張してました。
今年もハイブリッド開催をしてくれたので、オンラインで参加できました。
現地ではブースが出たり、朝食なども用意されているようでした。今年は昨年と違いマスク必須でもなくなったようです。
&lt;a href=&#34;https://mices.co/&#34;&gt;MICES&lt;/a&gt;も去年同様、現地開催のみのようです（今見たら、&lt;a href=&#34;https://mices.co/mices_eu_2022/index.html&#34;&gt;昨年のビデオとスライドが公開されてる&lt;/a&gt;ので、時間見つけてみてみよう）。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今年もこの季節がやってきました。
&lt;a href=&#34;https://2023.berlinbuzzwords.de/&#34;&gt;Berlin Buzzwords&lt;/a&gt;にオンラインで出張してました。
今年もハイブリッド開催をしてくれたので、オンラインで参加できました。
現地ではブースが出たり、朝食なども用意されているようでした。今年は昨年と違いマスク必須でもなくなったようです。
&lt;a href=&#34;https://mices.co/&#34;&gt;MICES&lt;/a&gt;も去年同様、現地開催のみのようです（今見たら、&lt;a href=&#34;https://mices.co/mices_eu_2022/index.html&#34;&gt;昨年のビデオとスライドが公開されてる&lt;/a&gt;ので、時間見つけてみてみよう）。&lt;/p&gt;
&lt;p&gt;今年はうれしいことに検索に絡むセッションが大多数でした。世の中的にChatGPTの盛り上がりやベクトル検索がいろんな検索エンジンで使えるようになってきたこともあり、
大規模言語モデルと検索エンジン、ベクトルデータベースに関する話がたくさんありました（昨年まではKafkaやストリーム処理の話も多かったんですが）。&lt;/p&gt;
&lt;p&gt;ということで、今年もセッションを見ながら残したメモを公開しておきます。&lt;/p&gt;
&lt;h2 id=&#34;簡単にメモ&#34;&gt;簡単にメモ&lt;/h2&gt;
&lt;h3 id=&#34;what-defines-the-open-in-open-ai&#34;&gt;What defines the “open” in “open AI”?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ：&lt;a href=&#34;https://program.berlinbuzzwords.de/berlin-buzzwords-2023/talk/BKUVLR/&#34;&gt;What defines the “open” in “open AI”?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;動画： &lt;a href=&#34;https://www.youtube.com/watch?v=RSRHSlQiKJ4&#34;&gt;Jennifer Ding - What defines the &amp;ldquo;open&amp;rdquo; in &amp;ldquo;open AI&amp;rdquo;? - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;ldquo;OpenAI&amp;quot;の話ではなく、オープンなAIとは？という話で、ライセンスの話であったり、コミュニティ（データセットの公開とかベンチマークの共有とか）に関する話であったり。
後半は気を抜いてしまって話をうまく聞き取れてないので、興味がある方はビデオで。。。&lt;/p&gt;
&lt;h3 id=&#34;vectorize-your-open-source-search-engine&#34;&gt;Vectorize Your Open Source Search Engine&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ：&lt;a href=&#34;https://program.berlinbuzzwords.de/berlin-buzzwords-2023/talk/VUGYME/&#34;&gt;Vectorize Your Open Source Search Engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;動画： &lt;a href=&#34;https://www.youtube.com/watch?v=U7PQNyeQrXQ&#34;&gt;Atita Arora - Vectorize Your Open Source Search Engine - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ベクトル検索が流行ってきてるけど、これまでの検索（エンジン）に対して、どうやってベクトル検索を取り入れる？という話です。
ベクトル検索ってどんなもので、どういうことの助けになりそうか？じゃあ、どうやって、これまでの検索が改善したかを見ていくのか？
という、これからベクトル検索を取り入れようとしている時にどのようなアーキテクチャにして、
どのような考慮するポイント（モデルの選択とかスケーラビリティとか）にどんなものがあるのか？といった紹介でした。
ざっくりですが、ベクトル検索やるのにどんなことをやっていけばよいのか？という地図になるようなセッションでした。&lt;/p&gt;
&lt;h3 id=&#34;supercharging-your-transformers-with-synthetic-query-generation-and-lexical-search&#34;&gt;Supercharging your transformers with synthetic query generation and lexical search&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ： &lt;a href=&#34;https://program.berlinbuzzwords.de/berlin-buzzwords-2023/talk/ZQ9CPX/&#34;&gt;Supercharging your transformers with synthetic query generation and lexical search&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;動画： &lt;a href=&#34;https://www.youtube.com/watch?v=QfNkJIWCZc4&#34;&gt;Milind Shyani - Supercharging your transformers with synthetic query generation and lexical search - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AWSの人の話でした。こちらもトランスフォーマーが検索に使えると便利だよねという話なのですが。
LLMを使うと高コストでサイズがどんどん大きくなっていて、小さな学習済みのモデルだといまいちな精度でだし、
ファインチューニングしたい場合、ドメインに特化したデータはなかなかないよね。とくにデータ（検索したいもの）はあるけど、クエリがないということがよくあるよね。
そこで、LLMを使って、データからクエリを作って、正解データを作り、それでファインチューニングすればいいのでは？
ということで、やってみました、どうでしたという話でした。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://opensearch.org/blog/semantic-science-benchmarks/&#34;&gt;ブログ&lt;/a&gt;などもあるので参考にすると面白いかも&lt;/p&gt;
&lt;h3 id=&#34;the-debate-returns-with-more-vectors-which-search-engine&#34;&gt;The Debate Returns (with more vectors) Which Search Engine?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ：&lt;a href=&#34;https://program.berlinbuzzwords.de/berlin-buzzwords-2023/talk/73UNZD/&#34;&gt;The Debate Returns (with more vectors) Which Search Engine?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;動画：&lt;a href=&#34;https://www.youtube.com/watch?v=iI40L4wMtyI&#34;&gt;Charlie Hull - The Debate Returns (with more vectors) Which Search Engine? - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今年も検索エンジンの人を集めてパネルディスカッションです。今年は次の方たちが参加してディスカッションでした。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参加者
&lt;ul&gt;
&lt;li&gt;Jo：Vespaの人。ランキングとかがよくできてるからVespa好き&lt;/li&gt;
&lt;li&gt;Alessandro：Apache Solrの人。SolrのPMCメンバー。なんでSolr？Pure OSSだし。スケーラブルだ&lt;/li&gt;
&lt;li&gt;Etienne：Weaviateの人。新しいAI nativeなベクトルデータベース&lt;/li&gt;
&lt;li&gt;Philipp：Elasticの人。&lt;/li&gt;
&lt;li&gt;Kacper：Qdrantの人。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;質問は次のようなものでした。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最初の質問：スケールの話。スケールアウトかな？&lt;/li&gt;
&lt;li&gt;2つ目の質問：どんなアプリケーションが適していないか？&lt;/li&gt;
&lt;li&gt;3つ目の質問：どうやってAIをサポートできるの？&lt;/li&gt;
&lt;li&gt;4つ目の質問：どうやってコミュニティにアプローチしてる？&lt;/li&gt;
&lt;li&gt;5つ目の質問：自分の検索エンジンが使えない時に何を使う？&lt;/li&gt;
&lt;li&gt;6つ目の質問：今後に何が面白そう？&lt;/li&gt;
&lt;li&gt;最後の質問：あなたの検索エンジンが使われてるユースケースで一番好きなものは？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2つ目や5つ目の質問が面白いですよね。実際の内容はぜひビデオを見ていただくのがいいかと（メモも取ったけど、聞いてもらうほうが面白そうだし）。&lt;/p&gt;
&lt;h3 id=&#34;whats-coming-next-with-apache-lucene&#34;&gt;What&amp;rsquo;s coming next with Apache Lucene?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ：&lt;a href=&#34;https://program.berlinbuzzwords.de/berlin-buzzwords-2023/talk/NNNZ8W/&#34;&gt;What&amp;rsquo;s coming next with Apache Lucene?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;動画：&lt;a href=&#34;https://www.youtube.com/watch?v=EHJjSYWjIF0&#34;&gt;Uwe Schindler - What&amp;rsquo;s coming next with Apache Lucene? - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;毎年恒例Uweさん。今年Luceneが25周年という話で、これまでの進化の話を駆け足でしてくれました。
あとは、後半は来週9.7が出るよということで、9.7で入ってくるベクトルの距離計算の最適化に関して説明してくれています。
次のバージョンのElasticsearchでもこの最適化が使えるようになるという話もされていましたので、ベクトル検索を使ってる方は、次のバージョンも楽しみですね。&lt;/p&gt;
&lt;h3 id=&#34;building-mlops-infrastructure-at-japans-largest-c2c-e-commerce-site&#34;&gt;Building MLOps Infrastructure at Japan&amp;rsquo;s Largest C2C E-Commerce Site&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ：&lt;a href=&#34;https://program.berlinbuzzwords.de/berlin-buzzwords-2023/talk/YLCZP8/&#34;&gt;Building MLOps Infrastructure at Japan&amp;rsquo;s Largest C2C E-Commerce Site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;動画：&lt;a href=&#34;https://www.youtube.com/watch?v=11xxPUSJTss&#34;&gt;Berlin Buzzwords 2023： Building MLOps Infrastructure at Japan&amp;rsquo;s Largest C2C E-Commerce Site - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;メルカリの検索システムに関係しているMLOps周りがどうやって進化してきたのか？という話でした。
英語にいらすとやの絵があるスライドがドイツで使われているのがとても新鮮ですｗ&lt;/p&gt;
&lt;h3 id=&#34;highly-available-search-at-shopify&#34;&gt;Highly Available Search at Shopify&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ：&lt;a href=&#34;https://program.berlinbuzzwords.de/berlin-buzzwords-2023/talk/N9JRVC/&#34;&gt;Highly Available Search at Shopify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;動画：&lt;a href=&#34;https://www.youtube.com/watch?v=iqWlQbzT-DM&#34;&gt;Khosrow Ebrahimpour - Highly Available Search at Shopify - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Shopifyの検索プラットフォームチームの人の、Shopifyの検索プラットフォームがどういったものか？（EsとKafka使ってる）どんな工夫をしているか？という話です。
Kubeconでも他の同僚の方が話をされている見たいで、そちらも参考になるとのことでした（&lt;a href=&#34;https://www.youtube.com/watch?v=a0aNdOUDqhA&#34;&gt;動画&lt;/a&gt;）。
スキーマ変更時の話とかもあり、実践的でした。最後に将来的な話でやはりベクトル検索というキーワードが出てきていました。あとは、データ量が大きいのでスケーリングの挑戦もあるとのこと。&lt;/p&gt;
&lt;h3 id=&#34;using-dense-vector-search-at-the-eu-publications-office&#34;&gt;Using Dense Vector search at the EU Publications Office&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ：&lt;a href=&#34;https://program.berlinbuzzwords.de/berlin-buzzwords-2023/talk/K8AR9R/&#34;&gt;Using Dense Vector search at the EU Publications Office&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;動画：&lt;a href=&#34;https://www.youtube.com/watch?v=V_qzTDL11DU&#34;&gt;Martin Bayton - Using Dense Vector search at the EU Publications Office - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;EUのPublication Office（日本だと公文書館とかになるのかなぁ？）の検索サービスで、Googleみたいなこと（検索結果の上にスニペットが出たり、そこにハイライトされたり）をやってみたいよね？という話みたいでした。実際公開してるかはわからないですが、途中からはPureinsightsという会社のプラットフォームで似たようなことをやるデモになってました。&lt;/p&gt;
&lt;p&gt;Googleでも12%のクエリが、質問の自然文になっているという話で、検索結果にナレッジグラフからの情報（スニペットとか、質問に対する答えとか、地図とか）が出るようになってきていますと。
それをPublication Officeのデータで再現したデモを行った後に、どんな感じのアーキテクチャなのか？という概略を説明されています。国会図書館とかの検索サービスやってる方が興味を持ったりするかもなーと思ったり、思わなかったり？&lt;/p&gt;
&lt;h3 id=&#34;learning-to-hybrid-search&#34;&gt;Learning to hybrid search&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ：&lt;a href=&#34;https://program.berlinbuzzwords.de/berlin-buzzwords-2023/talk/FKKNBD/&#34;&gt;Learning to hybrid search&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;動画：&lt;a href=&#34;https://www.youtube.com/watch?v=TBGkis0U1bg&#34;&gt;Berlin Buzzwords 2023： Learning to hybrid search - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これまたキーワード検索とセマンティック検索のハイブリッドの話です。
よくハイブリッド検索というのを聞きますが、データだったりベンチマークなどの話があまりないですよね？昨年&lt;a href=&#34;https://github.com/amazon-science/esci-data&#34;&gt;AmazonがECSIというデータセットを公開&lt;/a&gt;したりしています（&lt;a href=&#34;https://zenn.dev/rejasupotaro/articles/321b62c83a5d66&#34;&gt;rejasupotaroさんが年末に書かれた記事にも出てきていました&lt;/a&gt;）。
これにLearn to Rankとかもテストできるような&lt;a href=&#34;https://github.com/shuttie/esci-s&#34;&gt;データ（レビューや評価、カテゴリーとか）を拡張したもの&lt;/a&gt;を作って、それをもとにいろいろとハイブリッド検索で精度を測ってみたというお話でした。
&lt;a href=&#34;https://www.metarank.ai/&#34;&gt;Metarank&lt;/a&gt;というリランキングエンジンの会社の方たちで、Metarankを使ってハイブリッドな検索結果のリランキングで精度がどのように上げられるか？という話です。
&lt;a href=&#34;https://trec-product-search.github.io/&#34;&gt;今年のTRECのProduct Search Track&lt;/a&gt;の話もされていました。
&lt;a href=&#34;https://blog.metarank.ai/from-zero-to-semantic-search-embedding-model-592e16d94b61&#34;&gt;これが元ネタのブログかな？&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;catch-the-fraud--with-observability-and-analytics&#34;&gt;Catch the fraud — with observability and analytics&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ：&lt;a href=&#34;https://program.berlinbuzzwords.de/berlin-buzzwords-2023/talk/HAKWWW/&#34;&gt;Catch the fraud — with observability and analytics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;動画：まだ？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最後は元同僚のセッションです。こちらは検索ではなく、ちょっと自虐的なネタをもとにしたオブザバビリティおよび分析のお話です。
コミュニティの人たちの貢献（ブログ書いたりプルリク送ったり、どこかで話をしたり）を計測して、年間の貢献者に対してプレゼントを上げるというのをやっているみたいです。
で、昨年の最も貢献した人にMac Bookをプレゼントするというすばらしい（&lt;del&gt;暴挙&lt;/del&gt;）話で、チートしようとした人がいてそれを分析した話でしたｗ
締め切り直前に信じられない量の貢献したという登録がブラジルからあり、何かおかしいよね？ということで、Elastic Stackのオブザバビリティの機能などを元に分析してチートした人を除外していったよという話でした。
Kibanaが使いやすくなってるのがわかるセッションで面白かったです。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;検索がまたすごく盛り上がってきたなーという時間があるカンファレンスでした。みんな似たような話（ベクトル検索、LLM、AIなど）だったりしますが、
知らないプロダクトで興味が出てくるものもあったし、Amazonのデータセットがあるからいろいろ試してみることもできそうだなぁと。&lt;/p&gt;
&lt;p&gt;すでにビデオが公開されはじめているので、気になったセッションのビデオも見てから後日またブログを書こうとおもいます
（たぶん、一覧が作成されるので後日リンクを貼っておきます）。&lt;/p&gt;
&lt;p&gt;来年の予定（6月11日から開催）も公開されていましたし。来年も楽しみですね。
来年はプロダクションでベクトル検索やってみた話とかがさらに出てくるのかなぁ？&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>今年の振り返りと来年の抱負（2022）</title>
      <link>https://blog.johtani.info/blog/2022/12/31/review-2022/</link>
      <pubDate>Sat, 31 Dec 2022 20:38:04 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2022/12/31/review-2022/</guid>
      <description>&lt;p&gt;今年もなんとか振り返りブログを書いてます（時間大丈夫かな？w）。紅白をリアタイで見ながら。&lt;/p&gt;
&lt;h2 id=&#34;振り返り2021年に書いた抱負から&#34;&gt;振り返り（2021年に書いた抱負から）&lt;/h2&gt;
&lt;p&gt;まずは振り返りをと。&lt;/p&gt;
&lt;h3 id=&#34;フリーランス継続&#34;&gt;フリーランス継続&lt;/h3&gt;
&lt;p&gt;ありがたいことに個人事業主として今年も１年乗り越えられました。
ZOZOさんには引き続きお世話になっている感じです。
10月からは今月末まで別のお客さんを手伝っていたりという感じでした（アップグレードの手伝いとか）。
相変わらず完全リモートで作業をさせていただいてます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今年もなんとか振り返りブログを書いてます（時間大丈夫かな？w）。紅白をリアタイで見ながら。&lt;/p&gt;
&lt;h2 id=&#34;振り返り2021年に書いた抱負から&#34;&gt;振り返り（2021年に書いた抱負から）&lt;/h2&gt;
&lt;p&gt;まずは振り返りをと。&lt;/p&gt;
&lt;h3 id=&#34;フリーランス継続&#34;&gt;フリーランス継続&lt;/h3&gt;
&lt;p&gt;ありがたいことに個人事業主として今年も１年乗り越えられました。
ZOZOさんには引き続きお世話になっている感じです。
10月からは今月末まで別のお客さんを手伝っていたりという感じでした（アップグレードの手伝いとか）。
相変わらず完全リモートで作業をさせていただいてます。&lt;/p&gt;
&lt;p&gt;ただ、来年は今の所、余力がある感じになっているので、新しい仕事を見つけたいところだなあという感じです。
検索で何かお手伝いできることあれば、気軽にお声がけいただければと。&lt;/p&gt;
&lt;h3 id=&#34;プログラミング&#34;&gt;プログラミング&lt;/h3&gt;
&lt;p&gt;Linderaの大須賀さんのおかげで、レビューは定期的にやらせていただいてますw
業務がっつりというほどではないのですが、検証用のコードを書いたりはしています。&lt;/p&gt;
&lt;p&gt;個人用では、&lt;a href=&#34;https://blog.johtani.info/blog/2022/12/15/music-server-on-mac-mini/&#34;&gt;BGM環境&lt;/a&gt;のためにシェルを書いたり、文字化けしてるデータを解析したりするのにコードを書いてますが、もうちょっと量を増やしたいところです。
コードがっつり書く仕事をやらせてもらうのとかやらせてもらうのがいいかもなぁ。&lt;/p&gt;
&lt;p&gt;書くよりもどうしても読むほうが多くなってる気がします。&lt;/p&gt;
&lt;h3 id=&#34;ブッチャー本ちゃんと読む&#34;&gt;ブッチャー本ちゃんと読む&lt;/h3&gt;
&lt;p&gt;全部ではないですが、ZOZOさんで輪読をしたりしていました。
が、自分で全部読むといったところまではできてないです。&lt;/p&gt;
&lt;h3 id=&#34;読んだ本のブログを書く&#34;&gt;読んだ本のブログを書く&lt;/h3&gt;
&lt;p&gt;これはできてないですね。
読むのはちょとちゃってるんですが、ブログを書くところまではできてない。
メモとりながら読みたいですね。&lt;/p&gt;
&lt;h2 id=&#34;振り返り今年あったできごと&#34;&gt;振り返り(今年あったできごと)&lt;/h2&gt;
&lt;p&gt;ここからは今年の出来事を。
今年もずっと自宅で仕事した。来年は出張とかできるのかなあ？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自宅環境&lt;/li&gt;
&lt;li&gt;今年もDIY&lt;/li&gt;
&lt;li&gt;検索ペンギン本が出版された&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;仕事場を模様替えしました。
今年もずっとWindows環境をメインで仕事をしていました。
年末まではM1 Macを借りて作業するという経験もできたのでよかったです。
今年仕事の環境は少し変わって、AVアンプ（譲り受けたもの）＋Polk Audioのスピーカーで音が良くなりましたw
あと、机の天板を大きくして、作業がやりやすくなりました。写真はそのうち。&lt;/p&gt;
&lt;p&gt;仕事場の模様替えにもなるのですが、今年のDIYは&lt;a href=&#34;https://labrico.jp/&#34;&gt;ラブリコ&lt;/a&gt;＋有孔ボードでケーブルやキーボードをすっきり片付けられる環境を作ってみました。
壁を有効活用できるのはよかったです。こちらについては、別途ブログを書こうと思います。&lt;/p&gt;
&lt;p&gt;今年最大のニュースは検索ペンギン本を出版したことです。
声をかけていただいた打田さんには感謝です。著者の皆さん検索システムを色々と手掛けられているので良い本になったと思います。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.lambdanote.com/collections/ir-system&#34;&gt;『検索システム ― 実務者のための開発改善ガイドブック』 – 技術書出版と販売のラムダノート&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;おー、届いたー &lt;a href=&#34;https://t.co/RbY5tOe9GB&#34;&gt;pic.twitter.com/RbY5tOe9GB&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1526374390149292032?ref_src=twsrc%5Etfw&#34;&gt;May 17, 2022&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;いろんなところで輪読も開催されているようで、顔を出してみたいなぁ。
輪読やってます！外部の人を呼んでもOKという方がいたら、参加してみたいのでTwitterでメンションしてもらえると嬉しいです。&lt;/p&gt;
&lt;h2 id=&#34;来年の抱負&#34;&gt;来年の抱負&lt;/h2&gt;
&lt;p&gt;ということで、来年の抱負です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;フリーランス継続&lt;/li&gt;
&lt;li&gt;プログラミング&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;p&gt;プログラミングは、家の音楽ファイルの文字化けを直すプログラムをもう少しちゃんと書いてからブログを書きたいなと。まぁ、個人的なプログラムなので誰も嬉しくないかもですが（色々検討した結果Javaで書いてる）。
あとは、&lt;a href=&#34;https://www.oreilly.co.jp/books/9784814400041/&#34;&gt;オライリーさんの初めてのGo言語&lt;/a&gt;を買ったのもあるので、&lt;a href=&#34;https://github.com/johtani/bulk2es-rs&#34;&gt;前にRustで書いたElasticsearchへのBulk登録のツール&lt;/a&gt;をGoで書いてみようかなと考えているところです。みんなはデータ登録するときはどうしてるんだろう？&lt;/p&gt;
&lt;p&gt;NLPでBERTなどによる目まぐるしい進歩の影響もあり、ベクトル検索やセマンティック検索といった検索技術が各社から出て来ています。
ElasticsearchでもGAされたのもあり、今後ますます注目を浴びる技術になるのだろうなと。
ただ、これまでの検索とどう組み合わせるのがいいのか？どう言ったメリットデメリットがあるのか？向き不向きは？といったものもあるので、仕組みを調べながら色々と試行錯誤してみたいと思っています。&lt;/p&gt;
&lt;p&gt;さいごは、毎年書いてる気もしますが、本を読むのもやらんとなぁ。
あたらしいネタを仕入れては実践できる時間もとりつつ、他のことにも目を向けたいと思っています。&lt;/p&gt;
&lt;p&gt;今年は仕事の変化も少し出て来ているので、来年は新しいことをいくつかやってみたいところです。
あとは、外に出る機会が増やせるといいなぁ、少しずつ人から刺激をもらいたいと思っています。&lt;/p&gt;
&lt;p&gt;さて、今年は年内に無事描き終わりました。
来年もよろしくお願いいたします、良い年にしたいなー。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>仕事中のBGM環境</title>
      <link>https://blog.johtani.info/blog/2022/12/15/music-server-on-mac-mini/</link>
      <pubDate>Thu, 15 Dec 2022 00:05:58 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2022/12/15/music-server-on-mac-mini/</guid>
      <description>&lt;p&gt;PySpaアドベントカレンダーの12/15のエントリーです。昨日は&lt;a href=&#34;https://blog.satotaichi.info/working-area/&#34;&gt;taichiさん&lt;/a&gt;でした。
今年はDIYではなく、PCにまつわる話を。&lt;/p&gt;
&lt;h2 id=&#34;仕事中はbgmが基本&#34;&gt;仕事中はBGMが基本&lt;/h2&gt;
&lt;p&gt;フリーランスを始めて（2020年初頭）からすぐに、自宅で仕事をする情勢になりました。
打合せをしていないとき、カンファレンスの発表などの動画を見ていないときは基本的にBGMをかけて作業をしています。
音源としては、CDなどから音楽ファイルにしたり、AmazonやSonyのサイトで購入した音楽ファイルなどがNASにあります。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;PySpaアドベントカレンダーの12/15のエントリーです。昨日は&lt;a href=&#34;https://blog.satotaichi.info/working-area/&#34;&gt;taichiさん&lt;/a&gt;でした。
今年はDIYではなく、PCにまつわる話を。&lt;/p&gt;
&lt;h2 id=&#34;仕事中はbgmが基本&#34;&gt;仕事中はBGMが基本&lt;/h2&gt;
&lt;p&gt;フリーランスを始めて（2020年初頭）からすぐに、自宅で仕事をする情勢になりました。
打合せをしていないとき、カンファレンスの発表などの動画を見ていないときは基本的にBGMをかけて作業をしています。
音源としては、CDなどから音楽ファイルにしたり、AmazonやSonyのサイトで購入した音楽ファイルなどがNASにあります。&lt;/p&gt;
&lt;h3 id=&#34;今年10月までの環境&#34;&gt;今年10月までの環境&lt;/h3&gt;
&lt;p&gt;2020年の後半に次のような環境を構築して今年の10月まで使っていました。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;LibreELECをラズパイ4に入れて、Kodiのリモコンをスマホに入れたら快適になった&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1318412334138761217?ref_src=twsrc%5Etfw&#34;&gt;October 20, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;&lt;a href=&#34;https://kodi.tv/&#34;&gt;KODI&lt;/a&gt;と呼ばれるマルチメディアセンター？のようなソフトで、それを動かす最小限のOSとして、&lt;a href=&#34;https://wiki.libreelec.tv/&#34;&gt;LibreELEC&lt;/a&gt;が公開されています。
これをラズパイ4に入れて、NASからファイルをSSDにコピーしてそれをラズパイに接続して音楽を聞いていました。
毎回ラズパイの画面を見に行くのも面倒なので、再生などの操作には&lt;a href=&#34;https://play.google.com/store/apps/details?id=org.xbmc.kore&#34;&gt;Android用のKodiのリモコンアプリ&lt;/a&gt;を使っていました。&lt;/p&gt;
&lt;p&gt;場所も取らないのでよかったのですが、使っているといくつか問題点が。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;時々調子悪（音が出ない、リモコンからつながらない、無反応など）くなって、ラズパイ再起動&lt;/li&gt;
&lt;li&gt;音楽ファイルを購入して増えた時に、外付けSSDを取り外してPCでコピーしたり&lt;/li&gt;
&lt;li&gt;スマホじゃないと再生できない（PCのクライアントもあったのかもだけど調べてなかった）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;ubuntu-on-mac-mini&#34;&gt;Ubuntu on Mac mini&lt;/h2&gt;
&lt;p&gt;10月に模様替えをして、2012年製のMac Miniが宙ぶらりんになりました。
さすがに古いしメインマシンがWindowsになっているのもあり、macOSである必要も特にないので、Ubuntu 22.04を入れて何かに使えるのでは？と。
また、1TBのSSDに内臓ディスクを乗せ換えていたのもあり、音楽再生に使ってみようということに。
なので、Kodiの環境で困っていた点も考慮して、ほしい機能を元にちょっと探してみました。&lt;/p&gt;
&lt;h3 id=&#34;音楽再生-on-ubuntu&#34;&gt;音楽再生 on Ubuntu&lt;/h3&gt;
&lt;p&gt;音楽再生でほしい要件としては次のようなものです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ubuntuで音楽再生できるソフト（あたりまえ）&lt;/li&gt;
&lt;li&gt;PCから操作したい（できればブラウザ）&lt;/li&gt;
&lt;li&gt;音楽ファイルの更新（ローカルでもいいけどNASからもってきたり）&lt;/li&gt;
&lt;li&gt;日本語の曲情報も表示&lt;/li&gt;
&lt;li&gt;対象音楽ファイルが豊富（そんなに制限があるものはないだろうなぁ）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上記の要件をもとに適当にググって見つけてきたのが&lt;a href=&#34;https://owntone.github.io/owntone-server/&#34;&gt;OwnTone&lt;/a&gt;というソフトでした。&lt;/p&gt;
&lt;h3 id=&#34;owntone&#34;&gt;OwnTone&lt;/h3&gt;
&lt;p&gt;OwnToneの説明は公式サイトを見ていただくとして、OwnToneにしてよかったなというのが以下の点です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インストールが簡単（&lt;a href=&#34;https://owntone.github.io/owntone-server/installation/#quick-version-for-debianubuntu-users&#34;&gt;apt-getでインストールできる&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://owntone.github.io/owntone-server/library/#supported-formats&#34;&gt;サポートフォーマットが豊富&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Web UIがついてる（ブラウザで見えるし、スマホでもOK。どのブラウザから見ても今の状況も分かる）&lt;/li&gt;
&lt;li&gt;簡単だけど検索できる&lt;/li&gt;
&lt;li&gt;プレイリスト対応（ファイルパスを入れるだけ）&lt;/li&gt;
&lt;li&gt;サムネイルとかも出てくる（どうやってんだろう？ｗ）&lt;/li&gt;
&lt;li&gt;AirPlayで再生できる（AVアンプを利用しており、そこにAirPlayで再生できてる）&lt;/li&gt;
&lt;li&gt;OSS（まだソースは見たことないですがｗ）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;再生画面例&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20221215/music-play.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20221215/music-play.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;やっぱ検索も気になるよね？&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;日本語も検索できるな。 &lt;a href=&#34;https://t.co/EF6WHkJKli&#34;&gt;pic.twitter.com/EF6WHkJKli&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1582736512583860225?ref_src=twsrc%5Etfw&#34;&gt;October 19, 2022&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;とりあえず、インストールして画面もすぐに出て操作も簡単で、便利な世の中になったなーと感動しましたｗ&lt;/p&gt;
&lt;p&gt;ただ、音がヘッドフォン端子に刺したアナログ出力先のスピーカーではなく、本体のスピーカーで最初はなってしまいましたｗｗ&lt;br/&gt;
Linuxの音周りが全然わかってない問題が発覚。&lt;/p&gt;
&lt;p&gt;幸い、先週の&lt;a href=&#34;https://aodag.dev/posts/2022-12-09-mpd/&#34;&gt;Pyspa Advent Calendarのエントリーを書いていたaodag先生&lt;/a&gt;に助言をいただき、alsamixerで音の設定を見たところ、ヘッドフォン端子がミュートされていたので、ミュートを外して無事再生できました。
インストール当初はYAMAHAのアクティブスピーカーにJust Mixer経由でヘッドフォン端子（アナログ）で出力して音楽再生をしていました。
今は（この記事を書いてる現時点で）、AVアンプのAirPlayにOwnToneから音を流している形で聞いています（便利なんだけど、当初の想定とは異なる、理由は後述）。&lt;/p&gt;
&lt;h3 id=&#34;ファイルのコピーとか&#34;&gt;ファイルのコピーとか&lt;/h3&gt;
&lt;p&gt;さて、上にも書きましたが、NASにバックアップもかねて音楽ファイルを保存してあります。
新しく買ったファイルもここに置くようになっています。
OwnToneのMac MiniからNASをネットワーク経由で見に行くのもいいのですが、できればローカルにあったほうがネットに影響も出ないなと。&lt;/p&gt;
&lt;p&gt;ということで、定期的にNASをウォッチしてMac Miniにファイルをコピーするようなプログラム（Bashスクリプト）を書いてみました。
毎回購入後に手で実行もめんどくさいので毎日夜中にcron実行するような設定になっています。&lt;/p&gt;
&lt;p&gt;スクリプトの中身は次のような感じです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;findコマンドで特定の日時（最近コピーしたファイルの日付）以降(&lt;code&gt;-newermt&lt;/code&gt;オプション)のファイルのリスト（音楽ファイルの拡張子に限定）を取得&lt;/li&gt;
&lt;li&gt;取得したリストをもとに以下の操作
&lt;ul&gt;
&lt;li&gt;ファイルをコピー&lt;/li&gt;
&lt;li&gt;コピーしたファイルをコピーした日付のプレイリストを作って入れる（プレイリストはパスだけ書けばOK）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mp4&lt;/code&gt;形式だと聞けない端末もあるので、&lt;code&gt;soundconverter&lt;/code&gt;コマンドで&lt;code&gt;mp3&lt;/code&gt;に変換してNASに戻す&lt;/li&gt;
&lt;li&gt;最新のファイルの日付を保存（次回のfindコマンド）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ファイルがあったら、&lt;a href=&#34;https://owntone.github.io/owntone-server/json-api/#trigger-rescan&#34;&gt;OwnToneの再読み込みのエンドポイント&lt;/a&gt;を&lt;code&gt;curl&lt;/code&gt;でキック&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;NASはSambaでマウントして、見えるようにしてあります。
やっぱり、自動化便利ですねぇ。
気に入った曲を買ってNASに入れとけば聞けるようになるのは本当に便利。&lt;/p&gt;
&lt;p&gt;他にもスマートプレイリストとかもあるので、活用しないとな。&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;アナログ出力はaodag先生の助言ですぐに解決したのですが、takabowから譲り受けたAVアンプを導入してから実は音の出力がうまくいっていません。&lt;/p&gt;
&lt;p&gt;HDMI、光端子出力でAVアンプにつなごうとしたのですが、私のUbuntu力（Linux力？）が全然不足しているのでうまくいっていません。ググりつつ、HDMI、光出力で&lt;code&gt;amixer&lt;/code&gt;というコマンドで音声ファイルを鳴らすところまでは行ったのですが、OwnToneに設定するとうまくいかない状況です。
結局、解決してないのですが、AVアンプのAirPlayのレシーバー経由で音楽再生ができてしまったので、とりあえずAirPlayで運用することにしました。時間を見つけてaodag先生の記事を読み直して再チャレンジしないとな（けど、鳴ってるしなぁ、音ｗ）。&lt;/p&gt;
&lt;h3 id=&#34;文字化け問題&#34;&gt;文字化け問題&lt;/h3&gt;
&lt;p&gt;これは、OwnToneというよりはもともとあった問題です。
古い音楽ファイルだったり、Wav形式のファイルなど、様々な形式のファイルを持っています。
音楽サーバーとは別に、音楽ファイルの検索をできるようにしつつ、付加的な情報（Wikimediaなどのデータとか）を付与して、検索できるようにしてみようと思い、音楽ファイルからメタデータを抜き出して、ElasticのApp Searchにいれるデータを作るツールを書いたりしています。
この時にも文字化けに遭遇しました。&lt;/p&gt;
&lt;p&gt;様々な音楽ファイルにはメタデータを付与することができる仕様が決まっています（&lt;a href=&#34;https://ja.wikipedia.org/wiki/ID3%E3%82%BF%E3%82%B0&#34;&gt;ID3タグ - Wikipedia&lt;/a&gt;など）。
ただ、文字コードの情報が入っていなかったり、デフォルトとは違う文字コードでデータを付与したファイルがあったり、いろいろな原因で文字化けしているものがあります。
昨年Amazonで購入したmp3の中にも文字化けしているものもあったりします。Wavファイルに付与されたタグなどは、容赦なくShift-JISだったりしますが、読み込むソフトはUTF-8で読もうとしたり。。。&lt;/p&gt;
&lt;p&gt;検索サーバーにデータを抜き出して入れるツールを書いているときは、元のファイルを変更することなく、抜き出す時点でいくつかの文字化けに対応した処理を書いたのですが、今回のOwnToneで曲を流すと結局、元のファイルをきれいにしないとダメだということに気づきました（すぐわかるだろ。。。）&lt;/p&gt;
&lt;p&gt;ということで、書いている途中のツールをもとに、根本的な文字化けのファイルのメタデータをきれいにするプログラムを書かないといけないなぁと。&lt;/p&gt;
&lt;p&gt;ちなみに、メタデータの抜き出しにはJavaでプログラムを書いており、&lt;a href=&#34;https://jthink.net/jaudiotagger/index.jsp&#34;&gt;JAudiotagger&lt;/a&gt;というライブラリを利用しています。
Pythonや他のJavaのライブラリを試そうとしたのですが、文字コードが決め打ちで抜かれているものが多く、ライブラリから読みだした時点ですでにどうしようもない状態のものが多いといった問題からこのライブラリにたどり着きました（まぁ、まだちゃんとしたものができていないんですけどね）。&lt;/p&gt;
&lt;h3 id=&#34;検索サーバー&#34;&gt;検索サーバー&lt;/h3&gt;
&lt;p&gt;OwnToneのUIはブラウザでうごきます。
検索窓もついています。
が、先ほども書いたように、他にもデータを追加して、いろんな検索をしてみたいなぁと（ドラマに使われてたとか、CMにつかわれてたとか）。
検索が好きでいろいろとやってるので、その辺も遊んでみたいなぁと思っているところです（実際、ElasticのApp SearchにWikidataから生成した類義語を入れてみたりしている）。&lt;/p&gt;
&lt;p&gt;こうやってブログにしてしまったので、課題をつぶしていなかったら、Twitterなどでつついてくださいｗ&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;構成図とかは書かなかったですが、OwnToneを使うと簡単にWeb UIが入った音楽サーバーが使えるようになって、仕事がはかどりますよという記事でした。
他にもこれに関するネタを募集してますので、コメントもらえるとうれしいです（Twitterでメンションも大歓迎）。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>ElasticsearchクライアントライブラリとSpecification</title>
      <link>https://blog.johtani.info/presentation/2022/elasticsearch-specification/</link>
      <pubDate>Wed, 14 Dec 2022 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2022/elasticsearch-specification/</guid>
      <description></description>
      <content:encoded></content:encoded>
    </item>
    
    <item>
      <title>ElasticsearchのアーキテクチャとStateless / Serverless</title>
      <link>https://blog.johtani.info/blog/2022/12/09/open-search-serverless/</link>
      <pubDate>Fri, 09 Dec 2022 01:15:25 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2022/12/09/open-search-serverless/</guid>
      <description>&lt;p&gt;本記事は&lt;a href=&#34;https://adventar.org/calendars/7389&#34;&gt;情報検索・検索技術 Advent Calendar 2022&lt;/a&gt;の9日目の記事です。&lt;/p&gt;
&lt;p&gt;だいぶ間が空いてしまいましたが、日本語のオートコンプリートに関する記事の続きです。
という感じで、Suggesterのデータ構造とか仕組みを書こうと思っていたのですが、思ったよりも調べないといけないことが多くて挫折しました。。。
（これの続きは年末年始で調べて書くはず？）&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;本記事は&lt;a href=&#34;https://adventar.org/calendars/7389&#34;&gt;情報検索・検索技術 Advent Calendar 2022&lt;/a&gt;の9日目の記事です。&lt;/p&gt;
&lt;p&gt;だいぶ間が空いてしまいましたが、日本語のオートコンプリートに関する記事の続きです。
という感じで、Suggesterのデータ構造とか仕組みを書こうと思っていたのですが、思ったよりも調べないといけないことが多くて挫折しました。。。
（これの続きは年末年始で調べて書くはず？）&lt;/p&gt;
&lt;p&gt;ということで、代わりにElasticsearch/OpenSearchのアーキテクチャの変更に関してさらっとまとめて&lt;del&gt;お茶を濁して&lt;/del&gt;みようと思います。&lt;/p&gt;
&lt;h2 id=&#34;発端はelasticon-tokyo&#34;&gt;発端はElasticON Tokyo？&lt;/h2&gt;
&lt;p&gt;先週の11月30日に、Elasticのオフラインイベントである&lt;a href=&#34;https://www.elasticon.com/event/d10b9524-5bd9-4355-aa2e-f01b63580506/summary&#34;&gt;ElasticON Tokyo&lt;/a&gt;が開催され参加しました。
参加しようと思ったのは、10月の頭にElasticのブログで公開された「&lt;a href=&#34;https://www.elastic.co/jp/blog/stateless-your-new-state-of-find-with-elasticsearch&#34;&gt;Stateless — your new state of find with Elasticsearch&lt;/a&gt;」というアーキテクチャの変更がきっかけです。&lt;/p&gt;
&lt;p&gt;

&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt61f8925587f3cb80/633d97a8033663117f4ed723/blog-elastic-stateless-1.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt61f8925587f3cb80/633d97a8033663117f4ed723/blog-elastic-stateless-1.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

（図はElasticのブログから引用）&lt;/p&gt;
&lt;p&gt;ElasticsearchはLuceneのインデックスを分散したシステムとしてスケールアウトできるようにするという目的でリリースされました。
インデックスをシャードという単位で複数のElasticsearchのノードにデータを保存し、レプリカを作ることで分散する仕組みを実装していました。
Elasticsearchでは、インデックスのレプリカは、作成したインデックスを定期的にコピーするのではなく、登録するデータがElasticsearchのクラスターにやってきた時に、
データ自体をコピー先にも配り、プライマリーやレプリカとなるシャードがあるノード上でそれぞれインデックスに登録する処理を行うという処理の流れです（&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/guide/current/distrib-write.html&#34;&gt;古いけど、わかりやすい説明はこちら&lt;/a&gt;）。
この場合、インデックスにデータを登録する処理（転置インデックスのデータ構造に変換する処理など）は、レプリカの数だけ同じ処理がクラスター上で発生します。&lt;/p&gt;
&lt;p&gt;この基本的なアーキテクチャをもとに、保持するデータの鮮度（新しいデータのほうが検索頻度が高い、インデックス登録する時はマシンは多く、古くなったデータが入ったインデックスはコストが低いマシンになど）などを元に、クラスター内のノードの特性を異なるものが混在するような複雑な仕組みを作ってきました。
いろいろなデータの持ち方などで多くのデータなどを保持できるようにしてきたのですが、クラスター全体としては、検索の負荷のピークをさばけるような構成を基本的に保持しておくというかんがえです。&lt;/p&gt;
&lt;p&gt;ただ、昨今は必要に応じてスケールアウト（リクエストが増えたりデータ量が増えた時）、スケールイン（夜中は利用者が少ないからクラスターを小さくしたい時）できるような仕組みのほうが求められています。
そこで、発表されたのが上記のブログであり、上図の新しいアーキテクチャです。
計算処理（データを登録、検索する処理）とストレージを分離し、さらに登録する処理と検索する処理も分離した構成です。
このようなアーキテクチャにすることで、登録処理の演算コストがレプリカごとに必要ではなくなり、検索の部分だけだったり、登録の部分だけをスケールアウト・インできるような自由度が手に入ります。
また、ストレージ部分でレプリカを担保（S3とかのオブジェクトストレージで冗長性を担保）できれば、レプリカのストレージコストも必要なくなります。&lt;/p&gt;
&lt;p&gt;というブログが発表されたのですが、詳細などはまだよくわからなかったのでElasticON Tokyoに参加して詳しい話が聞けるのかなぁと期待していました。&lt;/p&gt;
&lt;h2 id=&#34;参加当日の朝のびっくりするニュース&#34;&gt;参加当日の朝のびっくりするニュース&lt;/h2&gt;
&lt;p&gt;11月30日の朝に起きて、出かけようかと思っていたところに、AWSのre:Inventで発表された&lt;a href=&#34;https://aws.amazon.com/jp/blogs/aws/preview-amazon-opensearch-serverless-run-search-and-analytics-workloads-without-managing-clusters/&#34;&gt;ニュース&lt;/a&gt;が舞い込んできました。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;ほー（まだタイトルしか読んでない）&lt;a href=&#34;https://t.co/KK22duaBNH&#34;&gt;https://t.co/KK22duaBNH&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1597738114113753089?ref_src=twsrc%5Etfw&#34;&gt;November 29, 2022&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;Amazon OpenSearchがServerlessオプションを発表というニュースです。
（Amazon OpenSearchとは、AWSがElasticsearchをフォークして始めた検索エンジンで、Amazon OpenSearch Serviceというのは、AWSがそれをSaaSとして提供しているものです）&lt;/p&gt;
&lt;p&gt;まぁ、気になりますよね、「Serverless」ってキーワードに。
ElasticON Tokyoに向かう電車でブログを読んだり、どんな仕組みかを調べたので、それを簡単にまとめておきます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プレビュー段階（Tokyoリージョンではもう試せる）&lt;/li&gt;
&lt;li&gt;これまでのAmazon OpenSearch Serviceとは別（オンザフライで移行はできない？）&lt;/li&gt;
&lt;li&gt;「コレクション」という単位でクラスターを管理（スケールインとかアウトとか）&lt;/li&gt;
&lt;li&gt;コレクションにはタイプがあり、タイムシリーズ（ログとか）か検索のユースケースなのかで使い分ける（&lt;a href=&#34;https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-overview.html#serverless-usecase&#34;&gt;公式ドキュメント&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;インデックス処理と検索処理で計算ユニット（OCU）が別々にスケールできる（下図）&lt;/li&gt;
&lt;li&gt;作成されたインデックスはAmazon S3に保存され、そこで冗長性は担保される。（下図）&lt;/li&gt;
&lt;li&gt;検索処理のユニットはS3のデータをローカルに持ってきて処理をできる&lt;/li&gt;
&lt;li&gt;データ登録とかのAPIは基本的にServerlessかどうかで違いはなさそう(これまで通りのクライアントでアクセスとかで競う)&lt;/li&gt;
&lt;li&gt;設定した範囲でいいかんじにスケールアウトインしてくれそう（ほんとかな？）&lt;/li&gt;
&lt;li&gt;もちろん、&lt;a href=&#34;https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-overview.html#serverless-limitations&#34;&gt;いくつか制限がある&lt;/a&gt;（サポートしてないプラグインとか操作もある）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;

&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://docs.aws.amazon.com/images/opensearch-service/latest/developerguide/images/Serverless.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://docs.aws.amazon.com/images/opensearch-service/latest/developerguide/images/Serverless.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

（図はAWSのドキュメントより引用）&lt;/p&gt;
&lt;p&gt;発表時のブログでは詳しくはわからないのですが、&lt;a href=&#34;https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-overview.html#serverless-process&#34;&gt;公式ドキュメント&lt;/a&gt;ではさらに詳しく説明がありました。
こちらを読むほうが仕組みがわかると思います。
今後もどんどんドキュメントは充実していくんだろうなと。今ならまだサクッと読める量ですｗ&lt;/p&gt;
&lt;p&gt;ただ、「サーバーレス」という定義が私はよくわかりませんでした。
&lt;a href=&#34;https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-overview.html#serverless-pricing&#34;&gt;公式ドキュメントを読む&lt;/a&gt;とコレクションを作ると少なくとも4つのOCUが起動しているみたいで課金されると記載があります。&lt;/p&gt;
&lt;p&gt;まぁ、Elasticの発表と同様に、これまでは最大負荷の時を元にクラスターを維持せずとも、より柔軟に検索だけ、登録処理だけを一時的にスケールできるとコストを下げられそうですね。
すぐに誰かが使ってみたブログなどを出してくれると思うので、細かな使用感などはそのうちわかってくるかと。&lt;/p&gt;
&lt;h2 id=&#34;今後は&#34;&gt;今後は？&lt;/h2&gt;
&lt;p&gt;ElasticもAWSも考え方の基本となっているのは、Berlin BuzzwordsでAmazonのMikeさん（Luceneのコミッター）が&lt;a href=&#34;https://2019.berlinbuzzwords.de/19/session/e-commerce-search-scale-apache-lucene-tm.html&#34;&gt;2019年に発表されたもの&lt;/a&gt;だと思っています。
アーキテクチャの変更がどんな影響が出るかはわからないですが、少なくとも検索のユースケースでよりスケールアウトしやすくなるだろうなと。
どちらもSaaSとしての仕組みとして提供するので、検索エンジンそのものの機能として公開されるかはわからないです。
ですが、そのほかの検索エンジンも出てきていますし、今後も検索エンジンから目をはなせないです。
今回は残念ながら触っていませんが、時間を見つけて使ってみたいです（Elasticも早く出してくれないかなー）&lt;/p&gt;
&lt;p&gt;ということで、当初の予定とは違うブログになってしまいました。。。
技術的な深い話はまたどこかで。。。&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/jp/blog/stateless-your-new-state-of-find-with-elasticsearch&#34;&gt;Stateless — your new state of find with Elasticsearch | Elastic Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://aws.amazon.com/jp/blogs/aws/preview-amazon-opensearch-serverless-run-search-and-analytics-workloads-without-managing-clusters/&#34;&gt;Preview： Amazon OpenSearch Serverless – Run Search and Analytics Workloads without Managing Clusters | AWS News Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=EkkzSLstSAE&amp;amp;list=PLq-odUc2x7i9-bGb8F8ytYBfCAzcmpaUe&amp;amp;t=2s&#34;&gt;Berlin Buzzwords 2019： Michael Sokolov &amp;amp; Mike McCandless–E-Commerce search at scale on Apache Lucene - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>ローマ字入力のゆれと読み（JapaneseCompletionAnalyzerその2）</title>
      <link>https://blog.johtani.info/blog/2022/08/10/jp-auto-completion-2/</link>
      <pubDate>Wed, 10 Aug 2022 11:50:02 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2022/08/10/jp-auto-completion-2/</guid>
      <description>&lt;p&gt;前回は&lt;a href=&#34;https://blog.johtani.info/blog/2022/08/09/japanese-auto-completion/&#34;&gt;日本語用オートコンプリートのためのAnalyzer&lt;/a&gt;として、どうやって使うのかを簡単に紹介しました。&lt;/p&gt;
&lt;p&gt;今回はもう少し、いろんなパターンを試してみたいと思います。&lt;/p&gt;
&lt;h2 id=&#34;ローマ字入力のゆれ&#34;&gt;ローマ字入力のゆれ&lt;/h2&gt;
&lt;p&gt;前回のサンプルでも「吾輩&amp;hellip;」のデータをサジェストするためのサンプルとして、「wagah」という「わがはい」をローマ字にしたものを利用しました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;前回は&lt;a href=&#34;https://blog.johtani.info/blog/2022/08/09/japanese-auto-completion/&#34;&gt;日本語用オートコンプリートのためのAnalyzer&lt;/a&gt;として、どうやって使うのかを簡単に紹介しました。&lt;/p&gt;
&lt;p&gt;今回はもう少し、いろんなパターンを試してみたいと思います。&lt;/p&gt;
&lt;h2 id=&#34;ローマ字入力のゆれ&#34;&gt;ローマ字入力のゆれ&lt;/h2&gt;
&lt;p&gt;前回のサンプルでも「吾輩&amp;hellip;」のデータをサジェストするためのサンプルとして、「wagah」という「わがはい」をローマ字にしたものを利用しました。&lt;/p&gt;
&lt;p&gt;ちなみにローマ字というとどんなものを思い起こしますか？
普通は学校で習ったヘボン式あたりだと思います。
Kuromojiの読みでローマ字出力するには通常、kuromoji_readingformでuse_romajiをtrueにします。
以下、「吾輩」のサンプルです。&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;GET&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_analyze&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:#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;吾輩&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:#e6db74&#34;&gt;&amp;#34;tokenizer&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_tokenizer&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:#e6db74&#34;&gt;&amp;#34;filter&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;kuromoji_readingform&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:#e6db74&#34;&gt;&amp;#34;use_romaji&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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&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:#a6e22e&#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:#e6db74&#34;&gt;&amp;#34;tokens&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;token&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;wagahai&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:#e6db74&#34;&gt;&amp;#34;start_offset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;end_offset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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:#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;word&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:#e6db74&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;「吾輩」の場合は特に問題ないのですが、ローマ字による日本語入力の場合、次のような単語を入力するときに、ゆれが生じます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;シャボン＝「shabon」&lt;/li&gt;
&lt;li&gt;新橋＝「shimbashi」&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;括弧内はkuromoji_readingformで出力したもの（＝ヘボン式のローマ字）です。
ですが、ローマ字入力の場合は「syabon」や「shabon」と入力したり、「sinbasi」や「sinnbasi」と入力すると思います。
JapaneseCompletionAnalyzerを利用したCompletion Suggesterの場合、これらのゆれも考慮してサジェストしてくれるようになっています。
前回のサンプルデータを用いると次のような感じです。&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;GET&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;aozora_index&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_search&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:#e6db74&#34;&gt;&amp;#34;explain&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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:#e6db74&#34;&gt;&amp;#34;suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;title-suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;prefix&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;sha&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:#e6db74&#34;&gt;&amp;#34;completion&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;field&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;suggest_ja&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;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&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:#a6e22e&#34;&gt;GET&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;aozora_index&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_search&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:#e6db74&#34;&gt;&amp;#34;explain&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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:#e6db74&#34;&gt;&amp;#34;suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;title-suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;prefix&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;sya&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:#e6db74&#34;&gt;&amp;#34;completion&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;field&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;suggest_ja&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;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これらのリクエストは、「しゃ」について2パターンになっていますが、結果はどちらも次のものが返ってきます（このレスはsyaのレスになります）。&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;took&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;timed_out&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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:#e6db74&#34;&gt;&amp;#34;_shards&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;successful&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;skipped&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;failed&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;hits&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;relation&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;eq&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;max_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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:#e6db74&#34;&gt;&amp;#34;hits&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;title-suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;sya&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:#e6db74&#34;&gt;&amp;#34;offset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;length&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&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:#e6db74&#34;&gt;&amp;#34;options&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;シャドウ・ワーク&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;000739&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;シャドウ・ワーク&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:#e6db74&#34;&gt;&amp;#34;朝倉 克彦&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;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:#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;シャボン玉&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;045054&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;シャボン玉&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:#e6db74&#34;&gt;&amp;#34;豊島 与志雄&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;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:#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;上海&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;050899&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;上海&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:#e6db74&#34;&gt;&amp;#34;横光 利一&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;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:#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;斜坑&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;002095&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;斜坑&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:#e6db74&#34;&gt;&amp;#34;夢野 久作&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;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:#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;社会事情と科学的精神&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;053864&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;社会事情と科学的精神&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:#e6db74&#34;&gt;&amp;#34;石原 純&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;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&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;「sinnba」や「shinba」も試してみました。&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;GET&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;aozora_index&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_search&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:#e6db74&#34;&gt;&amp;#34;explain&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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:#e6db74&#34;&gt;&amp;#34;suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;title-suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;prefix&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;sinnba&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:#e6db74&#34;&gt;&amp;#34;completion&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;field&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;suggest_ja&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;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:#e6db74&#34;&gt;&amp;#34;_source&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;suggest_ja&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;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:#a6e22e&#34;&gt;GET&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;aozora_index&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_search&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:#e6db74&#34;&gt;&amp;#34;explain&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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:#e6db74&#34;&gt;&amp;#34;suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;title-suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;prefix&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;shinba&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:#e6db74&#34;&gt;&amp;#34;completion&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;field&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;suggest_ja&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;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:#e6db74&#34;&gt;&amp;#34;_source&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;suggest_ja&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;took&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;timed_out&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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:#e6db74&#34;&gt;&amp;#34;_shards&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;successful&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;skipped&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;failed&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;hits&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;relation&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;eq&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;max_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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:#e6db74&#34;&gt;&amp;#34;hits&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;title-suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;shinba&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:#e6db74&#34;&gt;&amp;#34;offset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;length&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;6&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:#e6db74&#34;&gt;&amp;#34;options&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;しんばい&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;044942&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;しんばい&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:#e6db74&#34;&gt;&amp;#34;村山 籌子&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;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:#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;新橋&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;002409&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;新橋&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:#e6db74&#34;&gt;&amp;#34;北原 白秋&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;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&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;入力されるパターンを想定した実装がされているので対応できている形です。
使い方が楽なだけでなく、より使いやすくなってるのは便利ですね。&lt;/p&gt;
&lt;h2 id=&#34;うまくいかないパターン&#34;&gt;うまくいかないパターン&lt;/h2&gt;
&lt;p&gt;万事OKかというと残念ながらそうでもありません。
うまくいかないパターンもあります（これが本当にうまくいかないかは難しい話な気がしますが）。
「日本」という漢字ですが、「にほん」「にっぽん」どちらとも読めますよね？
これらを試してみると次のようになります（リクエストは省略します）。&lt;/p&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;took&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;timed_out&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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:#e6db74&#34;&gt;&amp;#34;_shards&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;successful&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;skipped&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;failed&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;hits&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;relation&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;eq&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;max_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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:#e6db74&#34;&gt;&amp;#34;hits&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;title-suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;にほん&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:#e6db74&#34;&gt;&amp;#34;offset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;length&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&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:#e6db74&#34;&gt;&amp;#34;options&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;日本橋&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;004565&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;日本橋&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:#e6db74&#34;&gt;&amp;#34;泉 鏡花&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;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:#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;日本橋&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;045357&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;日本橋&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:#e6db74&#34;&gt;&amp;#34;牧野 信一&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;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:#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;日本橋あたり&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;047648&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;日本橋あたり&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:#e6db74&#34;&gt;&amp;#34;長谷川 時雨&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;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:#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;日本橋附近&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;055666&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;日本橋附近&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:#e6db74&#34;&gt;&amp;#34;田山 花袋&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;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&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;/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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;took&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;timed_out&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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:#e6db74&#34;&gt;&amp;#34;_shards&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;successful&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;skipped&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;failed&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;hits&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;relation&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;eq&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;max_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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:#e6db74&#34;&gt;&amp;#34;hits&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;title-suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;にっぽん&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:#e6db74&#34;&gt;&amp;#34;offset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;length&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&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:#e6db74&#34;&gt;&amp;#34;options&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;日本アルプスの五仙境&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;056269&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;日本アルプスの五仙境&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:#e6db74&#34;&gt;&amp;#34;木暮 理太郎&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;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:#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;日本出版協会論&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;049436&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;日本出版協会論&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:#e6db74&#34;&gt;&amp;#34;嶋中 雄作&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;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:#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;日本文化と科学的思想&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;055750&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;日本文化と科学的思想&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:#e6db74&#34;&gt;&amp;#34;石原 純&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;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:#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;日本文化のために&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;003183&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;日本文化のために&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:#e6db74&#34;&gt;&amp;#34;宮本 百合子&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;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:#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;日本文化の特殊性&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;055290&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;日本文化の特殊性&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:#e6db74&#34;&gt;&amp;#34;戸坂 潤&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;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&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;/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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;took&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;timed_out&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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:#e6db74&#34;&gt;&amp;#34;_shards&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;successful&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;skipped&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;failed&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;hits&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;relation&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;eq&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;max_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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:#e6db74&#34;&gt;&amp;#34;hits&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;title-suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;日本&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:#e6db74&#34;&gt;&amp;#34;offset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;length&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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:#e6db74&#34;&gt;&amp;#34;options&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;日本アルプスの五仙境&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;056269&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;日本アルプスの五仙境&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:#e6db74&#34;&gt;&amp;#34;木暮 理太郎&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;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:#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;日本出版協会論&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;049436&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;日本出版協会論&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:#e6db74&#34;&gt;&amp;#34;嶋中 雄作&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;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:#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;日本文化とは何ぞや（其二）&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;002940&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;日本文化とは何ぞや（其二）&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:#e6db74&#34;&gt;&amp;#34;内藤 湖南&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;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:#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;日本文化と科学的思想&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;055750&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;日本文化と科学的思想&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:#e6db74&#34;&gt;&amp;#34;石原 純&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;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:#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;日本文化のために&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;003183&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;日本文化のために&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:#e6db74&#34;&gt;&amp;#34;宮本 百合子&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;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&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最初の「にほん」は「日本橋」がヒットしているようです。返ってきたoptionsの数は4件しかなく、どうやらこれがすべてのようです（取得件数はデフォルト5件）。
2番目の「にっぽん」は「日本」という単語から始まるものがヒットしていますが、「日本橋」はなさそうでした。
最後に「日本」という漢字を入力にした場合は2つの合計が帰ってきているようです（今回のレスポンス例にはありませんが、サイズを大きくすると「日本橋」が帰ってきていました）。&lt;/p&gt;
&lt;h3 id=&#34;どうしてそうなるの&#34;&gt;どうしてそうなるの？&lt;/h3&gt;
&lt;p&gt;JapaneseCompletionAnalyzerの基本的な動作としては、&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Kuromojiが単語に区切る&lt;/li&gt;
&lt;li&gt;区切られた単語ごとに読みを持っている&lt;/li&gt;
&lt;li&gt;元の単語と読みをローマ字にしたものが最終的に出てくる&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;というような動きです。
この時、単語には「1つ」の読みが対応しています。
読みから単語を探そうとすると、読みの違い（ゆれ）を吸収することはできないためです。
JapaneseCompletionAanlyzerは3点目のローマ字のゆれに対応していますが、入力となる読みのゆれまでは対応できないです。
対応しているといいかどうかというのも難しい判断になる気もします。。。&lt;/p&gt;
&lt;p&gt;そのほかの例としては次のようなものもあります。
これは、今回のオートコンプリートの話とは少しずれてるかもしれませんが、1番目の処理の結果が変わってくる例です。
「南方熊楠」という名前の間にスペースがあるかないかで、出力される読みが変わってくる例です。&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;GET&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_analyze&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:#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;南方 熊楠&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:#e6db74&#34;&gt;&amp;#34;tokenizer&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_tokenizer&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:#e6db74&#34;&gt;&amp;#34;filter&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_readingform&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;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:#a6e22e&#34;&gt;GET&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_analyze&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:#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;南方熊楠&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:#e6db74&#34;&gt;&amp;#34;tokenizer&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_tokenizer&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:#e6db74&#34;&gt;&amp;#34;filter&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_readingform&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;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:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;GET&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_analyze&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:#e6db74&#34;&gt;&amp;#34;tokens&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;token&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;ナンポウ&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:#e6db74&#34;&gt;&amp;#34;start_offset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;end_offset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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:#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;word&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:#e6db74&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;token&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;クマグス&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:#e6db74&#34;&gt;&amp;#34;start_offset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&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:#e6db74&#34;&gt;&amp;#34;end_offset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5&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:#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;word&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:#e6db74&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;GET&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_analyze&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:#e6db74&#34;&gt;&amp;#34;tokens&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;token&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;ミナカタ&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:#e6db74&#34;&gt;&amp;#34;start_offset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;end_offset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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:#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;word&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:#e6db74&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;token&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;クマグス&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:#e6db74&#34;&gt;&amp;#34;start_offset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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:#e6db74&#34;&gt;&amp;#34;end_offset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&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:#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;word&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:#e6db74&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;人名や地名は1つの漢字に対して多くの読みが存在しているので大変です。。。
どうしてこれは出てこないんだろう？と不思議に思った場合は、_analyze APIを使ってどういう動きなのかを見てみるのがいいかと。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、少しだけですが、こんなことができるよ、できないよというのを書いてみました。
挙動をしっていれば、なんでこうなってるんだっけ？といったことを調べる役に立つかと思います。
入力された文字をもとにどれをサジェストするかなどについてはもう少し違う動きなので、中の仕組みをそろそろ書かないとなぁ。&lt;/p&gt;
&lt;h2 id=&#34;参考&#34;&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://ja.wikipedia.org/wiki/%E5%90%8C%E5%BD%A2%E7%95%B0%E9%9F%B3%E8%AA%9E&#34;&gt;同形異音語 - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>日本語用オートコンプリートのためのAnalyzer</title>
      <link>https://blog.johtani.info/blog/2022/08/09/japanese-auto-completion/</link>
      <pubDate>Tue, 09 Aug 2022 16:00:02 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2022/08/09/japanese-auto-completion/</guid>
      <description>&lt;p&gt;風のうわさで、日本語用のオートコンプリートのためのTokenFilterとAnalyzerがLuceneに取り込まれたと聞きました（&lt;a href=&#34;https://issues.apache.org/jira/browse/LUCENE-10102&#34;&gt;LUCENE-10102&lt;/a&gt;）。
Elasticsearchでも使えるかなぁ？ということで調べたところ（調べた？聞いた？）、どうやら8.1から利用できるようになっている（&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/81858&#34;&gt;GitHub Issue #81858&lt;/a&gt;）みたいです（まだ、公式ドキュメントには記載がないのですが）。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;風のうわさで、日本語用のオートコンプリートのためのTokenFilterとAnalyzerがLuceneに取り込まれたと聞きました（&lt;a href=&#34;https://issues.apache.org/jira/browse/LUCENE-10102&#34;&gt;LUCENE-10102&lt;/a&gt;）。
Elasticsearchでも使えるかなぁ？ということで調べたところ（調べた？聞いた？）、どうやら8.1から利用できるようになっている（&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/81858&#34;&gt;GitHub Issue #81858&lt;/a&gt;）みたいです（まだ、公式ドキュメントには記載がないのですが）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8/17追記&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;作者の打田さんがブログ書いてたの見落としてた（もしくは見たけど忘れてた）ので貼っておきます。&lt;a href=&#34;https://tech.legalforce.co.jp/entry/2020/12/18/134454&#34;&gt;マルチテナンシー下での Query Auto Completion 設計・運用戦略 - LegalForce Engineering Blog&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ということで、こんな感じで使えるよというのを試してみました。&lt;/p&gt;
&lt;h2 id=&#34;どういうもの&#34;&gt;どういうもの？&lt;/h2&gt;
&lt;p&gt;日本語入力方法を考慮したオートコンプリート用のトークンを生成してくれるTokenFilterと、
それをLuceneのSuggesterで動くようにしたAnalyzerが用意されています。
Elasticsearchでは、Kuromojiプラグインにそれらを使えるようになっています（バージョン8.1.0以降）。
KuromojiTokenizerと一緒に利用する前提の仕組みとなります。&lt;/p&gt;
&lt;h2 id=&#34;オートコンプリートとは&#34;&gt;オートコンプリートとは？&lt;/h2&gt;
&lt;p&gt;検索窓などでキー入力をしていると、入力した文字で始まる単語の一覧が現れることがあると思います。
あの機能がオートコンプリートと呼ばれるものです。search-as-you-typeとも呼ばれることもあります。
（&lt;a href=&#34;https://www.lambdanote.com/collections/ir-system/products/ir-system&#34;&gt;検索ペンギン本にも書いてあるので興味のある方はぜひ！（ステマ）&lt;/a&gt;）
入力された文字列を含むパターンもありますが、今回紹介するものは入力された文字で始まる単語を見つけてくる機能になります。&lt;/p&gt;
&lt;h3 id=&#34;何がなんで追加されたの&#34;&gt;何がなんで追加されたの？&lt;/h3&gt;
&lt;p&gt;日本語の入力方法は、かな入力の人もいればローマ字入力の人もいます。
ですので、オートコンプリートでの入力として、「しゃ」という入力が来る場合もあれば、「sha」というローマ字入力途中のものが来る場合もあります。
これらを考慮したトークンの扱いができるように、
&lt;a href=&#34;https://lucene.apache.org/core/9_0_0/analysis/kuromoji/org/apache/lucene/analysis/ja/JapaneseCompletionFilter.html&#34;&gt;JapaneseCompletionFilterというクラス&lt;/a&gt;が追加されています。
内部的にはKuromojiTokenizerでトークンに分割された後に、もともとのトークンと同じポジションで読みをローマ字にしたものを出力します。
&lt;a href=&#34;https://lucene.apache.org/core/9_0_0/analysis/kuromoji/org/apache/lucene/analysis/ja/JapaneseCompletionAnalyzer.html&#34;&gt;JapaneseCompletionAnalyzer&lt;/a&gt;は上記Filterをすぐに使えるようにしたAnalyzerです。&lt;/p&gt;
&lt;h2 id=&#34;動かし方&#34;&gt;動かし方&lt;/h2&gt;
&lt;p&gt;百聞は一見に如かずということで、Elasticsearchでの使い方を見たほうが分かりやすいので、簡単に動かしてみることにします。&lt;/p&gt;
&lt;h3 id=&#34;インストールとインデックスの用意&#34;&gt;インストールとインデックスの用意&lt;/h3&gt;
&lt;p&gt;Elasticsearch（8.1以上）とKuromojiのプラグインをインストールします（今回試したのは8.3.1）。&lt;/p&gt;
&lt;h3 id=&#34;サンプルデータ&#34;&gt;サンプルデータ&lt;/h3&gt;
&lt;p&gt;なにかいいデータはないものか？と思っていたところ夏休みだというのを思い出しました。
夏休みといえば読書感想文だ、ということで、書籍のタイトルがいいかもなと。
青空文庫の著者名と書籍のタイトルの一覧を見つけたのでそちらのデータを使って試してみました。&lt;/p&gt;
&lt;h4 id=&#34;csv-to-json&#34;&gt;CSV to JSON&lt;/h4&gt;
&lt;p&gt;CSVファイルは最後の参考にある青空文庫のページから、「公開中　作家別作品一覧：全て(CSV形式、zip圧縮）」をダウンロードしたものを利用しました。
CSVファイルだったので、jqコマンドで必要な部分だけをNDJSONの形でとりあえずファイルに出力します。&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-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat list_person_all_utf8.csv | tr -d &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; | jq -c -R &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;split(&amp;#34;,&amp;#34;) | {&amp;#34;auth_id&amp;#34;: .[0] | tonumber, &amp;#34;author&amp;#34;: .[1], &amp;#34;id&amp;#34;: .[2] , &amp;#34;title&amp;#34;: .[3], &amp;#34;suggest_ja&amp;#34;: [.[3], .[1]]}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次のようなJSONが1行ずつ出力されます。&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:#e6db74&#34;&gt;&amp;#34;auth_id&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1257&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;author&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;アーヴィング ワシントン&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;056078&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;駅伝馬車&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;suggest_ja&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;駅伝馬車&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;アーヴィング ワシントン&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;suggest_ja&lt;/code&gt;がオートコンプリートの対象となるデータになります。今回は著作と著者にしてみました。
あとは次に紹介するスキーマでインデックスを作成して、適当なプログラムを使ってBulkでElasticsearchに登録しましょう（私は&lt;a href=&#34;https://github.com/johtani/bulk2es-rs&#34;&gt;個人作のツール&lt;/a&gt;で入れました）。&lt;/p&gt;
&lt;h3 id=&#34;インデックス&#34;&gt;インデックス&lt;/h3&gt;
&lt;p&gt;オートコンプリート用のSuggesterを利用するための特殊なフィールド（&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters.html#completion-suggester-mapping&#34;&gt;completion&lt;/a&gt;）を利用したフィールドを用意します。
ちなみに、今回は&lt;a href=&#34;https://issues.apache.org/jira/browse/LUCENE-10102&#34;&gt;LUCENE-10102&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-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;PUT&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;aozora_index&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:#e6db74&#34;&gt;&amp;#34;mappings&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;properties&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;completion&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:#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;japanese_completion_index&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:#e6db74&#34;&gt;&amp;#34;search_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;japanese_completion_query&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:#e6db74&#34;&gt;&amp;#34;preserve_separators&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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:#e6db74&#34;&gt;&amp;#34;preserve_position_increments&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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:#e6db74&#34;&gt;&amp;#34;max_input_length&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;50&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:#e6db74&#34;&gt;&amp;#34;auth_id&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;long&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;author&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&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&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:#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&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:#e6db74&#34;&gt;&amp;#34;author_id&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;integer&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;span style=&#34;display:flex;&#34;&gt;&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#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;integer&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;span style=&#34;display:flex;&#34;&gt;&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&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&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:#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&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:#e6db74&#34;&gt;&amp;#34;settings&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;index&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;1&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:#e6db74&#34;&gt;&amp;#34;analysis&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;analyzer&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;japanese_completion_index&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;mode&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;index&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:#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;kuromoji_completion&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;japanese_completion_query&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;mode&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;query&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:#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;kuromoji_completion&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;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&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;ここまでで、インデックスとデータの用意ができました。
オートコンプリートを実現するためにはElasticsearchのSuggesterという機能の、&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters.html#completion-suggester&#34;&gt;Completion Suggester&lt;/a&gt;を利用します。検索の仕方が通常のものとは少し異なります。
ちなみに、速度重視のためにインメモリで動いているとの記載がドキュメントにあります。&lt;/p&gt;
&lt;h4 id=&#34;completion-suggesterのクエリ&#34;&gt;Completion Suggesterのクエリ&lt;/h4&gt;
&lt;p&gt;Suggester用のクエリがあるのでこちらを使います。
例えば、「wagah」という入力がある時に、サジェストする内容を取得するには次のようなリクエストになります。&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;GET&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;aozora_index&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_search&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:#e6db74&#34;&gt;&amp;#34;suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;title-suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;prefix&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;wagah&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:#e6db74&#34;&gt;&amp;#34;completion&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;field&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;suggest_ja&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;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:#e6db74&#34;&gt;&amp;#34;_source&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;title&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;author&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;ol&gt;
&lt;li&gt;最初の「suggest」がsuggest用のパラメータを意味しています。&lt;/li&gt;
&lt;li&gt;次の「title-suggest」は好きな名前をつけられます。レスポンスにこの名前がついた配列がサジェストの結果になります（同時に3. 複数suggestを呼び出せるので、対応した結果が分かるように名前が付けられます）。&lt;/li&gt;
&lt;li&gt;「prefix」に入力の文字列を渡します。&lt;/li&gt;
&lt;li&gt;「completion」がsuggesterのタイプの指定です。今回はCompletion Suggesterなので「completion」を指定します。その中に「field」でcompletionに利用するフィールド名を指定します。先ほどのスキーマでcompletionタイプを指定したフィールドです。今回は「suggest_ja」になります。&lt;/li&gt;
&lt;li&gt;「_source」は結果を見やすくするために、ヒットしたデータの一部だけ取得するオプションです。&lt;/li&gt;
&lt;/ol&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;took&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;timed_out&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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:#e6db74&#34;&gt;&amp;#34;_shards&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;successful&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;skipped&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;failed&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;hits&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;relation&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;eq&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;max_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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:#e6db74&#34;&gt;&amp;#34;hits&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;title-suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;wagah&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:#e6db74&#34;&gt;&amp;#34;offset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;length&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5&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:#e6db74&#34;&gt;&amp;#34;options&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;『吾輩は猫である』中篇自序&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;002671&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;『吾輩は猫である』中篇自序&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:#e6db74&#34;&gt;&amp;#34;夏目 漱石&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;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:#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;わが俳諧修業&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;003771&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;わが俳諧修業&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:#e6db74&#34;&gt;&amp;#34;芥川 竜之介&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;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:#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;わが母をおもう&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;003997&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;わが母をおもう&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:#e6db74&#34;&gt;&amp;#34;宮本 百合子&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;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:#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;わが母を語る&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;049723&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;わが母を語る&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:#e6db74&#34;&gt;&amp;#34;上村 松園&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;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:#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;吾輩は猫である&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;000789&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;吾輩は猫である&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:#e6db74&#34;&gt;&amp;#34;夏目 漱石&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;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&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;「suggest」の「title-suggest」がCompletion Suggesterのレスポンスになります。&lt;/li&gt;
&lt;li&gt;最初の「text」は入力の「prefix」の値です。「offset」、「length」もこの文字に関する情報なので特に気にしなくてもいいかと。&lt;/li&gt;
&lt;li&gt;「options」がサジェストされた内容になります。それぞれの「text」がサジェストされた文字列になります。「suggest_ja」には著作と著者名を入れましたが、今回は著作が「text」に帰ってきていることがわかります。&lt;/li&gt;
&lt;/ol&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;GET&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;aozora_index&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_search&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:#e6db74&#34;&gt;&amp;#34;explain&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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:#e6db74&#34;&gt;&amp;#34;suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;title-suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;prefix&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;太宰&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:#e6db74&#34;&gt;&amp;#34;completion&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;field&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;suggest_ja&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;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;/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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;took&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;timed_out&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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:#e6db74&#34;&gt;&amp;#34;_shards&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;successful&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;skipped&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;failed&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;hits&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;relation&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;eq&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;max_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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:#e6db74&#34;&gt;&amp;#34;hits&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;title-suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;太宰&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:#e6db74&#34;&gt;&amp;#34;offset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;length&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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:#e6db74&#34;&gt;&amp;#34;options&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;太宰 治&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;000236&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;ア、秋&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:#e6db74&#34;&gt;&amp;#34;太宰 治&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;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:#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;太宰 治&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;001572&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;I can speak&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:#e6db74&#34;&gt;&amp;#34;太宰 治&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;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:#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;太宰 治&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;001578&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;愛と美について&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:#e6db74&#34;&gt;&amp;#34;太宰 治&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;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:#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;太宰 治&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;046597&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;青森&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:#e6db74&#34;&gt;&amp;#34;太宰 治&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;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:#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;太宰 治&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;004357&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;青森&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:#e6db74&#34;&gt;&amp;#34;太宰 治&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;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&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;先ほどとは異なり、「options」の中の個々の「text」はすべて「太宰 治」になってしまいました。
登録したデータは著作の一覧ですが、「suggest_ja」には著作と著者名を入れたためです。
これでは、実際に検索窓に実装したときに同じものが並んでしまいます。
こんな時のためのオプション「skip_duplicates」が用意されています。
先ほどのリクエストに「&amp;ldquo;skip_duplicates&amp;rdquo;: true」を追加します。&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;GET&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;aozora_index&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_search&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:#e6db74&#34;&gt;&amp;#34;explain&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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:#e6db74&#34;&gt;&amp;#34;suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;title-suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;prefix&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;太宰&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:#e6db74&#34;&gt;&amp;#34;completion&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;field&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;suggest_ja&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:#e6db74&#34;&gt;&amp;#34;skip_duplicates&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;_source&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;suggest_ja&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;took&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;timed_out&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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:#e6db74&#34;&gt;&amp;#34;_shards&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;successful&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;skipped&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;failed&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;hits&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;relation&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;eq&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;max_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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:#e6db74&#34;&gt;&amp;#34;hits&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;title-suggest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;太宰&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:#e6db74&#34;&gt;&amp;#34;offset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;length&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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:#e6db74&#34;&gt;&amp;#34;options&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;太宰 治&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;000236&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;ア、秋&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:#e6db74&#34;&gt;&amp;#34;太宰 治&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;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:#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;太宰治との一日&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;042582&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;太宰治との一日&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:#e6db74&#34;&gt;&amp;#34;豊島 与志雄&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;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:#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;太宰治情死考&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:#e6db74&#34;&gt;&amp;#34;_index&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;aozora_index&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:#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;043137&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:#e6db74&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;suggest_ja&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;太宰治情死考&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:#e6db74&#34;&gt;&amp;#34;坂口 安吾&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;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&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;「options」は3つに減り、重複していないことがわかります。
「text」が同じ場合は最初に出てきたものを返すようです（注意：結果から観測しているだけで、実装はまだ見ていません）。
（なお、今回は説明を省きますが、入力データでスコアを指定することも可能になっています）。
そのほかにもCompletion Suggesterにはいくつか仕組みが用意されているのですが、それはまた今度にでも。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、Luceneコミッターの打田さんに感謝です。
便利な仕組みが簡単に使えるようになるのはとてもありがたいですね。&lt;/p&gt;
&lt;p&gt;まずは簡単にどういうものかとどうやって使うのかを記事にしてみました。
中の動きや、注意点、これまでとの違いなどは次の記事にしようと思います。
そういえば、公式ドキュメントにはまだ出てきてないな、それを書こうと思ってついでに動かしてみたんだけど、追加するのはまた後日かな。。。&lt;/p&gt;
&lt;h2 id=&#34;参考資料&#34;&gt;参考資料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.aozora.gr.jp/index_pages/person_all.html&#34;&gt;青空文庫 - 公開中　作家リスト：全て&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://issues.apache.org/jira/browse/LUCENE-10102&#34;&gt;［LUCENE-10102］ Add JapaneseCompletionFilter for Input Method-aware auto-completion - ASF JIRA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/81858&#34;&gt;Expose Japanese completion filter to kuromoji analysis plugin by mocobeta · Pull Request #81858 · elastic/elasticsearch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters.html#completion-suggester&#34;&gt;Suggesters | Elasticsearch Guide ［8.3］ | Elastic&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Hugoをアップデートした</title>
      <link>https://blog.johtani.info/blog/2022/08/05/upgrade-hugo-accidentally/</link>
      <pubDate>Fri, 05 Aug 2022 17:59:14 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2022/08/05/upgrade-hugo-accidentally/</guid>
      <description>&lt;p&gt;Hugoを0.84から0.92にアップデートをする際に、これまでのブログ記事やレイアウトファイルを修正したので個人的にメモを残しておきます。&lt;/p&gt;
&lt;h2 id=&#34;なんでアップデート&#34;&gt;なんでアップデート？&lt;/h2&gt;
&lt;p&gt;うっかり魔がさして、メインのWSL2のUbuntuを20.04から22.04にアップグレードしました。。。
新規に22.04を落としてきて移行ではなく。
皆さんはまねしないほうがいいですよ！
アップデートした後にGitの環境がおかしくなったりと大変でした。
WSL2のUbuntuではHugoでブログのビルド、いろんな確認のためのElasticsearchの起動、個人的なプログラムとかを書く環境として利用しています。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Hugoを0.84から0.92にアップデートをする際に、これまでのブログ記事やレイアウトファイルを修正したので個人的にメモを残しておきます。&lt;/p&gt;
&lt;h2 id=&#34;なんでアップデート&#34;&gt;なんでアップデート？&lt;/h2&gt;
&lt;p&gt;うっかり魔がさして、メインのWSL2のUbuntuを20.04から22.04にアップグレードしました。。。
新規に22.04を落としてきて移行ではなく。
皆さんはまねしないほうがいいですよ！
アップデートした後にGitの環境がおかしくなったりと大変でした。
WSL2のUbuntuではHugoでブログのビルド、いろんな確認のためのElasticsearchの起動、個人的なプログラムとかを書く環境として利用しています。&lt;/p&gt;
&lt;p&gt;で、Ubuntuを上げたところ無事（？）Hugoもアップデートされたわけです。
最初はGitでfetchが出来なくなって修正していましたが、そのほかの動作確認を行なう段階でHugoでブログがビルドできなくなっていることが判明しました。&lt;/p&gt;
&lt;h2 id=&#34;バージョンアップに伴う修正&#34;&gt;バージョンアップに伴う修正&lt;/h2&gt;
&lt;p&gt;hugoコマンドを実行すると、いくつかのERRORとWARNが出力されました。
次のようなものです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;hugo v0.92.2+extended linux/amd64 BuildDate=2022-02-23T16:47:50Z VendorInfo=ubuntu:0.92.2-1
ERROR 2022/08/05 13:22:32 Page.URL is deprecated and will be removed in Hugo 0.93.0. Use .Permalink or .RelPermalink. If what you want is the front matter URL value, use .Params.url
WARN 2022/08/05 13:22:32 The &amp;#34;tweet&amp;#34; shortcode will soon require two named parameters: user and id. See &amp;#34;/home/johtani/blog_generator/content/post/2020/2020-12-04-build_corne_choc.md:46:1&amp;#34;
...
ERROR 2022/08/05 13:22:33 Failed to get JSON resource &amp;#34;https://publish.twitter.com/oembed?dnt=fa...
If you feel that this should not be logged as an ERROR, you can ignore it by adding this to your site config:
ignoreErrors = [&amp;#34;error-remote-getjson&amp;#34;]
ERROR 2022/08/05 18:44:11 Page.UniqueID is deprecated and will be removed in Hugo 0.93.0. Use .File.UniqueID
ERROR 2022/08/05 18:44:11 Page.Dir is deprecated and will be removed in Hugo 0.93.0. Use .File.Dir
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;pageurlなどがdeprecatedに&#34;&gt;Page.URLなどがdeprecatedに&lt;/h3&gt;
&lt;p&gt;最初と最後2行のERRORがこちらになります。
どうやら、Pageオブジェクトの変数に変更があったようです（まだdeprecatedであり、存在はしていそう？）。
レイアウト（テンプレート）ファイルで「Previous Post」や「Next Post」といったリンクを作ったり、
&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/28/introduce-algolia/#%E4%BB%8A%E5%BE%8C%E3%81%AE%E8%AA%B2%E9%A1%8C&#34;&gt;Algoliaに登録するためのJSONファイルを生成するところ&lt;/a&gt;でURL文字列を取得するために参照していました。&lt;/p&gt;
&lt;p&gt;ログ出力でどのように変更すればよいのか？という記載があるので便利ですね。
ただ、どのファイルにこの記述があるのかはログに出てなかったので少しだけ苦労しました。&lt;/p&gt;
&lt;p&gt;実際には「UniqueID」という文字列でディレクトリ内を検索してあたりを付けた感じです。
利用させていただいているテーマ（&lt;a href=&#34;https://github.com/zhaohuabing/hugo-theme-cleanwhite&#34;&gt;Clean White&lt;/a&gt;）がすでにアップデートに対応されていたのでそちらが参考になりました。&lt;/p&gt;
&lt;p&gt;いくつか、テーマをもとに修正したテンプレートがlayoutsディレクトリにあったので、それらを修正した形です（参考のリンクはテーマのファイルになります）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.URL&lt;/code&gt;を&lt;code&gt;.Permalink&lt;/code&gt;に変更（参考：&lt;a href=&#34;https://github.com/zhaohuabing/hugo-theme-cleanwhite/blob/master/layouts/_default/single.html#L91&#34;&gt;single.html&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.UniqueID&lt;/code&gt;を&lt;code&gt;.File.UniqueID&lt;/code&gt;に変更（参考：&lt;a href=&#34;https://github.com/zhaohuabing/hugo-theme-cleanwhite/blob/master/layouts/_default/list.algolia.json#L6-L7&#34;&gt;list.algolia.json&lt;/a&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;tweetのshortcodeの引数が増えた&#34;&gt;tweetのshortcodeの引数が増えた&lt;/h3&gt;
&lt;p&gt;これまでは以下のようにIDだけで良かったのですが、&lt;code&gt;user&lt;/code&gt;と&lt;code&gt;id&lt;/code&gt;という2つの引数が必須になるという変更が入ったようです。&lt;/p&gt;
&lt;p&gt;変更前：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{{ &amp;lt;tweet 1449214872143609860&amp;gt; }}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;変更後：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{{ &amp;lt;tweet user=&amp;#34;johtani&amp;#34; id=&amp;#34;1449214872143609860&amp;#34;&amp;gt; }}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;WARNにはファイル名、行番号が出力されていたので、1つずつ修正していきました。
結構な量があったので、地味に大変でした、
公開しているブログを見ながら、該当するツイートを見つけては&lt;code&gt;user&lt;/code&gt;を指定していく部分が特に。
自分のツイート以外もブログに貼っていたので画一的には対処できなくて。。。&lt;/p&gt;
&lt;p&gt;なにかプログラムで機械的に対応ができたかもなぁ。&lt;/p&gt;
&lt;h3 id=&#34;鍵付きツイートによるエラー&#34;&gt;鍵付きツイートによるエラー&lt;/h3&gt;
&lt;p&gt;tweetのshortcode対応を行なった後でもビルドがエラーになっており、次のようなエラーが消えないままでした（エラーの一部は省略しています）。
（幸いにも）1つのツイートだけ、ブログ記事を書いた後で鍵付きになってしまった方のツイートがあったようで、ツイート用のJSONが取得できなくてエラーになっていました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ERROR 2022/08/05 13:22:33 Failed to get JSON resource &amp;#34;https://publish.twitter.com/oembed?dnt=fa...
If you feel that this should not be logged as an ERROR, you can ignore it by adding this to your site config:
ignoreErrors = [&amp;#34;error-remote-getjson&amp;#34;]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;こちらもログに対処方法が出ています。
&lt;code&gt;config.toml&lt;/code&gt;に&lt;code&gt;ignoreErrors = [&amp;quot;error-remote-getjson&amp;quot;]&lt;/code&gt;を追加すれば、エラーが出力されなくなりビルドも成功するようになります。
ただ、tweet以外でもエラーが出る可能性がありそうで、その場合に、ブログに書いたつもりが一部が出力されないまま公開されそうな気がします。
なので、今回は&lt;code&gt;config.toml&lt;/code&gt;に該当の設定を追加するのではなく、ブログ記事から該当のツイートを消す対応をしました。
幸いにも、ツイートを消してもブログ記事自体には影響がありませんでした。&lt;/p&gt;
&lt;h3 id=&#34;hugo_buildlockファイルが生成される&#34;&gt;.hugo_build.lockファイルが生成される&lt;/h3&gt;
&lt;p&gt;これは、エラーではないのですがgit addしようとした際に、ファイルが増えていたのでどういったファイルなのかを調べました。
0.89.0から追加されたロックファイルのようです（参考：&lt;a href=&#34;https://gohugo.io/news/0.89.0-relnotes/#notes&#34;&gt;0.89.0のリリースノート&lt;/a&gt;）。
こちらは特に保管する必要もなさそうなので.gitignoreに追加して対処しました。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、気軽にUbuntuをアップグレードしないほうがいいですね。。。
期せずしてHugoのアップグレードができたのは良かったかもなｗ&lt;/p&gt;
&lt;h2 id=&#34;参考&#34;&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://zenn.dev/ryuu/articles/upgrade-ubuntu2204-wsl&#34;&gt;【WSL2】Ubuntu 20.04.4 LTS を 22.04 LTS へアップグレードした&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Querqyの調査（その2：アーキテクチャ）</title>
      <link>https://blog.johtani.info/blog/2022/07/20/querqy-architecture/</link>
      <pubDate>Wed, 20 Jul 2022 16:04:10 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2022/07/20/querqy-architecture/</guid>
      <description>&lt;p&gt;今回はQuerqyのElasticsearchのプラグインがどんなつくりになっているか？をちょっとだけ調べてみました。
SolrでもElasticsearchでも使えるという形なので、どんなつくりになっているのかな？と思ったのが発端です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今回はQuerqyのElasticsearchのプラグインがどんなつくりになっているか？をちょっとだけ調べてみました。
SolrでもElasticsearchでも使えるという形なので、どんなつくりになっているのかな？と思ったのが発端です。&lt;/p&gt;
&lt;h2 id=&#34;githubのリポジトリ&#34;&gt;GitHubのリポジトリ&lt;/h2&gt;
&lt;p&gt;GitHubにリポジトリが公開されています。
2つのリポジトリに分かれています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/querqy/querqy-elasticsearch&#34;&gt;Es向けのプラグイン&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/querqy/querqy&#34;&gt;コアのライブラリ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;どちらもJavaのライブラリで、ビルドシステムとしてはMavenを利用しています。
コアのライブラリのリポジトリにはさらに、以下の2つが存在しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;lucene向けライブラリ（Solr向けのモジュールもこちらに含まれる）&lt;/li&gt;
&lt;li&gt;コアライブラリ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;pom.xmlを読んだところ、次のような依存関係になっています（それ以外にも使ってるライブラリはあるけど）。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Esプラグイン -&amp;gt; Lucene向けライブラリ -&amp;gt; コアライブラリ
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;esプラグイン&#34;&gt;Esプラグイン&lt;/h2&gt;
&lt;p&gt;Es向けのエンドポイントの実装、Esのクエリの組み立てを行なっています。
Rewriterの実装については、Lucene向けライブラリ、コアライブラリを利用する形になります。&lt;/p&gt;
&lt;p&gt;querqy用のQueryBuilderを実装しており、EsがクエリをパースするタイミングでRewriterなどを呼び出してクエリの書き換えを行う仕組みです。
なお、Es向けのクエリの組み立てと書きましたが、ほとんどLuceneのクエリの組み立てになっています（そりゃそうだ）。
実際にquerqyのクエリ組み立て処理を行っているのは、Lucene向けライブラリのQueryParsingControllerになります。
いくつかのRewriterは、生のEsクエリをルールなどとして登録することができるようになっています。
これらのクエリのパースをEs側にやらせる処理の部分もこちらで定義されている感じです。&lt;/p&gt;
&lt;p&gt;そのほかに、ドキュメントには記載がないエンドポイントが2つ用意されていました。
インデックスに登録してあるRewriterの設定を各ノードでキャッシュする仕組みがあって、そのキャッシュの操作（クリア、リロード）用みたいです。
これらは、Rewriterの追加、削除のアクションの内部で呼び出されているので、ユーザー側で呼び出す必要はなさそうです。&lt;/p&gt;
&lt;h2 id=&#34;lucene向けライブラリ&#34;&gt;Lucene向けライブラリ&lt;/h2&gt;
&lt;p&gt;Luceneに関連する処理がまとめられています。
Es内部ではLuceneを使って検索処理が行なわれるため、Luceneのクエリを組み立てる必要があります。
querqyとしてLuceneのクエリを組み立てるときに必要なクラスがこのライブラリに含まれています。&lt;/p&gt;
&lt;p&gt;また、Word Break Rewriterの実装はコアライブラリではなくこちらのライブラリに実装されています。
これは、Luceneのタームディクショナリを活用したRewriterになっているため、Lucene必須となっているからのようです。
（まだちゃんと実装を見ていないので、どんな活用の仕方をしているのかまではわかっていませんが。。。）&lt;/p&gt;
&lt;h2 id=&#34;コアライブラリ&#34;&gt;コアライブラリ&lt;/h2&gt;
&lt;p&gt;Rewriterの設定のパース処理、クエリのリライト処理の実装がまとめられています。
querqyのクエリが、Rewriterの処理に基づいて、querqyとして定義されたクエリのモデルに一旦変換される作りになっています。
Lucene向けライブラリやEs向けプラグインはこの内部のクエリモデルになったものをもとに、Lucene向けのクエリに書き換えていくというながれになっています。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ざっくりですが、どんな構成なのかを見てみました。
Esのプラグインとなっているのですが、プラグインではなく、外部に出すことってできるのかな？と思いつつ、なんとなくソースを読んでみました。
パターンとしては、Lucene向けのクエリからEs向けのクエリを組み立てるとかの無駄な努力が必要になる気もするけど。。。
Luceneを使っていない検索エンジンに対しては、コアライブラリをもとに、それぞれの検索エンジンむけのクエリを組み立てる仕組みを作る形になると思います。
その際、Rewriterの設定を保持する仕組み、querqyが置き換えたクエリのマッピングができるか？といった点を考える必要がありそうです。
デバッグとかするときに、EsのクエリDSLのJSONとして見れるといいなぁと思ってたけど、そんなことできるかなぁ？&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Querqyの調査（その１）</title>
      <link>https://blog.johtani.info/blog/2022/07/20/intro-querqy/</link>
      <pubDate>Wed, 20 Jul 2022 11:52:43 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2022/07/20/intro-querqy/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/querqy/querqy&#34;&gt;Querqyというクエリのリライト用のプラグイン&lt;/a&gt;があるのでどんなものかを調べてみました。とりあえずは概要をドキュメントから追いかけてみた感じです。対応しているのはSolrとElasticsearch（以降、Es）になります。手元にはEsの環境があるのでそちらで試してみました。&lt;/p&gt;
&lt;h2 id=&#34;なにもの&#34;&gt;なにもの？&lt;/h2&gt;
&lt;p&gt;EsやSolrのプラグインで、ルールやパラメータを利用して、クエリの書き換えをEsやSolr側で行えるプラグインです。
なお、本記事ではEsのプラグインを説明します。
今回はドキュメントを読みながらメモを取った感じなので、詳細については&lt;a href=&#34;https://docs.querqy.org/querqy/index.html&#34;&gt;公式ドキュメント&lt;/a&gt;を見ていただくのが良いかと。
手元では動作させてみましたが、今回の記事ではざっとメモを取っただけになります。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://github.com/querqy/querqy&#34;&gt;Querqyというクエリのリライト用のプラグイン&lt;/a&gt;があるのでどんなものかを調べてみました。とりあえずは概要をドキュメントから追いかけてみた感じです。対応しているのはSolrとElasticsearch（以降、Es）になります。手元にはEsの環境があるのでそちらで試してみました。&lt;/p&gt;
&lt;h2 id=&#34;なにもの&#34;&gt;なにもの？&lt;/h2&gt;
&lt;p&gt;EsやSolrのプラグインで、ルールやパラメータを利用して、クエリの書き換えをEsやSolr側で行えるプラグインです。
なお、本記事ではEsのプラグインを説明します。
今回はドキュメントを読みながらメモを取った感じなので、詳細については&lt;a href=&#34;https://docs.querqy.org/querqy/index.html&#34;&gt;公式ドキュメント&lt;/a&gt;を見ていただくのが良いかと。
手元では動作させてみましたが、今回の記事ではざっとメモを取っただけになります。&lt;/p&gt;
&lt;h2 id=&#34;インストール&#34;&gt;インストール&lt;/h2&gt;
&lt;p&gt;Esのpluginコマンドでインストール可能ですが、Mavenにアップロードされているバージョンは限定的なので、必要に応じて自分でビルドする必要があります。
対応しているかは、&lt;a href=&#34;https://docs.querqy.org/querqy/index.html#installation&#34;&gt;公式ドキュメントのInstallation&lt;/a&gt;のプルダウンが参考になります。&lt;/p&gt;
&lt;h2 id=&#34;どうやって使うの&#34;&gt;どうやって使うの？&lt;/h2&gt;
&lt;p&gt;Query DSLに&lt;code&gt;querqy&lt;/code&gt;というクエリが追加されるので、あとはドキュメントをもとにクエリを組み立てるクエリを書いていきます。
すると、プラグインが指定されたルールに従い、EsのQueryに書き換え、実際の検索が実行して結果が返ってきます。
普通に&lt;code&gt;match&lt;/code&gt;などの既存のQueryと同レベルのものになるので、既存のEsのクエリと組み合わせた使い方もできるようです。&lt;/p&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;GET&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ecommerce&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_search&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:#e6db74&#34;&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;querqy&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;matching_query&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;query&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;notebook&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;query_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;title^3.0&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;brand^2.1&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;short_description&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;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;また、書き換え（Rewriter）の設定をElasticsearchに対して保存できるエンドポイント&lt;code&gt;_querqy/rewriter&lt;/code&gt;が用意されています。&lt;/p&gt;
&lt;p&gt;Synonymの書き換えを行なうサンプル（後述するCommon Rules Rewriterの設定）。&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;PUT&lt;/span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_querqy&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;rewriter&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;common_rules&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:#e6db74&#34;&gt;&amp;#34;class&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;querqy.elasticsearch.rewriter.SimpleCommonRulesRewriterFactory&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:#e6db74&#34;&gt;&amp;#34;config&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;rules&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;notebook =&amp;gt;\nSYNONYM: laptop&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;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;h2 id=&#34;どんな書き換えができるの&#34;&gt;どんな書き換えができるの？&lt;/h2&gt;
&lt;p&gt;用意されているRewriterは2022年7月時点では次のようなものになります（がんばれば、Javaで実装すれば自作もできそう）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Common Rules Rewriter&lt;/li&gt;
&lt;li&gt;Replace Rewriter&lt;/li&gt;
&lt;li&gt;Number Unit Rewriter&lt;/li&gt;
&lt;li&gt;Word Break Rewriter&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;また、複数のRewriterをチェインして使うこともできる。記述した順番で適用されます。
それぞれのRewriterについて簡単にメモを。&lt;/p&gt;
&lt;h3 id=&#34;common-rules-rewriter&#34;&gt;Common Rules Rewriter&lt;/h3&gt;
&lt;p&gt;シノニム、結果のブースト、フィルター、結果に対して追加情報を付与したりできます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;rules&lt;/code&gt;にルールを記載していきます。
以下のようなフォーマットになっています。
クエリが入力に合致したら、ルールが適用される形です。プロパティは後述しますが、ルールの適用する順序などをハンドリングするために使用します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;入力 =&amp;gt; 
  ルール
  ルール
  @プロパティ
  @プロパティ
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;入力部分に関する書式&#34;&gt;入力部分に関する書式&lt;/h4&gt;
&lt;p&gt;ルールの左辺に該当する部分で、クエリに入力された文字列がマッチするかどうかで、右辺のルールを適用するかがきまります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;入力の一致の条件は次のような感じです。
&lt;ul&gt;
&lt;li&gt;完全一致、前方一致、後方一致の使い分けが可能。ダブルクォート&lt;code&gt;&amp;quot;&lt;/code&gt;で制御&lt;/li&gt;
&lt;li&gt;デフォルトでは、大文字小文字の区別なし（後述するオプションで変更可能）&lt;/li&gt;
&lt;li&gt;単語の末尾にワイルドカード&lt;code&gt;*&lt;/code&gt;で1文字以上にマッチ。入力の最後にだけ利用可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;書き換えの命令ルール&#34;&gt;書き換えの命令（ルール）&lt;/h4&gt;
&lt;p&gt;右辺に利用できる命令で、次のようなものがあります。&lt;/p&gt;
&lt;h5 id=&#34;synonym&#34;&gt;SYNONYM&lt;/h5&gt;
&lt;p&gt;同義語展開するための命令です。Synonym Token Filterとの違いは、複数のルールを同時に適用できます。
フィールドに依存しない設定なのでメンテナンスが楽になるとのこと。
ただし、双方向の設定はないため、例えば&amp;quot;personal computer&amp;quot;と&amp;quot;pc&amp;quot;の場合、2つの設定を個別に定義する必要があります。
また、ステミングなどには未対応なので、&amp;ldquo;personal computers&amp;quot;も対応する場合はこれも追加する必要があります。
類義語ごとに重みを変えることが可能になっています。同列ではなく、同義語のスコアを下げるなどで、リコールを増加させつつ、入力語のスコアを上位にすると行ったことが可能です。&lt;/p&gt;
&lt;h5 id=&#34;updown&#34;&gt;UP/DOWN&lt;/h5&gt;
&lt;p&gt;入力文字列がマッチした場合に、追加のクエリを正か負のブーストをしつつ追加できます。
例えば、「iphone」と検索された場合に、「apple」もクエリとして追加しつつスコアをブーストし、「case」のクエリをスコアを下げるように追加できます。
これにより、アクセサリーではなく本体が検索結果の上位に出てくるような仕組みを提供できます。&lt;/p&gt;
&lt;h5 id=&#34;filter&#34;&gt;FILTER&lt;/h5&gt;
&lt;p&gt;UP/DOWNではクエリとして追加されていたが、こちらはフィルターとして追加されます（＝スコアで調整ではなく、結果から除外される）。&lt;/p&gt;
&lt;h5 id=&#34;delete&#34;&gt;DELETE&lt;/h5&gt;
&lt;p&gt;クエリからキーワードを削除できます。
単語自体をそのまま削除することも、入力された単語に合わせて他の単語を削除することもできます。&lt;/p&gt;
&lt;h5 id=&#34;decorate&#34;&gt;DECORATE&lt;/h5&gt;
&lt;p&gt;2022年7月時点でEsでは利用不可で、Solrのみで利用可能です（なので読み飛ばしました）。&lt;/p&gt;
&lt;h4 id=&#34;プロパティ&#34;&gt;プロパティ&lt;/h4&gt;
&lt;p&gt;各ルールの設定にタグをつけられるような機能です。
このプロパティを利用して、ルールのソートやフィルタリングなどが可能になります。
複数のルールにクエリがマッチした場合に、優先度が最高のものだけを適用したり、プロパティに特定の値を持っているものだけを採用したりできます。
なお、プロパティは命令のあとに記述する必要があります（パーサーの関係かな？）。&lt;/p&gt;
&lt;h3 id=&#34;replace-rewriter&#34;&gt;Replace Rewriter&lt;/h3&gt;
&lt;p&gt;クエリタームの置き換え用のRewriterです。クエリの正規化処理として、他のRewriterの前処理に利用したりできます。
サンプルではタイポの修正などに利用したり、不要な語の除去などがあげてありました。&lt;/p&gt;
&lt;h3 id=&#34;word-break-rewriter&#34;&gt;Word Break Rewriter&lt;/h3&gt;
&lt;p&gt;クエリトークンを分解・結合します。
たとえばドイツ語は、複合語と呼ばれる個別の意味の単語を結合した1つの単語を持っているため、個別の意味に分解して検索すると便利なことがあります。
そういった単語を辞書を基にして分割できるようにする機能です。
辞書とは実際のインデックスのタームディクショナリのことと思われます（&lt;strong&gt;要調査&lt;/strong&gt;。どのインデックスのフィールドを指し示すのかなど、設定とドキュメントではよくわからない）。
なお、利用可能な形態素解析を基にした実装はドイツ語のみとなっており、また、分解の時には形態素解析を考慮しますが結合時には考慮しません。&lt;/p&gt;
&lt;h3 id=&#34;number-unit-rewriter&#34;&gt;Number-Unit Rewriter&lt;/h3&gt;
&lt;p&gt;クエリの数値と単位を判別し、対象となるフィールドにマッチさせます。範囲での一致や完全一致やブーストが可能です。
単位をもとにして、特定のフィールドに対する数値のクエリに書き換えることができます。&lt;/p&gt;
&lt;h3 id=&#34;shingle-rewriter&#34;&gt;Shingle Rewriter&lt;/h3&gt;
&lt;p&gt;Solrのみで利用可能なので読み飛ばしました。&lt;/p&gt;
&lt;h3 id=&#34;ルールはどこに保存されるの&#34;&gt;ルールはどこに保存されるの？&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;.querqy&lt;/code&gt;というインデックスが内部で作成され、そこに保存されます（&lt;a href=&#34;https://docs.querqy.org/querqy/elasticsearch-plugin-configuration.html&#34;&gt;公式ドキュメントより&lt;/a&gt;）。
（ちなみに、&lt;a href=&#34;https://github.com/querqy/querqy-elasticsearch/blob/master/src/main/resources/querqy-mapping.json&#34;&gt;Mappingはこんな感じ&lt;/a&gt;みたいです）。
現状、プラグインでは設定したRewriterの取得ができないようなので、自分で登録した設定がどんなものかは、このインデックスを検索する必要がありそうです。&lt;/p&gt;
&lt;h2 id=&#34;気になった点改善点&#34;&gt;気になった点・改善点？&lt;/h2&gt;
&lt;p&gt;気になった点があったので。&lt;/p&gt;
&lt;!-- textlint-disable jtf-style/4.3.2.大かっこ［］ --&gt;
&lt;ul&gt;
&lt;li&gt;Rewriterのエンドポイントは、登録・更新・削除のみ対応しており、登録したものの確認は直接インデックスを見に行くしかなさそうです（&lt;a href=&#34;https://github.com/querqy/querqy-elasticsearch/issues/10&#34;&gt;Issueは作られてた&lt;/a&gt;）。&lt;/li&gt;
&lt;li&gt;[要検証]書き換えられたクエリがどんなものか？は残念ながら確認できなそうで、&lt;code&gt;_validate/query&lt;/code&gt;で最終的なLuceneレベルのクエリで確認するしかなさそう？&lt;/li&gt;
&lt;li&gt;スキーマ側で定義したものと、Querqyで定義したものの兼ね合いがどういう形になるのか？などを気にする必要があるのが注意点かも。組み合わせたときの副作用などがどんなことになりそうか？が予測がつきにくそう。&lt;/li&gt;
&lt;li&gt;Rewriterの定義自体のテストはどうしたものか？&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- textlint-enable jtf-style/4.3.2.大かっこ［］ --&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;とりあえず、ざっとドキュメントを見ながらメモを取った感じです。
設定などの記述が独自のものなので、そこに慣れていく必要がありそうです（特にルールの改行の部分とか）。
次は実際にどんな感じで使えそうか、既存の仕組みとの違いは？みたいなところをもう少し見ていきたいとおもいます。&lt;/p&gt;
&lt;h2 id=&#34;参考文献&#34;&gt;参考文献&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/querqy/querqy&#34;&gt;querqy/querqy： Query preprocessor for Java-based search engines (Querqy Core and Solr implementation)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.querqy.org/querqy/index.html&#34;&gt;Getting started with Querqy — querqy.org documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>今年もオンラインでBerlin Buzzwordsに参加した</title>
      <link>https://blog.johtani.info/blog/2022/06/15/ttend-berlin-buzzwords-online/</link>
      <pubDate>Wed, 15 Jun 2022 18:00:15 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2022/06/15/ttend-berlin-buzzwords-online/</guid>
      <description>&lt;p&gt;今年も&lt;a href=&#34;https://2022.berlinbuzzwords.de/&#34;&gt;Berlin Buzzwords&lt;/a&gt;にオンライン出張してました。
今年はハイブリッドな開催だったようで、現地で再開している人もいるようでした。
ブースもあったみたいです。ちなみに、現地で参加する人はマスク必須のようでした（&lt;a href=&#34;https://2022.berlinbuzzwords.de/health-safety&#34;&gt;Health &amp;amp; Safety&lt;/a&gt;というページが用意されていました）。
昨年オンラインだった&lt;a href=&#34;https://mices.co/&#34;&gt;MICES&lt;/a&gt;は現地のみでの開催みたいで見ることはできなかったです（録画公開されないかなぁ）。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今年も&lt;a href=&#34;https://2022.berlinbuzzwords.de/&#34;&gt;Berlin Buzzwords&lt;/a&gt;にオンライン出張してました。
今年はハイブリッドな開催だったようで、現地で再開している人もいるようでした。
ブースもあったみたいです。ちなみに、現地で参加する人はマスク必須のようでした（&lt;a href=&#34;https://2022.berlinbuzzwords.de/health-safety&#34;&gt;Health &amp;amp; Safety&lt;/a&gt;というページが用意されていました）。
昨年オンラインだった&lt;a href=&#34;https://mices.co/&#34;&gt;MICES&lt;/a&gt;は現地のみでの開催みたいで見ることはできなかったです（録画公開されないかなぁ）。&lt;/p&gt;
&lt;p&gt;さて、いくつか見たセッションで面白かったものがあったので簡単にメモを。
すでにセッションのビデオが&lt;a href=&#34;https://www.youtube.com/playlist?list=PLq-odUc2x7i8eaYHVXSOadHrVE9tEU2QR&#34;&gt;YouTubeで公開&lt;/a&gt;されているので、興味のある方は見てみてください。&lt;/p&gt;
&lt;h2 id=&#34;面白かったセッション&#34;&gt;面白かったセッション&lt;/h2&gt;
&lt;h3 id=&#34;the-future-of-lucenes-mmapdirectory-why-use-it-and-whats-coming-with-java-19-and-later&#34;&gt;The future of Lucene&amp;rsquo;s MMapDirectory: Why use it and what&amp;rsquo;s coming with Java 19 and later?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ： &lt;a href=&#34;https://pretalx.com/bbuzz22/talk/WYC9ZB/&#34;&gt;The future of Lucene&amp;rsquo;s MMapDirectory： Why use it and what&amp;rsquo;s coming with Java 19 and later? ： Berlin Buzzwords 2022 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;動画：&lt;a href=&#34;https://www.youtube.com/watch?v=hgF0jNxKrrg&#34;&gt;Uwe Schindler – The future of Lucene&amp;rsquo;s MMapDirectory： Why use it &amp;amp; what&amp;rsquo;s coming with Java19 &amp;amp; later - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;毎年恒例になってる気も？
前半は昨年も話をした内容で、後半はJava 19がリリースされたら、Previewという形でフラグを立てて使えるようになるようです。
使えるようにするから、テストしてみて！という感じで終わっていますｗ&lt;/p&gt;
&lt;h3 id=&#34;scaling-an-online-search-engine-to-thousands-of-physical-stores&#34;&gt;Scaling an online search engine to thousands of physical stores&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ：&lt;a href=&#34;https://pretalx.com/bbuzz22/talk/BRRB7M/&#34;&gt;Scaling an online search engine to thousands of physical stores ： Berlin Buzzwords 2022 ： pretalx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;動画：&lt;a href=&#34;https://www.youtube.com/watch?v=3M_rQvoCcAg&amp;amp;list=PLq-odUc2x7i8eaYHVXSOadHrVE9tEU2QR&amp;amp;index=24&#34;&gt;Aline Paponaud – Scaling an online search engine to thousands of physical stores - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;数千の実店舗の商品をオンラインで検索できるようにしつつ、オンラインのマーケットプレイスのような検索も一緒にできるようにしたというお話でした。
インデックスの構成をどう工夫したのか？とかどういうクラスター構成にして、どんなことをモニタリングしてるよ？というお話です。
実際の店舗がどんなものかなどは出てこなかったので、少しイメージは沸きにくかったのですが、どんなことを考えながらインデックスの構成とか考慮したよという話はおもしろかったです。
実際に検索したときに、実店舗のデータがどんな感じで結果として表示されたりするのか？といった点はわからなかったので、そのあたりの話をもうちょっと聞いてみたかったなぁ。&lt;/p&gt;
&lt;h3 id=&#34;offline-ranking-validation---predicting-ab-test-results&#34;&gt;Offline Ranking Validation - Predicting A/B Test Results&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ：&lt;a href=&#34;https://pretalx.com/bbuzz22/talk/NEQRBP/&#34;&gt;Offline Ranking Validation - Predicting A/B Test Results ： Berlin Buzzwords 2022 ： pretalx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;動画：&lt;a href=&#34;https://www.youtube.com/watch?v=Gk5IQidyJTQ&amp;amp;list=PLq-odUc2x7i8eaYHVXSOadHrVE9tEU2QR&amp;amp;index=5&#34;&gt;Andrea Schütt &amp;amp; Yunus Lutz – Offline Ranking Validation - Predicting A/B Test Results - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;otto.deというECサイトでのランキングをどうやって改善していくか？という話。
現在はマニュアルなチューニングをコンテキストごとにやっているけど、リクエスト量とかデータとかが増えてきてて、このままマニュアルで改善していくのも大変なので、
モデルベースのランキングを開発できないか？というのをはじめていますよと。
そのために、これまでのデータから、A/Bテストの結果を予測できるモデルが作れないか？というのをやっていますという話。
いくつかわからない単語も出てきたので、誰か詳しい人教えて！&lt;/p&gt;
&lt;h3 id=&#34;ai-powered-semantic-search-a-story-of-broken-promises&#34;&gt;AI-powered Semantic Search; A story of broken promises?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ：&lt;a href=&#34;https://pretalx.com/bbuzz22/talk/7TYXQN/&#34;&gt;AI-powered Semantic Search; A story of broken promises? ： Berlin Buzzwords 2022 ： pretalx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;動画：&lt;a href=&#34;https://www.youtube.com/watch?v=7ozfzKLTFV4&amp;amp;list=PLq-odUc2x7i8eaYHVXSOadHrVE9tEU2QR&amp;amp;index=18&#34;&gt;Jo Kristian Bergum – AI-powered Semantic Search; A story of broken promises? - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vespaの開発にかかわってる方の、Semantic Searchに関する話。
Semantic Searchが流行り始めていて、どうやればできるのか？という話が出てきています。
けど、どういうものでどういう点に気を付けたほうがいい？という話でした。
LtRってこんなもの、そのあとに出てきたLLM（Large Language Model）でどうやって検索の改善に使えるの？というのが分かりやすく説明されていました。
それらの説明の後、&lt;a href=&#34;https://arxiv.org/abs/2104.08663&#34;&gt;BEIR&lt;/a&gt;という論文を紹介しつつ、LLMを使うときの注意点の話がありました。&lt;/p&gt;
&lt;p&gt;BERTとかをちょっと勉強してたのもあり、なんとなくそうだよなぁと思っていた結論と同じ結論が出てきたので面白いと感じました。
BEIRの論文は時間を見つけて読んでみないとな。&lt;/p&gt;
&lt;h3 id=&#34;hybrid-search--sum-of-its-parts&#34;&gt;Hybrid search &amp;gt; sum of its parts?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ： &lt;a href=&#34;https://pretalx.com/bbuzz22/talk/YEHRTE/&#34;&gt;Hybrid search &amp;gt; sum of its parts? ： Berlin Buzzwords 2022 ： pretalx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;動画：&lt;a href=&#34;https://www.youtube.com/watch?v=R5BLbnXPR5c&amp;amp;list=PLq-odUc2x7i8eaYHVXSOadHrVE9tEU2QR&amp;amp;index=10&#34;&gt;Lester Solbakken – Hybrid search： Greater than the sum of its parts? - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こちらもVespaの人の話。
先ほどのSemantic Searchの話では、Semantic Searchがどんなものか？という話でした。
が、それだけで検索ができるわけでもないので、キーワードサーチとSemantic Searchの両方をうまく活用するには？というのがこのセッションでした。
最終的にはVespaを使うとうまくハイブリッドできるよという話ですが、考え方は参考になるかなと。
Vespaも触ってみたいなぁ。&lt;/p&gt;
&lt;h3 id=&#34;the-life-of-a-search-engine-administrator&#34;&gt;The life of a search engine administrator&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ：&lt;a href=&#34;https://pretalx.com/bbuzz22/talk/P9ZFJL/&#34;&gt;The life of a search engine administrator ： Berlin Buzzwords 2022 ： pretalx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;動画：&lt;a href=&#34;https://www.youtube.com/watch?v=MAYH4qG-b0w&amp;amp;list=PLq-odUc2x7i8eaYHVXSOadHrVE9tEU2QR&amp;amp;index=27&#34;&gt;Lucian Precup &amp;amp; Vincent Bréhin – The life of a search engine administrator - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;検索システムの管理者ってどんなことやるの？それにはどんなことができるツールがあるといいの？という話です。
まぁ、ツールについてはこの会社の人たちのツールの宣伝なのですが、検索システムを作って育てていくのにどんなことを考えたりするのか？という参考になるかなぁと。&lt;/p&gt;
&lt;h3 id=&#34;should-we-stop-using-distance-in-our-location-based-data-recommendation-models&#34;&gt;Should we stop using distance in our location-based data recommendation models?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ：&lt;a href=&#34;https://pretalx.com/bbuzz22/talk/S9EVEB/&#34;&gt;Should we stop using distance in our location-based data recommendation models? ： Berlin Buzzwords 2022 ： pretalx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;動画：&lt;a href=&#34;https://www.youtube.com/watch?v=I5Ks0fpUItk&amp;amp;list=PLq-odUc2x7i8eaYHVXSOadHrVE9tEU2QR&amp;amp;index=46&#34;&gt;Charlie Davies – Should we stop using distance in our location-based data recommendation models? - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://traveltime.com/&#34;&gt;TravelTime&lt;/a&gt;という会社を立ち上げた人の話。
位置に関する情報って重要だし、検索するときに利用しますよね？例えば、ホテル決めたりとか、仕事探したりするときに。
ということで、位置情報を検索エンジンで利用する方法（Bounding Box、ポリゴン、距離）をまず紹介して、どんなユースケースで使えるかという話があります。
また、それとは別に検索速度（いかに検索を速く返すか）も重要だという話があります（ウォルマートはページロード時間を1秒早くしてコンバージョンが2%あがったとか）。
で、実際に検索結果に距離とかでるけど、実際に知りたいのはどのくらいの時間で行けるのか？という話だったりしませんか？と。
公共交通機関を使ったりする場合に、実際に45分で移動できる距離というのは半径5マイルとかできまるものではないのに、単純に位置情報を利用した距離だけでソートしていいの？という問いかけから、
その辺を考慮した検索ができるAPIを開発しているよ、検索速度もはやいよというお話でした。
残念ながら具体的にどうやって作っているのか？というのはなかったですが、観点がおもしろかったです。&lt;/p&gt;
&lt;h3 id=&#34;word2vec-model-to-generate-synonyms-on-the-fly-in-apache-lucene&#34;&gt;Word2Vec model to generate synonyms on the fly in Apache Lucene&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ：&lt;a href=&#34;https://pretalx.com/bbuzz22/talk/UYZAUX/&#34;&gt;Word2Vec model to generate synonyms on the fly in Apache Lucene ： Berlin Buzzwords 2022 ： pretalx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;動画：&lt;a href=&#34;https://www.youtube.com/watch?v=rKYJQhZxQFQ&amp;amp;list=PLq-odUc2x7i8eaYHVXSOadHrVE9tEU2QR&amp;amp;index=54&#34;&gt;Daniele Antuzi &amp;amp; Ilaria Petreti – Word2Vec model to generate synonyms on the fly in Apache Lucene - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Word2Vecのモデルを使った、Apache LuceneのSynonym Filterを開発中だよという話
DeepLearning4Jを使ってみたが、遅くて使えなかったんだけど、最近Luceneに入ったkNNを使うことでそれなりの速度で使えそうなものができるかもよ？って感じでした。
モデル学習用のツールも作ってて、イタリア語のWikipediaで学習したものでちょっと動かしたらそれっぽい感じになってるという話でした。
まだ途中でいくつかやりたいことがあるという話で、実用はまだ先のようでした。例えば、1単語のSynonymにしか対応してないとか、モデルをインメモリでしか動かせないとか。&lt;/p&gt;
&lt;p&gt;QAでも出たのですが、Word2Vecだと対義語も類似していると判定されてしまうと思うので、その辺がどうなっているのかなぁ？という疑問があります。
ルールベースの類義語ではないので、調整するのはどうやるのかなぁ、学習用のコーパスをいい感じにするとかなのかな？とか、気になるところです。&lt;/p&gt;
&lt;h3 id=&#34;nrtsearch-yelps-fast-scalable-and-cost-effective-open-source-search-engine&#34;&gt;NrtSearch: Yelp’s fast, scalable, and cost-effective open source search engine&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ：&lt;a href=&#34;https://pretalx.com/bbuzz22/talk/ZUNELS/&#34;&gt;NrtSearch： Yelp’s fast, scalable, and cost-effective open source search engine ： Berlin Buzzwords 2022 ： pretalx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;動画：&lt;a href=&#34;https://www.youtube.com/watch?v=ydrsVKrclGY&amp;amp;list=PLq-odUc2x7i8eaYHVXSOadHrVE9tEU2QR&amp;amp;index=40&#34;&gt;Umesh Dangat – NrtSearch： Yelp’s fast, scalable, and cost-effective open source search engine - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;YelpがLuceneベースで開発をしているNrtSearchというOSSの話です。
Elasticsearchを使っていたんだけど、どういった点が問題点になってどういうモチベーションでNrtSearchを開発したのか？を説明しています。
アーキテクチャがどんなもので、実際に動かしてみてどんな利点があって、どんな点が問題として出てきているか、将来どんなことをやろうとしているかがわかります。
QAでもいろんな質問が出ていて面白いです。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、簡単でしたがセッションの感想でした。
Neural/Semantic Searchというのがセッションのタイトルなどに入っているのが多くなってるなぁという感想です（ちょっとやってみたい気はしてるんだよなぁ）。
すでにYouTubeに動画が公開されているので興味があるセッションを見つけてみてください。
Berlin Buzzwordsの次の日に開催されたMICESも観てみたかったですが、オンラインでも参加できる形式で海外のカンファレンスが開催されるのはとても助かりますね（ヨーロッパだと時差もそれほど大変じゃないし）。
けど、落ち着いたらまたオフラインで参加してみたいなぁ。&lt;/p&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>インデックスエイリアス - Azure Cognitive Searchの新機能</title>
      <link>https://blog.johtani.info/blog/2022/05/18/index-alias-in-azure-cognitive-search/</link>
      <pubDate>Wed, 18 May 2022 15:54:17 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2022/05/18/index-alias-in-azure-cognitive-search/</guid>
      <description>&lt;p&gt;Azure Cognitive Searchで2月に新しい機能が公開されました。
「Index Alias」（インデックスの別名）です。まだ、パブリックプレビューの段階ですが、ドキュメントなどが公開されていたのでどんな機能かを調べてみました。&lt;strong&gt;なお、本ブログの内容は2022/05/18時点での内容となります、ご注意ください。&lt;/strong&gt;&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Azure Cognitive Searchで2月に新しい機能が公開されました。
「Index Alias」（インデックスの別名）です。まだ、パブリックプレビューの段階ですが、ドキュメントなどが公開されていたのでどんな機能かを調べてみました。&lt;strong&gt;なお、本ブログの内容は2022/05/18時点での内容となります、ご注意ください。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;公式ドキュメント&#34;&gt;公式ドキュメント&lt;/h2&gt;
&lt;p&gt;まずは公式ドキュメントです。1つ目の「インデックスの別名を作成する」の冒頭で別名（エイリアス）がどんなものかを説明しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/search-how-to-alias?tabs=rest&#34;&gt;インデックスの別名を作成する - Azure Cognitive Search | Microsoft Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.microsoft.com/ja-JP/rest/api/searchservice/preview-api/create-or-update-alias&#34;&gt;エイリアスの作成または更新 (2021-04-30-Preview) - Azure Cognitive Search | Microsoft Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.microsoft.com/en-us/rest/api/searchservice/preview-api/alias-operations&#34;&gt;Alias Operations (2021-04-30-Preview) - Azure Cognitive Search | Microsoft Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;REST APIのドキュメント（2022/05/18現在、日本語のページだと左のメニューが壊れているため、どんなAPIがあるかがわかりにくいため、Alias Operationsのページは英語のリンクになっています）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;インデックスエイリアスってどんなもの&#34;&gt;インデックスエイリアスってどんなもの？&lt;/h2&gt;
&lt;p&gt;文字通り、インデックスにエイリアス（別名）をつけることができるようになります。
Azure Cognitive Searchでは残念ながらインデックスを作成するタイミング以外ではインデックスの名前を&lt;strong&gt;変更できません&lt;/strong&gt;。
このため、インデックスのスキーマ（Analyzerの設定変更など）を変更したい場合、新しいインデックスを作成します。
新しいインデックスの名前はこれまでのものとは別の名前になってしまうため、アプリケーションで指定しているインデックス名も書き換える必要が出てきます。
利用しているアプリが複数ある場合は、すべて変更が必要です。&lt;/p&gt;
&lt;p&gt;今回出てきたエイリアスを利用することで、アプリケーションではエイリアスを指定することで、アプリケーション側の変更なくインデックスを入れ替えることができるようになります。&lt;/p&gt;
&lt;h2 id=&#34;エイリアスの操作方法&#34;&gt;エイリアスの操作方法&lt;/h2&gt;
&lt;p&gt;公式ドキュメントにAPIの一覧や利用方法の記載があるので詳細はそちらをご覧ください。
本ブログでは、いくつか利用するときに気になった点を書き残しておきます。&lt;/p&gt;
&lt;h3 id=&#34;作成&#34;&gt;作成&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;aliases&lt;/code&gt;というエンドポイントにエイリアスの名前とインデックス名をPOSTすることで作成できます。
以下のサンプルは公式ドキュメントの例です。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;POST /aliases?api-version=2021-04-30-preview
{
    &amp;#34;name&amp;#34;: &amp;#34;my-alias&amp;#34;,
    &amp;#34;indexes&amp;#34;: [&amp;#34;hotel-samples-index&amp;#34;]
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ちなみに、インデックスの指定が&lt;code&gt;indexes&lt;/code&gt;で配列になっていますが、公式ドキュメントに以下の記述があり、複数の指定はできないです（エラーが返ってきます）。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;indexes 配列に指定できるインデックスの名前は 1 つだけです。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;また、1つのインデックスに対して複数のエイリアスをつけることは問題ありません。&lt;/p&gt;
&lt;h3 id=&#34;確認&#34;&gt;確認&lt;/h3&gt;
&lt;p&gt;エイリアスのリストも取得できます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;GET /aliases?api-version=2021-04-30-preview
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;現在どんなエイリアスが、どのインデックスに対して付与されているかがリストで取得できます。
きちんと作成されたかどうかなどの確認にも使えるかと思います（もちろんエイリアス名を指定したGETも可能です）&lt;/p&gt;
&lt;h3 id=&#34;検索での利用&#34;&gt;検索での利用&lt;/h3&gt;
&lt;p&gt;検索のREST APIでインデックス名を指定していた部分をエイリアス名に置き換えるだけです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;POST /indexes/my-alias/docs/search?api-version=2021-04-30-preview
{
    &amp;#34;search&amp;#34;: &amp;#34;pool spa +airport&amp;#34;,
    &amp;#34;searchMode&amp;#34;: any,
    &amp;#34;queryType&amp;#34;: &amp;#34;simple&amp;#34;,
    &amp;#34;select&amp;#34;: &amp;#34;HotelId, HotelName, Category, Description&amp;#34;,
    &amp;#34;count&amp;#34;: true
}
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;更新&#34;&gt;更新&lt;/h3&gt;
&lt;p&gt;エイリアスの更新（インデックスの入れ替え）は作成と同じリクエストです。
更新が成功すれば&lt;code&gt;204&lt;/code&gt;のステータスコードが返ってきます（エイリアス初回作成時は&lt;code&gt;201&lt;/code&gt;）
なお、ドキュメントには以下のような記述があります。入れ替え時の注意点になるかと（入れ替えのタイミングをきちんと制御したい場合は、少しだけアプリケーションを停止するなどが必要かと思います）。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;別名に対する更新がシステムに反映されるまでに最大 10 秒かかります。以前その別名が対応付けられていたインデックスを削除するのは、10 秒以上待ってからにしてください。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;削除&#34;&gt;削除&lt;/h3&gt;
&lt;p&gt;もちろん削除もできます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;DELETE /aliases/my-alias
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;エイリアスを利用する場合の注意点&#34;&gt;エイリアスを利用する場合の注意点&lt;/h2&gt;
&lt;p&gt;便利なエイリアスですが、エイリアスが使用できない場合もあるので注意が必要です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データ登録のAPIと検索のAPIでのみエイリアス名を利用可能
&lt;ul&gt;
&lt;li&gt;インデックスの設定変更やAnalyze Text APIではこれまで通りインデックス名を指定します。&lt;/li&gt;
&lt;li&gt;また、エイリアス名は&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/search-howto-create-indexers?tabs=portal&#34;&gt;インデクサー機能&lt;/a&gt;で&lt;code&gt;targetIndexName&lt;/code&gt;にも指定できません。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;エイリアス名がついているインデックスは削除不可
&lt;ul&gt;
&lt;li&gt;エイリアスがついているインデックスを削除しようとした場合はエラーが出るようになっています。&lt;/li&gt;
&lt;li&gt;まずはエイリアスを削除してからインデックスを削除するという手順になります。&lt;/li&gt;
&lt;/ul&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;正式公開されればですが、今後Azure Cognitive Searchを使ったアプリを開発する場合はインデックスエイリアスを利用することを基本にするのがいいかもなと思います
（ちなみに、Elasticsearchにもインデックスエイリアスの機能がありますが、異なる点が多いので同じものとは思わないほうがよさそうです）。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Extreme Multi-label Learning for Semantic Matching in Product Searchという論文を読んだ</title>
      <link>https://blog.johtani.info/blog/2022/01/12/reading-xmc-for-semantic-search-in-prod/</link>
      <pubDate>Wed, 12 Jan 2022 18:41:02 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2022/01/12/reading-xmc-for-semantic-search-in-prod/</guid>
      <description>&lt;p&gt;年末までに知り合いと次の論文を読んだので軽くまとめておきます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://dl.acm.org/doi/10.1145/3447548.3467092&#34;&gt;Extreme Multi-label Learning for Semantic Matching in Product Search&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;なんで読んだの&#34;&gt;なんで読んだの？&lt;/h2&gt;
&lt;p&gt;前回読んだ理由と一緒ですが、&lt;code&gt;Semantic Search&lt;/code&gt;に絡んだ検索の論文であり、Amazonの製品検索での話も関係していたので読みました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;年末までに知り合いと次の論文を読んだので軽くまとめておきます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://dl.acm.org/doi/10.1145/3447548.3467092&#34;&gt;Extreme Multi-label Learning for Semantic Matching in Product Search&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;なんで読んだの&#34;&gt;なんで読んだの？&lt;/h2&gt;
&lt;p&gt;前回読んだ理由と一緒ですが、&lt;code&gt;Semantic Search&lt;/code&gt;に絡んだ検索の論文であり、Amazonの製品検索での話も関係していたので読みました。&lt;/p&gt;
&lt;h2 id=&#34;どんな論文&#34;&gt;どんな論文？&lt;/h2&gt;
&lt;p&gt;Amazonの製品検索でセマンティックマッチングを利用する方法、レイテンシを低くしつつ再現率を改善できるような仕組みを検討して評価した論文です。
実際には商品検索のマッチングを大規模なマルチラベル問題（Extreme Multi-label Classification：以下ではXMC問題とする）として定義して、その問題を効率よく解く方法について検討評価しています。&lt;/p&gt;
&lt;p&gt;検索には大きく2つのフェーズがあります。マッチング（クエリにヒットした文書の集合を求める）とランキング（マッチングのデータを関連性の高い順序で並べる）です。
前回のMSの論文では、マッチング後のランキングのフェーズで言語モデルを利用した並び替えを行う話でした。
今回の論文ではマッチングに関してセマンティックサーチを有効活用できないか？という論文になります。
転置インデックスベースの（語彙による）検索では、スペルミスや類義語などを検索することが難しいです。
語彙以外のデータ（クリックや購入といったユーザーの行動や製品の意味的表現など）を学習できる埋め込みベースのニューラルモデルを活用して、マッチングを補完する方法を検討しています。
下図のようにあくまで転置インデックスベースの検索の補完として利用するみたいです（論文に掲載されていたアーキテクチャ）。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20220112/system.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20220112/system.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h3 id=&#34;xmc問題とは&#34;&gt;XMC問題とは？&lt;/h3&gt;
&lt;p&gt;セマンティックサーチを行なう場合、埋め込みベースのニューラルモデル（例えばBERTとか）を利用することが多いですが、
クエリトークンを埋め込み空間にベクトル化する部分が推論のボトルネック（レイテンシが高くなる）になることが多いです。
これは、ニューラルネットワークの複雑さに依存します。
低レイテンシになるように、複雑ではないエンコーダーを用いることもありますが今度は性能（精度）が良くなくなります。&lt;/p&gt;
&lt;p&gt;そこで、この論文ではセマンティックマッチングをXMC問題として定義し、これを効率よく解くための手法を提案しています。
ここで、XMCの問題とは、入力（今回はクエリ）に対して、最も関連性の高い複数のラベル（今回は製品）を出力することとなります。
Amazonでの製品なのでほんとに大規模（ラベル＝製品＝1億件）です。&lt;/p&gt;
&lt;p&gt;従来のXMC問題を解くための手法として、疎な線形モデルの手法、パーティションベースの手法、グラフベースの手法などが列挙されています。
疎な線形モデルの手法では、ナイーブなOVR(one-versus-rest)だと出力となるラベルの数に対して線形に推論時間も大きくなるため、今回の用途には適しません。
この論文ではパーティションベースの手法として、推論時間を短くできるツリーベースで疎な線形モデルの手法を評価しています。&lt;/p&gt;
&lt;h2 id=&#34;どういう仕組み&#34;&gt;どういう仕組み？&lt;/h2&gt;
&lt;p&gt;ツリーベースのモデルは次のような感じです。
&lt;a href=&#34;https://arxiv.org/abs/2010.05878&#34;&gt;PECOS&lt;/a&gt;のXR-Linearモデルを利用しています。
モデルに関する詳細についてはこちらの論文に詳しく載っているようです（まだ読んでいないです、、、）。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20220112/xr-linear.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20220112/xr-linear.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;一番上に入力として与えられる&lt;code&gt;x&lt;/code&gt;がクエリ（ベクトル）で一番下の四角が製品にあたるラベル（&lt;code&gt;Y={1,...,l,...L}&lt;/code&gt;）です。
これらが与えられたときに最も関連性の高い上位&lt;code&gt;k&lt;/code&gt;件のラベル（製品）を出力するモデルを生成します。
モデルのパラメータは、学習データとして&lt;code&gt;(x, y)&lt;/code&gt;(ここで、&lt;code&gt;y∈{0, 1}^𝐿&lt;/code&gt;、すなわちクエリに製品がマッチするかしないかの二値)を使って調整します。&lt;/p&gt;
&lt;p&gt;これは、ツリーのそれぞれの階層のノードで、その下の層に関連するデータがあるかどうか？という分類を学習すればよいことになります。
学習データとしては、入力と最下層のラベルにマッチするかどうかというデータです。
これをもとに、ツリーの最下層のデータをもとにひとつ上の層の分類器の学習をすればよいことになります。&lt;/p&gt;
&lt;p&gt;推論は出来上がったツリーベースのモデルに対して、ビームサーチで行ないます。
この時、それぞれの層のノードの分類器では推論の効率化のために枝刈りの閾値を設定しています。
本論文で閾値の違いによる精度とレイテンシの比較も行われています。
また、ビームサーチのビームサイズを変化させた場合の性能についても実験しています。&lt;/p&gt;
&lt;h2 id=&#34;どうやって検証した&#34;&gt;どうやって検証した？&lt;/h2&gt;
&lt;p&gt;次のようなデータを用いてAWS上にモデル構築、推論のシステムを用意し実験しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;10億件以上のポジティブなクエリ-商品ペアのデータセット
&lt;ul&gt;
&lt;li&gt;クエリ：2億4千万、商品：1億&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ポジティブなペアとは、クリック数や購入数の集計値が閾値以上。ただし、データセットとしては集計値は利用していない。&lt;/li&gt;
&lt;li&gt;トレーニングセット：12か月分の検索ログ&lt;/li&gt;
&lt;li&gt;評価用テストセット：1か月分の検索ログ（12％の製品はトレーニングセットには出てこない）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;というデーセットをもとに上記のモデルを学習しています。
特徴量はクエリテキストと製品のタイトルをもとにTF-IDFをいくつかのパターンで導出したものが使われています。
詳しくは論文の結果に関する表などを見ていただくとして。。。&lt;/p&gt;
&lt;p&gt;結果として、1億件の商品カタログで60.9%のRecall@100を1.25ミリ秒/リクエストという低レイテンシで達成したとなっています。&lt;/p&gt;
&lt;h2 id=&#34;気になる点は&#34;&gt;気になる点は？&lt;/h2&gt;
&lt;p&gt;知り合いと3人で読んでいて次のような気になる点が出てきました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ツリーの構築をするときに、製品の&lt;strong&gt;ラベルの並び順&lt;/strong&gt;（製品のクラスタリング？に他製品が似た場所に来る感じ）が推論の効率の良し悪しに影響するんじゃないの？＝Amazonではないところではうまくいかない？
&lt;ul&gt;
&lt;li&gt;PECOSの論文読まないといけない？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;製品が&lt;strong&gt;増えたとき&lt;/strong&gt;にモデルの組み換えとかどうするの？
&lt;ul&gt;
&lt;li&gt;コールドスタート問題という形で今後の課題として書かれていたので、今後に期待&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;転置インデックスでのマッチングの補完として利用しているということだったけど、&lt;strong&gt;ランキングはどうしてるんだろう&lt;/strong&gt;？
&lt;ul&gt;
&lt;li&gt;別のランキング用の指標があるのかな？上位k件とした場合にどうやって、決めているのか？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&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;ツリーの作り方に関するPECOSの論文を誰か解説してくれると嬉しいかもなぁと思いつつ、とりあえずブログに書き残してみました。参考になるかなぁ。。。&lt;/p&gt;
&lt;h2 id=&#34;参考文献&#34;&gt;参考文献&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://dl.acm.org/doi/10.1145/3447548.3467092&#34;&gt;Extreme Multi-label Learning for Semantic Matching in Product Search - ACM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.amazon.science/publications/extreme-multi-label-learning-for-semantic-matching-in-product-search&#34;&gt;Extreme multi-label learning for semantic matching in product search - Amazon Science&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://arxiv.org/abs/2010.05878&#34;&gt;PECOS： Prediction for Enormous and Correlated Output Spaces&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kamujun.hatenablog.com/entry/2018/06/22/180605&#34;&gt;数えきれないほどの分類を行うExtreme Classification - Technical Hedgehog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>今年の振り返りと来年の抱負（2021）</title>
      <link>https://blog.johtani.info/blog/2021/12/31/looking-back-2021/</link>
      <pubDate>Fri, 31 Dec 2021 22:29:19 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2021/12/31/looking-back-2021/</guid>
      <description>&lt;p&gt;今年も振り返りブログです。録画した紅白をオッかけ再生して気になるアーティストだけ見ながら書ています。&lt;/p&gt;
&lt;h2 id=&#34;振り返り2020年に書いた抱負から&#34;&gt;振り返り（2020年に書いた抱負から）&lt;/h2&gt;
&lt;p&gt;まずは去年の抱負を元に書きます。今年もコロナウィルスの影響が年末まで続き、ほとんどで書けなかったです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今年も振り返りブログです。録画した紅白をオッかけ再生して気になるアーティストだけ見ながら書ています。&lt;/p&gt;
&lt;h2 id=&#34;振り返り2020年に書いた抱負から&#34;&gt;振り返り（2020年に書いた抱負から）&lt;/h2&gt;
&lt;p&gt;まずは去年の抱負を元に書きます。今年もコロナウィルスの影響が年末まで続き、ほとんどで書けなかったです。&lt;/p&gt;
&lt;h3 id=&#34;フリーランス継続&#34;&gt;フリーランス継続?&lt;/h3&gt;
&lt;p&gt;ありがたいことに個人事業主として無事1年を終えられました。
夏頃は5社ほどお手伝いをさせていただき、年末時点では3社をお手伝いさせていただいています。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/12/31/looking-back-2020/&#34;&gt;昨年の振り返り&lt;/a&gt;で書いた2社はありがたいことに継続していただいています。&lt;/p&gt;
&lt;p&gt;今年も完全リモートで仕事が終わりました。オミクロン株が来ているし、来年春くらいにはミーティングに出かけられるかなぁ。
相変わらず検索のお手伝いをしています。手伝いをしつつ勉強させていただいている感じです。
ありがたし。&lt;/p&gt;
&lt;h3 id=&#34;プログラミング&#34;&gt;プログラミング&lt;/h3&gt;
&lt;p&gt;ちょっとペースダウンしています。。。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/extract-kana-java&#34;&gt;extract-kana-java&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;新しく書いたのはこれくらいかな。
SudachiやNeologdのkuromojiでフリガナを出力して違いを見るというコマンドツールです。
ちょっと比較してみたくなったので書いて公開しました。&lt;/p&gt;
&lt;p&gt;あとは、Sudachiをいろいろと触り始めています。
来年はそのへんをもうちょっと何かできるかなぁ。
コーディングしないとよくないなぁと思っているので、強制的になんかやらないとだ。&lt;/p&gt;
&lt;h3 id=&#34;検索の勉強&#34;&gt;検索の勉強&lt;/h3&gt;
&lt;p&gt;仕事でやってます。ブッチャー本は昨年買って手を付けてませんが。。。
来年は少しずつやる予定です。
あとは、&lt;a href=&#34;https://blog.johtani.info/blog/2021/07/01/semantic-search-in-azure-cognitive-search/&#34;&gt;Azure Cognitive SearchのSemantic Searchを触った&lt;/a&gt;関係でSemantic Searchに関する論文を探してちょっとずつ読んでいます。
知り合いと読んでいたAmazonの論文をブログにまとめるのは来年早々に。。。&lt;/p&gt;
&lt;h3 id=&#34;検索のポッドキャスト&#34;&gt;検索のポッドキャスト?&lt;/h3&gt;
&lt;p&gt;これはできませんでした。重い腰が上がらない。
公開しないまでも雑談したいなぁ。&lt;/p&gt;
&lt;h2 id=&#34;振り返り今年あったできごと&#34;&gt;振り返り(今年あったできごと)&lt;/h2&gt;
&lt;p&gt;ここからは今年の出来事を。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自宅環境&lt;/li&gt;
&lt;li&gt;キーボード以外もDIY&lt;/li&gt;
&lt;li&gt;検索Slack爆誕&lt;/li&gt;
&lt;li&gt;車買い替えた&lt;/li&gt;
&lt;li&gt;WindowsノートPC買った&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今年もずっと自宅で仕事でした。
昨年だいぶそろえていたのでそれほど変更はないですが。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2021/02/25/update-working-facility/&#34;&gt;2月バージョン&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;切り替えてからずっとWindowsです。Macもブラウズ用に使ってはいますが。
ただ、Windowsといっても、プログラムなどに関する環境はほぼWSL2になっています。コマンドプロンプトは触ってないなぁ。
今年最後に更新された自宅環境は椅子になります。
詳しくは&lt;a href=&#34;https://blog.johtani.info/blog/2021/12/29/best-buy-2021/&#34;&gt;昨日のブログ&lt;/a&gt;をご覧ください。&lt;/p&gt;
&lt;p&gt;キーボードもDIYしましたが、今年はほかにも少しDIYしました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2021/12/08/controller-rack/&#34;&gt;今年のDIYキーボードとコントローラーラック&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このブログにも書きましたが、来年はキーマップやファーム関連を触っていきたいなと。あとロータリーエンコーダー。。。
BLE化は快適で、3台のPCの切り替えがとっても便利です。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/takuya_b/status/1377219737457860610?s=20&#34;&gt;takuya_aさんの鶴の一声&lt;/a&gt;で検索のSlackが爆誕しました。
検索に関連する情報交換ができる場として楽しませてもらってます。
年末には&lt;a href=&#34;https://twitter.com/joho_hideo/status/1474227545948430338?s=20&#34;&gt;検索100本ノック&lt;/a&gt;の話が立ち上がってきています。
来年も面白い話が聞けそうでワクワクしています。&lt;/p&gt;
&lt;p&gt;あとは、車を買い替えました。初のハイブリッドです。
まだまだ慣れないですが、燃費とかがとても楽しみです。&lt;/p&gt;
&lt;p&gt;結局まだ出かけていませんが、出かけられるようにFMV Zeroを購入しました。
このブログもリビングでFMV Zeroで書いています（まだちゃんとセットアップしていないので、実際にはリモートデスクトップでデスクトップにつないでそこのVSCodeで書いちゃってますが。。。）。
ブログ書いたりコード書ける程度の環境は作らないとな。&lt;/p&gt;
&lt;h2 id=&#34;来年の抱負&#34;&gt;来年の抱負&lt;/h2&gt;
&lt;p&gt;ということで、来年の抱負です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;フリーランス継続&lt;/li&gt;
&lt;li&gt;プログラミング&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;p&gt;プログラミングは失速気味のでなにかテーマを見つけないとなあ。&lt;/p&gt;
&lt;p&gt;ブッチャー本は読み始めます。必ずｗ&lt;/p&gt;
&lt;p&gt;ブログのペースが落ちていたり、本を読むペースが落ちているので、
本を読んで自分のためにもブログを書こうと思います。
書いてないって思ったら叱咤してください。。。&lt;/p&gt;
&lt;p&gt;今年も出かけられませんでしたが、仕事も安定してあり、無事乗り切れました。
人と話をする機会は減っているので雑談したいな、オンラインなどで。
相手をしてやってもいいぞという方はぜひ連絡ください。&lt;/p&gt;
&lt;p&gt;さて、来年（もう年あけちゃったけど）は出かけられるかなぁ。
何はともあれ、今年もよろしくお願いします！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>2021年かって良かったもの</title>
      <link>https://blog.johtani.info/blog/2021/12/29/best-buy-2021/</link>
      <pubDate>Wed, 29 Dec 2021 22:28:24 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2021/12/29/best-buy-2021/</guid>
      <description>&lt;p&gt;2021年もあと少しですが、今年買って良かったものをリストアップしておこうかと思います。
今年買ったといいながら、昨年このネタを書くといいつつ書いてないので、昨年の分も入っているかも？
Amazonのアフィリンクを貼っていますが、急いでないものはAliExpressで購入したりもしています。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;2021年もあと少しですが、今年買って良かったものをリストアップしておこうかと思います。
今年買ったといいながら、昨年このネタを書くといいつつ書いてないので、昨年の分も入っているかも？
Amazonのアフィリンクを貼っていますが、急いでないものはAliExpressで購入したりもしています。&lt;/p&gt;
&lt;h2 id=&#34;象印のポット&#34;&gt;象印のポット&lt;/h2&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07VN56Z31/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/31wGGcBthrL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07VN56Z31/?tag=johtani-22&#34;&gt;
      Amazon | 象印 電気ケトル 1.0L コーヒードリップ用機能付き ホワイト CK-AX10-WA | 象印マホービン(ZOJIRUSHI) 
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;いわゆる電気ケトルというやつです。これが来るまでは鍋で湯を沸かしていました。
水を入れてボタンを押し、湯を沸かしている間に他のことができるのはやはり便利です。
また、コーヒーを入れるためのコーヒードリップモードがあるので、ドリップするためにわざわざ湯を他のものに入れたり、
専用のヤカンを使わなくても簡単にドリップができるのがさらに便利で重宝しています。&lt;/p&gt;
&lt;h2 id=&#34;ウォータードリップコーヒーサーバー&#34;&gt;ウォータードリップコーヒーサーバー&lt;/h2&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B01DCWR0ZK/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/314gocYyH8L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B01DCWR0ZK/?tag=johtani-22&#34;&gt;
      Amazon | iwaki(イワキ) コーヒーサーバー SNOWTOP ウォータードリップ 
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;ここ数年、冬以外は水出しコーヒーを飲んでいます。
麦茶のポットのような水出しコーヒー用ポットを使っていたのですが、滴下式のほうがえぐみが少ないというのを見かけてウォータードリップのサーバーに変えてみました。
このひとつ前に水のタンクの部分がプラスチックのものを利用していたのですが、ドリップする部分を壊してしまったので、部品を購入することができるこちらに切り替えました。
朝、仕事をする前に豆を挽いて仕込んでおくと、昼にはコーヒーが落ちています。
夏は入れ終わったポットごと冷蔵庫に入れておくと氷を入れなくてもアイスコーヒーが飲めるので気に入っています。&lt;/p&gt;
&lt;h2 id=&#34;eufyの掃除機&#34;&gt;eufyの掃除機&lt;/h2&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B081PJXLFD/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/31EiW0HRZJL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B081PJXLFD/?tag=johtani-22&#34;&gt;
      Amazon | Anker Eufy HomeVac H11（ハンディクリーナー） USB充電 
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;仕事に使っている机でプラモデルを作ったり、DIYキーボードの工作をしたりと細かなごみが出る作業を行ないます。
ちょっとごみを吸いたいだけなのに、掃除機を毎回取りに行くのも面倒なので充電式のクリーナーを買ってみました。
仕組みも簡単だし、USBで充電できるのでおすすめです。アタッチメントを利用してキーボードの掃除なんかもしています。&lt;/p&gt;
&lt;h2 id=&#34;電動精密ドライバー&#34;&gt;電動精密ドライバー&lt;/h2&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B08FGST5KP/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41rh3dt4NVL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B08FGST5KP/?tag=johtani-22&#34;&gt;
      Amazon | Wowstick 1F&amp;#43; 69in1 電動精密ドライバー ビット56種セット ケース USB充電式 LEDライト付き [並行輸入品]
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;キースイッチを付け替えたり、工作したりでねじの開け閉めを頻繁に行います。
思ったよりも頻度が高くなってきたので、電動の精密ドライバーを試しに使ってみたらすごく楽ができました。
電池の入れ替えなどでもねじの開け閉めは行なうので、すごく役に立っています。
ビットが56種類もついていますが、プラスとマイナス以外はまだ使ってないかも。。。&lt;/p&gt;
&lt;h2 id=&#34;磁石のusbケーブル&#34;&gt;磁石のUSBケーブル&lt;/h2&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B096Y2YJP9/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41hVdmB4d0L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B096Y2YJP9/?tag=johtani-22&#34;&gt;
      Amazon | SUNTAIHO マグネット充電ケーブル 
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;DIYキーボード、エネループの充電器、上記のドライバーや掃除機など、USBで充電したり、接続するものが結構あります。
毎回ケーブルを差し替えるのも大変なのですが、&lt;a href=&#34;https://twitter.com/ymotongpoo&#34;&gt;@ymotongpoo&lt;/a&gt;に教えてもらった磁石のUSBケーブルがお気に入りです。
先端部分（USB-C、micro）とケーブル部分が別々になっており、また、ケーブルと先端は磁石でくっつく構造なので、充電したい機器に先端部分を刺しておきます。
充電や接続したいときにケーブルを近づけると磁石でくっついてくれるのでケーブルの抜き差しが必要なくなります。
先端部分だけを個別に購入できたので、色々な機器にあらかじめつけてあります。&lt;/p&gt;
&lt;h2 id=&#34;maker-hart-just-mixer-5&#34;&gt;Maker hart Just Mixer 5&lt;/h2&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07DRB6VTD/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51KJsp&amp;#43;193L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07DRB6VTD/?tag=johtani-22&#34;&gt;
      Amazon | Maker hart Just Mixer 5 ステレオ5入力音声ミキサー/Bluetoothオーディオ入力対応
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;3台のPC＋音楽サーバーとしてラズパイを主に利用しており、通知音などを1つのスピーカーから聞きたいので、ミキサーを導入しました。
5つの入力個別に音量調節できるので打ち合わせの時だけ他の音源を小さくしたりなど重宝しています。
ただ、入力が増えるとノイズが乗っている気もしますが。。。&lt;/p&gt;
&lt;h2 id=&#34;リストレストアームレスト&#34;&gt;リストレスト（アームレスト）&lt;/h2&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B08DFNS7L7/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41kjWDibABL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B08DFNS7L7/?tag=johtani-22&#34;&gt;
      Amazon | エレコム リストレスト アームレスト 肘起き 扇形 左右で使える2個セット ブラック MOH-EL01BK 
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;扇形のものを分割キーボードの手間においてリストレストとして使っています。
使用例の写真を見ると肘を置いていますが、手のひらをおくのにちょうどいいです。
これまでいくつかパームレストを試してみましたが、凹凸もなく適度な硬さで気に入っています。&lt;/p&gt;
&lt;h2 id=&#34;コンテッサセコンダ&#34;&gt;コンテッサセコンダ&lt;/h2&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B072J7ZS6H/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41f2h1Kd19L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B072J7ZS6H/?tag=johtani-22&#34;&gt;
      Amazon | オカムラ オフィスチェア コンテッサ セコンダ 
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;10月に注文してクリスマスに届きました。部品が不足しているようで年内に届かないかもといわれていたのですが。
2003年くらいからアーロンチェアを使っていたのですが、さすがに買い替えるかということで奮発しました。
アーロンチェアは座面がメッシュなのですが、ももが疲れるのもあり、クッション座面のものにしてみました。
冬寒くないのがいいですねｗまだ届いたばかりなので調整しないと。&lt;/p&gt;
&lt;h2 id=&#34;kindle-paperwhite&#34;&gt;Kindle paperwhite&lt;/h2&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B08N3J8GTX/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/412W8Vob-EL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B08N3J8GTX/?tag=johtani-22&#34;&gt;
      Amazon | Kindle Paperwhite - 大きくなった6.8インチディスプレイ 防水機能搭載 wifi 8GB 電子書籍リーダー
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;車の点検などでちょっとした待ち時間があるようなときに新書や小説が読めるようにセールで安くなったタイミングで購入しました。
健康診断で読書がはかどりました。もっと本を読まないとなぁ。&lt;/p&gt;
&lt;p&gt;ということで、ここ数年で買って便利なものをまとめてみました。
他にもある気がするけど、とりあえずこの辺で。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Azure Cognitive SearchのIndex Schema JSONをCSVで見たくなる</title>
      <link>https://blog.johtani.info/blog/2021/12/22/azure-search-schema-json2csv/</link>
      <pubDate>Wed, 22 Dec 2021 11:54:31 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2021/12/22/azure-search-schema-json2csv/</guid>
      <description>&lt;p&gt;Azure Cognitive Searchのスキーマの確認をするときに、Azureのポータルでは次のようにフィールドの一覧として見ることができます。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20211222/Fields_on_Azure_Portal.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20211222/Fields_on_Azure_Portal.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;ただ、実際のインデックス定義はJSON形式でやり取りする形になっています（JSONの例：&lt;a href=&#34;https://docs.microsoft.com/ja-jp/rest/api/searchservice/create-index#examples&#34;&gt;Create Index | Microsoft Docs&lt;/a&gt;）。
上記のスクリーンショットのようにフィールド数が少ない場合はそれほど気にならないのですが、フィールド数が大きくなると一覧で見たくなることがあります。
また、ポータルを自分で確認できない場合にJSONファイルを受け取って確認することもあります。
こういう時は、Excel（CSV）って便利ですよね？&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Azure Cognitive Searchのスキーマの確認をするときに、Azureのポータルでは次のようにフィールドの一覧として見ることができます。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20211222/Fields_on_Azure_Portal.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20211222/Fields_on_Azure_Portal.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;ただ、実際のインデックス定義はJSON形式でやり取りする形になっています（JSONの例：&lt;a href=&#34;https://docs.microsoft.com/ja-jp/rest/api/searchservice/create-index#examples&#34;&gt;Create Index | Microsoft Docs&lt;/a&gt;）。
上記のスクリーンショットのようにフィールド数が少ない場合はそれほど気にならないのですが、フィールド数が大きくなると一覧で見たくなることがあります。
また、ポータルを自分で確認できない場合にJSONファイルを受け取って確認することもあります。
こういう時は、Excel（CSV）って便利ですよね？&lt;/p&gt;
&lt;p&gt;ということで、サクッと確認するときには、次のような&lt;code&gt;jq&lt;/code&gt;コマンドをWSL2上で利用して、CSVに変換して確認しています。&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-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Type&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Searchable&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Facetable&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Filterable&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Retrievable&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Sortable&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Analyzer&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;IndexAnalyzer&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SearchAnalyzer&amp;#34;&lt;/span&gt; &amp;gt; index_schema.csv
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat index_schema.json | jq -r &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;.fields[]|[.name, .type, .searchable, .facetable, .filterable, .retrievable, .sortable, .analyzer, .indexAnalyzer, .searchAnalyzer]|@csv&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; index_schema.csv
&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;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20211222/schema_csv.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20211222/schema_csv.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;どんなフィールドオプションが利用されているか？などをExcelで開いてフィルターなどを活用してチェックするのには便利かなと。
&lt;code&gt;jq&lt;/code&gt;コマンドをもっとうまく使うと、ヘッダ行ももっとスマートに出せるかもしれないんですが。。。&lt;/p&gt;
&lt;p&gt;ちなみに、上記のコマンドでは残念ながら&lt;code&gt;Edm.ComplexType&lt;/code&gt;（参考： &lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/search-howto-complex-data-types&#34;&gt;複合データ型をモデル化する方法 - Azure Cognitive Search | Microsoft Docs&lt;/a&gt;）には対応していません。
必要になった時に考えるかな。。。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>今年のDIYキーボードとコントローラーラック</title>
      <link>https://blog.johtani.info/blog/2021/12/08/controller-rack/</link>
      <pubDate>Wed, 08 Dec 2021 00:00:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2021/12/08/controller-rack/</guid>
      <description>&lt;p&gt;今年もアドベントカレンダーの季節になってしまいました。
今年で2回目となる、&lt;a href=&#34;https://adventar.org/calendars/6234&#34;&gt;pyspa Advent Calendar 2021&lt;/a&gt;の投稿です。
昨年に引き続きDIYがらみの投稿です。&lt;/p&gt;
&lt;h2 id=&#34;コントローラーラック&#34;&gt;コントローラーラック&lt;/h2&gt;
&lt;p&gt;3つのコントローラーがあるのですが、結構場所を取ります。
また、それぞれ充電しないといけません。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今年もアドベントカレンダーの季節になってしまいました。
今年で2回目となる、&lt;a href=&#34;https://adventar.org/calendars/6234&#34;&gt;pyspa Advent Calendar 2021&lt;/a&gt;の投稿です。
昨年に引き続きDIYがらみの投稿です。&lt;/p&gt;
&lt;h2 id=&#34;コントローラーラック&#34;&gt;コントローラーラック&lt;/h2&gt;
&lt;p&gt;3つのコントローラーがあるのですが、結構場所を取ります。
また、それぞれ充電しないといけません。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20211208/before_controllers.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20211208/before_controllers.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;充電しつつ、邪魔にならない置き方はできないものか？と思っていたところ次のようなコントローラーラックを見つけました。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B085BT3ZBZ/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/311h5ed5ufL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B085BT3ZBZ/?tag=johtani-22&#34;&gt;
      Amazon | 山崎実業(Yamazaki) ゲームコントローラー収納ラック
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;これそのものは場所を取るので購入は見送りましたが、エレクターの棚にワイヤーネットをつけると似たようなものができるのでは？ということで、DIYしてみることにしました。&lt;/p&gt;
&lt;h3 id=&#34;材料&#34;&gt;材料&lt;/h3&gt;
&lt;p&gt;材料は以下の通りです。
書いていない材料としてあとは、結束バンドがあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://jp.daisonet.com/products/4549131595000?_pos=13&amp;amp;_sid=fd69621ac&amp;amp;_ss=r&#34;&gt;ワイヤーネット４４×２９．５ｃｍ オフホワイトＢ２８ | 【公式】DAISO（ダイソー）ネットストア&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://jp.daisonet.com/collections/remodeling0222/products/4945371270507&#34;&gt;スリム型ネットフック５０ｍｍ ２本入り | 【公式】DAISO（ダイソー）ネットストア&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://jp.daisonet.com/collections/remodeling0222/products/4549131635317&#34;&gt;クロームメッキワイヤーフック（２連、Ｕ字、２個） | 【公式】DAISO（ダイソー）ネットストア&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B09923KV51/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51rvLqoTpYL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B09923KV51/?tag=johtani-22&#34;&gt;
      Amazon | マグネット 充電ケーブル SUNTAIHO USBケーブル LEDインジケーター付き
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07ZNFR6BF/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/31rI80loWDL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07ZNFR6BF/?tag=johtani-22&#34;&gt;
      Amazon | Anker PowerPort Atom III Slim （PD 充電器 65W 4ポート USB-C）
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h3 id=&#34;設置&#34;&gt;設置&lt;/h3&gt;
&lt;p&gt;まずは、2連のワイヤーフックでワイヤーネットをエレクターの棚にぶら下げました。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20211208/dual_fook_hung_wirenet.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20211208/dual_fook_hung_wirenet.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;そのままでは固定されないので、下のエレクターの棚とワイヤーネットを結束バンドで固定。
これで、コントローラーを置いたり取ったりしてもぐらぐらしません。&lt;/p&gt;
&lt;p&gt;固定したワイヤーネットの表（コントローラーを配置する側）に、ネットフック50mmをコントローラーの数だけ配置しました（上の写真でフックとコントローラーの関係がわかります）。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20211208/controller_on_fook.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20211208/controller_on_fook.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;前から見るとこのような形です。
裏側に、2連フックを使って、Ankerの充電器を固定し、USBのケーブルをコントローラーの上に来るように配置します（写真ではPS4とPS5のコントローラーの上の部分にぶら下がる形です）。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20211208/anker.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20211208/anker.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;コントローラーには磁石の端子をコントローラーに差し込んでおきます。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20211208/controller.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20211208/controller.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;磁石のUSBケーブルを利用していることで、コントローラーを取り出すときは少し力を入れて引っ張るだけ、収めるときは、ケーブルに近づけて充電できる状態にした後にフックに載せるだけとなりました。
ケーブルの抜き差しをしなくてもよいのでとても便利。
全体像は次の写真のようになっています。一番上のコントローラーはエネループを利用しているのでケーブルは不要になっています。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20211208/overview.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20211208/overview.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;磁石のUSBケーブルをpyspaでとんぷーに教えてもらって思いついたアイデアです。
磁石の端子は色々と使い勝手が良いので、DIYキーボードやテンキー、MX Ergo、Kindleなど色々なところに使っています。&lt;/p&gt;
&lt;h2 id=&#34;今年のdiyキーボード&#34;&gt;今年のDIYキーボード&lt;/h2&gt;
&lt;p&gt;キーボードを作ったのは2つですが、改造を色々やってました。
ブログに記載したものはリンクだけにしておきます。&lt;/p&gt;
&lt;h3 id=&#34;ケーブル自作&#34;&gt;ケーブル自作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://shop.yushakobo.jp/collections/accessory/products/self-made-cable&#34;&gt;自作ケーブルキット – 遊舎工房&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ケーブルも自作できるみたいなので作ってみました。
現在はテンキーの配置の問題もあって、メインでは利用はしていませんが工作としては面白かったです。
熱収縮チューブを処理するための道具を持っていなかったので、チューブの固定が甘いのが失敗でした。ドライヤーくらいの熱では足りないので作ろうと思っている方は要注意かと。&lt;/p&gt;
&lt;h3 id=&#34;corne-light-v2のblelpme-io対応&#34;&gt;Corne Light v2のBLE+LPME-IO対応&lt;/h3&gt;
&lt;p&gt;詳細はブログ記事を。Corneはこれ以外に、キースイッチの付け替えも行ないました。ルブしたGateronクリアをハンダでつけなおしました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2021/01/11/apply-ble-and-lpme-to-corne/&#34;&gt;Corne Light v2のBLE+LPME-IO対応 #DIYキーボード&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;sofle-keyboard-v2のblelpme-io対応&#34;&gt;Sofle keyboard v2のBLE+LPME-IO対応&lt;/h3&gt;
&lt;p&gt;詳細はブログ記事を。このブログはSofleで書いています。現在メインに利用しているキーボードです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2021/02/01/apply-ble-to-sofle/&#34;&gt;Sofle v2を組み立てて、BLE+LPME-IO化してみた #DIYキーボード&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;10月には電池モジュールを次のものに付け替えました。家で主に使用するのもあり、充電池のほうが使い勝手がよさそうだという判断です。スイッチのON/OFFもしやすくなって満足しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://nogikes.booth.pm/items/2710739&#34;&gt;単4電池昇圧モジュール - のぎけす屋 - BOOTH&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;Sofleの電池モジュールをボタン電池から単4電池用に差し替えた。 &lt;a href=&#34;https://t.co/TUizwr2qmw&#34;&gt;pic.twitter.com/TUizwr2qmw&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1449214872143609860?ref_src=twsrc%5Etfw&#34;&gt;October 16, 2021&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;h3 id=&#34;lunakey-miniの組み立てとblelpme-io対応&#34;&gt;Lunakey Miniの組み立てとBLE+LPME-IO対応&lt;/h3&gt;
&lt;p&gt;詳細はブログ記事を。Sofleと時々入れ替えて使っています。小指のあたりのずれの大きさ、親指のキーの多さが使い勝手のよいキーボードです。コンパクトなのもあり、こちらは持ち運びにも利用できるかなと考えています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2021/04/30/build-lunakey-mini-ble/&#34;&gt;Lunakey Miniを組み立てて、BLE+LPME-IO化してみた #DIYキーボード&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;soyuzの組み立てnumpadキット&#34;&gt;Soyuzの組み立て（Numpadキット）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://shop.yushakobo.jp/products/soyuz&#34;&gt;Soyuz （黒基板） – 遊舎工房&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2021/02/25/update-working-facility/&#34;&gt;自宅の作業環境(2021/02)&lt;/a&gt;の写真にもありますが、分割したキーボードとは別にテンキーを利用しています。
WindowsのログインでPinコードを入力したり、色々な場面で数字の入力をすることがあるためです。
Soyuzを組み立てる前は&lt;a href=&#34;https://shop.yushakobo.jp/collections/keyboard/products/consign_shiro&#34;&gt;素 - Shiro – 遊舎工房&lt;/a&gt;を利用していたのですが、これでは「⁺」や「Enter」など、電卓のような利用方法の場合にはキーが足りません。
かゆいところに手が届かないので、きちんとしたNumpadをということでSoyuzを組み立てました。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20211208/soyuz.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20211208/soyuz.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Shiroよりもだいぶ存在感があります。&lt;/p&gt;
&lt;h3 id=&#34;gk21snumpad&#34;&gt;GK21S（Numpad）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://ja.aliexpress.com/item/1005003248143336.html&#34;&gt;USB Type C充電器付きの滑らかな交換用キーボードキット (Gk21s/k21),スイッチ,デュアルモードPCB|Keyboards| - AliExpress&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最後は独身の日のセールで見つけたNumpadキットです。キットといってもこちらは、基盤からケースまで組み立てが終わっているキットで、キースイッチを差し込んで、キーキャップを付けるだけというものになります。
現在はこれをメインに利用しています。通常のNumpadの上に1列キーが多く、Backspaceなどを割り当てられるのが便利です。
ドライバーソフトも用意されており、キーマップのカスタマイズも可能です（まだそこまでやってないけど）。&lt;/p&gt;
&lt;h3 id=&#34;お気に入りキースイッチ&#34;&gt;お気に入りキースイッチ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://kochikeyboard.stores.jp/items/6008cdf1bbb6833001e9711b&#34;&gt;Kailh Box Silent ピンク軸 5個 | Kochi Keyboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://shop.yushakobo.jp/products/input-club-hako-switches&#34;&gt;Input Club Hako スイッチ（10個入り） – 遊舎工房&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最後はキースイッチの紹介です。
現時点ではこの2種類を組み合わせるのが私の好みに合っているようです（今のところ）。
Box Silentのピンクをアルファベットのキーに、Input Club HakoのVioletをCtrlやShift、Enterなどのキーに割り当てて使っています（下の写真の左側で、キーキャップをつけている部分がHako Violetになっています）。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20211208/keyswitch.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20211208/keyswitch.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、&lt;a href=&#34;https://adventar.org/calendars/6234&#34;&gt;pyspa Advent Calendar 2021&lt;/a&gt;の8日目の記事でした。
それほど作ったりしてないなと思っていたのですが、記事にしてみると今年も色々とDIYしてたみたいです。
キースイッチやキーキャップも自分の好みが固まってきたので、来年はファームウェアやキーマップ周りをいじっていきたいと思っています。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Domain-Specific Pretraining for Vertical Search: Case Study on Biomedical Literatureという論文を読んだ</title>
      <link>https://blog.johtani.info/blog/2021/11/10/reading-ms-biomedical-search-paper/</link>
      <pubDate>Wed, 10 Nov 2021 14:33:16 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2021/11/10/reading-ms-biomedical-search-paper/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://arxiv.org/abs/2106.13375&#34;&gt;Domain-Specific Pretraining for Vertical Search: Case Study on Biomedical Literature&lt;/a&gt;という論文を読んだので軽くメモを残しておきます。論文自体はリンクから参照してください。&lt;/p&gt;
&lt;h2 id=&#34;読んだ理由&#34;&gt;読んだ理由&lt;/h2&gt;
&lt;p&gt;Azure Cognitive SearchでSemantic Searchが利用可能になったこともあり、「Semantic Search」に関するMSのリサーチチームが発表している論文をたまたま見つけたためです。
Elasticsearchとニューラルモデルを利用したランカーでのリランクする仕組みがSemantic Searchと似ていたので読んでみました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://arxiv.org/abs/2106.13375&#34;&gt;Domain-Specific Pretraining for Vertical Search: Case Study on Biomedical Literature&lt;/a&gt;という論文を読んだので軽くメモを残しておきます。論文自体はリンクから参照してください。&lt;/p&gt;
&lt;h2 id=&#34;読んだ理由&#34;&gt;読んだ理由&lt;/h2&gt;
&lt;p&gt;Azure Cognitive SearchでSemantic Searchが利用可能になったこともあり、「Semantic Search」に関するMSのリサーチチームが発表している論文をたまたま見つけたためです。
Elasticsearchとニューラルモデルを利用したランカーでのリランクする仕組みがSemantic Searchと似ていたので読んでみました。&lt;/p&gt;
&lt;h2 id=&#34;ざっくりメモ&#34;&gt;ざっくりメモ&lt;/h2&gt;
&lt;h3 id=&#34;どんなもの&#34;&gt;どんなもの？&lt;/h3&gt;
&lt;p&gt;クリックログなどで関連度を改善できないような場合に、ドメイン固有の言語モデルを利用して検索結果の改善をする方法が提案されているので、バイオメディカル検索で実際に評価してみたという論文です。
特定分野の大量の文書から検索をするときに、ドメイン固有の事前学習した言語モデルを用意して、さらにファインチューニングする方法を評価しています。
言語モデルの生成に利用されたのはBERTになります。&lt;/p&gt;
&lt;h3 id=&#34;技術や手法のキモはどこ&#34;&gt;技術や手法のキモはどこ？&lt;/h3&gt;
&lt;p&gt;医療分野のデータを利用して評価していますが、ほかのドメインにも一般化できる可能性があることや、実際のシステムを提示している部分が肝になりそうです。&lt;/p&gt;
&lt;p&gt;論文から引用した言語モデルを用いてランキングを行う仕組みを構築する部分の構成です。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20211110/system-overview.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20211110/system-overview.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;左半分が、ドメイン固有の事前学習についてです。Wikipediaなどを利用したBERTのモデルが公開されたりしていますが、大量のドメイン固有データが用意できるのであれば、ドメイン固有のデータで事前学習することが有効であるという主張です（&lt;a href=&#34;https://arxiv.org/abs/2007.15779&#34;&gt;参考文献&lt;/a&gt;。これもMS Researchでした。同じチームなのかな？）。
この論文ではBERTの学習データとして、ドメイン固有のテキストを用いています。
実際にはPubMedBERTを利用しています。&lt;/p&gt;
&lt;p&gt;右半分がドメイン固有のデータで生成された言語モデルを利用して、ドメイン固有のニューラルランカー（検索結果のランキングを行なう仕組み）をファインチューニングする処理です。
MS MARCOと呼ばれるMSが公開している機械学習向けのデータセットのうち、ドメイン固有のサブセットを取り出して利用しているようです。&lt;/p&gt;
&lt;p&gt;この論文では、L1検索（第1段階の検索）にBM25を利用して、L2検索にここで作成したニューラルランカーを利用し、検索結果を返す仕組みとなっています。
これは、Azure Cognitive SearchのSemantic Searchのシステムに似ています。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20211110/system_detail.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20211110/system_detail.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;この論文では、BM25で検索した結果の上位60件の結果がL2のランカーの入力となっています。&lt;/p&gt;
&lt;p&gt;以下の2つが主な論文の成果となっています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ドメイン固有の事前学習を利用することで、高度な学習コンポーネントなどの追加することなく高い精度が出た。&lt;/li&gt;
&lt;li&gt;既存のBM25の検索エンジンと組み合わせてニューラルランカーを使うことで、計算コストを下げつつより良い上位の検索結果を返す仕組みを構築した。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;どうやって有効だと検証した&#34;&gt;どうやって有効だと検証した？&lt;/h3&gt;
&lt;p&gt;TREC-COVIDデータセットを用いて評価して、TREC-COVIDに参加しているシステムと論文で提案している構成のシステムとの比較をしています。
また、ドメイン固有の事前学習が、一般ドメインなどの事前学習と比較して影響があるかどうかの評価もしています。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20211110/table1.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20211110/table1.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;



&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20211110/table2.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20211110/table2.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;実際にAzure上で構築した仕組みをMicrosoft Biomedical Searchとして公開しているようです。
上記のシステム構成のように、Elasticsearchで検索して、ニューラルランカーはKubernetes上に展開されたGPUで計算をしています。
論文には使用しているマシンの構成や台数なども記載があります。&lt;/p&gt;
&lt;p&gt;実際に構築したシステムをユーザーに利用して体験したもらった結果としては、
複雑な意図を持った長いクエリに対してはPubMedなどの他の検索ツールとしても良い結果が返ってきたことが確認されたとなっています。
ただし、一般的な短いクエリの場合は十分な結果にならない場合があったとのことです。&lt;/p&gt;
&lt;h3 id=&#34;議論はある&#34;&gt;議論はある？&lt;/h3&gt;
&lt;p&gt;実際にほかのドメイン（金融、法律、小売りなど）で適用してもうまくいくかは今後の研究に期待だと思います。
また、ファインチューニングするときに利用できるデータが今回の論文にあるようにMS MARCOのサブセットとして抽出できればよさそうです。&lt;/p&gt;
&lt;h3 id=&#34;他に読むべき論文は&#34;&gt;他に読むべき論文は？&lt;/h3&gt;
&lt;p&gt;TREC-COVIDに参加しているほかのシステムがどのような学習や仕組みが必要なのかを見ることで、どのくらいの手間・コストが軽減しているのかがわかるはずです。&lt;/p&gt;
&lt;h2 id=&#34;感想&#34;&gt;感想&lt;/h2&gt;
&lt;p&gt;ということで、読んでみました。
細かなほかの手法については調べていませんが、システム構成としてはAzure Cognitive SearchのSemantic Searchの仕組みと同じだと思われます。
違いは、ドメイン固有の事前学習のモデルではないことでしょうか。
ある程度のドメイン固有のモデルを利用できる仕組みができると、さらにSemantic Searchがうまく使えるようになるのかもしれません（前回書いたブログではWikipediaのデータを利用してみましたが、思ったほど良い感じはしなかったです。。。ファインチューニングの仕組みもないしなぁ）。
また、短いクエリでは芳しくない結果もあったというのは、おそらくニューラルランカーで評価するための情報が少なくなってしまうのだと思います。Semantic Searchに向いているクエリの作り方とかが出てくるのかな？&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>今年もMICESにオンライン出張してた</title>
      <link>https://blog.johtani.info/blog/2021/07/13/attend-mices-2021/</link>
      <pubDate>Tue, 13 Jul 2021 16:08:23 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2021/07/13/attend-mices-2021/</guid>
      <description>&lt;p&gt;今年も&lt;a href=&#34;https://mices.co/&#34;&gt;MICES&lt;/a&gt;にも参加してました。
昨年は&lt;a href=&#34;https://blog.johtani.info/blog/2020/07/06/attend-berlin-buzzwords/#berlin-buzzwords%E3%81%A8%E3%81%AF&#34;&gt;Berlin Buzzwordsと共同開催&lt;/a&gt;でしたが、今年は別開催（別日程）でした。&lt;/p&gt;
&lt;p&gt;MICESは2017年から始まったe-commerceの検索にフォーカスしたカンファレンスです。
ECに関連する話に特化されていますが、話題は多岐にわたっています。色々やることありますねぇ、ECも。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今年も&lt;a href=&#34;https://mices.co/&#34;&gt;MICES&lt;/a&gt;にも参加してました。
昨年は&lt;a href=&#34;https://blog.johtani.info/blog/2020/07/06/attend-berlin-buzzwords/#berlin-buzzwords%E3%81%A8%E3%81%AF&#34;&gt;Berlin Buzzwordsと共同開催&lt;/a&gt;でしたが、今年は別開催（別日程）でした。&lt;/p&gt;
&lt;p&gt;MICESは2017年から始まったe-commerceの検索にフォーカスしたカンファレンスです。
ECに関連する話に特化されていますが、話題は多岐にわたっています。色々やることありますねぇ、ECも。&lt;/p&gt;
&lt;h2 id=&#34;参加したセッション&#34;&gt;参加したセッション&lt;/h2&gt;
&lt;p&gt;参加したセッションの個人メモを今回も残しておきます。
セッション個別のリンクは用意されていないみたいですが、&lt;a href=&#34;https://mices.co/mices2021/index.html&#34;&gt;公式サイト&lt;/a&gt;にタイムテーブルがあり、セッションのタイトル、概要に加えて、スライドのPDFもリンクがあります。動画が公開されているものもあります。&lt;/p&gt;
&lt;h3 id=&#34;dreaming-search&#34;&gt;Dreaming Search&lt;/h3&gt;
&lt;p&gt;ビデオが公開されています。スライドがざっくりしたものなので最初に聞いた時にはしっくりこなかったので、聞き直してのメモです。
GDPRのような話で、個人の情報を自分たちで管理しようと流れがあります。
それぞれのECサイトなどでのユーザーのイベント（何を検索して、何をクリックした）情報はそれぞれのサイトで閉じた情報になっています。このため、自分の興味のある情報が断片化された情報でそれぞれのサイトで管理されてしまい、パーソナライゼーションされるもの（ランキングだったりレコメンドだったり）がいまいちな場合があります。
この個人の情報（ユーザーのイベント）をユーザー自身がハンドリングして、どの情報までをどこまで公開できるようにするというように管理できる仕組みができないか？という話のようでした。実際にそのための仕組み（もっと大きな話の仕様）を検討している&lt;a href=&#34;https://solidproject.org/about&#34;&gt;プロジェクト&lt;/a&gt;があり、それに関連して検索という観点で夢を語っているセッションです。&lt;/p&gt;
&lt;p&gt;ざっくり私が理解したのをまとめましたが、empathy.coという会社としてはいくつかPoCなども実施されているようでした。
個人の情報の扱い方に関する話は新鮮で面白かったです。
仕組みが出来上がり、各サイトが対応するとより個人が欲しい情報が集まりやすくなるのかなぁ？&lt;/p&gt;
&lt;h3 id=&#34;forget-facets-welcome-refinements-tm&#34;&gt;Forget Facets, welcome Refinements (TM)&lt;/h3&gt;
&lt;p&gt;Berlin BuzzwordsでいくつかLTをやられていた方によるファセットとその応用（彼らはRefinementsと名前をつけたみたい）についての話でした（ビデオとスライドが公開済み。）。
検索エンジンとファセットの関係の歴史から始まって、Kibanaでの使い方、モバイルや音声検索・チャットボットでのファセットは難しいよね？という話につながります。
ということで、Refinementsとして、ファセットを提示してユーザーに選んでもらうだけでなく状況に応じて、提案するための情報としてファセットを使うといいのでは？という話でした。例えば、チャットボットや音声検索での結果の場合、検索結果数が多くなるとユーザーが望んだものが返せるとは限らないです。その時に、ファセットの情報をもとに絞り込み条件を聞き返すネタに使うのはどうか？というような話でした。オートサジェスト（検索があいまいな時に、追加のキーワードを提案するもの）のような形でブランド名だったり、カテゴリーなどを表示する仕組みです。
実際の実装の話は、彼らが過去にBerlin Buzzwordsなどで話をしているのでそちらが参考になるとのことでした（参考：&lt;a href=&#34;https://www.youtube.com/watch?v=IbXjSFLqrW8&amp;amp;list=PLq-odUc2x7i9-bGb8F8ytYBfCAzcmpaUe&amp;amp;index=32&#34;&gt;berlin buzzwords 2019&lt;/a&gt; / &lt;a href=&#34;https://haystackconf.com/europe2019/relevant-facets/&#34;&gt;Heystack 2019&lt;/a&gt;）&lt;/p&gt;
&lt;h3 id=&#34;reinforcement-learning-in-search&#34;&gt;Reinforcement learning in search&lt;/h3&gt;
&lt;p&gt;検索における強化学習の話みたいです。ビデオとスライドが公開されています。ビジネス的に検索のランキングが重要だが、そのランキングをどうやって良くしていくのか？という話です。
ランキングでデフォルトのBM25から始まり、LtRを導入し、A/Bテストなどをしつつ、モデルの変化がどのようにビジネスに影響するかをはかるのが難しくなります。
LtRに対するオンライン機械学習のアプローチについて実際に直面した課題の話などがされている（はず？）です（どうも、実際にCTRなどを用いたところまでは行ってなさそう）。&lt;/p&gt;
&lt;p&gt;多腕バンディットなどの強化学習の話が続いたあたりでギブアップしてしまいました。。。&lt;/p&gt;
&lt;h3 id=&#34;better-search-through-query-understanding---panel&#34;&gt;Better Search through Query Understanding - Panel&lt;/h3&gt;
&lt;p&gt;Query Understandingに関するパネルとして3社の人がそれぞれどういった取り組みをしてるか？という話をしたあと質問などに答えていく形式でした。残念ながらビデオはまだ公開されていませんが、スライドが公開されています。QA部分も結構な時間だったのでビデオの公開がされるといいなぁ。&lt;/p&gt;
&lt;h4 id=&#34;understanding-queries-by-analysing-user-interaction--andrea-schütt-otto&#34;&gt;Understanding queries by analysing user interaction / Andrea Schütt (OTTO)&lt;/h4&gt;
&lt;p&gt;OTTOというECサイトでのQuery Understandingの紹介と、LtR導入にまつわる話。
データサイエンスとして最初はQuery Understandingやってたけど、スケールしないのでLtR導入して色々と試行錯誤しているところのようだった。&lt;/p&gt;
&lt;h4 id=&#34;query-understanding-ai-search&#34;&gt;Query Understanding AI search&lt;/h4&gt;
&lt;p&gt;eBayの方の発表。Query Understanding = ユーザーの興味をクエリから類推するという定義から、クエリを分類する、同定するためにどうしているか？という話でっした。
単語の表面的な文字としての近さだけでは、語順が変わると意味が変わるものや、ステミングのせいで同じになってしまうものといった例を紹介しつつ、クエリをベクトルにして表現（コンバージョン、クリックなどの情報を元にプロダクトのベクトルにしてみたり）し似ているかどうか？を判断している話です。&lt;/p&gt;
&lt;h4 id=&#34;case-study--autocomplete-search-suggestions&#34;&gt;Case study : Autocomplete Search Suggestions&lt;/h4&gt;
&lt;p&gt;Digitec Galaxusというサイトでのオートコンプリートをもっと使いやすくするためにどんなデータを集めて、どうやって表示しているか？という話でした。
とりあえず入力されたものにヒットしたものを出すような実装だった場合に、サジェストされる量が多く、ノイズも多いので使いにくかったものをどうやって改善して行ったかという処理の流れなどの説明もありました。&lt;/p&gt;
&lt;h3 id=&#34;the-need-for-an-open-web-search-in-europe---the-approach-of-the-open-search-foundation-and-its-implications-for-e-commerce-companies&#34;&gt;The need for an open web search in Europe - The approach of the Open Search Foundation and its implications for E-Commerce-Companies&lt;/h3&gt;
&lt;p&gt;Speaker: Alexander Decker / OPEN SEARCH FOUNDATION&lt;/p&gt;
&lt;p&gt;もっとオープンな検索システムを作っていこうという&lt;a href=&#34;https://opensearchfoundation.org/en/open-search-foundation-home/&#34;&gt;団体&lt;/a&gt;の話でした。
AWSが最近1.0をリリースしたやつとは別物です。
Googleでみんな検索しているけど、ブラックボックスなのでバイアスがかかっている。
もっとバイアスフリーなインデックスを提供できると、使いやすくなるよね？みんなでそういうインデックスを作っていかないか？という話でした。
ECとの直接の関係はセッションからは読み取れませんでした。
どうやって、集めるデータの基準（入れるべき、入れるべきではないなど）を作るんだろう？という疑問が残っています。公共的なものやオープンデータについてはあるとよさそうかもなぁ。&lt;/p&gt;
&lt;h3 id=&#34;101-hints-to-improving-the-customer-satisfaction-on-search-engines-in-the-retail-industry&#34;&gt;101 hints to improving the customer satisfaction on search engines in the retail industry&lt;/h3&gt;
&lt;p&gt;Speaker: Marion Hemery (Carrefour France) &amp;amp; Lucian Precup (a// &amp;amp; Adelean)&lt;/p&gt;
&lt;p&gt;カルフールのECサイトでの検索に関する顧客満足度の改善についての話です。
どんなものをどうやって図るのか、フィードバックを取るための仕組みは？
そこからわかったものをどうやってシステムに優先度をつけながら取り込んでいくのか？
というのをどんなものを使っているかという説明を交えながらのセッションです。
スライドが結構細かく書かれているのでスライドを見るだけでもわかりやすいかな。&lt;/p&gt;
&lt;h3 id=&#34;an-ounce-of-prevention-is-worth-a-pound-of-cure-establishing-a-gold-standard-based-evaluation-in-customer-projects&#34;&gt;“An ounce of prevention is worth a pound of cure”: establishing a gold standard-based evaluation in customer projects&lt;/h3&gt;
&lt;p&gt;Speaker: Bertram Sändig &amp;amp; Cornelia Werk / NEOFONIE&lt;/p&gt;
&lt;p&gt;検索の性能指標（速度ではないほうの性能）をきちんと評価する仕組みが重要だよというセッションです。
検索の仕組みを変更（例ではステミングを導入するはなしをしてました）した場合に、現行システムにどういう影響が出るのか？それをどうやって図るのか、どうやってテストしていくのか？という話です。
ステミングを導入したら、検索にヒットしやすくなったものも出てきたけどその弊害として今までよかった検索の結果にノイズが増え多という話をもとに、検索結果としてこうあってほしいというゴールデンスタンダードをきちんと作って育てていくべきですよという話でした。完ぺきなものなどないので少しずつやっていきましょうと。&lt;/p&gt;
&lt;p&gt;ということで、見ていないもの（LTや最後のワークショップ）もありますが、見たものに関してメモを残してみました。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>今年もBerlin Buzzwordsにオンライン出張してた</title>
      <link>https://blog.johtani.info/blog/2021/07/09/berlin-buzzwords-2021-1/</link>
      <pubDate>Fri, 09 Jul 2021 16:24:53 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2021/07/09/berlin-buzzwords-2021-1/</guid>
      <description>&lt;p&gt;今年も&lt;a href=&#34;https://2021.berlinbuzzwords.de/&#34;&gt;Berlin Buzzwords&lt;/a&gt;にオンライン出張してました。
今年の開催は6月14日から17日まででした。
どんなカンファレンスなのかは&lt;a href=&#34;https://blog.johtani.info/blog/2020/07/06/attend-berlin-buzzwords/#berlin-buzzwords%E3%81%A8%E3%81%AF&#34;&gt;昨年のブログ記事&lt;/a&gt;をごらんください。&lt;/p&gt;
&lt;p&gt;今年は&lt;a href=&#34;https://haystackconf.com/&#34;&gt;HAYSTACK&lt;/a&gt;は共同開催で、&lt;a href=&#34;https://mices.co/&#34;&gt;MICES&lt;/a&gt;は別開催でした。
MICESにも参加していたので、また後日にブログ記事を公開する予定です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今年も&lt;a href=&#34;https://2021.berlinbuzzwords.de/&#34;&gt;Berlin Buzzwords&lt;/a&gt;にオンライン出張してました。
今年の開催は6月14日から17日まででした。
どんなカンファレンスなのかは&lt;a href=&#34;https://blog.johtani.info/blog/2020/07/06/attend-berlin-buzzwords/#berlin-buzzwords%E3%81%A8%E3%81%AF&#34;&gt;昨年のブログ記事&lt;/a&gt;をごらんください。&lt;/p&gt;
&lt;p&gt;今年は&lt;a href=&#34;https://haystackconf.com/&#34;&gt;HAYSTACK&lt;/a&gt;は共同開催で、&lt;a href=&#34;https://mices.co/&#34;&gt;MICES&lt;/a&gt;は別開催でした。
MICESにも参加していたので、また後日にブログ記事を公開する予定です。&lt;/p&gt;
&lt;h2 id=&#34;参加したセッション&#34;&gt;参加したセッション&lt;/h2&gt;
&lt;p&gt;参加したセッションの個人用のメモを取ってあるので、簡単にまとめておきます。
セッションページに動画やスライドも追加されつつあります。興味のある方はそちらをご覧いただければと。
（今のところYouTubeに上がっているビデオは69本あります。&lt;a href=&#34;https://www.youtube.com/playlist?list=PLq-odUc2x7i9I_i403nJT9IdiyQMDira9&#34;&gt;再生リストはこちら&lt;/a&gt;）
気になっていたセッションもあるので、ビデオを見てまたメモを公開すると思いますが、まずは第1弾を。
ちなみに、検索をメインに見ています。Berlin Buzzwords自体はオブザバビリティやOSSコミュニティ、データのストリーミングの話などの話題もあるので、この辺りも興味があれば探してみても面白いかもです。&lt;/p&gt;
&lt;h3 id=&#34;how-to-measure-diversity-of-search-results&#34;&gt;How to measure Diversity of Search Results&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ： &lt;a href=&#34;https://2021.berlinbuzzwords.de/session/how-measure-diversity-search-results&#34;&gt;How to measure Diversity of Search Results | Berlin Buzzwords 2021&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;従来の検索では、クエリに対して精度の高い検索結果を1件または数件返すのはどうするか？というものだったが、最近、あるユースケース（ほかの物の発見を促したいケース）では
検索結果の多様性を高めつつ、精度もある程度確保したいという場合があります。&lt;/p&gt;
&lt;p&gt;ざっくりした検索クエリ（例えば自転車）の場合に、自転車だけが1ページ目にある場合よりも自転車とは別に自転車グッズも表示された場合のほうがクリック率やGMV（Gross Merchandice Value?）が上がったという話が紹介されていました。
この時どのくらい混ぜればいいのか？というのを、シャノンのエントロピーを使って、検索結果の多様性を保つための具体的なヒントについて話をされています。
実際にこういう計算をしてやれますねという紹介がされています。&lt;/p&gt;
&lt;h3 id=&#34;from-text-search-and-recommendation-to-ads-and-online-dating-approximate-nearest-neighbors-in-real-world-applications&#34;&gt;From text search and recommendation to ads and online dating; approximate nearest neighbors in real world applications&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ: &lt;a href=&#34;https://2021.berlinbuzzwords.de/session/text-search-and-recommendation-ads-and-online-dating-approximate-nearest-neighbors-real&#34;&gt;From text search and recommendation to ads and online dating; approximate nearest neighbors in real world applications | Berlin Buzzwords 2021&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://vespa.ai/&#34;&gt;Vespa.ai&lt;/a&gt;（OSS）の紹介でANNの話でした。通常、ANNを用いた検索の場合に他の検索条件（地理情報、日付など）をANNの結果に対して適用すると、望んでいる数がとれないです。その場合に、Vespaは内部でいい感じの動きをしますよという紹介でした。&lt;/p&gt;
&lt;h3 id=&#34;are-you-sure-blending-product-comparisons-and-recommendations-with-ai&#34;&gt;&amp;ldquo;Are You Sure?&amp;quot;： blending product comparisons and recommendations with A.I.&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ: &lt;a href=&#34;https://2021.berlinbuzzwords.de/session/are-you-sure-blending-product-comparisons-and-recommendations-ai&#34;&gt;&amp;ldquo;Are You Sure?&amp;quot;： blending product comparisons and recommendations with A.I. | Berlin Buzzwords 2021&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Amazonの製品ページにある、類似商品との比較一覧のような一覧をどうやって実現するか？という話でした。比較一覧に掲載する商品を選出するパイプラインをこうやれますよね?という話でした。ログ（クリックやカートに入れたかどうかなど）を元にkNNで似ているデータを洗い出し、どの商品、どの項目を比較一覧として選ぶかという流れでした（セッションではもっと詳しい話がされています）。オフライン実験の話までがセッションでされています。&lt;/p&gt;
&lt;h3 id=&#34;the-future-of-lucenes-mmapdirectory-why-use-it-and-whats-coming-with-java-16-and-later&#34;&gt;The future of Lucene&amp;rsquo;s MMapDirectory： Why use it and what&amp;rsquo;s coming with Java 16 and later?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ: &lt;a href=&#34;https://2021.berlinbuzzwords.de/session/future-lucenes-mmapdirectory-why-use-it-and-whats-coming-java-16-and-later&#34;&gt;The future of Lucene&amp;rsquo;s MMapDirectory： Why use it and what&amp;rsquo;s coming with Java 16 and later? | Berlin Buzzwords 2021&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Apache Lucene PMCのUweさんによるLuceneのMMapDirectoryの話です。
ファイルシステムとJavaに関する歴史と、なぜMMapなのか、現在のMMapの実装の問題点とJDK 16でどうなっているか（どんな感触か）、さらにその先（JDK17）は？という話です。
Luceneでの利用方法からJDKへのフィードバックが行われている話や、そのフィードバックをもとに今後どのようにしていくのか?という話がされています。&lt;/p&gt;
&lt;h3 id=&#34;search-and-sushi-freshness-counts&#34;&gt;Search and Sushi; Freshness Counts&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ: &lt;a href=&#34;https://2021.berlinbuzzwords.de/session/search-and-sushi-freshness-counts&#34;&gt;Search and Sushi; Freshness Counts | Berlin Buzzwords 2021&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こちらも&lt;a href=&#34;https://vespa.ai/&#34;&gt;Vespa.ai&lt;/a&gt;の紹介です（今年はスポンサーしてるから多いのかも？）。Yahoo!とVerizon Mediaで利用している話をしたあと、Vespaでのリアルタイムインデキシングに関するアーキテクチャの紹介でした。内部で転置インデックスやそれ以外のデータをどのように保持しているのか？どういったことができるのか？というのをアーキテクチャ、ストレージの観点から紹介しています。&lt;/p&gt;
&lt;h3 id=&#34;encores---going-beyond-matching-and-ranking-of-search-results&#34;&gt;Encores? - Going beyond matching and ranking of search results&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ(動画がまだない): &lt;a href=&#34;https://2021.berlinbuzzwords.de/session/encores-going-beyond-matching-and-ranking-search-results&#34;&gt;Encores? - Going beyond matching and ranking of search results | Berlin Buzzwords 2021&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;検索のマッチングやランキング以外のいくつかの機能についての紹介をワークショップ形式で行うセッションです。ファセット、クエリオートコンプリート、スペル訂正、クエリリラクゼーションについて、データとSolrのクエリを基準に説明をしてくれます。&lt;/p&gt;
&lt;h3 id=&#34;the-invasion-of-transformers---boosting-search-with-latest-nlp&#34;&gt;The Invasion of Transformers - Boosting Search with Latest NLP&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ: &lt;a href=&#34;https://2021.berlinbuzzwords.de/session/invasion-transformers-boosting-search-latest-nlp&#34;&gt;The Invasion of Transformers - Boosting Search with Latest NLP | Berlin Buzzwords 2021&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;deepsetという会社のCTOの方で、自社で作っているOSSのhaystackという製品の紹介です。
最近のGoogleの検索結果にはいろんなもの（問いかけに関する答えそのもの、またそのプレビューやサマリー）が出てきているという話から、Transformersを使って検索ができないかということで自社のOSSの仕組みを紹介しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参考
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://searchengineland.com/google-bert-used-on-almost-every-english-query-342193&#34;&gt;Google： BERT now used on almost every English query&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/deepset-ai/haystack/&#34;&gt;deepset-ai/haystack： End-to-end Python framework for building natural language search interfaces to data. Leverages Transformers and the State-of-the-Art of NLP. Supports DPR, Elasticsearch, Hugging Face’s Hub, and much more!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;learning-to-judge&#34;&gt;Learning to Judge&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ: &lt;a href=&#34;https://2021.berlinbuzzwords.de/session/learning-judge&#34;&gt;Learning to Judge | Berlin Buzzwords 2021&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;otto.deというECサイトでLtRを導入し、そのLtRにどんな特徴を利用しどうやって実験したかというセッションでした。Apache Solrで検索ができていて、これまでは検索の管理を人手で行っていたがスケールしない（扱う商品などは増えているのに）のでLtRを導入し始めたという感じでした。LtRの導入の過程でどういう仮定を置いて、どうモデルを決め、それをどうやってテストしてどう分析したか?という流れでした。&lt;/p&gt;
&lt;h3 id=&#34;text-categorization-with-apache-lucene&#34;&gt;Text categorization with Apache Lucene&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;セッションページ: &lt;a href=&#34;https://2021.berlinbuzzwords.de/session/text-categorization-apache-lucene&#34;&gt;Text categorization with Apache Lucene | Berlin Buzzwords 2021&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;LTなので短めです。BBCのデータセットをインデックスに登録し、そのデータをもとにLucene（デモではKibana＋Esを利用していた）でテキスト分類を行なう方法について紹介しています。BBCのデータセットは記事（テキスト）とカテゴリ（タグ）というデータです。
このデータが登録されているインデックスに対して、More Like Thisクエリに分類したい文章を与え、ヒットしたデータをもとにAggregationでカテゴリを取得し、上位のカテゴリが分類された結果になるというデモでした。
テキストフィールドにはEdge N-Gramを利用していること、Aggregationのソートの条件はMore Like Thisクエリでのスコアの平均を利用していることというのがこの方法がうまくいくことのようでした（なるほど！）。ただ、日本語でもこれが使えるかな？というのはやってみないとわからないかなぁと（やってないです）。&lt;/p&gt;
&lt;p&gt;とりあえず、メモしておいたのはこの辺でした。
他にもセッション一覧を眺めながら面白そうな話をピックアップしてメモを取っていこうかなぁ？気になるセッション、メモがおかしいなどあればコメントいただければと。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Azure Cognitive Searchの新機能、Semantic Searchを試してみた</title>
      <link>https://blog.johtani.info/blog/2021/07/01/semantic-search-in-azure-cognitive-search/</link>
      <pubDate>Thu, 01 Jul 2021 18:09:43 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2021/07/01/semantic-search-in-azure-cognitive-search/</guid>
      <description>&lt;p&gt;Azure Cognitive Searchで新機能「Semantic Search（セマンティック検索）」という機能の日本語対応が発表されました。
実際にはPublic Previewという状態ではありますが、どんな機能か気になったので調べてみました。
なお、本ブログは2021年6月時点での内容となります。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Azure Cognitive Searchで新機能「Semantic Search（セマンティック検索）」という機能の日本語対応が発表されました。
実際にはPublic Previewという状態ではありますが、どんな機能か気になったので調べてみました。
なお、本ブログは2021年6月時点での内容となります。&lt;/p&gt;
&lt;h2 id=&#34;公式ドキュメント&#34;&gt;公式ドキュメント&lt;/h2&gt;
&lt;p&gt;公式ドキュメントでいろいろと説明されています。まずは公式ドキュメントを見ていただくのが良いかなと。最初のドキュメントには10分ちょっとの紹介ビデオもあります。ピックアップしたのは概要、クエリ、レスポンスの構造、紹介ブログになります。ブログ以外は日本語（たぶん機械翻訳？）になっています(新機能の紹介の日本語ページにはまだ記載がありません)。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/semantic-search-overview&#34;&gt;Semantic search - Azure Cognitive Search | Microsoft Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/semantic-how-to-query-request&#34;&gt;Create a semantic query - Azure Cognitive Search | Microsoft Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/semantic-how-to-query-response&#34;&gt;Structure a semantic response - Azure Cognitive Search | Microsoft Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.microsoft.com/en-us/research/blog/the-science-behind-semantic-search-how-ai-from-bing-is-powering-azure-cognitive-search/&#34;&gt;The science behind semantic search： How AI from Bing is powering Azure Cognitive Search - Microsoft Research&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;簡単にですがデータを入れて試してみたので、どんな仕組みなのかどういう挙動なのかを紹介します。&lt;/p&gt;
&lt;h2 id=&#34;semantic-searchとは&#34;&gt;Semantic Searchとは？&lt;/h2&gt;
&lt;p&gt;言語理解、セマンティック関連性などを提供する機能です。BingとMSリサーチにより開発されて、Azure Cognitive Searchに導入されました。
クエリの書き方を少し変更する必要がありますが、再インデックスや設定変更などは必要ないという仕組みになっています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;検索クエリからコンテキストを読み取って、検索し、リランクするアルゴリズム(Semantic Ranker)&lt;/li&gt;
&lt;li&gt;関連する一節を強調表示（Semantic Caption）&lt;/li&gt;
&lt;li&gt;クエリに対するセマンティック回答(Semantic Answer)&lt;/li&gt;
&lt;li&gt;スペルチェック機能&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.microsoft.com/en-us/rest/api/searchservice/preview-api/search-documents#queryLanguage&#34;&gt;言語によって利用できる機能が異なります&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;Semantic Searchの利点は先ほどの紹介にも書きましたが、インデキシング時に特殊処理をする必要がないことかなと。
すでに登録してあるデータ（制限がありますが）でもすぐに試すことができます。&lt;/p&gt;
&lt;h3 id=&#34;仕組み&#34;&gt;仕組み&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/media/semantic-search-overview/semantic-query-architecture.png&#34;&gt;https://docs.microsoft.com/ja-jp/azure/search/media/semantic-search-overview/semantic-query-architecture.png&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;スペル修正機能&lt;/li&gt;
&lt;li&gt;クエリパース&lt;/li&gt;
&lt;li&gt;スコアリング&lt;/li&gt;
&lt;li&gt;上位50件に対してSemantic Rankerにより再評価（検索ヒットが50件以上の場合でも&lt;strong&gt;上位50件&lt;/strong&gt;のみがリランクの対象）
&lt;ul&gt;
&lt;li&gt;言語表現モデルを利用&lt;/li&gt;
&lt;li&gt;結果の要約として最適な部分をキャプションとして抽出。&lt;/li&gt;
&lt;li&gt;クエリが質問形式の場合は一番よさそうな場所を回答として選択&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;1および4番目の処理が今回新しく使えるSemantic Searchの機能になります。スペルチェックは日本語がまだ対象外なので、4番目の機能について紹介します。&lt;/p&gt;
&lt;h3 id=&#34;利用できる環境と制限&#34;&gt;利用できる環境と制限&lt;/h3&gt;
&lt;p&gt;冒頭でも書きましたが、Public Previewの段階です。実際に利用するには&lt;a href=&#34;https://forms.office.com/pages/responsepage.aspx?id=v4j5cvGGr0GRqy180BHbRyhHvXnF8jlIrXhuXLZqYeJUNTNUMEQ2V0NLOU5JVEVBTEU5NkZNUlA3RS4u&#34;&gt;リクエストページ&lt;/a&gt;から申し込みが必要になっています。&lt;/p&gt;
&lt;p&gt;利用リクエスト時に利用するAzure Cognitive Searchのサービス名が必要になるので、あらかじめ起動しておかなければいけません。
また、利用できるリージョンが限定されているのでサービス起動時のリージョンには気を付けてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;利用できるリージョン
&lt;ul&gt;
&lt;li&gt;米国中北部、米国西部、米国西部 2、米国東部 2、北ヨーロッパ、西ヨーロッパ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;利用できるTier
&lt;ul&gt;
&lt;li&gt;セマンティック検索はStandardレベル&lt;/li&gt;
&lt;li&gt;スペルチェックはレベル制限なし&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;価格（セマンティック検索のみ）
&lt;ul&gt;
&lt;li&gt;7月初旬までは25万クエリで500ドル&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Analyzerの制限
&lt;ul&gt;
&lt;li&gt;Azure Cognitive Searchが提供する言語アナライザーが対象（Custom Analyzerでは利用不可）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;サービス起動後にプレビュープログラムを申請すると、利用できるようになるとメールが届きます。そこから利用ができるようになります。&lt;/p&gt;
&lt;p&gt;今回は日本語のWikipediaのデータをいれてどんな機能なのかを確認してみました。&lt;/p&gt;
&lt;h2 id=&#34;wikipediaのデータを入れて試してみた&#34;&gt;Wikipediaのデータを入れて試してみた&lt;/h2&gt;
&lt;p&gt;日本語のWikipedia（あとで英語も入れました）を一部（10万件程度）登録してSemantic Search（主にRanker）の動きを確認してみました。&lt;/p&gt;
&lt;p&gt;データの登録には自作ツールを利用。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JSONデータ生成ツール：https://github.com/johtani/wiki-extractor-rs&lt;/li&gt;
&lt;li&gt;JSONデータ登録ツール：https://github.com/johtani/wiki-json-loader&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;日本語Wikipediaの2020年6月のデータ、英語Wikipediaの2021年6月のデータを利用。上記ツールで生成したもののうち約10万件をAzure Cognitive Searchに登録して動作確認をしました（英語のデータでJSONデータ生成ツールでバグがあるのですが修正していません。。。）。
また、クエリの実行にはVisual Studio CodeのREST Client拡張(&lt;a href=&#34;https://blog.johtani.info/blog/2020/02/19/research-azure-cognitive-search/#%E9%96%91%E8%A9%B1%E4%BC%91%E9%A1%8C---rest-client-exstension-for-visual-studio-code&#34;&gt;どんなものかは以前のブログをご覧ください&lt;/a&gt;)を使いました。簡単にREST APIを呼び出せるのはすばらしい。&lt;/p&gt;
&lt;h3 id=&#34;日本語のwikipedia&#34;&gt;日本語のWikipedia&lt;/h3&gt;
&lt;p&gt;日本語のWikipediaのデータを「96,344件」登録し実験しました。
スキーマは次のような形です（説明に必要なものだけ抽出してあります）。自然分が入っている&lt;code&gt;title&lt;/code&gt;、&lt;code&gt;contents&lt;/code&gt;、&lt;code&gt;headings&lt;/code&gt;の3つのフィールドを今回はSemantic Searchの対象にしてみるので、AnalyzerをLuceneベースの日本語Analyzerである&lt;code&gt;ja.lucene&lt;/code&gt;を設定しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;フィールド名 : タイプ / Analyzer&lt;/li&gt;
&lt;li&gt;id : Edm.String / keyword&lt;/li&gt;
&lt;li&gt;categories : Collection(Edm.String) / keyword&lt;/li&gt;
&lt;li&gt;title : Edm.String / ja.lucene&lt;/li&gt;
&lt;li&gt;contents : Edm.String / ja.lucene&lt;/li&gt;
&lt;li&gt;headings : Edm.String / ja.lucene&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Analyzerに言語Analyzerを設定するくらいで、他の設定は特に必要ありません。&lt;/p&gt;
&lt;h4 id=&#34;クエリとデータの確認&#34;&gt;クエリとデータの確認&lt;/h4&gt;
&lt;p&gt;デモの動画や説明のサンプルを見たところ英語で「Where was Alan Turing born?」や「What&amp;rsquo;s the capital of France?」のような自然文のクエリが出てきたので、次のようなクエリで試してみました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;フランスの首都はどこですか？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;実際にパリのページがインデックスに存在していることは以下のクエリで確認しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;パリ：3047件&lt;/li&gt;
&lt;/ul&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;POST&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;https&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//{{host}}/indexes/{{index-name}}/docs/search?api-version=2020-06-30-Preview
&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;Content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;application&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;json&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;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {{&lt;span style=&#34;color:#a6e22e&#34;&gt;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&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:#e6db74&#34;&gt;&amp;#34;count&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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:#e6db74&#34;&gt;&amp;#34;search&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;パリ&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:#e6db74&#34;&gt;&amp;#34;top&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&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:#e6db74&#34;&gt;&amp;#34;searchFields&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;title, categories, contents&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:#e6db74&#34;&gt;&amp;#34;select&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;title, id, contents&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;code&gt;{{host}}&lt;/code&gt;などはREST Client拡張で変数として定義したものです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;host : Azure Cognitive Searchのサービス名&lt;/li&gt;
&lt;li&gt;index-name : インデックス名&lt;/li&gt;
&lt;li&gt;api-key : 接続のためのAPIキー&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;URLパラメータの&lt;code&gt;api-version=2020-06-30-Preview&lt;/code&gt;がPreview機能を呼び出すための指定になっています。&lt;/p&gt;
&lt;p&gt;3047件の1件目が「パリ」のページで以下のようなWikipediaの文章をセクションごとに文字列としてページ全体を配列に入れて&lt;code&gt;contents&lt;/code&gt;に登録してあります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;#34;パリ（、巴里）は、フランス北部、イル＝ド＝フランス地域圏にある都市。フランスの首都であり、イル＝ド＝フランス地域圏の首府である。\nフランス最大の都市であり、同国の政治、経済、文化などの中心である。ロンドンと共に欧州を代表する世界都市。行政上では、1コミューン単独で県を構成する特別市であり、ルーヴル美術館を含む1区を中心に、時計回りに20の行政区が並ぶ（エスカルゴと形容される）。&amp;#34;,
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;このインデックスに対して「フランスの首都はどこですか？」というクエリを、セマンティック検索のクエリと通常のクエリの2パターンで検索をしてみました。&lt;/p&gt;
&lt;h4 id=&#34;これまでのクエリセマンティックではない検索&#34;&gt;これまでのクエリ（セマンティックではない検索）&lt;/h4&gt;
&lt;p&gt;まずは通常のクエリです。
&lt;code&gt;search&lt;/code&gt;がクエリ文字列、&lt;code&gt;searchFields&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;POST&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;https&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//{{host}}/indexes/{{index-name}}/docs/search?api-version=2020-06-30-Preview
&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;Content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;application&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;json&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;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {{&lt;span style=&#34;color:#a6e22e&#34;&gt;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&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:#e6db74&#34;&gt;&amp;#34;top&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&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:#e6db74&#34;&gt;&amp;#34;count&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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:#e6db74&#34;&gt;&amp;#34;search&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;フランスの首都はどこですか？&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:#e6db74&#34;&gt;&amp;#34;searchFields&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;title, contents&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:#e6db74&#34;&gt;&amp;#34;select&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;title,  id&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;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;クエリを実行するとヒット件数が&#39;13996&amp;rsquo;件で、トップ5件のデータは次のようになりました。&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;@odata.count&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;13996&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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;17.059355&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:#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;462&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:#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;首都&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;16.086372&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:#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;21053&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:#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;首都圏&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;15.059893&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:#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;71414&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:#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;どこでもドア&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;14.086605&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:#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;51972&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:#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;首都機能移転&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;12.996841&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:#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;3877&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:#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;首都の一覧&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;見るとわかりますが、「首都」「どこ」といった単語を含むデータが上位に入っています。「フランス」を含むデータは8件目と10件目に「フランス植民地帝国」、「ラ・フランス」といったデータが出てきます。&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-js&#34; data-lang=&#34;js&#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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;12.705561&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:#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;129279&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:#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;フランス植民地帝国&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;12.036648&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:#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;3173&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:#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;ラ・フランス&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;p&gt;どんな検索になっているのでしょうか？まずは、クエリの解釈から。
デフォルトで、Azure Cognitive Searchはデフォルトでは、入力された文字列を&lt;code&gt;type=simple&lt;/code&gt;、&lt;code&gt;mode=any&lt;/code&gt;で検索します（&lt;a href=&#34;https://docs.microsoft.com/ja-jp/rest/api/searchservice/search-documents#query-parameters&#34;&gt;クエリパラメータ参照&lt;/a&gt;）。
対象となるフィールドは&lt;code&gt;searchFields&lt;/code&gt;で今回は指定してあるので、これらのフィールドに対して、入力された文字列を渡してAnalyzerで単語分割し（今回は&lt;code&gt;simple&lt;/code&gt;クエリ用の特殊文字が入っていないため文字列として扱われる）、
出てきた単語で（&lt;code&gt;mode=any&lt;/code&gt;だから）OR検索します。
&lt;code&gt;ja.lucene&lt;/code&gt;のAnalyzerが出力する単語列がどんなものかは以下のリクエストを実行するとわかります。&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;POST&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;https&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//{{host}}/indexes/{{index-name}}/analyze?api-version=2020-06-30-Preview
&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;Content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;application&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;json&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;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {{&lt;span style=&#34;color:#a6e22e&#34;&gt;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&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:#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;ja.lucene&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:#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;フランスの首都はどこですか？&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;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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tokens&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;token&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;フランス&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:#e6db74&#34;&gt;&amp;#34;startOffset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;endOffset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&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:#e6db74&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;token&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;首都&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:#e6db74&#34;&gt;&amp;#34;startOffset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5&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:#e6db74&#34;&gt;&amp;#34;endOffset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;7&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:#e6db74&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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:#e6db74&#34;&gt;&amp;#34;token&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;どこ&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:#e6db74&#34;&gt;&amp;#34;startOffset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&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:#e6db74&#34;&gt;&amp;#34;endOffset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&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:#e6db74&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで、どのような単語が出てきているかがわかりました。
それぞれのフィールドでどのようなスコアになっているかまではわからないですが、検索結果には上記3つの単語のいずれかが&lt;code&gt;searchFields&lt;/code&gt;にヒットすれば出てきます。おそらく、ヒットした単語数が多い、短い文字列のフィールドがより高いスコアになるというような動きになっていると思われます（&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/index-similarity-and-scoring&#34;&gt;BM25になってるはず&lt;/a&gt;）。&lt;/p&gt;
&lt;h4 id=&#34;セマンティック検索&#34;&gt;セマンティック検索&lt;/h4&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;POST&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;https&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//{{host}}/indexes/{{index-name}}/docs/search?api-version=2020-06-30-Preview
&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;Content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;application&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;json&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;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {{&lt;span style=&#34;color:#a6e22e&#34;&gt;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&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:#e6db74&#34;&gt;&amp;#34;top&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&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:#e6db74&#34;&gt;&amp;#34;count&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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:#e6db74&#34;&gt;&amp;#34;search&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;フランスの首都はどこですか？&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:#e6db74&#34;&gt;&amp;#34;searchFields&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;title, contents&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:#e6db74&#34;&gt;&amp;#34;select&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;title,  id&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:#e6db74&#34;&gt;&amp;#34;queryType&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;semantic&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:#e6db74&#34;&gt;&amp;#34;queryLanguage&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;ja-jp&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;code&gt;queryType&lt;/code&gt;、&lt;code&gt;queryLanguage&lt;/code&gt;がセマンティック検索のクエリを実行するためのパラメータになります（&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/semantic-how-to-query-request#query-using-rest&#34;&gt;公式ガイド参照&lt;/a&gt;）。
今回は日本語のデータであるため、日本語のモデルを利用するように&lt;code&gt;queryLanguage&lt;/code&gt;を指定します（許可されていない文字列を渡すとエラーになる）。
この2つを追加するだけです。簡単ですね。&lt;/p&gt;
&lt;p&gt;結果は次のようになります（上位5件抜粋）。&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;@odata.count&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;13996&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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;12.036648&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:#e6db74&#34;&gt;&amp;#34;@search.rerankerScore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2.3456064984202385&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:#e6db74&#34;&gt;&amp;#34;@search.captions&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;ラ・フランス&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:#e6db74&#34;&gt;&amp;#34;highlights&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;&amp;lt;em&amp;gt;ラ・フランス&amp;lt;/em&amp;gt;&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;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:#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;3173&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:#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;ラ・フランス&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;11.144733&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:#e6db74&#34;&gt;&amp;#34;@search.rerankerScore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2.3173404783010483&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:#e6db74&#34;&gt;&amp;#34;@search.captions&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;ラン (フランス)&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:#e6db74&#34;&gt;&amp;#34;highlights&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;&amp;lt;em&amp;gt;ラン&amp;lt;/em&amp;gt; (&amp;lt;em&amp;gt;フランス)&amp;lt;/em&amp;gt;&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;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:#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;108094&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:#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;ラン (フランス)&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;11.144793&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:#e6db74&#34;&gt;&amp;#34;@search.rerankerScore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2.1937477812170982&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:#e6db74&#34;&gt;&amp;#34;@search.captions&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;ブレスト (フランス)&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:#e6db74&#34;&gt;&amp;#34;highlights&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;&amp;lt;em&amp;gt;ブレスト&amp;lt;/em&amp;gt; (&amp;lt;em&amp;gt;フランス)&amp;lt;/em&amp;gt;&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;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:#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;116154&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:#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;ブレスト (フランス)&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10.199907&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:#e6db74&#34;&gt;&amp;#34;@search.rerankerScore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2.1590753793716431&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:#e6db74&#34;&gt;&amp;#34;@search.captions&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;フランス・ハルス&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:#e6db74&#34;&gt;&amp;#34;highlights&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;&amp;lt;em&amp;gt;フランス・ハルス&amp;lt;/em&amp;gt;&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;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:#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;81566&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:#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;フランス・ハルス&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;11.273148&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:#e6db74&#34;&gt;&amp;#34;@search.rerankerScore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2.1434053033590317&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:#e6db74&#34;&gt;&amp;#34;@search.captions&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;バカロレア (フランス)&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:#e6db74&#34;&gt;&amp;#34;highlights&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;&amp;lt;em&amp;gt;バカロレア&amp;lt;/em&amp;gt; (&amp;lt;em&amp;gt;フランス&amp;lt;/em&amp;gt;)&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;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:#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;54514&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:#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;バカロレア (フランス)&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;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/semantic-search-overview&#34;&gt;公式ドキュメントのセマンティック検索&lt;/a&gt;に説明があるように、
セマンティック検索が通常のクエリで実行した後の検索結果に対して、上位50件のデータだけに対してsemantic rankerによってスコアを再計算するという仕様のためです（ドキュメントからの推測）。&lt;/p&gt;
&lt;p&gt;実際に検索結果の50件目、51件目は次のようになっていました。50件目までのデータには&lt;code&gt;@search.rerankerScore&lt;/code&gt;というスコア（と&lt;code&gt;@search.captions&lt;/code&gt;）が追加されています。
51件目のデータについては、前の通常のクエリの51件目のデータと同じデータでした。&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-js&#34; data-lang=&#34;js&#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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10.909212&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:#e6db74&#34;&gt;&amp;#34;@search.rerankerScore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.07321979058906436&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:#e6db74&#34;&gt;&amp;#34;@search.captions&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;首都高速埼玉大宮線&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:#e6db74&#34;&gt;&amp;#34;highlights&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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:#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;67667&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:#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;首都高速埼玉大宮線&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10.049902&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:#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;68569&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:#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;スタッド・ド・フランス&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;上位5件のデータに戻ります。
これらは、通常のクエリとは異なる結果となりました。
見ると&lt;code&gt;@search.captions&lt;/code&gt;というところにハイライトされた項目が表示されています。
検索クエリをもとにそれっぽい部分がキャプションという形で返ってくる仕組みです。&lt;/p&gt;
&lt;p&gt;結果を見るとわかりますが、残念ながら「パリ」のページは返ってきませんでした。
もともと通常のクエリを実行したときの「326」番目の結果として返ってきているため、セマンティック検索の対象とはならなかったためです。
ただ、「首都」「どこ」といった単語よりも「フランス」に関するドキュメントが通常の検索よりも上位に来ています。
クエリに存在する単語で「フランス」がより重要であると判断されているようです。&lt;/p&gt;
&lt;h4 id=&#34;semantic-rankerに処理させてみる&#34;&gt;Semantic Rankerに処理させてみる&lt;/h4&gt;
&lt;p&gt;ちなみに、今回登録したデータにはWikipediaのカテゴリも登録してあります。
「ヨーロッパの首都」というカテゴリで絞り込んでから検索してみるとどうなるかもやってみました。
&lt;code&gt;filter&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;POST&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;https&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//{{host}}/indexes/{{index-name}}/docs/search?api-version=2020-06-30-Preview
&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;Content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;application&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;json&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;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {{&lt;span style=&#34;color:#a6e22e&#34;&gt;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&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:#e6db74&#34;&gt;&amp;#34;top&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&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:#e6db74&#34;&gt;&amp;#34;count&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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:#e6db74&#34;&gt;&amp;#34;search&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;フランスの首都はどこですか？&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:#e6db74&#34;&gt;&amp;#34;searchFields&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;title, contents&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:#e6db74&#34;&gt;&amp;#34;select&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;title,  id&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:#e6db74&#34;&gt;&amp;#34;queryType&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;semantic&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:#e6db74&#34;&gt;&amp;#34;queryLanguage&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;ja-jp&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:#e6db74&#34;&gt;&amp;#34;filter&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;search.ismatch(&amp;#39;ヨーロッパの首都&amp;#39;, &amp;#39;categories&amp;#39;)&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;結果は次の通りです。カテゴリで絞り込みをしているので検索結果数は39件となります。このため、すべてのデータがSemantic Rankerの対象です。
ですが、「パリ」のページは11件目に出てきました。&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;@odata.count&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;39&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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3.8405614&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:#e6db74&#34;&gt;&amp;#34;@search.rerankerScore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2.0472740978002548&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:#e6db74&#34;&gt;&amp;#34;@search.captions&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;ウィーン&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:#e6db74&#34;&gt;&amp;#34;highlights&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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:#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;9465&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:#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;ウィーン&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4.8915977&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:#e6db74&#34;&gt;&amp;#34;@search.rerankerScore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.8480307757854462&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:#e6db74&#34;&gt;&amp;#34;@search.captions&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;レイキャヴィーク&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:#e6db74&#34;&gt;&amp;#34;highlights&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;&amp;lt;em&amp;gt;レイキャヴィーク&amp;lt;/em&amp;gt;&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;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:#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;112253&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:#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;レイキャヴィーク&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;7.277628&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:#e6db74&#34;&gt;&amp;#34;@search.rerankerScore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.7982495501637459&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:#e6db74&#34;&gt;&amp;#34;@search.captions&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;パリ&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:#e6db74&#34;&gt;&amp;#34;highlights&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;&amp;lt;em&amp;gt;パリ&amp;lt;/em&amp;gt;&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;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:#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;31&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:#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;パリ&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;キャプションは入力された単語だけではなく、クエリが持っている単語をもとにした何かしらの基準（おそらく言語モデルで近い単語？）で選択されていると思われます。首都というカテゴリーで絞り込んでしまったので、ヒットした文章が似たようなものが多くなったせいか、残念ながらそこまでSemantic Rankerが意図を汲み取るところまでは行きませんでした。&lt;/p&gt;
&lt;h4 id=&#34;フランスの歴史&#34;&gt;フランスの歴史&lt;/h4&gt;
&lt;p&gt;視点を変えてみましょう。質問そのものの答えではなく、クエリの意図に近いものが出てくるかを見てみましょう。
ここまでのクエリでフランスに関するクエリを投げていました。今回のインデックスに「フランスの歴史」で検索すると「30820」件のドキュメントがヒットし、上位にはフランスには関係ない「歴史」のページや「フランス」の文学、都市など「フランスの歴史」とは少し離れた意味のものが上位に来ています。&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;@odata.count&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;30820&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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;12.888079&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:#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;17875&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:#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;スコットランドの歴史&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;12.718105&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:#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;10665&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:#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;世界の歴史&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;12.701981&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:#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;31397&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:#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;ベトナムの歴史&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;12.579847&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:#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;22433&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:#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;フランス文学&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;12.524254&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:#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;34667&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:#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;フランスの国旗&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;12.52136&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:#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;108094&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:#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;ラン (フランス)&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;12.41088&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:#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;20717&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:#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;歴史小説&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;12.388911&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:#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;56229&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:#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;演劇の歴史&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;12.343941&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:#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;39669&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:#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;イギリスの歴史&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;@odata.count&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;30820&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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;12.274498&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:#e6db74&#34;&gt;&amp;#34;@search.rerankerScore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.482184374704957&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:#e6db74&#34;&gt;&amp;#34;@search.captions&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;自由フランス&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:#e6db74&#34;&gt;&amp;#34;highlights&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;&amp;lt;em&amp;gt;自由フランス&amp;lt;/em&amp;gt;&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;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:#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;96475&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:#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;自由フランス&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;11.446766&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:#e6db74&#34;&gt;&amp;#34;@search.rerankerScore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.3535655084997416&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:#e6db74&#34;&gt;&amp;#34;@search.captions&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;フランスの地域圏&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:#e6db74&#34;&gt;&amp;#34;highlights&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;&amp;lt;em&amp;gt;フランスの地域圏&amp;lt;/em&amp;gt;&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;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:#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;51845&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:#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;フランスの地域圏&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10.926437&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:#e6db74&#34;&gt;&amp;#34;@search.rerankerScore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.3261859538033605&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:#e6db74&#34;&gt;&amp;#34;@search.captions&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;フランス第一帝政&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:#e6db74&#34;&gt;&amp;#34;highlights&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;&amp;lt;em&amp;gt;フランス第一帝政&amp;lt;/em&amp;gt;&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;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:#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;57573&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:#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;フランス第一帝政&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;code&gt;@search.rerankerScore&lt;/code&gt;の値が低くなっていました（31件目に出現）。&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-js&#34; data-lang=&#34;js&#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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;12.888079&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:#e6db74&#34;&gt;&amp;#34;@search.rerankerScore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.42768346797674894&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:#e6db74&#34;&gt;&amp;#34;@search.captions&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;スコットランドの歴史&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:#e6db74&#34;&gt;&amp;#34;highlights&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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:#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;17875&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:#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;スコットランドの歴史&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;h4 id=&#34;考察&#34;&gt;考察&lt;/h4&gt;
&lt;p&gt;日本語のWikipediaを約10万件入れたインデックスでセマンティック検索を試してみました。
デモや説明などでクエリが自然文の質問だったこともあり、質問の回答になりそうなページが上に来るかと期待しましたが、期待しすぎました。&lt;/p&gt;
&lt;p&gt;これは、Azure Cognitive Searchのセマンティック検索の仕組みを考えると納得のいくものです。
説明を読んだ時にも感じたのですが、&lt;strong&gt;入力された文字列でまず検索&lt;/strong&gt;をし、&lt;strong&gt;上位50件&lt;/strong&gt;をセマンティック検索の対象としています。&lt;/p&gt;
&lt;p&gt;ですので、そもそもクエリの文章に出てくる単語が含まれたデータだけが対象となります。
このため、クエリに出てこない単語のみで構成されているものは残念ながら対象とできません。
また、上位50件だけがSemantic Rankerの対象となっているため、検索にヒットしたとしても上位に食い込まなければ言語モデルによるランキングの対象にもなりません。
セマンティック検索といっても、残念ながらドキュメントに出てこない単語（似た単語、質問に対するそのものの回答）まで読み取る機能はありません。&lt;/p&gt;
&lt;p&gt;ただ、「フランスの歴史」の検索で見たようにそれぞれの単語だけで検索をしていた場合とは異なり、
クエリの意味に沿ったスコアづけにより、通常の検索よりも意図したものに近いデータが出ていることが確認できました。
複数の単語で構成されるクエリの場合に、単語だけでスコアを計算した場合よりもよさそうな結果が上位に出てくることがわかりました。&lt;/p&gt;
&lt;p&gt;ただし、重要なのは「&lt;strong&gt;上位50件&lt;/strong&gt;」までしかSemantic Rankerの対象にはならない点です。&lt;/p&gt;
&lt;h3 id=&#34;英語のwikipedia&#34;&gt;英語のWikipedia&lt;/h3&gt;
&lt;p&gt;セマンティックは英語対応が一番最初にリリースされているので、英語のWikipediaについてもデータを登録してみました。&lt;/p&gt;
&lt;p&gt;英語のWikipediaのデータを「111,649件」登録しました。
スキーマは以下の通り（今回の調査に利用していないものは省略）です。日本語と異なる点はAnalyzerが&lt;code&gt;en.lucene&lt;/code&gt;になっていることぐらいです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;フィールド名 : タイプ / Analyzer&lt;/li&gt;
&lt;li&gt;id : Edm.String / keyword&lt;/li&gt;
&lt;li&gt;categories : Collection(Edm.String) / keyword&lt;/li&gt;
&lt;li&gt;title : Edm.String / en.lucene&lt;/li&gt;
&lt;li&gt;contents : Edm.String / en.lucene&lt;/li&gt;
&lt;li&gt;headings : Edm.String / en.lucene&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;クエリとデータの確認-1&#34;&gt;クエリとデータの確認&lt;/h4&gt;
&lt;p&gt;日本語同様に首都に関する質問形式にしてみました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What&amp;rsquo;s the capital of Italy?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;実際にRomeのページがインデックスに存在していることは以下のクエリで確認済みです。&lt;/p&gt;
&lt;p&gt;Rome：2302件&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;POST&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;https&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//{{host}}/indexes/{{index-name}}/docs/search?api-version=2020-06-30-Preview
&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;Content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;application&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;json&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;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {{&lt;span style=&#34;color:#a6e22e&#34;&gt;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&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:#e6db74&#34;&gt;&amp;#34;count&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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:#e6db74&#34;&gt;&amp;#34;search&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;Rome&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:#e6db74&#34;&gt;&amp;#34;top&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&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:#e6db74&#34;&gt;&amp;#34;searchFields&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;title, contents&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:#e6db74&#34;&gt;&amp;#34;select&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;title, id, contents&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;以下のようなWikipediaの文章をセクションごとに文字列としてページ全体を配列に入れて&lt;code&gt;contents&lt;/code&gt;に登録してあります（これも日本語と同じです）。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;#34;&amp;#34;\n\nRome (Italian and Latin: Roma ) is the capital city and a special comune of Italy (named Comune di Roma Capitale), as well as the capital of the Lazio region. The city has been a major human settlement for almost three millennia. With 2,860,009 residents in , it is also the country&amp;#39;s most populated comune...&amp;#34;,
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;このデータ群に対して「What&amp;rsquo;s the capital of Italy?」というクエリを、Semantic Searchのクエリと通常のクエリの2パターンで検索をしてみる。&lt;/p&gt;
&lt;h4 id=&#34;これまでのクエリセマンティックではない検索-1&#34;&gt;これまでのクエリ（セマンティックではない検索）&lt;/h4&gt;
&lt;p&gt;まずは、Semantic Searchではないクエリです。&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;POST&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;https&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//{{host}}/indexes/{{index-name}}/docs/search?api-version=2020-06-30-Preview
&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;Content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;application&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;json&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;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {{&lt;span style=&#34;color:#a6e22e&#34;&gt;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&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:#e6db74&#34;&gt;&amp;#34;top&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&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:#e6db74&#34;&gt;&amp;#34;count&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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:#e6db74&#34;&gt;&amp;#34;search&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;What&amp;#39;s the capital of Italy?&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:#e6db74&#34;&gt;&amp;#34;searchFields&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;title, contents&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:#e6db74&#34;&gt;&amp;#34;select&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;title,  id&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;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;18049&lt;/code&gt;件で、トップ5件は次のような形です。&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;@odata.count&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;18049&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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;17.870815&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:#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;14532&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:#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;Italy&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;16.596167&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:#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;14702&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:#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;Economy of Italy&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;16.180624&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:#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;183878&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:#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;Louis II of Italy&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;15.917025&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:#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;29665&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:#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;State capitalism&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;15.88901&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:#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;215741&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:#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;Capitalization&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;日本語の場合よりもItalyに関連するものが上位に多く含まれます。
ただ、Rome自体のページは上位50件には出てきていませんでした。
また、capitalとは意味の異なるcapitalizationやcapitalismが上位に来ています。
日本語の場合と同様にクエリがどのように解釈されているのか？も見てみます。&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;POST&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;https&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//{{host}}/indexes/{{index-name}}/analyze?api-version=2020-06-30-Preview
&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;Content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;application&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;json&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;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {{&lt;span style=&#34;color:#a6e22e&#34;&gt;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&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:#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;en.lucene&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:#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;What&amp;#39;s the capital of Italy?&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;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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tokens&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;token&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;what&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:#e6db74&#34;&gt;&amp;#34;startOffset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;endOffset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;6&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:#e6db74&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;token&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;capit&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:#e6db74&#34;&gt;&amp;#34;startOffset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;11&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:#e6db74&#34;&gt;&amp;#34;endOffset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;18&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:#e6db74&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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:#e6db74&#34;&gt;&amp;#34;token&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;itali&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:#e6db74&#34;&gt;&amp;#34;startOffset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;22&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:#e6db74&#34;&gt;&amp;#34;endOffset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;27&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:#e6db74&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;日本語とあまり変わってはいません。ただ、単語が入力されたものとは少し変わっています。
これは、&lt;code&gt;en.lucene&lt;/code&gt;の処理で、stemmingが行われているためだと思われます。たとえば、「capital」の場合、Stemmingにより「capital」「capitalize」などの単語が元になりますが、動詞、名詞などの違いなく検索できるようにするためにこのようなStemmingの処理が行われます。
ということで、これらの単語を含むドキュメントがヒットしています。Italyが一番上に来ているのはItalyという単語が多く含まれるからのようです。&lt;/p&gt;
&lt;h4 id=&#34;semantic-searchクエリ&#34;&gt;Semantic Searchクエリ&lt;/h4&gt;
&lt;p&gt;では、Semantic Searchのクエリに変更してみましょう。&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;POST&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;https&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//{{host}}/indexes/{{index-name}}/docs/search?api-version=2020-06-30-Preview
&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;Content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;application&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;json&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;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {{&lt;span style=&#34;color:#a6e22e&#34;&gt;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&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:#e6db74&#34;&gt;&amp;#34;top&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&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:#e6db74&#34;&gt;&amp;#34;count&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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:#e6db74&#34;&gt;&amp;#34;search&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;What&amp;#39;s the capital of Italy?&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:#e6db74&#34;&gt;&amp;#34;searchFields&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;title, contents&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:#e6db74&#34;&gt;&amp;#34;select&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;title,  id&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:#e6db74&#34;&gt;&amp;#34;queryType&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;semantic&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:#e6db74&#34;&gt;&amp;#34;queryLanguage&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;en_us&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;code&gt;queryType&lt;/code&gt;、&lt;code&gt;queryLanguage&lt;/code&gt;がsemantic searchのクエリを実行するためのパラメータになります（&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/semantic-how-to-query-request#query-using-rest&#34;&gt;公式ガイド参照&lt;/a&gt;）。
今回は英語のデータであるため、英語のモデルを利用するように&lt;code&gt;queryLanguage&lt;/code&gt;を指定します（許可されていない文字列を渡すとエラーになる）。&lt;/p&gt;
&lt;p&gt;結果は次のようになります（上位5件抜粋）。&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;@odata.count&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;18049&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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;17.870815&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:#e6db74&#34;&gt;&amp;#34;@search.rerankerScore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.9688458815217018&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:#e6db74&#34;&gt;&amp;#34;@search.captions&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;Italy&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:#e6db74&#34;&gt;&amp;#34;highlights&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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:#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;14532&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:#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;Italy&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;14.239678&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:#e6db74&#34;&gt;&amp;#34;@search.rerankerScore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.9419755563139915&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:#e6db74&#34;&gt;&amp;#34;@search.captions&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;Capital city&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:#e6db74&#34;&gt;&amp;#34;highlights&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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:#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;181337&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:#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;Capital city&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10.181764&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:#e6db74&#34;&gt;&amp;#34;@search.rerankerScore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.8902588561177254&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:#e6db74&#34;&gt;&amp;#34;@search.captions&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;Lepontii&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:#e6db74&#34;&gt;&amp;#34;highlights&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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:#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;325133&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:#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;Lepontii&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10.865718&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:#e6db74&#34;&gt;&amp;#34;@search.rerankerScore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.875102698802948&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:#e6db74&#34;&gt;&amp;#34;@search.captions&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;ItalY&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:#e6db74&#34;&gt;&amp;#34;highlights&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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:#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;14482&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:#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;ItalY&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;11.689348&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:#e6db74&#34;&gt;&amp;#34;@search.rerankerScore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.8201303631067276&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:#e6db74&#34;&gt;&amp;#34;@search.captions&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;Savoy&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:#e6db74&#34;&gt;&amp;#34;highlights&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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:#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;27885&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:#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;Savoy&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;日本語で見てきたように、検索結果数を見ると、通常のクエリと同じ値で、残念ながら50件までにRomeは入っていないため、Semantic Rankerによるブーストもかかりませんでした。
ただし、「Capitalization」や「State capitalism」といった別の意味（地理に関するものではない単語）のものが上位に出てこなくなっています。
これは、capitalという単語が地理に関する意味を持っていると判断された結果のように見えます。
Capitalizationの&lt;code&gt;@search.rerankerScore&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-js&#34; data-lang=&#34;js&#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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;15.88901&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:#e6db74&#34;&gt;&amp;#34;@search.rerankerScore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.93921028636395931&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:#e6db74&#34;&gt;&amp;#34;@search.captions&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;Capitalization&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:#e6db74&#34;&gt;&amp;#34;highlights&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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:#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;215741&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:#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;Capitalization&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;h5 id=&#34;whats-the-capital-of-finland&#34;&gt;What&amp;rsquo;s the capital of Finland?&lt;/h5&gt;
&lt;p&gt;上位50件以内(20件目)に「Helsinki」のページが出てくるクエリでセマンティック検索をしてみました。&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-js&#34; data-lang=&#34;js&#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:#a6e22e&#34;&gt;POST&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;https&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//{{host}}/indexes/{{index-name}}/docs/search?api-version=2020-06-30-Preview
&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;Content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;application&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;json&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;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {{&lt;span style=&#34;color:#a6e22e&#34;&gt;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&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:#e6db74&#34;&gt;&amp;#34;top&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&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:#e6db74&#34;&gt;&amp;#34;count&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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:#e6db74&#34;&gt;&amp;#34;search&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;What&amp;#39;s the captial of Finland?&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:#e6db74&#34;&gt;&amp;#34;searchFields&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;title, contents&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:#e6db74&#34;&gt;&amp;#34;select&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;title,  id&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:#e6db74&#34;&gt;&amp;#34;queryType&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;semantic&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:#e6db74&#34;&gt;&amp;#34;queryLanguage&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;en-us&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;結果としては、2件目にHelsinkiが返ってきていたので、Semantic Rankerがによる並び替えがうまくいきました。
（下記の結果は上位3件を抜粋したものです）。&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;@odata.count&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;16673&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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;14.026371&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:#e6db74&#34;&gt;&amp;#34;@search.rerankerScore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2.42378556355834&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:#e6db74&#34;&gt;&amp;#34;@search.captions&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;Vanaja (Finland)&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:#e6db74&#34;&gt;&amp;#34;highlights&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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:#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;7132102&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:#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;Vanaja (Finland)&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;12.434971&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:#e6db74&#34;&gt;&amp;#34;@search.rerankerScore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2.383675143122673&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:#e6db74&#34;&gt;&amp;#34;@search.captions&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;Helsinki&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:#e6db74&#34;&gt;&amp;#34;highlights&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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:#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;13696&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:#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;Helsinki&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;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:#e6db74&#34;&gt;&amp;#34;@search.score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;13.380153&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:#e6db74&#34;&gt;&amp;#34;@search.rerankerScore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2.2026549801230431&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:#e6db74&#34;&gt;&amp;#34;@search.captions&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;Rauma, Finland&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:#e6db74&#34;&gt;&amp;#34;highlights&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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:#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;178635&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:#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;Rauma, Finland&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;h4 id=&#34;考察-1&#34;&gt;考察&lt;/h4&gt;
&lt;p&gt;今回の英語のクエリではSemantic Rankerがある程度の役割をはたしていそうだということはわかりました。
Capitalがいくつもの意味を持っていることもあり、文章をもとにより意味の近いドキュメントが上位に来たということです。
ただ、英語の場合も基本的には上位50件以内のデータに対して処理が行われるので上位50件以内にデータが入らなければうまくいかないようです。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Azure Cognitive Searchの新機能であるセマンティック検索について調べてみました。
まだPublic Previewですが、簡単に使えるような仕組み（データの再登録なし、クエリでパラメータを追加するだけ）が用意されているのは便利でした。
ただ、最初に想像していたもの（私の早とちりもありますが）ほどのセマンティック検索とは行きませんでした。
似たような言葉の意味を持ったものを探してくれたり、答えそのもののページのスコアがすごく高くなるといったものではありませんでした。&lt;/p&gt;
&lt;p&gt;仕組み上、クエリに含まれる単語で検索し、上位50件以内のデータだけが対象になる(残念ながら現時点ではこの件数の変更はできません。)ため、これまでの検索とは劇的に変化するものではないことはわかりました（銀の弾丸はないんですけどね）。&lt;/p&gt;
&lt;p&gt;ある程度の挙動をわかっていれば、Wikipediaのようなデータでもそれなりの結果は取得できそうだということはわかりました。&lt;/p&gt;
&lt;p&gt;「言語モデル」でクエリとヒットしたデータをもとにスコア計算をし直しているようですが、この部分がどのようなデータ・クエリだと有効活用できるのか？というのをもう少しいろいろな角度で試してみる必要がある気がします（適材適所が何なのか？）。
あとは、上位50件までが対象なので、それ以上の件数のデータの並びに関してはこれまでと同様の結果となる点は注意しないといけません。
また、今回試していないほかの機能（スペルチェック、Semantic Answerなど）にメリットがあるのかもしれません。&lt;/p&gt;
&lt;p&gt;ざっくりですがセマンティック検索について調べてみました。
こんなデータだとどうなの？ここの考え方が間違ってるのでは？などの指摘がありましたら、コメント欄またはTwitter（&lt;a href=&#34;https://twitter.com/johtani&#34;&gt;@johtani&lt;/a&gt;）でコメントを頂けたらと。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Lunakey Miniを組み立てて、BLE&#43;LPME-IO化してみた #DIYキーボード</title>
      <link>https://blog.johtani.info/blog/2021/04/30/build-lunakey-mini-ble/</link>
      <pubDate>Fri, 30 Apr 2021 00:26:12 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2021/04/30/build-lunakey-mini-ble/</guid>
      <description>&lt;p&gt;Sofle v2を長らく使っていましたが、コンパクトなのもやっぱりいいよなぁというときにKochi KeyboardからLunakey Miniが発売していました。
小指のあたりの傾斜が使いやすいかも？ということで、組み立ててみました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Sofle v2を長らく使っていましたが、コンパクトなのもやっぱりいいよなぁというときにKochi KeyboardからLunakey Miniが発売していました。
小指のあたりの傾斜が使いやすいかも？ということで、組み立ててみました。&lt;/p&gt;
&lt;p&gt;もちろん購入は&lt;a href=&#34;https://kochikeyboard.stores.jp/&#34;&gt;Kochi Keyboardさん&lt;/a&gt;からです（&lt;a href=&#34;https://kochikeyboard.stores.jp/items/605ab0a6baeb3a0ff29252a2&#34;&gt;購入はこちらから&lt;/a&gt;）。&lt;/p&gt;
&lt;h2 id=&#34;lunakey-miniビルドガイド&#34;&gt;Lunakey Miniビルドガイド&lt;/h2&gt;
&lt;p&gt;作者の&lt;a href=&#34;https://twitter.com/yoichiro&#34;&gt;Yoichiroさん&lt;/a&gt;が公開しているビルドガイドが詳細まで書かれています。
こちらをまずは参照してください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.eisbahn.jp/yoichiro/2020/12/lunakey_mini_build_guide_rev4.html&#34;&gt;Lunakey Mini ビルドガイド (Rev.4以降)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;ビルドログ主にツイート&#34;&gt;ビルドログ（主にツイート）&lt;/h2&gt;
&lt;p&gt;私の組み立てについては、Twitterでツイートしていたものがありますので、そちらを貼っておきます。
ちなみに、ツイートしていて躓いているときに、作者のYoichiroさんからたびたびコメントをいただきました。
ありがとうございました！！&lt;/p&gt;
&lt;p&gt;間にいくつかコメントを差し込んでいます。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;結局両方のダイオードつけてしまいました。今日はここまで &lt;a href=&#34;https://t.co/3qLI6EpfXB&#34;&gt;pic.twitter.com/3qLI6EpfXB&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1381616549715304448?ref_src=twsrc%5Etfw&#34;&gt;April 12, 2021&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;ハンダはつけた &lt;a href=&#34;https://t.co/ySE9SA3gZn&#34;&gt;pic.twitter.com/ySE9SA3gZn&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1381981178832379907?ref_src=twsrc%5Etfw&#34;&gt;April 13, 2021&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;h3 id=&#34;コンスルー問題&#34;&gt;コンスルー問題&lt;/h3&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;左手じゃん、T。Tのダイオード浮いてた。右手も一回全部見直すか&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1381991175750488067?ref_src=twsrc%5Etfw&#34;&gt;April 13, 2021&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;ここで問題が発覚。右手（ツイートではぼけていて、左手と書いています）についてはダイオードが1か所浮いていただけなので、はんだ付けですぐ直りました。
左手側が大問題です。そもそも右手につけたProMicroへの書き込みができませんでした。
キーボードによっては、ダイオードなどを付ける前からまず、リセットボタンを付けて、ProMicroを指して書き込みをする場合もあります。
ただ、その書き込みができない。
（ちなみにこのタイミングでテスターをつけっぱなしにしていたのが発覚し、9V電池切れのため翌日に持ち越した。。。）&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;さて、デバッグのお時間です &lt;a href=&#34;https://t.co/CaEOv4E5Bg&#34;&gt;pic.twitter.com/CaEOv4E5Bg&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1382330968539684872?ref_src=twsrc%5Etfw&#34;&gt;April 14, 2021&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;ただ、ProMicro刺した状態で、リセットボタン、リセットボタンの足をショートさせても書き込みはできず、ProMicroのGndとResetの足のショートでは書き込みができる。&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1382335579417759748?ref_src=twsrc%5Etfw&#34;&gt;April 14, 2021&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;テスターで調べてみたところ、リセットボタンとProMicroがうまく通電していません。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;だいぶ進んだけど、Eの列がおかしいなぁ。さて、どこの接触だ？ &lt;a href=&#34;https://t.co/5tci12Vk05&#34;&gt;pic.twitter.com/5tci12Vk05&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1382358367188914179?ref_src=twsrc%5Etfw&#34;&gt;April 14, 2021&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;どうも、左手の基盤のProMicroの足の穴がコンスルーとの接触が悪いみたいでした。
コンスルーの足を無理やりまげて（3個のコンスルーの足を折りました。。。）、通電できるようにして解決（結局あとでいくつかの足についてははんだ付けしました）。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;終わった。LEDの予備はんだまでやってからおしまいにしよ&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1383082534288859137?ref_src=twsrc%5Etfw&#34;&gt;April 16, 2021&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;h3 id=&#34;led実装&#34;&gt;LED実装&lt;/h3&gt;
&lt;p&gt;鬼門の表面実装ですが、LEDを1個破損するだけで乗り切りました。ちょっと色はおかしかったですが、これはおそらくProMicroの足のせい。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;一個逆につけてしまい、お亡くなりになりましたが、まぁ、良いかな。まずは右手 &lt;a href=&#34;https://t.co/zldu6fRsXR&#34;&gt;pic.twitter.com/zldu6fRsXR&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1383788595111100443?ref_src=twsrc%5Etfw&#34;&gt;April 18, 2021&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;h3 id=&#34;ソケットの実装x2&#34;&gt;ソケットの実装x2&lt;/h3&gt;
&lt;p&gt;ロープロファイル（Kailh choc v1）のキースイッチも試してみたいので、MXと両方のソケットをはんだ付けしました。
両方利用できるのは便利ですね。はんだ付けも楽しいし。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;ソケットを片手だけ(両方のソケットつけるのでまだ、1/4) &lt;a href=&#34;https://t.co/7XFRDx0D0I&#34;&gt;pic.twitter.com/7XFRDx0D0I&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1383801006593478665?ref_src=twsrc%5Etfw&#34;&gt;April 18, 2021&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;h3 id=&#34;キースイッチ設置&#34;&gt;キースイッチ設置&lt;/h3&gt;
&lt;p&gt;親指以外には&lt;a href=&#34;https://kochikeyboard.stores.jp/items/6008cdf1bbb6833001e9711b&#34;&gt;Kailh Box Silentのピンク軸（Kochi Keyboardから）&lt;/a&gt;、親指には&lt;a href=&#34;https://shop.yushakobo.jp/products/input-club-hako-switches?variant=37665677639841&#34;&gt;Kailh Input Club Hako Violet（AliExpressで購入したもの。リンクは遊舎工房のもの）&lt;/a&gt;をつけました。
どちらもそれほどぶれもないものです。Silent ピンクはリニアで静かでそれほど力がいらないスイッチになっています。
親指はタクタイルで小気味のいい音が気に入っています。Sofleもこのキースイッチになってます。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;残りのソケットつけて、キースイッチも設置して、動確してボトムプレートも装着。残りはキーキャップ。 &lt;a href=&#34;https://t.co/hGc1TtI6fu&#34;&gt;pic.twitter.com/hGc1TtI6fu&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1386322961854996483?ref_src=twsrc%5Etfw&#34;&gt;April 25, 2021&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;h3 id=&#34;キーキャップキーマップ&#34;&gt;キーキャップ＋キーマップ&lt;/h3&gt;
&lt;p&gt;お試しにXDAのキーキャップをはめてみたのですが、キーの境目がわかりにくく、タイプミスが多かったです。
その後のツイートにあるようにOEMに切り替えています。&lt;/p&gt;
&lt;p&gt;キーマップについては、Lunakey Miniの作者のYoichiroさんが作った&lt;a href=&#34;https://remap-keys.app/&#34;&gt;Remap&lt;/a&gt;というブラウザベースでキーマップの書き換えができるツールで楽々変更ができました。JISキーまで対応しているのでJISベースでキーマップを作成している私にはうってつけでした。
&lt;a href=&#34;https://salicylic-acid3.hatenablog.com/entry/remap-manual&#34;&gt;Remapの利用方法についてはサリチル酸さんのブログ&lt;/a&gt;が詳しく書いてあります（本当に頭が下がります）。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;Remap使ってキーマップいじったら、すごく楽だった。&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1386472185535991809?ref_src=twsrc%5Etfw&#34;&gt;April 26, 2021&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;h3 id=&#34;ble--lpme-io化&#34;&gt;BLE + LPME-IO化&lt;/h3&gt;
&lt;p&gt;ここまでで、USB接続で動作はしていたのですが、Sofle同様に3台をBluetoothで切り替えながら使いたかったので、
Corne Light v2につけていたBLE+LPME-IO(&lt;a href=&#34;https://blog.johtani.info/blog/2021/01/11/apply-ble-and-lpme-to-corne/&#34;&gt;Corneの実装などは前のブログを参照&lt;/a&gt;)を抜き取って、Lunakey Miniに移植してみました。&lt;/p&gt;
&lt;p&gt;BLE ProMicro化は&lt;a href=&#34;https://www.eisbahn.jp/yoichiro/2021/03/lunakey_mini_ble.html&#34;&gt;作者の方のブログ&lt;/a&gt;で行われていたので、LPME-IO対応も何とかなるだろうと。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;BLE+LPMEに変えた。後でブログ書こう &lt;a href=&#34;https://t.co/mGePN52v6k&#34;&gt;pic.twitter.com/mGePN52v6k&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1387563117979201538?ref_src=twsrc%5Etfw&#34;&gt;April 29, 2021&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;LPME-IOへの対応はCorneとSofleの時に行なったこともあり、なんとなくあたりがついていました。
流れとしては、以下の通りです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;BLE Micro Pro用の設定ファイルを作成
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://sekigon-gonnoc.github.io/BLE-Micro-Pro/#/edit_config_file?id=qmk%e7%94%a8%e3%81%ae%e8%a8%ad%e5%ae%9a%e3%81%8b%e3%82%89%e5%a4%89%e6%8f%9b%e3%81%99%e3%82%8b&#34;&gt;BLE Micro Proのサイトの「キーボードの設定ファイルを編集する」のコマンドでコンフィグファイルを生成&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LPME-IOのジャンパをはんだでブリッジ
&lt;ul&gt;
&lt;li&gt;1.で生成したコンフィグから、Corne Lightと同じ個所のジャンプをすれば良いとわかったので今回はスキップ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TRRSのI2C対応
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2021/01/11/apply-ble-and-lpme-to-corne/#lpme-io%E5%AF%BE%E5%BF%9C&#34;&gt;Corne LightのLPME-IO対応の時と同様にSDAとSCLをTRRSの足にショートカット&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ただ、今回右手側は、下記ツイートのようにOLEDの足からTRRSの足にショートカットしました。Corneの基盤を見ていた時にこれでも行けそうだな？と思っていたので、試してみた次第です。ちなみに、左手はCorneの時と同じPro Microから長い銅線を引っ張っています（電池基盤があったので、外すのがめんどくさかったため）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;BLE Micro Proにファームウェア書き込み
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://sekigon-gonnoc.github.io/BLE-Micro-Pro/#/getting_started?id=ble-micro-pro-wqeb-configurator%E3%82%92%E4%BD%BF%E3%81%86&#34;&gt;BLE Micro Proのサイトの手順&lt;/a&gt;に従います。&lt;/li&gt;
&lt;li&gt;設定ファイルには1.で出力されているLPME用のファイルを使用。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;といった感じです。キーマップが設定されていないので、Remapで設定しなおしました。
Remapは、キーマップをPDFで出力する機能までついていて、すごくいいですね。サイコー&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;あと、足。 &lt;a href=&#34;https://t.co/W0Wpf5k5SE&#34;&gt;pic.twitter.com/W0Wpf5k5SE&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1387795946784714760?ref_src=twsrc%5Etfw&#34;&gt;April 29, 2021&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;傾斜がつくように奥側に高さを出すためのゴム足を貼り付けました。
あとは、3台のPCにBluetoothで接続すれば終了です。
（AD_WO_Lのキーを利用して追加していくのを毎回忘れる。。。）&lt;/p&gt;
&lt;h3 id=&#34;疑問点&#34;&gt;疑問点&lt;/h3&gt;
&lt;p&gt;ちょっとだけ疑問点がありますが、時間があればそのうち調べるかな。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Remapはクラウドに設定ファイルをセーブできるけど、json形式で手元にダウンロードしたりはできないのかなぁ？&lt;/li&gt;
&lt;li&gt;LEDは有線じゃないと点かないみたいだけど、音はどうなんだろう？
&lt;ul&gt;
&lt;li&gt;音が出せそうなら、Bluetoothの接続切り替えするときに音の出方を変えるとかをやってみたいなぁ。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、Lunakey Miniを組み立てて、BLE+LPME-IO対応してみました。
はんだ付けはだいぶ慣れてきましたし、今回もトラブルがあったおかげでテスターを利用して、どのあたりがおかしいかという調査をするのも慣れてきました。
あとは、キーの配置の違いを体感して、どれが自分に合ってるかなぁ？というのを試したり仕様と思います。
ロープロファイルも試してみようかな。&lt;/p&gt;
&lt;p&gt;あ。もちろん、このブログは組み立ててBluetoothで接続したLunakey Mini Rev5、Kailh Box Silentピンク軸＋Input Club Hako Violetで書きました！！久々に数字列がないので記号入力とかがちょっとバタバタしましたｗ&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>スライド作成の環境をMarpにしてみた</title>
      <link>https://blog.johtani.info/blog/2021/04/05/intro-marp/</link>
      <pubDate>Mon, 05 Apr 2021 18:45:11 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2021/04/05/intro-marp/</guid>
      <description>&lt;p&gt;みなさんは、スライドの作成には何を使っていますか？
Keynote？Powerpoint？Google Slides？&lt;/p&gt;
&lt;p&gt;私は、Macでスライドを作るときは前職ではテンプレートもあったのでKeynoteでしたが、ちょっとしたものはMarkdownベースの&lt;a href=&#34;https://www.deckset.com/&#34;&gt;Deckset&lt;/a&gt;を利用していました（買い切りタイプの有料ソフト）。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;みなさんは、スライドの作成には何を使っていますか？
Keynote？Powerpoint？Google Slides？&lt;/p&gt;
&lt;p&gt;私は、Macでスライドを作るときは前職ではテンプレートもあったのでKeynoteでしたが、ちょっとしたものはMarkdownベースの&lt;a href=&#34;https://www.deckset.com/&#34;&gt;Deckset&lt;/a&gt;を利用していました（買い切りタイプの有料ソフト）。&lt;/p&gt;
&lt;p&gt;フリーランスになってもこちらを利用していたのですが、Windows環境に切り替えたので使えなくなってしまいました。
一度はGoogle Slidesで作ったのですが（&lt;a href=&#34;https://noti.st/events/AhSY43/39-elasticsearch-2020-12-17-elasticsearchjp&#34;&gt;第39回Es勉強会スライド&lt;/a&gt;）、既存の資産を流用したくなりどうしたものかと悩んでい(ツイートし)たら。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;Macの頃はDecksetってアプリでMarkdownで書いてたんだけど、Winに移動したのでこのタイミングでGoogle Slidesにでもしようかなと考えてるところ。Markdownでスライド作るのほかになんかあるか探すほうがいいかなぁ？&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1372412249357225986?ref_src=twsrc%5Etfw&#34;&gt;March 18, 2021&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;僕はこれ使ってます&lt;a href=&#34;https://t.co/sFaAmKZY6V&#34;&gt;https://t.co/sFaAmKZY6V&lt;/a&gt;&lt;/p&gt;&amp;mdash; miyake / ZEN (@kazuyukimiyake) &lt;a href=&#34;https://x.com/kazuyukimiyake/status/1372527588552273920?ref_src=twsrc%5Etfw&#34;&gt;March 18, 2021&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;ということで、利用してみようかなとなりました。&lt;/p&gt;
&lt;h2 id=&#34;marpとは&#34;&gt;Marpとは？&lt;/h2&gt;
&lt;p&gt;Markdownでプレゼンテーションのスライドを作ることができるOSS?になります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://marp.app/&#34;&gt;Marp公式サイト&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;といっても、これ自体を使わなくても、VS Code上でプレビューしたりHTML形式で動作するスライドを吐き出すことが可能です。
なので、VS Code用のプラグインを利用しています。&lt;/p&gt;
&lt;h3 id=&#34;サンプル&#34;&gt;サンプル&lt;/h3&gt;
&lt;p&gt;この間利用したスライドはこんな感じのMarkdownになってます。
&lt;code&gt;---&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-markdown&#34; data-lang=&#34;markdown&#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;marp: true
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;theme: poster
&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;&amp;lt;!-- _class: big-center --&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# 本当にその検索は&amp;lt;br/&amp;gt;自分が想像している検索に&amp;lt;br/&amp;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;&amp;lt;br/&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;br/&amp;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;
&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;&amp;gt; &lt;/span&gt;&lt;span style=&#34;font-style:italic&#34;&gt;2021/03
&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;&amp;gt; &lt;/span&gt;&lt;span style=&#34;font-style:italic&#34;&gt;Jun Ohtani / @johtani
&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:#f92672&#34;&gt;bg right:40% 40%&lt;/span&gt;](&lt;span style=&#34;color:#a6e22e&#34;&gt;johtani_face.jpg&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&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;-&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;-&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;-&lt;/span&gt; Apache Solr入門(第2版まで)や
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;プレビューで見るとこんな感じです。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20210409/preview.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20210409/preview.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h2 id=&#34;プラグイン&#34;&gt;プラグイン&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=marp-team.marp-vscode&#34;&gt;Marp for VS Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;プラグインをインストールするのも簡単ですよね。
マーケットプレイスからインストールすれば完了です。&lt;/p&gt;
&lt;p&gt;機能については上記のページにあるように、プレビューとスライドの出力です。
プレビューでは、Markdownのプレビューみたいな形で、スライドが表示できます。&lt;/p&gt;
&lt;p&gt;先日この機能を利用して作成して、HTMLで出力して利用しました。
PDFとかPPTX出も出せるようなので、今後試してみようかなと。&lt;/p&gt;
&lt;h2 id=&#34;decksetのスライドとの違い&#34;&gt;Decksetのスライドとの違い&lt;/h2&gt;
&lt;p&gt;ページの区切りなども同じだったので、大筋ではそれほど違いはありませんでした。
ただ、画像周りとスタイルの設定は細かく修正をしました。&lt;/p&gt;
&lt;p&gt;変更した点としては、以下のようなものがあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ヘッダ部分の変更
&lt;ul&gt;
&lt;li&gt;上のサンプルにありますが、&lt;code&gt;marp: true&lt;/code&gt;を含む部分がMarp独自の記述です。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ページごとのちょっとした変更
&lt;ul&gt;
&lt;li&gt;ページごとにスタイルの変更ができるみたいで（Decksetではできなかったはず？）、タイトルページのスタイルを変えてあります。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;画像の指定
&lt;ul&gt;
&lt;li&gt;画像の読み込み自体は違いはないのですが、画像の配置についての指定方法は&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;カスタムテーマ用CSSの作成
&lt;ul&gt;
&lt;li&gt;デフォルトではなく、Decksetで用意されているような感じのスタイルに変更してみてます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;カスタムテーマはCSSで設定できるので、CSSファイルを用意して、VS Codeの拡張機能の設定からファイルパスを指定する形です。&lt;/p&gt;
&lt;p&gt;ということで、当面はMarpでスライドを作っていくことになるかと思います。
まぁ、ただ、スライドを作るいこと自体が減ってきてはいるのですが。
ほかの配色を試したり、ヘッダフッタとかも試してみるのもいいかもな。&lt;/p&gt;
&lt;p&gt;気が向いたら、CSSをどこかにアップロードするかもです。&lt;/p&gt;
&lt;p&gt;※今回のブログはGateronサイレントクリア軸をルブしてみた、Corne Light v2で最後の数行を書いてみました。
キースイッチだけだとこすれる音が減った気がしてましたが、キーキャップを付けたら少しこすれる音が気になる感じです。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>検索技術に関する情報交換を目的としたSlackができました！</title>
      <link>https://blog.johtani.info/blog/2021/03/31/search-tech-jp-slack/</link>
      <pubDate>Wed, 31 Mar 2021 23:28:14 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2021/03/31/search-tech-jp-slack/</guid>
      <description>&lt;p&gt;新型コロナウィルスの影響もあり、オフラインで集まって勉強会も開催できなくなっています。
検索技術勉強会も、もう1年以上開催できていないです。&lt;/p&gt;
&lt;p&gt;スピーカーの人にオンラインでしゃべってもらうのもありだとは思うのですが、
懇親会とセットでその価値があったかもなぁと思うところもあり、オンラインでの開催に乗り気になれないまま時間がたってしまいました。
(配信周りを調べるのがめんどくさいなぁというのもあったかも（反省）)&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;新型コロナウィルスの影響もあり、オフラインで集まって勉強会も開催できなくなっています。
検索技術勉強会も、もう1年以上開催できていないです。&lt;/p&gt;
&lt;p&gt;スピーカーの人にオンラインでしゃべってもらうのもありだとは思うのですが、
懇親会とセットでその価値があったかもなぁと思うところもあり、オンラインでの開催に乗り気になれないまま時間がたってしまいました。
(配信周りを調べるのがめんどくさいなぁというのもあったかも（反省）)&lt;/p&gt;
&lt;p&gt;そんな中、&lt;a href=&#34;https://twitter.com/takuya_b/&#34;&gt;takuya-a&lt;/a&gt;さんと話をしていて、エンジニア同士のゆるいつながりができる場所が欲しいですねぇということに。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;はー、検索技術勉強会、オフラインでできないまま１年以上たってしまったのか。オンライン勉強会とかはスピーカーの人の負担とかもあるし、Discordみたいなオープンな場だけ用意してみるのありかなぁ？ただ、活発に話がされるのかどうかわからんし、ROMな人ばかりだとアレなんだけどなぁ。&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1376806794480164868?ref_src=twsrc%5Etfw&#34;&gt;March 30, 2021&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;そこからの、このツイートです。
ちらほらと興味のありそうな人が出てきたねという話をしていたら、Slackのワークスペースが出来上がってましたｗ&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;検索技術に関する情報交換を目的とした Slack を立ち上げました！こちらの招待リンクからご参加ください。 &lt;a href=&#34;https://t.co/Tca70vuMff&#34;&gt;https://t.co/Tca70vuMff&lt;/a&gt;&lt;/p&gt;&amp;mdash; takuya-a (@takuya_b) &lt;a href=&#34;https://x.com/takuya_b/status/1377219737457860610?ref_src=twsrc%5Etfw&#34;&gt;March 31, 2021&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;ありがとう、&lt;a href=&#34;https://twitter.com/takuya_b/&#34;&gt;takuya-a&lt;/a&gt;さん！&lt;/p&gt;
&lt;p&gt;ということで、検索周りでわいわいできる場になればいいなぁと。
盛り上がってくれば、オンラインでの勉強会とかもありかもしれないですね！
興味のある方は、上記ツイート内のリンクからご参加下さい！！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>OData式と日本語の検索(NGram)とフレーズ検索</title>
      <link>https://blog.johtani.info/blog/2021/03/03/phrase-query-in-japanese/</link>
      <pubDate>Wed, 03 Mar 2021 16:23:33 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2021/03/03/phrase-query-in-japanese/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/query-odata-filter-orderby-syntax&#34;&gt;Azure Cognitive SearchにはOData式&lt;/a&gt;という書式で条件が書ける仕組みがあります。
ODataは検索条件（&lt;code&gt;$filter&lt;/code&gt;）やソート条件（&lt;code&gt;$orderby&lt;/code&gt;）、取得する項目名の指定（&lt;code&gt;$select&lt;/code&gt;）です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/query-odata-filter-orderby-syntax&#34;&gt;Azure Cognitive SearchにはOData式&lt;/a&gt;という書式で条件が書ける仕組みがあります。
ODataは検索条件（&lt;code&gt;$filter&lt;/code&gt;）やソート条件（&lt;code&gt;$orderby&lt;/code&gt;）、取得する項目名の指定（&lt;code&gt;$select&lt;/code&gt;）です。&lt;/p&gt;
&lt;p&gt;私は、Luceneの構文に慣れているので、&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/search-query-overview&#34;&gt;普通の&lt;code&gt;search&lt;/code&gt;パラメータ&lt;/a&gt;を利用しようとします。
が、OData式として特殊な書き方がいくつかあるようなのでこちらの利用方法も調べてみました。
その時、N-Gram（よくやるのはN=2）で陥る問題の話もあるのでこちらについても言及します。&lt;/p&gt;
&lt;h2 id=&#34;odata式で検索&#34;&gt;OData式で検索&lt;/h2&gt;
&lt;p&gt;次のような3件のドキュメント(フィールド名は&lt;code&gt;body&lt;/code&gt;とします)をN-Gramで登録していたとします。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;ミルクティを飲みたいです。&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;マティーニはカクテルですが、ミルクセーキは？&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;風呂上がりのミルクは最高です。&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;この時、OData式で&lt;code&gt;ミルクティ&lt;/code&gt;という単語で検索してみましょう。&lt;/p&gt;
&lt;p&gt;検索条件は&lt;code&gt;$filter&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;$filter&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;search&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ismatchscoring&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ミルクティ&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;こんな感じ。フィールドの指定がない場合、対象のフィールドは検索可能なフィールドすべてが検索対象になります（&lt;a href=&#34;https://docs.microsoft.com/ja-jp/rest/api/searchservice/search-documents#query-parameters&#34;&gt;公式ガイドのクエリパラメータ&lt;/a&gt;の&lt;code&gt;queryType&lt;/code&gt;に説明あり）。&lt;/p&gt;
&lt;p&gt;では、実行してみましょう。で返ってくるのは？1だけかな？と思う人が多いかもしれません。
が、結果は3件とも帰ってきます。&lt;/p&gt;
&lt;h2 id=&#34;問題点は&#34;&gt;問題点は？&lt;/h2&gt;
&lt;p&gt;では問題点はどこでしょう？
&lt;code&gt;ismatchscoring&lt;/code&gt;のオプションなどを見る前に、転置インデックスを用いた検索エンジンの挙動をおさらいしましょう。
転置インデックスの仕組みを理解することで、なぜそんな挙動になるのか？というのがわかりやすくなります。
おさらいにはElasticsearchをベースに話をしますが、Azure Cognitive Searchでも同じような挙動になります。&lt;/p&gt;
&lt;h3 id=&#34;転置インデックスとトークナイザーアナライザーの関係おさらい&#34;&gt;転置インデックスとトークナイザー（アナライザー）の関係（おさらい）&lt;/h3&gt;
&lt;p&gt;昨年、オンラインで開催されたOSC広島で発表した資料（録画あり）でもざっくりと説明しています。&lt;/p&gt;
&lt;p data-notist=&#34;johtani/KO04wZ&#34;&gt;View &lt;a href=&#34;https://noti.st/johtani/KO04wZ&#34;&gt;本当にその検索は自分が想像している検索になってますか？&lt;/a&gt; on Notist.&lt;/p&gt;&lt;script async src=&#34;https://on.notist.cloud/embed/002.js&#34;&gt;&lt;/script&gt;
&lt;p&gt;ざっくりですが、おさらいです。&lt;/p&gt;
&lt;p&gt;検索エンジンでは、入力された文章を、ある規則（アナライザー）で単語に分割し、その単語ごとにどのドキュメントに出現したのか？というリストが作られます。
このリストが転置インデックスです。書籍の後ろにある索引を想像するとどんなものかがわかりやすいです。
単語に対してその単語が出てくるページ番号がわかるという仕組みです（下図は本の索引の一例）。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://on.notist.cloud/slides/deck5730/large-21.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://on.notist.cloud/slides/deck5730/large-21.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;書籍の索引は著者や編集の方により厳選された単語のみが採用されています。
が、検索エンジンでは文章を単語に区切る機能が存在します。
この「ある規則」で単語を区切る仕組みが「アナライザー（トークナイザー）」と呼ばれる機能です。
例えば英語用のアナライザーに英語の文章が入力されたとき、文章はこのように単語に区切られたもの（単語列）を出力します（下図）。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://on.notist.cloud/slides/deck5730/large-24.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://on.notist.cloud/slides/deck5730/large-24.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;今回はNGramの話なので、NGramのAnalyzerを利用してみるとこんな感じになります。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://on.notist.cloud/slides/deck5730/large-43.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://on.notist.cloud/slides/deck5730/large-43.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;実際に出来上がる転置インデックスは次のような形になります。


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://on.notist.cloud/slides/deck5730/large-44.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://on.notist.cloud/slides/deck5730/large-44.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h3 id=&#34;検索の仕組みおさらい&#34;&gt;検索の仕組み（おさらい）&lt;/h3&gt;
&lt;p&gt;出来上がっている転置インデックスに対して検索をする場合、入力文字列（検索条件）に対して、転置インデックス作成時と同様にAnalyzerが動作します。
処理としては、&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;クエリのパース&lt;/li&gt;
&lt;li&gt;フィールドのAnalyzerで処理&lt;/li&gt;
&lt;li&gt;転置インデックスを検索&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;という形です。
例えばこんな感じ。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://on.notist.cloud/slides/deck5730/large-45.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://on.notist.cloud/slides/deck5730/large-45.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;同じAnalyzerの処理が入ることで、転置インデックスに採用されているのと同じ単語が出てくるため、検索がきちんとできるということになります。&lt;/p&gt;
&lt;h3 id=&#34;英語と日本語ngramの違い&#34;&gt;英語と日本語（NGram）の違い&lt;/h3&gt;
&lt;p&gt;英語と日本語の違いは、スペースの意味になります。
英語の場合は、スペースが単語の区切りになりますが、日本語の場合スペースでは区切られていません。&lt;/p&gt;
&lt;p&gt;ですので、検索窓に入力された文字列は、英語の場合、クエリのパースの時点で単語に区切られます。そのあとにAnalyzerになるので、基本的には単語単位でAnalyzerの処理が動きます。そのあと、転置インデックスへの検索となります。なので、多くの場合はAnalyzerの出力は1単語です（類義語などを利用していたりする場合は異なりますが）。&lt;/p&gt;
&lt;p&gt;日本語の場合、スペースでは区切られていないので、クエリのパースの時点で入力された文字列がそのままAnalyzerにわたります。
今回はAnalyzer（NGram）が単語に分割し、それをもとに検索処理が実行されます。&lt;/p&gt;
&lt;h3 id=&#34;ismatchscoringの問題点はやっと帰ってきました&#34;&gt;ismatchscoringの問題点は？（やっと帰ってきました）&lt;/h3&gt;
&lt;p&gt;さて、回り道をし、簡単ですが転置インデックスやAnalyzerについて説明しました。
では本題です。&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;$filter&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;search&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ismatchscoring&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ミルクティ&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この&lt;code&gt;ismatchscoring&lt;/code&gt;関数ですが、そのほかにも引数の指定が可能で、省略した場合にデフォルトで採用される値がいくつかあります。
&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/search-query-odata-full-text-search-functions&#34;&gt;公式のドキュメントにパラメータの意味&lt;/a&gt;が掲載されています。&lt;/p&gt;
&lt;p&gt;今回は、第4引数の&lt;code&gt;searchMode&lt;/code&gt;の値が問題点です。デフォルトでは、&lt;code&gt;any&lt;/code&gt;が指定されます。
この、&lt;code&gt;any&lt;/code&gt;は検索語（今回は&lt;code&gt;ミルクティ&lt;/code&gt;）の&lt;strong&gt;任意の検索語句&lt;/strong&gt;が一致する必要があることになります。
「検索語句」？なんでしょう？これが、ここまで回り道をして説明してきた、Analyzerの出力した単語になります。
「ミルクティ」はNGram（N=2）のAnalyzerを通すと、&lt;/p&gt;
&lt;p&gt;「ミル」「ルク」「クテ」「ティ」&lt;/p&gt;
&lt;p&gt;という4つの単語が出力されます。
これが、「検索語句」です。「任意の」とあるので、上記4つの2文字のどれか？が出現すれば検索条件にヒットしたこととなります。&lt;/p&gt;
&lt;p&gt;ですので、以下のように（一部のみ色を変えてます）3つの文章にはそれぞれの文字が含まれているため、先ほどの条件では3件の結果が返ってくることになります。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;ミル&lt;/code&gt;クティを飲みたいです。&lt;/li&gt;
&lt;li&gt;マ&lt;code&gt;ティ&lt;/code&gt;ーニはカクテルですが、ミルクセーキは？&lt;/li&gt;
&lt;li&gt;風呂上がりの&lt;code&gt;ミル&lt;/code&gt;クは最高です。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;NGramで一部分の単語だけで一致したものがヒットしてしまうと違和感があるので、&lt;code&gt;all&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;$filter&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;search&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ismatchscoring&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ミルクティ&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;body&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;simple&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;all&amp;#39;&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;ol&gt;
&lt;li&gt;&lt;code&gt;ミルクティ&lt;/code&gt;を飲みたいです。&lt;/li&gt;
&lt;li&gt;マ&lt;code&gt;ティ&lt;/code&gt;ーニはカ&lt;code&gt;クテ&lt;/code&gt;ルですが、&lt;code&gt;ミルク&lt;/code&gt;セーキは？&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;先ほどよりもマシになりました。
3がヒットしなくなっています。3の文章には「ティ」などが出てこないためです。
ただ、感覚的に2番目がヒットするのは少し違和感がありますよね？
確かに4つの単語がすべて出てきていますが、「ミルクティ」とは少し遠いです。&lt;/p&gt;
&lt;p&gt;さらに「ミルクティ」にヒットさせるにはフレーズ検索にする必要があります。
&lt;a href=&#34;https://www.elastic.co/jp/blog/how-to-implement-japanese-full-text-search-in-elasticsearch&#34;&gt;Elastic社のブログの日本語の検索に関する記事&lt;/a&gt;でも出てきますが、フレーズで検索することで「ミルクティ」だけにヒットさせることができます。&lt;/p&gt;
&lt;p&gt;「フレーズ検索＝語順を保証する検索」となります。
ですので、&lt;/p&gt;
&lt;p&gt;「ミル」「ルク」「クテ」「ティ」&lt;/p&gt;
&lt;p&gt;この順序で出てきた場合のみ、検索にヒットしたことになります。
OData式でフレーズ検索する場合は、単語をダブルクォート&lt;code&gt;&amp;quot;&lt;/code&gt;でくくる必要があります（&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/search-query-odata-full-text-search-functions#examples&#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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;$filter&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;search&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ismatchscoring&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#34;ミルクティ&amp;#34;&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;body&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;simple&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;all&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで結果は以下の1件だけとなります。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;ミルクティ&lt;/code&gt;を飲みたいです。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;これでNGramで部分一致のような挙動で日本語の検索ができるようになりました。&lt;/p&gt;
&lt;p&gt;ちなみに、フレーズにした場合は第4引数は&lt;code&gt;any&lt;/code&gt;に変更しても1件だけの検索結果となります。
フレーズ検索には「すべての語が含まれる」、「すべての語が順番に現れる」という2つの条件が含まれるためです。&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;$filter&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;search&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ismatchscoring&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#34;ミルクティ&amp;#34;&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;body&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;simple&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;any&amp;#39;&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;を&lt;code&gt;&amp;quot;ミルク&amp;quot; &amp;quot;最高&amp;quot;&lt;/code&gt;のような検索条件に変えた場合、「&amp;ldquo;ミルク&amp;rdquo;」「&amp;ldquo;最高&amp;rdquo;」の2つの条件を&lt;code&gt;any&lt;/code&gt;で扱うため、
「&amp;ldquo;ミルク&amp;rdquo;」「&amp;ldquo;最高&amp;rdquo;」のどちらかが出てくれば良い結果となり、3件の結果が返ってきます。
第4引数を&lt;code&gt;all&lt;/code&gt;に変更すると、「&amp;ldquo;ミルク&amp;rdquo;」「&amp;ldquo;最高&amp;rdquo;」の両方が出てこなければならないため、3件目のデータのみが返ってきます。&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;$filter&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;search&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ismatchscoring&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#34;ミルクティ&amp;#34; &amp;#34;最高&amp;#34;&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;body&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;simple&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;all&amp;#39;&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;$filter&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;search&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ismatchscoring&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#34;ミルクティ&amp;#34;&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;body&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;simple&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;any&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#a6e22e&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;search&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ismatchscoring&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#34;最高&amp;#34;&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;body&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;simple&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;any&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;と同じ意味となります。
少し長くはなりますが、後者の書き方をプログラムで書くと思います、私の場合は。
検索窓に入力された単語に必ず&lt;code&gt;&amp;quot;&lt;/code&gt;を追加する処理を書くために、画面入力の文字列を一旦パースをすることになるからです。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;簡単？にですが、OData式でのフルテキスト検索と、NGramでのフレーズ検索について説明しました。
英語の場合、もともとスペースで区切られているので、フレーズといわれてピンときますが、日本語の場合はAnalyzerの挙動をわかっていないと「？」となるかと思います。
なぜフレーズ検索が必要なのか？というのが少しでもわかっていただければと。
ちなみに、NGramのTokenizerには別の落とし穴もありますが、その話はまた後日にでも。&lt;/p&gt;
&lt;p&gt;参考として日本語関連の検索に関する記事のリンクを残しておきます。&lt;/p&gt;
&lt;h2 id=&#34;参考&#34;&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://medium.com/hello-elasticsearch/elasticsearch-22a369387dc5&#34;&gt;Elasticsearch日本語でフレーズ検索が必要なわけ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;NGramも含め、Elasticsearchでの日本語の検索の設定やクエリについては、&lt;a href=&#34;https://www.elastic.co/jp/blog/how-to-implement-japanese-full-text-search-in-elasticsearch&#34;&gt;Elastic社のブログで日本語で書かれた記事&lt;/a&gt;が詳しいのでこちらをご覧いただくのがいいです。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>自宅の作業環境(2021/02)</title>
      <link>https://blog.johtani.info/blog/2021/02/25/update-working-facility/</link>
      <pubDate>Thu, 25 Feb 2021 18:43:02 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2021/02/25/update-working-facility/</guid>
      <description>&lt;p&gt;自宅の環境がいろいろと変わったのですが、書いていなかったので更新版です。
&lt;a href=&#34;https://blog.johtani.info/blog/2020/09/08/update-working-facility/&#34;&gt;前回のブログ(2020/09)&lt;/a&gt;、&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/26/working-facility/&#34;&gt;前々回のブログ(2020/03)&lt;/a&gt;はそれぞれリンクをたどってください。&lt;/p&gt;
&lt;p&gt;現状のデスクトップはこんな感じ&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20210225/desktop.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20210225/desktop.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h2 id=&#34;pc&#34;&gt;PC&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/12/31/diy-pc&#34;&gt;別のブログ&lt;/a&gt;にまとめましたが、Windowsメインに切り替えました。
ハードの話以外に、Windows OSに切り替えたときにいくつか入れたものもあります。
それは、&lt;a href=&#34;https://blog.johtani.info/blog/2020/10/18/restart-windows-no1/&#34;&gt;移行のブログ&lt;/a&gt;に少しだけ書いてあります。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;自宅の環境がいろいろと変わったのですが、書いていなかったので更新版です。
&lt;a href=&#34;https://blog.johtani.info/blog/2020/09/08/update-working-facility/&#34;&gt;前回のブログ(2020/09)&lt;/a&gt;、&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/26/working-facility/&#34;&gt;前々回のブログ(2020/03)&lt;/a&gt;はそれぞれリンクをたどってください。&lt;/p&gt;
&lt;p&gt;現状のデスクトップはこんな感じ&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20210225/desktop.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20210225/desktop.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h2 id=&#34;pc&#34;&gt;PC&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/12/31/diy-pc&#34;&gt;別のブログ&lt;/a&gt;にまとめましたが、Windowsメインに切り替えました。
ハードの話以外に、Windows OSに切り替えたときにいくつか入れたものもあります。
それは、&lt;a href=&#34;https://blog.johtani.info/blog/2020/10/18/restart-windows-no1/&#34;&gt;移行のブログ&lt;/a&gt;に少しだけ書いてあります。&lt;/p&gt;
&lt;p&gt;ひさびさにWindowsに戻ってきていますが、だいぶ慣れました。
まぁ、それほど大したことをやってないというのもあるかもですが。。。&lt;/p&gt;
&lt;p&gt;メインPC以外にこれまでのmacをブラウジング用にサブディスプレイにつなぎ、マウスをLogicool Flowで行き来できるようにし、
キーボードはKVMスイッチで切り替えてやりくりしていました（最新環境はキーボードのところを参照してください）。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B0843QRVFH/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41CzU4rGeSL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B0843QRVFH/?tag=johtani-22&#34;&gt;
      Amazon | サンワダイレクト USB切替器 キーボード・マウス用 KVMスイッチ
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;キーボード&#34;&gt;キーボード&lt;/h2&gt;
&lt;p&gt;いくつかDIYしましたが、今はメインでSofle Keyboard v2を利用しています（&lt;a href=&#34;https://kochikeyboard.stores.jp/items/5fcb8040df5159606b8c5d74&#34;&gt;Kochi Keyboardさんで購入できます&lt;/a&gt;）&lt;/p&gt;
&lt;p&gt;Sofle keyboard v2を有線で使っていましたが、最近Bluetooth対応して無線化しました（&lt;a href=&#34;https://blog.johtani.info/blog/2021/02/01/apply-ble-to-sofle/&#34;&gt;その時のブログはこちら&lt;/a&gt;）。
ですので、PCとの接続の切り替えはキーボード上で特定のキーの組み合わせを押すことで、切り替えられるようになっています。
KVMとは異なり、Bluetoothの接続が切り替わるのにタイムラグがある＋どこにつながっているのか？というのがわからないので、想定していないところでキーが入力されていることがあります。
これは、何とかしたいかもなぁと考えてはいるところ。&lt;/p&gt;
&lt;h2 id=&#34;マイクオーディオインターフェース&#34;&gt;マイク＆オーディオインターフェース&lt;/h2&gt;
&lt;p&gt;基本的に自宅でリモート作業をしています（ありがとうございます）。
なので、ミーティングもオンラインです。
となるとやはり、音がいいほうがお客さんにも喜ばれるかなぁと。
&lt;a href=&#34;https://blog.johtani.info//blog/2020/03/26/working-facility/#%E3%83%9E%E3%82%A4%E3%82%AF&#34;&gt;2020年3月時点ではSAMSONのGoMicを利用していました&lt;/a&gt;。
これもいい音なのですが、大きいマイクでもいいかなと。
あとは、ほかの使い道もあるかも？ということで、オーディオテクニカのマイク（＋ポップガード）とフォーカスライトのオーディオインターフェースに変えてみました。
自分は実感ないですが、きっと役に立っていると思いますｗ&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B001DTNKNG/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41hTVDmUCBL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B001DTNKNG/?tag=johtani-22&#34;&gt;
      Amazon | audio-technica サイドアドレス コンデンサーマイクロホン AT2050 | コンデンサ | 楽器
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B01HNLSG9U/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41FXvIvjguL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B01HNLSG9U/?tag=johtani-22&#34;&gt;
      Amazon | AUDIO-TECHNICA AT-PF2 ポップフィルター | マイクアクセサリ | 楽器
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07VMCYKNZ/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41tYB56YxnL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07VMCYKNZ/?tag=johtani-22&#34;&gt;
      Amazon | Focusrite フォーカスライト オーディオインターフェイス 2イン/2アウト 24bit/192kHz Scarlett Solo (3rd Gen) ステッカー付きセット 【国内正規品】 | 楽器・音響機器 | 楽器
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h2 id=&#34;ディスプレイ&#34;&gt;ディスプレイ&lt;/h2&gt;
&lt;p&gt;以前は、MacBookProの16インチで、メインディスプレイの下に2枚目のディスプレイも兼ねて開いて利用していました（&lt;a href=&#34;https://blog.johtani.info/blog/2020/09/08/update-working-facility/&#34;&gt;前回のブログ参照&lt;/a&gt;）。
自作PCに切り替えたので、ディスプレイがなくなってしまうので、同じような大きさのモバイルモニターを利用しています。
今のところは据え置きになっていますが、持ち運べるので、ほかの部屋や外出時にも使えるんではないかなと。
ディスプレイの足などはないので、邪魔にもならず便利ですね。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07SCZ5STT/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41UpZvuPf6L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07SCZ5STT/?tag=johtani-22&#34;&gt;
      Amazon | モバイルモニター モバイルディスプレイ 4K 15.6インチ cocoparスイッチ用モニター 非光沢IPSパネル 薄い 軽量HDRモード/FreeSync対応/ブルーライト機能 3840x2160 UHD/USB Type-C/標準HDMI/mini DP/カバー付3年保証付 | cocopar | ディスプレイ 通販
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;音楽再生環境&#34;&gt;音楽再生環境&lt;/h2&gt;
&lt;p&gt;サブディスプレイにサンダーボルトディスプレイを使用していたので、Mac Miniを接続していましたがサンダーボルトディスプレイには退役してもらいました。
それに伴って、Mac Miniも別の場所に移動しました。音楽再生環境にラズパイ４を復活させました。
以前購入したセットについていたケースではファンの音が気になっていたので、ヒートシンク型に変えました。
結構重いですが、冷えてそうです。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07VD568FB/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41nHZBldhVL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07VD568FB/?tag=johtani-22&#34;&gt;
      Amazon | Geekworm Raspberry Pi(ラズベリーパイ) 4 B 用アーマー金属ケース パッシブ冷却/シェル熱放散 ラズベリーパイ4 コンピュ ータモデルB適用 (アーマーケース（ファン無し）) | Geekworm | 冷却パーツ・ファン 通販
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;webカメラ&#34;&gt;Webカメラ&lt;/h2&gt;
&lt;p&gt;カメラ自体に変更はないですが、付属品をいくつか。
Webカメラではないカメラもつけてみたいなと思い、モニターアームにカメラを付けられるものを付けてみました。
ただ、おっさんの顔をきれいに映してもなぁという結論に至ったので、Webカメラが乗っかっています。。。
あとは、デスクトップPCになり、カメラのケーブルだけではPCまで届かなくなってしまったのでUSB Type-Cの延長コードを買ってみました。実はこれ2本目ですが。。。
スタンディングデスクの昇降でケーブルに負荷がかかってしまったことがなんどかあり、1本目の延長コードは接触が悪くなってしまいました。。。時々外したりしていて、ケーブルの配置がおかしいときがあるので、気を付けるようにしています。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B08BC1P692/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/318S9mZQVML._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B08BC1P692/?tag=johtani-22&#34;&gt;
      Amazon | 長尾製作所 モニターアーム用 VESA カメラ＆マイクマウント NB-MV001MH | 長尾製作所 | モニタアーム&amp;amp;スタンド 通販
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B089GPPKRP/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41TLI94rFRL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B089GPPKRP/?tag=johtani-22&#34;&gt;
      Amazon | iVANKY USB Type C 延長ケーブル USB 3.1 Gen 2(4K@60Hz/1.0m/オス－メス)10Gbps高速データ転送 3A急速充電 usb-c 変換 Huawei MateBook13, iPad Pro11, Nintendo Switch, MacBook等対応 | IVANKY | USBケーブル 通販
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;照明&#34;&gt;照明&lt;/h2&gt;
&lt;p&gt;裸の蛍光管だったのですが、リモコンで点灯したり、照度を変えられるようにしたかったので、
パナソニックの照明に変えました。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07H2LFFR3/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/210ARbCJZML._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07H2LFFR3/?tag=johtani-22&#34;&gt;
      Amazon | パナソニック LEDシーリングライト 調光・調色タイプ リモコン付 6畳 3, 699lm HH-CD0620AZ 【Amazon.co.jp限定】 | パナソニック(Panasonic) | ホーム＆キッチン
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;変えたのはよかったのですが、部屋が長細い＋Webカメラの位置（自分から見て左にカメラを置いて、部屋の奥への画角？になっている）のせいで、右半分の顔が暗くなる場合がありました。
幸い、右にはスチールラックが組んであるので、そこにつけられる照明を購入して女優ライトみたいな感じで使っています（頻繁ではないですが）&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B01N0UJ2B6/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41ryzOoEitL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B01N0UJ2B6/?tag=johtani-22&#34;&gt;
      Amazon｜ルミナス メタルラック用 LEDライト 磁石で簡単設置 連結可能 幅60cm 昼白色 LED60R-N｜メタルラックパーツ オンライン通販
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;フットレスト&#34;&gt;フットレスト&lt;/h2&gt;
&lt;p&gt;昨年3月くらいに配置して、座っているときに足を置くのに便利に使っていました。
が、1台だと幅が足りないので最近2つ目を購入して並べて使っています。
片足ずつ載せられるのは便利ですね（基本ガニ股なので。。。）。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07CN8VZQ3/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41lux4aktLL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07CN8VZQ3/?tag=johtani-22&#34;&gt;
      Amazon | サンワダイレクト フットレスト スチール製 角度10° 幅40×奥行30cm 足置き台 100-FR011 | フットレスト | 文房具・オフィス用品
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;ということで、最近はこんな環境で仕事をしています。
当分これで更新しないんじゃないかなぁ。
（サブディスプレイが左に寄っているので、局面ディスプレイが気になっているところですが。。。）&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Azure Cognitive Searchでオートコンプリートやサジェストをしてみる</title>
      <link>https://blog.johtani.info/blog/2021/02/05/autocomplete-and-suggest-on-azure-search/</link>
      <pubDate>Fri, 05 Feb 2021 17:52:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2021/02/05/autocomplete-and-suggest-on-azure-search/</guid>
      <description>&lt;p&gt;Azure Cognitive SearchにSuggestやAutocompleteの機能があるのを見つけたので、どんな挙動なのかを調べてログとして残しておきます。&lt;/p&gt;
&lt;h2 id=&#34;公式ドキュメント&#34;&gt;公式ドキュメント&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/index-add-suggesters&#34;&gt;日本語で公式ドキュメントが公開されています&lt;/a&gt;。使い方や流れについてはこちらをまずは見れば使えると思います。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Azure Cognitive SearchにSuggestやAutocompleteの機能があるのを見つけたので、どんな挙動なのかを調べてログとして残しておきます。&lt;/p&gt;
&lt;h2 id=&#34;公式ドキュメント&#34;&gt;公式ドキュメント&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/index-add-suggesters&#34;&gt;日本語で公式ドキュメントが公開されています&lt;/a&gt;。使い方や流れについてはこちらをまずは見れば使えると思います。&lt;/p&gt;
&lt;p&gt;本ブログでは、ざっくりとした機能の紹介と内部がどんな挙動をしていそうか？、日本語だとどういう感じになるのか？という点を紹介しようと思います。&lt;/p&gt;
&lt;h2 id=&#34;どんな機能&#34;&gt;どんな機能？&lt;/h2&gt;
&lt;p&gt;検索窓でよく、キーワードを入力しているときに検索キーワードの候補が表示されることがあります。
このキーワードの候補を表示するための機能が今回紹介するSuggesterと呼ばれる機能です（日本語の公式ドキュメントでは「先行入力エクスペリエンス」）。
Suggesterには、以下の2つの機能が用意されています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Autocomplete：キー入力しているときに、入力されている文字列で始まる単語で、検索できるもの（転置インデックスに登録されている単語）をリストで返す機能&lt;/li&gt;
&lt;li&gt;Suggestion：入力した文字列で始まるキーワードを含む、元のデータを返す機能&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;利用方法&#34;&gt;利用方法&lt;/h2&gt;
&lt;p&gt;Suggesterの機能を利用するにはインデックスに設定を追加する必要があります（新規、既存どちらでも可）。
ただ、既存のインデックスに設定を追加した場合、内部にすでに存在するドキュメント（データ）については、このSuggesterのデータは作られません。
ですので、既存データを再度登録しなおすといった作業が必要となるので注意が必要です。&lt;/p&gt;
&lt;p&gt;本ブログでは、いくつかAzure Cognitive Searchのサンプルのリクエストが出てきます。Visual Studio CodeのREST Client Extensionの書式となります。&lt;a href=&#34;https://blog.johtani.info/blog/2020/02/19/research-azure-cognitive-search/#%E9%96%91%E8%A9%B1%E4%BC%91%E9%A1%8C---rest-client-exstension-for-visual-studio-code&#34;&gt;拡張機能の簡単な紹介は昨年のブログをご覧ください&lt;/a&gt;。&lt;/p&gt;
&lt;h3 id=&#34;設定編&#34;&gt;設定編&lt;/h3&gt;
&lt;p&gt;Suggesterの設定では、主に以下の2つを設定する必要があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;name: suggesterの名称。クエリ時に指定します。&lt;/li&gt;
&lt;li&gt;sourceFields: 入力データのもととなるフィールド名。
&lt;ul&gt;
&lt;li&gt;String型のみ指定可能。また、Azureで用意されたアナライザーだけが利用可能です。自分で用意するカスタムアナライザーは利用できないので注意が必要です（&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/index-add-suggesters#how-to-create-a-suggester&#34;&gt;制限についてはこちら&lt;/a&gt;）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回使用するサンプルのインデックス設定は次の通りです。&lt;/p&gt;
&lt;p&gt;インデックス作成のリクエスト（&lt;code&gt;@host&lt;/code&gt;、&lt;code&gt;@api-key&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;##&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#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:#960050;background-color:#1e0010&#34;&gt;@&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;host&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;名前&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;search&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;windows&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;netと記載&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:#960050;background-color:#1e0010&#34;&gt;@&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;APIキーを入力&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:#960050;background-color:#1e0010&#34;&gt;###&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Create&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;index&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;suggester&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;POST&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;https&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//{{host}}/indexes/?api-version=2020-06-30
&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;Content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;application&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;json&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;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {{&lt;span style=&#34;color:#a6e22e&#34;&gt;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&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:#e6db74&#34;&gt;&amp;#34;name&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;suggester-test&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:#e6db74&#34;&gt;&amp;#34;fields&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;name&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;id&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:#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;Edm.String&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:#e6db74&#34;&gt;&amp;#34;key&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;true&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:#e6db74&#34;&gt;&amp;#34;searchable&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;false&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:#e6db74&#34;&gt;&amp;#34;name&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;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:#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;Edm.String&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:#e6db74&#34;&gt;&amp;#34;searchable&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;true&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:#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;ngram_analyzer&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;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:#e6db74&#34;&gt;&amp;#34;name&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;category&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:#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;Edm.String&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:#e6db74&#34;&gt;&amp;#34;filterable&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;true&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:#e6db74&#34;&gt;&amp;#34;facetable&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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:#e6db74&#34;&gt;&amp;#34;suggesters&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;name&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;name_suggester&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:#e6db74&#34;&gt;&amp;#34;searchMode&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;analyzingInfixMatching&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:#e6db74&#34;&gt;&amp;#34;sourceFields&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;公式ドキュメントのサンプルでは日本語がないので、日本語のデータも入力しています。&lt;/p&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;###&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Index&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;data&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;POST&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;https&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//{{host}}/indexes/suggester-test/docs/index?api-version=2020-06-30
&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;Content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;application&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;json&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;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {{&lt;span style=&#34;color:#a6e22e&#34;&gt;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;@search.action&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;upload&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:#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;1&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:#e6db74&#34;&gt;&amp;#34;name&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;Microsoft Office&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:#e6db74&#34;&gt;&amp;#34;category&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;microsoft&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;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:#e6db74&#34;&gt;&amp;#34;@search.action&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;upload&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:#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;2&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:#e6db74&#34;&gt;&amp;#34;name&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;Microsoft Azure&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:#e6db74&#34;&gt;&amp;#34;category&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;microsoft&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;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:#e6db74&#34;&gt;&amp;#34;@search.action&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;upload&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:#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;3&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:#e6db74&#34;&gt;&amp;#34;name&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;GitHub Enterprise&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:#e6db74&#34;&gt;&amp;#34;category&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;github&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;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:#e6db74&#34;&gt;&amp;#34;@search.action&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;upload&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:#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;4&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:#e6db74&#34;&gt;&amp;#34;name&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;GitHub dot com&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:#e6db74&#34;&gt;&amp;#34;category&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;github&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;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:#e6db74&#34;&gt;&amp;#34;@search.action&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;upload&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:#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;5&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:#e6db74&#34;&gt;&amp;#34;name&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;Bluetooth Mic&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:#e6db74&#34;&gt;&amp;#34;category&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;hardware&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;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:#e6db74&#34;&gt;&amp;#34;@search.action&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;upload&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:#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;6&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:#e6db74&#34;&gt;&amp;#34;name&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;東京スカイツリー&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:#e6db74&#34;&gt;&amp;#34;category&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;japanese&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;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:#e6db74&#34;&gt;&amp;#34;@search.action&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;upload&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:#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;7&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:#e6db74&#34;&gt;&amp;#34;name&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;東京タワー&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:#e6db74&#34;&gt;&amp;#34;category&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;japanese&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;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:#e6db74&#34;&gt;&amp;#34;@search.action&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;upload&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:#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;8&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:#e6db74&#34;&gt;&amp;#34;name&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;東京特許許可局&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:#e6db74&#34;&gt;&amp;#34;category&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;japanese&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;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:#e6db74&#34;&gt;&amp;#34;@search.action&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;upload&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:#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;9&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:#e6db74&#34;&gt;&amp;#34;name&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;グランメゾン東京&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:#e6db74&#34;&gt;&amp;#34;category&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;japanese&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;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:#e6db74&#34;&gt;&amp;#34;@search.action&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;upload&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:#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;10&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:#e6db74&#34;&gt;&amp;#34;name&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;東京都庁&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:#e6db74&#34;&gt;&amp;#34;category&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;japanese&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;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以上が事前準備です。データ登録時に内部でSuggester用のデータを内部で生成しているようです（公式ドキュメント）。&lt;/p&gt;
&lt;h3 id=&#34;クエリ編&#34;&gt;クエリ編&lt;/h3&gt;
&lt;p&gt;最初に説明しましたが、Suggesterの中ではAutocompleteとSuggestionという2種類の機能が用意されています。それぞれについて例をもとに説明していきます。&lt;/p&gt;
&lt;h4 id=&#34;autocomplete-api&#34;&gt;Autocomplete API&lt;/h4&gt;
&lt;p&gt;検索窓に入力された文字を元に、前方一致でどのような単語で検索できるか？という候補を表示するための機能です（2単語も対応していますが今回は省略。&lt;a href=&#34;https://docs.microsoft.com/ja-jp/rest/api/searchservice/autocomplete&#34;&gt;APIの仕様はこちら&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;たとえば、&lt;code&gt;mic&lt;/code&gt;という文字が入力されているところでAutocomplete APIを呼び出す時は、次のようなリクエストです。&lt;code&gt;search&lt;/code&gt;というパラメータに入力値を与えます。&lt;code&gt;suggesterName&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;POST&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;https&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//{{host}}/indexes/suggester-test/docs/autocomplete?api-version=2020-06-30
&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;Content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;application&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;json&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;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {{&lt;span style=&#34;color:#a6e22e&#34;&gt;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&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:#e6db74&#34;&gt;&amp;#34;search&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;mic&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:#e6db74&#34;&gt;&amp;#34;suggesterName&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;name_suggester&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;レスポンスとして、次のような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-js&#34; data-lang=&#34;js&#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:#e6db74&#34;&gt;&amp;#34;@odata.context&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;...&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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;microsoft&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:#e6db74&#34;&gt;&amp;#34;queryPlusText&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;microsoft&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;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:#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;mic&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:#e6db74&#34;&gt;&amp;#34;queryPlusText&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;mic&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;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;サンプルデータとして登録したデータに&lt;code&gt;category&lt;/code&gt;というフィールドを入れていました。
Autocompleteは条件を絞り込んで結果を返すこともできます。
&lt;code&gt;filter&lt;/code&gt;にODataの書式で条件を書けます。
&lt;code&gt;category&lt;/code&gt;フィールドに&lt;code&gt;microsoft&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;###&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Autocomplete&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;filter&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;POST&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;https&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//{{host}}/indexes/suggester-test/docs/autocomplete?api-version=2020-06-30
&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;Content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;application&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;json&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;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {{&lt;span style=&#34;color:#a6e22e&#34;&gt;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&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:#e6db74&#34;&gt;&amp;#34;search&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;mic&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:#e6db74&#34;&gt;&amp;#34;suggesterName&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;name_suggester&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:#e6db74&#34;&gt;&amp;#34;filter&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;category eq &amp;#39;microsoft&amp;#39;&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;code&gt;mic&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-js&#34; data-lang=&#34;js&#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:#e6db74&#34;&gt;&amp;#34;@odata.context&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;...&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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;microsoft&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:#e6db74&#34;&gt;&amp;#34;queryPlusText&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;microsoft&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;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;英語の場合、「単語」の単位は字面の通りです。スペースで単語が区切られているのでわかりやすいです。
日本語の場合は普通の人には少し想像しにくいです。
&lt;code&gt;東京&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;###&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Autocomplete&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Japanese&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;POST&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;https&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//{{host}}/indexes/suggester-test/docs/autocomplete?api-version=2020-06-30
&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;Content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;application&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;json&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;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {{&lt;span style=&#34;color:#a6e22e&#34;&gt;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&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:#e6db74&#34;&gt;&amp;#34;search&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;東京&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:#e6db74&#34;&gt;&amp;#34;suggesterName&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;name_suggester&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-js&#34; data-lang=&#34;js&#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:#e6db74&#34;&gt;&amp;#34;@odata.context&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;...&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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;東京&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:#e6db74&#34;&gt;&amp;#34;queryPlusText&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;東京&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;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;入っているデータは「東京スカイツリー」、「東京タワー」などです。
普通に考えると、これらがそのまま返ってくると思うかもしれませんが、違います。&lt;/p&gt;
&lt;p&gt;これは、Suggesterの元となるフィールドのAnalyzerの挙動によります。
今回のインデックスの&lt;code&gt;name&lt;/code&gt;フィールドの&lt;code&gt;analyzer&lt;/code&gt;には&lt;code&gt;ja.lucene&lt;/code&gt;です。これは、日本語用のアナライザー（Kuromoji）になります。いわゆる形態素解析器で日本語の文字列を「単語」に分割します。
英語についてはスペース区切りで分割しますが、日本語についてはKuromojiが内部の辞書とアルゴリズムに基づいて単語に分割してくれます。
Azure Cognitive Searchでは、Analyzerの挙動を確認するためのAPIも用意してあるので実行しみると、&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;###&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Autocomplete&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Japanese&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;POST&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;https&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//{{host}}/indexes/suggester-test/analyze?api-version=2020-06-30
&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;Content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;application&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;json&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;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {{&lt;span style=&#34;color:#a6e22e&#34;&gt;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&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:#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;東京スカイツリー&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:#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;ja.lucene&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-js&#34; data-lang=&#34;js&#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:#e6db74&#34;&gt;&amp;#34;@odata.context&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;...&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:#e6db74&#34;&gt;&amp;#34;tokens&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;token&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;東京&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:#e6db74&#34;&gt;&amp;#34;startOffset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;endOffset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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:#e6db74&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;token&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;スカイ&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:#e6db74&#34;&gt;&amp;#34;startOffset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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:#e6db74&#34;&gt;&amp;#34;endOffset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5&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:#e6db74&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;token&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;ツリー&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:#e6db74&#34;&gt;&amp;#34;startOffset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5&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:#e6db74&#34;&gt;&amp;#34;endOffset&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&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:#e6db74&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;ja.lucene&lt;/code&gt;のAnalyzerによって、3つの単語に分割されているのがわかります。
Autocomplete APIの実行結果も、このAnalyzerによって分割された単語をもとに、候補となる単語を前方一致で検索して結果を返しているのです。
ですので、「東」と入れても「東京」が返ってくるのがわかります。
一方で、「東京ス」と入力した場合は次のような結果となります。&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-js&#34; data-lang=&#34;js&#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:#e6db74&#34;&gt;&amp;#34;@odata.context&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;...&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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;スカイ&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:#e6db74&#34;&gt;&amp;#34;queryPlusText&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;東京スカイ&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;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これは、&lt;code&gt;autocompleteMode&lt;/code&gt;と呼ばれるパラメータの挙動となります。
デフォルトでは、&lt;code&gt;oneTerm&lt;/code&gt;という設定で、最後の単語（例の「東京ス」の場合は「東京」「ス」と区切られるので「ス」という文字を単語とみなす）にマッチする単語（例では「スカイ」）が返ってきます。
queryPlusTextについては、入力された文字に&lt;code&gt;text&lt;/code&gt;で返ってきた単語をくっつけたものが取得できます。&lt;/p&gt;
&lt;p&gt;英語であれば、スペースで区切られており、単語が切れているのが簡単にイメージできますが、日本語の場合は少し違和感が出るかと。&lt;/p&gt;
&lt;p&gt;このように、入力された文字が含まれる「単語」を基本的に返す動作をするのがAutocomplete APIです。&lt;/p&gt;
&lt;h4 id=&#34;suggest-api&#34;&gt;Suggest API&lt;/h4&gt;
&lt;p&gt;では、もうひとつのSuggest APIはどういったものでしょうか？
autocomplete APIに似ていますが、返ってくるデータが登録されたデータそのものになります。&lt;/p&gt;
&lt;p&gt;たとえば、&lt;code&gt;mic&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;POST&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;https&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//{{host}}/indexes/suggester-test/docs/suggest?api-version=2020-06-30
&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;Content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;application&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;json&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;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {{&lt;span style=&#34;color:#a6e22e&#34;&gt;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&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:#e6db74&#34;&gt;&amp;#34;search&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;mic&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:#e6db74&#34;&gt;&amp;#34;suggesterName&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;name_suggester&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;次のような結果が返ってきます。Autocompleteの時は単語でしたが、こちらは入力データがそのまま返ってきています。
入力データの中に&lt;code&gt;mic&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-js&#34; data-lang=&#34;js&#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:#e6db74&#34;&gt;&amp;#34;@odata.context&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;...&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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;@search.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;Bluetooth Mic&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:#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;5&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;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:#e6db74&#34;&gt;&amp;#34;@search.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;Microsoft Office&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:#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;1&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;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:#e6db74&#34;&gt;&amp;#34;@search.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;Microsoft Azure&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:#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;2&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;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;日本語の場合、Autocompleteとは異なり、その単語を含むものがサジェストされるので、「東京」をsearchに指定すると「東京」を含むデータが出てきます。&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;###&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Suggest&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Japanese&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;POST&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;https&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//{{host}}/indexes/suggester-test/docs/suggest?api-version=2020-06-30
&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;Content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;application&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;json&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;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {{&lt;span style=&#34;color:#a6e22e&#34;&gt;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&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:#e6db74&#34;&gt;&amp;#34;search&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;東京&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:#e6db74&#34;&gt;&amp;#34;suggesterName&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;name_suggester&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-js&#34; data-lang=&#34;js&#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:#e6db74&#34;&gt;&amp;#34;@odata.context&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;...&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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;@search.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;東京タワー&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:#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;7&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;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:#e6db74&#34;&gt;&amp;#34;@search.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;グランメゾン東京&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:#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;9&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;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:#e6db74&#34;&gt;&amp;#34;@search.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;東京都庁&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:#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;10&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;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:#e6db74&#34;&gt;&amp;#34;@search.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;東京スカイツリー&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:#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;6&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;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:#e6db74&#34;&gt;&amp;#34;@search.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;東京特許許可局&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:#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;8&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;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;では、「東京」「特許」という2つの単語をスペースで区切ったものが入力されたとするとどうでしょう？&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;###&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Suggest&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Japanese&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;POST&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;https&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//{{host}}/indexes/suggester-test/docs/suggest?api-version=2020-06-30
&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;Content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;application&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;json&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;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {{&lt;span style=&#34;color:#a6e22e&#34;&gt;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&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:#e6db74&#34;&gt;&amp;#34;search&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;東京 特許&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:#e6db74&#34;&gt;&amp;#34;suggesterName&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;name_suggester&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-js&#34; data-lang=&#34;js&#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:#e6db74&#34;&gt;&amp;#34;@odata.context&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;...&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:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;@search.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;東京特許許可局&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:#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;8&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;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;なお、このSuggestのAPIは、単語の語順を気を付ける必要があります。
「特許」「東京」と順序を入れ替えたスペース区切りの場合は、&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;###&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Suggest&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Japanese&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;POST&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;https&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//{{host}}/indexes/suggester-test/docs/suggest?api-version=2020-06-30
&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;Content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;application&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;json&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;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {{&lt;span style=&#34;color:#a6e22e&#34;&gt;api&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&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:#e6db74&#34;&gt;&amp;#34;search&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;特許 東京&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:#e6db74&#34;&gt;&amp;#34;suggesterName&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;name_suggester&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;p&gt;短い文章のデータ（例：本のタイトルやランドマーク名など）では、このSuggestAPIを利用するとデータそのものが返却されるので、便利かもしれません。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、Azure Cognitive SearchのSuggesterの簡単な紹介でした。APIのページにはそのほかのパラメータについても説明があるので、使ってみようと思う方は目を通していただくのがよいかと。&lt;/p&gt;
&lt;p&gt;今回のブログは裏の仕組みがどんな感じなのか？を想像しながらAPIについて調べた形になります。日本語の場合に、少し違和感を覚える人もいそうだろうなということでブログを書いてみました。
今回は書いていませんが日本語でAutocompleteをやりたい場合は、読み仮名でも漢字が表示されるほうがよいという場合もあると思います。
その場合は、用意されている機能では難しいので、独自実装するといった方法になりそうです。
英語や、読みを利用しない場合は、挙動を理解していれば役に立つ場面もありそうです。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>「コンピュータシステムの理論と実装」を読み始めた #Nand2Tetris</title>
      <link>https://blog.johtani.info/blog/2021/02/04/reading-elements-of-computing-systems/</link>
      <pubDate>Thu, 04 Feb 2021 16:40:44 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2021/02/04/reading-elements-of-computing-systems/</guid>
      <description>&lt;p&gt;オライリー・ジャパンから出ている&lt;a href=&#34;https://www.oreilly.co.jp/books/9784873117126/&#34;&gt;「コンピュータシステムの理論と実装」&lt;/a&gt;を読み始めたのでメモを取ることに。&lt;/p&gt;
&lt;p&gt;原著はオライリーじゃないのかというのが、まず最初の気づきでした。&lt;/p&gt;
&lt;h2 id=&#34;nandからテトリス&#34;&gt;NANDからテトリス&lt;/h2&gt;
&lt;p&gt;コンピュータのハードウェアからOS、さらにその上で動くアプリケーションまでを動作させるというのを少しずつやっていくという書籍みたいです。
イントロと1章を読みましたが、1章では論理回路の話でした。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;オライリー・ジャパンから出ている&lt;a href=&#34;https://www.oreilly.co.jp/books/9784873117126/&#34;&gt;「コンピュータシステムの理論と実装」&lt;/a&gt;を読み始めたのでメモを取ることに。&lt;/p&gt;
&lt;p&gt;原著はオライリーじゃないのかというのが、まず最初の気づきでした。&lt;/p&gt;
&lt;h2 id=&#34;nandからテトリス&#34;&gt;NANDからテトリス&lt;/h2&gt;
&lt;p&gt;コンピュータのハードウェアからOS、さらにその上で動くアプリケーションまでを動作させるというのを少しずつやっていくという書籍みたいです。
イントロと1章を読みましたが、1章では論理回路の話でした。&lt;/p&gt;
&lt;p&gt;実際に物理的に作るわけではなく、シミュレーターなどのソフトウェアが用意されており、
そのソフトウェア上で動くものを作っていくことになります。
ソフトウェアのために専用のサイトが用意されて、ダウンロードもできるようになっているので、実際に手を動かしながら理解を進める感じになるのかと。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.oreilly.co.jp/books/9784873117126/&#34;&gt;目次&lt;/a&gt;を見ていただくとわかりますが、すごく幅が広いです。
1年で読み終われるかなぁ？まぁ、のんびりやっていこうかなと。&lt;/p&gt;
&lt;p&gt;用意されているソフトウェアなどで便利だなと思ったのは、どの章からでも興味のある部分から始められるようになっているようです（まだ始めてなくて。。。）
内部ではすべてのパーツがそろえてあるけど、章ごとのプロジェクトでは、個別に自分で実装したものがあればそちらが動くという挙動のようです。&lt;/p&gt;
&lt;p&gt;ということで、ちょっとずつやっていこうかなと。
ほんとにテトリス動くのかなぁ？&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Sofle v2を組み立てて、BLE&#43;LPME-IO化してみた #DIYキーボード</title>
      <link>https://blog.johtani.info/blog/2021/02/01/apply-ble-to-sofle/</link>
      <pubDate>Mon, 01 Feb 2021 00:15:22 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2021/02/01/apply-ble-to-sofle/</guid>
      <description>&lt;p&gt;Corne使ってましたが、数字キーがあるとどうなのかな？というのがやはり気になって。
そこに、Kochi KeyboardさんからSofle Keyboard v2というのが発売されたので組み立ててみました（去年末に）。また、先日Corne Light v2のBLE化に成功したので、Sofle keyboard v2のBLE Pro Micro + LPME-IO化にもチャレンジしてみました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Corne使ってましたが、数字キーがあるとどうなのかな？というのがやはり気になって。
そこに、Kochi KeyboardさんからSofle Keyboard v2というのが発売されたので組み立ててみました（去年末に）。また、先日Corne Light v2のBLE化に成功したので、Sofle keyboard v2のBLE Pro Micro + LPME-IO化にもチャレンジしてみました。&lt;/p&gt;
&lt;h2 id=&#34;sofle-keyboard-v2-ビルドログ&#34;&gt;Sofle keyboard v2 ビルドログ&lt;/h2&gt;
&lt;p&gt;自分で書くよりもすごくよくできたビルドログがKochi Keyboardさんで公開されているので、そちらを参考にしてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://kochikbd.hatenablog.com/entry/2020/12/05/200000&#34;&gt;Sofle Keyboard v2ビルドガイド&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;すごく詳しく書いてあります。なので、こちらを見ていただければ問題ないかなと。
ただ、自分ではいくつか失敗したので自戒を込めてログを残しておきます。&lt;/p&gt;
&lt;h3 id=&#34;oled用のジャンパをはんだ付けし忘れ&#34;&gt;OLED用のジャンパをはんだ付けし忘れ&lt;/h3&gt;
&lt;p&gt;単にビルドログを流し読みしたツケが。。。
Sofleは同じ基盤を左右で利用します。なので、右手と左手で、同じ基盤の表と裏を利用します。
OLED用のジャンパする部分は両面に用意されていますが、はんだでジャンプするのは&lt;strong&gt;Pro Micro&lt;/strong&gt;が実装される面となります。&lt;/p&gt;
&lt;p&gt;両面にジャンプ用のランドがあるとは気づかないで、左手の&lt;strong&gt;裏面&lt;/strong&gt;をジャンプしてすべて実装し終わってから、OLEDが表示されないことに気づいてしまいました（ビルドログ用にと思って撮った写真に証拠が残ってますねｗ）。。。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:600px&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20210201/jump_oled_on_wrong_side.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20210201/jump_oled_on_wrong_side.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;ということで、またはんダッシュ太郎くんのお世話になりました（Pro Microを外してジャンプしました）。本当に有能ですよ彼は。。。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B01FEV2BPG/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/417ZH7pCYDL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B01FEV2BPG/?tag=johtani-22&#34;&gt;
      Amazon | サンハヤト はんだシュッ太郎NEO 45Wタイプ HSK-300 | ハンダゴテパーツ
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;ソケットのはんだ付け甘すぎ&#34;&gt;ソケットのはんだ付け甘すぎ&lt;/h3&gt;
&lt;p&gt;あとは、慣れてきたなぁと思っていたところに天罰が。
キースイッチのソケットを付けるの慣れてきたなーと思って、サクサクとつけていたのですが、
いざキースイッチをはめるときにボロボロとはがれていきましたｗ
半分くらいは外れたんじゃないかな？ちゃんとはんだ付けした後にピンセットなどで軽くいじってみるべきですね。。。&lt;/p&gt;
&lt;h3 id=&#34;滑り止め&#34;&gt;滑り止め&lt;/h3&gt;
&lt;p&gt;利用しているキーキャップがOEMプロファイルということもあり、数字キー側を少し高くしたほうが入力しやすいです。そのために、少し大きめのソフトクッションを購入しました。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B00N3TOZQ0/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41ngD13RSiL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B00N3TOZQ0/?tag=johtani-22&#34;&gt;
      Amazon | WAKI ソフトクッションCN-020 クリアータイプ: 産業・研究開発用品
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;上の左右の角に貼り付けると、がたつきがあったので少しずらして貼り付けて安定させています。
OLEDのプレートの部分を押すと手前が浮き上がってしまいますが、そこにはキーはないので問題ないかと。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600px&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20210201/apply_rubber.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20210201/apply_rubber.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;ということで、毎回気づきがあって面白いですね。。。&lt;/p&gt;
&lt;h2 id=&#34;sofle-keyboardのble化&#34;&gt;Sofle keyboardのBLE化&lt;/h2&gt;
&lt;p&gt;Corne LightのBLE化がうまくいったので、もうひとセット&lt;a href=&#34;https://nogikes.booth.pm/items/1177319&#34;&gt;のぎけす屋&lt;/a&gt;さんから購入しました。
BLE Micro ProやLPME-IO、電池基盤などについては&lt;a href=&#34;https://blog.johtani.info/blog/2021/01/11/apply-ble-and-lpme-to-corne/&#34;&gt;前回のCorneのBLE化の記事&lt;/a&gt;を参照してください。&lt;/p&gt;
&lt;h3 id=&#34;ハードウェア編&#34;&gt;ハードウェア編&lt;/h3&gt;
&lt;p&gt;Sofle keyboard v2は残念ながらせきごんさんの公式ページの&lt;a href=&#34;https://sekigon-gonnoc.github.io/BLE-Micro-Pro/#/keyboard_list&#34;&gt;対応キーボード一覧&lt;/a&gt;には掲載されていません。
が、&lt;a href=&#34;https://github.com/josefadamcik/SofleKeyboard&#34;&gt;Sofle KeyboardのGitHubのページ&lt;/a&gt;には次のような記載があります。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Sofle is 6×4+5 keys column-staggered split keyboard with encoder support. Based on Lily58, Corne and Helix keyboards.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/josefadamcik/SofleKeyboard/blob/master/Images/IMG_20191104_202757.jpg&#34;&gt;基盤の写真&lt;/a&gt;のPro Micro周りもCorneに似ています。
ということで、おそらくBLE + LPME-IO化が行けるのでは？と予測して作業に取り掛かりました。&lt;/p&gt;
&lt;h4 id=&#34;pcbの確認&#34;&gt;PCBの確認&lt;/h4&gt;
&lt;p&gt;Sofle Keyboardの基盤の設計図は&lt;a href=&#34;https://github.com/josefadamcik/SofleKeyboard/tree/master/Sofle_v2/PCB&#34;&gt;GitHub上に公開&lt;/a&gt;されています。
この設計図を見る方法をまずは探しました。&lt;/p&gt;
&lt;p&gt;自作キーボードについて探すにはまずはサリチル酸さんのブログ「&lt;a href=&#34;https://salicylic-acid3.hatenablog.com/&#34;&gt;自作キーボード温泉街の歩き方&lt;/a&gt;」です。
回路図なので、設計ノウハウあたりのカテゴリーにあるだろうと探したところ見つかりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://salicylic-acid3.hatenablog.com/entry/auto-router-introduction&#34;&gt;（設計者向け）オートルーターを使って睡眠時間を確保しよう&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;配線のテクニックというブログですが、回路図を書くためのツールKiCadについて記載があります。
このブログにある以下の記事をもとに、KiCadのインストールや使い方をちょっとだけ勉強しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;foostanさんの&lt;a href=&#34;https://github.com/foostan/mkbd/blob/master/developers_guide/developrs_guide_jp.md&#34;&gt;Meishi Keyboardの開発者向けガイド(JP)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://kicad.jp/translate/getting_started_in_kicad.pdf&#34;&gt;KiCadことはじめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;KiCadの中の回路図エディタ「Eeschema」でSofle keyboardのPCBのフォルダを開くと回路図が開きます。
実際の基盤になる前に、Pro Microのどの足と何がつながっているのか？などが見て取れます。
&lt;a href=&#34;https://blog.johtani.info/blog/2021/01/11/apply-ble-and-lpme-to-corne/#lpme-io%E5%AF%BE%E5%BF%9C&#34;&gt;前回のCorneのBLE化でLPME-IO対応&lt;/a&gt;したときに、学習しましたが、
TRRSの足とPro Microの&lt;strong&gt;SDA&lt;/strong&gt;と&lt;strong&gt;SCL&lt;/strong&gt;をつなぐことで、LPME-IOを使うことができるようになるというのがわかっています。
それをもとに回路図を見たところ、以下のような記述がありました。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600px&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20210201/logic_design.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20210201/logic_design.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;どうも、JP9とJP10というはんだでジャンプする場所を用意してくれていそうです。
先を見越した設計本当にありがたいですね。&lt;/p&gt;
&lt;h4 id=&#34;jp9とjp10のはんだ付け&#34;&gt;JP9とJP10のはんだ付け&lt;/h4&gt;
&lt;p&gt;今ついているPro Microを外し（またはんダッシュ太郎が活躍）、基板を確認したところ対象の個所がありました。下の写真は左手の裏側です。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600px&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20210201/jp9and10_for_lpme.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20210201/jp9and10_for_lpme.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;これらをはんだでジャンプします。&lt;/p&gt;
&lt;p&gt;右手は表側にあるので、Pro Microを外した後にジャンプしました。


&lt;div class=&#34;box&#34; style=&#34;max-width:600px&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20210201/jump_jp9and10_right.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20210201/jump_jp9and10_right.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;左手は裏側です。


&lt;div class=&#34;box&#34; style=&#34;max-width:600px&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20210201/jump_jp9and10_left.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20210201/jump_jp9and10_left.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Corne Lightでは、Pro Microの足から導線を使ってTRRSの足につなぎましたが、今回はすっきり実装できました。
ジャンプした後はBLE Micro Proをはんだ付けします（はんだ付けせずに動作確認しようとしましたが、うまく通電しなくてちゃんと動かなかったです）。&lt;/p&gt;
&lt;h4 id=&#34;lpme-ioのジャンパ&#34;&gt;LPME-IOのジャンパ&lt;/h4&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/sekigon-gonnoc/LPME-IO#v2%E3%81%AE%E5%A0%B4%E5%90%88%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%81%AE%E5%88%97col%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B%E3%83%94%E3%83%B3%E3%81%AE%E3%82%B8%E3%83%A3%E3%83%B3%E3%83%91%E3%82%92%E3%83%8F%E3%83%B3%E3%83%80%E3%81%A7%E3%83%96%E3%83%AA%E3%83%83%E3%82%B8%E3%81%99%E3%82%8B&#34;&gt;LPME-IOのGitHubページ&lt;/a&gt;にあるように、利用するキーボードによって、いくつかはんだでジャンプする必要があります。
これは、BLE Micro Pro用のConfigファイルを見て、対象を決める必要があります。
が、Sofleは事前に用意されたものがありません。&lt;/p&gt;
&lt;h4 id=&#34;configファイルの生成&#34;&gt;Configファイルの生成&lt;/h4&gt;
&lt;p&gt;用意されていないConfigファイルが、QMKの設定ファイルから生成することができるようななっています（本当に感謝しかないですね）。
手順はBLE Micro Proのドキュメントにありました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://sekigon-gonnoc.github.io/BLE-Micro-Pro/#/edit_config_file&#34;&gt;新しいキーボード用の設定を作成する - QMK用の設定から変換する&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この変換スクリプトで３種類のconfig（右手用、左手用、LPME-IO用）が生成されます。
私の場合はLPMEを利用するので、lpmeという名前の入ったconfigを利用します。
中を見るとcol以下の記載が以下の通りだったので、&lt;code&gt;8&lt;/code&gt;から&lt;code&gt;D&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-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;col_pins&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt;[&lt;span style=&#34;color:#ae81ff&#34;&gt;18&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;17&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;15&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;14&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;13&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;18&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;17&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;15&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;14&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;13&lt;/span&gt;]&lt;span style=&#34;color:#960050;background-color:#1e0010&#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;h3 id=&#34;ファームウェア設定編&#34;&gt;ファームウェア・設定編&lt;/h3&gt;
&lt;p&gt;ハードウェアの実装が終わったので、ファームウェアおよびアプリの設定です。&lt;/p&gt;
&lt;h4 id=&#34;ファームウェアのセットアップ&#34;&gt;ファームウェアのセットアップ&lt;/h4&gt;
&lt;p&gt;キーボードをUSBで接続し、BLE Micro Pro Web Configuratorのページにアクセスすると、
セットアップ初期画面が出てきます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://sekigon-gonnoc.github.io/BLE-Micro-Pro/#/getting_started?id=%e3%82%ad%e3%83%bc%e3%83%9c%e3%83%bc%e3%83%89%e3%82%92%e9%81%b8%e3%81%b6&#34;&gt;公式ページの「キーボードを選ぶ」&lt;/a&gt;を参考にファームウェア、アプリのアップデートを行います。
「設定ファイルの書き込み」のタイミングで&lt;code&gt;upload your own&lt;/code&gt;を選択すると、ファイル選択画面が出てくるので、変換スクリプトで生成したJSONファイルを選択します。
このとき、Mas Storage Classとしてキーボードが認識されている状態だとうまく書き込めなかったので、キーボードのドライブを「取り出し」してからファイルをアップロードしました。&lt;/p&gt;
&lt;h4 id=&#34;キーマップの設定&#34;&gt;キーマップの設定&lt;/h4&gt;
&lt;p&gt;BLE Micro Proのアプリが設定をきちんと認識すれば、あとはWeb Configuratorでキーマップの設定が可能になります。
これまた、残念なことに、BLE化する前のキーマップをJSONファイルで保存してなかったので（泣きそうｗ）、QMKの&lt;code&gt;keymap.c&lt;/code&gt;のファイルをもとに、ブラウザ上でがんばって設定しましたｗ
また、新しい設定ではBLE関連のキーをマッピングとして追加しています。&lt;/p&gt;
&lt;h4 id=&#34;bluetooth接続&#34;&gt;Bluetooth接続&lt;/h4&gt;
&lt;p&gt;あとは、接続確認です。
MacとWin２台と接続するのですが、Win→Mac→Winの順番でBluetoothの接続をやっていたら、なぜか３つ目のWindowsで接続候補に出てくるけど、接続しようとするとタイムアウトをするという現象に遭遇しました。
MacのBluetoothの設定を一旦削除してから、Win→Win→Macの順番でペアリングしたところ問題なく接続できました。ただ、これが本当の対処なのかどうかは不明です。３番目だと接続できなかったWindowsマシンは再起動もしてみたのですがダメでした。この辺よくわかってないなぁ。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、Corne Lightに引き続き、Sofle Keyboard v2もBLE＋LPME化に成功しました。
導線なども使わずにLPME対応ができたので見た目もすっきりしています。
これで、KVMスイッチだと２台までしか切り替えできなかったのが、３台をひとつのキーボードで操ることができるようになりました。
だいぶ楽になりそうな予感がしています。&lt;/p&gt;
&lt;p&gt;まだ、完ぺきではないので、次のような対応をやっていく予定です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ロータリーエンコーダー対応：BLE以前はQMKのkeymap.cの中でロータリーエンコーダーの動作を記述していたので、BLE Micro Proでどうやるのかを調べたい。encorder.jsonというファイルがあったのでその辺ではないかな？&lt;/li&gt;
&lt;li&gt;OLED対応：Corne Lightの時と同様に、OLEDが点かなくなったのでこの辺りを調べたい。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ということで、とりあえずキー入力するのには困らない程度にはできたので、より便利にする方法を時間を見つけて模索する感じになりそうです。
あと、KiCadも面白そうなのでこっちもちょっと触ってみたくなってきたかも？&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Corne Light v2のBLE&#43;LPME-IO対応 #DIYキーボード</title>
      <link>https://blog.johtani.info/blog/2021/01/11/apply-ble-and-lpme-to-corne/</link>
      <pubDate>Mon, 11 Jan 2021 11:42:31 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2021/01/11/apply-ble-and-lpme-to-corne/</guid>
      <description>&lt;p&gt;メインマシンとMacは下記のサンワサプライのUSB接続のKVMスイッチを使っていますが、もう一台ノートPCがありここに接続しているCorne（&lt;a href=&#34;https://blog.johtani.info/blog/2020/11/05/build-corne-light-v2/&#34;&gt;初めてのDIYキーボード&lt;/a&gt;）が長いUSBケーブルでつながっています。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;メインマシンとMacは下記のサンワサプライのUSB接続のKVMスイッチを使っていますが、もう一台ノートPCがありここに接続しているCorne（&lt;a href=&#34;https://blog.johtani.info/blog/2020/11/05/build-corne-light-v2/&#34;&gt;初めてのDIYキーボード&lt;/a&gt;）が長いUSBケーブルでつながっています。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B0843QRVFH/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41CzU4rGeSL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B0843QRVFH/?tag=johtani-22&#34;&gt;
      Amazon | サンワダイレクト USB切替器 キーボード・マウス用 KVMスイッチ
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;時々必要になって、デスクにキーボードだけ引っ張ってきて利用するのですが、ケーブルの取り回しがまぁ邪魔で。。。
BLE対応（&lt;a href=&#34;https://nogikes.booth.pm/items/1177319&#34;&gt;BLE Micro Pro&lt;/a&gt;）をしてみようかなということに。&lt;/p&gt;
&lt;h2 id=&#34;ble--lpme-io対応&#34;&gt;BLE + LPME-IO対応&lt;/h2&gt;
&lt;p&gt;分割キーボードをBLE対応(それぞれにBLE Micro Proを実装)すると、キーボード間のつながりがいまいちになることもあるというのをちらほら見ていたので、BLE Micro Pro + &lt;a href=&#34;https://nogikes.booth.pm/items/1656264&#34;&gt;LPME-IO&lt;/a&gt;という構成で、
Corneのキーボード同士はTRRSケーブルで接続し、PCとCorne間をBluetoothで接続する構成にしてみました。&lt;/p&gt;
&lt;p&gt;BLE Micro Proについては、&lt;a href=&#34;https://sekigon-gonnoc.github.io/BLE-Micro-Pro/#/&#34;&gt;公式ドキュメント&lt;/a&gt;にいろいろと記載があります。&lt;/p&gt;
&lt;h2 id=&#34;材料&#34;&gt;材料&lt;/h2&gt;
&lt;p&gt;ということで、材料は以下の通り。セット販売は売り切れていたので、個別に購入しました。
コンスルーと電池以外は１つずつです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://nogikes.booth.pm/items/1177319&#34;&gt;BLE Micro Pro(のぎけす屋)&lt;/a&gt; x 1&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nogikes.booth.pm/items/1656264&#34;&gt;LPME-IO(のぎけす屋)&lt;/a&gt; x 1&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://yushakobo.jp/shop/ble-micro-pro-battery-board/&#34;&gt;BLE Micro Pro用電池基盤(遊舎工房)&lt;/a&gt; x 1&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kochikeyboard.stores.jp/items/5f83efcd94f3ae7ba99d07ba&#34;&gt;コンスルー(Kochi Keyboard)&lt;/a&gt; x 4&lt;/li&gt;
&lt;li&gt;CR1632ボタン電池（近所のスーパー） x 2&lt;/li&gt;
&lt;/ul&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;以下の記事を参考にはんだ付けしました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://qiita.com/h-oikawa/items/10b672e03653a1b3fa62#%E9%9B%BB%E6%B1%A0%E5%9F%BA%E7%9B%A4%E3%81%AE%E7%B5%84%E3%81%BF%E7%AB%8B%E3%81%A6%E5%8D%8A%E7%94%B0%E4%BB%98%E3%81%91&#34;&gt;Qiita: 自作キーボードビルドログ：その２「ErgoDash」無線化対応 ハードウェア編 - 電池基盤の組み立て・半田付け&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://yfuku.com/claw44/bmp/&#34;&gt;yfuku docs - Claw44 / 無線接続について&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意点は以下の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基盤が軽いので固定が必要（マスキングテープでマットに貼り付けたらましになった）&lt;/li&gt;
&lt;li&gt;電池ホルダーが変形しやすい（設置して、足を折るために上から押さえつけたら、本体が曲がってしまった。。。）&lt;/li&gt;
&lt;li&gt;部品が細かいので大変（老眼だから？）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;BLE Micro Proとの接続は参考にしたyfuku docsにある方法（余っていたピンヘッダを１本ずつ使ってはんだ付け）を採用しました。
（パッと見大丈夫そうだったので電池基盤の裏に絶縁テープは貼ってないです貼ってないです）&lt;/p&gt;
&lt;h3 id=&#34;ble-micro-proもげ対策&#34;&gt;BLE Micro Pro（もげ対策）&lt;/h3&gt;
&lt;p&gt;BLE Micro Pro自体はコンスルーをはんだ付けするだけですが、今回はもげ対策として、ダイソーで買ってきたグルーガンで
ちょっとだけ補強してみました。
初グルーガンだったので不細工だけど。これ難しいな。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:600px&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20210111/ble_micro_pro1.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20210111/ble_micro_pro1.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;



&lt;div class=&#34;box&#34; style=&#34;max-width:600px&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20210111/ble_micro_pro2.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20210111/ble_micro_pro2.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;効き目あればいいけど？&lt;/p&gt;
&lt;h3 id=&#34;lpme-io対応&#34;&gt;LPME-IO対応&lt;/h3&gt;
&lt;h4 id=&#34;いくつかのジャンパをはんだでブリッジ&#34;&gt;いくつかのジャンパをはんだでブリッジ&lt;/h4&gt;
&lt;p&gt;まずは、&lt;a href=&#34;https://github.com/sekigon-gonnoc/LPME-IO&#34;&gt;LPME-IOのREADMEのページ&lt;/a&gt;の導入手順を読み、いくつかのピンをジャンプしました。
せきごんさんのBLE-Micro-Proのリポジトリに、&lt;a href=&#34;https://github.com/sekigon-gonnoc/BLE-Micro-Pro/blob/master/AboutDefaultFirmware/keyboards/crkbd/crkbd_rev1_lpme_left_config.json&#34;&gt;CorneのLPME用コンフィグファイル&lt;/a&gt;を見ると、ジャンプするのは&lt;code&gt;20, 19, 18, 17, 16, 15&lt;/code&gt;に対応している、&lt;code&gt;F,E,D,C,B,A&lt;/code&gt;の６つです（写真撮り忘れた。。。）。&lt;/p&gt;
&lt;h4 id=&#34;trrsのi2c対応って言い方であってるのかなぁ&#34;&gt;TRRSのI2C対応（って言い方であってるのかなぁ？）&lt;/h4&gt;
&lt;p&gt;ジャンプだけでいけないかなぁ？と思いましたがダメでした（USBでつないでみたけど、左手（BLE-Micro-Proがついている側）だけ入力可能です。&lt;/p&gt;
&lt;p&gt;BLE Micro Proの公式サイトにLPME-IOについても記載があります。
&lt;a href=&#34;https://sekigon-gonnoc.github.io/BLE-Micro-Pro/#/keyboard_list&#34;&gt;実績のあるキーボード一覧&lt;/a&gt;にCorne Lightの記載もあったので、試してみようと思ったのが発端です。&lt;/p&gt;
&lt;p&gt;ただ、LPME-IOの欄に注意書きが。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;*LPME-IOを使うには改造が必要&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;また、一覧の最初にも記載があります。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;LPME-IOを使うにはキーボードの左右の有線通信がI2Cである必要があります。とくにOLEDに対応しているキーボード等の場合は、I2C用のピンをTRRSジャックに接続する改造を施すことでI2C化できる場合があります。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;まだ、自作キーボードの仕組みをがっつり理解しているわけではない初心者なので、まぁ、ちょっとわからないかなと。。。
&lt;a href=&#34;https://sekigon-gonnoc.github.io/BLE-Micro-Pro/#/&#34;&gt;BLE Micro Proのはじめに&lt;/a&gt;のページを見ると、
Self Made keyboard in JapanのDiscordに専用チャネルがあるようで、過去ログを検索してみました。
検索したところ、Corneの場合Micro ProのSDA(写真の青い線)とSCL(写真の黄色い線)（参考：&lt;a href=&#34;https://github.com/foostan/crkbd/blob/master/corne-light/doc/v2/assets/build_trrs_reset_oled.jpg&#34;&gt;Corneの基盤の図&lt;/a&gt;）をそれぞれ、TRRSの２つのピンに接続する必要がありそうだというコメントがありました。&lt;/p&gt;
&lt;p&gt;Corne Cherry v2の場合は、接続するためのショートカットが用意されていましたが、Corne Light v2だと見当たりませんでした。
ということで、線を使って物理ショートカットしました。ちなみに、ショートカットは両手ともに必要なようです。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600px&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20210111/shortcut_left_micropro.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20210111/shortcut_left_micropro.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;



&lt;div class=&#34;box&#34; style=&#34;max-width:600px&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20210111/shortcut_left_trrs.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20210111/shortcut_left_trrs.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;



&lt;div class=&#34;box&#34; style=&#34;max-width:600px&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20210111/shortcut_right_lpme.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20210111/shortcut_right_lpme.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;



&lt;div class=&#34;box&#34; style=&#34;max-width:600px&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20210111/shortcut_right_trrs.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20210111/shortcut_right_trrs.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h2 id=&#34;usb-cで接続テスト&#34;&gt;USB-Cで接続テスト&lt;/h2&gt;
&lt;p&gt;上記対応が終わって、基板に設置してUSB-Cケーブルで接続したところ、外部ドライブとして見えるようになりました。&lt;/p&gt;
&lt;h2 id=&#34;キーマップの書き換えとか&#34;&gt;キーマップの書き換えとか&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://sekigon-gonnoc.github.io/BLE-Micro-Pro/#/getting_started?id=ble-micro-pro-web-configurator%e3%82%92%e4%bd%bf%e3%81%86&#34;&gt;公式ドキュメントのBLE Micro Pro Web Configuratorを使う&lt;/a&gt;の手順通りに書き込みを行っていくと、特に問題なく接続できました。
便利すぎですね。キーマップの変更は、これまでのCorneのキーマップJSONファイルからコピペして書き込んだだけです。
（この後、BLE用のキーマップを書き足すためにもう一度変更しますが）&lt;/p&gt;
&lt;p&gt;LPME-IO対応なので、Micro Proは片側しかないので、書き換えも楽々でした。&lt;/p&gt;
&lt;h2 id=&#34;bleで接続テスト&#34;&gt;BLEで接続テスト&lt;/h2&gt;
&lt;p&gt;今回の目的だったWindowsにBluetoothで接続できるようにしてみました。
最初は&lt;a href=&#34;https://salicylic-acid3.hatenablog.com/entry/BMP-Introduction#%E4%BD%BF%E7%94%A8%E7%B7%A8&#34;&gt;サリチル酸さんの記事を見ていたのですが&lt;/a&gt;、キーコードがちょっと変わっているようでした。&lt;/p&gt;
&lt;p&gt;で、よくよく見ると、BLE Micro Pro Web ConfiguratorにBLE関連のキーも用意されているじゃないですか。。。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600px&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20210111/keymap_layer3.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20210111/keymap_layer3.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;BLE関連のキーを割り当てた後は、USBをオフにして、Bluetoothをオン、BTNEWで新しくペアリングするようにすれば接続完了でした。&lt;/p&gt;
&lt;h2 id=&#34;課題&#34;&gt;課題&lt;/h2&gt;
&lt;p&gt;これまでと違い、すんなり実装ができましたがまだいくつか気になる点が。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;複数の機器とペアリングして切り替え
&lt;ul&gt;
&lt;li&gt;Macともペアリングしてみようとしたのですが、切り替えがうまくいかないようで。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;OLEDつけるにはどうするんだろう？
&lt;ul&gt;
&lt;li&gt;左手側は電池が乗っているのですが、右手側はLPME-IOだけなので、上にOLEDを載せる余裕があります。&lt;/li&gt;
&lt;li&gt;なので載せてみましたが点かないですね。ファームウェアを何かしないといけないんじゃないかな？調べないとなぁ。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;という感じです。
まだちゃんと長時間使っていないので、他の問題点も出てくるかもしれませんが、まぁとりあえず使ってみてからかな。
うまくいくようなら、メインマシンにBluetoothモジュール追加してみるのもありかと考えているところです。&lt;/p&gt;
&lt;p&gt;調べながら、自分なりに対応してみましたが他にもいい方法とかあれば教えてもらえると助かります。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>PCもDIYしました</title>
      <link>https://blog.johtani.info/blog/2020/12/31/diy-pc/</link>
      <pubDate>Thu, 31 Dec 2020 22:48:46 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/12/31/diy-pc/</guid>
      <description>&lt;p&gt;振り返りブログにも書きましたが、デスクトップPCを自作(DIY)しました。
組み立てたに使ったパーツのアフィリンクを貼っておきます。&lt;/p&gt;
&lt;p&gt;10月くらいにPC組もうと思って、組み上がったのは11月半ばでした。
最初はもうちょっと小さいPCにしようと思ってたのに気づいたらATXになってました。
パーツの選定の基準は以下のツイートです。影響されやすいなぁ。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;振り返りブログにも書きましたが、デスクトップPCを自作(DIY)しました。
組み立てたに使ったパーツのアフィリンクを貼っておきます。&lt;/p&gt;
&lt;p&gt;10月くらいにPC組もうと思って、組み上がったのは11月半ばでした。
最初はもうちょっと小さいPCにしようと思ってたのに気づいたらATXになってました。
パーツの選定の基準は以下のツイートです。影響されやすいなぁ。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;タワーってほど大きくなくていいと思いますが、NZXT H510 ぐらいの大きさは欲しいですね。&lt;a href=&#34;https://t.co/s1c1fOnPyI&#34;&gt;https://t.co/s1c1fOnPyI&lt;/a&gt;&lt;br&gt;単純に、スペースがないと組みにくいのと冷えにくい、買ってきたものがやっぱりこれだと入らない、というリスクがかなり減るので。&lt;/p&gt;&amp;mdash; さぼてん（さぼ福）🌵 (@cactusman) &lt;a href=&#34;https://x.com/cactusman/status/1314462879790198784?ref_src=twsrc%5Etfw&#34;&gt;October 9, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;今年3台作りました。ノートPC使えない体になります。 &lt;a href=&#34;https://t.co/8zDmeRwNkS&#34;&gt;pic.twitter.com/8zDmeRwNkS&lt;/a&gt;&lt;/p&gt;&amp;mdash; miyake / ZEN (@kazuyukimiyake) &lt;a href=&#34;https://x.com/kazuyukimiyake/status/1314568016177160197?ref_src=twsrc%5Etfw&#34;&gt;October 9, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;白いケースいいなぁという感じで、ケースとCPUクーラーが決まったんで、ググって&lt;a href=&#34;https://www.youtube.com/watch?v=XUZqsHW2EEg&#34;&gt;こちらのHAKKAさんのYouTube&lt;/a&gt;見ながら妄想してました。
パーツがなかなか揃わなくて。
そして、PCが光るのどうなの?と思ってたのに、気づいたら光ってました(なぜ?)。&lt;/p&gt;
&lt;p&gt;グラボがない状態(CPU内蔵GPU)で12月頭までは動作してました。&lt;/p&gt;
&lt;p&gt;購入自体は&lt;a href=&#34;https://shop.tsukumo.co.jp/&#34;&gt;TSUKUMO&lt;/a&gt;、&lt;a href=&#34;https://www.biccamera.com/&#34;&gt;ビックカメラオンライン&lt;/a&gt;、&lt;a href=&#34;https://www.ark-pc.co.jp/&#34;&gt;パソコンSHOPアーク&lt;/a&gt;、&lt;a href=&#34;https://www.e-trend.co.jp/&#34;&gt;イートレンドオンラインショップ&lt;/a&gt;でオンラインで購入しました。&lt;/p&gt;
&lt;h3 id=&#34;pcケース&#34;&gt;PCケース&lt;/h3&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07TD9S3HZ/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41niw2za94L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07TD9S3HZ/?tag=johtani-22&#34;&gt;
      Amazon | NZXT H510i White CA-H510I-W1 CS7946 | NZXT | PCバッグ・ケース・スリーブ 
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;電源&#34;&gt;電源&lt;/h3&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07FZRW4H6/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41UTABLEVOL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07FZRW4H6/?tag=johtani-22&#34;&gt;
      Amazon | NZXT E850 デジタル電源ユニット 80 Plus Gold 認証 [ 定格 850W 出力 ] NP-1PM-E850A-JP NP-1PM-E850A-JP SP947 | NZXT | パソコン・周辺機器 通販
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;マザーボード&#34;&gt;マザーボード&lt;/h3&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07THJ8JSD/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51QdRYSqFpL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07THJ8JSD/?tag=johtani-22&#34;&gt;
      Amazon | ASRock AMD Ryzen 3000シリーズ CPU(Soket AM4)対応 X570チップセット搭載 ATX マザーボード X570 Steel Legend | ASROCK 
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;cpu&#34;&gt;CPU&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://pc.watch.impress.co.jp/docs/topic/review/1268025.html&#34;&gt;AMD Ryzen 4750G&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;cpuクーラー&#34;&gt;CPUクーラー&lt;/h3&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B082DYSQVF/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41LUty6uTOL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B082DYSQVF/?tag=johtani-22&#34;&gt;
      Amazon | NZXT KRAKEN Z63 簡易水冷CPUクーラー 液晶モニタ搭載 RGB対応 280mm RL-KRZ63-01 FN1441 | NZXT | CPUファン 通販
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;メモリ&#34;&gt;メモリ&lt;/h3&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B0861QJV67/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41doIjakQfL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B0861QJV67/?tag=johtani-22&#34;&gt;
      Amazon | G.SKILL 128GB（4 x 32GB）Trident Z NeoシリーズDDR4 SDRAM 3200MHz PC4-25600デスクトップメモリモデルF4-3200C16Q-128GTZN | G.Skill | メモリ 通販
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;ssd&#34;&gt;SSD&lt;/h3&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07ZPRMLJP/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41jzbyltp5L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07ZPRMLJP/?tag=johtani-22&#34;&gt;
      Amazon | Seagate FireCuda 520 M.2 1TB PCIe Gen4x4 内蔵SSD M.2 2280 3D TLC ZP1000GM3A002 | SEAGATE 
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;グラボ&#34;&gt;グラボ&lt;/h3&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B08KXPPFKY/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41DoIc66FgL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B08KXPPFKY/?tag=johtani-22&#34;&gt;
      Amazon | GIGABYTE NVIDIA GeForce RTX3080搭載 グラフィックボード GDDR6X 10GB ホワイトモデル【国内正規代理店品】GV-N3080VISION OC-10GD | 日本ギガバイト
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;拡張カード&#34;&gt;拡張カード&lt;/h3&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07Z4XKQ4J/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41dgB5OblPS._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07Z4XKQ4J/?tag=johtani-22&#34;&gt;
      Amazon | ASRock 拡張インターフェースボード Thunderbolt 3 AIC R2.0 | ASROCK | インターフェースカード 通販
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;拡張カードは実は差し込んだら最初うまく動かなくてサポートに連絡しました。同じ構成の検証機を用意して解決方法を見つけてもらいました。しかも数日で。サイコーのエクスペリエンスでした!&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;日本語でサポートしてもらえてしかも数日で解決してもらった。ASRockのサポートすばらしかったです！ &lt;a href=&#34;https://t.co/8FasCInIqt&#34;&gt;https://t.co/8FasCInIqt&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1336190706289790977?ref_src=twsrc%5Etfw&#34;&gt;December 8, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;h3 id=&#34;その他&#34;&gt;その他&lt;/h3&gt;
&lt;p&gt;ケースのフロントパネルのUSB-Cポートを使えるようにするために。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B086MRDQFY/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/4156bVZsT&amp;#43;L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B086MRDQFY/?tag=johtani-22&#34;&gt;
      Amazon | Cablecc USB 3.1フロントパネルソケットType-E-マザーボード用USB 3.0 20ピンヘッダーオス拡張アダプター | cablecc | PCアクセサリ・サプライ 通販
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;最近のPCパーツはUSBでモニタリングできるみたいで、マザボのUSBポートが足りなかったので拡張しました。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B01LXKQLZW/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41SZ79lyFzL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B01LXKQLZW/?tag=johtani-22&#34;&gt;
      Amazon | マザーボードのUSB 9ピン 増設 内部用4ポートUSB2.0 HUB | ノーブランド品 | USBハブ 通販
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;白いケースだし、「映え」のために白いケーブルを。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B06XGHCX2R/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41QLL676O&amp;#43;L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B06XGHCX2R/?tag=johtani-22&#34;&gt;
      Amazon | Novonest 電源専用延長スリーブ 補助電源モジュラーケーブル 長さ300mm 6本1セット スリーブガイド24点セット付き 【SC304】 | ｎｏｖｏｎｅｓｔ | 電源ユニット 通販
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;組み立て中&#34;&gt;組み立て中&lt;/h3&gt;
&lt;p&gt;手元にあったCPUでBiosアップデート(&lt;a href=&#34;https://www.asrock.com/mb/AMD/X570%20Steel%20Legend/index.jp.asp#BIOS&#34;&gt;Ryzen 5000シリーズにしたかったから。まだできてないけど&lt;/a&gt;)。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;応急処置でBiosアップデートしてる &lt;a href=&#34;https://t.co/mXf2B5kwqB&#34;&gt;pic.twitter.com/mXf2B5kwqB&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1325465218504257546?ref_src=twsrc%5Etfw&#34;&gt;November 8, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;さーて、頑張るぞー &lt;a href=&#34;https://t.co/HmlGqREjmP&#34;&gt;pic.twitter.com/HmlGqREjmP&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1327062393772412928?ref_src=twsrc%5Etfw&#34;&gt;November 13, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;さて、仮起動実験ですよと &lt;a href=&#34;https://t.co/5HP3cbs6SH&#34;&gt;pic.twitter.com/5HP3cbs6SH&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1327075463718572033?ref_src=twsrc%5Etfw&#34;&gt;November 13, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;きたきたー &lt;a href=&#34;https://t.co/4sL3ymecEo&#34;&gt;pic.twitter.com/4sL3ymecEo&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1327076477662158848?ref_src=twsrc%5Etfw&#34;&gt;November 13, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;コネクター刺しまくらないと &lt;a href=&#34;https://t.co/Soye3lS4M9&#34;&gt;pic.twitter.com/Soye3lS4M9&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1327102892247924737?ref_src=twsrc%5Etfw&#34;&gt;November 13, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;h3 id=&#34;完成はこんなかんじ&#34;&gt;完成はこんなかんじ&lt;/h3&gt;
&lt;p&gt;初期構成&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;組み上がったよー &lt;a href=&#34;https://t.co/sBwpvLsZh3&#34;&gt;pic.twitter.com/sBwpvLsZh3&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1327603468912136198?ref_src=twsrc%5Etfw&#34;&gt;November 14, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;グラボデプロイ&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;設置完了してこんな感じ。なんかベンチマーク走らせるかなぁ。何がいいだろ &lt;a href=&#34;https://t.co/aZufAE9fJA&#34;&gt;pic.twitter.com/aZufAE9fJA&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1334667407265165313?ref_src=twsrc%5Etfw&#34;&gt;December 4, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;グラボのおまけも付けてみた。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;まぁ、せっかくついてきたので取り付けてみました（グラボ下の光ってるパネル）。 &lt;a href=&#34;https://t.co/068IxaV1ps&#34;&gt;pic.twitter.com/068IxaV1ps&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1334865685374062594?ref_src=twsrc%5Etfw&#34;&gt;December 4, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;とまぁ、こんな感じでした。
メモリは多分使い切れないだろうなぁと思いながら、やってみたかったという感じです。。。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>今年の振り返りと来年の抱負（2020）</title>
      <link>https://blog.johtani.info/blog/2020/12/31/looking-back-2020/</link>
      <pubDate>Thu, 31 Dec 2020 18:13:24 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/12/31/looking-back-2020/</guid>
      <description>&lt;p&gt;今年も振り返りブログ書いてます。カタンの航海者版を購入して家族とやってましたが、負けてしまいました。&lt;/p&gt;
&lt;h2 id=&#34;振り返り2019年に書いた抱負から&#34;&gt;振り返り（2019年に書いた抱負から）&lt;/h2&gt;
&lt;p&gt;まずは去年の抱負を元に書きますが、3月以降はコロナウィルスの影響でいろいろと生活が変わってしまいましたね。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今年も振り返りブログ書いてます。カタンの航海者版を購入して家族とやってましたが、負けてしまいました。&lt;/p&gt;
&lt;h2 id=&#34;振り返り2019年に書いた抱負から&#34;&gt;振り返り（2019年に書いた抱負から）&lt;/h2&gt;
&lt;p&gt;まずは去年の抱負を元に書きますが、3月以降はコロナウィルスの影響でいろいろと生活が変わってしまいましたね。&lt;/p&gt;
&lt;h3 id=&#34;職につく&#34;&gt;職につく&lt;/h3&gt;
&lt;p&gt;厳密には達成してないことになるのかな？&lt;/p&gt;
&lt;p&gt;1月末に&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/31/start-freelance/&#34;&gt;フリーランスはじめました(仮)&lt;/a&gt;という記事を書きましたが、
そのまま、現時点では個人事業主でフリーランスとして4社ほどお手伝いさせていただいています。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;お手伝いしてるお客さんの事例が出てた。直接的に類似画像検索の部分を手伝ってるわけではないんですが、Azure Cognitive Searchの調査とかやってます。 / 「ハッカソン」で社外の知見を積極的に活用! 富士フイルムソフトウエアが実践するサービス開発の理想形 - &lt;a href=&#34;https://t.co/yDIwYmYDBM&#34;&gt;https://t.co/yDIwYmYDBM&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1273809408875622400?ref_src=twsrc%5Etfw&#34;&gt;June 19, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;名前出てた。ZOZOさんの手伝いさせていただいております。 / ZOZOTOWNにおける検索速度改善までの道のり - ZOZO Technologies TECH BLOG - &lt;a href=&#34;https://t.co/OqaFMYe0TY&#34;&gt;https://t.co/OqaFMYe0TY&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1296269326962417669?ref_src=twsrc%5Etfw&#34;&gt;August 20, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;こんな感じです。
コロナウィルスの影響もあり、完全リモートで仕事をさせていただいています。
感謝しかないです。&lt;/p&gt;
&lt;h4 id=&#34;ブログプラットフォームの移行&#34;&gt;ブログプラットフォームの移行&lt;/h4&gt;
&lt;p&gt;昨年の振り返りの時点で目を付けていたHugoへの乗り換えを行いました。
乗り換えについてもまとめてあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/16/moving-to-hugo/&#34;&gt;OctopressからHugoへ移行中(まだ途中)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/22/intro-hugo-and-theme/&#34;&gt;ブログ移行日記(その1) - Hugoとテーマ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/23/convert-md-from-octopress-to-hugo/&#34;&gt;ブログ移行日記(その2) - Markdownファイルの変換&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/24/setting-hugo/&#34;&gt;ブログ移行日記(その3) - Hugoの設定と微調整(テーマに合わせた)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/28/introduce-algolia/&#34;&gt;ブログ移行日記(その4) - 検索機能(Algolia)の導入&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/02/21/import-jugem-posts/&#34;&gt;ブログ移行日記(その5) - Jugemのブログを移行&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;無事移行できて、特に困ってない感じです。&lt;/p&gt;
&lt;h4 id=&#34;プログラミング&#34;&gt;プログラミング&lt;/h4&gt;
&lt;p&gt;昨年よりは書いた気がしています。
まぁ、書きなぐって放置してるのもありますが。。。&lt;/p&gt;
&lt;p&gt;細々としたツールがいくつか。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo&#34;&gt;from-octopress-to-hugo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/bulk2es-rs&#34;&gt;bulk2es-rs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/azure-search-analyze-client&#34;&gt;azure-search-analyze-client&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/wiki-extractor-rs&#34;&gt;wiki-extractor-rs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/kuromoji-graphviz-output&#34;&gt;kuromoji-graphviz-output&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/kuromoji-cli&#34;&gt;kuromoji-cli&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;あとは、Linderaという形態素解析も手伝ってみました。
ちょっと後半は忙しくなり、コーディングが減ってるんで、また復活させないと。&lt;/p&gt;
&lt;h4 id=&#34;rust再入門&#34;&gt;Rust再入門&lt;/h4&gt;
&lt;p&gt;Tantivyは結局触れてないけど、&lt;a href=&#34;https://github.com/lindera-morphology/&#34;&gt;Lindera&lt;/a&gt;を手伝えました。あとは、ちょっとしたツール(bulk2es-rs)なども作りました。
知り合いとやっていたRust the bookを読むのも一通り終わりました。
Linderaまわりのリファクタとかを年明けにやろうかな?&lt;/p&gt;
&lt;h4 id=&#34;検索の勉強&#34;&gt;検索の勉強&lt;/h4&gt;
&lt;p&gt;仕事になりました。というか、しました。
ブッチャー本も買ったんですが、手を付けられてないので、年明けから心機一転、よみ始めようと思います。&lt;/p&gt;
&lt;h4 id=&#34;検索技術勉強会の継続&#34;&gt;検索技術勉強会の継続&lt;/h4&gt;
&lt;p&gt;残念ながらだめでした。
年初にスピーカーの方に連絡は入れて履いたのですが、コロナウイルスの影響で
今年はオフラインの勉強会は無理だろうとい事で延期したままです。
オンラインの勉強会もいくつか開催されていましたが、検索技術勉強会は残念ながらモチベーションもわかずのまま今年も終わってしまいました。
単に話を聴くセミナーのようなものよりは、Podcastのような形を取るのがいいのかもなぁとは思っているのですが。。。
だれか、サクッと話したい人いたらやってみませんか?&lt;/p&gt;
&lt;h2 id=&#34;振り返り今年あったできごと&#34;&gt;振り返り(今年あったできごと)&lt;/h2&gt;
&lt;p&gt;さて、ここからは今年の出来事を。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自宅環境の改善&lt;/li&gt;
&lt;li&gt;Windowsへの移行&lt;/li&gt;
&lt;li&gt;キーボードDIY&lt;/li&gt;
&lt;li&gt;フリーランス&lt;/li&gt;
&lt;li&gt;ブログ書いたなぁ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3月以降はずーっと自宅で仕事してました。
ということで、自宅の環境がどんどんアップデートされていった1年でした。
最終バージョンは年内に間に合わなくて、年明けに書きますが。。。
途中経過はこんな感じでした。今は更に変わっていますが。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/26/working-facility/&#34;&gt;3月バージョン&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/09/08/update-working-facility/&#34;&gt;9月バージョン&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;12月バージョンでも書きますが、ずっと自宅で作業だったのもあり、自作PCをやりたくなったので、久々にWindowsに帰ってきました。Ubuntuもチョット検討しましたが、Windowsに今は落ち着いています。自作PCはこんな感じ。
自作PCブログも後で書きますね。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;設置完了してこんな感じ。なんかベンチマーク走らせるかなぁ。何がいいだろ &lt;a href=&#34;https://t.co/aZufAE9fJA&#34;&gt;pic.twitter.com/aZufAE9fJA&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1334667407265165313?ref_src=twsrc%5Etfw&#34;&gt;December 4, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/10/15/restart-windows/&#34;&gt;Windowsをお試し中&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/10/18/restart-windows-no1/&#34;&gt;Windowsへの移行（その１）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AutoHotKeyで色々と弄っているので、素のWindowsは触れる気がしないけど。。。&lt;/p&gt;
&lt;p&gt;自作つながりで、キーボードもDIYしました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/10/11/build-dozen0/&#34;&gt;Dozen0を作成した&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/11/05/build-corne-light-v2/&#34;&gt;Corne Light v2を作成した&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/12/03/build_corne_choc/&#34;&gt;Corne Chocolateを組み立てた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kochikeyboard.stores.jp/items/5fcb8040df5159606b8c5d74&#34;&gt;Sofle Keyboard&lt;/a&gt;も組み立てた(けど、ビルドブログはまだ)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;分離キーボードには昨年から興味があったのですが、手を付けていませんでした。
今年は自宅でずっと作業でしたから、これを機会に作ってみました。
既製品(&lt;a href=&#34;https://www.zsa.io/moonlander/&#34;&gt;Moonlander&lt;/a&gt;)も気になってはいたのですが、DIYキーボードはプラモデル感覚で作れそうだし面白そうだなと。
今年一番ハマったものかもしれないです。
知り合いが始めた&lt;a href=&#34;https://kochikeyboard.stores.jp/&#34;&gt;Kochi Keyboard&lt;/a&gt;で最初に発売されたのがCorne Light v2だったので、これが初めての分割キーボードです。
40%キーボードからいきなり入ったので最初はかなり大変でしたが、なれると入力が早くなる気がします。ホームポジションからほぼ動かないのはいいですね。最初は数字列がないのでアホか???と思っていましたが。
今は、Sofle(60%キーボード)がメインになっています。40%から60%に移行すると
数字のキーが遠いなと思ってしまいますねw&lt;/p&gt;
&lt;p&gt;どうなるものかと思いつつ、フリーランスを続けています。
最初に仕事をいただいた富士フイルムソフトウェアさんには非常にお世話になっています(今もお手伝いさせてもらっています、ありがたい)。来年も精進していきます!&lt;/p&gt;
&lt;p&gt;今年はブログを書きました、最後はちょっと息切れしてる感じになってるけど。。。
もっとカジュアルに書くようにしないとなぁ。
年明けにまだ書いてないブログを書いていかないと。「自作PCブログ」「Sofleのビルドブログ」「2020年買ってよかったブログ」とか。&lt;/p&gt;
&lt;h2 id=&#34;来年の抱負&#34;&gt;来年の抱負&lt;/h2&gt;
&lt;p&gt;ということで、来年の抱負です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;フリーランス継続?&lt;/li&gt;
&lt;li&gt;プログラミング&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;p&gt;プログラミングは今年の後半はスローダウンしてしまったのでがんばらないと。
検証用のコードやちょっとしたツールを書くほうが多いので、もう少し継続してメンテナンスするようなものも書きたいなぁと。&lt;/p&gt;
&lt;p&gt;検索の勉強はまずはブッチャー本を買ってしまったので、ここからでしょうか。
値段も厚みもすごいので、コツコツ元を取れるようにがんばります。。。&lt;/p&gt;
&lt;p&gt;来年もまだまだ自宅で仕事が続きそうなので、勉強会というよりもポッドキャストみたいなものをやるのがいいのかもなと。
2020年初にやらせていただいた、「&lt;a href=&#34;https://blog.johtani.info/blog/2020/02/10/explore-search-system/&#34;&gt;検索システム探訪&lt;/a&gt;」をポッドキャスト風にやるのもありなのかもなぁ。
興味ある人いたら連絡ください。公開しない雑談とかもありだと思ってるので。&lt;/p&gt;
&lt;p&gt;今年は色々ありましたが、無事に乗り切れました。
気軽にランチなどで遊びに行けない状況ですが、雑談相手になっていいなと思う方、連絡お待ちしています。&lt;/p&gt;
&lt;p&gt;さて、来年はどんなキーボード作るのかなぁ(え?また作るの??)。
今後もよろしくおねがいしまーす!&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Index Template V2</title>
      <link>https://blog.johtani.info/blog/2020/12/17/index_template_v2/</link>
      <pubDate>Thu, 17 Dec 2020 23:55:55 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/12/17/index_template_v2/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://qiita.com/advent-calendar/2020/elasticsearch&#34;&gt;Elastic stack (Elasticsearch) Advent Calendar 2020&lt;/a&gt;の18日目の記事になります。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://noti.st/johtani/aa1gAo/index-template-v2&#34;&gt;本日の勉強会でLT&lt;/a&gt;をしましたが、しゃべり足りなかったんで。
Elasticsearch 7.8でこっそりとリリースされたIndex Template V2について調べたのでどんなものかをまとめてみます。
リリースブログには出てきてない（&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/7.8/release-highlights.html#add-composable-index-templates&#34;&gt;7.8のEsのページのWhat&amp;rsquo;s newには出てた&lt;/a&gt;）ので気づいてない人も多いのではないでしょうか？&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://qiita.com/advent-calendar/2020/elasticsearch&#34;&gt;Elastic stack (Elasticsearch) Advent Calendar 2020&lt;/a&gt;の18日目の記事になります。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://noti.st/johtani/aa1gAo/index-template-v2&#34;&gt;本日の勉強会でLT&lt;/a&gt;をしましたが、しゃべり足りなかったんで。
Elasticsearch 7.8でこっそりとリリースされたIndex Template V2について調べたのでどんなものかをまとめてみます。
リリースブログには出てきてない（&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/7.8/release-highlights.html#add-composable-index-templates&#34;&gt;7.8のEsのページのWhat&amp;rsquo;s newには出てた&lt;/a&gt;）ので気づいてない人も多いのではないでしょうか？&lt;/p&gt;
&lt;h2 id=&#34;index-templateとは&#34;&gt;Index Templateとは？&lt;/h2&gt;
&lt;p&gt;まずはIndex Templateがどんなものかを説明しましょう。&lt;/p&gt;
&lt;p&gt;Indexの設定やマッピングはデフォルト値以外を設定したい場合に、毎回&amp;quot;mappings&amp;quot;や&amp;quot;settings&amp;quot;の設定を指定してIndexを作成するのは手間がかかります。
そこで便利な機能として提供されているのがIndex Templateです。このIndex TemplateはCluster Stateに保管されます。&lt;/p&gt;
&lt;p&gt;Index Templateを利用するときの流れは以下の通りです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Index Templateの作成&lt;/li&gt;
&lt;li&gt;Indexの作成&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;例えば、3ノード構成のクラスターでインデックスを作成するときに常に&amp;quot;number_of_shards: 3&amp;quot;を設定したいとします。
Index Templateは次のような感じになります。&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;PUT&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_template&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;blog_num_shards&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:#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;blog_*&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:#e6db74&#34;&gt;&amp;#34;settings&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;index&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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:#ae81ff&#34;&gt;3&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;または日本語のシンプルな形態素解析のアナライザーの設定を&amp;quot;jp_&amp;ldquo;という名前でるようできるようにしたい場合には次のような感じになります。&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;PUT&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_template&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;jp_simple_kuromoji&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:#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;jp_&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:#e6db74&#34;&gt;&amp;#34;settings&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;index&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;analysis&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;simple_jp&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;custom&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:#e6db74&#34;&gt;&amp;#34;tokenizer&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&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&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;インデックステンプレートの登録が終われば、インデックスを作成するタイミングでIndex Templateが適用されます。
例えば、&lt;code&gt;blog_2020&lt;/code&gt;というインデックスを作成すると、&lt;code&gt;number_of_shards: 3&lt;/code&gt;のインデックスが作成されます（デフォルトは&lt;code&gt;1&lt;/code&gt;）。
&lt;code&gt;jp_blog_2020&lt;/code&gt;というインデックスを作成すると、&lt;code&gt;simple_jp&lt;/code&gt;というAnalyzerが設定されています。
このように、インデックス名を意識するだけで設定が適用されていくのが利点です。&lt;/p&gt;
&lt;p&gt;ちなみに、Index TemplateはIndex作成時に適用されるだけなので、Index Templateを変更してもこれまでのインデックスへは影響はありません。&lt;/p&gt;
&lt;h2 id=&#34;これまでのindex-templateの問題点&#34;&gt;これまでのIndex Templateの問題点&lt;/h2&gt;
&lt;p&gt;と、Index Templateが便利なのはわかりましたが、ではなぜ今回V2がリリースされたのでしょうか？
先ほどの例を見るとわかりますが、これまでのIndex Templateは部品化が難しいのが問題でした。
Index Templateはそれぞれがインデックスの作成時に適用されます。
が、Index TemplateにIndex Templateを組み込むことはできません。
例えば、先ほどサンプルとして作成した&lt;code&gt;jp_simple_kuromoji&lt;/code&gt;のIndex Templateは&lt;code&gt;jp_&lt;/code&gt;で始まるインデックスにしか適用できません。&lt;/p&gt;
&lt;p&gt;では、&lt;code&gt;blog_&lt;/code&gt;で始まるインデックスにもkuromojiのシンプルなアナライザーを使いたくなった場合はどうなるでしょう？
残念ながら、&lt;code&gt;jp_simple_kuromoji&lt;/code&gt;と同じ設定を&lt;code&gt;blog_num_shards&lt;/code&gt;のテンプレートに追加するか、&lt;code&gt;jp_simple_kuromoji&lt;/code&gt;の&lt;code&gt;index_patterns&lt;/code&gt;の部分だけを書き換えた新しいテンプレートを用意するか、&lt;code&gt;jp_simple_kuromoji&lt;/code&gt;の&lt;code&gt;index_patterns&lt;/code&gt;に&lt;code&gt;jp_&lt;/code&gt;を追加する方法です。
いずれにしてもIndex Templateの継承（複数のテンプレートを1つのインデックスに紐づける）が必要となります。
この時、複数のIndex Templateが適用されるため、適用する順番が出てきます。
この順番をIndex Templateの&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/7.10/indices-templates-v1.html#put-index-template-v1-api-query-param&#34;&gt;&lt;code&gt;order&lt;/code&gt;パラメータ&lt;/a&gt;で指定できます。&lt;/p&gt;
&lt;p&gt;ただ、これも問題のもととなっていました。
複数あるIndex Templateのどれがどの順番で適用されるのか？それはインデックスを作成時にようやくわかります。
使いたい側（インデックス）が、使いたいもの（テンプレート）を指定するのではなく、その逆（使いたいものに使いたい側の情報を設定しなくてはならない（&lt;code&gt;index_patterns&lt;/code&gt;や&lt;code&gt;order&lt;/code&gt;））になっているのでわかりにくくなっていました。&lt;/p&gt;
&lt;p&gt;ということで解決策としてリリースされたのがIndex Template V2です（ちなみに名前にV2とは言ってるわけではなく、現在のIndex Templateの機能がlegacy index templateという名前になり、Deprecatedになっています（まだログには出ない））。&lt;/p&gt;
&lt;h2 id=&#34;index-template-v2&#34;&gt;Index Template V2&lt;/h2&gt;
&lt;p&gt;7.8のWhat&amp;rsquo;s newドキュメントではComposable Index Templateと紹介されています。
大きく3つのエンドポイントが提供されます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Component Template 用API
&lt;ul&gt;
&lt;li&gt;テンプレートのコンポーネントという単位で管理するためのAPI。&lt;/li&gt;
&lt;li&gt;登録更新、削除、取得が可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Index Template 用API
&lt;ul&gt;
&lt;li&gt;Index Templateを管理するためのAPI&lt;/li&gt;
&lt;li&gt;登録更新、削除、取得が可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Simulate index template API(Experimental)
&lt;ul&gt;
&lt;li&gt;Index Template&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Legacy Index Templateとの大きな違いは、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;テンプレートをコンポーネントにできる&lt;/li&gt;
&lt;li&gt;1つのインデックスに適用されれるテンプレートは&lt;strong&gt;1つ&lt;/strong&gt;だけ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;という点です。これまでとは挙動が異なるので注意が必要です。&lt;/p&gt;
&lt;p&gt;新しいIndex Templateを利用する際の流れは次のようになります。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Component Templateの作成&lt;/li&gt;
&lt;li&gt;Index Templateの作成&lt;/li&gt;
&lt;li&gt;作成したIndex Templateの挙動を確認&lt;/li&gt;
&lt;li&gt;実際にIndex名を指定してIndex Templateの挙動を確認&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;という形です。では、それぞれの機能を見ていきましょう。&lt;/p&gt;
&lt;h3 id=&#34;coponent-template-api&#34;&gt;Coponent Template API&lt;/h3&gt;
&lt;p&gt;テンプレートコンポーネントを管理するためのAPIです。
具体的なAPIごとに説明していきます。&lt;/p&gt;
&lt;h4 id=&#34;put-_component_template&#34;&gt;PUT _component_template&lt;/h4&gt;
&lt;p&gt;コンポーネントを登録、変更するためのAPIです。&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/7.10/indices-component-template.html&#34;&gt;公式ドキュメントはこちらです。&lt;/a&gt;
先ほどのkuromojiのAnalzyerをコンポーネントとして登録してみましょう。&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;PUT&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_component_template&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;jp_simple_kuromoji&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:#e6db74&#34;&gt;&amp;#34;template&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;settings&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;index&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;analysis&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;analyzer&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;simple_jp&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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;custom&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:#e6db74&#34;&gt;&amp;#34;tokenizer&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_tokenizer&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;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&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:#e6db74&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;_meta&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;description&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;simpleなKuromoji analyzer&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;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;template&lt;/code&gt;という階層が1段増え、&lt;code&gt;index_patterns&lt;/code&gt;がなくなりました。
&lt;code&gt;template&lt;/code&gt;部分はIndexに設定する&lt;code&gt;settings&lt;/code&gt;、&lt;code&gt;mappings&lt;/code&gt;、&lt;code&gt;aliases&lt;/code&gt;が指定可能です。
ちなみに、&amp;ldquo;template&amp;quot;の中身をそのままIndex作成時に使用した場合にエラーにならない設定である必要があります。
ここは注意が必要です。例えば、component Aでkuromojiのアナライザーの設定をし、component Bでそのアナライザーを使用するフィールドのmappingだけを記述した場合、component Bでエラーが発生します。上記のようなシチュエーションでは、Index Templateで利用するフィールドを定義し、component Aを利用する宣言をすれば問題ありません。&lt;/p&gt;
&lt;p&gt;そのほかに使えるパラメータで便利なものを紹介しておきます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;クエリパラメータ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;create&lt;/code&gt;: URLに指定するパラメータ。&lt;code&gt;true&lt;/code&gt;を指定することで、既に存在する場合にエラーを返してくれる。更新も同じAPIなので間違わないようにするために利用すると便利。デフォルトは&lt;code&gt;false&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;リクエストボディ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;_meta&lt;/code&gt;: テンプレートにメタ情報を付与できる。&lt;code&gt;_meta&lt;/code&gt;の中は自由に記述可能。コメントなどを書いておくとあとでわかりやすい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;get-_component_template&#34;&gt;GET _component_template&lt;/h4&gt;
&lt;p&gt;コンポーネントを取得するためのAPIです。&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/7.10/getting-component-templates.html&#34;&gt;公式ドキュメントはこちらです。&lt;/a&gt;
一覧での取得とリストでの取得が可能です。&lt;/p&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;GET&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_component_template&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;GET&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_component_template&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これ以外に、IDを指定して取得することも可能です。&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;GET&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_component_template&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;jp_simple_kuromoji&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;を利用して複数取得も可能です。&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;GET&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_component_template&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;jp&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#a6e22e&#34;&gt;GET&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_component_template&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;j&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;delete-_component_template&#34;&gt;DELETE _component_template&lt;/h4&gt;
&lt;p&gt;コンポーネントを削除するためのAPIです。&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/7.10/indices-delete-component-template.html&#34;&gt;公式ドキュメントはこちらです。&lt;/a&gt;
IDを指定してコンポーネントを削除できます。&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;DELETE&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_component_template&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;jp_simple_kuromoji&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ID指定以外に&lt;code&gt;*&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;DELETE&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_component_template&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;jp_&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#a6e22e&#34;&gt;DELETE&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_component_template&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ちなみにIndex Templateで利用されているコンポーネントを削除しようとした場合はエラー（ステータスコード400）が返ってきます。
&lt;code&gt;*&lt;/code&gt;などを使用して削除しようとした場合は、ひとつでも利用されているものが含まれている場合は削除は実行されずにエラーだけが返ってくるようになっています。&lt;/p&gt;
&lt;h3 id=&#34;index-template-api&#34;&gt;Index Template API&lt;/h3&gt;
&lt;p&gt;Index Templateを管理するためのAPIです。
Component Template APIで定義したコンポーネントを利用してテンプレートを作成できます。コンポーネントを利用しないで単体で完結したテンプレートも作成可能です。
具体的なAPIごとに説明していきます。&lt;/p&gt;
&lt;h4 id=&#34;put-_index_template&#34;&gt;PUT _index_template&lt;/h4&gt;
&lt;p&gt;Index Templateを登録・更新するためのAPIです。&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/7.10/indices-put-template.html&#34;&gt;公式ドキュメントはこちらです。&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;これまでのLegacy Index TemplateのAPIのエンドポイント(&lt;code&gt;_template&lt;/code&gt;)ではなく、(&lt;code&gt;_index_template&lt;/code&gt;)というエンドポイントになっていることにまず注意してください。
先ほど作成した&lt;code&gt;jp_simple_kuromoji&lt;/code&gt;コンポーネントと、追加で作成した&lt;code&gt;3_shards&lt;/code&gt;というコンポーネントを利用して
&lt;code&gt;blog_&lt;/code&gt;で始まるインデックスに適用できるIndex Templateを作成してみましょう。&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;PUT&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;blog_template&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:#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;blog_*&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:#e6db74&#34;&gt;&amp;#34;template&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;mappings&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;properties&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;hoge&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&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;simple_jp&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;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:#e6db74&#34;&gt;&amp;#34;priority&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&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:#e6db74&#34;&gt;&amp;#34;composed_of&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;jp_simple_kuromoji&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;3_shards&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;code&gt;composed_of&lt;/code&gt;というパラメータに利用したいコンポーネントを配列で記述していきます。
Index Templateが適用される時に、ここに記述されている順番でコンポーネントが適用されていきます。
ですので、最後に書いてあるテンプレートが一番強いことになります。
これは例えば、同じ設定値&lt;code&gt;number_of_shards&lt;/code&gt;を2つのコンポーネントが設定している場合に、最後に設定した値がインデックスに採用されるという意味です
(&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/7.10/indices-put-template.html#multiple-component-templates&#34;&gt;公式ドキュメントにサンプルが掲載されています&lt;/a&gt;)。
なお、存在しないコンポーネントを&lt;code&gt;composed_of&lt;/code&gt;に指定した場合は400エラーが返ってきます。同じコンポーネントを複数重複して指定した場合は特にエラーにはなりませんでした。
&lt;code&gt;composed_of&lt;/code&gt;を指定しなければ、単体で完結したテンプレートを定義可能です。&lt;/p&gt;
&lt;p&gt;次に重要な設定は&lt;code&gt;priority&lt;/code&gt;です。これまでのテンプレート機能と異なる点で説明しましたが、&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1つのインデックスに適用されれるテンプレートは&lt;strong&gt;1つ&lt;/strong&gt;だけ
となっています。
この1つを決めるための値が&lt;code&gt;priority&lt;/code&gt;になります。
インデックス名によっては&lt;code&gt;index_pattern&lt;/code&gt;の定義によって、複数のIndex Templateにマッチします。例えば&lt;code&gt;blog_*&lt;/code&gt;と&lt;code&gt;*_2020&lt;/code&gt;のIndex Templateがあった場合に&lt;code&gt;blog_2020&lt;/code&gt;というインデックスを作った場合です。
この時、Elasticsearchは&lt;code&gt;priority&lt;/code&gt;の大きい値を持ったIndex Template&lt;strong&gt;だけ&lt;/strong&gt;を適用します。
&lt;code&gt;blog_*&lt;/code&gt;のIndex Templateの&lt;code&gt;property&lt;/code&gt;が&lt;code&gt;10&lt;/code&gt;、&lt;code&gt;*_2020&lt;/code&gt;のIndex Templateの&lt;code&gt;property&lt;/code&gt;が&lt;code&gt;100&lt;/code&gt;だった場合、&lt;code&gt;*_2020&lt;/code&gt;のテンプレートが適用されます。Legacy Index Templateでは&lt;code&gt;order&lt;/code&gt;という似たパラメータがありましたが、こちらは適用する&lt;strong&gt;順序&lt;/strong&gt;を決定するためのものでした。挙動が違うので注意しましょう。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ちなみに、&lt;code&gt;blog_*&lt;/code&gt;と&lt;code&gt;*_2020&lt;/code&gt;の&lt;code&gt;property&lt;/code&gt;がどちらも&lt;code&gt;10&lt;/code&gt;というIndex TemplateをPUTしようとした場合、2番目にIndex TemplateをPUTするタイミングでエラーが返ってきます。&lt;/p&gt;
&lt;p&gt;そのほかに使えるパラメータで便利なものはPUT _component_templateと同様に&lt;code&gt;create&lt;/code&gt;と&lt;code&gt;_meta&lt;/code&gt;です。&lt;/p&gt;
&lt;h4 id=&#34;get-_index_template&#34;&gt;GET _index_template&lt;/h4&gt;
&lt;p&gt;Index Templateを取得するためのAPIです。&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/7.10/indices-get-template.html&#34;&gt;公式ドキュメントはこちらです。&lt;/a&gt;
一覧での取得とリストでの取得が可能です。&lt;/p&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;GET&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;GET&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これ以外に、IDを指定して取得することも可能です。&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;GET&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;blog_template&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;を利用して複数取得も可能です。&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;GET&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;blog_&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#a6e22e&#34;&gt;GET&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;b&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;delete-_index_template&#34;&gt;DELETE _index_template&lt;/h4&gt;
&lt;p&gt;Index Templateを削除するためのAPIです。&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/7.10/indices-delete-template.html&#34;&gt;公式ドキュメントはこちらです。&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;IDを指定してコンポーネントを削除できます。&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;DELETE&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_component_template&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;jp_simple_kuromoji&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ID指定以外に&lt;code&gt;*&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;DELETE&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_component_template&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;jp_&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#a6e22e&#34;&gt;DELETE&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_component_template&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最後のサンプルを実行すると、Elasticのツールなどが登録したIndex Template以外はすべて削除されてしまうので本当に気を付けましょう。&lt;/p&gt;
&lt;h3 id=&#34;simulalte-api&#34;&gt;Simulalte API&lt;/h3&gt;
&lt;p&gt;さて、コンポーネントとテンプレートを作成したので確認をしましょう。
Legacy Index Templateでは確認するためには実際にインデックスを作成するしかありませんでしたが、V2ではSimulate APIが用意されています。
このSimulate APIには2つのAPIがあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;POST /_index_template/_simulate/&amp;lt;テンプレート名&amp;gt;&lt;/li&gt;
&lt;li&gt;POST /_index_template/_simulate_index/&amp;lt;インデックス名&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Index Templateの確認のためのAPIとインデックス名を指定したときに出来上がるIndexの設定を確認するためのAPIです。
Indexを実際に作成しなくても確認できるのは便利ですね。&lt;/p&gt;
&lt;p&gt;例えば先ほど作成した&lt;code&gt;blog_template&lt;/code&gt;を試してみましょう。&lt;/p&gt;
&lt;h4 id=&#34;_index_template_simulate-api&#34;&gt;_index_template/_simulate API&lt;/h4&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;POST&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;_simulate&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;blog_template&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-js&#34; data-lang=&#34;js&#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:#e6db74&#34;&gt;&amp;#34;template&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;settings&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;index&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;analysis&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;analyzer&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;simple_jp&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;filter&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;kuromoji_readingform&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;span style=&#34;display:flex;&#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;custom&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:#e6db74&#34;&gt;&amp;#34;tokenizer&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_tokenizer&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;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:#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&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:#e6db74&#34;&gt;&amp;#34;mappings&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;properties&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;hoge&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&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;simple_jp&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;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:#e6db74&#34;&gt;&amp;#34;aliases&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;overlapping&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;name&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;blog_template2&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:#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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;blog_*&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;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;template&lt;/code&gt;にコンポーネントがマージされた結果が出力されます。
&lt;code&gt;overlapping&lt;/code&gt;は&lt;code&gt;index_patterns&lt;/code&gt;がかぶる可能性があるIndex Templateの情報が出力されます。
サンプル用に&lt;code&gt;blog_template2&lt;/code&gt;という、同じ&lt;code&gt;index_patterns&lt;/code&gt;で&lt;code&gt;priority&lt;/code&gt;が低いものを登録してあるためです。
&lt;code&gt;index_patterns&lt;/code&gt;が完全に同じではなくとも、重複する可能性があるものはここに出力されます。
例えば、&lt;code&gt;index_patterns&lt;/code&gt;が&lt;code&gt;b*&lt;/code&gt;という別のIndex Templateを作成してからSimulate APIを実行すると、&lt;code&gt;overlapping&lt;/code&gt;にそのIndex Templateも出力されます。&lt;/p&gt;
&lt;p&gt;Simulate Index Template APIのもう一つの機能は登録前のIndex Templateの確認です。
リクエストのURLのテンプレート名をなくし、&lt;code&gt;PUT _index_template&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;POST&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;_simulate&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:#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;blog_*&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:#e6db74&#34;&gt;&amp;#34;template&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;mappings&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;properties&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;hoge&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&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;simple_jp&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;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:#e6db74&#34;&gt;&amp;#34;priority&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&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:#e6db74&#34;&gt;&amp;#34;composed_of&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;jp_simple_kuromoji&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;code&gt;index_patterns&lt;/code&gt;がかぶるものがある場合は&lt;code&gt;overlapping&lt;/code&gt;も一緒に返却されます。&lt;/p&gt;
&lt;h4 id=&#34;_index_template_simulate_index-api&#34;&gt;_index_template/_simulate_index API&lt;/h4&gt;
&lt;p&gt;今度はインデックス名を指定するSimulate APIを試してみましょう。&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;POST&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;_simulate_index&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;blog_2021&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-js&#34; data-lang=&#34;js&#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:#e6db74&#34;&gt;&amp;#34;template&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;settings&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;index&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;analysis&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;analyzer&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;simple_jp&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;filter&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;kuromoji_readingform&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;span style=&#34;display:flex;&#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;custom&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:#e6db74&#34;&gt;&amp;#34;tokenizer&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_tokenizer&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;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:#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&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:#e6db74&#34;&gt;&amp;#34;mappings&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;properties&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;hoge&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&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;simple_jp&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;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:#e6db74&#34;&gt;&amp;#34;aliases&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;overlapping&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;name&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;fuga&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:#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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;b*&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;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:#e6db74&#34;&gt;&amp;#34;name&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;2021&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:#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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;*_2021&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;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;例で作成した&lt;code&gt;blog_template&lt;/code&gt;が適用されていますが、それ以外に&lt;code&gt;index_patterns&lt;/code&gt;に合致したが&lt;code&gt;priority&lt;/code&gt;が低くて適用されなかったものが&lt;code&gt;overlapping&lt;/code&gt;に出力されています。
実際に適用されたテンプレートの名前も別途出力してくれるとわかりやすいかもしれないですね。
(&lt;code&gt;*_2021&lt;/code&gt;というインデックスパターンのテンプレートを試しに作ってみたのですが、これはバグがありそうです。&lt;code&gt;2021&lt;/code&gt;に合致するインデックス名をSimulateしたら&lt;code&gt;overlapping&lt;/code&gt;に合致しないものがたくさん出てきました。バグ報告しとくか)。&lt;/p&gt;
&lt;h3 id=&#34;kibana対応&#34;&gt;Kibana対応&lt;/h3&gt;
&lt;p&gt;ここまで、Index Template V2のAPIの説明でしたが、Kibanaでの対応についても調べてみました。&lt;/p&gt;
&lt;h4 id=&#34;index-managementstack-management機能elasticライセンスが必要だが無償の機能&#34;&gt;Index Management（Stack Management機能。Elasticライセンスが必要だが無償の機能）&lt;/h4&gt;
&lt;p&gt;7.9からKibanaの&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/7.10/index-mgmt.html&#34;&gt;Index管理画面&lt;/a&gt;でComposable Templateが利用できるようになっています（&lt;a href=&#34;https://github.com/elastic/kibana/pull/70220&#34;&gt;GitHub Issue&lt;/a&gt;）。
画面のスクショを一通り貼っておきます。残念ながら、それぞれのJSONの編集部分では補完などはサポートされていないようでした。
頑張って自分でsettingsやmappingsのJSONを記述していく感じになります。JSONとして正しいかどうかはチェックしてくれます。
Index Templateのウィザードでは、ボタンでコンポーネントを追加したり削除したり、順序を入れ替えたりといった作業が可能になっています。
また、プレビュー表示が可能なので、&lt;code&gt;composed_of&lt;/code&gt;で選択したものが今どのように適用されているか？といったのも確認できるようになっていました。
結構便利に管理できそうです。ちなみにスクショは7.10の画面になります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Component Template周り
&lt;ul&gt;
&lt;li&gt;一覧表示とウィザード&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;

&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:300px&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20201218/list_component_template.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20201218/list_component_template.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;



&lt;div class=&#34;box&#34; style=&#34;max-width:300px&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20201218/component_template_wizard1.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20201218/component_template_wizard1.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;



&lt;div class=&#34;box&#34; style=&#34;max-width:300px&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20201218/component_template_wizard2.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20201218/component_template_wizard2.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;



&lt;div class=&#34;box&#34; style=&#34;max-width:300px&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20201218/component_template_wizard3.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20201218/component_template_wizard3.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;



&lt;div class=&#34;box&#34; style=&#34;max-width:300px&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20201218/component_template_wizard4.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20201218/component_template_wizard4.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Index Template周り
&lt;ul&gt;
&lt;li&gt;一覧表示とウィザード&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;

&lt;div class=&#34;box&#34; style=&#34;max-width:300px&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20201218/list_index_template.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20201218/list_index_template.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;



&lt;div class=&#34;box&#34; style=&#34;max-width:300px&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20201218/index_template_wizard1.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20201218/index_template_wizard1.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;



&lt;div class=&#34;box&#34; style=&#34;max-width:300px&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20201218/index_template_wizard2.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20201218/index_template_wizard2.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;



&lt;div class=&#34;box&#34; style=&#34;max-width:300px&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20201218/index_template_wizard3.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20201218/index_template_wizard3.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;



&lt;div class=&#34;box&#34; style=&#34;max-width:300px&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20201218/index_template_wizard4.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20201218/index_template_wizard4.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h4 id=&#34;consoledev-toolsossで利用可能&#34;&gt;Console(Dev Tools。OSSで利用可能)&lt;/h4&gt;
&lt;p&gt;リクエストを実行は可能ですが、自動補完機能は一部のみ対応しているようです(&lt;a href=&#34;https://github.com/elastic/kibana/issues/75967&#34;&gt;GitHub Issue&lt;/a&gt;)。&lt;/p&gt;
&lt;p&gt;対応済みの機能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DELETE _component_template&lt;/code&gt; (ただし、ここまで。存在するコンポーネント名は補完されない)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上記以外はまだ未対応のようです。
プルリクエストチャンスかも？&lt;/p&gt;
&lt;h2 id=&#34;参考&#34;&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues/53101&#34;&gt;Composable Templates · Issue #53101 · elastic/elasticsearch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/7.8/release-highlights.html#add-composable-index-templates&#34;&gt;What’s new in 7.8 | Elasticsearch Reference ［7.8］ | Elastic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/7.10/index-mgmt.html&#34;&gt;Index management | Elasticsearch Reference ［7.10］ | Elastic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/elastic/kibana/pull/70220&#34;&gt;［Composable template］ Create / Edit wizard by sebelga · Pull Request #70220 · elastic/kibana&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/elastic/kibana/issues/75967&#34;&gt;［Console］ Support suggesting index templates v2 · Issue #75967 · elastic/kibana&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ちょっと長くなってしまいましたが、新しいIndex Templateについての紹介でした。
これまでと違い、複数のテンプレートが適用されない点があるのでそこは注意が必要そうです。
コンポーネントをうまく使えば、管理が簡易化はされそうですね。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Index Template v2</title>
      <link>https://blog.johtani.info/presentation/2020/index-template-v2/</link>
      <pubDate>Thu, 17 Dec 2020 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2020/index-template-v2/</guid>
      <description></description>
      <content:encoded></content:encoded>
    </item>
    
    <item>
      <title>Corne Chocolateを組み立てた #DIYキーボード</title>
      <link>https://blog.johtani.info/blog/2020/12/03/build_corne_choc/</link>
      <pubDate>Thu, 03 Dec 2020 23:13:44 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/12/03/build_corne_choc/</guid>
      <description>&lt;p&gt;はじめまして、pyspa。
ということで、&lt;a href=&#34;https://adventar.org/calendars/5310&#34;&gt;pyspa Advent Calendar 2020&lt;/a&gt;の4日目(大谷コンビの2号)の投稿になります。
コンビそろってキーボード記事ですね。&lt;/p&gt;
&lt;p&gt;今年はDIYキーボードにはまった（はめられた？）年でした。
もともと分割キーボードには興味があり、自宅で作業するのが基本となったのもあり手を出した次第です。
まだまだ使いこなすところまでは来てないかもしれないですが、組み立てたり、問題点のキリ分けしたり、試行錯誤するのは楽しいなと。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;はじめまして、pyspa。
ということで、&lt;a href=&#34;https://adventar.org/calendars/5310&#34;&gt;pyspa Advent Calendar 2020&lt;/a&gt;の4日目(大谷コンビの2号)の投稿になります。
コンビそろってキーボード記事ですね。&lt;/p&gt;
&lt;p&gt;今年はDIYキーボードにはまった（はめられた？）年でした。
もともと分割キーボードには興味があり、自宅で作業するのが基本となったのもあり手を出した次第です。
まだまだ使いこなすところまでは来てないかもしれないですが、組み立てたり、問題点のキリ分けしたり、試行錯誤するのは楽しいなと。&lt;/p&gt;
&lt;p&gt;今回はCorne Chocolateというキーボードを組み立てたのでそちらのビルドログ（かつ今後のための教訓）になります。
LEDを使ったキーボードがどんなものなのか＋薄いキーボードも気になるなということで取り組んでみました。
今回もいくつか失敗をしつつ、リカバリーして動くものができました。&lt;/p&gt;
&lt;h2 id=&#34;パーツ材料&#34;&gt;パーツ（材料）&lt;/h2&gt;
&lt;p&gt;基本のパーツは今回も&lt;a href=&#34;https://kochikeyboard.stores.jp/&#34;&gt;Kochi Keyboard&lt;/a&gt;さんから購入しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;キット : &lt;a href=&#34;https://kochikeyboard.stores.jp/items/5f65ea9afbe5b52cac9ba2c0&#34;&gt;Corne Chocolate（ベースキット）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;キースイッチ : &lt;a href=&#34;https://kochikeyboard.stores.jp/items/5f9e6aaef0b1085ce18b76ff&#34;&gt;Kailh Choc v1 Blue (25gf リニア) 5個&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;キーキャップ : &lt;a href=&#34;https://yushakobo.jp/shop/pg1350cap-doubleshot/&#34;&gt;Kailhロープロ刻印キーキャップ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ケーブル類は家に転がっていたケーブルを利用しました。
キースイッチセットもあるのですが、軽いキータッチが好みなので、一番軽いKailh ChocのBlueを試してみたくキースイッチを個別に選択しました。
キーキャップは&lt;a href=&#34;https://yushakobo.jp/shop/shiro/&#34;&gt;Shiro&lt;/a&gt;を作るときに調達していたものを利用した形です。&lt;/p&gt;
&lt;p&gt;今回も&lt;a href=&#34;https://github.com/foostan/crkbd/blob/master/corne-chocolate/doc/buildguide_jp.md&#34;&gt;公式のビルドガイド&lt;/a&gt;にざっと目を通してから着手しました。&lt;/p&gt;
&lt;h2 id=&#34;準備&#34;&gt;準備&lt;/h2&gt;
&lt;p&gt;ビルドログにもあるようにPCBがリバーシルブなので、作業中に迷子にならないようにこんな感じで表にマスキングテープで目印をつけておきました。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20201204/marking.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20201204/marking.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;今回から耐熱ワーキングマットで作業をすることにしました。机の天板に傷つくの嫌だし。
気兼ねなくはんだできるのでおすすめです。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;&lt;a href=&#34;https://t.co/0qntPD8qIa&#34;&gt;https://t.co/0qntPD8qIa&lt;/a&gt;&lt;br&gt;2ヶ月ぐらいにここで買いました！&lt;/p&gt;&amp;mdash; 西田和史(k.bigwheel) (@k_bigwheel) &lt;a href=&#34;https://x.com/k_bigwheel/status/1326522825017057280?ref_src=twsrc%5Etfw&#34;&gt;November 11, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;h2 id=&#34;ダイオードoledソケットコンスルーtrrsソケット&#34;&gt;ダイオード、OLEDソケット、コンスルー、TRRSソケット、&lt;/h2&gt;
&lt;p&gt;こちらは前回のCorneとほぼ同様だったのでビルドガイド通りに進めます（写真撮り損ねました。。。）
前回との違いはダイオードの形です。
表面実装するタイプのダイオードなので向きに気を付けつつ、つけていきます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/foostan/crkbd/blob/master/corne-chocolate/doc/buildguide_jp.md#%E3%83%80%E3%82%A4%E3%82%AA%E3%83%BC%E3%83%89&#34;&gt;ビルドガイドに向きやダイオードのつけ方&lt;/a&gt;が紹介されています。
拡大鏡とピンセット必須ですね。
前回同様に、ここまででいったんqmk_toolsでファームウェアをインストールして、ピンセットを使いながらキーの認識とOLEDの動作確認を行いました。
今使っているファームウェアがあるのでそれを入れて問題ないかを確認しました。&lt;/p&gt;
&lt;h2 id=&#34;led実装&#34;&gt;LED実装&lt;/h2&gt;
&lt;p&gt;今回のメインイベントです（そして苦杯をなめたイベントでもあります）。
&lt;a href=&#34;https://github.com/foostan/crkbd/blob/master/corne-chocolate/doc/buildguide_jp.md#led%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3&#34;&gt;ビルドガイドにも記載&lt;/a&gt;がありますが、信号が流れる順番があるようなので1番から取り付けていきます。
また、ビルドガイドにLEDに関する注意事項もいくつか掲載されています。必ず読みましょう。&lt;/p&gt;
&lt;p&gt;この1～6までのLEDがすごく大変でした。。。&lt;/p&gt;
&lt;h3 id=&#34;表面実装のledunderglow-ledで四苦八苦&#34;&gt;表面実装のLED（Underglow LED）で四苦八苦&lt;/h3&gt;
&lt;p&gt;いくつかのブログを参考にしながら作業を進めました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://marksard.github.io/2018/08/04/make-the-crkbd/&#34;&gt;コルネキーボードを作りました ～LED取り付けに四苦八苦記～ | キオクノロンダリング&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;SK6812miniの仕様などについて書いてあります。デバッグするのにすごく役に立ちました。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://nok0714.hatenablog.com/entry/2019/03/02/194138&#34;&gt;Corne Chocolateビルドログ - nokの雑記&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;手書きでどんな感じでやればいいのかを解説してくれています。最終的にはこの方法が一番だったのかも？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://salicylic-acid3.hatenablog.com/entry/2018/11/26/%E8%87%AA%E4%BD%9C%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%82%AD%E3%83%83%E3%83%88%E3%80%8CCorne_Cherry%E3%80%8D%E3%81%AE%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC#%E7%B5%84%E7%AB%8B%E9%9B%A3%E6%98%93%E5%BA%A6&#34;&gt;自作キーボードキット「Corne Cherry」のレビュー - 自作キーボード温泉街の歩き方&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;あとで出てきますが、リカバリ方法の参考になりました。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;皆さん苦労されてますね、そして私も苦労しました。。。&lt;/p&gt;
&lt;p&gt;試してみた方法、考察は次の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LEDチェック用のファームウェアをインストールして1つつけては動作確認
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://qiita.com/yshr04hrk/items/c050a80ab5d2ff869db9#led%E3%83%86%E3%82%B9%E3%83%88%E7%94%A8%E3%83%95%E3%82%A1%E3%83%BC%E3%83%A0%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%92%E7%84%BC%E3%81%84%E3%81%A6%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D&#34;&gt;HelixのLEDテスト用ファームウェアをインストールしました&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://amzn.to/39Cyc07&#34;&gt;白光 1C型こて先&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;失敗した後にリカバリするために購入しました。&lt;/li&gt;
&lt;li&gt;LEDのランドなどが2Cよりも面積が小さいので、そのサイズに合わせたこて先のほうがよかったようです。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;はんだの温度（温調できるはんだごて必須）
&lt;ul&gt;
&lt;li&gt;最初は250℃でやっていましたが、なかなかはんだが溶けません。そのせいで焦りも出てきます。&lt;/li&gt;
&lt;li&gt;最終的には270度で作業しましたが、温度のせいでLEDが壊れたのはなかった気がします。1Cのこて先だったので無事だったのかもしれません。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;フラックスなし
&lt;ul&gt;
&lt;li&gt;あると楽だったのかも？残念ながら試してないです。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;予備はんだ手法（だめっぽかった）
&lt;ul&gt;
&lt;li&gt;基盤のランド4か所に予備はんだをし、はんだを温めつつLEDを乗せる方法&lt;/li&gt;
&lt;li&gt;LEDの裏にも予備はんだ&lt;/li&gt;
&lt;li&gt;どちらも試してみましたが、温めている個所以外のはんだと高さの違いが出てしまい、LEDが浮いてしまいます。4か所を同時に温めることはできないので、すこしずつ調整しているうちにLEDを物理的に壊してしまうことがありました。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;ちょっとコツが分かったかも？ &lt;a href=&#34;https://t.co/ruwrmEWCAe&#34;&gt;pic.twitter.com/ruwrmEWCAe&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1329446835505786880?ref_src=twsrc%5Etfw&#34;&gt;November 19, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;わかった気になっていますが結局失敗しました。。。&lt;/p&gt;
&lt;p&gt;結局最後までこれというコツはわかってない気がします。結局3つか4つのLEDがお亡くなりになりました。
うまくいかなかった原因は、予備はんだで傾きなどができ、それを修正していくうちに基盤やLEDにダメージを与えてしまったのだと思います。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20201204/broken_led_and_pcb.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20201204/broken_led_and_pcb.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;よく見ると基盤が一部剥がれかけてるのがわかるかなぁと。&lt;/p&gt;
&lt;h3 id=&#34;リカバリー&#34;&gt;リカバリー&lt;/h3&gt;
&lt;p&gt;右手側の表面実装の4番と5番が失敗しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;4番目（以下のツイート右側画像の上）
&lt;ul&gt;
&lt;li&gt;こちらは、1度付けたLEDをはがすときにはんだを取り除くのが不十分な状態でLEDをはがしたために、基板のランドごとはがれてしまいました。&lt;/li&gt;
&lt;li&gt;なのでここはLEDはつかないです。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;5番目(以下のツイート右側画像の真ん中あたりの黄色い線がつながっているLED)
&lt;ul&gt;
&lt;li&gt;LED自体はつけてありますが、青色しか発光しなくなっています。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;4番目が完全に死んでしまったので、無事な3番目のLEDのDINに流れている信号を
5番目のLEDのDINにも流れるようにするために10芯コードでショートカットさせました。
（リカバリ方法は先ほど紹介したブログが非常に参考になりました、先人の知恵ありがたし）。
黒い線も売っていたのですが、自戒も込めて目立つ色にしてみました。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;勉強させていただきました、、、 &lt;a href=&#34;https://t.co/Zp16fJKziM&#34;&gt;pic.twitter.com/Zp16fJKziM&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1330507767845711874?ref_src=twsrc%5Etfw&#34;&gt;November 22, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;ちなみに、左側のショートカットのコードはつけた後に1か所LEDの向きが違うことに気づき必要なくなっています
（上記の基盤が傷ついている画像をよく見ると上下が逆になってるのがわかる人にはわかるかも）。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;片方は導線なくて良くなった。表から見たら向きが違うのに気がついたわ、、、 &lt;a href=&#34;https://t.co/7TSDMPPxlX&#34;&gt;pic.twitter.com/7TSDMPPxlX&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1330511865827319809?ref_src=twsrc%5Etfw&#34;&gt;November 22, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;最終的に2か所おかしいLEDにはなりましたが、幸いにもアンダーグローです。
Kochi Keyboardさんで購入したキットのボトムプレートはFR4なのでほぼ見えません！（負け惜しみ）&lt;/p&gt;
&lt;h2 id=&#34;ソケット&#34;&gt;ソケット&lt;/h2&gt;
&lt;p&gt;さて、気を取り直してソケットをつけていきます。
Dozen0にて経験済みなのでそれほど手間はかかりませんでした。
LEDの失敗の時に1Cのこて先を購入していたため、ソケットの横の隙間からこて先が差し込めたのが便利でした（LEDでダメージを受けていたのもあり写真撮り忘れ）。&lt;/p&gt;
&lt;h2 id=&#34;完成&#34;&gt;完成&lt;/h2&gt;
&lt;p&gt;ということで完成です。デフォルトで赤く光ってます。キーキャップがLEDを透過してくれるタイプだったのがこれまたよかったですね。
作る前は光らなくてもなんて思ってたのに。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20201204/red_light.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20201204/red_light.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h2 id=&#34;キーマップv2&#34;&gt;キーマップ(v2)&lt;/h2&gt;
&lt;p&gt;Corne Lightで作業を数週間ほどして、いくつか入力しにくい部分があったのでマッピングを少しだけ変えました。
相変わらず日本語キーボードベースですが、数字のレイヤーにいくつかの記号を使えるように割り当てました。
コーディングをするときに、ライブラリのバージョン（例：7.10.0とか）やIPアドレスを入力していてレイヤー切り替えのためのキーを押したり話したりするのは効率が悪すぎたためです。
数字との組み合わせでよく使いそうな以下のキーを数字のレイヤーに移動しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;セミコロン（JP_SCLN）&lt;/li&gt;
&lt;li&gt;コロン（KC_QUOT）&lt;/li&gt;
&lt;li&gt;アンダースコア（JP_UNDS）&lt;/li&gt;
&lt;li&gt;コンマ（KC_COMM）&lt;/li&gt;
&lt;li&gt;ピリオド（KC_DOT）&lt;/li&gt;
&lt;li&gt;スラッシュ（KC_SLSH）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#include &amp;#34;keymap_jp.h&amp;#34;

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [0] = LAYOUT_split_3x6_3( \
  //,-----------------------------------------------------.                    ,-----------------------------------------------------.
       KC_TAB,    KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,                         KC_Y,    KC_U,    KC_I,    KC_O,   KC_P,  JP_MINS,
  //|--------+--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------+--------|
      KC_LCTL,    KC_A,    KC_S,    KC_D,    KC_F,    KC_G,                         KC_H,    KC_J,    KC_K,    KC_L, JP_SCLN, KC_QUOT,
  //|--------+--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------+--------|
      KC_LSFT,    KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,                         KC_N,    KC_M, KC_COMM,  KC_DOT, KC_SLSH, KC_RSFT,
  //|--------+--------+--------+--------+--------+--------+--------|  |--------+--------+--------+--------+--------+--------+--------|
                                          KC_LGUI,   MO(1),  KC_SPC,     KC_ENT,   MO(2), KC_RALT
                                      //`--------------------------&amp;#39;  `--------------------------&amp;#39;

  ),

  [1] = LAYOUT_split_3x6_3( \
  //,-----------------------------------------------------.                    ,-----------------------------------------------------.
       KC_ESC,    KC_1,    KC_2,    KC_3,    KC_4,    KC_5,                         KC_6,    KC_7,    KC_8,    KC_9,    KC_0, KC_BSPC,
  //|--------+--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------+--------|
      KC_LCTL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,                      KC_LEFT, KC_DOWN,   KC_UP,KC_RIGHT, JP_SCLN, KC_QUOT,
  //|--------+--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------+--------|
      KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,                      JP_UNDS, XXXXXXX, KC_COMM,  KC_DOT, KC_SLSH, XXXXXXX,
  //|--------+--------+--------+--------+--------+--------+--------|  |--------+--------+--------+--------+--------+--------+--------|
                                          KC_LGUI, _______,  KC_SPC,     KC_ENT,   MO(3), KC_RALT\
                                      //`--------------------------&amp;#39;  `--------------------------&amp;#39;
  ),

  [2] = LAYOUT_split_3x6_3( \
  //,-----------------------------------------------------.                    ,-----------------------------------------------------.
       KC_TAB, JP_EXLM, JP_DQUO, JP_HASH,  JP_DLR, JP_PERC,                      JP_AMPR, JP_QUOT, JP_LPRN, JP_RPRN, JP_CIRC, KC_BSPC,
  //|--------+--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------+--------|
      KC_LCTL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,                      JP_MINS,  JP_EQL, JP_LBRC, JP_RBRC,  JP_YEN,   JP_AT,
  //|--------+--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------+--------|
      KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,                      JP_UNDS, JP_PLUS, JP_LCBR, JP_RCBR, JP_PIPE, JP_TILD,
  //|--------+--------+--------+--------+--------+--------+--------|  |--------+--------+--------+--------+--------+--------+--------|
                                          KC_LGUI,   MO(3),  KC_SPC,     KC_ENT, _______, KC_RALT
                                      //`--------------------------&amp;#39;  `--------------------------&amp;#39;
  ),

  [3] = LAYOUT_split_3x6_3( \
  //,-----------------------------------------------------.                    ,-----------------------------------------------------.
        RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,                      XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
  //|--------+--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------+--------|
      RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, XXXXXXX,                      XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
  //|--------+--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------+--------|
      RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, XXXXXXX,                      XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
  //|--------+--------+--------+--------+--------+--------+--------|  |--------+--------+--------+--------+--------+--------+--------|
                                          KC_LGUI, _______,  KC_SPC,     KC_ENT, _______, KC_RALT\
                                      //`--------------------------&amp;#39;  `--------------------------&amp;#39;
  )
};
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;ledの色が変えられる気づくの遅い&#34;&gt;LEDの色が変えられる！（気づくの遅い）&lt;/h2&gt;
&lt;p&gt;あと、キーマップを変更しているときに4つ目のレイヤーにRGBなどのボタンがあるのに気付いて押してみたら、LEDのパターンや色を変えることができるのに気付きました。
（遅すぎでは。。。）&lt;/p&gt;
&lt;p&gt;キーキャップが白いのもありこんな感じの色にしてみています。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;ユニコーンガンダムっぽくなった &lt;a href=&#34;https://t.co/vHxZkMrYyP&#34;&gt;pic.twitter.com/vHxZkMrYyP&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1332490582288076800?ref_src=twsrc%5Etfw&#34;&gt;November 28, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、失敗も多々ありましたがキーボードとしてはちゃんと動くできたものができたので安心しました。
今後、状況が落ち着いてきて自宅以外で仕事をするときにはCorne ChocolateをPCと一緒に持ち歩くと思います。
薄くて邪魔にならなくてよさそうです。&lt;/p&gt;
&lt;p&gt;今回もはんだっしゅ太郎大活躍でした。本当に買ってよかった。
LEDがつかないときはちょっと落ち込みましたが、これのおかげで立ち直れたのもありますし。
あとは、試行錯誤しつつLEDとかの理解ができたのも楽しかったです。
キーマップの変更時にLEDの変更などができるのに気づいたのはちょっと遅すぎたので、qmkの仕組みや割り当てられるキーにどんなものがあるのかをもう少し研究したいなと思います。&lt;/p&gt;
&lt;p&gt;さて、次はどんなことを試すかなぁ。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Corne Light v2を作成した #DIYキーボード</title>
      <link>https://blog.johtani.info/blog/2020/11/05/build-corne-light-v2/</link>
      <pubDate>Thu, 05 Nov 2020 00:25:27 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/11/05/build-corne-light-v2/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/10/11/build-dozen0/#%E3%81%BE%E3%81%A8%E3%82%81&#34;&gt;前回のブログのまとめ&lt;/a&gt;に書いたように、セパレートタイプのキーボードであるCorne Light v2を作成したのでそのビルドログです。DIYキーボードとしては2つ目になります。&lt;/p&gt;
&lt;p&gt;まとめで書いていたお店が開店したので、購入してみました。
購入したのはこちらの&lt;a href=&#34;https://kochikeyboard.stores.jp/&#34;&gt;KOCHI KEYBOARDさん&lt;/a&gt;です。
ついこの間オープンしたばっかりのお店です！&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/10/11/build-dozen0/#%E3%81%BE%E3%81%A8%E3%82%81&#34;&gt;前回のブログのまとめ&lt;/a&gt;に書いたように、セパレートタイプのキーボードであるCorne Light v2を作成したのでそのビルドログです。DIYキーボードとしては2つ目になります。&lt;/p&gt;
&lt;p&gt;まとめで書いていたお店が開店したので、購入してみました。
購入したのはこちらの&lt;a href=&#34;https://kochikeyboard.stores.jp/&#34;&gt;KOCHI KEYBOARDさん&lt;/a&gt;です。
ついこの間オープンしたばっかりのお店です！&lt;/p&gt;
&lt;h2 id=&#34;なんで作ったの&#34;&gt;なんで作ったの？&lt;/h2&gt;
&lt;p&gt;スプリット型（セパレートタイプ？どっちが正しいんだろう？）のキーボードに興味があって、KOCHI KEYBOARDさんで買えたのがこれだったというのが大きな理由です。こういうのってタイミングだと思うので。
あとは、組み立てていくのがプラモデルみたいで面白いというのもあります。
基本的にここのところ自宅で仕事をしているので、ノートPCのキーボードにこだわる必要もないなというのも理由ですね。今後も当面は自宅で仕事になると思いますので。&lt;/p&gt;
&lt;h2 id=&#34;corne-light-v2&#34;&gt;Corne Light v2&lt;/h2&gt;
&lt;p&gt;foostanさんが設計された（って言い方であってるのかな？）、3x6のサイズに親指の3キーが配置された分離型のキーボードの一種です。
シリーズ？の名前としては&lt;a href=&#34;https://github.com/foostan/crkbd&#34;&gt;Corne Keyboard&lt;/a&gt;と呼ばれています。
（そういえば、由来は何だろう？自作キーボードがどうやって設計されていくのかという流れがまとめられた&lt;a href=&#34;https://fstn.hateblo.jp/entry/2018/12/20/070000&#34;&gt;作者の方のブログ&lt;/a&gt;がおもしろいです。）
また、基板の設計などがGitHub上でMITライセンスで公開されています。
オープンソースなハードウェアというのも面白いです。&lt;/p&gt;
&lt;h2 id=&#34;ビルドログ&#34;&gt;ビルドログ&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/foostan/crkbd/blob/master/corne-light/doc/v2/buildguide_low_edition_jp.md&#34;&gt;作者の方がビルドガイド&lt;/a&gt;を公開してくれています。ですので、こちらに沿って作業をしていきます。
ちなみに、私は今回Gateronのクリア軸を選択してみました。さらさらと入力できるのが好きなので。
サイレント軸にも興味はあるのですが、今回は実際にスプリット型のキーボードを早く触ってみたいというのが勝ちました。キーキャップについては後述します。
ツイートに都度、写真をアップしていたので組み立ては画像でお楽しみください（時々取り忘れてるけどｗ）。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;うむ &lt;a href=&#34;https://t.co/svW9WdzaZv&#34;&gt;pic.twitter.com/svW9WdzaZv&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1318807312342032384?ref_src=twsrc%5Etfw&#34;&gt;October 21, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;刺して曲げる &lt;a href=&#34;https://t.co/M0jfQJg2k8&#34;&gt;pic.twitter.com/M0jfQJg2k8&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1319288975740162049?ref_src=twsrc%5Etfw&#34;&gt;October 22, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;両方できたと。ハンダまでやって今日はおしまいにすっか &lt;a href=&#34;https://t.co/HgsSrxqpcg&#34;&gt;pic.twitter.com/HgsSrxqpcg&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1319291510261596162?ref_src=twsrc%5Etfw&#34;&gt;October 22, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;写真取り忘れたけど、ProMicroつけた &lt;a href=&#34;https://t.co/RS4z0lqsUZ&#34;&gt;pic.twitter.com/RS4z0lqsUZ&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1319310929826246656?ref_src=twsrc%5Etfw&#34;&gt;October 22, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;OLEDもついたと。今日はここまで &lt;a href=&#34;https://t.co/p6Z8MMP0Xz&#34;&gt;pic.twitter.com/p6Z8MMP0Xz&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1319311317006577664?ref_src=twsrc%5Etfw&#34;&gt;October 22, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;ここまでは順調です。&lt;/p&gt;
&lt;h3 id=&#34;oledがつかない&#34;&gt;OLEDがつかない？&lt;/h3&gt;
&lt;p&gt;ビルドガイドに従って、この後キースイッチをつけちゃうと問題の切り分けが難しくなるということで、
ここまでの段階でQMK Toolboxを使ってProMicroにファームウェアを書き込んで、それぞれのキーのソケットの取り付け部をピンセットでショートさせつつ、キーが入力されるかどうかを見ていきます。
&lt;a href=&#34;https://salicylic-acid3.hatenablog.com/entry/qmk-toolbox&#34;&gt;QMK Toolboxについてはサリチル酸さんのブログ&lt;/a&gt;がわかりやすいので参考にさせていただきました（わかりやすい記事をありがとうございます）。
で、ビルドガイドにあるように動いてるかを確認しようとしたのですが。。。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;さて、ファームウェア書き込んだけど、OLEDがつかないな。どっかつながってないのか？&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1319981722914623489?ref_src=twsrc%5Etfw&#34;&gt;October 24, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;ビルドガイドのようにはいかず。。。
USBでPCとつないだ状態で、&lt;a href=&#34;https://config.qmk.fm/#/test&#34;&gt;QMK Configurator&lt;/a&gt;をサイトで開いて、キーボード入力テストを開くと、ショートさせたキーがPC側で認識されているかのテストができます。
これで、一通りキーは認識できていそうだというのはピンセットでショートさせながら確認しました。
ただ、OLEDには何も表示されないんです。。。&lt;/p&gt;
&lt;p&gt;前回Dozen0を組み立てた時に、ソケットのはんだ付けが甘かったというのもあったので、
OLEDやソケットのはんだを温めなおしたりしてみて、何度か確認してみたものの特に進展がなしです。
（ちなみにうまくいかないのもあって、&lt;a href=&#34;https://twitter.com/johtani/status/1319996547577229313&#34;&gt;ぼけたツイート&lt;/a&gt;したりもしてます。）&lt;/p&gt;
&lt;p&gt;まぁ、OLEDはビルドガイドを見てもオプション扱いなので、それよりも触ってみたい衝動に駆られて、
キースイッチをはんだ付けしていきます。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;ちなみに昨晩、OLEDはとりあえず置いといてって感じでキースイッチつけてた。キーキャップはまだない &lt;a href=&#34;https://t.co/SzLmzNg60Y&#34;&gt;pic.twitter.com/SzLmzNg60Y&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1320558068212510720?ref_src=twsrc%5Etfw&#34;&gt;October 26, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;それも終わって、問題点の切り分けに何かできないかな？と思ってやったのがOLED単体でArduinoと接続してみて動くかどうかです。
&lt;a href=&#34;https://qiita.com/takahiro_itazuri/items/d7bc7331b196921b5880&#34;&gt;Qiitaにちょうどいい感じの記事&lt;/a&gt;を見つけたのでこれまた参考にさせていただきました(4本のジャンパー線を一人で持ちながら確認するの大変だったｗ)。&lt;/p&gt;
&lt;h4 id=&#34;はんだでの修正にしっぱい&#34;&gt;はんだでの修正にしっぱい&lt;/h4&gt;
&lt;p&gt;で、自分の中での結論として、「OLEDソケットのはんだ付けが怪しい」となりました。
そこで、まずは外してみようかと思ったのが間違いでした。
はんだごてとはんだ吸い取り線で何とか外せるだろうと思っちゃったんですよ。
OLEDピンソケットは足が4本あって、とりあえずとれるところまではんだ吸い取り線で吸い取ってみましたが、
さすがに基盤の穴に流れ込んだはんだまでは吸い取れず、頑張って温めながらソケットを抜こうとがんばって、
ラジオペンチでピンソケットを引っ張りながら引き抜きました。かろうじて引き抜きはできたのですが、ソケットは足が折れてしまいました。&lt;/p&gt;
&lt;h4 id=&#34;作者登場oled問題の解決&#34;&gt;作者登場（OLED問題の解決）&lt;/h4&gt;
&lt;p&gt;そんなところにCorneの作者の方がツイートを拾ってくれたみたいで以下のような返信を頂きました。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;OLEDが点かないのはファームのせいかもしれません(最近以前のファームで動かない新しいタイプのOLEDモジュールが出回るようになりました)。お手数ですが、&lt;a href=&#34;https://t.co/vfSBfIeeJX&#34;&gt;https://t.co/vfSBfIeeJX&lt;/a&gt; のブランチのものを試して頂けますか？(ただいまPRレビュー中でまだマージされていない状態です)&lt;/p&gt;&amp;mdash; foostan (@foostan) &lt;a href=&#34;https://x.com/foostan/status/1320410393328513024?ref_src=twsrc%5Etfw&#34;&gt;October 25, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;暗闇に光明とはこのことです。
教えていただいたブランチを手元でビルドしてファームウェアを書き込むと、&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;すごい、出ました！右側のディスプレイにロゴが。ありがとうございます（左側のOLEDはソケットのはんだ付け直し失敗したのでもうちょっと先になりますが）！&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1320549750156869632?ref_src=twsrc%5Etfw&#34;&gt;October 26, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;なんと、ファームウェア書き込んだ瞬間にOLEDが点くじゃないですか。
感謝感激ってやつです。お礼を言うのに便乗して&lt;a href=&#34;https://twitter.com/foostan/status/1320555771009011712&#34;&gt;OLEDの問題の切り分けの方法についても聞いてしまいました&lt;/a&gt;。&lt;/p&gt;
&lt;h4 id=&#34;oledリベンジ&#34;&gt;OLEDリベンジ&lt;/h4&gt;
&lt;p&gt;片側は無事だったのですが、もう一方は修復が困難になったので救世主を発注します。
自作キーボードの作成に便利なものリストとして、いくつかのブログに上がっていたのですが、必要ないだろうと見送っていたツールです。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B01FEV2BPG/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/417ZH7pCYDL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B01FEV2BPG/?tag=johtani-22&#34;&gt;
      Amazon | サンハヤト はんだシュッ太郎NEO 45Wタイプ HSK-300 | ハンダゴテパーツ
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;本当にすごく使いやすかったです。
OLEDのピンソケットが修復不可能だったのですが、ProMicro用に付属して余っているピンヘッダがちょうどいい長さでした。
なので、これを4本分切り取り、OLEDモジュールにつけてしまったOLEDヘッダピンを抜き取って、代わりに切り取ったピンヘッダをつかって、OLEDと基盤を直接はんだ付けすれば修復できそうだと判断しました。&lt;/p&gt;
&lt;p&gt;はんだシュッ太郎君を使ってOLEDについてるヘッダピンをまずは除去。
そのあとはこんな感じで繋げました。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;見にくいかもだけど &lt;a href=&#34;https://t.co/YAHoxjgppN&#34;&gt;pic.twitter.com/YAHoxjgppN&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1324399704512192512?ref_src=twsrc%5Etfw&#34;&gt;November 5, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;取り外しにくくはなったけど、無事両方のOLEDが点くのも確認できました。やったー。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;ヤッター、両方のOLEDがついたよー &lt;a href=&#34;https://t.co/6KLDWvnaEC&#34;&gt;pic.twitter.com/6KLDWvnaEC&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1321475997141659648?ref_src=twsrc%5Etfw&#34;&gt;October 28, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;h3 id=&#34;キースイッチがご機嫌斜め&#34;&gt;キースイッチがご機嫌斜め&lt;/h3&gt;
&lt;p&gt;キーキャップは別途、AliExpressで発注をかけたのですが、ここまで来たら待ちきれないですよね？
ということで、手元にあった上海問屋のキーボードのキーキャップが同じMXキースイッチ用のものだったので移植しました。キーキャップ付けてみないとわかならいものですね、1つだけキースイッチがうまくはまっておらず、斜めについているのがこの時点で判明しました（ボトムプレート付けた後だったので、プレート外してから、はんだで修正）。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;ちなみにキーキャップはめてる途中で、一箇所キースイッチが斜めにはんだ付けされちゃってるのを発見して慌てて直しました。 &lt;a href=&#34;https://t.co/qofHp3o4Pc&#34;&gt;pic.twitter.com/qofHp3o4Pc&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1322083647332085760?ref_src=twsrc%5Etfw&#34;&gt;October 30, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;無事使えるようになりました。&lt;/p&gt;
&lt;h3 id=&#34;アンスコが打てないescどこ&#34;&gt;アンスコが打てない＆Escどこ？&lt;/h3&gt;
&lt;p&gt;キーキャップ付けたので仮運用ということで、まずはデフォルトのキーマップをもとにどんな感じで入力できるのかを試してみました。
ここにも罠がｗ
ブラウザで&lt;a href=&#34;https://config.qmk.fm/#/crkbd/rev1/legacy/LAYOUT_split_3x6_3&#34;&gt;QMK Configurator&lt;/a&gt;を開いてデフォルトのキーマップを確認しながら試し打ちをしていたのですが、どうも思ったのと違う動きをしているキーが。&lt;/p&gt;
&lt;p&gt;まずBASEレイヤー（レイヤー0）の右側のシフトと、LOWERレイヤーやRAISEレイヤーのEscです。
入力しているとどうも、右のシフトがEscで、レイヤーを切り替えてもTabのままだなと。
しょうがないので、OLEDが出なくてもいいのでQMK Toolboxでダウンロードしてきたものを利用したら想定通りなのにと。
きちんとqmk_firmwareの構成を理解しないままやってたつけでしたね。
結論としては、OLED用に教えてもらったブランチではキーマップが書き換わっていたようでした。
&lt;code&gt;make crkbd:defaut&lt;/code&gt;でビルドした時に利用されるkeymap.cがキーマップの定義が書いてあるファイルです。
qmk/qmk_firmwareのリポジトリにあるkeymap.cとfoostanさんにもらったブランチでは差分があったみたいでした。&lt;/p&gt;
&lt;p&gt;おかげで、qmk_firmwareのkeymap.cの仕組みがわかったし結果オーライです。
問題があって調べるとどんな作りになってるかとかちゃんと確認できますしね。
手順通りにやってるだけで問題が起きないと、どんな仕組みになってるのかがわからないので人に聞きまくるしかできなくなっちゃいますしね。&lt;/p&gt;
&lt;p&gt;これでEsc問題は解決したのですが、アンスコがどうしても入力できません。
自作キーボード以外はすべて日本語配列のキーボードを使用しているのもあり、
日本語配列のキーボードだとどうもキーのマッピングが異なるようだと。&lt;/p&gt;
&lt;p&gt;ググって参考にしたのはこの辺でした。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://skyhigh-works.hatenablog.com/entry/2018/11/14/033242&#34;&gt;【QMK】JPキーコードでキーマップを定義する - 天高工房&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://salicylic-acid3.hatenablog.com/entry/2018/11/26/%E8%87%AA%E4%BD%9C%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%82%AD%E3%83%83%E3%83%88%E3%80%8CCorne_Cherry%E3%80%8D%E3%81%AE%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC#USB%E3%81%AE%E5%8F%B3%E5%87%BA%E3%81%97&#34;&gt;自作キーボードキット「Corne Cherry」のレビュー - 自作キーボード温泉街の歩き方&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そのほかにもVIAのファームなども試したのですが、どれもうまくいかず。
色々ググってみて最終的な解決策はkeymap.cでkeymap_jp.hというファイルが読み込まれていないので、日本語用の設定とかを読み込んでみたつもりがうまく反映されていないという感じでした。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;JISにする場合、keymap_jp.hっていうヘッダファイル読み込んだほうがいいです&lt;/p&gt;&amp;mdash; Yoshi Yamaguchi (@ymotongpoo) &lt;a href=&#34;https://x.com/ymotongpoo/status/1323456582152171522?ref_src=twsrc%5Etfw&#34;&gt;November 3, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;今の時点ではこんなキーマップにしてあります。
今後も日本語配列のキーボードをベースに考えていくつもりです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
#include QMK_KEYBOARD_H
#include &amp;#34;keymap_jp.h&amp;#34;

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [0] = LAYOUT_split_3x6_3( \
  //,-----------------------------------------------------.                    ,-----------------------------------------------------.
       KC_TAB,    KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,                         KC_Y,    KC_U,    KC_I,    KC_O,   KC_P,  JP_MINS,
  //|--------+--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------+--------|
      KC_LCTL,    KC_A,    KC_S,    KC_D,    KC_F,    KC_G,                         KC_H,    KC_J,    KC_K,    KC_L, JP_SCLN, KC_QUOT,
  //|--------+--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------+--------|
      KC_LSFT,    KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,                         KC_N,    KC_M, KC_COMM,  KC_DOT, KC_SLSH, KC_RSFT,
  //|--------+--------+--------+--------+--------+--------+--------|  |--------+--------+--------+--------+--------+--------+--------|
                                          KC_LGUI,   MO(1),  KC_SPC,     KC_ENT,   MO(2), KC_RALT
                                      //`--------------------------&amp;#39;  `--------------------------&amp;#39;

  ),

  [1] = LAYOUT_split_3x6_3( \
  //,-----------------------------------------------------.                    ,-----------------------------------------------------.
       KC_ESC,    KC_1,    KC_2,    KC_3,    KC_4,    KC_5,                         KC_6,    KC_7,    KC_8,    KC_9,    KC_0, KC_BSPC,
  //|--------+--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------+--------|
      KC_LCTL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,                      KC_LEFT, KC_DOWN,   KC_UP,KC_RIGHT, XXXXXXX, XXXXXXX,
  //|--------+--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------+--------|
      KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,                      XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  //|--------+--------+--------+--------+--------+--------+--------|  |--------+--------+--------+--------+--------+--------+--------|
                                          KC_LGUI, _______,  KC_SPC,     KC_ENT,   MO(3), KC_RALT\
                                      //`--------------------------&amp;#39;  `--------------------------&amp;#39;
  ),

  [2] = LAYOUT_split_3x6_3( \
  //,-----------------------------------------------------.                    ,-----------------------------------------------------.
       KC_TAB, JP_EXLM, JP_DQUO, JP_HASH,  JP_DLR, JP_PERC,                      JP_AMPR, JP_QUOT, JP_LPRN, JP_RPRN, JP_CIRC, KC_BSPC,
  //|--------+--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------+--------|
      KC_LCTL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,                      JP_MINS,  JP_EQL, JP_LBRC, JP_RBRC,  JP_YEN,   JP_AT,
  //|--------+--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------+--------|
      KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,                      JP_UNDS, JP_PLUS, JP_LCBR, JP_RCBR, JP_PIPE, JP_TILD,
  //|--------+--------+--------+--------+--------+--------+--------|  |--------+--------+--------+--------+--------+--------+--------|
                                          KC_LGUI,   MO(3),  KC_SPC,     KC_ENT, _______, KC_RALT
                                      //`--------------------------&amp;#39;  `--------------------------&amp;#39;
  ),

  [3] = LAYOUT_split_3x6_3( \
  //,-----------------------------------------------------.                    ,-----------------------------------------------------.
        RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,                      XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
  //|--------+--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------+--------|
      RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, XXXXXXX,                      XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
  //|--------+--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------+--------|
      RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX,                      XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
  //|--------+--------+--------+--------+--------+--------+--------|  |--------+--------+--------+--------+--------+--------+--------|
                                          KC_LGUI, _______,  KC_SPC,     KC_ENT, _______, KC_RALT\
                                      //`--------------------------&amp;#39;  `--------------------------&amp;#39;
  )
};
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;キーキャップが待ちきれなくて&#34;&gt;キーキャップが待ちきれなくて&lt;/h3&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;この右下のトンガリがちょっと気になる &lt;a href=&#34;https://t.co/W0A0z67cns&#34;&gt;pic.twitter.com/W0A0z67cns&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1322092102637948928?ref_src=twsrc%5Etfw&#34;&gt;October 30, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;キーキャップが待ちきれなくて上海問屋のキーキャップを付けてみて、いろいろ試行錯誤してみました。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;あー。上下関係ないのか。だからみんなこんな感じにしてるのか？ &lt;a href=&#34;https://t.co/KTBlPLespr&#34;&gt;pic.twitter.com/KTBlPLespr&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1322180553529937921?ref_src=twsrc%5Etfw&#34;&gt;October 30, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;どのくらい離すのが良いか実験中 &lt;a href=&#34;https://t.co/ozK4WyBXY8&#34;&gt;pic.twitter.com/ozK4WyBXY8&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1323161306266963969?ref_src=twsrc%5Etfw&#34;&gt;November 2, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;h3 id=&#34;キーキャップもいろいろあるのね&#34;&gt;キーキャップもいろいろあるのね&lt;/h3&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;届いた。 &lt;a href=&#34;https://t.co/jccNW1ZcEM&#34;&gt;pic.twitter.com/jccNW1ZcEM&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1323194081036546048?ref_src=twsrc%5Etfw&#34;&gt;November 2, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;もう一個 &lt;a href=&#34;https://t.co/9y6qat4JiN&#34;&gt;pic.twitter.com/9y6qat4JiN&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1323194549196390400?ref_src=twsrc%5Etfw&#34;&gt;November 2, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;とりあえずセミコロンの位置につけてみた。 &lt;a href=&#34;https://t.co/TDk5213IHi&#34;&gt;pic.twitter.com/TDk5213IHi&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1323473987213565953?ref_src=twsrc%5Etfw&#34;&gt;November 3, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;今はこのDSAプロファイルの青いグラデーションのキーキャップを使っています（Dukeはここにはいないですｗ）。
キーキャップのプロファイルはこれまた、&lt;a href=&#34;https://salicylic-acid3.hatenablog.com/entry/2018/12/06/%E3%82%AD%E3%83%BC%E3%82%AD%E3%83%A3%E3%83%83%E3%83%97%E3%81%AE%E6%B9%AF%E3%81%AE%E3%81%8A%E8%AA%98%E3%81%84&#34;&gt;サリチル酸さんのブログ&lt;/a&gt;がわかりやすく書かれています（ほんとすごいなぁ。）。&lt;/p&gt;
&lt;h3 id=&#34;高さ調節&#34;&gt;高さ調節&lt;/h3&gt;
&lt;p&gt;そのまま使っていたのですが、やはりもうちょっと奥側に高さがほしいなと。
ダイソーなどで打っているケーブルクリップがお試しには良さそうだったのでこんな感じで内側がちょっとだけ高くなるような感じにして使っています。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;こうなった。とりあえず仮運用 &lt;a href=&#34;https://t.co/VkhjawdhLM&#34;&gt;pic.twitter.com/VkhjawdhLM&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1323999827810684931?ref_src=twsrc%5Etfw&#34;&gt;November 4, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、駆け足ですがCorne Light v2のビルドログでした。
いきなりフルキーボードから40％キーボードかつ異なる並びにしたので、
混乱しっぱなしですが、いい頭の運動になっているし、なにより作って動かすまでの間に
いろいろと調べたり試行錯誤できたのがすごく楽しかったです。&lt;/p&gt;
&lt;p&gt;あとは、スプリット型＋Column Staggeredになったので「c」や「b」を間違えまくっていますが、
いい気付きでした。まだまだ記号とかの入力に慣れていないですが、ちょっとずつ身に着けていけたらなと。&lt;/p&gt;
&lt;p&gt;ただ、もう次のキーボードをDIYしたい気持ちも出てきているので困っているところです。&lt;/p&gt;
&lt;p&gt;書ききれてないこともあるかと思うので、ここはどうしてるの？これはどうやったの？などあれば、Tweetなりコメントなりを頂けたらなと思います。いやぁ、DIYキーボード楽しいわ。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Windowsへの移行（その１）</title>
      <link>https://blog.johtani.info/blog/2020/10/18/restart-windows-no1/</link>
      <pubDate>Sun, 18 Oct 2020 23:01:50 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/10/18/restart-windows-no1/</guid>
      <description>&lt;p&gt;ヒゲが不評だったのでいつも通りの長さに切りました。&lt;/p&gt;
&lt;p&gt;前回「&lt;a href=&#34;https://blog.johtani.info/blog/2020/10/15/restart-windows/&#34;&gt;Windowsをお試し中&lt;/a&gt;」と書きましたが、いくつかソフトをインストールしたりしたので現状を忘れないようにブログに残しておきます（また同じ作業する予定なので）&lt;/p&gt;
&lt;h2 id=&#34;インストールしたものたち&#34;&gt;インストールしたものたち&lt;/h2&gt;
&lt;p&gt;今のところインストールしたのはこの辺。
特にコメントしたいものについてこのあと明記します。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ヒゲが不評だったのでいつも通りの長さに切りました。&lt;/p&gt;
&lt;p&gt;前回「&lt;a href=&#34;https://blog.johtani.info/blog/2020/10/15/restart-windows/&#34;&gt;Windowsをお試し中&lt;/a&gt;」と書きましたが、いくつかソフトをインストールしたりしたので現状を忘れないようにブログに残しておきます（また同じ作業する予定なので）&lt;/p&gt;
&lt;h2 id=&#34;インストールしたものたち&#34;&gt;インストールしたものたち&lt;/h2&gt;
&lt;p&gt;今のところインストールしたのはこの辺。
特にコメントしたいものについてこのあと明記します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ドライバインストール from CD&lt;/li&gt;
&lt;li&gt;MX Ergoのソフトインストール。接続はコネクター&lt;/li&gt;
&lt;li&gt;Windowsアップデート&lt;/li&gt;
&lt;li&gt;Chrome&lt;/li&gt;
&lt;li&gt;Visual Studio ビルドツール(Lindera用)&lt;/li&gt;
&lt;li&gt;JetBrains Toolbox
&lt;ul&gt;
&lt;li&gt;IntelliJ&lt;/li&gt;
&lt;li&gt;CLion&lt;/li&gt;
&lt;li&gt;Rider&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Visual Studio Code&lt;/li&gt;
&lt;li&gt;Slack&lt;/li&gt;
&lt;li&gt;Teams&lt;/li&gt;
&lt;li&gt;Google Drive共有&lt;/li&gt;
&lt;li&gt;Gitter&lt;/li&gt;
&lt;li&gt;&lt;del&gt;Divvy for Windows&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;Zoom&lt;/li&gt;
&lt;li&gt;DeepL&lt;/li&gt;
&lt;li&gt;Sophos&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://help.twitter.com/ja/using-twitter/twitter-windows-10&#34;&gt;Twitter for Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Office 365&lt;/li&gt;
&lt;li&gt;AutoHotKey&lt;/li&gt;
&lt;li&gt;WSL2 - Ubuntu&lt;/li&gt;
&lt;li&gt;Windows Terminal&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.rust-lang.org/tools/install&#34;&gt;Rustup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Git for Windows&lt;/li&gt;
&lt;li&gt;wsl-ssh-agent&lt;/li&gt;
&lt;li&gt;PeaZip&lt;/li&gt;
&lt;li&gt;Speccy&lt;/li&gt;
&lt;li&gt;Hugo (WSL2のUbuntuにapt-get install hugoした)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/microsoft/PowerToys&#34;&gt;PowerToys&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;autohotkey&#34;&gt;AutoHotKey&lt;/h3&gt;
&lt;p&gt;前回のブログに書いたように、カーソル系のEmacsショートカットが体に染みついて離れないのです。
そこで、&lt;a href=&#34;https://linuxfan.info/windows-emacs-keybindings&#34;&gt;ググって見つけた記事はこちら&lt;/a&gt;。
&lt;a href=&#34;https://www.autohotkey.com/&#34;&gt;AutoHotKey&lt;/a&gt;というツールが
Windowsに常駐して、特定のキー入力の時に、別の操作を実行してくれるツールです。&lt;/p&gt;
&lt;p&gt;見つけた記事にあった、&lt;a href=&#34;https://github.com/lintaro-jp/gtk-emacs-theme-like.ahk&#34;&gt;https://github.com/lintaro-jp/gtk-emacs-theme-like.ahk&lt;/a&gt;のキーマップをもとに、いくつか変更したものを使用させていただいています。&lt;/p&gt;
&lt;p&gt;書き換えたのは、以下の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ctrl+\でIMEの切り替え（Wnn風）&lt;/li&gt;
&lt;li&gt;Ctrl+kをEmacsと同じ挙動に（もとにしたキーマップでは、カーソルから行末までが削除されてしまう）&lt;/li&gt;
&lt;li&gt;Win+sでもファイル保存（Ctrl+sと同じ挙動に。デフォルトではCortanaが起動して邪魔くさいので）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;すごく快適です。そのうち、もう少し自分が使いやすいようにキーマップを追加していったりするかもしれません。
特に、Macのショートカットがしみついているものについてなどです（仮想デスクトップ切り替えとか？）&lt;/p&gt;
&lt;h3 id=&#34;powertoys&#34;&gt;PowerToys&lt;/h3&gt;
&lt;p&gt;Divvyをインストールしたのですが、グローバルショートカットがうまく動かなくていまいちでした（なんでだろ？）
そこでググって見つけたのが&lt;a href=&#34;https://www.atmarkit.co.jp/ait/articles/1912/26/news019.html&#34;&gt;@ITのPowerToysの記事&lt;/a&gt;でした。
&lt;a href=&#34;https://github.com/microsoft/PowerToys&#34;&gt;PowerToys&lt;/a&gt;はMS製のOSSツールで、GitHub上で公開されています。
中には「ColorPicker」、「FancyZones」、「File Explowrer Add-ons」など、複数のツールが入っています。
「&lt;a href=&#34;https://github.com/microsoft/PowerToys/wiki/FancyZones-Overview&#34;&gt;FancyZones&lt;/a&gt;」です。&lt;/p&gt;
&lt;p&gt;Windowsでは、デフォルトで、アプリにフォーカスしているときにWin＋カーソルでウィンドウの配置場所をいくつか（左右どちらかに半分、4分の1(右上、左上など)）に配置してくれるAero Snapというものが動いています。が、上半分などデフォルトにない柔軟な配置を設定することができません。
MacではDivvyというツールをいれて、それを実施していたのですが、先ほど書いたようにWindows版はあるものの、なぜかグローバルショートカットが動かず、システムタスクトレイのアイコンをクリックしなければいけませんでした。&lt;/p&gt;
&lt;p&gt;それを解消してくれるのがFancyZonesです。
FancyZonesの設定項目で、&lt;a href=&#34;https://github.com/microsoft/PowerToys/wiki/FancyZones-Overview#picking-a-layout&#34;&gt;自分で画面上にどのような割り当て領域を作るかを設定できます&lt;/a&gt;。さらに、マルチディスプレイ、仮想デスクトップを使っている場合、それぞれのディスプレイかつ仮想デスクトップで個別にレイアウトが設定できるようになります。
レイアウトを設定した後は、Shiftキーを押しながらウィンドウを移動すると、設定した領域が出てきて、あとは、割り当てたい領域にウィンドウを移動するだけでその領域いっぱいにウィンドウをリサイズしてくれます。
また、設定を変えることで、Shiftキーを押さなくてもウィンドウ移動するだけで領域にリサイズすることも可能です。また、Aero Snapの機能をオーバーライドしてWin＋カーソルで動作させることも可能になります。&lt;/p&gt;
&lt;h3 id=&#34;wsl2--windows-terminal&#34;&gt;WSL2 + Windows Terminal&lt;/h3&gt;
&lt;p&gt;三宅さんからコメントを頂いたので。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;もう少し幅広い感じですかね。あわせて Windows Terminal 使うとわりと快適です。&lt;/p&gt;&amp;mdash; miyake / ZEN (@kazuyukimiyake) &lt;a href=&#34;https://x.com/kazuyukimiyake/status/1316602393283366913?ref_src=twsrc%5Etfw&#34;&gt;October 15, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;なんとなく噂は聞いていましたがということで、&lt;a href=&#34;https://docs.microsoft.com/ja-jp/windows/wsl/about&#34;&gt;MSのドキュメント&lt;/a&gt;を見ながらインストールしました。&lt;a href=&#34;https://docs.microsoft.com/ja-jp/windows/wsl/install-win10&#34;&gt;クイックスタート&lt;/a&gt;に則って作業するだけで特に問題なくUbuntuまで無事インストールできました。
Windows Terminalも同様です（クイックスタートで入れることになる）。&lt;/p&gt;
&lt;h3 id=&#34;git-for-windows--wsl-ssh-agent&#34;&gt;Git for Windows + wsl-ssh-agent&lt;/h3&gt;
&lt;p&gt;少してこずったのがこちらです。
&lt;a href=&#34;https://docs.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-git&#34;&gt;チュートリアル&lt;/a&gt;に記述はあったのですが、どちらで作業するのか？などが少しわかりにくかったので。&lt;a href=&#34;https://scrapbox.io/saitotetsuya/Windows_10%E3%81%AEssh-agent%E3%82%92WSL2%E3%81%8B%E3%82%89%E4%BD%BF%E3%81%86&#34;&gt;ググって出てきた記事&lt;/a&gt;をもとに作用しました。&lt;/p&gt;
&lt;p&gt;RustのプロジェクトファイルをMacから丸ごとコピーしていたのですが、Git for Windowsを入れるまでは、CLion+Rust pluginの環境では、&lt;code&gt;.git&lt;/code&gt;ファイルをきちんと認識してくれませんでした（この時WSL2と少し混同してた）。&lt;/p&gt;
&lt;p&gt;無事環境は用意できました。
作業の手順は以下のような感じです。
Macで使用していた&lt;code&gt;.ssh&lt;/code&gt;のディレクトリを持ってきて作業しました。&lt;/p&gt;
&lt;h4 id=&#34;windows側での作業&#34;&gt;Windows側での作業&lt;/h4&gt;
&lt;ol start=&#34;0&#34;&gt;
&lt;li&gt;Macから&lt;code&gt;.ssh&lt;/code&gt;ディレクトリを&lt;code&gt;c:\\Users\johta\&lt;/code&gt;にコピー&lt;/li&gt;
&lt;li&gt;Git for Windowsのインストール&lt;/li&gt;
&lt;li&gt;OpenSSHクライアントの設定
&lt;ul&gt;
&lt;li&gt;管理者権限でコマンドプロンプトを起動して
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sc config ssh-agent start=auto&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sc start ssh-agent&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[wsl-ssh-agent(https://github.com/rupor-github/wsl-ssh-agent)のインストール
&lt;ul&gt;
&lt;li&gt;ダウンロードして&lt;code&gt;.7z&lt;/code&gt;ファイルを展開&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wsl-ssh-agent-gui.exe&lt;/code&gt;と&lt;code&gt;npiperelay.exe&lt;/code&gt;を&lt;code&gt;c:\\Users\johta\bin&lt;/code&gt;に移動&lt;/li&gt;
&lt;li&gt;&lt;code&gt;c:\\Users\johta\bin\wsl-ssh-agent-gui.exe&lt;/code&gt;のショートカットをスタートアップに作成&lt;/li&gt;
&lt;li&gt;作成したスタートアップのリンク先に&lt;code&gt; -setenv -envname=WSL_AUTH_SOCK&lt;/code&gt;を追加&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Git BashでOpenSSHを利用するように設定
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;setx GIT_SSH C:\\Windows\system32\OpenSSH\ssh.exe&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ssh-add&lt;/code&gt;で秘密鍵を登録
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ssh-add .ssh/id_rsa&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;wsl2のubuntuでの作業&#34;&gt;WSL2のUbuntuでの作業&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Ubuntuはgitがすでに入っていたのでインストールはスキップ&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git config --global user.name &amp;quot;Jun Ohtani&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git config --global user.email &amp;quot;メールアドレス&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mkdir .ssh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.bashrc&lt;/code&gt;の最後行に&lt;a href=&#34;https://github.com/rupor-github/wsl-ssh-agent#wsl-2-compatibility&#34;&gt;wsl-ssh-agentのWSL2 compatibility&lt;/a&gt;にある&lt;code&gt;export&lt;/code&gt;から&lt;code&gt;fi&lt;/code&gt;までをコピー。この時、パスを自分のパスに変更すること(私の場合&lt;code&gt;$HOME/winhome/.wsl&lt;/code&gt;の部分を&lt;code&gt;/mnt/c/Users/johta/bin&lt;/code&gt;に書き換えました)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;これで、WSL2側では&lt;code&gt;.ssh&lt;/code&gt;のファイルを管理しなくても、Windows側のOpenSSHに接続してssh周りの処理をしてくれるようになりました。&lt;/p&gt;
&lt;h3 id=&#34;peazip&#34;&gt;PeaZip&lt;/h3&gt;
&lt;p&gt;wsl-ssh-agentが&lt;code&gt;.7z&lt;/code&gt;形式で圧縮されていたので、ダウンロードしました。
とりあえずこれを入れてみたのですが、ほかにお勧めがあれば教えてほしいです。&lt;/p&gt;
&lt;h3 id=&#34;speccy&#34;&gt;Speccy&lt;/h3&gt;
&lt;p&gt;CPUの温度やスレッドごとのCPU使用率などを見てみたいので入れてみました。
これもとりあえず入れてみた感じなので、ほかにお勧めのソフトがあれば教えてもらえればと。
リソースマネージャーでもスレッドごとのCPU使用率は見れたのですが、温度が見れなかったので。&lt;/p&gt;
&lt;h3 id=&#34;hugo-&#34;&gt;Hugo +&lt;/h3&gt;
&lt;p&gt;WSL2にあるUbuntuに&lt;code&gt;sudo apt-get install hugo&lt;/code&gt;してインストールしました。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;そこで、VS Code の Remote Extension です。WSL2 から ‘code’ で起動できます😎&lt;/p&gt;&amp;mdash; Daiyu Hatakeyama@Microsoft, Hacking Generative AI (@dahatake) &lt;a href=&#34;https://x.com/dahatake/status/1317257121658884097?ref_src=twsrc%5Etfw&#34;&gt;October 17, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;あとは、畠山さんに教えてもらったVSCodeの&lt;a href=&#34;https://github.com/Microsoft/vscode-remote-release&#34;&gt;Remote - WSL&lt;/a&gt;を入れて、
WLSに接続した状態でVSCodeを起動して記事のMarkdownを書くと、VSCodeのターミナルを開くとWSL2に接続してくれて、hugoコマンドが実行できます。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;とりあえず、ブログが書ける環境ができました。
Mac上にあった各種プロジェクトのディレクトリをコピーして、Rustの開発もできるようになりました。&lt;/p&gt;
&lt;p&gt;今後も環境構築は続いていきます。Javaとか入ってないし。
SDKMan使ってたけど、切り替えどうしよう？とか。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;そういえばSDKMAN!をJDK切替に使ってたけど、結局windows側のパスは通らんので自力インストールになった。scoopがよさげ&lt;/p&gt;&amp;mdash; きしだൠ(K1S) (@kis) &lt;a href=&#34;https://x.com/kis/status/1317274361854791680?ref_src=twsrc%5Etfw&#34;&gt;October 17, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;IDE系から呼び出すターミナルはWSL2がいいなぁとか。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;qme&#34; dir=&#34;ltr&#34;&gt;&lt;a href=&#34;https://t.co/X4Jj4tih1I&#34;&gt;https://t.co/X4Jj4tih1I&lt;/a&gt;&lt;/p&gt;&amp;mdash; そーだい@初代ALF (@soudai1025) &lt;a href=&#34;https://x.com/soudai1025/status/1317270352431476737?ref_src=twsrc%5Etfw&#34;&gt;October 17, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;ほかにもおすすめなどがあれば教えてください！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Windowsをお試し中</title>
      <link>https://blog.johtani.info/blog/2020/10/15/restart-windows/</link>
      <pubDate>Thu, 15 Oct 2020 11:04:02 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/10/15/restart-windows/</guid>
      <description>&lt;p&gt;ヒゲが伸びてきて(試しに伸ばしてる)不評を買っている今日このごろです。&lt;/p&gt;
&lt;p&gt;自宅で作業することが多くなってきたので、自作PCでもと思っていますが、OSをどうしようか悩み中。
とりあえず、試しにWindowsにしてみるかということで、10年ぶりくらいにWindowsに帰ってきました
(この文章はMacで入力してますが)。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ヒゲが伸びてきて(試しに伸ばしてる)不評を買っている今日このごろです。&lt;/p&gt;
&lt;p&gt;自宅で作業することが多くなってきたので、自作PCでもと思っていますが、OSをどうしようか悩み中。
とりあえず、試しにWindowsにしてみるかということで、10年ぶりくらいにWindowsに帰ってきました
(この文章はMacで入力してますが)。&lt;/p&gt;
&lt;h2 id=&#34;むかしむかし&#34;&gt;むかしむかし&lt;/h2&gt;
&lt;p&gt;もともとはWindowsを使っていたのですが、Win7くらいに32bitと64bit混在の時期に、
Xkeymacsを利用するときに少し手間がかかるなぁと思ったのもあり、Macに移行しました。
Macだと自分がよく使うEmacsっぽいショートカットがデフォルトいろんなアプリで使用できる利点があったからです。&lt;/p&gt;
&lt;p&gt;ただ、最近、&lt;a href=&#34;https://nzxt.jp/products/detail/kraken-z.html&#34;&gt;TL上で光るPC&lt;/a&gt;とかを見てしまったのもあり、
自作PC(どちらかというとDIYかな?)熱が復活しました。
まだ、OSをWindows、Ubuntuのどちらをメインにしようかな?と悩んでいるところではありますが、まずはWndowsをちょっと試してみるかなと。&lt;/p&gt;
&lt;p&gt;まずは、やりたいことをちょっとリストアップしておこうかなと思います(きっと、先人の知見が集まってくるはず!)。&lt;/p&gt;
&lt;h2 id=&#34;どうしてもほしい機能&#34;&gt;どうしてもほしい機能&lt;/h2&gt;
&lt;p&gt;大学の頃にSunOSやSolarisを使用し、Emacsでメールを読んだしていたせいで、Emacsのショートカット操作が体から抜けない状態です(抜こうとしてないという話もあるが)。
ですので、社会人になってからWindowsを利用していたときはXkeymacsというソフトのお世話になっていました(神アプリでした。まだあるのかな?)。&lt;/p&gt;
&lt;h3 id=&#34;ショートカット操作とか&#34;&gt;ショートカット操作とか&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;カーソル移動(必須)
&lt;ul&gt;
&lt;li&gt;上下左右：&lt;code&gt;Ctrl+n、p、f、b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;行頭、行末：&lt;code&gt;Ctrl+a、e&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;編集
&lt;ul&gt;
&lt;li&gt;デリートキー：&lt;code&gt;Ctrl+d&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ctrl+h&lt;/code&gt;がバックスペースだけど使わないな、そういえば&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;カーソルから行末までをカット：&lt;code&gt;Ctrl+k&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;必須!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;カーソル移動がホームポジションから移動しなくてもいいのもあって、多用してしまっています。
これ、WindowsとかUbuntuでいい感じにできるのあるのかな?
できれば、IMEやブラウザのURLのサジェストなどもこのカーソル移動で移動できると嬉しいです。
(昔は&lt;code&gt;M-%&lt;/code&gt;とかで置換などもやってたけど最近はやらないな。)&lt;/p&gt;
&lt;h2 id=&#34;デスクトップ操作系&#34;&gt;デスクトップ操作系&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;仮想デスクトップ
&lt;ul&gt;
&lt;li&gt;やることごとにデスクトップを切り替えて使うので&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ウィンドウのリサイズ?
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://mizage.com/divvy/&#34;&gt;Divvy&lt;/a&gt;というアプリをmacOSで利用中&lt;/li&gt;
&lt;li&gt;自分で登録したサイズ(例：画面右半分)にウィンドウサイズを変更などがショートカットで可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;仮想デスクトップはあると思うけど、ウィンドウのリサイズの便利なツールあるかなぁ?&lt;/p&gt;
&lt;h2 id=&#34;利用するアプリ&#34;&gt;利用するアプリ&lt;/h2&gt;
&lt;h3 id=&#34;snsオンラインミーティング&#34;&gt;SNS、オンラインミーティング&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Twitter
&lt;ul&gt;
&lt;li&gt;macOSではTweetDeckと夜フクロウを使用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Slack
&lt;ul&gt;
&lt;li&gt;ネイティブアプリ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Gitter
&lt;ul&gt;
&lt;li&gt;ネイティブアプリ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Chatwork
&lt;ul&gt;
&lt;li&gt;ブラウザ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Teams
&lt;ul&gt;
&lt;li&gt;ネイティブアプリ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Zoom
&lt;ul&gt;
&lt;li&gt;ネイティブアプリ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Google Meet
&lt;ul&gt;
&lt;li&gt;ブラウザ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Discord
&lt;ul&gt;
&lt;li&gt;ネイティブアプリ(最近使ってないな)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;色々使ってますが、最悪ブラウザで使う感じかな?&lt;/p&gt;
&lt;h3 id=&#34;オンラインストレージ&#34;&gt;オンラインストレージ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Google Drive
&lt;ul&gt;
&lt;li&gt;同期アプリ使ってる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Dropbox
&lt;ul&gt;
&lt;li&gt;あんまり使ってない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;開発系&#34;&gt;開発系&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;JetBrainsのIDE
&lt;ul&gt;
&lt;li&gt;Toolbox App&lt;/li&gt;
&lt;li&gt;IntelliJ&lt;/li&gt;
&lt;li&gt;CLion + Rust plugin&lt;/li&gt;
&lt;li&gt;Rider&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;zsh
&lt;ul&gt;
&lt;li&gt;macOSで標準になったから&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;コマンド系
&lt;ul&gt;
&lt;li&gt;git&lt;/li&gt;
&lt;li&gt;SDKman
&lt;ul&gt;
&lt;li&gt;ant&lt;/li&gt;
&lt;li&gt;gradle&lt;/li&gt;
&lt;li&gt;JDK&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Rust&lt;/li&gt;
&lt;li&gt;Hugo&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://jasperapp.io/&#34;&gt;Jasper&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;GitHubのIssueとかを見るネイティブアプリ&lt;/li&gt;
&lt;li&gt;自分が関連しているIssueとかが楽に見える(メールだと埋もれてしまう)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;エディタ&#34;&gt;エディタ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Visual Studio Code
&lt;ul&gt;
&lt;li&gt;開発系では?と思われるかもだけど、Markdownエディタとして使ってる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Emacs by Homebrew
&lt;ul&gt;
&lt;li&gt;最近は起動してない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;その他&#34;&gt;その他&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;カレンダー
&lt;ul&gt;
&lt;li&gt;macOSのカレンダーで複数のGoogleカレンダーを取り込んでる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ScanSnap
&lt;ul&gt;
&lt;li&gt;Ubuntuで使えるやつあるのかな?&lt;/li&gt;
&lt;li&gt;Mac miniにつないであるので、画面共有とかで入れればそれでOK&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;画面共有
&lt;ul&gt;
&lt;li&gt;winやubuntuからMac miniとか見えるかな?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;キーボード共有
&lt;ul&gt;
&lt;li&gt;macも使うので、KVMスイッチとかかな?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;マウス共有
&lt;ul&gt;
&lt;li&gt;MX ErgoのFlowを使うと行き来が簡単にできたので良さそう。&lt;/li&gt;
&lt;li&gt;ただし、Ubuntuだとどうなるのか?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;システム監視系
&lt;ul&gt;
&lt;li&gt;CPUの温度とかCPU、メモリの使用率とか&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;とりあえずこんなところです。カーソル移動系が一番重要なので、そのへんから色々とちょっとずつ試していく予定。
ぜひオススメアプリとかあれば教えていただければと。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Dozen0を作成した #DIYキーボード</title>
      <link>https://blog.johtani.info/blog/2020/10/11/build-dozen0/</link>
      <pubDate>Sun, 11 Oct 2020 23:53:26 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/10/11/build-dozen0/</guid>
      <description>&lt;p&gt;今年の春くらいから、セパレートタイプのキーボードが気になっています。
また、なんか知らないですが、Twitterのタイムラインが自作キーボード(DIYキーボード)で盛り上がってる気がします。
(たぶん、気になってるから余計目についてる)。
これとか。このスライドから、自分がやってるのは「まだ」DIYキーボードだなということで、タイトルに使ってみました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今年の春くらいから、セパレートタイプのキーボードが気になっています。
また、なんか知らないですが、Twitterのタイムラインが自作キーボード(DIYキーボード)で盛り上がってる気がします。
(たぶん、気になってるから余計目についてる)。
これとか。このスライドから、自分がやってるのは「まだ」DIYキーボードだなということで、タイトルに使ってみました。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;&lt;a href=&#34;https://x.com/hashtag/toruby?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#toruby&lt;/a&gt; &amp;quot;DIYキーボードは実質Ruby&amp;quot; 本日のスライドです! とちぎでこの話をできてよかった!!!q: &lt;a href=&#34;https://t.co/RJot71Ngu9&#34;&gt;https://t.co/RJot71Ngu9&lt;/a&gt;&lt;/p&gt;&amp;mdash; Kakutani Shintaro (@kakutani) &lt;a href=&#34;https://x.com/kakutani/status/1304655402378752001?ref_src=twsrc%5Etfw&#34;&gt;September 12, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;h2 id=&#34;セパレートタイプのキーボード&#34;&gt;セパレートタイプのキーボード&lt;/h2&gt;
&lt;p&gt;今年の夏まではMac Book Pro 16インチのキーボードを利用していました(&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/26/working-facility/&#34;&gt;参考:自宅の作業環境(2020)&lt;/a&gt;)。
これまで、自宅で作業することよりも、外で仕事をすることが多く、また、外といっても様々な場所(サムライズムだったり、オフィスだったり、カフェだったり)で作業をすることが多かったので、ノートPCのキーボードにしていました。流石にキーボードを持って歩くほどは気にしていなかったので。&lt;/p&gt;
&lt;p&gt;ただ、コロナウイルスの影響もあり、ほぼ自宅で作業することとなりました。
となると、前から気になっていたセパレートタイプのキーボードが俄然気になり始めます。
(といいつつ、&lt;a href=&#34;https://blog.johtani.info/blog/2020/09/08/update-working-facility/#%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%83%91%E3%83%BC%E3%83%A0%E3%83%AC%E3%82%B9%E3%83%88&#34;&gt;寄り道してたり&lt;/a&gt;しますが)&lt;/p&gt;
&lt;p&gt;気になっていたのはこのあたりなのですが、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://ergodox-ez.com/&#34;&gt;Ergodox EZ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.zsa.io/moonlander/&#34;&gt;Moonlander Mark I&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;流石にいきなり行くにはちょっと気が引けるなぁと(なかなかいいお値段)。
また、自分が日本語キーボードを利用しているというのもちょっとあります。&lt;/p&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;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://yushakobo.jp/shop/b0200st-f2-1/&#34;&gt;スイッチテスター人気スイッチ詰め合わせ 18個セット&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;「なるほど、これでどんな感触かわかるじゃないか!」と、気づけばポチッと押していました。。。
届いて、「ふむふむ、これがこういう感触なのか。なるほど」ポチポチ押しながら、さらに自作キーボードについて調べていきます。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;いろんな感触なんだなぁ &lt;a href=&#34;https://t.co/PaGDMIRJiv&#34;&gt;pic.twitter.com/PaGDMIRJiv&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1308289480458084353?ref_src=twsrc%5Etfw&#34;&gt;September 22, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;h2 id=&#34;キースイッチのストロークの深さを知りたくて&#34;&gt;キースイッチのストロークの深さを知りたくて&lt;/h2&gt;
&lt;p&gt;まぁ、当たり前なのですが、先程のキースイッチテスターどこにもつながっていません。
キーボード触ってるとわかりますが、ストロークが違いがあるんですよ。
ただ、これだとわからない。けど知りたい。&lt;/p&gt;
&lt;p&gt;で、ググっていると&lt;a href=&#34;https://qiita.com/kamaboko123/items/c32ad91434ffc7f4ff8d&#34;&gt;Arduinoを使ってLチカやってる人とか、キー入力させている人&lt;/a&gt;がいるじゃないですか。
これでは?そういえば、Arduinoもどきうちにもあるぞ?と。
で、準備をしていたときに見かけてしまったのがこのツイートでした。。。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;&lt;a href=&#34;https://t.co/ALl7OcRVRa&#34;&gt;https://t.co/ALl7OcRVRa&lt;/a&gt; 高機能テスターとしてもおすすめ&lt;/p&gt;&amp;mdash; Kakutani Shintaro (@kakutani) &lt;a href=&#34;https://x.com/kakutani/status/1312749674214744064?ref_src=twsrc%5Etfw&#34;&gt;October 4, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;&lt;strong&gt;やられてしまいました。。。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;dozen0作りました&#34;&gt;dozen0作りました&lt;/h2&gt;
&lt;p&gt;ということで、前置き長かったですが、Dozen0というキーボード(マクロパッド?)を&lt;a href=&#34;https://yushakobo.jp/shop/dozen0/&#34;&gt;遊舎工房さんから購入して&lt;/a&gt;作ってみました。
手順は&lt;a href=&#34;https://github.com/yynmt/Dozen0/blob/master/docs/buildguide_jp.md&#34;&gt;ビルドガイド&lt;/a&gt;という形でまとまっています。&lt;/p&gt;
&lt;p&gt;基本的にはこれに沿って作成しました。&lt;/p&gt;
&lt;h3 id=&#34;パーツと手順の確認&#34;&gt;パーツと手順の確認&lt;/h3&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;さてと。 &lt;a href=&#34;https://t.co/GTBJ7zDleN&#34;&gt;pic.twitter.com/GTBJ7zDleN&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1314798164919029765?ref_src=twsrc%5Etfw&#34;&gt;October 10, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;まずは入っているパーツがきちんとあるか確認します。
また、ビルドガイドでどんな作業があるのかをざっと眺めておきます。
まぁ、プラモデルといっしょですよね。&lt;/p&gt;
&lt;p&gt;キットにはキースイッチとキーキャップは含まれていません。これはご注意ください。
私は、キースイッチテスターとして入手していたキースイッチとキーキャップがどんな押し具合なのかを確認したかったので特に問題ありません。&lt;/p&gt;
&lt;h3 id=&#34;ハンダづけ&#34;&gt;ハンダづけ&lt;/h3&gt;
&lt;p&gt;&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B006MQD7M4/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/315d3oNrVHL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B006MQD7M4/?tag=johtani-22&#34;&gt;
      Amazon | 白光 ダイヤル式温度制御はんだこて FX600 | ハンダゴテ
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B004OR7UBM/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/31v9w4TJtPL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B004OR7UBM/?tag=johtani-22&#34;&gt;
      Amazon | 白光 こて先 2C型 T18-C2 | ハンダゴテパーツ
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B017SQ0TUO/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41aeyO9uzCL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B017SQ0TUO/?tag=johtani-22&#34;&gt;
      Amazon | 白光(HAKKO) セラミックヒーターはんだこて専用こて台 クリーニングスポンジ付き FH300-81 | ハンダゴテパーツ
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B0029LGAJI/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/31JumdeJaJL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B0029LGAJI/?tag=johtani-22&#34;&gt;
      Amazon | goot(グット) 高密度集積基板用 鉛入りはんだ Φ0.6mm スズ60%/鉛40% ヤニ入り SD-60 | ハンダゴテ
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;はんだ付け用に揃えた道具です。「自作キーボード ハンダゴテ」とかでググると出てきたものがこれだったので。
デフォルトのコテ先ではなく、2Cのコテ先に付け替えてから作業を開始しました。&lt;/p&gt;
&lt;p&gt;私の持っていたソケットはCherry MX系なのですが、気が向いたらKailh Chocも試したくなるかも?ということで、
すべてはんだ付けしました。本格的にはんだ付けしたのは大学以来だからもう20年近く経ってますね。
ソケットの足をプリント基板にはんだ付けするのですが、2Cのコテ先が大きくなかなか手こずりました(&lt;em&gt;これがこのあと問題を引き起こしました&lt;/em&gt;)。&lt;/p&gt;
&lt;p&gt;ソケット、リセットスイッチ、ProMicroをはんだ付けすればはんだの作業は終了です。&lt;/p&gt;
&lt;p&gt;&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;zxx&#34; dir=&#34;ltr&#34;&gt;&lt;a href=&#34;https://t.co/jjUo162n54&#34;&gt;pic.twitter.com/jjUo162n54&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1314810257873399810?ref_src=twsrc%5Etfw&#34;&gt;October 10, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;zxx&#34; dir=&#34;ltr&#34;&gt;&lt;a href=&#34;https://t.co/p5atvtHfFN&#34;&gt;pic.twitter.com/p5atvtHfFN&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1314810285002088448?ref_src=twsrc%5Etfw&#34;&gt;October 10, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;

&lt;/p&gt;
&lt;h3 id=&#34;スイッチの取付と組みたて&#34;&gt;スイッチの取付と組みたて&lt;/h3&gt;
&lt;p&gt;試したいキースイッチを選んでトッププレートにつけていきます。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;キーテスターからスイッチとキーキャップ持ってきて完成。動作確認はまだなのでまた、最初に戻るかもだけど、、、 &lt;a href=&#34;https://t.co/ZmBd3bgOKI&#34;&gt;pic.twitter.com/ZmBd3bgOKI&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1314822558865264641?ref_src=twsrc%5Etfw&#34;&gt;October 10, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;組み立ても終わり次は実際の動作確認です(ツイートしていますが、予想通りの展開でした)。&lt;/p&gt;
&lt;h3 id=&#34;ファームウェアの書き込み&#34;&gt;ファームウェアの書き込み&lt;/h3&gt;
&lt;p&gt;USBで接続して、ファームウェアの書き込みです。
書き込み手順は&lt;a href=&#34;https://github.com/yynmt/Dozen0/blob/master/docs/buildguide_jp.md#6-%E3%83%95%E3%82%A1%E3%83%BC%E3%83%A0%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF&#34;&gt;ビルドガイド&lt;/a&gt;にありますが、QMK Toolboxの使い方やQMK Configuratorの使い方は以下の&lt;a href=&#34;https://salicylic-acid3.hatenablog.com/&#34;&gt;サリチル酸さんのブログ&lt;/a&gt;がわかりやすかったです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://salicylic-acid3.hatenablog.com/entry/qmk-toolbox&#34;&gt;（初心者編）自作キーボードにファームウェアを書き込む&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://salicylic-acid3.hatenablog.com/entry/qmk-configurator&#34;&gt;（初心者編）QMK Configuratorを使ってキーマップを書き換えよう&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;実際に書き込んで動かしてみると。。。。&lt;/p&gt;
&lt;p&gt;&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;うーん、上半分が死んでる気がするなぁ。&lt;br&gt;デフォルトキーマップの書き込みはできたけど、カーソルの上とかバックスペースが入らないw&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1314844321674190848?ref_src=twsrc%5Etfw&#34;&gt;October 10, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;とりあえず、もう一回確認してみた。デフォルトのキーマップで、「Cut」「Paste」が強く押さないと入力されない。UpとDeleteは動くようになってた。CopyとBkSpがうんともすんとも言わない。下段のキーは全部動く。&lt;a href=&#34;https://t.co/zEyINdAK6t&#34;&gt;https://t.co/zEyINdAK6t&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1314916612168794112?ref_src=twsrc%5Etfw&#34;&gt;October 10, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;

&lt;/p&gt;
&lt;p&gt;といった具合に上半分が動作があやしいです。&lt;/p&gt;
&lt;h3 id=&#34;再度はんだ付け&#34;&gt;再度、はんだ付け&lt;/h3&gt;
&lt;p&gt;ということで、ネジを外して上の段のソケットをはんだで温めてみると、片側だけ温めるとはずれるじゃないですか。
どうやら、うまくソケットの足が基盤にはんだ付けできていなかったようです。
この時、最初に作業したときに2C型のコテ先が大きくて、ソケットの足に入らなかったのを思い出したので、
最初にはんだごてについていたコテ先に戻してから作業をしました。
これだとソケットの足の隙間に入るんです。ということで、挙動のおかしい上段のソケットをすべてつけ直したところ無事動作しました。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;上の段、全体的にソケットがうまくはんだ付けできてなかったみたいだった。今回はMX系のスイッチしかないので、Kailh Chocのソケットの導通は未確認。ざっとブログにまとめるか。&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1314927893680594944?ref_src=twsrc%5Etfw&#34;&gt;October 10, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;h3 id=&#34;現在のキーマップ&#34;&gt;現在のキーマップ&lt;/h3&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20201011/dozen0_music_play.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20201011/dozen0_music_play.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;これが今のキーマップです。仕事中のBGMをラズパイ4の音楽プレーヤーで流していますが、
部屋から出るときや、打ち合わせがあるときに音楽の停止、開始などを画面共有経由でやっています。
が、わざわざマウス移動するのもめんどくさいなと。これに使えそうだというのもあったので、Dozen0を購入したというのがあります。
残念ながら、&lt;code&gt;Prev Track&lt;/code&gt;とかがうまく動かないので、ショートカットを調べてキーマップ書き換える予定ですが、非常に便利になりました。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、Dozen0を作ってみましたが、楽しかったです。すんなりと行かなかったのがまた良かったです。
試行錯誤して動いたときの喜びが何倍もありました。また、キースイッチの感触も知ることができました。
たぶんGateron Silentクリア軸もしくは赤軸くらいが良さそうだなぁと(こうやって沼へ。。。)。
キーマップの仕組みを調べたり、もっと面白い使い方できないかな?と探りつつ、次のステップに進もうかなと。&lt;/p&gt;
&lt;p&gt;次は本格的なセパレートタイプのキーボードを作る予定です。が、お店のオープンを待ってからということになってます。はやくオープンしないかなぁ!!&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;がんばって!!&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1310887394879496193?ref_src=twsrc%5Etfw&#34;&gt;September 29, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


</content:encoded>
    </item>
    
    <item>
      <title>LinderaのFSTをDoubleArrayTrieに変更した話</title>
      <link>https://blog.johtani.info/blog/2020/10/05/switch-fst-2-da/</link>
      <pubDate>Mon, 05 Oct 2020 11:36:18 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/10/05/switch-fst-2-da/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;2020/10/06 11:00くらいにマージされました。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/minoru_osuka&#34;&gt;@minoru_osuka&lt;/a&gt; さんが開発を引き継いだ&lt;a href=&#34;https://qiita.com/mosuka/items/0fdaaf91f5530d427dc7&#34;&gt;LinderaというKuromojiのRustクローン&lt;/a&gt;があります(&lt;a href=&#34;https://github.com/lindera-morphology/lindera&#34;&gt;リポジトリ&lt;/a&gt;)
。
最近趣味でRustを勉強しているので、こちらを少し手伝っています。&lt;/p&gt;
&lt;p&gt;Rustの勉強仲間である&lt;a href=&#34;https://twitter.com/takuya_b&#34;&gt;@takuya_b&lt;/a&gt;さんや&lt;a href=&#34;https://twitter.com/ikawaha&#34;&gt;@ikawaha&lt;/a&gt;さんと話をしているときに、FST部分をDouble Array Trieに置き換えると速度が向上するのでは?という話が出まして、@takuya_bさんがDouble Array Trieを作るらしいという話になったので、下準備などをしつつ、作ってもらったライブラリ&lt;a href=&#34;https://github.com/takuyaa/yada&#34;&gt;yada&lt;/a&gt;を組み込んでみたという話です。&lt;/p&gt;</description>
      <content:encoded>&lt;blockquote&gt;
&lt;p&gt;2020/10/06 11:00くらいにマージされました。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/minoru_osuka&#34;&gt;@minoru_osuka&lt;/a&gt; さんが開発を引き継いだ&lt;a href=&#34;https://qiita.com/mosuka/items/0fdaaf91f5530d427dc7&#34;&gt;LinderaというKuromojiのRustクローン&lt;/a&gt;があります(&lt;a href=&#34;https://github.com/lindera-morphology/lindera&#34;&gt;リポジトリ&lt;/a&gt;)
。
最近趣味でRustを勉強しているので、こちらを少し手伝っています。&lt;/p&gt;
&lt;p&gt;Rustの勉強仲間である&lt;a href=&#34;https://twitter.com/takuya_b&#34;&gt;@takuya_b&lt;/a&gt;さんや&lt;a href=&#34;https://twitter.com/ikawaha&#34;&gt;@ikawaha&lt;/a&gt;さんと話をしているときに、FST部分をDouble Array Trieに置き換えると速度が向上するのでは?という話が出まして、@takuya_bさんがDouble Array Trieを作るらしいという話になったので、下準備などをしつつ、作ってもらったライブラリ&lt;a href=&#34;https://github.com/takuyaa/yada&#34;&gt;yada&lt;/a&gt;を組み込んでみたという話です。&lt;/p&gt;
&lt;h2 id=&#34;ベンチマークの追加&#34;&gt;ベンチマークの追加&lt;/h2&gt;
&lt;p&gt;下準備として、今のLindera(FST実装)がどのくらいの性能なのか?というのを計っておく必要があります。
幸いにも、Linderaのオリジナルの開発者の方が、&lt;a href=&#34;https://github.com/bheisler/criterion.rs&#34;&gt;criterion.rs&lt;/a&gt;というライブラリを使った&lt;a href=&#34;https://github.com/lindera-morphology/lindera/blob/581728bf790a331402ef7a200fd443c4f9244abd/lindera/benches/bench.rs&#34;&gt;ベンチマークプログラム&lt;/a&gt;を作成してくれていました。&lt;/p&gt;
&lt;p&gt;ただ、1種類だけだと少し心もとないなというのと、長い文章やパターンを増やしたほうが良さそうだなということで、
ベンチマーク自体をいくつか追加しました(&lt;a href=&#34;https://github.com/lindera-morphology/lindera/pull/74&#34;&gt;追加したときのPR&lt;/a&gt;)。&lt;/p&gt;
&lt;p&gt;種類としては、5種類のベンチマークです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;システム辞書のみのTokenizerのコンストラクタ呼び出し&lt;/li&gt;
&lt;li&gt;カスタム辞書ありのTokenizerのコンストラクタ呼び出し&lt;/li&gt;
&lt;li&gt;システム辞書のみのTokenizerの&lt;code&gt;tokenize&lt;/code&gt;処理の呼び出し&lt;/li&gt;
&lt;li&gt;カスタム辞書ありのTokenizerの&lt;code&gt;tokenize&lt;/code&gt;処理の呼び出し&lt;/li&gt;
&lt;li&gt;青空文庫の坊っちゃんのテキストをシステム辞書のみのTokenizerで&lt;code&gt;tokenize&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;1,2はコンストラクタ部分だけの処理をベンチマークテストする目的で作成しました。
LinderaはTokenizerがtokenize処理するのに利用するデータをいくつか内部で保持しています。
これらはファイルにシリアライズされており、Tokenizerのオブジェクト生成時に読み込みやデシリアライズ処理が発生します。
この部分だけも速度を計測したい目的でコンストラクタだけを切り出しました。&lt;/p&gt;
&lt;p&gt;3,4はTokenizerのメインの処理です。コンストラクタはベンチマークの対象外にしました。
純粋にtokenizeの処理だけを切り出して計測するためです。
カスタム辞書がある場合、ない場合は念の為切り出した形になっています。&lt;/p&gt;
&lt;p&gt;5は長い文章(文章が多いのでバリエーションも増える)を扱いたいために別にしました。&lt;/p&gt;
&lt;p&gt;これで、一応下準備が完了です。
ちなみに、Criterionは賢くて、前のベンチマークの結果と最新の結果を比較してくれる機能があります。
どんな感じで出てくるかはベンチマーク結果をご覧ください。&lt;/p&gt;
&lt;h2 id=&#34;yadaの組み込み&#34;&gt;yadaの組み込み&lt;/h2&gt;
&lt;p&gt;ベンチマークの準備をしていたところyadaがリリースされたので、Linderaへの組み込みを検討し始めました。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;というわけで、またダブル配列を書いてしまったので crate として公開しました。フィードバックお待ちしております！ &lt;a href=&#34;https://t.co/As7h0tfmjf&#34;&gt;https://t.co/As7h0tfmjf&lt;/a&gt;&lt;/p&gt;&amp;mdash; takuya-a (@takuya_b) &lt;a href=&#34;https://x.com/takuya_b/status/1307671030731694081?ref_src=twsrc%5Etfw&#34;&gt;September 20, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;h3 id=&#34;中身の理解&#34;&gt;中身の理解&lt;/h3&gt;
&lt;p&gt;lindera-fstを利用して、prefix searchしている処理があるので、そこで利用しているFSTをyadaに置き換えれば良さそうだと判断して、
処理を読んでいきます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tokenizerは、&lt;a href=&#34;https://github.com/lindera-morphology/lindera/blob/027ab8c7d5fdd6d1bc2dc7e8779adb1ddcf7f770/lindera-core/src/core/prefix_dict.rs&#34;&gt;PrefixDict&lt;/a&gt;という構造体でlindera-fstを利用している
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/lindera-morphology/lindera/blob/027ab8c7d5fdd6d1bc2dc7e8779adb1ddcf7f770/lindera-core/src/core/prefix_dict.rs#L27-L64&#34;&gt;prefixメソッド&lt;/a&gt;が入力文字列を元に、FSTを前方一致検索して、ヒットした単語の情報をIteratorとして取り出せる(単語の情報は「入力文字列の先頭からの文字数」と「ヒットした単語のWordEntry構造体」)&lt;/li&gt;
&lt;li&gt;PrefixDictのfstは辞書(例：ipadic)ごとに&lt;code&gt;lindera-&amp;lt;辞書名&amp;gt;-builder&lt;/code&gt;で生成される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;システム辞書としては、デフォルトでは&lt;code&gt;lindera-ipadic-builder&lt;/code&gt;でfstを構築している
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/lindera-morphology/lindera/blob/027ab8c7d5fdd6d1bc2dc7e8779adb1ddcf7f770/lindera-ipadic-builder/src/lib.rs#L237-L249&#34;&gt;構築処理はこの辺&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;という感じです。
また、辞書周りのファイルがそれぞれどんな役割なのか、どんなデータの持ち方をしているのか?といった点を、変更点の調査のついでに書き出してみました。&lt;a href=&#34;https://github.com/lindera-morphology/lindera/blob/master/lindera-dictionary/FILES.md&#34;&gt;lindera-dictionary/FILES.md&lt;/a&gt;。TODOになっている部分も追記が終わっています(&lt;a href=&#34;https://github.com/lindera-morphology/lindera/pull/77&#34;&gt;PR&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id=&#34;変更点&#34;&gt;変更点&lt;/h3&gt;
&lt;p&gt;実際に変更したプログラムの詳細についてはの&lt;a href=&#34;https://github.com/lindera-morphology/lindera/pull/76&#34;&gt;PR&lt;/a&gt;を見ていただくとして、簡単には以下の点になります。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Rustのバージョンを1.46.0に(おもにREADME.md)
&lt;ul&gt;
&lt;li&gt;yadaが利用している機能に1.46.0で導入された機能があるため&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;lindera-fstをyadaに変更(lindera-core/Cargo.toml, lindera-ipadic-builder/Cargo.toml)
&lt;ul&gt;
&lt;li&gt;合わせて、&lt;code&gt;dict.fst&lt;/code&gt;というファイル名を&lt;code&gt;dict.da&lt;/code&gt;に変更&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dict.da&lt;/code&gt;に関して構築部分と検索部分を変更
&lt;ul&gt;
&lt;li&gt;FSTではFSTから返ってくる値(入力文字列に出てきた単語に関連する値)は&lt;code&gt;u64&lt;/code&gt;だったが、yadaのDoubleArrayが&lt;code&gt;u32&lt;/code&gt;しか扱えないため、&lt;code&gt;u32&lt;/code&gt;に変更。テストの記述はしていないが、扱うデータ的に&lt;code&gt;u32&lt;/code&gt;で問題なさそうだったので。&lt;/li&gt;
&lt;li&gt;検索部分：PrefixDict構造体の&lt;code&gt;prefix&lt;/code&gt;メソッドで&lt;code&gt;DoubleArray&lt;/code&gt;の&lt;code&gt;prefix_common_search&lt;/code&gt;を使用
&lt;ul&gt;
&lt;li&gt;DoubleArray自体が&lt;code&gt;prefix_common_search&lt;/code&gt;のメソッドを持っていたので、処理が簡単に置き換え可能だった。FSTは&lt;code&gt;prefix&lt;/code&gt;メソッド内で独自で前方一致検索を実装していた。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;構築部分：&lt;code&gt;lindera-ipadic-builder/src/lib.rs&lt;/code&gt;の&lt;code&gt;build_dict&lt;/code&gt;と&lt;code&gt;build_user_dict&lt;/code&gt;の&lt;code&gt;dict.da&lt;/code&gt;構築処理
&lt;ul&gt;
&lt;li&gt;ipadicのCSVファイルを読み込んで、見出し語をキーに、辞書にある単語情報のベクタを値とするBTreeMapを生成し、このBTreeMapに基づいてFSTを構築していた部分をDoubleArray構築処理に置き換えた。&lt;/li&gt;
&lt;li&gt;シフト演算などで、実際の値(&lt;code&gt;dict.vals&lt;/code&gt;)へのポインタを作っていたのだが、ここの処理を読み解くために&lt;code&gt;FILES.md&lt;/code&gt;を書き出した。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;という感じです。そもそもデータ構造がどうなっているのか?から読み解いて、変更部分を洗い出して変更していった形になります。
取り込み作業中にいくつか&lt;code&gt;yada&lt;/code&gt;に要望(&lt;a href=&#34;https://github.com/takuyaa/yada/issues?q=is%3Aissue+is%3Aclosed&#34;&gt;このへん&lt;/a&gt;)を上げて、変更を取り込んでもらい、最終的にyadaのバージョン&lt;code&gt;0.3.2&lt;/code&gt;で問題なく動きそうだという形になりました。&lt;a href=&#34;https://twitter.com/takuya_b&#34;&gt;@takuya_b&lt;/a&gt;さん、対応ありがとうございました。&lt;/p&gt;
&lt;h4 id=&#34;エッジケースバグの発見&#34;&gt;エッジケースバグの発見&lt;/h4&gt;
&lt;p&gt;作っててよかった、テストケースでした(実際にはベンチマークテストですが)。
取り込み作業中に、Lindera本体の&lt;code&gt;cargo test&lt;/code&gt;はすべてOKになるが、ベンチマークを取ろうとしたときに、坊っちゃんの文字列を入力にしたベンチマークが失敗するという事象が発生しました(&lt;a href=&#34;https://github.com/lindera-morphology/lindera/pull/76#issuecomment-699735905&#34;&gt;PRのコメント参照&lt;/a&gt;)。
切り分けのために、入力の文章のどこでおかしくなるのか?DoubleArrayの&lt;code&gt;build&lt;/code&gt;メソッドに渡している値がおかしくないか?などをすこしずつ調べていくと次のバグが判明したという感じです。&lt;/p&gt;
&lt;p&gt;特定のデータ(ipadicの見出し語一覧)をDoubleArrayに入れて、特定の文字列(&lt;code&gt;「は相」&lt;/code&gt;)を&lt;code&gt;common_prefix_search&lt;/code&gt;にいれたら、
返ってくる情報(0から何バイト目の文字が一覧に存在した)が、不正な値が返ってくるというバグでした。
@takuya_bさんに見てもらいつつ(DoubleArrayの中身わからん。。。)、修正してもらいました。素早い対応ありがとうございます。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;yada 0.3.1 をリリースしています。特定の条件で不正な遷移を許すダブル配列が構築されてしまうバグを修正しています。このエッジケースは &lt;a href=&#34;https://x.com/johtani?ref_src=twsrc%5Etfw&#34;&gt;@johtani&lt;/a&gt; さんが見つけてくださいました。ありがとうございました！ &lt;a href=&#34;https://t.co/CiftZi5GDn&#34;&gt;https://t.co/CiftZi5GDn&lt;/a&gt;&lt;/p&gt;&amp;mdash; takuya-a (@takuya_b) &lt;a href=&#34;https://x.com/takuya_b/status/1311153143971864576?ref_src=twsrc%5Etfw&#34;&gt;September 30, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;やはり、いろんな文字列入れてテストしてみるの重要ですね。
ということで、ベンチマークだけでなく、テストケースとしても坊っちゃんのファイルを読み込んでトークナイズするようにPRでテストケースを追加しています。&lt;/p&gt;
&lt;h2 id=&#34;ベンチマーク結果&#34;&gt;ベンチマーク結果&lt;/h2&gt;
&lt;p&gt;yadaを利用した変更が終わったので、再度&lt;code&gt;cargo bench&lt;/code&gt;を実行して計測です。
計測としては、&lt;code&gt;master&lt;/code&gt;ブランチでまず&lt;code&gt;cargo bench&lt;/code&gt;を実行し、yadaの実装をしたブランチに切り替えてから&lt;code&gt;cargo bench&lt;/code&gt;を実行します。
すると、Criterion? &lt;code&gt;cargo bench&lt;/code&gt;が、最終的な結果に前回との差分でどのくらい性能が改善、改悪したかも合わせて出力してくれます。
実行環境と結果は以下のとおりです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MacBook Pro 16インチ
&lt;ul&gt;
&lt;li&gt;CPU：Core i7 6コア 2.6GHz&lt;/li&gt;
&lt;li&gt;メモリ：32GB&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20201005/bench.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20201005/bench.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;コンストラクタのベンチマークについては10%ほど性能が悪くなっています。
これは、FSTよりもDoubleArrayTrieのほうがデータが大きくなってしまうためだと思われます。
実際にファイルのサイズは次のようになりました。yada(DoubleArrayTrie)のほうが2倍以上大きいことがわかります。
また、このファイル以外にもLinderaが利用しているデータはありますが、それらは今回変更の対象にはなっていません。
なので、単純にこのファイルの読み込みの処理に時間がかかっているのだと想像できます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;2147765&lt;/strong&gt;&lt;/em&gt; / FST / dict.fst&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;5425152&lt;/strong&gt;&lt;/em&gt; / yada / dict.da&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;tokenize&lt;/code&gt;のベンチマークについては、11%〜28%の改善が見られました。
文章から、内部に保持している辞書に存在する単語を見つけ出す処理に利用されるのがFST、DoubleArrayTrieです。
今回の変更では、この処理に利用しているデータ構造だけを変更しました。
実際には&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DoubleArrayTrieを用いた単語の検索処理&lt;/li&gt;
&lt;li&gt;見つかった単語の持つ値(&lt;code&gt;data.vals&lt;/code&gt;のオフセット情報)を元にシフト演算&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;といった処理が実行されます。シフト演算は&lt;code&gt;u64&lt;/code&gt;だったものが&lt;code&gt;u32&lt;/code&gt;に変更されたくらいなので、大した処理量ではないかと。
大部分はDoubleArrayTrieを利用したルックアップ処理が速度向上に寄与していると思います。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;最近Linderaに加えた変更、作ったPRについて少しブログにまとめてみました。
ちなみに、まだPRの段階でレビュー&amp;amp;リリース待ちという感じです。&lt;/p&gt;
&lt;p&gt;実際には作ってもらったライブラリを組み込んでみたというだけなのですが、速度が向上した結果が見れたのは面白いです。
また、基本的なデータ構造とかアルゴリズムの勉強にもなりました(2次元配列を1次元配列に押し込むとか)。このへんも今後も勉強していきたいです。&lt;/p&gt;
&lt;p&gt;組み込む際に色々と協力していただいた@takuya_bさん、@ikawahaさん、巻き込んでくれた@minoru_osukaさんに改めて感謝いたします。&lt;/p&gt;
&lt;p&gt;Rustや形態素解析のプログラムの勉強を兼ねて、今後もなにか改善できる部分がないかなどを見ていこうと思っています。
Rustで形態素解析をしたいという人がどのくらいいるかはわかりませんが、おかしなところや疑問点などあればコメントください。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>本当にその検索は自分が想像している検索になってますか？</title>
      <link>https://blog.johtani.info/presentation/2020/ko04wz/</link>
      <pubDate>Sat, 19 Sep 2020 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2020/ko04wz/</guid>
      <description></description>
      <content:encoded></content:encoded>
    </item>
    
    <item>
      <title>検索対象のデータとデータソース(検索システムに関する妄想その3)</title>
      <link>https://blog.johtani.info/blog/2020/09/15/improve-search-no3/</link>
      <pubDate>Tue, 15 Sep 2020 11:23:34 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/09/15/improve-search-no3/</guid>
      <description>&lt;p&gt;先日は「&lt;a href=&#34;https://blog.johtani.info/blog/2020/07/28/improve-search-no2/&#34;&gt;検索システムを構成するパーツ&lt;/a&gt;」ということで検索システムを構成しているパーツについて書いてみました。&lt;/p&gt;
&lt;p&gt;大体、検索がうまくヒットしないといった場合に、問題になるのがコンテンツ自体のデータもしくは、転置インデックスのキーワードだったりします。
そこで今回は、前回のパーツの「データソース・コンテンツ」周りについて少し書いてみようと思います。言葉の定義、それぞれがどんなことをやるのか、とりあえず導入したあとにコンテンツ周りでどんな改善ができるかなどを書いてみます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;先日は「&lt;a href=&#34;https://blog.johtani.info/blog/2020/07/28/improve-search-no2/&#34;&gt;検索システムを構成するパーツ&lt;/a&gt;」ということで検索システムを構成しているパーツについて書いてみました。&lt;/p&gt;
&lt;p&gt;大体、検索がうまくヒットしないといった場合に、問題になるのがコンテンツ自体のデータもしくは、転置インデックスのキーワードだったりします。
そこで今回は、前回のパーツの「データソース・コンテンツ」周りについて少し書いてみようと思います。言葉の定義、それぞれがどんなことをやるのか、とりあえず導入したあとにコンテンツ周りでどんな改善ができるかなどを書いてみます。&lt;/p&gt;
&lt;h2 id=&#34;言葉の定義&#34;&gt;言葉の定義&lt;/h2&gt;
&lt;h3 id=&#34;コンテンツ&#34;&gt;コンテンツ&lt;/h3&gt;
&lt;p&gt;実際に検索させたいデータになります。
コンテンツにはWebページ、データベースのレコード(CMSで登録されたデータなど)、ファイルサーバーにある文書(PDF、Word、Excelなど)などになります。&lt;/p&gt;
&lt;h3 id=&#34;データソース&#34;&gt;データソース&lt;/h3&gt;
&lt;p&gt;コンテンツのマスタデータが保存されている先です。
よくあるデータソースとしては以下のものが考えられます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Webサイト - 自社もしくはインターネットに存在しているWebサイトです。&lt;/li&gt;
&lt;li&gt;ファイルサーバー - ローカルネットワーク上のファイルサーバーもありますが、最近ではGoogle DriveやDropboxといった外部のWebサービスもあります。&lt;/li&gt;
&lt;li&gt;RDB - CMSや自社システムでのデータの保存先です。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;クローラー&#34;&gt;クローラー&lt;/h3&gt;
&lt;p&gt;コンテンツをデータソースから収集してくるプログラムのことです。
Webサイトやファイルサーバーからコンテンツを収集して検索エンジンに登録するところまでを担当します。
RDBにあるデータを検索エンジンに登録する場合はクローラーがデータを登録するというよりは、RDBにデータを登録するシステムが検索エンジンに登録する機能を持っていることが多いです。&lt;/p&gt;
&lt;h2 id=&#34;データの収集と登録&#34;&gt;データの収集と登録&lt;/h2&gt;
&lt;h3 id=&#34;収集&#34;&gt;収集&lt;/h3&gt;
&lt;p&gt;クローラーを使用した収集の場合は、サービスの特性とデータソースによって、どの程度の頻度でクロールするのか、クロール対象はどこまでか?といったものを決める必要が出てきます。
これらが決まれば収集ができるかと(他に権限とかもありますが。)。
収集コンテンツは、そのままでは利用しにくかったり、利用できないことがあるので、次はデータの変換を行います。&lt;/p&gt;
&lt;h3 id=&#34;データ変換&#34;&gt;データ変換&lt;/h3&gt;
&lt;p&gt;コンテンツはそのままの形では検索エンジンには扱いにくいデータ形式である場合があります。&lt;/p&gt;
&lt;h4 id=&#34;webページの場合&#34;&gt;Webページの場合&lt;/h4&gt;
&lt;p&gt;Webページの場合、コンテンツにはHTMLタグが入っていたり、JavaScriptなど検索対象にはしたくないデータなどが入っています。これらを除去して、検索させたいものを取り出す必要があります。
また、Titleタグなど、いくつかメタデータとして扱えるものがHTMLで規定されているので、これらを別の項目として取り出して個別に検索できるようにすると便利です。
HTMLをパースしてデータを抜き出す処理ができるライブラリなどがあるので活用します。&lt;/p&gt;
&lt;h4 id=&#34;ファイル&#34;&gt;ファイル&lt;/h4&gt;
&lt;p&gt;PDFファイルなど、ファイルの場合もメタデータと呼ばれるファイル自体が持っている情報が存在します。作成者、更新日時、ファイル名、パスなどです。
これらも検索時に有効な情報になります。
また、ファイルから文字列を抜き出す処理も必要になります。
それぞれデータフォーマットが異なりますので、そのフォーマットに合わせて文章データを抜き出す処理が必要です。OSSや製品がありますので、それらを利用して、ファイルから文章を抜き出します。&lt;/p&gt;
&lt;h4 id=&#34;rdb&#34;&gt;RDB&lt;/h4&gt;
&lt;p&gt;RDBのデータの場合、データが正規化されています。
検索エンジンでは、非正規化のデータを登録して検索することが基本となるため、まずは非正規化して取り出す必要が出てきます。&lt;/p&gt;
&lt;p&gt;例えば、ジャンルやカテゴリ、各種IDなどが実際のコンテンツのレコードに入っていると思いますが、これらをユーザーが入力したキーワードで検索したい場合などは、IDではなく表示名を取り出して、検索エンジンに登録する必要が出てきます。&lt;/p&gt;
&lt;h4 id=&#34;その他&#34;&gt;その他&lt;/h4&gt;
&lt;p&gt;データごとの変換処理について説明しました。
その他に、データのクリーニング処理などと言ったことも必要になってきます。例えば、HTMLのタイトルに必ずサイト名が入っているが、除去したいといった場合や、検索エンジン固有のデータの前処理などもあります。&lt;/p&gt;
&lt;h3 id=&#34;登録&#34;&gt;登録&lt;/h3&gt;
&lt;p&gt;最後は検索エンジンへの登録です。
最近の検索エンジンはJSON形式でデータを受け取る場合が多いので、JSONに変換することが多いです。
基本的には各種プログラミング言語のライブラリが用意されているのでこれらを利用するのが基本となります。&lt;/p&gt;
&lt;p&gt;検索したい項目、検索させたい方法などを洗い出し、必要なデータを作成して検索エンジンに登録します。
登録と書いていますが、更新、削除などもここでの対象となります。&lt;/p&gt;
&lt;p&gt;ここまでの流れで、データソースからコンテンツを取得し、変換して、検索エンジンへの登録が終わりました。&lt;/p&gt;
&lt;h2 id=&#34;検索の改善&#34;&gt;検索の改善&lt;/h2&gt;
&lt;p&gt;検索のログから分析して改善していくのが良いですが、ユーザーからの質問や意見などからも改善すべき点が見えてくると思います。
検索ログでは、次のようなものを元に、検索がうまく行かないものを見つけ出します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;0件ヒット&lt;/li&gt;
&lt;li&gt;0件クリック&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ヒットしていない検索ワードがある場合、コンテンツに問題がある場合があります。まずはこのあたりをとってみるのが良いかと。
そもそも、入力されたキーワードにマッチするコンテンツを扱っていないこともわかりますし、入力されたキーワードに似た単語を持ったコンテンツなども存在するはずです。
類義語の辞書を用意して、検索にヒットできるようにするといった分析と改善にも利用できます。&lt;/p&gt;
&lt;p&gt;あとは、検索エンジン側の話ですが、形態素解析器などを利用している場合に、意図した区切りになっていないために、うまくキーワードがヒットしないと言ったこともあります。&lt;/p&gt;
&lt;h3 id=&#34;コンテンツの理解&#34;&gt;コンテンツの理解&lt;/h3&gt;
&lt;p&gt;実はこれが一番だったりします。
どんなコンテンツを自分たちが扱っているのか?どんなデータがどういった項目でコンテンツに入っているのか?といったところから、
コンテンツのデータを元に検索にヒットさせる方法が改善できます。&lt;/p&gt;
&lt;p&gt;CMSなど人が入力したデータをコンテンツとして扱う場合、入力画面を改良することで、望んでいるデータを入れてもらえたり、不要なデータが入らなくなる可能性があります。
例えば、ECサイトなどで商品の説明文やタイトルにいろいろなキーワードが入っている場合などがあります。むりやりどんなキーワードでもヒットさせたいという入力者の意図もあるのですが、検索しているユーザーにはノイズになることも多いです。適切にカテゴリやジャンル、属性といった項目に分けることでおかしな入力データを減らすことも可能です。&lt;/p&gt;
&lt;p&gt;Webサイトなどをクローリングしたものの場合は、サイトごとに文章の特徴があったり、重複している部分などが合ったりする場合があります。
これらもコンテンツをよく調べることで、不要な情報を除去したりといったことが可能になります。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;簡単ですが、検索のデータソースやコンテンツにまつわる話を紹介しました。
もちろんここでは紹介しきれていない項目がいっぱいあります。
また、具体例ではなく概略をざっくりと書いているのでわかりにくい場合もあるかもしれません。
すこしユースケースを絞り込んで書いたほうがわかりやすくなるのかも?&lt;/p&gt;
&lt;p&gt;次はUIとか書くかも?&lt;/p&gt;
&lt;p&gt;不明点とか疑問点、指摘事項などあればコメントしていただければと。
要望などもお待ちしております。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>自宅の作業環境(2020/09)</title>
      <link>https://blog.johtani.info/blog/2020/09/08/update-working-facility/</link>
      <pubDate>Tue, 08 Sep 2020 11:17:25 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/09/08/update-working-facility/</guid>
      <description>&lt;p&gt;自宅環境に少しアップデートがあったので更新版です。
お客さんのおかげで相変わらず自宅で作業させてもらってるのもあり、昨今のコロナウイルスの影響で出かけることもないので、自室の作業環境が更新されている感じです。
&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/26/working-facility/&#34;&gt;前回のブログ&lt;/a&gt;はこちらです。
前回のまとめで触れていた2点について更新されています。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;自宅環境に少しアップデートがあったので更新版です。
お客さんのおかげで相変わらず自宅で作業させてもらってるのもあり、昨今のコロナウイルスの影響で出かけることもないので、自室の作業環境が更新されている感じです。
&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/26/working-facility/&#34;&gt;前回のブログ&lt;/a&gt;はこちらです。
前回のまとめで触れていた2点について更新されています。&lt;/p&gt;
&lt;p&gt;まずは、現状のデスクの上の写真です。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20200908/my_desk.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20200908/my_desk.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;基本的には前回紹介したものと大きくは変わっていません(?)。
変わったものについて紹介していきます。&lt;/p&gt;
&lt;h2 id=&#34;デスク&#34;&gt;デスク&lt;/h2&gt;
&lt;p&gt;先程の写真ではちょっとわかりにくいですが、スタンディングデスクになりました。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;タイマーついてるの便利 &lt;a href=&#34;https://t.co/E9engTIMnM&#34;&gt;pic.twitter.com/E9engTIMnM&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1255668820510818304?ref_src=twsrc%5Etfw&#34;&gt;April 30, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;Flexispotの天板と足の組み合わせにしました。
前のElectaの天板が明るめの色だったのもあって、メープルの天板です。
組み立てはちょっと大変でした。
足が重たいのと、天板にはネジ穴がなく電動ドライバーもないので、ネジ締めと机を起こすのがちょっと大変です。子供に手伝ってもらいながら組み立て設置をしました。
オンラインミーティングなどのときには基本、立って作業しています。
あとは、デフォルトのタイマー設定のままですが、45分ごとに立ったり座ったりを数回繰り返す感じです。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07G9FPCMP/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/418QnGvWMCL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07G9FPCMP/?tag=johtani-22&#34;&gt;
      Amazon | FLEXISPOT オフィスデスク用天板  スタンディングデスク120×60cm
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07LF51796/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/31dT5fmTcnL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07LF51796/?tag=johtani-22&#34;&gt;
      Amazon | FLEXISPOT スタンディングデスク 電動式 昇降デスク メモリー機能付き ブラック EN1B（天板別売り） 
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;スタンディングデスクマット&#34;&gt;スタンディングデスクマット&lt;/h2&gt;
&lt;p&gt;フローリングに45分立ちっぱなしだと結構、足の裏がつかれるんですよ。なので、クッション性が高いフロアマットを立ってるときは利用しています。ちょっとめんどくさいのですが、椅子のときは壁に立て掛けて、立つときにマットを敷くようにして使っています。&lt;/p&gt;
&lt;p&gt;ちなみに、ウレタン素材なので開封直後はすごい匂いでした。。。
数日は陰干しみたいなのが必要です、ご注意を。
ただ、これを利用してから膝やかかとが痛いことはなくなっています。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07MVY63GH/?tag=johtani-22&#34;&gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07MVY63GH/?tag=johtani-22&#34;&gt;
      Amazon | 疲労軽減マット スタンディングデスクマット 滑り止め加工 立ち仕事 耐水 耐油 耐菌 (ブラック, 75cm*50cm*2cm)
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;ケーブルトレー&#34;&gt;ケーブルトレー&lt;/h2&gt;
&lt;p&gt;スタンディングデスクだとケーブルをぶら下げた状態だと危なそうだなということで、ケーブルトレーも机の下に追加してあります。電源タップを配置して、ディスプレイなどの電源はこちらから取るようにして、ケーブルトレーからは電源タップとスタンディングデスクの電源コードを垂らすという感じです。実際にはLANケーブルも伸びてたりはしますが。。。
また、後で出てくるラズパイ+SSDも最近こちらに移設しました。
最初にチャコールグレーを発注したのですが、配送日が未定になったので、Lサイズのシルバーを発注するという慌てようでした。
結局、今は両方使っています。テーブルタップにラズパイと、結構乗せるものがあるんですよね。見えない場所だし、色が揃ってないのは気にならないかなと。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B00BP4S3D6/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/21Bu-Umo6eL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B00BP4S3D6/?tag=johtani-22&#34;&gt;
      Amazon | プラス Garage ワイヤーケーブルトレー Lサイズ 幅63.7cm シルバー 
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B08494LN4W/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/315bSI6FgFL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B08494LN4W/?tag=johtani-22&#34;&gt;
      Amazon | プラス Garage 配線ケーブルトレー 幅40cm チャコールグレー
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;キーボードパームレスト&#34;&gt;キーボード+パームレスト&lt;/h2&gt;
&lt;p&gt;10数年ぶりに外付けキーボードじゃないかな?
少なくともMacに移行してからは、ずっとMac bookのキーボードを使ってました(極稀にMac mini起動後とかにMagic Keyboard使うくらい)。
外出して仕事をすることが多かったのもあり、体をキーボードに合わせる感じでした。&lt;/p&gt;
&lt;p&gt;が、ずっと在宅で仕事をしていますし、&lt;a href=&#34;https://item.rakuten.co.jp/f141500-sagamihara/11065-30029135/&#34;&gt;ふるさと納税でRealforce(リンクは楽天)&lt;/a&gt;がということで、申し込んでみました。2週間ちょっとで到着。
箱が厳重でびっくりしました。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07QCBJ7VT/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41jWiVpUm1L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07QCBJ7VT/?tag=johtani-22&#34;&gt;
      Amazon | 東プレ REALFORCE SA for Mac ホワイト R2SA-JP3M-WH | Realforce
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;まだ深いキーに慣れつつあると言った感じです。
付属の2mmのキースペーサーでAPCを2.2mmの設定で使用しています。最初は3mm+APC 1.5mmでやっていたのですが、流石にキーが敏感すぎてちょっとキーボードに手をおいたまま考え事をしているだけで「lllllllllll」のようになってしまったので現在の組み合わせに落ち着いています。&lt;/p&gt;
&lt;p&gt;あと、特殊な設定としてはスペースの横の&lt;code&gt;eng&lt;/code&gt;/&lt;code&gt;kana&lt;/code&gt;キーを設定でキーロックして使えなくしました。どうも、ご入力の原因になっているようだったので。
日本語の入力切替は、昨日までは&lt;code&gt;Ctrl+Space&lt;/code&gt;を使用していましたが、このブログを書き始めてから&lt;code&gt;Ctrl+\&lt;/code&gt;に変更しています。
むかーし、使っていたIME切り替えのショートカットです(知っている人は知っているやつ)。&lt;/p&gt;
&lt;p&gt;マウスは使用しておらず、キーボードの手前にトラックパッドをおいて使っています。パームレストの部分は、&lt;a href=&#34;https://magictray.samuraism.com/magictraypalm/&#34;&gt;サムライズムさんのトラックパッドがきれいに入るmagicTrayPalm&lt;/a&gt;です。
Mac book Proと同じような感じでトラックパッドが使えるのがいいですね。
興味がある方は、&lt;a href=&#34;https://secure.samuraism.com/hardware-referral/FFDB5DB101C223387141F6A31888C4E6&#34;&gt;侍割&lt;/a&gt;のリンクをたどってもらうと、初めてサムライズムさんで買い物をする方に限り割引がつくようになってるみたいです(なんと、私もなんか割引になる!)。&lt;/p&gt;
&lt;h2 id=&#34;ディスプレイアーム&#34;&gt;ディスプレイアーム&lt;/h2&gt;
&lt;p&gt;外付けキーボードになったのですが、Mac Book Proの画面も活用したく、さらに上下での配置がやはり目線の移動距離が少ないので気に入っていました。ただ、前回のブログで紹介したアームでは少し高さが足りず。。。
思案しながらAmazonを回遊していたら、同じ会社の新しいアームがあり、調べると高さが取れそうだということで付け替えました。
アーム2本ありますが、今のところ1本だけを使っています。
2本目のアームにカメラを乗せるのもあり?と思いながらまだ試していませんが。玉突き式に前に使っていたアームがサンダーボルトディスプレイ(縦置き)のアームになっています。前にサンダーボルトにつけていたアームは重量オーバーで悲鳴を上げていたので。。。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B085Y6W6RS/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41HRN8v45-L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B085Y6W6RS/?tag=johtani-22&#34;&gt;
      Amazon | HUANUO 2画面 アーム デュアル ガススプリング式 
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;スマホ充電器&#34;&gt;スマホ充電器&lt;/h2&gt;
&lt;p&gt;寝室で利用していた斜めに立てかけるタイプのワイヤレス充電器を作業デスクに持ってきました。
実は部屋に時計がなく、Pixel 3 XLを使っているので、スマホの画面に常に表示されている時計を置き時計の代わりに使えそうだなと
(スマホで写真を撮っているので上の画像ではスマホがありませんが)。
結構便利です。ちょっと時間を確認したいときに、メニューバーの時計では流石に小さすぎるのでw&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07DJC28GS/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/31APBV3mIpL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07DJC28GS/?tag=johtani-22&#34;&gt;
      Amazon | Anker PowerWave 7.5 Stand, Qi ワイヤレス充電器
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;ミキサー&#34;&gt;ミキサー&lt;/h2&gt;
&lt;p&gt;音声のミキサーです。Yamahaのスピーカーは入力が2系統あるのですが、入力したい音声は3系統あります(ラズパイ4、Mac mini、メインディスプレイ)。2入力を1系統にまとめるプラグを試しに買ってみて、Mac miniとラズパイをまとめてみたのですが、残念ながら切り替わるときに数分無音状態が続くという問題が発生しました。
USB給電できるタイプを購入しました。スライダーとかいらないなと思っていたのですが、電話やミーティング時にBGMの音を下げたりするのに地味に便利だったりします。
ただ、スライダーを動かそうとすると本体も動いてしまっていたので、本体裏に滑り止めを貼ってあります。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07DRB8LJ3/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51PSfRsNTdL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07DRB8LJ3/?tag=johtani-22&#34;&gt;
      Amazon | Maker hart Just Mixer ステレオ3入力音声ミキサー/電池とUSB電源可能 
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;webカメラ&#34;&gt;Webカメラ&lt;/h2&gt;
&lt;p&gt;おっさんの顔がきれいに写っても仕方ないんですが、下からのアングルよりはいいかなぁということと、今後の勉強会で使えそうかな?ということで、購入してみました。
縦でも横でも使える便利なカメラです。また、あんまりないのですが、部屋の中などを写すときにカメラを持ち回せるの便利ですね。
ディスプレイの上に置いてしまうと高さがありすぎるということで、スピーカーの上に乗っけています。仮置きなのですが、このままになるんじゃないかな?
打ち合わせ中は画面共有してることが多いのでオンライン飲み会などで主に活躍してる気も。。。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B086R4VGVX/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41qfX3a1KXL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B086R4VGVX/?tag=johtani-22&#34;&gt;
      Amazon | ロジクール ウェブカメラ フルHD 1080P 60FPS StreamCam C980OW オフホワイト USB-C接続
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;mac-miniのssd化&#34;&gt;Mac miniのSSD化&lt;/h2&gt;
&lt;p&gt;見えないところですが、Mac miniのHDDをSSDに差し替えました。
性能検証用のマシンとしてMac miniを利用し始めたのですが、
計測するたびに速度の差がありすぎるのでおかしいな?と。
よくよく考えてみると、このMac miniは&lt;a href=&#34;https://support.apple.com/ja-jp/HT202574&#34;&gt;Fusion Drive&lt;/a&gt;だったんです。。。
開発などで使う分には大容量だし便利だったのですが、負荷計測に利用する場合は挙動をハンドリングできないので、弊害でしかないです。。。
ということで、頑張って差し替えました。想像以上の大手術でした。
「Mac mini HDD 交換」などでググると換装している方たちがいらっしゃいます。興味ある方はググってみてください。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;さて、復路 &lt;a href=&#34;https://t.co/SwndXPoKqn&#34;&gt;pic.twitter.com/SwndXPoKqn&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1287041775593385984?ref_src=twsrc%5Etfw&#34;&gt;July 25, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B079SJ32TT/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41gXg8ABtML._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B079SJ32TT/?tag=johtani-22&#34;&gt;
      Amazon | シリコンパワー SSD 1TB SATA3 6Gb/s 2.5インチ 
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;ラズパイ4&#34;&gt;ラズパイ4&lt;/h2&gt;
&lt;p&gt;Mac miniの負荷検証マシン化のため+Linuxを触りたかったというのもあり、ラズパイ4を追加しました。
Mac miniは主な使用用途が音楽再生だったのでラズパイ4で肩代わりできるだろう+その他の検証にもラズパイ4が使えそうだと。
現在はUbuntuをインストールして、画面共有で操作しています。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B0C81W8RWH/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/61Wmih9j8PL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B0C81W8RWH/?tag=johtani-22&#34;&gt;
      Amazon | RasTech Raspberry Pi 4 4B MicroSDHCカード32G
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;かなり快適になりました。キーボードもうるさくないですし、熱くもありません。マイクのポップガードは意味がなさそうなので外しました。&lt;/p&gt;
&lt;p&gt;まだいくつか気になってるものもあるので、また更新するかもしれません。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;分離式キーボード - 胸を広げた状態でキーを打ったほうがいいのでは?という気がしています。ただ、最近はずっと日本語キーボードを使っているので選択肢が少ないんですよね。。。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;サンダーボルト?USB-C?ドック - MacBook Proのポートがすべて埋まっているし、もう少しケーブルを減らせると幸せになれそうなきが。。。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;モバイルディスプレイ - MacBook Proのディスプレイを使っているのですが、キーボードの上にかぶってるんですよね、結構。。。クラムシェルにしてiPadもしくはモバイルディスプレイに置き換えたほうがスッキリはしそうかなと。ただ、Touch IDが使えなくなったり、クラムシェル状態でMacBook Proの電源を入れられないというはなしなので、あまり意味がなさそうだなというのもあります。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>meteredクレートの紹介</title>
      <link>https://blog.johtani.info/blog/2020/09/07/intro-metered-rs/</link>
      <pubDate>Mon, 07 Sep 2020 23:11:40 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/09/07/intro-metered-rs/</guid>
      <description>&lt;p&gt;Rustで便利なクレートを見つけたので、紹介がてら、自分のメモのためにブログに残しておきます。&lt;/p&gt;
&lt;h2 id=&#34;そもそもの問題&#34;&gt;そもそもの問題&lt;/h2&gt;
&lt;p&gt;Rustで処理を書いていて、なんかちょっと遅いな?どこの処理で時間がかかってるんだろう?
ということがありませんか?ありますよね?&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Rustで便利なクレートを見つけたので、紹介がてら、自分のメモのためにブログに残しておきます。&lt;/p&gt;
&lt;h2 id=&#34;そもそもの問題&#34;&gt;そもそもの問題&lt;/h2&gt;
&lt;p&gt;Rustで処理を書いていて、なんかちょっと遅いな?どこの処理で時間がかかってるんだろう?
ということがありませんか?ありますよね?&lt;/p&gt;
&lt;p&gt;というのを調べるために、最初に思いつくのは自分で計測する方法です。
流石にそれはなぁ、と思ったのでググって出てきた方法を最初は使っていました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://qiita.com/pseudo_foxkeh/items/5d5226e3ffa27631e80d&#34;&gt;Rustで実行時間計測&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3年前の記事ですが、とりあえず計測する分には問題なかったのでこちらの方が書いていたマクロを拝借していました。
が、ちょっと面倒なのが戻り値がある処理などのときに、このマクロを挟むのが結構めんどくさいなと。
また、処理の時間を測りたいのは基本的にはメソッドや関数単位であることが多いです。&lt;/p&gt;
&lt;p&gt;で、さらにググっていて見つけたのが、&lt;a href=&#34;https://crates.io/crates/metered&#34;&gt;metered&lt;/a&gt;でした。&lt;/p&gt;
&lt;h2 id=&#34;どんなもの&#34;&gt;どんなもの?&lt;/h2&gt;
&lt;p&gt;計測したい部分に&lt;code&gt;#[metric]&lt;/code&gt;のようなアノテーションを追加することで計測対象としてくれます。
あとは、計測したものを保存するレジストリという場所を指定するだけです。
処理が終わったタイミングなどで、そのレジストリの内容を出力することで、次の情報を計測することができます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HitCount : 実行された回数&lt;/li&gt;
&lt;li&gt;ErrorCount : エラーを返した数(&lt;code&gt;Result&lt;/code&gt;を戻り値にしているメソッドが対象)&lt;/li&gt;
&lt;li&gt;InFlight : 処理中の回数かな?&lt;/li&gt;
&lt;li&gt;ResponseTime : レスポンスタイム(処理に何秒かかったか)&lt;/li&gt;
&lt;li&gt;Throughput : スループット(1秒あたり何回呼ばれたか)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;とりあえず試してみたのは、ResponseTimeとThroughputです。他のメトリクスはまた後日(機会があれば)。
また、&lt;code&gt;metered::metric::Metric&lt;/code&gt;トレイトというものが用意されているようで、これを実装した独自のメトリクスも扱うことができるようです。&lt;/p&gt;
&lt;h2 id=&#34;使い方&#34;&gt;使い方&lt;/h2&gt;
&lt;p&gt;使い方としては次のようになります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;計測対象となるメソッドがある構造体に、メトリクスを保持するためのレジストリを用意&lt;/li&gt;
&lt;li&gt;計測対象にしたい構造体のメソッドに&lt;code&gt;#[measure]&lt;/code&gt;を追加(このとき、計測したいものも指定する。)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;あとは、実行したあとに構造体をダンプするとメトリクスが出力されます。&lt;/p&gt;
&lt;h3 id=&#34;レジストリの用意&#34;&gt;レジストリの用意&lt;/h3&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#[derive(Default, Debug, Serialize)]&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;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;NekoParser&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    metric_reg: &lt;span style=&#34;color:#a6e22e&#34;&gt;NekoParserMetricRegistry&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;NekoParserMetricRegistry&lt;/code&gt;という型はこのあとの&lt;code&gt;impl&lt;/code&gt;のアノテーションで指定する名前になります。
実際にはこの型の構造体を自分で定義する必要はありません。
構造体の&lt;code&gt;derive&lt;/code&gt;で&lt;code&gt;Default&lt;/code&gt;を指定します。構造体のインスタンス化のときに&lt;code&gt;default()&lt;/code&gt;メソッドを呼び出して初期化したいためです(おそらくレジストリの初期化をやってくれるのだと思う(&lt;strong&gt;要確認&lt;/strong&gt;))。
レジストリの用意はこれだけです。&lt;/p&gt;
&lt;h3 id=&#34;レジストリの指定と計測対象の指定&#34;&gt;レジストリの指定と計測対象の指定&lt;/h3&gt;
&lt;p&gt;計測対象側です。少し長いですが、&lt;code&gt;NekoParser&lt;/code&gt;のメソッドすべてを掲載しました。
まずは、1行目でレジストリの名前の指定(&lt;code&gt;registry = NekoParserMetricRegistry&lt;/code&gt;)、レジストリのフィールド名(&lt;code&gt;registry_expr = self.metric_reg&lt;/code&gt;)、レジストリの可視性(&lt;code&gt;visibility = pub(self)&lt;/code&gt;)を定義します。
2行目では、&lt;code&gt;impl&lt;/code&gt;ブロック全体で計測したいメトリクスを指定しています。今回は、スループットとレスポンスタイムを計測したかったので
&lt;code&gt;#measure([ResponseTime, Throughput])]&lt;/code&gt;と2種類を指定しています。
メトリクスが2種類のため配列で指定していますが、1種類だけの場合は&lt;code&gt;[]&lt;/code&gt;の記号は必要ありません。&lt;/p&gt;
&lt;p&gt;あとは、計測したい各メソッドに&lt;code&gt;#[measure]&lt;/code&gt;をつけるだけです。
なお、メソッドごとに&lt;code&gt;#[measure(ErrorCount)]&lt;/code&gt;といったかたちで個別にメトリクスを指定することも可能です。
今回はお試しということもあり、すべて&lt;code&gt;#[measure]&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#[metered(registry = NekoParserMetricRegistry, registry_expr = self.metric_reg, visibility = pub(self))]&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;#[measure([ResponseTime, Throughput])]&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;impl&lt;/span&gt; NekoParser {
&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;#[measure]&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;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;load_and_parse_neko&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self) {
&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;let&lt;/span&gt; file_path &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;./data/chap04/neko.txt&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:#66d9ef&#34;&gt;let&lt;/span&gt; file &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; File::open(file_path).unwrap();
&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;let&lt;/span&gt; buf &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; BufReader::new(file);
&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;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; out &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; File::create(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;./data/chap04/neko.txt.lindera.json&amp;#34;&lt;/span&gt;).unwrap();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        buf.lines().filter_map(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;item&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; item.ok()).for_each(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;line&lt;span style=&#34;color:#f92672&#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;let&lt;/span&gt; tokens &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self.tokenize(line.as_str());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            self.output_tokens(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;tokens, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; out);
&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:#75715e&#34;&gt;#[measure]&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;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;output_tokens&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self, tokens: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;Vec&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Token&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;, buf: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;mut&lt;/span&gt; File) {
&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;writeln!&lt;/span&gt;(buf, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{}&amp;#34;&lt;/span&gt;, serde_json::to_string(tokens).unwrap())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Error during output json&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;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;#[measure]&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;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;tokenize&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self, line: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;) -&amp;gt; Vec&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Token&lt;span style=&#34;color:#f92672&#34;&gt;&amp;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;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; tokenizer &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lindera::tokenizer::Tokenizer::new(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;normal&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&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:#66d9ef&#34;&gt;let&lt;/span&gt; lindera_tokens &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; tokenizer.tokenize(line);
&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;let&lt;/span&gt; tokens &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lindera_tokens
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .iter()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .map(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;lindera_token&lt;span style=&#34;color:#f92672&#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;let&lt;/span&gt; surface &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lindera_token.text.to_string();
&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;let&lt;/span&gt; pos &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lindera_token.detail[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;].to_string();
&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;let&lt;/span&gt; pos1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; pos &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;UNK&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    lindera_token.detail[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;].to_string()
&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;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    String::new()
&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;let&lt;/span&gt; base &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; pos &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;UNK&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    lindera_token.detail[&lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;].to_string()
&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;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    String::new()
&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;                Token {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    surface,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    base,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    pos,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    pos1,
&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;            .collect();
&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;return&lt;/span&gt; tokens;
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;計測結果の出力&#34;&gt;計測結果の出力&lt;/h3&gt;
&lt;p&gt;最後は計測結果の出力です。
今回はテストメソッドで実行して結果を出力する処理を書きました。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;let parser = NekoParser::default();&lt;/code&gt;で構造体をインスタンス化します。
あとは、処理をそのまま実行します。&lt;/p&gt;
&lt;p&gt;最後に出力結果をJSON形式の文字列にしてから出力しました。
&lt;code&gt;let serialized ... println!(&amp;quot;{}&amp;quot;, serialized);&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#[cfg(test)]&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;mod&lt;/span&gt; tests {
&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;use&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;crate&lt;/span&gt;::chapter04::answer::NekoParser;
&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;use&lt;/span&gt; std::path::Path;
&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;#[test]&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;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;success_output_tokenlists&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;let&lt;/span&gt; parser &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; NekoParser::default();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        parser.load_and_parse_neko();
&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;let&lt;/span&gt; serialized &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; serde_json::to_string(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;parser).unwrap();
&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;println!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, serialized);
&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;assert!&lt;/span&gt;(Path::new(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;./data/chap04/neko.txt.lindera.json&amp;#34;&lt;/span&gt;).exists());
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;出力結果&#34;&gt;出力結果&lt;/h3&gt;
&lt;p&gt;ここまで紹介したものの実行結果は次のような形でした。
レスポンスタイム、スループットともに、最小、最大、99パーセンタイルなどを出力してくれます。
出力はメソッド名ごとにくくられているのでとても便利です。&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-json&#34; data-lang=&#34;json&#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;&amp;#34;metric_reg&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:#f92672&#34;&gt;&amp;#34;load_and_parse_neko&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:#f92672&#34;&gt;&amp;#34;response_time&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:#f92672&#34;&gt;&amp;#34;samples&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;&amp;#34;min&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;176128&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;&amp;#34;max&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;177151&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;&amp;#34;mean&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;176640.0&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;&amp;#34;stdev&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0.0&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;&amp;#34;90%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;177151&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;&amp;#34;95%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;177151&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;&amp;#34;99%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;177151&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;&amp;#34;99.9%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;177151&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;&amp;#34;99.99%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;177151&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:#f92672&#34;&gt;&amp;#34;throughput&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:#f92672&#34;&gt;&amp;#34;samples&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;&amp;#34;min&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;&amp;#34;max&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;&amp;#34;mean&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0.0&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;&amp;#34;stdev&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0.0&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;&amp;#34;90%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;&amp;#34;95%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;&amp;#34;99%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;&amp;#34;99.9%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;&amp;#34;99.99%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#f92672&#34;&gt;&amp;#34;output_tokens&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:#f92672&#34;&gt;&amp;#34;response_time&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:#f92672&#34;&gt;&amp;#34;samples&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;9964&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;&amp;#34;min&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;&amp;#34;max&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;143&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;&amp;#34;mean&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0.03592934564431955&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;&amp;#34;stdev&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1.5152489085107463&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;&amp;#34;90%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;&amp;#34;95%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;&amp;#34;99%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;&amp;#34;99.9%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;6&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;&amp;#34;99.99%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;143&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:#f92672&#34;&gt;&amp;#34;throughput&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:#f92672&#34;&gt;&amp;#34;samples&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;174&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;&amp;#34;min&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;39&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;&amp;#34;max&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;71&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;&amp;#34;mean&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;57.103448275862064&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;&amp;#34;stdev&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;3.8417981983375835&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;&amp;#34;90%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;60&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;&amp;#34;95%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;61&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;&amp;#34;99%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;64&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;&amp;#34;99.9%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;71&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;&amp;#34;99.99%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;71&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:#f92672&#34;&gt;&amp;#34;tokenize&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:#f92672&#34;&gt;&amp;#34;response_time&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:#f92672&#34;&gt;&amp;#34;samples&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;9964&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;&amp;#34;min&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;12&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;&amp;#34;max&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;79&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;&amp;#34;mean&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;16.897230028101177&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;&amp;#34;stdev&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2.331145559054724&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;&amp;#34;90%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;19&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;&amp;#34;95%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;20&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;&amp;#34;99%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;24&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;&amp;#34;99.9%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;46&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;&amp;#34;99.99%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;79&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:#f92672&#34;&gt;&amp;#34;throughput&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:#f92672&#34;&gt;&amp;#34;samples&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;174&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;&amp;#34;min&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;39&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;&amp;#34;max&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;71&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;&amp;#34;mean&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;57.103448275862064&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;&amp;#34;stdev&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;3.819293076427424&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;&amp;#34;90%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;60&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;&amp;#34;95%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;61&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;&amp;#34;99%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;64&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;&amp;#34;99.9%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;71&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;&amp;#34;99.99%ile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;71&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&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;output_tokens&lt;/code&gt;と&lt;code&gt;tokenize&lt;/code&gt;の&lt;code&gt;throughput&lt;/code&gt;が全く同じ結果が出ていることです。
なにかバグを踏んでいる気がします。。。(時間を見つけてソースコード読んでみるか。)&lt;/p&gt;
&lt;h3 id=&#34;気をつけること&#34;&gt;気をつけること&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;metered&lt;/code&gt;の導入時にわかりにくいコンパイルエラーが出たので備忘録として残しておきます。
(下からコンパイルエラーを読んでしまうくせがあったのが問題なのですが。。。)
エラーメッセージは次のとおりです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;error[E0412]: cannot find type `ResponseTime` in this scope
  --&amp;gt; src/chapter04/answer.rs:13:12
   |
13 | #[measure([ResponseTime, Throughput])]
   |            ^^^^^^^^^^^^ not found in this scope
   |
help: consider importing one of these items
   |
1  | use metered::ResponseTime;
   |
1  | use metered::common::ResponseTime;
   |

error[E0283]: type annotations needed
  --&amp;gt; src/chapter04/answer.rs:12:1
   |
12 | #[metered(registry = NekoParserMetricRegistry, /* default = self.metrics */ registry_expr = self.metric_reg)]
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot infer type
   |
   = note: cannot satisfy `_: std::default::Default`
   = note: required by `std::default::Default::default`
   = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;最初のメッセージにはわかりやすく出ていますが、&lt;code&gt;ResponseTime&lt;/code&gt;を&lt;code&gt;use&lt;/code&gt;せずに利用しようとした場合に以下のようなエラーが出ていました。
ターミナル画面が狭かったので&lt;code&gt;E0283&lt;/code&gt;のエラーが目に入り、何を言ってるんだろう?という状態になってしまいました。
スクロールアップしたら、答えが載っているのに。。。&lt;/p&gt;
&lt;h3 id=&#34;コード全体&#34;&gt;コード全体&lt;/h3&gt;
&lt;p&gt;元ネタは&lt;a href=&#34;https://blog.johtani.info/blog/2020/09/07/reboot-nlp100-ch04/&#34;&gt;NLP100本ノックの第4章&lt;/a&gt;です。
&lt;a href=&#34;https://github.com/johtani/nlp100-rust/blob/master/src/chapter04/answer.rs&#34;&gt;コードの全体&lt;/a&gt;はGitHubのソースをご覧ください。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;metered&lt;/code&gt;を簡単ですが紹介してみました。
導入自体も簡単で、想像していたような使い方ができたので満足しています。
ほかにもプロファイラなどはあるのかもしれませんが、まずはこれを使っていこうかと思っています。&lt;/p&gt;
&lt;p&gt;バグらしきものがありそうだったりするので、そのへんは今後調査してみようかと。
まだ、ちょっと試してみただけなので、metered自体のオーバーヘッドや、独自のメトリクスの実装方法、メソッドではなく関数に対して利用する場合にはどうするのか?などいくつか疑問点があるので、今後試してみてまたブログに残しておこうと思います。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第4章終了(言語処理100本ノック2020)</title>
      <link>https://blog.johtani.info/blog/2020/09/07/reboot-nlp100-ch04/</link>
      <pubDate>Mon, 07 Sep 2020 11:17:07 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/09/07/reboot-nlp100-ch04/</guid>
      <description>&lt;p&gt;Rustで言語処理100本ノックの第4章です。&lt;/p&gt;
&lt;p&gt;前回は&lt;a href=&#34;https://blog.johtani.info/blog/2020/09/04/reboot-nlp100-ch03&#34;&gt;こちら&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;今回は早めに続きをやりました。
「形態素解析」ですしね。&lt;/p&gt;
&lt;h2 id=&#34;第4章の概要&#34;&gt;第4章の概要&lt;/h2&gt;
&lt;p&gt;吾輩は猫であるの文章が用意されていて、MaCabで形態素解析した結果をファイルに保存したところからが開始となります。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Rustで言語処理100本ノックの第4章です。&lt;/p&gt;
&lt;p&gt;前回は&lt;a href=&#34;https://blog.johtani.info/blog/2020/09/04/reboot-nlp100-ch03&#34;&gt;こちら&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;今回は早めに続きをやりました。
「形態素解析」ですしね。&lt;/p&gt;
&lt;h2 id=&#34;第4章の概要&#34;&gt;第4章の概要&lt;/h2&gt;
&lt;p&gt;吾輩は猫であるの文章が用意されていて、MaCabで形態素解析した結果をファイルに保存したところからが開始となります。&lt;/p&gt;
&lt;p&gt;が、せっかくRustでやっているのでKuromojiのRust版である&lt;a href=&#34;https://github.com/lindera-morphology/lindera&#34;&gt;Lindera&lt;/a&gt;を利用して形態素解析した結果を保存する部分から作成しました。
3章に引き続き、大きな流れのところの説明だけにしておきます。&lt;/p&gt;
&lt;h3 id=&#34;形態素解析&#34;&gt;形態素解析&lt;/h3&gt;
&lt;p&gt;もとの&lt;code&gt;neko.txt&lt;/code&gt;が文章が1行ごとになっているので、そのまま1行ずつ読みならが、形態素解析していきます。読み込みの部分は3章とあまり変わらないので割愛します。
以下は、形態素解析の処理と形態素解析結果用の構造体です。&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#[derive(Clone, Debug, Serialize, Deserialize)]&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;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Token&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    surface: String,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    base: String,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pos: String,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pos1: String,
&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;まずは構造体です。今回の問題では、必要な情報は4種類だったのでそれを構造体にしました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;表層形（surface）&lt;/li&gt;
&lt;li&gt;基本形（base）&lt;/li&gt;
&lt;li&gt;品詞（pos）&lt;/li&gt;
&lt;li&gt;品詞細分類1（pos1）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;derive&lt;/code&gt;でSerialize、Deserializeを付与しているのは、形態素解析の結果をJSON文字列として保存し、あとのそれぞれの課題で読み出すためにserde_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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;tokenize&lt;/span&gt;(line: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;) -&amp;gt; Vec&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Token&lt;span style=&#34;color:#f92672&#34;&gt;&amp;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;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; tokenizer &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lindera::tokenizer::Tokenizer::new(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;normal&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&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:#66d9ef&#34;&gt;let&lt;/span&gt; lindera_tokens &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; tokenizer.tokenize(line);
&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;let&lt;/span&gt; tokens &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lindera_tokens
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .iter()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .map(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;lindera_token&lt;span style=&#34;color:#f92672&#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;let&lt;/span&gt; surface &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lindera_token.text.to_string();
&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;let&lt;/span&gt; pos &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lindera_token.detail[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;].to_string();
&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;let&lt;/span&gt; pos1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; pos &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;UNK&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                lindera_token.detail[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;].to_string()
&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;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                String::new()
&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;let&lt;/span&gt; base &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; pos &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;UNK&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                lindera_token.detail[&lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;].to_string()
&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;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                String::new()
&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;            Token {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                surface,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                base,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                pos,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                pos1,
&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;        .collect();
&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;return&lt;/span&gt; tokens;
&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;次が形態素解析の処理です。
入力に1行分の文章を受け取り、出力として、さきほどの構造体をベクタに入れたもの&lt;code&gt;Vec&amp;lt;Token&amp;gt;&lt;/code&gt;を返します。
内部ではLinderaの&lt;code&gt;Tokenizer&lt;/code&gt;を&lt;code&gt;normal&lt;/code&gt;モードでインスタンス化してその&lt;code&gt;tokenizer()&lt;/code&gt;メソッドを叩いているだけです。
インスタンス化のときの第2引数は辞書のディレクトリですが、今回はデフォルト辞書(IPADIC)を利用しています。
戻り値はLinderaが用意したToken構造体なので、これを今回作成した&lt;code&gt;Token&lt;/code&gt;構造体に詰め替えているだけです。&lt;/p&gt;
&lt;p&gt;注意点としてLinderaはMeCabとは異なり、未知語(辞書に出てこない単語)の処理が実装されていないので、品詞が&lt;code&gt;&amp;quot;UNK&amp;quot;&lt;/code&gt;の場合にはその他の情報が取得できないので、空文字を構造体に設定するようにしました。&lt;/p&gt;
&lt;h3 id=&#34;結果の保存&#34;&gt;結果の保存&lt;/h3&gt;
&lt;p&gt;形態素解析の結果はJSONで保存しました。
もとのファイルが1文が1行になっていたので、
1行を読み込み、形態素解析し、それをVecで取り出して、1行1配列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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;output_tokens&lt;/span&gt;(tokens: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;Vec&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Token&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;, buf: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;mut&lt;/span&gt; File) {
&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;writeln!&lt;/span&gt;(buf, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{}&amp;#34;&lt;/span&gt;, serde_json::to_string(tokens).unwrap()).expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Error during output json&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;code&gt;serde_json::to_string&lt;/code&gt;に&lt;code&gt;Vec&amp;lt;Token&amp;gt;&lt;/code&gt;を渡しているだけですが、構造体に&lt;code&gt;derive&lt;/code&gt;をつけているのでよしなにやってくれます(便利ー)。&lt;/p&gt;
&lt;h3 id=&#34;jsonの読み込み処理&#34;&gt;JSONの読み込み処理&lt;/h3&gt;
&lt;p&gt;1行1JSONの読み込み処理です。
今回も3章のように読み込みながら、各文章ごとの形態素解析結果に対して処理を実施するために、処理を実行するための&lt;code&gt;trait&lt;/code&gt;を&lt;code&gt;Command&lt;/code&gt;として用意し、それぞれの問題で形態素解析結果に対して処理を書くような実装にしました。また、設問37で「猫」と共起している単語を処理するという課題があるので、文章に「猫」が入っているものだけを処理できるようにするための&lt;code&gt;Filter&lt;/code&gt;も用意し、これをJSONの読み込み処理のイテレータの&lt;code&gt;filter&lt;/code&gt;にわたすようにしています。
特にフィルタリングが必要ない場合ように、&lt;code&gt;NonFilter&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;trait&lt;/span&gt; Command {
&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;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;execute&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; self, tokens: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;Vec&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Token&lt;span style=&#34;color:#f92672&#34;&gt;&amp;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;trait&lt;/span&gt; Filter {
&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;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;is_target&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self, line: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&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;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;NonFilter&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;impl&lt;/span&gt; Filter &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; NonFilter {
&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;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;is_target&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self, line: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&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;true&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ch04-30. 形態素解析結果の読み込み
&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;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;load_json&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;T: &lt;span style=&#34;color:#a6e22e&#34;&gt;Command&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;(cmd: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;mut&lt;/span&gt; T) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    load_json_with_filter(cmd, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;NonFilter {});
&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;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;load_json_with_filter&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;T: &lt;span style=&#34;color:#a6e22e&#34;&gt;Command&lt;/span&gt;, U: &lt;span style=&#34;color:#a6e22e&#34;&gt;Filter&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;(cmd: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;mut&lt;/span&gt; T, filter: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;U&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;let&lt;/span&gt; file &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; File::open(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;./data/chap04/neko.txt.lindera.json&amp;#34;&lt;/span&gt;).unwrap();
&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;let&lt;/span&gt; buf &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; BufReader::new(file);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    buf.lines()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .filter_map(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;item&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; item.ok())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .filter(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;line&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; filter.is_target(line))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .for_each(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;line&lt;span style=&#34;color:#f92672&#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;let&lt;/span&gt; tokens &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; parse_line_json(line.as_str());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            cmd.execute(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;tokens);
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;output_tokens&lt;/code&gt;では&lt;code&gt;serde_json::to_string&lt;/code&gt;を呼び出してましたが、読み込みでは、&lt;code&gt;serde_json::from_str&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;parse_line_json&lt;/span&gt;(line: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;) -&amp;gt; Vec&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Token&lt;span style=&#34;color:#f92672&#34;&gt;&amp;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;return&lt;/span&gt; serde_json::from_str(line).unwrap();
&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;Command&lt;/code&gt;トレイトを実装していく形です。
たとえば、32.の動詞の原形を出力する場合は次のようになります。&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ExtractVerbBase&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    out: &lt;span style=&#34;color:#a6e22e&#34;&gt;File&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;impl&lt;/span&gt; Command &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; ExtractVerbBase {
&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;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;execute&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; self, tokens: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;Vec&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Token&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tokens
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .iter()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .filter(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;token&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; token.pos &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;動詞&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .for_each(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;token&lt;span style=&#34;color:#f92672&#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:#a6e22e&#34;&gt;writeln!&lt;/span&gt;(self.out, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{}&amp;#34;&lt;/span&gt;, token.base).expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Error during writeln&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;println!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, token.base);
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;標準出力とは別にファイルにも出力できるように&lt;code&gt;ExtractVerbBase&lt;/code&gt;に&lt;code&gt;out&lt;/code&gt;でファイルを保持しています。&lt;/p&gt;
&lt;h3 id=&#34;34-名詞の連接&#34;&gt;34. 名詞の連接&lt;/h3&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;impl&lt;/span&gt; Command &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; ExtractMaxConjunctionNoun {
&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;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;execute&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; self, tokens: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;Vec&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Token&lt;span style=&#34;color:#f92672&#34;&gt;&amp;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;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; nouns &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;vec!&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;// TODO 参照保持でどうにかしたいけどなぁ。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tokens.iter().map(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;token&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; token.clone()).for_each(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;token&lt;span style=&#34;color:#f92672&#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;if&lt;/span&gt; token.pos &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;名詞&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                nouns.push(token);
&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;else&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;if&lt;/span&gt; nouns.len() &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    self.buffer.push(nouns.clone());
&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;                nouns &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;vec!&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&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;名詞の場合に、nounsにバッファリングしつつ、違う品詞が来たら出力するという処理になっています。
&lt;code&gt;clone&lt;/code&gt;を呼び出していますが、これを参照を引き回す感じにできるといいのかもなぁ(結構めんどくさい)。&lt;/p&gt;
&lt;h3 id=&#34;36-頻度上位10語&#34;&gt;36. 頻度上位10語&lt;/h3&gt;
&lt;p&gt;頻度を数えるのにはBTreeMapを利用しています。
数えながら、Top10を保持する方法がいい気がしたのですが、いい入れ物を見つけられなかったので、数え上げたあとにBTreeMapのIteratorを回しながら、キーバリューのVecをまず生成します。
その生成したVecに値でソートし、その後Iteratorから最初の10件を取得して表示する方法にしました。&lt;/p&gt;
&lt;p&gt;ソートして取り出すという処理がついでにかかっています。。。
&lt;a href=&#34;https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html&#34;&gt;BinaryHeap&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;print_top10&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; self) {
&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;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; key_values: Vec&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;String, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;u32&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            self.terms_count.iter().collect::&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Vec&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;String, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;u32&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        key_values.sort_by(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;x, y&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; y.&lt;span style=&#34;color:#ae81ff&#34;&gt;1.&lt;/span&gt;cmp(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;x.&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        key_values.iter().take(&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;).for_each(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;(key, value)&lt;span style=&#34;color:#f92672&#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:#a6e22e&#34;&gt;writeln!&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self.out, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{}, {}&amp;#34;&lt;/span&gt;, key, value).expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Error during writeln&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;println!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;, &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, key, value);
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;形態素解析結果をちゃんと眺めてはいないですが、処理としてはこんなところかなと。
グラフはめんどくさいのでスキップしてしまいました。。。
Kibana/Esに食わせて見てみるのもありかなぁ?&lt;/p&gt;
&lt;p&gt;次は係り受け解析です。Rustで使えるライブラリとかあるかなぁ?&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第3章終了(言語処理100本ノック2020)</title>
      <link>https://blog.johtani.info/blog/2020/09/04/reboot-nlp100-ch03/</link>
      <pubDate>Fri, 04 Sep 2020 23:46:25 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/09/04/reboot-nlp100-ch03/</guid>
      <description>&lt;p&gt;Rustで言語処理100本ノックの第3章です。&lt;/p&gt;
&lt;p&gt;前回は&lt;a href=&#34;https://blog.johtani.info/blog/2020/05/12/reboot-nlp100-ch02-12to19&#34;&gt;こちら&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;少し間が空きましたが、再開しました。
間が空いた理由は。。。「正規表現」ですかね。。。
苦手なんです、正規表現。
なので、28はちょっとギブアップしてしまいました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Rustで言語処理100本ノックの第3章です。&lt;/p&gt;
&lt;p&gt;前回は&lt;a href=&#34;https://blog.johtani.info/blog/2020/05/12/reboot-nlp100-ch02-12to19&#34;&gt;こちら&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;少し間が空きましたが、再開しました。
間が空いた理由は。。。「正規表現」ですかね。。。
苦手なんです、正規表現。
なので、28はちょっとギブアップしてしまいました。&lt;/p&gt;
&lt;h2 id=&#34;第3章の概要&#34;&gt;第3章の概要&lt;/h2&gt;
&lt;p&gt;個別に説明はせずに大きな流れのところだけ。
それぞれの問題の解については&lt;a href=&#34;https://github.com/johtani/nlp100-rust/blob/master/src/chapter03/answer.rs&#34;&gt;リポジトリ&lt;/a&gt;を御覧ください(興味ある人いるのかなぁ?)&lt;/p&gt;
&lt;p&gt;第3章はNDJSON(new line delimited JSON)という、
1行に1JSONという形式のデータを格納したファイルがgzipで圧縮された状態で提供されます。
まずは、このJSONファイルからJSONを読み込むのが主な処理になります。&lt;/p&gt;
&lt;p&gt;読み込んだデータに「イギリス」のWikipediaの記事が入っているので、そこから正規表現で必要なデータを抽出します。&lt;/p&gt;
&lt;p&gt;最後の問題が少し特殊で、抜き出した情報の「国旗」のファイル名を元に、MediaWikiのREST APIを叩いて、結果を取得し、その一部の情報を抜き出すというものです。&lt;/p&gt;
&lt;h3 id=&#34;jsonの読み込み処理&#34;&gt;JSONの読み込み処理&lt;/h3&gt;
&lt;p&gt;gzipファイルを読み込んでから、1行ずつ抜き出してVecに入れる処理が次のようになります。
今回のgzipファイルは大した量が入っていないので、全部先に抜き出す処理としてまとめました。
もっと巨大なファイルの場合は個別のJSONに対する処理を
&lt;code&gt;buf.lines().map()&lt;/code&gt;のmapのなかで実行する形にすると思います。
gzipのファイルを開くのに&lt;code&gt;flate2&lt;/code&gt;というクレート(ライブラリ)を利用しました。便利なのは、&lt;code&gt;BufReader&lt;/code&gt;に&lt;code&gt;lines()&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// https://docs.rs/flate2/1.0.14/flate2/read/struct.GzDecoder.html
&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;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;extract_ndjson_from_gzip&lt;/span&gt;(input_file_name: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;) -&amp;gt; Vec&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;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;let&lt;/span&gt; f &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; File::open(input_file_name).expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;file not found?&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:#66d9ef&#34;&gt;let&lt;/span&gt; gz &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GzDecoder::new(f);
&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;let&lt;/span&gt; buf &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; BufReader::new(gz);
&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;let&lt;/span&gt; lines: Vec&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; buf.lines().map(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;l&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; l.unwrap()).collect();
&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;return&lt;/span&gt; lines;
&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;こちらは、上記のメソッドで抜き出したVecを元に、記事の情報を抜き出す処理をしています。
JSONをパースして構造体&lt;code&gt;Article&lt;/code&gt;にデシリアライズするために、&lt;code&gt;serde&lt;/code&gt;というライブラリを使用しています。
&lt;code&gt;serde&lt;/code&gt;自体は様々なデータ形式(JSON、YAMLなど)をパースするためのフレームワークです。今回はJSONなので、&lt;code&gt;serde_json&lt;/code&gt;の実装を利用しています。
また、JSON文字列から構造体にデシリアライズするのを簡単にできるように構造体に&lt;code&gt;#[derive(Deserialize)]&lt;/code&gt;をつけています。
あとは、&lt;code&gt;let article: Article = serde_json::from_str(json.as_str())&lt;/code&gt;という処理を実行すればserde_jsonがJSONをパースして構造体に変換してくれます。形式がわかっている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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#[derive(Deserialize)]&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;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Article&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    title: String,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text: String,
&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:#75715e&#34;&gt;// ch03-20. JSONデータの読み込み
&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;// https://serde.rs/
&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;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;load_json&lt;/span&gt;(input_file_name: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;, target_title: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;) -&amp;gt; Vec&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Article&lt;span style=&#34;color:#f92672&#34;&gt;&amp;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;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; results &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;vec!&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;let&lt;/span&gt; ndjson &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; extract_ndjson_from_gzip(input_file_name);
&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;for&lt;/span&gt; json &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; ndjson {
&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;let&lt;/span&gt; article: &lt;span style=&#34;color:#a6e22e&#34;&gt;Article&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; serde_json::from_str(json.as_str()).expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;json parse error&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:#66d9ef&#34;&gt;if&lt;/span&gt; article.title &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; target_title {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            results.push(article);
&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;return&lt;/span&gt; results;
&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;Article&lt;/code&gt;から記事情報を取得して色々と処理をしています。&lt;/p&gt;
&lt;h3 id=&#34;正規表現&#34;&gt;正規表現&lt;/h3&gt;
&lt;p&gt;正規表現用のクレート&lt;code&gt;regex&lt;/code&gt;がRustに用意されています。&lt;code&gt;Regex::new(正規表現)&lt;/code&gt;で、正規表現をコンパイルし、あとは、この構造体のメソッドを利用して文字列を処理していきます。
問題では、マッチするかどうか、マッチした一部の文字列を抜き出す、不要なタグを削除するといった処理を正規表現で行いました(Rust書くよりも正規表現の書き方とかを調べるのに大半の時間をもっていかれてます。。。)。&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-rust&#34; data-lang=&#34;rust&#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:#66d9ef&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;extract_category_lines&lt;/span&gt;(article: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Article&lt;/span&gt;) -&amp;gt; Vec&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;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;let&lt;/span&gt; re &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Regex::new(&lt;span style=&#34;color:#e6db74&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\[\[Category:(.*)\]\]&amp;#34;&lt;/span&gt;).expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;syntax error in regex&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:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; lines &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;vec!&lt;/span&gt;[];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    article.lines_from_text().iter().for_each(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;line&lt;span style=&#34;color:#f92672&#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;if&lt;/span&gt; re.is_match(line) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            lines.push(line.to_string());
&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;return&lt;/span&gt; lines;
&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;mediawiki-apiリクエスト処理&#34;&gt;MediaWiki APIリクエスト処理&lt;/h3&gt;
&lt;p&gt;最後の問題で国旗のファイル名を元に&lt;a href=&#34;https://www.mediawiki.org/wiki/API:Imageinfo&#34;&gt;MediaWiki API&lt;/a&gt;を叩いて、URLの文字列を取得しましょうという問題がありました。
ファイル名をREST APIの引数に渡してHTTP経由でリクエストを送信し、返ってくるJSONレスポンスからURLを抜き出すという処理です。&lt;/p&gt;
&lt;p&gt;HTTPのリクエストの送受信に&lt;code&gt;reqwest&lt;/code&gt;というクレートを利用しました。
ちょっと長いけど、APIコールしている箇所はこんな形です。&lt;/p&gt;
&lt;p&gt;この関数には&lt;code&gt;async&lt;/code&gt;とついています。非同期処理の関数です。内部で2回ほど(リクエスト送信の結果待ちとレスポンスのパース待ち)&lt;code&gt;.await&lt;/code&gt;があります。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;client&lt;/code&gt;に&lt;code&gt;.get(URL)&lt;/code&gt;や&lt;code&gt;query(&amp;amp;[])&lt;/code&gt;といったメソッドが用意されているので、URLやクエリパラメータを用意して&lt;code&gt;send()&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-rust&#34; data-lang=&#34;rust&#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:#66d9ef&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;call_api&lt;/span&gt;(file_name: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;) -&amp;gt; Result&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String, String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;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;let&lt;/span&gt; client &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; reqwest::Client::new();
&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;let&lt;/span&gt; file_name2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;format!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;File:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, file_name);
&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;//let mut file_name2 = file_name.to_string().replace(&amp;#34; &amp;#34;, &amp;#34;_&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:#66d9ef&#34;&gt;let&lt;/span&gt; query &lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;action&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;query&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:#e6db74&#34;&gt;&amp;#34;format&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;json&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:#e6db74&#34;&gt;&amp;#34;prop&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;imageinfo&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:#e6db74&#34;&gt;&amp;#34;iiprop&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;url&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:#e6db74&#34;&gt;&amp;#34;titles&amp;#34;&lt;/span&gt;, file_name2.as_str()),
&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;let&lt;/span&gt; result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; client
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .get(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://en.wikipedia.org/w/api.php&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .query(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;query)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .send()
&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;await&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;match&lt;/span&gt; result {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Ok(response) &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;match&lt;/span&gt; response.status() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            StatusCode::&lt;span style=&#34;color:#66d9ef&#34;&gt;OK&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;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;let&lt;/span&gt; body &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; response.json::&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;MediaWikiResponse&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;().&lt;span style=&#34;color:#66d9ef&#34;&gt;await&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;match&lt;/span&gt; body {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    Ok(obj) &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;match&lt;/span&gt; obj.get_url() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        Some(url) &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; Ok(url),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        None &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; Err(String::from(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Cannot get url...&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    Err(error) &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; Err(error.to_string()),
&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:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; Err(String::from(&lt;span style=&#34;color:#a6e22e&#34;&gt;format!&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:#e6db74&#34;&gt;&amp;#34;Status code is &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;.&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                response.status()
&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;        Err(error) &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;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;let&lt;/span&gt; error_msg &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;format!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Error occurred... &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{:?}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, error);
&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;println!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, error_msg.as_str());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Err(error_msg)
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あとは、呼び出し元で非同期の処理を実行するために、&lt;code&gt;tokio&lt;/code&gt;というクレートを利用しています。
&lt;code&gt;block_on()&lt;/code&gt;で&lt;code&gt;call_api()&lt;/code&gt;の実行をして、結果が返ってくるのを待ち受けています。結果が返ってきて、問題なければ、&lt;code&gt;call_api&lt;/code&gt;の戻り値&lt;code&gt;Result&amp;lt;String, String&amp;gt;&lt;/code&gt;の左側のStringの値が取り出され、&lt;code&gt;get_image_url&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-rust&#34; data-lang=&#34;rust&#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:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;get_image_url&lt;/span&gt;(file_name: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;) -&amp;gt; String {
&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;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; _rt &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; tokio::runtime::Runtime::new().expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Fail initializing runtime&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:#66d9ef&#34;&gt;let&lt;/span&gt; task &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; call_api(file_name);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _rt.block_on(task).expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Something wrong...&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;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;一応、3章を終わらせました。だいぶ強引かつ1つスキップしましたが。。。
次は&lt;a href=&#34;https://nlp100.github.io/ja/ch04.html&#34;&gt;第4章の形態素解析&lt;/a&gt;です。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>TerraformでAzure Cognitive Searchのクラスターを起動</title>
      <link>https://blog.johtani.info/blog/2020/08/18/azure-search-with-terraform/</link>
      <pubDate>Tue, 18 Aug 2020 18:26:47 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/08/18/azure-search-with-terraform/</guid>
      <description>&lt;p&gt;負荷を計測するために、数回、Azure Cognitive Searchのクラスターを起動したり、停止したりしてました。
これは、&lt;a href=&#34;https://www.terraform.io/&#34;&gt;Terraform&lt;/a&gt;でやると楽できるのでは?と思ったので、やってみました。
1パーティションのクラスターなので、全然大したことはないのですが、メモを残しておくためにブログに書いておきます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;負荷を計測するために、数回、Azure Cognitive Searchのクラスターを起動したり、停止したりしてました。
これは、&lt;a href=&#34;https://www.terraform.io/&#34;&gt;Terraform&lt;/a&gt;でやると楽できるのでは?と思ったので、やってみました。
1パーティションのクラスターなので、全然大したことはないのですが、メモを残しておくためにブログに書いておきます。&lt;/p&gt;
&lt;p&gt;基本的には&lt;a href=&#34;https://www.terraform.io/docs/providers/azurerm/r/search_service.html&#34;&gt;Terraformの公式ドキュメント&lt;/a&gt;にあったものを自分用に変数を抽出しただけです。&lt;/p&gt;
&lt;h2 id=&#34;ファイルたち&#34;&gt;ファイルたち&lt;/h2&gt;
&lt;p&gt;単にクラスターを起動するためだけなので、2種類のファイルだけ作成しました(1個でもいいかも)。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;variables.tf&lt;/code&gt; - 変数用のファイル。いくつかの設定を変数として定義しました。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;terraform.tf&lt;/code&gt; - Terraform本体のファイル。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;variablestf&#34;&gt;&lt;code&gt;variables.tf&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;まずは&lt;code&gt;variables.tf&lt;/code&gt;です(ファイル内の並びは異なりますが。。。)。terraform.tfで利用する5つの変数です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;resource_group - リソースグループ名。既存とは異なるリソースグループ名にしました(変に壊してもいいので)。&lt;/li&gt;
&lt;li&gt;machine_type - 価格レベル(SKU)。&lt;a href=&#34;https://www.terraform.io/docs/providers/azurerm/r/search_service.html#sku&#34;&gt;公式ドキュメントに設定できる値の一覧&lt;/a&gt;があります。今回はWikipediaのデータを登録していたのでそれが入るサイズにしています。&lt;/li&gt;
&lt;li&gt;region - 場所(リージョン)。リージョンの一覧はどこにあるんだろう?&lt;a href=&#34;https://azure.microsoft.com/en-us/global-infrastructure/geographies/#geographies&#34;&gt;これを参考&lt;/a&gt;にしましたが。&lt;/li&gt;
&lt;li&gt;partition_size - パーティションのサイズ(=Elasticsearchでのシャードかな?)です。今回は1つでの性能を計測したかったので1にしてあります。&lt;/li&gt;
&lt;li&gt;search_cluster_name - Azure Cognitive Searchのサービス名。&lt;code&gt;search.windows.net&lt;/code&gt;名前空間で一意である必要があったので、他の人が使わなそうな名前をつけています。&lt;/li&gt;
&lt;/ul&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-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;variable &amp;#34;machine_type&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:#ae81ff&#34;&gt;default = &amp;#34;standard&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;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:#ae81ff&#34;&gt;variable &amp;#34;region&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:#ae81ff&#34;&gt;default = &amp;#34;East Asia&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;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:#ae81ff&#34;&gt;variable &amp;#34;resource_group&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:#ae81ff&#34;&gt;default = &amp;#34;johtani-wiki-test&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;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:#ae81ff&#34;&gt;variable &amp;#34;search_cluster_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:#ae81ff&#34;&gt;default = &amp;#34;johtani-wikipedia&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;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:#ae81ff&#34;&gt;variable &amp;#34;partition_size&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:#ae81ff&#34;&gt;default = 1&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;terraformtf&#34;&gt;&lt;code&gt;terraform.tf&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;terraform.tf&lt;/code&gt;は以下の通り。&lt;a href=&#34;https://www.terraform.io/docs/providers/azurerm/r/search_service.html&#34;&gt;Terraformの公式ドキュメントにある例&lt;/a&gt;に&lt;code&gt;provider&lt;/code&gt;を追加しただけのものになります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;provider - プロバイダーの設定。Azureを利用するという宣言です。&lt;code&gt;features {}&lt;/code&gt;がないとエラーになります。空でも必ず指定が必要です。認証周りについては、&lt;a href=&#34;https://www.terraform.io/docs/providers/azurerm/guides/azure_cli.html&#34;&gt;&lt;code&gt;azure-cli&lt;/code&gt;経由で認証する方式&lt;/a&gt;を採用しました。&lt;code&gt;azure-cli&lt;/code&gt;はHomebrewでインストールしています。&lt;/li&gt;
&lt;li&gt;azurerm_resource_group - リソースグループの設定。&lt;code&gt;variables.tf&lt;/code&gt;の&lt;code&gt;resource_group&lt;/code&gt;と&lt;code&gt;region&lt;/code&gt;を利用しています。必須項目はこの2種類だけです。&lt;/li&gt;
&lt;li&gt;azurerm_search_service - Azure Cognitive Searchの設定。&lt;code&gt;partition_count&lt;/code&gt;以外は必須項目です。&lt;code&gt;variables.tf&lt;/code&gt;と&lt;code&gt;azurerm_resource_group&lt;/code&gt;の設定を利用しています。今回は利用していませんが、レプリカ数なども指定できるようになっています。&lt;/li&gt;
&lt;/ul&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-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Azureのproviderを指定。&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:#ae81ff&#34;&gt;provider &amp;#34;azurerm&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:#ae81ff&#34;&gt;features {}&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:#75715e&#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:#ae81ff&#34;&gt;resource &amp;#34;azurerm_resource_group&amp;#34; &amp;#34;wiki-test&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:#ae81ff&#34;&gt;name     = var.resource_group&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:#ae81ff&#34;&gt;location = var.region&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:#75715e&#34;&gt;# Azure Cognitive Searchの設定&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:#ae81ff&#34;&gt;resource &amp;#34;azurerm_search_service&amp;#34; &amp;#34;search_service&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:#ae81ff&#34;&gt;name                = var.search_cluster_name&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:#ae81ff&#34;&gt;resource_group_name = azurerm_resource_group.wiki-test.name&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:#ae81ff&#34;&gt;location            = azurerm_resource_group.wiki-test.location&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:#ae81ff&#34;&gt;sku                 = var.machine_type&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:#ae81ff&#34;&gt;partition_count     = var.partition_size&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;以上がファイルです。ほぼ公式ドキュメントのサンプル通りですねw&lt;/p&gt;
&lt;h2 id=&#34;デプロイとか&#34;&gt;デプロイとか&lt;/h2&gt;
&lt;p&gt;ファイルの準備ができたら実際にデプロイします。
Azureの環境への認証にはAzure CLIを利用して、事前にログインした状態にします。
実際にデプロイするまでの手順は次のようになります。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;az login&lt;/code&gt; - Azureの認証。ブラウザが起動してログイン画面が表示されます。無事認証がOKなら、&lt;code&gt;az&lt;/code&gt;コマンドでAzure Cloudの情報が取得できます。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;terraform init&lt;/code&gt; - 初回だけです。Terraformのワーキングディレクトリの初期化処理を実行します。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;terraform plan&lt;/code&gt; - Terraform &amp;lt; 0.12の場合は実行。最新版だともういらないみたいだ。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;terraform apply&lt;/code&gt; - 実際にAzure上にクラスターを起動します。Terraformが隠蔽してくれているので、実際にどんなことをやっているかはわかってないですが。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以上で、Azure Cognitive Searchのクラスターが起動します。
すごく簡単です。Webコンソールでチェックすれば、起動していることも確認できます。&lt;/p&gt;
&lt;p&gt;この状態では、クラスターが起動しただけなので、あとは必要に応じてデータをロードしたり、アプリから検索したりと行ったことが可能になります。
そのへんの話はまた機会があれば。&lt;/p&gt;
&lt;h2 id=&#34;destroy&#34;&gt;Destroy&lt;/h2&gt;
&lt;p&gt;今回は負荷テスト用にクラスターを起動していましたので、必要なくなれば、クラスターを削除します。Terraformを導入したもう一つの理由がこの簡略化です。
&lt;code&gt;terraform destroy&lt;/code&gt;を実行するだけで、Azure Cognitive Searchのクラスターおよび、リソースグループが削除されます。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、ほぼ公式ドキュメントのままですが、TerraformでAzure Cognitive Searchのクラスターを起動する方法の紹介でした。
ブログを書いていて、1点気になったのは、ロケーション(リージョン)の一覧はどこにあるんだろう?という点です。azコマンドとかで出てくるのかなぁ?&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>検索システムを構成するパーツ(検索システムに関する妄想その2)</title>
      <link>https://blog.johtani.info/blog/2020/07/28/improve-search-no2/</link>
      <pubDate>Tue, 28 Jul 2020 12:34:42 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/07/28/improve-search-no2/</guid>
      <description>&lt;p&gt;先日は「&lt;a href=&#34;https://blog.johtani.info/blog/2020/07/27/improve-search-no1/&#34;&gt;システムの特徴と検索機能について&lt;/a&gt;」という感じでふんわり書きました。
まぁ、頭の中でぼんやり考えてることを文章にしてみた感じです。
他にもぼんやりしてるものはいくつかあるので今日も書いてみることに。
検索システム?みたいなツイートも見かけたので、検索システムってこんなイメージですというブログを書いてみました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;先日は「&lt;a href=&#34;https://blog.johtani.info/blog/2020/07/27/improve-search-no1/&#34;&gt;システムの特徴と検索機能について&lt;/a&gt;」という感じでふんわり書きました。
まぁ、頭の中でぼんやり考えてることを文章にしてみた感じです。
他にもぼんやりしてるものはいくつかあるので今日も書いてみることに。
検索システム?みたいなツイートも見かけたので、検索システムってこんなイメージですというブログを書いてみました。&lt;/p&gt;
&lt;h2 id=&#34;検索システム機能を構成するパーツ&#34;&gt;検索システム(機能)を構成するパーツ&lt;/h2&gt;
&lt;p&gt;今回はシステムに組み込まれる検索機能を構成するパーツについて書き出してみようかなと思います。
パーツといってもユーザー、UI、コンテンツなども入れています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ユーザー&lt;/li&gt;
&lt;li&gt;検索UI
&lt;ul&gt;
&lt;li&gt;検索窓
&lt;ul&gt;
&lt;li&gt;オートコンプリート&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;検索結果画面
&lt;ul&gt;
&lt;li&gt;ファセット&lt;/li&gt;
&lt;li&gt;ソート&lt;/li&gt;
&lt;li&gt;ハイライト&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;詳細画面
&lt;ul&gt;
&lt;li&gt;レコメンド&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;検索エンジン&lt;/li&gt;
&lt;li&gt;コンテンツ&lt;/li&gt;
&lt;li&gt;検索ログ
&lt;ul&gt;
&lt;li&gt;クリックログとかも&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;サービス提供者&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ざっくり書くとこんな感じです。
システム構成だったり、機能だったり、アクターだったりといろいろなものが混ざってしまっていますが、登場するものはこんなものです。&lt;/p&gt;
&lt;p&gt;ざっくりした繋がりの図はこんな感じです。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20200731/search_system_overview.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20200731/search_system_overview.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;それぞれの役割について見ていきましょう。&lt;/p&gt;
&lt;h3 id=&#34;ユーザー&#34;&gt;ユーザー&lt;/h3&gt;
&lt;p&gt;サイト、システムのユーザーです。
検索UIを経由して望んだコンテンツを探します。
探す目的は、サイトによって異なります。
「何かを購入(ECサイトやオークション)する」だったり、「情報(レシピや社内文書)を見つける」だったりします。
図では「キーワード」と記載しましたが、最近では自然文(文章)を受け付ける検索もあります。&lt;/p&gt;
&lt;h3 id=&#34;検索ui&#34;&gt;検索UI&lt;/h3&gt;
&lt;p&gt;サイト、システムが提供するUIです。ユーザーはこのUIにキーワード(質問)を入力し、検索結果を取得します。
UIにはいくつものパーツがさらに存在します。簡単に例を上げると以下のようなものです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;検索窓 - キーワードを入れるための入力ボックスです。
&lt;ul&gt;
&lt;li&gt;オートコンプリート(自動補完) - サイトによっては、検索窓に何かを入力すると、キーワードを保管したりサジェストしたりしてくれます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;検索結果画面 - 質問にマッチしたコンテンツの一覧を表示する画面です。一覧以外にもいくつか情報が表示されます。
&lt;ul&gt;
&lt;li&gt;検索結果一覧 - コンテンツの一覧です。何かしらの基準(日付順や人気順など)によってソートされたものが表示されます。&lt;/li&gt;
&lt;li&gt;ファセット - 検索結果が持っている属性(価格帯、カテゴリ、メーカー名など)の一覧で、絞り込み検索のヒントです。&lt;/li&gt;
&lt;li&gt;ハイライト - 入力したキーワードがどこにマッチしたかがわかるように、強調表示されたスニペット(情報の一部)が出ます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;検索APIとUIに分かれている場合が多いでしょうか?
処理の流れとしては、検索窓に入力されたキーワードを検索エンジンに問い合わせができるクエリに書き換えてからリクエストを投げます。
あとは、検索エンジンからのレスポンスにある検索結果を表示できる形に変換して表示するのが役割です。
また、検索ログの出力もこの部分で担当することが多いです(もしくは、検索エンジン自体がログ出力の機能を持っている場合もあります)。&lt;/p&gt;
&lt;h3 id=&#34;検索エンジン&#34;&gt;検索エンジン&lt;/h3&gt;
&lt;p&gt;検索に特化したデータ構造を内部に持っているサーバーもしくはサービスです。
&lt;a href=&#34;https://www.elastic.co/elasticsearch/&#34;&gt;Elasticsearch&lt;/a&gt;や&lt;a href=&#34;https://lucene.apache.org/solr/&#34;&gt;Apache Solr&lt;/a&gt;、&lt;a href=&#34;https://azure.microsoft.com/ja-jp/services/search/&#34;&gt;Azure Cognitive Search&lt;/a&gt;などは転置インデックスと呼ばれるデータ構造になっています。
検索エンジンの検索処理に対しての主な役割は次の2つです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クエリにマッチするコンテンツの集合を決定する&lt;/li&gt;
&lt;li&gt;マッチしたコンテンツを特定の条件で並び替える(ランキング)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;クエリを受け取り、検索結果のリストを返すのが処理の大きな流れです。
その他に、ファセット、ハイライトといった付加的な処理を実行することがあります。&lt;/p&gt;
&lt;p&gt;また、データ登録(インデキシング/インデクシング)の処理もあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;登録するコンテンツを検索に特化したデータ構造にして格納する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;転置インデックスの場合は、入力されたデータ(文章)から単語列を作り出して、単語からコンテンツのIDが判別できる形にする処理になります。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.algolia.com/&#34;&gt;Algolia&lt;/a&gt;や&lt;a href=&#34;https://www.elastic.co/jp/app-search/&#34;&gt;Elastic App Search&lt;/a&gt;のようなSaaSであったり、RDBの機能を利用するといった選択肢もあります。&lt;/p&gt;
&lt;h3 id=&#34;データソースコンテンツ&#34;&gt;データソース・コンテンツ&lt;/h3&gt;
&lt;p&gt;実際に提供したいコンテンツになります。
コンテンツが保存されている場所は、サイトによって異なります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Webの検索サイト - インターネット上のホームページ&lt;/li&gt;
&lt;li&gt;ECサイト - データベースに格納されているアイテムのデータ&lt;/li&gt;
&lt;li&gt;社内文書検索 - ファイルサーバーやWikiなどのファイル、文書&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;といった感じです。
実際には、データソースからコンテンツを検索エンジンに登録する場合は、いくつかの処理(いわゆる前処理)が必要になります。
社内文書検索やWebの検索サイトの場合は、データを収集するためのクローラーが必要ですし、
収集したデータから、検索エンジンに登録するデータを加工したり(HTMLタグを除去したり、メタデータ(URL、収集日、タイトル)を付与したり)もします(ETL処理とか言われる)。&lt;/p&gt;
&lt;h3 id=&#34;検索ログ&#34;&gt;検索ログ&lt;/h3&gt;
&lt;p&gt;検索を提供するだけであれば、必要ありません。
が、実際に検索がどのような使われ方をしているか?を知るために必要な機能になります。
この検索ログがユーザーのニーズを読み解くための情報になります。
検索ログには次のような情報が入ります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;検索窓に入力された文字列&lt;/li&gt;
&lt;li&gt;入力された文字列でヒットした件数&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;検索結果を出したタイミングでのログです。他にも実際にヒットしたコンテンツのIDなどをログに残したり、他のユーザーと区別をつけるために、ユーザーのセッションごとにIDを発行してログに残したりもします。&lt;/p&gt;
&lt;p&gt;また、検索に満足してもらえているかを見るために、実際に検索結果のどのコンテンツに興味をもったのか?という情報も検索ログとして残すことがあります。クリックログなどとも呼ばれます。検索結果のどのドキュメントが実際にクリックされたか(詳細画面に遷移したか)という情報です。1回の検索結果に対してクリックされるごとにログが残ります。
もちろん、結果に満足しない場合は、クリックされずに、キーワードを変えたり、絞り込み条件がクリックされたりします。&lt;/p&gt;
&lt;p&gt;ECサイトなどの場合は更に、実際に購入されたかどうかといった情報もユーザーのニーズを読み解くための情報となります。
詳細画面へのクリックログや購入ログについては、検索以外からの流れ(広告やDMだったり、レコメンドだったり)なども考えられます。
これらのログを元に、検索を改善していくことになります。&lt;/p&gt;
&lt;h3 id=&#34;サービス提供者&#34;&gt;サービス提供者&lt;/h3&gt;
&lt;p&gt;サイト・システムの提供者です。
コンテンツの準備、検索UIにはどんな物が必要なのか、サイト・システムにとって良い検索とはなにか?、検索ログからユーザーのニーズを分析して何を改善していくのか?といったことを考えます。
例としては次のようなことです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;検索結果に表示するコンテンツとはなにか?&lt;/li&gt;
&lt;li&gt;コンテンツの持っている項目・属性の何を検索対象とするか?&lt;/li&gt;
&lt;li&gt;検索結果の並び順(ランキング)がどんなものがよいのか?&lt;/li&gt;
&lt;li&gt;検索UIにはどんなものを表示するのか?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;検索機能を作るときの流れ&#34;&gt;検索機能を作るときの流れ&lt;/h2&gt;
&lt;p&gt;検索機能を構成するパーツにどんなものがあるかを紹介しました。
実際にシステムに検索機能を追加する場合は、最低限、次のものが必要になります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;検索UI&lt;/li&gt;
&lt;li&gt;検索エンジン(RDB?SaaS?ミドルウェア?)&lt;/li&gt;
&lt;li&gt;データソース・コンテンツ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;とりあえずこれらがあれば、検索機能を作ることはできるかと。
ただ、作っただけでは、いいか悪いかの判断がつかないので、どういった使われ方をしているかを知るために検索ログをとったりして、
改善をしていく必要が出てきます。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;わかってるよそんなことはと言われそうな感じになったかもしれないですが、
検索の機能を構成するパーツについて紹介してみました。
細かなはなしは色々とありますが、大まかにはこのような役割のパーツがあります。&lt;/p&gt;
&lt;p&gt;実際にはこれらのパーツを用意すればよいわけではなく、それぞれで検索を良くしていくためにどんなことを考えていくのか?などが出てきます。そのあたりの話はまた、別のブログで書いていく感じでしょうか。こんな感じで書いてくと、終わらない気がしてきたけど。。。
次はどんなはなしを書くかなぁ。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>システムの特徴と検索機能について(検索システムに関する妄想その1)</title>
      <link>https://blog.johtani.info/blog/2020/07/27/improve-search-no1/</link>
      <pubDate>Mon, 27 Jul 2020 18:28:54 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/07/27/improve-search-no1/</guid>
      <description>&lt;p&gt;今年の頭からシステムの検索周りを手伝う仕事をフリーランスとしてやっています。
検索の仕組みを知れば知るほど面白くなってきたからという理由になるのかな?
LuceneやSolr、Elasticsearchなどを長く触っているというのもあるかと思います。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今年の頭からシステムの検索周りを手伝う仕事をフリーランスとしてやっています。
検索の仕組みを知れば知るほど面白くなってきたからという理由になるのかな?
LuceneやSolr、Elasticsearchなどを長く触っているというのもあるかと思います。&lt;/p&gt;
&lt;p&gt;ということで、検索についていつも考えています。
頭の中でまとまっていない状況ですが、システムにおける検索機能についていくつか頭の中にあることを書き出して、
いろんな方にダメ出しやコメントをもらいたいなと思ったので、色々と書いてみようかと。
思いつきのままに書いているので、はなしがあちこち飛ぶ可能性もありますが、あしからず。&lt;/p&gt;
&lt;h2 id=&#34;検索って難しい&#34;&gt;検索って難しい&lt;/h2&gt;
&lt;p&gt;「「検索」とは、データの集合から目的のデータを探し出すこと」&lt;a href=&#34;https://ja.wikipedia.org/wiki/%E6%A4%9C%E7%B4%A2&#34;&gt;By Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一言で「検索」といっても、使う人、ユースケースによっていろいろな「検索」があります。
例えば、新しいスマホを買ったときに、スクリーンロックの時間を設定する機能を「検索」したりします。
また、PCで仕事をしているときに、ファイルの中身をある文字列で「検索」したりもします。
TSUTAYAに行って、欲しかった本がおいてあるかどうか店内の端末で「検索」もします。
Rustを書いていて、こんなことをやるライブラリありそうだよな?と思ってGoogleでウェブの検索をしたりもします。&lt;/p&gt;
&lt;p&gt;私が特にそうだと思いますが、なにかあったらまず検索をするという生活をしています。
ただ、このとき、「検索」といっても望んでいる挙動が違ったりするものです。
以下は自分が「検索」しているときに想定していることになります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ファイル内の検索をしているときはgrep的な検索を想定していることが多い。&lt;/li&gt;
&lt;li&gt;書籍の検索をしているときは、特定の項目(著者など)に対してgrep的な検索を想定しているが、名前の読みなどでも検索されることを想定している(漢字覚えてなかったりする。。。)。&lt;/li&gt;
&lt;li&gt;Rustを書いているときに機能をGoogleで検索するときは、いい感じに検索してくれることを望んでいる(入力するキーワードが曖昧なことが多々ある。例えば、そのものズバリの名前をしらないときとか)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;あくまでも私が想像している挙動です。他の人とは違う可能性もあります。
なので、「検索」といってもさまざまな要素があるし、想定しているシーンも異なるので「難しい」なと思っています。
また、そんな「検索」ですが、世の中的にはあって当たり前だと思われていたり、お金や時間がかかるものと思われてなかったりもします。ま、けどそういったことも含めてやればやるほど面白いなと感じている今日このごろです。&lt;/p&gt;
&lt;p&gt;前置きはこのくらいにして、今回はシステムの特徴と検索機能について感じていることを書いてみようと思います。&lt;/p&gt;
&lt;h2 id=&#34;システムの特徴と検索機能&#34;&gt;システムの特徴と検索機能&lt;/h2&gt;
&lt;p&gt;先ほども書きましたが、検索は今やシステムに欠かせない機能となっています。
が、あればいいというものでもないのではないかなと。とりあえず検索できるべきだということで
検索機能を追加しても使いにくいものや、想定している動きをしない場合は使われないものになってしまいます。&lt;/p&gt;
&lt;p&gt;システムでの検索機能は特に、「情報検索」(&lt;a href=&#34;https://ja.wikipedia.org/wiki/%E6%83%85%E5%A0%B1%E6%A4%9C%E7%B4%A2&#34;&gt;Wikipediaはこちら&lt;/a&gt;)と呼ばれたりもします。Wikipediaによるとこんな説明です。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;情報検索（じょうほうけんさく）とは、コンピュータを用いて大量のデータ群から目的に合致したものを取り出すこと。検索の対象となるデータには文書や画像、音声、映像、その他さまざまなメディアやその組み合わせとして記録されたデータなどが含まれる。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;「目的」と呼ばれるものは「ユーザーのニーズ」と呼ばれたりもします。
「合致したもの」というのがシステムが返す「検索結果」になります。検索結果は大体の場合、何かしらの順序でソートされていることが多いです。
ざっくり話をすると、「ユーザーのニーズ」を元に「(何かしらの順序でソートされている)検索結果」を返すという処理です。&lt;/p&gt;
&lt;p&gt;ただ、この「ユーザーのニーズ」や「何かしらの順序でソートされている検索結果」はシステムの特性、特徴によってぜんぜん違うものになります。検索エンジンを入れただけで解決するものではありません。&lt;/p&gt;
&lt;p&gt;また、システムは提供する側のニーズもあります。
ECサイトであればより多くのユーザーに購買してもらったり、
コミュニティサイトの場合は利用ユーザーを増やしてコンテンツや広告の収入を増やしたりといったニーズがあります。&lt;/p&gt;
&lt;p&gt;これらの両方のニーズが検索機能に影響を与えたりもします。&lt;/p&gt;
&lt;p&gt;いくつか例を上げてみましょう。&lt;/p&gt;
&lt;h3 id=&#34;書籍の検索の場合&#34;&gt;書籍の検索の場合&lt;/h3&gt;
&lt;p&gt;ユーザーのニーズは、「ある本を探す」ことです。そのためにユーザーがクエリを入力します。
クエリは、例にも出しましたがタイトルや著者名の読みだったりします。
検索窓が1つしかないというよりは、著者やタイトル、出版社などそれぞれの項目ごとに検索できるほうが便利だったりしますよね。
検索結果については、完全一致したものが一番最初に出てきてほしいこともあれば、出版年月日の降順で並べたいことなど、
その時々でやりたいことが変わったりもします。&lt;/p&gt;
&lt;p&gt;場合によっては、説明文などでも検索できると嬉しいこともあります。また、システムからは離れますが、図書館や書店で時々、「〇〇について書かれている本ありますか?」といった聞き方をしたりもします。&lt;/p&gt;
&lt;p&gt;また、書店としては、探している本を見つけてもらうために検索端末などを用意しますが、そ
れ以外の本も買ってもらえるといいですよね。
オンラインの書店などでは、検索結果や書籍詳細の画面に関連書籍が出ていることもあります。&lt;/p&gt;
&lt;p&gt;検索とは少し異なり、探索(なにか面白い本とかないかな?というようなニーズ)をしに、書店に行くこともあります。
書店で平積みされた本やポップなどを見て新しい本に興味を持つこともあります。&lt;/p&gt;
&lt;h3 id=&#34;オークションサイトやecサイトでの検索の場合&#34;&gt;オークションサイトやECサイトでの検索の場合&lt;/h3&gt;
&lt;p&gt;ユーザーのニーズは、「欲しい物を探す」ことです。
ユーザーが入力するクエリは、幅広いものになると思います。製品の型番を入力する人もいれば、
メーカー名や製品名だったり、ジャンルで絞り込んで検索することもあります。&lt;/p&gt;
&lt;p&gt;探されるもの(コンテンツ、アイテム)も多数に渡ります。
検索窓は1つかもしれませんが、検索結果には、絞り込み条件(ファセット)がいくつか並んで、絞り込んでいける仕組みが用意されていることが多いです。&lt;/p&gt;
&lt;p&gt;検索結果のソートは、価格順だったり人気順だったりします。
ただ、オークションサイトの場合は新しいもの順や、終了日時の早い物順だったりします。&lt;/p&gt;
&lt;p&gt;サイト提供者のニーズとしては、より多くのアイテムを購入してもらうこと(売上)です。
また、オークションサイトの場合は、アイテムを提供している人のニーズも影響してくるでしょう。
売りたい人はより多くの人の目に留まってほしいと思うはずなので、
様々な情報を付与していかに目にとまるか?といったことを考えてくると思います。&lt;/p&gt;
&lt;p&gt;また、様々な商品を扱うECサイトの場合は、さらに色々と大変になってきます。たとえば、「iPhone」で検索されたときに、
iPhoneそのものが上位に来るべきなのか、ケースなどの周辺商品なのかだったりといった問題が出てきます。
商品の提供者が多数に渡る場合は、同一商品でもさまざまなお店から提供されてしまうために、検索結果一覧に多数同じ商品が並んだりもしますよね。&lt;/p&gt;
&lt;h3 id=&#34;レシピサイトでの検索の場合&#34;&gt;レシピサイトでの検索の場合&lt;/h3&gt;
&lt;p&gt;ユーザーのニーズは「レシピを探す」です。が、探し方はユーザーによって様々です。
冷蔵庫にある材料を入力して検索することもあれば、食べたいものが決まっていてそのレシピを検索することもあります。
このとき、重要なのは類義語だったりするでしょう。食材やレシピは同じものでも様々な名前(例:パクチー、コリアンダー、シャンツァイ(香菜)など)を持っていたりします。また、部位や形によっても名前が変わったりもします。&lt;/p&gt;
&lt;p&gt;検索結果は人気順で並ぶことが多いでしょうか?
ただ、レシピの提供がユーザーによるものなのか、サイト運営者が提供しているものかによっても変わってくるでしょう。&lt;/p&gt;
&lt;p&gt;サイト提供者のニーズとしては、レシピコミュニティサイトの場合は、ユーザー数の増加や広告の売上などがあるでしょう。
調味料などのメーカーがレシピサイトをやっている場合は、調味料の売上だったりします。この場合は、検索がどの程度売上に寄与しているのか?などを測ることが難しかったりしそうです。&lt;/p&gt;
&lt;h3 id=&#34;社内文書検索の場合&#34;&gt;社内文書検索の場合&lt;/h3&gt;
&lt;p&gt;ユーザーのニーズは「文書を探す」です。探し方はファイル名であったり、ファイルのなかに出てくる単語だったりします。
社内用語・略語のような特殊な単語で検索されることもあるでしょう。ユーザーによっては、ぼんやりとした「こんな資料を探している」といったふんわりとした検索をしたくなることもあります。&lt;/p&gt;
&lt;p&gt;検索結果の表示順は「それっぽいもの」が上位に出てくることが望まれそうです。
ただ、古い文書が出てきても役に立たないこともあります。新しい文書のほうが役に立つことが多いので、最近作られたものというのも重要な情報になります。ただし、権限によっては見ることができなかったり、そもそも探すこともNGだったりもします。&lt;/p&gt;
&lt;p&gt;社内文書検索の提供者は、素早く検索できるものを提供することで仕事の効率を上げてもらったり、無駄を省くことができることを期待しているでしょう。&lt;/p&gt;
&lt;p&gt;昔からですが、社内の文書は様々な場所に散らばっていることが多いです。顧客管理システム、ファイルサーバー、Wiki、ウェブサイトなどこれらをまとめて検索できるシステムなどが望まれていることも多いです(使われるかはまた別ですが。。。)。&lt;/p&gt;
&lt;h3 id=&#34;スマートスピーカーの場合&#34;&gt;スマートスピーカーの場合&lt;/h3&gt;
&lt;p&gt;ちょっと特殊な面白い例かなと思ってます。
音声で検索(というかお願い?)します。
システムとしては、ユーザーのニーズを理解するのに2段階あるのかなと。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;音声認識&lt;/li&gt;
&lt;li&gt;認識した文章・キーワードで検索(場合によってはコマンド発行)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これだけでも難易度が増します。&lt;/p&gt;
&lt;p&gt;さらに、画面のないスピーカーの場合は、結果は1件だけになります。これって結構難しいことだと思うんです。
画面があれば、検索結果を上位10件などのリストで表示して、あとはユーザーに選んでもらうことができますが、
音声の場合は1件だけしか返せません。
また、レスポンスタイムもシビアなものだと想定されます。ずっとスピーカーに黙っていられると困りますよね?
きっと大変なんだろうなぁ(妄想)。&lt;/p&gt;
&lt;p&gt;このように、検索と言っても、システムごとに要求・想定されるものは変わってきます。&lt;/p&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;/p&gt;
&lt;h3 id=&#34;ボヤキ&#34;&gt;ボヤキ&lt;/h3&gt;
&lt;p&gt;もう少しまとめてから書いたほうがいいのかもなぁ。
もしくは、出てくる要素を整理するとか。
ユーザー、コンテンツ、コンテンツ提供者とかで。
ふんわりとしたブログになってしまった。
個別のシステムごとにもっと書けることもありそう。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Rust the book - 第15章</title>
      <link>https://blog.johtani.info/blog/2020/07/09/hap15-rust-the-book/</link>
      <pubDate>Thu, 09 Jul 2020 18:59:38 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/07/09/hap15-rust-the-book/</guid>
      <description>&lt;p&gt;前回の記事はこちら。自分用のメモなので、読みにくいかもです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/23/start-reading-rust-the-book/&#34;&gt;Rust the Bookを読み始めた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/26/chap4-rust-the-book/&#34;&gt;Rust the book - 第4章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/02/chap5-rust-the-book/&#34;&gt;Rust the book - 第5章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/07/chap6-rust-the-book/&#34;&gt;Rust the book - 第6章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/16/chap8-rust-the-book/&#34;&gt;Rust the book - 第8章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/05/14/chap9-rust-the-book/&#34;&gt;Rust the book - 第9章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/05/28/chap10-rust-the-book/&#34;&gt;Rust the book - 第10章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/06/04/chap13-rust-the-book/&#34;&gt;Rust the book - 第13章&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;14章は飛ばして、15章です(Cargoはまた別途調べればいいかな?と思って)。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;前回の記事はこちら。自分用のメモなので、読みにくいかもです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/23/start-reading-rust-the-book/&#34;&gt;Rust the Bookを読み始めた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/26/chap4-rust-the-book/&#34;&gt;Rust the book - 第4章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/02/chap5-rust-the-book/&#34;&gt;Rust the book - 第5章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/07/chap6-rust-the-book/&#34;&gt;Rust the book - 第6章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/16/chap8-rust-the-book/&#34;&gt;Rust the book - 第8章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/05/14/chap9-rust-the-book/&#34;&gt;Rust the book - 第9章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/05/28/chap10-rust-the-book/&#34;&gt;Rust the book - 第10章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/06/04/chap13-rust-the-book/&#34;&gt;Rust the book - 第13章&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;14章は飛ばして、15章です(Cargoはまた別途調べればいいかな?と思って)。&lt;/p&gt;
&lt;h2 id=&#34;第15章-スマートポインタ&#34;&gt;第15章 スマートポインタ&lt;/h2&gt;
&lt;p&gt;たぶん、これを理解すれば、参照とベクタや構造体とかの組み合わせがもう少し効率よく使えるようになるのかなぁ?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ポインタの強い版?
&lt;ul&gt;
&lt;li&gt;参照カウント方式のスマートポインタ型 - Luceneとかで実装されてた気がするなぁ
&lt;ul&gt;
&lt;li&gt;複数の所有者!?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DerefとDropトレイトを実装している構造体&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;ヒープのデータを指すboxを使用する&#34;&gt;ヒープのデータを指すBox&lt;T&gt;を使用する&lt;/h3&gt;
&lt;p&gt;これはコンパイルエラー。&lt;code&gt;let y&lt;/code&gt;のタイミングで借用してるので、書き換えでエラーになる。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;fn main() {
    let mut x = 5;
    let y = &amp;amp;x;

    assert_eq!(5, x);
    assert_eq!(5, *y);
    x = 6;
    assert_eq!(6, x);
    assert_eq!(6, *y);
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;こっちはOK。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;fn main() {
    let mut x = 5; // in stack
    let y = Box::new(x); // in heap

    assert_eq!(5, x);
    assert_eq!(5, *y);
    x = 6;
    assert_eq!(6, x);
    assert_eq!(6, *y);
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;余談:コンパイラが変なワーニングを出してくれた。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;use std::ops::Deref;

impl&amp;lt;T, Z&amp;gt; Deref for MyBox&amp;lt;T, Z&amp;gt; {
    type Target = T;

    fn deref(&amp;amp;self) -&amp;gt; &amp;amp;T {
        &amp;amp;self.0
    }
}

struct MyBox&amp;lt;T, Z&amp;gt;(T, Z);

impl&amp;lt;T, Z&amp;gt; MyBox&amp;lt;T, Z&amp;gt; {
    fn new(x: T, y: Z) -&amp;gt; MyBox&amp;lt;T, Z&amp;gt; {
        MyBox(x, y)
    }
}

fn main() {
    let x = 5;
    let z = &amp;#34;10&amp;#34;;
    let y = MyBox::new(x, z);

    assert_eq!(5, x);
    assert_eq!(5, *y);
}
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;derefトレイトでスマートポインタを普通の参照のように扱う&#34;&gt;Derefトレイトでスマートポインタを普通の参照のように扱う&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;参照外し型強制&lt;/code&gt; : 日本語ムズカシイネ&lt;/li&gt;
&lt;li&gt;Derefを自分で実装しないといけない場面がちょっと想像できてない。たぶん、Boxとかの説明に必要なので出てきたって感じなんだろうけど。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;dropトレイトで片付け時にコードを走らせる&#34;&gt;Dropトレイトで片付け時にコードを走らせる&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;こっちは、リソース開放とかでいい感じにできそうだってのはわかった。&lt;/li&gt;
&lt;li&gt;Dropはどんなときに実装するんだろう?Tantivyだとオブジェクトプールとかで使ってた。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;rcは参照カウント方式のスマートポインタ&#34;&gt;Rc&lt;T&gt;は、参照カウント方式のスマートポインタ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;これ、ここで作ったConsのリストを追っかけるためのサンプルも書いてほしい。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#[derive(Debug)]
enum List {
    Cons(i32, Rc&amp;lt;List&amp;gt;),
    Nil,
}

fn print_typename&amp;lt;T&amp;gt;(_: T) {
    println!(&amp;#34;{}&amp;#34;, std::any::type_name::&amp;lt;T&amp;gt;());
}

use List::{Cons, Nil};
use std::rc::Rc;
use std::borrow::Borrow;

fn main() {
    let z = Cons(5, Rc::new(Cons(10, Rc::new(Nil))));
    let a = Rc::new(z);
    let _b = Cons(3, Rc::clone(&amp;amp;a));
    let _c = Cons(4, Rc::clone(&amp;amp;a));
    match &amp;amp;(*a) {
        Cons(v1, v2) =&amp;gt; {
            print_typename(v2);
            println!(&amp;#34;{}, {:?}&amp;#34;, v1, v2);
        },
        Nil =&amp;gt; println!(&amp;#34;Nil!!&amp;#34;)
    };
}
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;refcellと内部可変性パターン&#34;&gt;RefCell&lt;T&gt;と内部可変性パターン&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;循環参照はメモリをリークすることもある&#34;&gt;循環参照は、メモリをリークすることもある&lt;/h3&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Berlin Buzzwordsにオンライン出張してた</title>
      <link>https://blog.johtani.info/blog/2020/07/06/attend-berlin-buzzwords/</link>
      <pubDate>Mon, 06 Jul 2020 12:12:44 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/07/06/attend-berlin-buzzwords/</guid>
      <description>&lt;p&gt;6月7日の週に開催された&lt;a href=&#34;https://berlinbuzzwords.de/&#34;&gt;Berlin Buzzwords&lt;/a&gt;にオンライン出張してました。&lt;/p&gt;
&lt;h2 id=&#34;berlin-buzzwordsとは&#34;&gt;Berlin Buzzwordsとは?&lt;/h2&gt;
&lt;p&gt;ベルリンで開催されている、Big Data、Scarability、Storage and Searchabilityに関するカンファレンスです。
今年はコロナウイルスの影響で、オンラインで開催されました。
また、同時期に検索に関する他のカンファレンス(以下の2つ)もベルリンで毎年開催されているのですが、今年はこれら3つのカンファレンスが1つのチケットで参加できる形で開催されました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;6月7日の週に開催された&lt;a href=&#34;https://berlinbuzzwords.de/&#34;&gt;Berlin Buzzwords&lt;/a&gt;にオンライン出張してました。&lt;/p&gt;
&lt;h2 id=&#34;berlin-buzzwordsとは&#34;&gt;Berlin Buzzwordsとは?&lt;/h2&gt;
&lt;p&gt;ベルリンで開催されている、Big Data、Scarability、Storage and Searchabilityに関するカンファレンスです。
今年はコロナウイルスの影響で、オンラインで開催されました。
また、同時期に検索に関する他のカンファレンス(以下の2つ)もベルリンで毎年開催されているのですが、今年はこれら3つのカンファレンスが1つのチケットで参加できる形で開催されました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://mices.co/&#34;&gt;MICES&lt;/a&gt; - MIX-CAMP E-COMMERCE SEARCH&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://haystackconf.com/&#34;&gt;HAYSTACK&lt;/a&gt; - The Search Relevance Conference! sponsored by OpenSource Connections&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MICES、HAYSTACKは初参加ですが、検索に関するいくつかのトピックが聞けたので楽しかったです。&lt;/p&gt;
&lt;p&gt;6/7から6/12まで(がんばって)参加したので、その感想などをブログにとどめておきます。&lt;/p&gt;
&lt;h2 id=&#34;オンラインってどんな感じで開催されてた&#34;&gt;オンラインってどんな感じで開催されてた?&lt;/h2&gt;
&lt;p&gt;まずは、オンライン開催がどのような感じだったのかをメモしておきます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;有料のオンラインカンファレンス(事前にチケット購入が必要)&lt;/li&gt;
&lt;li&gt;参加者用Slack
&lt;ul&gt;
&lt;li&gt;カンファレンス数日前まではここで連絡とか質問が可能だった(もちろん、メールも来ましたけど)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;基本的なプラットフォームは&lt;a href=&#34;https://brella.io&#34;&gt;Brella&lt;/a&gt;のバーチャルイベントプラットフォーム
&lt;ul&gt;
&lt;li&gt;参加者同士のSNS機能 - 参加者同士の興味によって参加登録時に似たような人ですよとマッチングしたり。ビデオチャット機能もあり。&lt;/li&gt;
&lt;li&gt;カンファレンスのスケジュール確認 - セッションのスケジュールの他に、参加者同士でのチャットのスケジュールも可能。&lt;strong&gt;一番便利だったのは自分のタイムゾーンも表示してくれること&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;ストリームチャネル - セッションが行われている場所への誘導&lt;/li&gt;
&lt;li&gt;スピーカー・スポンサーのリスト - スピーカーやスポンサーを探せる機能。スポンサー企業からは参加者も見ることができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;セッションはYouTubeライブ
&lt;ul&gt;
&lt;li&gt;ストリーム中だったらちょっと戻ったり、ポーズもできるので、便利だった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;セッション後の質疑応答には&lt;a href=&#34;https://meet.jit.si/&#34;&gt;Jitsi&lt;/a&gt;というオープンソース!?のビデオカンファレンスの部屋が用意されてた(GitHubで公開されてるのか。https://github.com/jitsi)。&lt;/li&gt;
&lt;li&gt;2日目、3日目はLTとかが終わったあとに、オンライン飲み会やってたっぽい(不参加)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;主催者側も初めてだとは思うのですが、目立ったトラブルはなかったです。
ちょっとだけ遅れたりしてましたが、それほど影響はなかったです。
オンラインでの開催の一番のネックは、日本だと時差が辛いということです。
ベルリンが開催地なのですが、スピーカーや参加者はアメリカからの方が結構います。
そのため、開始時間が日本の23時といった具合になりました。&lt;/p&gt;
&lt;h2 id=&#34;面白かった気になったセッション&#34;&gt;面白かった&amp;amp;気になったセッション&lt;/h2&gt;
&lt;p&gt;いくつか面白かった&amp;amp;もう一度見ないとなと思ったセッションと感想を。&lt;/p&gt;
&lt;h3 id=&#34;natural-language-queries-at-salesforce-scale&#34;&gt;Natural Language queries at Salesforce scale&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://2020.berlinbuzzwords.de/session/natural-language-queries-salesforce-scale&#34;&gt;セッションのページはこちら(2020年7月現在)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Salesforceでどのような自然言語のようなクエリに対して書き換え、サジェストのようなことをやっているか?という話です。
Salesforceはテナント(企業)ごとに、データ構造などがカスタマイズ可能なため、
それぞれ個別に入力クエリ(例: new leads in sf)に対して、どういったパーツ(時間?場所?状態?)なのか?、どのフィールドへの条件なのか?といったものをNERのディープラーニングモデルとして捉えて解析しているという話でした。
企業毎にパーソナライズもされていると。実際にはパイプラインの一部でこの処理をやっており、それ以外にも処理はされているという話もありました。評価の話もされています。&lt;/p&gt;
&lt;h3 id=&#34;ama---ai-powered-search&#34;&gt;AMA - AI-Powered Search&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://2020.berlinbuzzwords.de/session/ask-me-anything-ai-powered-search&#34;&gt;セッションのページはこちら(2020年7月現在)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ManningでMEAP(絶賛書いているところ)の&lt;a href=&#34;https://www.manning.com/books/ai-powered-search&#34;&gt;AI-Powered Search&lt;/a&gt;の著者2名がAMA形式でいろんな質問に答えていく感じのやつです。
最初は近況報告(Treyさんがカンファレンス直前に転職してた)と、書籍がどんなものかを簡単に紹介したあと、質問に答えていく形式で2時間あります。ディープラーニングのモデルに関する話なども出てきています。
もう一度見たいと思ってたやつなので見ないとな。。。
(パネルっぽいセッションは、ヒントがなにもないので結構辛い)&lt;/p&gt;
&lt;h3 id=&#34;ask-me-anything-lucene-9&#34;&gt;Ask Me Anything: Lucene 9&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://2020.berlinbuzzwords.de/session/ask-me-anything-lucene-9&#34;&gt;セッションのページはこちら(2020年7月現在)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;LuceneのPMCメンバーのUweさんが今後のLucene/Solrのいくつかの質問に答える感じのAMAです。
出てきた話(質問の前の)としては、Lucene 8の現状(Bloc-Max WANDとか)や、Java 11対応になるよとかです。
QAでは、SIMDの話、Approximate Nearest Neighborがどんな感じか?などの話でした。&lt;/p&gt;
&lt;h3 id=&#34;from-commercial-search-to-owned-search&#34;&gt;From commercial search to owned search&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://2020.berlinbuzzwords.de/session/commercial-search-owned-search&#34;&gt;セッションのページはこちら(2020年7月現在)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;カルフールスペインがECの検索をどのように導入したかという概要レベルの話でした。
モノリシックなものをマイクロサービスでk8s上に載せ替えたという大きなアーキテクチャ以降の話です。
Empathy.coが提供しているものを最終的には使用したみたいだけど、
どんな検索がされているのかといったニーズの調査ができるようになり、検索に絡んだKPIが改善した話でした。
COVID-19に絡んだクエリの変化についてもちょっと話が出てました。&lt;/p&gt;
&lt;h3 id=&#34;neural-search-in-practice&#34;&gt;Neural Search in Practice&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://2020.berlinbuzzwords.de/session/neural-search-practice-0&#34;&gt;セッションのページはこちら(2020年7月現在)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Zalandoの検索の一部でNIR(Neural IRモデル)を利用してクエリの改善をやって、それをどうやってトレーニングして、テストしたかなどの話。
NIRを利用することで、複数の言語に対して改善が見られたという話だった。
今までは、クエリをいくつかの処理を元に翻訳して、入力された単語がカテゴリーに対するものなのか、スタイルに関するものなのか?などを判別して、クエリの補強?を行っている手法だった。
これに対して、ディープラーニングでクエリに対するクリックデータを元にトレーニングして、どういうクエリに対してどんなアイテムを出すのか?というモデルで検索を改善していた。
ヒット件数が0件だったり少ないものを対象にして上記の処理を入れているらしい。
(ということで、ディープラーニングをしっかり勉強しないといけないみたいなので、どうにかしたい。。。)&lt;/p&gt;
&lt;h3 id=&#34;top-10-lessons-learned-in-search-projects-the-past-10-years&#34;&gt;Top 10 Lessons learned in search projects the past 10 years&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://2020.berlinbuzzwords.de/session/top-10-lessons-learned-search-projects-past-10-years&#34;&gt;セッションのページはこちら(2020年7月現在)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;10年検索プロジェクトをやってきた10個の気づきという感じのセッション。
ごく当たり前のことなんだけど、検索の導入・改善に関して、こういう事あって、何も考えないとこうなっちゃうよね。
だから、こんなことをやるべきだよね?という話です。
たとえば、検索窓はあるけど分析すらしていない状況(レッスン1)だとまずはこういうのやらないとね。とか、
検索クエリの分析・改善ばかりして、コンテンツの分析・改善を怠っていないか?という当たり前の話です。
当たり前なんだけどまとめてくれてるのは、やはりいいなぁと。&lt;/p&gt;
&lt;h3 id=&#34;click-logs-and-insights-putting-the-search-experts-in-your-audience-to-work&#34;&gt;Click logs and insights: Putting the search experts in your audience to work&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://2020.berlinbuzzwords.de/session/click-logs-and-insights-putting-search-experts-your-audience-work&#34;&gt;セッションのページはこちら(2020年7月現在)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;検索ログとクリックログがあったときに、どういったことに使えるのかを料理のレシピに見立ててデモをするセッションで説明が面白かったです。
「こんなログがあったときに、ログのこの項目とこの項目を材料にすると、こんなのができますね」というのを、Elasticsearchにログを取り込んで、JupyterNotebookでデモをしていました。やはり動くものがあるとわかりやすいですねぇ。&lt;/p&gt;
&lt;h3 id=&#34;mixing-and-matching-diversifying-search-results&#34;&gt;Mixing and Matching: Diversifying Search Results&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://2020.berlinbuzzwords.de/session/mixing-and-matching-diversifying-search-results&#34;&gt;セッションのページはこちら(2020年7月現在)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これまたパネルセッションです。
検索結果の多様性に関するディスカッションでした。
これは、ECだからこその課題でもあるのかなと。検索自体は「何かを見つける」ための手段です。
普通に考えた場合は、ピンポイントで探していたものが見つかるのが嬉しいです。
が、例えば、ユーザーが検索した単語そのものが入っているだけのものが見つかるよりも、似たような商品も一緒に出てきてほしいことありますよね?また、ECサイトだと、回遊してほしいというのもあります。ということで、それぞれの方がどんな観点で多様性を考えているのかという話をするディスカッションになっていました。&lt;/p&gt;
&lt;h3 id=&#34;thought-vectors-knowledge-graphs-and-curious-death-of-keyword-search&#34;&gt;Thought Vectors, Knowledge Graphs, and Curious Death(?) of Keyword Search&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://2020.berlinbuzzwords.de/session/thought-vectors-knowledge-graphs-and-curious-death-keyword-search&#34;&gt;セッションのページはこちら(2020年7月現在)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AI-Powered Searchの著者の一人、Treyさんのセッション。ベクトルを検索にどうやって使うのか、
ベクトルで表現できるものはどんなものがあるのか?どんな検索エンジンで使えるのか?という話でした。
歴史的な話も交えつつ、検索だとこのへんで使えるんじゃないか?というような話でした。&lt;/p&gt;
&lt;h3 id=&#34;録画は&#34;&gt;録画は?&lt;/h3&gt;
&lt;p&gt;気になったセッションをいくつか書き出してみました。
ちなみに、全セッションのビデオが公開されています。興味がある方は、ご覧いただければと。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;The recordings from this year&amp;#39;s Berlin Buzzwords / MICES / Haystack joint event are now online. You can watch them all on our YouTube channel. Thank you once again to all of our wonderful speakers.  &lt;a href=&#34;https://t.co/hTRDmKNdpd&#34;&gt;https://t.co/hTRDmKNdpd&lt;/a&gt;&lt;/p&gt;&amp;mdash; @berlinbuzzwords@floss.social (@berlinbuzzwords) &lt;a href=&#34;https://x.com/berlinbuzzwords/status/1280089146942464000?ref_src=twsrc%5Etfw&#34;&gt;July 6, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;h2 id=&#34;感想そして来年は&#34;&gt;感想そして来年は?&lt;/h2&gt;
&lt;p&gt;楽しかったです。検索に関する話が色々聞けるのはやっぱ楽しいですね。サイトの特性(ECなのか、Wikipediaなのかなど)によっても「良い検索」の定義も変わるので、サービスなどがどんなものか、そしてそれを良くするためには検索はどんなことができるのか?といった話や、技術的な濃い話までいろいろな話を聞けました。
ただ、パネルは英語の聞き取りが辛いですね。。。あと、時差が。日本にいながらにして時差ボケは辛い。。。
オンライン飲み会には流石に参加できませんでした(4時とか5時から始まるし)。&lt;/p&gt;
&lt;p&gt;来年もオンラインで開催されたら間違いなく参加します。
オフラインのみだった場合はどうなるかなぁ。。。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>luceneutil - Analyzer性能テストへのkuromojiの追加</title>
      <link>https://blog.johtani.info/blog/2020/06/25/analyzer-perf-test-with-luceneutil/</link>
      <pubDate>Thu, 25 Jun 2020 11:01:58 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/06/25/analyzer-perf-test-with-luceneutil/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/06/23/how-to-use-luceneutil/&#34;&gt;luceneutil - マニアックなツールのセットアップ&lt;/a&gt;の続きです。
今回も誰得?なブログなので興味ない場合は飛ばしましょう。&lt;/p&gt;
&lt;p&gt;一応、&lt;code&gt;luceneutil&lt;/code&gt;のREADMEにある&lt;code&gt;localrun.py&lt;/code&gt;を動かせるところまでいったんですが、そこで一旦本題を思い返してみました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/06/23/how-to-use-luceneutil/&#34;&gt;luceneutil - マニアックなツールのセットアップ&lt;/a&gt;の続きです。
今回も誰得?なブログなので興味ない場合は飛ばしましょう。&lt;/p&gt;
&lt;p&gt;一応、&lt;code&gt;luceneutil&lt;/code&gt;のREADMEにある&lt;code&gt;localrun.py&lt;/code&gt;を動かせるところまでいったんですが、そこで一旦本題を思い返してみました。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Kuromojiの性能が落ちてるらしいし、Analyzer系のベンチマーク測ってるグラフに載せたほうがいいよね。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;これが、そもそも動かしてみようと思った本題です。
READMEに書いてある手順で動いたんですが、よくよく調べてみると、Analyzer系の性能テストをやってるのは、別物っぽいぞと。
なんとなく、「&lt;a href=&#34;http://satob.hatenablog.com/entry/2019/07/17/003751&#34;&gt;ソフトウェア考古学&lt;/a&gt;」っぽくなってきましたね。&lt;/p&gt;
&lt;h2 id=&#34;analyzerの性能テストやってるのは&#34;&gt;Analyzerの性能テストやってるのは?&lt;/h2&gt;
&lt;p&gt;Analyzerのパフォーマンステストのグラフに出てきたTokenizerの名前を元にluceneutilのリポジトリを検索してみました。
&lt;code&gt;EgdeNGrams&lt;/code&gt;当たりで検索するとヒットしたのが以下のファイルです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/mikemccand/luceneutil/blob/master/src/main/perf/TestAnalyzerPerf.java&#34;&gt;&lt;code&gt;src/main/perf/TestAnalyzerPerf.java&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;src/main/perf/TestAnalyzerPerf4x.java&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/mikemccand/luceneutil/blob/master/src/python/sumAnalyzerPerf.py&#34;&gt;&lt;code&gt;src/python/sumAnalyzerPerf.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本命は&lt;code&gt;src/main/perf/TestAnalyzerPerf.java&lt;/code&gt;っぽいですね。
これを動かしている人はどれかな?ということで、今度はこのファイル名で検索します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/mikemccand/luceneutil/blob/master/src/python/runAnalyzerPerf.py&#34;&gt;&lt;code&gt;src/python/runAnalyzerPerf.py&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;どうやら、このPythonのファイルが先程のJavaファイルを実行して、性能を計測しているみたいです。
最初に出てきた、&lt;code&gt;sumAnalyzerPerf.py&lt;/code&gt;は&lt;code&gt;runAnalyzerPerf.py&lt;/code&gt;の実行結果をAnalyzerの計測結果のグラフに追加する処理をしているようだということまでがわかりました。&lt;/p&gt;
&lt;h2 id=&#34;kuromojiをtestanalyzerperfに追加してみる&#34;&gt;KuromojiをTestAnalyzerPerfに追加してみる&lt;/h2&gt;
&lt;p&gt;動かす対象がわかったので、あとは、やることを追加しましょうと。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Kuromojiの実行を&lt;code&gt;TestAnalyzerPerf&lt;/code&gt;に追加
&lt;ul&gt;
&lt;li&gt;引数を追加して日本語版のWikipediaのファイルも読み込むようにする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;runAnalyzerPerf.py&lt;/code&gt;に引数の追加とクラスパスの追加
&lt;ul&gt;
&lt;li&gt;JapaneseAnalyzerは&lt;code&gt;lucene/analysis/kuromoji&lt;/code&gt;にビルドされるのでクラスパスを追加&lt;/li&gt;
&lt;li&gt;引数に日本語版のWikipediaのファイルを追加&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;日本語版のWikipediaのデータの用意&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;こんなものかな?と。&lt;/p&gt;
&lt;p&gt;1と2はそれほど大変ではないので、3をまずはというところから始めてみました。&lt;/p&gt;
&lt;h2 id=&#34;wikipediaのxmlから1行1データのtsvファイルに&#34;&gt;WikipediaのXMLから1行1データのTSVファイルに&lt;/h2&gt;
&lt;p&gt;まずは、どんなファイルを想定して動いているのかな?ということで、英語版のファイルがどんなものかを探してみることに。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/mikemccand/luceneutil/blob/master/src/main/perf/TestAnalyzerPerf.java#L77&#34;&gt;&lt;code&gt;TestAnalyzerPerf.java&lt;/code&gt; (77行目)&lt;/a&gt;では入力ファイルから1行ずつ文字列を読み込んでAnalyzerに処理させているだけというのがわかっています。なので、とりあえず、1行ずつ読めるような形式だと。
次に、&lt;a href=&#34;https://github.com/mikemccand/luceneutil/blob/master/src/python/runAnalyzerPerf.py#L55&#34;&gt;&lt;code&gt;runAnalyzerPerf.py&lt;/code&gt;の55行目で&lt;/a&gt;&lt;code&gt;enwiki-20130102-lines.txt&lt;/code&gt;というものを読み込んでいます。
が、これがよくわからないw&lt;/p&gt;
&lt;p&gt;前回とりあえず動いたときに、&lt;a href=&#34;https://github.com/mikemccand/luceneutil/blob/master/src/python/constants.py&#34;&gt;&lt;code&gt;src/python/constants.py&lt;/code&gt;&lt;/a&gt;にいろんなファイルへのパスとかが記載されていたのを覚えていたので、その当たりから調べてみます。
&lt;a href=&#34;https://github.com/mikemccand/luceneutil/blob/master/src/python/constants.py#L52&#34;&gt;52行目に&lt;/a&gt;約665万件のドキュメントだというような記載があります。
前回の&lt;code&gt;localrun.py&lt;/code&gt;のファイルと似たような構造(1行に1記事が埋め込まれたTSVファイル)だろうと判断して、それを作りそうなプログラムを探してみました。
Wikiとかで検索して見つけたのがこのソースたちでした。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/mikemccand/luceneutil/blob/master/src/python/wikiXMLToText.py#L160&#34;&gt;&lt;code&gt;src/python/wikiXMLToText.py&lt;/code&gt;&lt;/a&gt; - それっぽい名前ですよね?
&lt;ul&gt;
&lt;li&gt;中身を見ると、第1引数のファイル(XML)から&lt;code&gt;page&lt;/code&gt;タグごとにデータを抜き出し、処理をしてからタブ区切りで第2引数のファイルに書き出してます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/mikemccand/luceneutil/blob/master/src/python/WikipediaExtractor.py&#34;&gt;&lt;code&gt;src/python/WikipediaExtractor.py&lt;/code&gt;&lt;/a&gt; - これもそれっぽいですね。
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;WikipediaExtractory.py&lt;/code&gt;は界隈では有名な&lt;code&gt;https://github.com/attardi/wikiextractor&lt;/code&gt;みたいです。こっちはなんとなく使い方はわかっています。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/mikemccand/luceneutil/blob/master/src/python/combineWikiFiles.py&#34;&gt;&lt;code&gt;src/python/combineWikiFiles.py&lt;/code&gt;&lt;/a&gt; - これまたそれっぽい。
&lt;ul&gt;
&lt;li&gt;中身を見ると、1番目のコードで出力したデータに、2番めのコードで出力されたデータを元になにかしら処理をして、引数で与えられたファイルに出力する感じになってます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ということで、完全に憶測ですが、日本語のWikipediaのXMLファイルを元に次のような流れでファイル作ってみればいいのかな?と。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;jawiki-20200620-pages-articles.xml.bz2&lt;/code&gt;をwikimediaからダウンロードして、&lt;code&gt;unbzip2&lt;/code&gt;で展開&lt;/li&gt;
&lt;li&gt;&lt;code&gt;python src/python/wikiXMLToText.py jawiki-20200620-pages-articles.xml jawiki-lines.txt&lt;/code&gt;で、1行ごとのデータを作る
&lt;ul&gt;
&lt;li&gt;ちなみに、このプログラムは2箇所ほど修正しました。&lt;code&gt;username&lt;/code&gt;タグが存在しない&lt;code&gt;page&lt;/code&gt;が出力されなさそうなので、デフォルトで&lt;code&gt;username: &amp;quot;&amp;quot;&lt;/code&gt;みたいなデータを&lt;code&gt;attr&lt;/code&gt;ってディクショナリに設定しました。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cat jawiki-20200620-pages-articles.xml | python -u src/python/WikipediaExtractor.py -b102400m -o extracted&lt;/code&gt;で別途XMLからデータを抽出&lt;/li&gt;
&lt;li&gt;&lt;code&gt;python src/python/combineWikiFiles.py jawiki-lines.txt extracted/AA/wiki_00 jawiki-20200620-lines.txt&lt;/code&gt;で2と3の出力をかけ合わせる&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;で、まぁ、一応ファイルはできたんですが。。。
前回のブログ記事でセットアップしたときにダウンロードされたファイルは&lt;code&gt;title&lt;/code&gt;、&lt;code&gt;日付&lt;/code&gt;、&lt;code&gt;本文&lt;/code&gt;の3つのカラムしかないんですが、上記の手順で作り出したファイルにはいろんなカラムが存在するんですよね(2が出力する項目が結構ある)。。。&lt;/p&gt;
&lt;h2 id=&#34;性能テスト用プログラムの書き換え&#34;&gt;性能テスト用プログラムの書き換え&lt;/h2&gt;
&lt;p&gt;入力ファイルは出来上がったので、あとは、性能テストを走らせる部分の修正です。
&lt;a href=&#34;https://github.com/mikemccand/luceneutil/pull/69&#34;&gt;修正部分はプルリク&lt;/a&gt;見たほうが明確なので省略で。&lt;/p&gt;
&lt;h2 id=&#34;実行してみた&#34;&gt;実行してみた&lt;/h2&gt;
&lt;p&gt;で、実行してみました。
せっかくなので、ブランチを&lt;code&gt;branch_8_5&lt;/code&gt;と&lt;code&gt;master&lt;/code&gt;を対象にしてやってみました。
実際には&lt;code&gt;src/python/runAnalyzerPerf.py&lt;/code&gt;にディレクトリ名やブランチ名が直書きされてたので書き換えつつ実施した結果はこちら。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20200625/analyzer_perf_test.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20200625/analyzer_perf_test.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;他の英語系のAnalyzerと同じグラフに載せてみたのですが、遅いので、下の方に表示されてます。
で、下に凹んだ部分(&lt;code&gt;23 June&lt;/code&gt;のところ)が&lt;code&gt;branch_8_5&lt;/code&gt;で実行したときの性能値でした。
実際に遅くなってますね。ただ、他のAnalyzerの振れ幅も大きいので、別のグラフにしたほうがわかりやすくなるのかもなぁと思った次第です。&lt;/p&gt;
&lt;p&gt;ということで、一応動いたんでプルリク出してみました。
採用されるかなぁ?&lt;/p&gt;
&lt;p&gt;一応誰得ブログはこれでおしまい。
Noriとかもこの感じで対応できるんじゃないかな?&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>luceneutil - マニアックなツールのセットアップ</title>
      <link>https://blog.johtani.info/blog/2020/06/23/how-to-use-luceneutil/</link>
      <pubDate>Tue, 23 Jun 2020 21:58:29 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/06/23/how-to-use-luceneutil/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://issues.apache.org/jira/browse/LUCENE-9286&#34;&gt;LuceneのFSTの修正に関連して、Kuromojiのパフォーマンス問題が出ているようです&lt;/a&gt;。
この問題自体はLucene 8.6.0以降で直る予定のようなのです(&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues/57142&#34;&gt;Elasticsearchへの影響範囲についてはこれが参考になるかな?&lt;/a&gt;)。
で、これに関連して、ベンチマーク計らないとねという話が出ていて、
昔から、LuceneのMikeさんがやっている&lt;a href=&#34;http://people.apache.org/~mikemccand/lucenebench/analyzers.html&#34;&gt;ベンチマークのグラフ&lt;/a&gt;に&lt;a href=&#34;https://github.com/mikemccand/luceneutil/issues/64&#34;&gt;載せるのがいいよね&lt;/a&gt;という話になっていました。
どうも、これについては、Luceneの中にあるbenchmarkというプロジェクトではなく、MikeさんのGitHubリポジトリにあるプログラムで計測しているようです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://issues.apache.org/jira/browse/LUCENE-9286&#34;&gt;LuceneのFSTの修正に関連して、Kuromojiのパフォーマンス問題が出ているようです&lt;/a&gt;。
この問題自体はLucene 8.6.0以降で直る予定のようなのです(&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues/57142&#34;&gt;Elasticsearchへの影響範囲についてはこれが参考になるかな?&lt;/a&gt;)。
で、これに関連して、ベンチマーク計らないとねという話が出ていて、
昔から、LuceneのMikeさんがやっている&lt;a href=&#34;http://people.apache.org/~mikemccand/lucenebench/analyzers.html&#34;&gt;ベンチマークのグラフ&lt;/a&gt;に&lt;a href=&#34;https://github.com/mikemccand/luceneutil/issues/64&#34;&gt;載せるのがいいよね&lt;/a&gt;という話になっていました。
どうも、これについては、Luceneの中にあるbenchmarkというプロジェクトではなく、MikeさんのGitHubリポジトリにあるプログラムで計測しているようです。&lt;/p&gt;
&lt;p&gt;じゃあ、手元でこれどうやって動かすんだろう?ということでやってみたブログになります。
おそらく、99.99%の人は興味ないと思うのでスルーしていただくのがいいと思います。備忘録のために書いてます。&lt;/p&gt;
&lt;h2 id=&#34;とりあえずgit-clone&#34;&gt;とりあえずgit clone&lt;/h2&gt;
&lt;p&gt;公開されているリポジトリは&lt;a href=&#34;https://github.com/mikemccand/luceneutil/&#34;&gt;こちら&lt;/a&gt;です。&lt;/p&gt;
&lt;h2 id=&#34;手順通りに&#34;&gt;手順通りに?&lt;/h2&gt;
&lt;p&gt;とりあえず、READMEにセットアップなどのやり方があったんで追っていくことに。
とりあえず動くまでの手順は以下のとおりです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ディレクトリを決める
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$LUCENE_BENCH_HOME&lt;/code&gt;が起点になります。名前は何でもいいみたいです。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd $LUCENE_BENCH_HOME&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;リポジトリをクローン - &lt;code&gt;git clone https://github.com/mikemccand/luceneutil.git util&lt;/code&gt;です。
&lt;ul&gt;
&lt;li&gt;コレ自体は問題なし。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd util&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;セットアップスクリプトを実行 - &lt;code&gt;python src/python/setup.py -download&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;ここがすごく時間かかります。6GBのファイルをゆっくりダウンロードしてきますので、一晩置いておきましょう(起きたら終わってた)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$LUCENE_BENCH_HOME/data&lt;/code&gt;に&lt;code&gt;enwiki-20120502-lines-1k.txt.lzma&lt;/code&gt;と&lt;code&gt;wikimedium500.tasks&lt;/code&gt;いうファイルがダウンロードされている。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ダウンロードした圧縮ファイルを展開 - &lt;code&gt;unlzma enwiki-20120502-lines-1k.txt.lzma&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;macOSに&lt;code&gt;lzma&lt;/code&gt;のコマンド入ってるんですね。知らなかった。&lt;/li&gt;
&lt;li&gt;終わったら&lt;code&gt;cd ../&lt;/code&gt;で&lt;code&gt;$LUCENE_BENCH_HOME&lt;/code&gt;に戻っておく&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ベンチマーク対象となるLuceneを用意 - &lt;code&gt;git clone https://github.com/apache/lucene-solr.git&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;READMEには&lt;code&gt;lucene_candidate&lt;/code&gt;と&lt;code&gt;lucene_baseline&lt;/code&gt;って名前でって書いてあったのですが、これだと、この後の実行フェーズでエラーになりました。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;trunk&lt;/code&gt;と&lt;code&gt;patch&lt;/code&gt;というディレクトリにそれぞれ変更しました。&lt;code&gt;localrun.py&lt;/code&gt;を実行したらこのディレクトリ名だったので(相変わらず、自分、行きあたりばったりな対応してるなぁ。。。)&lt;/li&gt;
&lt;li&gt;とりあえず動くかどうかを確認したかったので、&lt;code&gt;trunk&lt;/code&gt;と&lt;code&gt;patch&lt;/code&gt;はどちらもリポジトリを&lt;code&gt;clone&lt;/code&gt;したものになってます。動いたのを確認したら、タグを指定して比較したいブランチをチェックアウトする予定。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;trunk&lt;/code&gt;と&lt;code&gt;patch&lt;/code&gt;をビルド - &lt;code&gt;ant jar&lt;/code&gt;
*&lt;/li&gt;
&lt;li&gt;&lt;code&gt;localrun.py&lt;/code&gt;を実行 - &lt;code&gt;cd util&lt;/code&gt;そして。。。
&lt;ul&gt;
&lt;li&gt;5.で記述したディレクトリ以外に1箇所Pythonのコードを書き換えた。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;src/python/benchUtil.py&lt;/code&gt;内部に&lt;code&gt;hppc-0.8.1.jar&lt;/code&gt;のファイルの存在チェックをしているのだが、2020/06/23時点でのLuceneのリポジトリの依存関係だと&lt;code&gt;hppc-0.8.2.jar&lt;/code&gt;になっており、ファイルが見つからないエラーが出たため、&lt;code&gt;0.8.2&lt;/code&gt;に書き換えた。970行目付近。&lt;/li&gt;
&lt;li&gt;改めて実行したら成功した。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;まだ途中&#34;&gt;まだ途中&lt;/h2&gt;
&lt;p&gt;とりあえず、実行するところまではできましたが、結果の見方とかちゃんと調べないとなぁ。
いくつかローカルで対応したものについてはあとでGitHubにIssue立てとくべきだな。&lt;/p&gt;
&lt;p&gt;と、動くのを確認したので、日本語周りの準備をしてみてるところです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;終わったこと&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;日本語のWikipediaのデータ&lt;code&gt;jawiki-20200620-pages-articles.xml.bz2&lt;/code&gt;をダウンロードして展開&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;試している途中&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WikipediaExtractorでXMLからデータを抽出 - &lt;code&gt;cat ~/tmp/wiki/jawiki-20200620-pages-articles.xml | python -u src/python/WikipediaExtractor.py -b102400m -o extracted&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;これは手順が違うかも????&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;python src/python/wikiXMLToText.py ~/tmp/wiki/20200620-pages-articles.xml ./hoge.txt&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;これで、&lt;code&gt;title&lt;/code&gt;、&lt;code&gt;日付&lt;/code&gt;、&lt;code&gt;本文&lt;/code&gt;が抜き出せそう?&lt;/li&gt;
&lt;li&gt;この後に&lt;code&gt;combineWikiFiles.py&lt;/code&gt;の実行かな?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;って感じです。
誰得だろうこれ???&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>KuromojiとSynonymとパッチ(LUCENE-9123)</title>
      <link>https://blog.johtani.info/presentation/2020/kuromoji-synonym-lucene-9123/</link>
      <pubDate>Thu, 18 Jun 2020 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2020/kuromoji-synonym-lucene-9123/</guid>
      <description></description>
      <content:encoded></content:encoded>
    </item>
    
    <item>
      <title>Azure Cognitive Searchでの日本語向けAnalyzerの違い</title>
      <link>https://blog.johtani.info/blog/2020/06/09/difference-analyzers-in-azure-search/</link>
      <pubDate>Tue, 09 Jun 2020 17:44:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/06/09/difference-analyzers-in-azure-search/</guid>
      <description>&lt;p&gt;Azure Cognitive Searchで日本語を扱うときに、形態素解析器を使いたい場合、2種類のAnalyzerが用意されています。今回はこれらの違いがどんなものかを見ていくことにします。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Azure Cognitive Searchで日本語を扱うときに、形態素解析器を使いたい場合、2種類のAnalyzerが用意されています。今回はこれらの違いがどんなものかを見ていくことにします。&lt;/p&gt;
&lt;h2 id=&#34;analyzerとは&#34;&gt;Analyzerとは?&lt;/h2&gt;
&lt;p&gt;まずは、その前にAnalyzerとは何者か?というのを少しだけ。
Azure Cognitive Searchは&lt;a href=&#34;https://ja.wikipedia.org/wiki/%E8%BB%A2%E7%BD%AE%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9&#34;&gt;転置インデックス&lt;/a&gt;を内部で作成して、検索を行っています。
この、転置インデックスは、「単語」がどのドキュメントに入っているか?を素早く見つけることができるデータ構造となっています。&lt;/p&gt;
&lt;p&gt;Azure Cognitive Searchは、この「単語」を入力された文章から生成するときに、Analyzerというものを利用します。
Analyzerは入力された文章をある規則に則って単語に分割する機能です。
この「ある規則」が、各種言語や用途によって様々に用意されています。
今回はこの中の&lt;code&gt;ja.lucene&lt;/code&gt;と&lt;code&gt;ja.microsoft&lt;/code&gt;という2種類のAnalyzerについて違いを見ていきます。&lt;/p&gt;
&lt;h2 id=&#34;2種類のanalyzerの違いはどんなもの&#34;&gt;2種類のAnalyzerの違いはどんなもの?&lt;/h2&gt;
&lt;p&gt;このAnalyzerの挙動を見るためのエンドポイントとして&lt;code&gt;analyze&lt;/code&gt;というAPIがあります(&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/19/azure-search-analyze-plugin/&#34;&gt;詳細は昔のブログを参照&lt;/a&gt;)。&lt;/p&gt;
&lt;p&gt;このAPIを利用して、Wikipediaのいくつかの文章を単語に区切って見て、
&lt;code&gt;ja.microsoft&lt;/code&gt;がどんな動きをしているのか想像してみます(残念ながら&lt;code&gt;ja.microsoft&lt;/code&gt;の仕様?や挙動についてはページが見つからないため)。&lt;/p&gt;
&lt;h3 id=&#34;もとの文章と解析結果一部抜粋&#34;&gt;もとの文章と解析結果(一部抜粋)&lt;/h3&gt;
&lt;p&gt;文章は、手元のElasticsearchに登録したjawikiのデータからランダムに抽出しています。また、自前のツールで生成したWikipediaのデータなので、まだ一部、見苦しい文字列になっています(そっちもなおさないと)。&lt;/p&gt;
&lt;h4 id=&#34;1-砂川熊本県&#34;&gt;1. 砂川（熊本県）&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;thumb|250px|right|上砂川橋より上流方砂川（すながわ）は、熊本県宇城市・八代郡氷川町を流れる二級河川。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この文字列から抽出された単語で特徴的なものを一部抜粋しました。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;&lt;code&gt;ja.microsoft&lt;/code&gt;&lt;/th&gt;
          &lt;th&gt;&lt;code&gt;ja.lucene&lt;/code&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;250px&lt;/td&gt;
          &lt;td&gt;250&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;px&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;上砂&lt;/td&gt;
          &lt;td&gt;上, 上砂川&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;川橋&lt;/td&gt;
          &lt;td&gt;砂川&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;橋&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;宇城&lt;/td&gt;
          &lt;td&gt;宇&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;市&lt;/td&gt;
          &lt;td&gt;城市&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;二級&lt;/td&gt;
          &lt;td&gt;二&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;^&lt;/td&gt;
          &lt;td&gt;級&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;まず、最初の&lt;code&gt;250px&lt;/code&gt;ですが、&lt;code&gt;ja.microsoft&lt;/code&gt;では、&lt;code&gt;px&lt;/code&gt;が単位であると判定しているのか、数値と合わせた単語として抽出されています。この場合、&lt;code&gt;250&lt;/code&gt;で検索しても、この文字列はヒットしない形になるので、ノイズが減ることが考えられるかと。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;上砂川橋&lt;/code&gt;という文字は、分割の仕方が別れました。
&lt;code&gt;ja.lucene&lt;/code&gt;では、&lt;code&gt;上砂川&lt;/code&gt;という単語が地名として辞書に存在するために、このような分割になっています。&lt;code&gt;ja.microsoft&lt;/code&gt;のデータは品詞の情報が取れないのですが、&lt;code&gt;上砂&lt;/code&gt;、&lt;code&gt;川橋&lt;/code&gt;ともに、名詞として辞書に存在しているのではないかなと。&lt;code&gt;ja.lucene&lt;/code&gt;には&lt;code&gt;川橋&lt;/code&gt;という単語は存在していないようでした。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;宇城市&lt;/code&gt;(うきし)については、2005年に合併でできた市のようで、&lt;code&gt;ja.lucene&lt;/code&gt;が利用している辞書には存在しない可能性があり、&lt;code&gt;宇城&lt;/code&gt;という文字が抽出できてないと思われます。&lt;/p&gt;
&lt;p&gt;最後は&lt;code&gt;二級&lt;/code&gt;です。&lt;code&gt;ja.lucene&lt;/code&gt;では、数字と助数詞として分割されています。こちらも何かしらのロジックにより、&lt;code&gt;二級&lt;/code&gt;という1単語でヒットできるように数字と単位?が合わせた単語で出てくる仕組みが&lt;code&gt;ja.microsoft&lt;/code&gt;なのかなと。&lt;/p&gt;
&lt;h4 id=&#34;2-uefa-u-18女子選手権2000&#34;&gt;2. UEFA U-18女子選手権2000&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;UEFA U-18女子選手権2000は第3回目のUEFA U-18女子選手権である。決勝トーナメントは2000年7月27日から8月4日までフランスで行われ、ドイツが初優勝を果たした。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この文字列から抽出された単語で特徴的なものを一部抜粋しました。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;&lt;code&gt;ja.microsoft&lt;/code&gt;&lt;/th&gt;
          &lt;th&gt;&lt;code&gt;ja.lucene&lt;/code&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;u-18, u&lt;/td&gt;
          &lt;td&gt;u&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;18, nn18&lt;/td&gt;
          &lt;td&gt;18&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;第3回目&lt;/td&gt;
          &lt;td&gt;第&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;3&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;回&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;目&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;トーナメント, トナメント&lt;/td&gt;
          &lt;td&gt;トーナメント&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2000年&lt;/td&gt;
          &lt;td&gt;2000&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;年&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;7月&lt;/td&gt;
          &lt;td&gt;7&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;月&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;27日&lt;/td&gt;
          &lt;td&gt;27&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;日&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;数字を含む単語&lt;code&gt;第3回目&lt;/code&gt;や&lt;code&gt;2000年&lt;/code&gt;、&lt;code&gt;7月&lt;/code&gt;などは、&lt;code&gt;ja.microsoft&lt;/code&gt;は先程と同様、数字と単位の組み合わせを1単語として出力しています。&lt;/p&gt;
&lt;p&gt;また、&lt;code&gt;トーナメント&lt;/code&gt;という単語を&lt;code&gt;トナメント&lt;/code&gt;という形で、長音を除去した形で出力しています。
今回の文字列ではないですが、この他に、&lt;code&gt;センター&lt;/code&gt;を&lt;code&gt;センター&lt;/code&gt;と&lt;code&gt;センタ&lt;/code&gt;の2パターンの単語で出力するといったことを行っています。
&lt;code&gt;ja.lucene&lt;/code&gt;の場合、単語の最後に長音がある場合だけ&lt;code&gt;センタ&lt;/code&gt;として、長音を除去した単語が出力されます。
これは、長音の表記ゆれに対応するためではないかなと。たとえば、&lt;code&gt;インターフェース&lt;/code&gt;と&lt;code&gt;インタフェース&lt;/code&gt;、&lt;code&gt;インターフェイス&lt;/code&gt;のように、人や文章によって、間にでてくる長音を使ったり使わなかったりという表記ゆれに対応するためだと思われます。
その他にも、&lt;code&gt;イプロゥヴェト&lt;/code&gt;を&lt;code&gt;イプロゥベト&lt;/code&gt;に、&lt;code&gt;ネクスト&lt;/code&gt;を&lt;code&gt;ネキスト&lt;/code&gt;に、&lt;code&gt;バラエティ&lt;/code&gt;を&lt;code&gt;バラエチ&lt;/code&gt;にも変換するなどといった処理をしてくれるようです。カタカナの表記ゆれには強そうですね(これどうやってるんだろう?)。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ja.microsoft&lt;/code&gt;では、&lt;code&gt;nn18&lt;/code&gt;というちょっと変わった単語も出てきていました。純粋な数字の場合は&lt;code&gt;nn&lt;/code&gt;と入力してくれるようで、数字だけで検索したい場合に利用できるのかな?これはドキュメントに書いておいてほしいかも?&lt;/p&gt;
&lt;h3 id=&#34;共通点&#34;&gt;共通点&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ja.lucene&lt;/code&gt;、&lt;code&gt;ja.microsoft&lt;/code&gt;ともに、共通している動作として、「てにをは」といった単語は除去されていました。違いがあるものとしては、「より」(助詞-格助詞-一般)、「されている」(動詞-自立、動詞-接尾、助詞-接続助詞、動詞-非自立)、「ある」(助動詞)といったものは&lt;code&gt;ja.microsoft&lt;/code&gt;では除去されずに出てきていました。
ストップワード的に「てにをは」あたりを除去をしている感じでしょうか?&lt;/p&gt;
&lt;p&gt;アルファベットで構成されている単語についても、基本はそのまま出力される挙動のようでした。&lt;/p&gt;
&lt;h2 id=&#34;じゃあどっちがいいの&#34;&gt;じゃあどっちがいいの?&lt;/h2&gt;
&lt;p&gt;残念ながらどちらがいいかは、一長一短かなぁと。
&lt;code&gt;ja.lucene&lt;/code&gt;に関しては、Luceneの仕組みを利用しているので、Elasticsearchなどを使えば、個別の単語についてより詳細の情報を取得することが可能です(品詞、読みなど)。&lt;code&gt;ja.microsoft&lt;/code&gt;については、残念ながら手の入れようがないので、そういう動きのものだという割り切った使い方になるでしょうか?
ただ、長音の除去による表記ゆれなどについては、便利な機能なので、そのあたりの問題に対応したい場合は、&lt;code&gt;ja.microsoft&lt;/code&gt;を活用するのも良いかと思います。&lt;/p&gt;
&lt;p&gt;個人的には、より細かい単語としてインデックスに登録できるもののほうが、柔軟な検索には対応できるのではないかなぁと考えています(Kuromojiの辞書をUniDicにするとか?も考えますが、これはAzure Searchではできないですが)。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Wikipediaのデータをいくつか使って、&lt;code&gt;ja.microsoft&lt;/code&gt;と&lt;code&gt;ja.lucene&lt;/code&gt;の違いについて、考察してみました。何かの役に立てばと。
他に、これはどんな感じになるの?などありましたら、コメントいただければと。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Rust the book - 第13章</title>
      <link>https://blog.johtani.info/blog/2020/06/04/chap13-rust-the-book/</link>
      <pubDate>Thu, 04 Jun 2020 17:37:29 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/06/04/chap13-rust-the-book/</guid>
      <description>&lt;p&gt;前回の記事はこちら。自分用のメモなので、読みにくいかもです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/23/start-reading-rust-the-book/&#34;&gt;Rust the Bookを読み始めた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/26/chap4-rust-the-book/&#34;&gt;Rust the book - 第4章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/02/chap5-rust-the-book/&#34;&gt;Rust the book - 第5章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/07/chap6-rust-the-book/&#34;&gt;Rust the book - 第6章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/16/chap8-rust-the-book/&#34;&gt;Rust the book - 第8章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/05/14/chap9-rust-the-book/&#34;&gt;Rust the book - 第9章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/05/28/chap10-rust-the-book/&#34;&gt;Rust the book - 第10章&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;11章、12章はちょっと飛ばして、13章です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;前回の記事はこちら。自分用のメモなので、読みにくいかもです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/23/start-reading-rust-the-book/&#34;&gt;Rust the Bookを読み始めた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/26/chap4-rust-the-book/&#34;&gt;Rust the book - 第4章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/02/chap5-rust-the-book/&#34;&gt;Rust the book - 第5章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/07/chap6-rust-the-book/&#34;&gt;Rust the book - 第6章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/16/chap8-rust-the-book/&#34;&gt;Rust the book - 第8章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/05/14/chap9-rust-the-book/&#34;&gt;Rust the book - 第9章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/05/28/chap10-rust-the-book/&#34;&gt;Rust the book - 第10章&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;11章、12章はちょっと飛ばして、13章です。&lt;/p&gt;
&lt;h2 id=&#34;第13章&#34;&gt;第13章&lt;/h2&gt;
&lt;p&gt;イテレータ、クロージャです。
12章の話もちょっと出てくるのか。&lt;/p&gt;
&lt;h3 id=&#34;クロージャ&#34;&gt;クロージャ&lt;/h3&gt;
&lt;p&gt;基本的に、「変数には値が束縛されている」という固定観念がずっと頭にこびりついたままなので、クロージャに慣れないんだろうなぁ。そろそろこの固定観念をどうにかしないと。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;匿名関数で、変数に保存したり引数に渡せる&lt;/li&gt;
&lt;li&gt;ちょっと面白い話(ワークアウト)で実際に考えられる手法の説明がいくつか行われる&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;関数でリファクタリング
&lt;ul&gt;
&lt;li&gt;これが自分がよくやるパターンかなぁ。クロージャになれてないので。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;クロージャーを変数に束縛
&lt;ul&gt;
&lt;li&gt;呼び出しは関数みたいな感じ(ここで少し混乱)&lt;/li&gt;
&lt;li&gt;これだと、結局呼び出されたタイミングが複数回あるよね? -&amp;gt; あはりそうだった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ここで、閑話休題で、クロージャの型推論とか注釈の話。
クロージャは狭い文脈だし、外に公開しているものでもないので、戻り値なども定義してなくてもいいよねとのこと。書くことも可能?なので、書いてわかりやすくするのもありなんだろうな。&lt;/p&gt;
&lt;p&gt;推論についてはこれまで通りで、2回異なる型の変数で呼び出すと、2回目で怒られていた。&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;遅延評価(クロージャを保持する構造体!?)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Fn&lt;/code&gt;トレイト&lt;/li&gt;
&lt;li&gt;トレイトとMatchの組み合わせだからこのへんで説明する形になるのか。&lt;/li&gt;
&lt;li&gt;これを真似すれば、いくつか処理を簡素化できるかもしれないなぁ、たしかに。&lt;/li&gt;
&lt;li&gt;なければ実行するみたいな処理を書きたいことがよくあるし。Javaだとnullで定義しといて、nullだったらみたいなのがあるから。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Cacher&lt;/code&gt;はサンプルだからこの名前でいいけど、自分だと、どんな名前にするかなぁ?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;振る舞いは難しくなるのか。&lt;code&gt;Cacher実装の限界&lt;/code&gt;を読むと。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;関数にするとスコープが変わるのでアクセスできなくなると。。。コンパイラが教えてくれるのは便利だな。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;環境から値をキャプチャする3つの方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多分この話が一番クロージャに意味がある話なんだと思う。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;イテレータ&#34;&gt;イテレータ&lt;/h3&gt;
&lt;p&gt;回しましょう。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;便利。ただ、こういう書き方に自分が慣れてないので、そっちを補正しないとなぁ。&lt;/li&gt;
&lt;li&gt;どれがイテレータ?っていうのを判別するのがちょっとむずかしい(慣れの問題かなぁ)&lt;/li&gt;
&lt;li&gt;イテレータアダプタ便利。どんなのがあるのか?とかがやっとわかってきた。&lt;/li&gt;
&lt;li&gt;パフォーマンスに関しては、うーん、どうなんだろう?という感想だった。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Rust the book - 第10章</title>
      <link>https://blog.johtani.info/blog/2020/05/28/chap10-rust-the-book/</link>
      <pubDate>Thu, 28 May 2020 18:06:55 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/05/28/chap10-rust-the-book/</guid>
      <description>&lt;p&gt;前回の記事はこちら。自分用のメモなので、読みにくいかもです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/23/start-reading-rust-the-book/&#34;&gt;Rust the Bookを読み始めた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/26/chap4-rust-the-book/&#34;&gt;Rust the book - 第4章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/02/chap5-rust-the-book/&#34;&gt;Rust the book - 第5章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/07/chap6-rust-the-book/&#34;&gt;Rust the book - 第6章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/16/chap8-rust-the-book/&#34;&gt;Rust the book - 第8章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/05/14/chap9-rust-the-book/&#34;&gt;Rust the book - 第9章&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;第10章&#34;&gt;第10章&lt;/h2&gt;
&lt;p&gt;ジェネリック、トレイト、ライフタイムです。
手強そう。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;前回の記事はこちら。自分用のメモなので、読みにくいかもです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/23/start-reading-rust-the-book/&#34;&gt;Rust the Bookを読み始めた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/26/chap4-rust-the-book/&#34;&gt;Rust the book - 第4章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/02/chap5-rust-the-book/&#34;&gt;Rust the book - 第5章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/07/chap6-rust-the-book/&#34;&gt;Rust the book - 第6章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/16/chap8-rust-the-book/&#34;&gt;Rust the book - 第8章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/05/14/chap9-rust-the-book/&#34;&gt;Rust the book - 第9章&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;第10章&#34;&gt;第10章&lt;/h2&gt;
&lt;p&gt;ジェネリック、トレイト、ライフタイムです。
手強そう。&lt;/p&gt;
&lt;p&gt;いきなり関数の切り出し方みたいな話が始まって面食らいました。&lt;/p&gt;
&lt;h3 id=&#34;ジェネリックなデータ型&#34;&gt;ジェネリックなデータ型&lt;/h3&gt;
&lt;p&gt;ジェネリックはJavaにもあるので、それほど理解に苦しむことはなかったです。
また、OptionやResultですでに経験済みでしたし。&lt;/p&gt;
&lt;p&gt;ただ、&lt;code&gt;impl&amp;lt;T&amp;gt; Point&amp;lt;T&amp;gt;{&lt;/code&gt;、このメソッド定義は少し最初は戸惑いました。
言われてみれば、なるほどなんですけど。&lt;/p&gt;
&lt;p&gt;コンパイル時にコンパイラが単相化を行うことにより、必要最低限なコードを生成してくるというのは理にかなっているなぁと。&lt;/p&gt;
&lt;h3 id=&#34;トレイト-共通の振る舞いを定義する&#34;&gt;トレイト: 共通の振る舞いを定義する&lt;/h3&gt;
&lt;p&gt;出だしにもありますが、「インターフェイス」という機能に類似していると考えると割とすんなりと理解が進みました。
ただ、Javaだと、インターフェースはクラスとセットなため、トレイとの実装に関する記述方法は少し戸惑いが。&lt;/p&gt;
&lt;p&gt;デフォルト実装との組み合わせはAbstractに似た処理になるなと考えながら読みすすめました。&lt;/p&gt;
&lt;p&gt;「トレイト境界」という日本語には少し違和感を覚えましたが、線引をして、制限をかけるという理解でいいのかな?&lt;/p&gt;
&lt;p&gt;実際には&lt;code&gt;#[derive()]&lt;/code&gt;などで、トレイトを自分で実装する必要がないなどの、便利機能も用意されており、このあたりのコードの追い方がまだ少し慣れていないかもなぁと。便利なんですけど。。。&lt;/p&gt;
&lt;p&gt;少しだけ気になったので、動作確認したのは次の実装です。&lt;/p&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Tweet&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;pub&lt;/span&gt; username: String,
&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;pub&lt;/span&gt; content: String,
&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;pub&lt;/span&gt; reply: &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&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;pub&lt;/span&gt; retweet: &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&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;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;trait&lt;/span&gt; Summary {
&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;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;summarize_author&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self) -&amp;gt; String;
&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;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;summarize&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self) -&amp;gt; String {
&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;// {}さんからもっと読む
&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;format!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;(Read more from &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;...)&amp;#34;&lt;/span&gt;, self.summarize_author())
&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;impl&lt;/span&gt; Tweet {
&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;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;summarize_author&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self) -&amp;gt; String {
&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;format!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;hoge &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, self.username)
&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;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;to_string&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self) -&amp;gt; String {
&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;format!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;fuga&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;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;impl&lt;/span&gt; Summary &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; Tweet {
&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;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;summarize_author&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self) -&amp;gt; String {
&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;format!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;@&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, self.username)
&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;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;summary&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;T: &lt;span style=&#34;color:#a6e22e&#34;&gt;Summary&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;(hoge: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;T&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;println!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, hoge.summarize_author());
&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;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&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;let&lt;/span&gt; tweet &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Tweet {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        username: String::from(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;horse_ebooks&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        content: String::from(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;of course, as you probably already know, people&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        reply: &lt;span style=&#34;color:#a6e22e&#34;&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        retweet: &lt;span style=&#34;color:#a6e22e&#34;&gt;false&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:#a6e22e&#34;&gt;println!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, tweet.summarize_author());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    summary(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;tweet);
&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;println!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, Summary::summarize_author(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;tweet));
&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;言われてみればそうですが、プログラマが色々考えないとまぁ、行けないんですねという感想。&lt;/p&gt;
&lt;p&gt;ただ、借用チェッカーが賢くやってくれるおかげで、全てにライフタイム注釈をつけなくて良くなっているというのがわかりました。
逆に言うと、なんとなくRustを書き始めてしまったので、それを知らずに書いたせいで、コンパイラに怒られてても「?」となっていたのかと。。。&lt;/p&gt;
&lt;p&gt;疑問点がいくつかあって、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通常はどんなライフタイム注釈をみんな書いてるんだろう?&lt;code&gt;&#39;a&lt;/code&gt;とかざっくりしすぎてる?&lt;/li&gt;
&lt;li&gt;1つのメソッド、関数にライフタイム注釈が大量に出てくるような書き方をした場合は設計がおかしいのでは?って考えたほうがいいのかも?&lt;/li&gt;
&lt;li&gt;ジェネリックな型とライフタイム引数の順序を入れ替えてみても動くだろ?とおもって入れ替えてみたら怒られた。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;あとは、構造体+ジェネリックが絡んできたら少しこんがらがってきそうっという感じです。
まぁ、これから先は実際に書いてみないことにはわからないんだろうなと。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;読みました。
実際にはプログラムを書きながら慣れていく感じだろうなぁと。
まだまだ、あれ?ジェネリックってどう書くんだっけ?とか、ライフタイム注釈どうやって付けて、使うときはどうすんだ?みたいになりながら、
出てくるサンプルを少し変えてみてはどうやって動くんだろうこの場合?みたいなことをやってました。
次は、11章、12章を少しだけ自習しつつ、13章に入る予定です(知り合いと一緒に読みすすめてる)。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Azure Cognitive Searchのリクエストのロギング</title>
      <link>https://blog.johtani.info/blog/2020/05/26/logging-azure-search-request/</link>
      <pubDate>Tue, 26 May 2020 17:22:47 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/05/26/logging-azure-search-request/</guid>
      <description>&lt;p&gt;今回はAzure Cognitive SearchのSDKを利用したアプリケーションが、実際にAzure Cognitive Searchに対して送信しているリクエストのパラメータとボディをログに保存する方法について紹介します。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今回はAzure Cognitive SearchのSDKを利用したアプリケーションが、実際にAzure Cognitive Searchに対して送信しているリクエストのパラメータとボディをログに保存する方法について紹介します。&lt;/p&gt;
&lt;h2 id=&#34;動機&#34;&gt;動機&lt;/h2&gt;
&lt;p&gt;アプリケーションでリクエストを組み立てて、SDK経由で送信していると、最終的にAzure Cognitive Searchに対して送信されているリクエストのパラメータや検索条件などをひと目で見たいことがあります。
アプリケーションでは、ソート条件や、クエリ文字列の組み立てなどの処理は異なる場所で行われたりしますので。&lt;/p&gt;
&lt;p&gt;また、公式リファレンスでは、機能の説明はRest APIの使い方と組み合わせで説明されることが多いです。&lt;/p&gt;
&lt;p&gt;ということで、SDKを利用しているアプリからAzure Searchへ送信されているリクエストをログに保存する方法を調べてみました。&lt;/p&gt;
&lt;h2 id=&#34;方法&#34;&gt;方法&lt;/h2&gt;
&lt;p&gt;調べてみるといくつかの手段を取ることができそうだとわかりました。実際に調べて実装する方法を4種類ほど試してみたのでブログに残しておきます。なお、2020年4月時点でのSDKとAzureの仕組みに基づいたブログになります。最新版ではお手軽な方法があるかもしれません。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;DelegatingHandlerを利用する&lt;/li&gt;
&lt;li&gt;ServiceClientTracingの機能を利用する&lt;/li&gt;
&lt;li&gt;Azure Application Insightsを活用する&lt;/li&gt;
&lt;li&gt;Azure Cognitive Searchのコンソールにある診断情報の機能を利用する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;1、2はAzure Cognitive SearchのSDKのリファレンスから当たりを付けて見つけた方法です。
3はApplication Insights、4はAzure Cognitive Searchの機能になります。
これらの方法について個別に説明していきます。&lt;/p&gt;
&lt;h3 id=&#34;1-delegatinghandleを利用する&#34;&gt;1. DelegatingHandleを利用する&lt;/h3&gt;
&lt;p&gt;まずは、SDKでロギングの機能がないかを調べて見つけた機能がこちらです。
SDKの&lt;a href=&#34;https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.azure.search.searchserviceclient.-ctor?view=azure-dotnet#Microsoft_Azure_Search_SearchServiceClient__ctor_System_String_Microsoft_Azure_Search_SearchCredentials_System_Net_Http_HttpClientHandler_System_Net_Http_DelegatingHandler___&#34;&gt;SearchServiceClient&lt;/a&gt;のコンストラクタの引数に&lt;a href=&#34;https://docs.microsoft.com/en-us/dotnet/api/system.net.http.delegatinghandler?view=netframework-4.8&#34;&gt;DelegatingHandler&lt;/a&gt;というものが渡せることを発見しました。&lt;/p&gt;
&lt;p&gt;これは、.NET FrameworkのHttpのAPIに存在するクラスで、HTTPのクライアントがHTTPの送受信時に、処理を挟むことができる機能です。フレームワーク側で、&lt;a href=&#34;https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.http.logging.logginghttpmessagehandler?view=dotnet-plat-ext-3.1&amp;amp;viewFallbackFrom=netframework-4.8&#34;&gt;LoggingHttpMessaggeHandler&lt;/a&gt;というクラスを用意してくれていましたが、残念ながらこちらは、リクエストとレスポンスのヘッダのみをロギングするクラスでした。
ということで、リクエストボディをログに出力したい場合は独自に拡張してやる必要があります。なお、ロギングには&lt;code&gt;Microsoft.Extensions.Logging&lt;/code&gt;の&lt;code&gt;ILogger&lt;/code&gt;を使用します。&lt;/p&gt;
&lt;p&gt;また、Azure Cognitive SearchのSDK側に違う問題点もありました。&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/tutorial-csharp-create-first-app#add-the-runqueryasync-method&#34;&gt;チュートリアルにあるように&lt;/a&gt;、検索するときには、SDKは次のような使い方を想定しています。&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-C#&#34; data-lang=&#34;C#&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Create a service and index client.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        _serviceClient = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; SearchServiceClient(searchServiceName, &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; SearchCredentials(queryApiKey));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        _indexClient = _serviceClient.Indexes.GetClient(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;hotels&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;GetClient(インデックス名)&lt;/code&gt;というメソッドを使用します。この&lt;a href=&#34;https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.azure.search.indexesgetclientextensions.getclient?view=azure-dotnet#Microsoft_Azure_Search_IndexesGetClientExtensions_GetClient_Microsoft_Azure_Search_IIndexesOperations_System_String_&#34;&gt;&lt;code&gt;GetClient&lt;/code&gt;メソッドのバリエーション&lt;/a&gt;として、DelegatingHandlerを受け取るメソッドがないのです。。。&lt;/p&gt;
&lt;p&gt;ということで、DelegationHandlerを活用する方法としては、以下の2つを実装する必要があります。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;CustomなLoggingHttpMessageHandlerクラスを実装&lt;/li&gt;
&lt;li&gt;GetClientと同等の処理をDelegatingHandlerを引数にしたものを実装する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以上の2つを実装し、アプリケーション側から2で作成したGetClientを呼び出すことで、リクエストをボディも含めてログ出力することが可能になります。以下は実装例です。&lt;/p&gt;
&lt;p&gt;CustomHttpMessageHandlerクラス。&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-C#&#34; data-lang=&#34;C#&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;using&lt;/span&gt; System;
&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;using&lt;/span&gt; System.Collections.Generic;
&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;using&lt;/span&gt; System.Diagnostics;
&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;using&lt;/span&gt; System.Net.Http;
&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;using&lt;/span&gt; System.Net.Http.Headers;
&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;using&lt;/span&gt; System.Text;
&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;using&lt;/span&gt; System.Threading;
&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;using&lt;/span&gt; System.Threading.Tasks;
&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;using&lt;/span&gt; Microsoft.Extensions.Logging;
&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;namespace&lt;/span&gt; AzureSearchSample
&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;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;CustomLoggingHttpMessageHandler&lt;/span&gt; : DelegatingHandler
&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;readonly&lt;/span&gt; ILogger _logger;
&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;readonly&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&lt;/span&gt; _logContent = &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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;public&lt;/span&gt; CustomLoggingHttpMessageHandler(ILogger logger, &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&lt;/span&gt; logContent)
&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;if&lt;/span&gt; (logger == &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;throw&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; ArgumentNullException(nameof(logger));
&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;this&lt;/span&gt;._logger = logger;
&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;this&lt;/span&gt;._logContent = logContent;
&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;protected&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;override&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; Task&amp;lt;HttpResponseMessage&amp;gt; SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
&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;if&lt;/span&gt; (request == &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;throw&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; ArgumentNullException(nameof(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:#66d9ef&#34;&gt;await&lt;/span&gt; Log.RequestStart(&lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;._logger, request, &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;._logContent);
&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;var&lt;/span&gt; stopwatch = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Stopwatch();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            HttpResponseMessage response = &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;base&lt;/span&gt;.SendAsync(request, cancellationToken).ConfigureAwait(&lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            stopwatch.Stop();
&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;await&lt;/span&gt; Log.RequestEnd(&lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;._logger, response, stopwatch.Elapsed);
&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;return&lt;/span&gt; response;
&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;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Log&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;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;EventIds&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;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;readonly&lt;/span&gt; EventId RequestStart = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; EventId(&lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;RequestStart&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:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;readonly&lt;/span&gt; EventId RequestEnd = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; EventId(&lt;span style=&#34;color:#ae81ff&#34;&gt;101&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;RequestEnd&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;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;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; Task RequestStart(ILogger logger, HttpRequestMessage request, &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&lt;/span&gt; logContent)
&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;                StringBuilder message = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; StringBuilder();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                message.AppendLine(&lt;span style=&#34;color:#e6db74&#34;&gt;$&amp;#34;Sending HTTP request {request.Method} {request.RequestUri}&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:#66d9ef&#34;&gt;if&lt;/span&gt; (logger.IsEnabled(LogLevel.Trace))
&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;                    LogHttpHeaders(message, request.Headers);
&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;await&lt;/span&gt; LogHttpContent(message, request.Content, logContent);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    logger.Log(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        LogLevel.Trace,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        EventIds.RequestStart,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        message,
&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;null&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        (state, ex) =&amp;gt; state.ToString());
&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;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; Task RequestEnd(ILogger logger, HttpResponseMessage response, TimeSpan duration)
&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;                StringBuilder message = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; StringBuilder();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                message.AppendLine(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#e6db74&#34;&gt;$&amp;#34;Recieving HTTP response after {duration.TotalMilliseconds}ms - {response.StatusCode}&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:#66d9ef&#34;&gt;if&lt;/span&gt; (logger.IsEnabled(LogLevel.Trace))
&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;                    LogHttpHeaders(message, response.Headers);
&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;await&lt;/span&gt; LogHttpContent(message, response.Content, &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    logger.Log(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        LogLevel.Trace,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        EventIds.RequestEnd,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        message,
&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;null&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        (state, ex) =&amp;gt; state.ToString()
&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&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;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; LogHttpHeaders(StringBuilder message, HttpHeaders headers)
&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;if&lt;/span&gt; (headers == &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; ArgumentNullException(nameof(headers));
&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;foreach&lt;/span&gt; (KeyValuePair&amp;lt;&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;, IEnumerable&amp;lt;&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;&amp;gt;&amp;gt; header &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; headers)
&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;foreach&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; header.Value)
&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;                        message.AppendLine(&lt;span style=&#34;color:#e6db74&#34;&gt;$&amp;#34;{header.Key}: {value}&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;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;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; Task LogHttpContent(StringBuilder message, HttpContent content,
&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;bool&lt;/span&gt; logContent)
&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;if&lt;/span&gt; (content != &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;foreach&lt;/span&gt; (KeyValuePair&amp;lt;&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;,IEnumerable&amp;lt;&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;&amp;gt;&amp;gt; header &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; content.Headers)
&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;foreach&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; header.Value)
&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;                            message.AppendLine(&lt;span style=&#34;color:#e6db74&#34;&gt;$&amp;#34;{header.Key}: {value}&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;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;if&lt;/span&gt; (logContent)
&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;string&lt;/span&gt; contentBody = &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; content.ReadAsStringAsync();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        message.AppendLine(contentBody);
&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&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;GetClientの実装&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-C#&#34; data-lang=&#34;C#&#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:#66d9ef&#34;&gt;private&lt;/span&gt; ISearchIndexClient GetClient(&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; indexName, &lt;span style=&#34;color:#66d9ef&#34;&gt;params&lt;/span&gt; DelegatingHandler[] handlers)
&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;var&lt;/span&gt; rootHandler = _searchServiceClient.HttpMessageHandlers.OfType&amp;lt;HttpClientHandler&amp;gt;().SingleOrDefault();
&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;var&lt;/span&gt; indexClient =
&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;new&lt;/span&gt; SearchIndexClient(_searchServiceClient.SearchServiceName, indexName,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    _searchServiceClient.SearchCredentials, rootHandler, handlers)
&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;                    SearchDnsSuffix = _searchServiceClient.SearchDnsSuffix
&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;            indexClient.HttpClient.Timeout = _searchServiceClient.HttpClient.Timeout;
&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;return&lt;/span&gt; indexClient;
&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;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;2020/04/14 19:17:53.591|TRACE|Sending HTTP request POST https://サービス名.search.windows.net/indexes(&amp;#39;インデックス名&amp;#39;)/docs/search.post.search?api-version=2019-05-06
client-request-id: be02140f-3a07-48cc-b018-d8aa5e819bc3
Accept-Language: en-US
Accept: application/json; odata.metadata=none
api-key: APIキー
User-Agent: FxVersion/4.700.20.11803
User-Agent: OSName/MacOs
User-Agent: OSVersion/Darwin.19.4.0.Darwin.Kernel.Version.19.4.0.Wed.Mar.4.22.28.40.PST.2020.root.xnu.6153.101.6.15RELEASE.X86.64
User-Agent: Microsoft.Azure.Search.SearchIndexClient/10.100.19.52907
Content-Type: application/json; charset=utf-8
{
  &amp;#34;count&amp;#34;: false,
  &amp;#34;facets&amp;#34;: [],
  &amp;#34;queryType&amp;#34;: &amp;#34;simple&amp;#34;,
  &amp;#34;scoringParameters&amp;#34;: [],
  &amp;#34;search&amp;#34;: &amp;#34;azure&amp;#34;,
  &amp;#34;searchMode&amp;#34;: &amp;#34;any&amp;#34;
}
 |AzureSearchSample.SearchService|EventId_Id=100, EventId_Name=RequestStart, EventId=RequestStart
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;メリットデメリット&#34;&gt;メリット、デメリット&lt;/h4&gt;
&lt;p&gt;Azure Cognitive Searchの検索の処理だけを対象にリクエストのログを出力することが可能です。また、影響範囲はアプリケーションだけに閉じていますので、デバッグ目的などでログ出力したい場合に、自分だけの手元でログの確認が可能になります。&lt;/p&gt;
&lt;p&gt;デメリットとしては、独自に実装しなければいけない範囲が広いことです。&lt;/p&gt;
&lt;h3 id=&#34;2-serviceclienttracingの機能を利用する&#34;&gt;2. ServiceClientTracingの機能を利用する&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Microsoft.Rest.ClientRuntime&lt;/code&gt;というライブラリをAzure Cognitive Searchは利用しています。
このライブラリに&lt;a href=&#34;https://docs.microsoft.com/en-us/dotnet/api/microsoft.rest.serviceclienttracing?view=azure-dotnet&#34;&gt;&lt;code&gt;ServiceClientTracing&lt;/code&gt;&lt;/a&gt;というクラスが存在します。
なにやら、クライアントの処理のトレースができそうです。&lt;/p&gt;
&lt;p&gt;Azure Cognitive SearchのSDKの実装がGitHubに公開されており、検索リクエストの処理を投げる直前に、このトレースの仕組がONになっていると、&lt;a href=&#34;https://github.com/Azure/azure-sdk-for-net/blob/a080ceda8df5e397aadd4b7c48c83431c5203b59/sdk/search/Microsoft.Azure.Search.Data/src/Generated/DocumentsOperations.cs#L798&#34;&gt;&lt;code&gt;ServiceClientTracing.SendRequest&lt;/code&gt;メソッドを呼び出していました&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;実際に&lt;code&gt;SendRequest&lt;/code&gt;メソッドに送られたものに対して何かしらの処理を行うのは、&lt;a href=&#34;https://docs.microsoft.com/en-us/dotnet/api/microsoft.rest.iserviceclienttracinginterceptor?view=azure-dotnet&#34;&gt;&lt;code&gt;IServiceClientTracingIntercepter&lt;/code&gt;&lt;/a&gt;インターフェースを実装したクラスになります。
このインターフェースの実装が&lt;a href=&#34;https://www.nuget.org/packages/Microsoft.Rest.ClientRuntime.Log4Net/&#34;&gt;Log4Net&lt;/a&gt;に存在します。Log4Netを利用している場合は、これを活用すれば楽ができます。&lt;/p&gt;
&lt;p&gt;実際に&lt;code&gt;ServiceClientTracing&lt;/code&gt;を有効にするには、以下の2行を呼び出すだけです。&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-C#&#34; data-lang=&#34;C#&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ServiceClientTracing.IsEnabled = &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ServiceClientTracing.AddTracingInterceptor(&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Log4NetTracingInterceptor());
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あとは、Rest.ClientRuntimeがよしなにやってくれます。
1とは異なり、トレースログなので、リクエストのボディについても出力してくれます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;2020-05-26 19:09:04,058 [1] DEBUG Microsoft.Rest.Tracing.Log4Net.Log4NetTracingInterceptor [(null)] - invocationId: 1
instance: Microsoft.Azure.Search.DocumentsProxyOperations
method: SearchPost
parameters: {searchRequest=Microsoft.Azure.Search.Models.SearchRequest,clientRequestId=,cancellationToken=System.Threading.CancellationToken}
2020-05-26 19:09:04,164 [1] DEBUG Microsoft.Rest.Tracing.Log4Net.Log4NetTracingInterceptor [(null)] - invocationId: 1
request: Method: POST, RequestUri: &amp;#39;https://サービス名.search.windows.net/indexes(&amp;#39;インデックス名&amp;#39;)/docs/search.post.search?api-version=2019-05-06&amp;#39;, Version: 2.0, Content: System.Net.Http.StringContent, Headers:
{
  client-request-id: 591cb14f-e5c2-4a85-977d-01d1f6431ddc
  Accept-Language: en-US
  Accept: application/json; odata.metadata=none
  api-key: APIキー
  Content-Type: application/json; charset=utf-8
}

Body:
{
{
  &amp;#34;count&amp;#34;: false,
  &amp;#34;facets&amp;#34;: [],
  &amp;#34;queryType&amp;#34;: &amp;#34;simple&amp;#34;,
  &amp;#34;scoringParameters&amp;#34;: [],
  &amp;#34;search&amp;#34;: &amp;#34;azure&amp;#34;,
  &amp;#34;searchMode&amp;#34;: &amp;#34;any&amp;#34;
}
}

2020-05-26 19:09:04,459 [Thread Pool Worker] DEBUG Microsoft.Rest.Tracing.Log4Net.Log4NetTracingInterceptor [(null)] - invocationId: 1
response: StatusCode: 200, ReasonPhrase: &amp;#39;OK&amp;#39;, Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Cache-Control: no-cache
  Pragma: no-cache
  request-id: 591cb14f-e5c2-4a85-977d-01d1f6431ddc
  elapsed-time: 72
  OData-Version: 4.0
  Preference-Applied: odata.include-annotations=&amp;#34;*&amp;#34;
  Strict-Transport-Security: max-age=15724800; includeSubDomains
  Date: Tue, 26 May 2020 10:09:04 GMT
  Content-Type: application/json; odata.metadata=none
  Expires: -1
  Content-Length: 376
}
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;メリットデメリット-1&#34;&gt;メリット、デメリット&lt;/h4&gt;
&lt;p&gt;Log4Netを利用しているアプリの場合、2行だけを追加することで実装が完了するのがお手軽な点です。&lt;/p&gt;
&lt;p&gt;難点としては、Rest Client全てにたいしてトレース処理が入ってしまうので、Azure Cognitive Search以外にもRestクライアントを利用しているものが存在した場合、ログの量が増えてしまいます。また、検索以外の処理でもトレースされてしまうのもデメリットになります。&lt;/p&gt;
&lt;p&gt;Log4Net以外のログ機構を使用している場合は、自分で&lt;code&gt;IServiceClientTracingInterceptor&lt;/code&gt;を実装する必要も出てきます(&lt;a href=&#34;https://stackoverflow.com/questions/46943669/microsoft-rest-serviceclienttracing-how-to-output-tracing-results-to-console-o&#34;&gt;参考:StackOverflow&lt;/a&gt;)。&lt;/p&gt;
&lt;h3 id=&#34;3-azure-application-insightsを活用する&#34;&gt;3. Azure Application Insightsを活用する&lt;/h3&gt;
&lt;p&gt;ここから紹介する3と4については、ログの出力先がAzure上になります。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/azure-monitor/app/app-insights-overview&#34;&gt;AzureのApplication Insights&lt;/a&gt;を利用する方法です。
Azure?.NET?のアプリケーションパフォーマンスモニタリングのサービスです。&lt;/p&gt;
&lt;p&gt;Application Insightsを自分のアプリケーションに設定することで、アプリケーションのパフォーマンス監視に関する情報がAzure上のApplication Insightsリソースに送信されるようになります。&lt;/p&gt;
&lt;p&gt;ただ、Application Insightsのデフォルトの機能では、URL程度の情報だけが送信されます(&lt;a href=&#34;https://blog.shibayan.jp/entry/20190405/1554459340&#34;&gt;参考:しばやんさんのブログ&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;こちらも拡張機能が用意されており、ITelemetryInitializerのインターフェースを実装したクラスを用意することで、独自の情報をApplication Insightsに出力することが可能となります。詳細については&lt;a href=&#34;https://blog.shibayan.jp/entry/20190405/1554459340&#34;&gt;しばやんさんのブログ&lt;/a&gt;を参考にしてもらうのが良いかと。&lt;/p&gt;
&lt;p&gt;Httpリクエストを出力する実装例は次のとおりです。ただ、ちょっとうまく行かないパターンがあったので、コメントアウトとして残してあったりします(なんでだろう?)&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-C#&#34; data-lang=&#34;C#&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;using&lt;/span&gt; System.Collections.Generic;
&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;using&lt;/span&gt; System.Net.Http;
&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;using&lt;/span&gt; System.Net.Http.Headers;
&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;using&lt;/span&gt; Microsoft.ApplicationInsights.Channel;
&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;using&lt;/span&gt; Microsoft.ApplicationInsights.DataContracts;
&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;using&lt;/span&gt; Microsoft.ApplicationInsights.Extensibility;
&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;namespace&lt;/span&gt; AzureSearchWebSample.ApplicationInsights
&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;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;HttpRequestInitializer&lt;/span&gt; : ITelemetryInitializer
&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;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; Initialize(ITelemetry telemetry)
&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;if&lt;/span&gt; (!(telemetry &lt;span style=&#34;color:#66d9ef&#34;&gt;is&lt;/span&gt; DependencyTelemetry dependency))
&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;return&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;            HttpRequestMessage requestMessage = &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            HttpRequestHeaders requestHeaders;
&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;if&lt;/span&gt; (dependency.TryGetOperationDetail(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;HttpRequest&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;out&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; details) &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                details &lt;span style=&#34;color:#66d9ef&#34;&gt;is&lt;/span&gt; HttpRequestMessage 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;                requestMessage = request;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                requestHeaders = request.Headers;            
&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;if&lt;/span&gt; (requestMessage.Method == HttpMethod.Post)
&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;string&lt;/span&gt; contentBody = requestMessage.Content.ReadAsStringAsync().GetAwaiter().GetResult();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    dependency.Properties.Add(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;RequestBody&amp;#34;&lt;/span&gt;,contentBody);
&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;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (dependency.TryGetOperationDetail(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;HttpRequestHeaders&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;out&lt;/span&gt; details) &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     details &lt;span style=&#34;color:#66d9ef&#34;&gt;is&lt;/span&gt; HttpRequestHeaders headers)
&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;                requestHeaders = headers;
&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;else&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;return&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;foreach&lt;/span&gt; (KeyValuePair&amp;lt;&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;,IEnumerable&amp;lt;&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;&amp;gt;&amp;gt; header &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; requestHeaders)
&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;foreach&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; header.Value)
&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;                    dependency.Properties.Add(header.Key, &lt;span style=&#34;color:#66d9ef&#34;&gt;value&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:#75715e&#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;// if (requestMessage != null &amp;amp;&amp;amp; requestMessage.Method == HttpMethod.Post)&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;// {&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;//     string contentBody = requestMessage.Content.ReadAsStringAsync().GetAwaiter().GetResult();&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;//     dependency.Properties.Add(&amp;#34;RequestBody&amp;#34;,contentBody);&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;// }&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;メリットデメリット-2&#34;&gt;メリット、デメリット&lt;/h4&gt;
&lt;p&gt;すでにApplication Insightsを利用している場合はついでに情報が出力されるので便利です。かつ、常にリクエストログを見れるようにしておく場合はとても便利だと思います。&lt;/p&gt;
&lt;p&gt;Application Insightsを利用していない場合は、そこから導入しなければならなくなるので、手間が増えるかもしれないです。&lt;/p&gt;
&lt;h3 id=&#34;4-azure-cognitive-searchのコンソールにある診断情報の機能を利用する&#34;&gt;4. Azure Cognitive Searchのコンソールにある診断情報の機能を利用する。&lt;/h3&gt;
&lt;p&gt;最後は&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/search-monitor-logs&#34;&gt;Azure Cognitive Searchの診断ログ&lt;/a&gt;を有効にする方法です。
ここまで説明してきた方法の中で、一番お手軽な方法です。。。&lt;/p&gt;
&lt;p&gt;これまでは、リクエストボディを出力する方法を考えていましたが、Azure Cognitive Search側の診断ログを有効にすると、リクエストボディで送信したものが、&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/search-monitor-logs#properties-schema&#34;&gt;Azure Cognitive Search側で、クエリパラーメータとして、診断ログに出力&lt;/a&gt;されます(診断ログの&lt;code&gt;Query_s&lt;/code&gt;)。&lt;/p&gt;
&lt;p&gt;あとは、&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/search-monitor-logs#query-log-information&#34;&gt;Azureのコンソール&lt;/a&gt;で当該時間のログを見ればよいだけです。以下は出力されたログの一部です。Description_sにはURLのパスが記載されています。&lt;/p&gt;
&lt;p&gt;診断ログ例(一部)&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Description_s      POST /indexes(&amp;#39;multi-field-test&amp;#39;)/docs/search.post.search
Query_s            ?api-version=2019-05-06&amp;amp;searchMode=Any&amp;amp;search=azure&amp;amp;queryType=Simple&amp;amp;$count=false
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;メリットデメリット-3&#34;&gt;メリット、デメリット&lt;/h4&gt;
&lt;p&gt;アプリケーション側に手を入れる必要がなのでお手軽です。
一度設定しておけばコンソール側でログをいつでも見れるので便利です。&lt;/p&gt;
&lt;p&gt;リクエスト量が多くなってしまうと、ログの量も多くなり、費用がかさむ恐れがあります。また、複数の人が触る環境の場合は自分で送信したリクエストがどれだったのか?といった状況に陥る可能性はあります。&lt;/p&gt;
&lt;h2 id=&#34;その他は&#34;&gt;その他は?&lt;/h2&gt;
&lt;p&gt;Azureに対してではないですが、昔似たようなことをやるときにやっていた方法として、ローカルにプロキシサーバーを起動し、そのプロキシサーバー経由でアプリケーションから、Azureに接続することで、リクエストを保存する方法もあります。
ざんねんながら、未調査ですがアプリなどにはそれほど手を入れる必要はないかと思います。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ちょっと送信リクエストの内容が見てみたいという話でしたが、いろいろな手段が存在しました。
自分の状況、環境に合わせて手段を選択肢てみるのがいいかと思います。
まずは、簡単な診断ログあたりからでしょうか?&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Microsoft Build(2020)のAzure Cognirive Searchのセッションを見たのでメモ</title>
      <link>https://blog.johtani.info/blog/2020/05/22/watching-azure-cognirive-search-session-at-ms-build/</link>
      <pubDate>Fri, 22 May 2020 12:10:41 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/05/22/watching-azure-cognirive-search-session-at-ms-build/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://mybuild.microsoft.com/&#34;&gt;Mircosoft Buildというイベント&lt;/a&gt;が今週ありました(MSの方やお客さんに教えてもらった)。&lt;/p&gt;
&lt;p&gt;そこで、Azure Cognitive Searchのセッション(&lt;a href=&#34;https://mybuild.microsoft.com/sessions/391f3d09-50b4-476a-9acf-4fd2d4927a9e&#34;&gt;MyBuild - Cognitive Search： The pocket-knife for knowledge mining&lt;/a&gt;)があったので、見てみました。
内容がどんなものかをメモっておきます。
最初はCognitive Searchがどんなものよという説明でした。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://mybuild.microsoft.com/&#34;&gt;Mircosoft Buildというイベント&lt;/a&gt;が今週ありました(MSの方やお客さんに教えてもらった)。&lt;/p&gt;
&lt;p&gt;そこで、Azure Cognitive Searchのセッション(&lt;a href=&#34;https://mybuild.microsoft.com/sessions/391f3d09-50b4-476a-9acf-4fd2d4927a9e&#34;&gt;MyBuild - Cognitive Search： The pocket-knife for knowledge mining&lt;/a&gt;)があったので、見てみました。
内容がどんなものかをメモっておきます。
最初はCognitive Searchがどんなものよという説明でした。&lt;/p&gt;
&lt;h2 id=&#34;ビルトインスキルの拡充の話&#34;&gt;ビルトインスキルの拡充の話&lt;/h2&gt;
&lt;p&gt;データソースからデータを取り出し、エンリッチし、検索エンジンに保存するという、&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/cognitive-search-concept-intro&#34;&gt;パイプラインが組めるようになっています&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;このパイプラインで利用できる処理のことがスキルと呼ばれています。ここで利用できる&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/cognitive-search-predefined-skills&#34;&gt;ビルトインスキル&lt;/a&gt;が拡充されますよという話でした。ちょっとだけ抜き出すと以下のとおりです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Azure Machine Learning&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/cognitive-search-skill-text-translation&#34;&gt;Text translation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Brand detection&lt;/li&gt;
&lt;li&gt;Object detection&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/cognitive-search-predefined-skills&#34;&gt;スキルのリファレンス&lt;/a&gt;には載ってるものと載ってないものがあるので、今後追加されてくのかな?
Brand detectionがどんなものなんだろう?ってのがちょっと気になりました。どっかにデモとかあるかなぁ?&lt;/p&gt;
&lt;h2 id=&#34;スキルセットのための新機能--debug-sessionのデモ&#34;&gt;スキルセットのための新機能 : Debug Sessionのデモ&lt;/h2&gt;
&lt;p&gt;上記のスキルを組み合わせてパイプラインを組んで、データソースから取り出したデータをエンリッチしてから、検索エンジンに入れる処理をかけるのですが、その処理のデバッグ用に新しいGUIの機能が追加されてますよという紹介とデモでした。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.microsoft.com/en-us/azure/search/cognitive-search-tutorial-debug-sessions#start-your-debug-session&#34;&gt;Tutorial： Use Debug sessions to diagnose, fix, and commit changes to your skillset - Azure Cognitive Search | Microsoft Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;manage-identityの話&#34;&gt;Manage Identityの話&lt;/h2&gt;
&lt;p&gt;Azure Cognitive Searchにデータを登録するパイプランの最初の段階で、各種データソースにアクセスが必要です。
このアクセス時にコネクションの設定にアカウントキーなども含めてましたが、これをコネクション設定ではなく、専用の管理機能が用意されましたよという話でした。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.microsoft.com/en-us/azure/search/search-howto-managed-identities-data-sources&#34;&gt;Set up a connection to a data source using a managed identity (preview) - Azure Cognitive Search | Microsoft Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;qa&#34;&gt;QA&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Similarityとかの話
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/index-similarity-and-scoring#similarity-ranking-algorithms&#34;&gt;BM25になってるよ&lt;/a&gt;とか&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SDKの話とか&lt;/li&gt;
&lt;li&gt;ほかにRelevancyの話
&lt;ul&gt;
&lt;li&gt;Analyzerをデフォルトのままじゃなくてちゃんと考えて使いましょう(例:&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/index-add-language-analyzers#language-analyzer-list&#34;&gt;各言語用のAnalyzerがいっぱいあるよ&lt;/a&gt;とか)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こんな感じでした。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elastic Stack 7.7がリリースされた</title>
      <link>https://blog.johtani.info/blog/2020/05/15/elastic-stack-7_7/</link>
      <pubDate>Fri, 15 May 2020 11:17:17 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/05/15/elastic-stack-7_7/</guid>
      <description>&lt;p&gt;ElasticのWorkplace Searchを触ってみています(&lt;a href=&#34;https://blog.johtani.info/blog/2020/05/01/intro-workplace-search/&#34;&gt;その1&lt;/a&gt;、&lt;a href=&#34;https://blog.johtani.info/blog/2020/05/07/install-workplace-search/&#34;&gt;その2&lt;/a&gt;)が、Elastic Stackの7.7.0がリリースされてしまいました。&lt;/p&gt;
&lt;p&gt;簡単ですが、リリースブログを見ながら気になった点をメモしとこうかと。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ElasticのWorkplace Searchを触ってみています(&lt;a href=&#34;https://blog.johtani.info/blog/2020/05/01/intro-workplace-search/&#34;&gt;その1&lt;/a&gt;、&lt;a href=&#34;https://blog.johtani.info/blog/2020/05/07/install-workplace-search/&#34;&gt;その2&lt;/a&gt;)が、Elastic Stackの7.7.0がリリースされてしまいました。&lt;/p&gt;
&lt;p&gt;簡単ですが、リリースブログを見ながら気になった点をメモしとこうかと。&lt;/p&gt;
&lt;h2 id=&#34;本家のリリースブログ&#34;&gt;本家のリリースブログ&lt;/h2&gt;
&lt;p&gt;いっぱいあるんですよ、これが。まぁ、内容かぶってるのもあるんですが。&lt;/p&gt;
&lt;h3 id=&#34;elastic-stack&#34;&gt;Elastic Stack&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/elastic-stack-7-7-0-released&#34;&gt;Elastic Stack 7.7.0をリリース&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-7-7-0-released&#34;&gt;Elasticsearch 7.7.0 released&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/kibana-7-7-0-released&#34;&gt;Kibana 7.7.0 released&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/logstash-7-7-0-released&#34;&gt;Logstash 7.7.0 released&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;enterprise-search系&#34;&gt;Enterprise Search系&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/elastic-enterprise-search-7-7-0-released&#34;&gt;Elastic Enterprise Search 7.7 released, featuring Workplace Search GA | Elastic Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/elastic-app-search-7-7-0-released&#34;&gt;Elastic App Search updates： Scale your way with new configuration options | Elastic Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/elastic-workplace-search-7-7-0-released&#34;&gt;Elastic Workplace Search： 新しい、統合された働き方へ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;observability系&#34;&gt;Observability系&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/blog/elastic-observability-7-7-0-released&#34;&gt;Elastic Observability 7.7 released | Elastic Blog&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/blog/elastic-apm-7-7-0-released&#34;&gt;Elastic APM 7.7.0 released with service maps, async profiler, and more | Elastic Blog&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/blog/elastic-logs-7-7-0-released&#34;&gt;Elastic Logs 7.7.0 released with PCF support, MQTT support, and more | Elastic Blog&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/blog/elastic-metrics-7-7-0-released&#34;&gt;Elastic Metrics 7.7.0 released with enhanced Prometheus integration and PCF support, | Elastic Blog&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/blog/elastic-uptime-monitoring-7-7-0-released&#34;&gt;Elastic Uptime Monitoring 7.7.0 released with alerting, anomaly detection and more | Elastic Blog&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/blog/introducing-the-new-alerting-framework-for-observability-security-and-the-elastic-stack&#34;&gt;New alerting framework released for Observability, Security and the Elastic Stack | Elastic Blog&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/blog/elastic-security-7-7-0-released&#34;&gt;Introducing Elastic Security 7.7.0 | Elastic Blog&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;個人的に気になったもの&#34;&gt;個人的に気になったもの&lt;/h2&gt;
&lt;p&gt;で、全部読んだわけではないのですが、個人的に気になった機能についてメモを残しておきます。
多分に検索によっている可能性がありますが、お気になさらず。
また、ブログとドキュメントを元に気になるところをピックアップしてます。
実際の実装とか動作に関してはまだ未調査の段階です。&lt;/p&gt;
&lt;h3 id=&#34;async-search---elasticsearch&#34;&gt;Async Search - Elasticsearch&lt;/h3&gt;
&lt;p&gt;ElasticsearchのAPIとして非同期に検索できるAPIが実装されました
(&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/7.7/async-search.html&#34;&gt;公式リファレンス&lt;/a&gt;)。
大量データを検索が終了してから検索結果を返すのではなく、クエリは実行しつつわかったところまでは都度取得したいという要望だったり、Coldインデックスのように遅いストレージ上にあるデータへの検索でも少しずつ取得できるようにという具合だと思います。ログとか大量に扱う場合にまぁ、ほしいですよね。今回はEsのリリースがメインで、今後はKibanaなどとの連携だったり色々改善していくよという話みたいです(&lt;a href=&#34;https://www.elastic.co/blog/kibana-7-7-0-released&#34;&gt;Kibanaの一部の機能は利用しているみたい&lt;/a&gt;)。&lt;/p&gt;
&lt;h4 id=&#34;ライセンスとサブスクリプションのレベル&#34;&gt;ライセンスと&lt;a href=&#34;https://www.elastic.co/jp/subscriptions&#34;&gt;サブスクリプションのレベル&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Elastic License&lt;/li&gt;
&lt;li&gt;Basic&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;気になるところと予想とか&#34;&gt;気になるところ(と、予想とか)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;仕組みがどうなっているか?
&lt;ul&gt;
&lt;li&gt;Search APIと同等のリクエストパラメータが使える。が、&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/7.7/async-search.html&#34;&gt;いくつか制約はありそう&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;おそらくTask Manageerで検索してる処理が管理され、レスポンスにはIDが発行されて、そのIDで処理の進み具合を取得する感じ。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Shard単位?Segment単位?
&lt;ul&gt;
&lt;li&gt;内部的にはShard単位で検索処理を扱ってるので、Shard単位がとりあえず楽そう?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Aggsとかも?
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/7.7/async-search.html#get-async-search&#34;&gt;対象の模様&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sortは?
&lt;ul&gt;
&lt;li&gt;有効。ソートのフィールドがインデックス対象だった場合は、そのデータの統計値を使ってShardをソートするっぽい(&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/7.7/async-search.html#submit-async-search&#34;&gt;公式リファレンスのNOTE参照&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;関連しそうなgithubのissuesとか&#34;&gt;関連しそうなGitHubのIssuesとか&lt;/h4&gt;
&lt;p&gt;まだ読んでない&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues/49091&#34;&gt;Async search · Issue #49091 · elastic/elasticsearch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/49471&#34;&gt;Add a listener to track the progress of a search request locally by jimczi · Pull Request #49471 · elastic/elasticsearch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/49092&#34;&gt;Pre-sort shards based on the max/min value of the primary sort field by jimczi · Pull Request #49092 · elastic/elasticsearch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues/55464&#34;&gt;Async search： store intermediate results · Issue #55464 · elastic/elasticsearch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;reduced-consumption-of-heap---elasticsearch&#34;&gt;Reduced consumption of heap - Elasticsearch&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/blog/significantly-decrease-your-elasticsearch-heap-memory-usage&#34;&gt;ヒープの使用量が7.7で減ってるよというブログ&lt;/a&gt;も別途ありました。&lt;/p&gt;
&lt;p&gt;元になっているLuceneの実装に関するIssueが「&lt;a href=&#34;https://issues.apache.org/jira/browse/LUCENE-8635&#34;&gt;［LUCENE-8635］ Lazy loading Lucene FST offheap using mmap - ASF JIRA&lt;/a&gt;」です。ヒープ上に展開していたデータをmmapで扱えるようにすることで、ヒープのメモリを削減してる。&lt;/p&gt;
&lt;p&gt;で関連して、これがLuceneで操作できるようになって(「&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/42838&#34;&gt;Use reader attributes to control term dict memory useage by s1monw · Pull Request #42838 · elastic/elasticsearch&lt;/a&gt;」)、そこからEsに取り込まれたと。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;_id&lt;/code&gt;をoff-heapにする話はここ(&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/52405&#34;&gt;Move the terms index of &lt;code&gt;_id&lt;/code&gt; off-heap. by jpountz · Pull Request #52405 · elastic/elasticsearch&lt;/a&gt;)にあった。&lt;/p&gt;
&lt;p&gt;これに関連して、ヒープサイズの推奨について再考が必要かも?というIssue(&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues/52561&#34;&gt;Reconsider our recommendations for heap size? · Issue #52561 · elastic/elasticsearch&lt;/a&gt;)も上がってる。&lt;/p&gt;
&lt;h3 id=&#34;painless-lab---kibana&#34;&gt;Painless Lab - Kibana&lt;/h3&gt;
&lt;p&gt;ほんとにPain&lt;code&gt;less&lt;/code&gt;?と言う話はさておき、&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/painless/current/painless-execute-api.html&#34;&gt;_script APIでexecute&lt;/a&gt;はできていましたが、やはりもう少し楽に実行したいですよね?ということで画面ができたみたいです。&lt;/p&gt;
&lt;p&gt;シンタックスハイライトとかもできるので、より簡単に使えるようになってますね。
まだ、ベータなので足りないContextとかもあるっぽいけど。&lt;/p&gt;
&lt;h4 id=&#34;ライセンスとサブスクリプションのレベル-1&#34;&gt;ライセンスと&lt;a href=&#34;https://www.elastic.co/jp/subscriptions&#34;&gt;サブスクリプションのレベル&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Elastic License&lt;/li&gt;
&lt;li&gt;Basic?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;まだベータだからか、サブスクリプションのページにはなかった。
&lt;a href=&#34;https://www.elastic.co/guide/en/kibana/7.7/painlesslab.html&#34;&gt;公式ドキュメント&lt;/a&gt;と&lt;a href=&#34;https://github.com/elastic/kibana/tree/master/x-pack/plugins/painless_lab&#34;&gt;GitHubのリポジトリ&lt;/a&gt;から、Elastic Licenseであることは判明。&lt;/p&gt;
&lt;h4 id=&#34;気になるところと予想とか-1&#34;&gt;気になるところ(と、予想とか?)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;制限事項がどんなものか?
&lt;ul&gt;
&lt;li&gt;使えるContextがまだ少ない?まだGAではない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;サジェストがどのくらい効くのか?
&lt;ul&gt;
&lt;li&gt;シンタックスハイライトはあるけど。&lt;a href=&#34;https://github.com/elastic/kibana/issues/59962&#34;&gt;まだかなぁ?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;その他elasticsearch関連&#34;&gt;その他Elasticsearch関連&lt;/h3&gt;
&lt;p&gt;7.7リリースのハイライトが別途用意されています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/7.7/release-highlights-7.7.0.html&#34;&gt;7.7.0 release highlights | Elasticsearch Reference ［7.7］ | Elastic&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こっちで気になるのは、ClassificationとかTransformsあたりかなぁ。ML関連の機能で。&lt;/p&gt;
&lt;h3 id=&#34;workplace-search-ga&#34;&gt;Workplace Search GA&lt;/h3&gt;
&lt;p&gt;これは別のブログに書くかな。&lt;/p&gt;
&lt;h4 id=&#34;気になるところ&#34;&gt;気になるところ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Betaと何が変わったのか?&lt;/li&gt;
&lt;li&gt;APIとかどういう形で提供されるのか?そもそも提供されるのか?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;どんな機能?みたいなのも書く予定です。&lt;/p&gt;
&lt;h3 id=&#34;data-visualizerでfilebeatのconfigをサジェスト---kibana-and-filebeat&#34;&gt;Data VisualizerでFilebeatのConfigをサジェスト - Kibana and Filebeat&lt;/h3&gt;
&lt;p&gt;Kibanaの画面からデータをちょっと?(100MB)だけアップロードして、Elasticsearchにサクッとデータ登録できる機能が実はあります。この機能の拡張として、&lt;a href=&#34;https://www.elastic.co/guide/en/kibana/7.7/release-highlights-7.7.0.html#file-uploader-highlights&#34;&gt;Filebeatの設定だとこんな感じに作れるよ?というのを提示してくれる&lt;/a&gt;ようになったみたいです。
手元にあるファイルを定期的に読み込むときに、設定を書く下地ができるのは便利じゃないかな?&lt;/p&gt;
&lt;h4 id=&#34;ライセンスとサブスクリプションのレベル-2&#34;&gt;ライセンスと&lt;a href=&#34;https://www.elastic.co/jp/subscriptions&#34;&gt;サブスクリプションのレベル&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Elastic License&lt;/li&gt;
&lt;li&gt;Basic&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/importing-csv-and-log-data-into-elasticsearch-with-file-data-visualizer&#34;&gt;Data Visualizerってどんなもの?というのはここにブログ&lt;/a&gt;があります。残念ながらKibanaとかの公式リファレンスには使い方のページがないんだよなぁ。&lt;/p&gt;
&lt;h3 id=&#34;apmのサービスマップ---apm-and-kibana&#34;&gt;APMのサービスマップ - APM and Kibana&lt;/h3&gt;
&lt;p&gt;アプリケーションアーキテクチャのどこでAPMが動作しているか、どこと通信しているかという、APMのエージェントが入っているアプリ間のつながりをKibana上で可視化できる機能っぽいです。まだ、ベータみたいですが、面白そう。&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/azure-monitor/app/app-map?tabs=net&#34;&gt;Azure Application Insightのアプリケーションマップ&lt;/a&gt;に似てる気がします。&lt;/p&gt;
&lt;h4 id=&#34;ライセンスとサブスクリプションのレベル-3&#34;&gt;ライセンスと&lt;a href=&#34;https://www.elastic.co/jp/subscriptions&#34;&gt;サブスクリプションのレベル&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Elastic License&lt;/li&gt;
&lt;li&gt;Platinum&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;気になるところ-1&#34;&gt;気になるところ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;どうやって作ってる(つながりをどうやて判断してる)のか?
&lt;ul&gt;
&lt;li&gt;分散トレーシングのデータを元に誰がどこと通信してるってのは取れるんじゃなかろうか?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;log-categorization-and-contextual-examples---kibana-and-elasticsearch&#34;&gt;Log categorization and contextual examples - Kibana and Elasticsearch&lt;/h3&gt;
&lt;p&gt;7.6から入ってたっぽいですが、&lt;a href=&#34;https://www.elastic.co/blog/elastic-logs-7-6-0-released&#34;&gt;ログの分類&lt;/a&gt;をMLの機能を使ってできるものが、LogsのUIとかでさらに使いやすくなった模様。&lt;/p&gt;
&lt;h4 id=&#34;ライセンスとサブスクリプションのレベル-4&#34;&gt;ライセンスと&lt;a href=&#34;https://www.elastic.co/jp/subscriptions&#34;&gt;サブスクリプションのレベル&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Elastic License&lt;/li&gt;
&lt;li&gt;Platinum&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;気になるところ-2&#34;&gt;気になるところ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;7.6の機能から追いかけないとなぁ。。。
&lt;ul&gt;
&lt;li&gt;似たようなログをカテゴリーごとに分析できるようになるので、プラスMLの仕組みでこれまでとは異なる種類のログが出始めたみたいなことが分析できそう。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;眺めるだけで時間かかりましたが、まぁ、相変わらずいっぱいありますね。
興味のあるところの濃淡が出た感じになりましたが、気になる点をピックアップしてみました。
おかしなところとか、ここはどういう意味?などあればツッコミお願いします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Rust the book - 第9章</title>
      <link>https://blog.johtani.info/blog/2020/05/14/chap9-rust-the-book/</link>
      <pubDate>Thu, 14 May 2020 18:43:26 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/05/14/chap9-rust-the-book/</guid>
      <description>&lt;p&gt;前回の記事はこちら。自分用のメモなので、読みにくいかもです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/23/start-reading-rust-the-book/&#34;&gt;Rust the Bookを読み始めた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/26/chap4-rust-the-book/&#34;&gt;Rust the book - 第4章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/02/chap5-rust-the-book/&#34;&gt;Rust the book - 第5章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/07/chap6-rust-the-book/&#34;&gt;Rust the book - 第6章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/16/chap8-rust-the-book/&#34;&gt;Rust the book - 第8章&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;第9章&#34;&gt;第9章&lt;/h2&gt;
&lt;p&gt;エラー処理です。
NLP100とか、いくつかのプログラムを書いていて、なんとなくは扱っていますが、きちんと勉強しないと。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;前回の記事はこちら。自分用のメモなので、読みにくいかもです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/23/start-reading-rust-the-book/&#34;&gt;Rust the Bookを読み始めた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/26/chap4-rust-the-book/&#34;&gt;Rust the book - 第4章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/02/chap5-rust-the-book/&#34;&gt;Rust the book - 第5章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/07/chap6-rust-the-book/&#34;&gt;Rust the book - 第6章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/16/chap8-rust-the-book/&#34;&gt;Rust the book - 第8章&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;第9章&#34;&gt;第9章&lt;/h2&gt;
&lt;p&gt;エラー処理です。
NLP100とか、いくつかのプログラムを書いていて、なんとなくは扱っていますが、きちんと勉強しないと。&lt;/p&gt;
&lt;p&gt;とりあえず、「Rustには例外は存在しません。」が一番知っておくことかな。&lt;/p&gt;
&lt;h3 id=&#34;panicで回復不能なエラー&#34;&gt;panic!で回復不能なエラー&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;panic!&lt;/code&gt;マクロでスタックを巻き戻して掃除をして終了。
&lt;ul&gt;
&lt;li&gt;異常終了(&lt;code&gt;panic = &#39;abort&#39;&lt;/code&gt;)にもできる。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;「&lt;code&gt;RUST_BACKTRACE&lt;/code&gt;を0以外の変数にセットして実行」
*&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;resultで回復可能なエラー&#34;&gt;Resultで回復可能なエラー&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;expect()&lt;/code&gt;は気持ち悪い名前じゃないかなぁ?&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://doc.rust-jp.rs/book/second-edition/ch09-02-recoverable-errors-with-result.html#a%E3%82%A8%E3%83%A9%E3%83%BC%E3%82%92%E5%A7%94%E8%AD%B2%E3%81%99%E3%82%8B&#34;&gt;ここ&lt;/a&gt;で&lt;code&gt;io::Error&lt;/code&gt;ではないものもエラーが発生する場合には&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;panicすべきかするまいか&#34;&gt;panic!すべきかするまいか&lt;/h3&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;「Rustには例外は存在しない」ので、回復不能か可能かを考えつつ処理を書こうと。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第2章の12から19まで(言語処理100本ノック2020)</title>
      <link>https://blog.johtani.info/blog/2020/05/12/reboot-nlp100-ch02-12to19/</link>
      <pubDate>Tue, 12 May 2020 12:23:29 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/05/12/reboot-nlp100-ch02-12to19/</guid>
      <description>&lt;p&gt;Rustで言語処理100本ノックの第2章の残りです。&lt;/p&gt;
&lt;p&gt;前回は&lt;a href=&#34;https://blog.johtani.info/blog/2020/05/08/rebootnlp100-ch02-10to11&#34;&gt;こちら&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;ちなみに、標準入力から受け取る処理は書いてないです。
出力に関してはファイル分割、保存と支持があるもの以外は文字列として取り出すところで終わっています。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Rustで言語処理100本ノックの第2章の残りです。&lt;/p&gt;
&lt;p&gt;前回は&lt;a href=&#34;https://blog.johtani.info/blog/2020/05/08/rebootnlp100-ch02-10to11&#34;&gt;こちら&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;ちなみに、標準入力から受け取る処理は書いてないです。
出力に関してはファイル分割、保存と支持があるもの以外は文字列として取り出すところで終わっています。&lt;/p&gt;
&lt;h2 id=&#34;12-1列目をcol1txtに2列目をcol2txtに保存&#34;&gt;12. 1列目をcol1.txtに，2列目をcol2.txtに保存&lt;/h2&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;extract_column&lt;/span&gt;(input_file_name: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;, num: &lt;span style=&#34;color:#66d9ef&#34;&gt;usize&lt;/span&gt;, output_file_name: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&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;let&lt;/span&gt; input_f &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; File::open(input_file_name).expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;file not found&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:#66d9ef&#34;&gt;let&lt;/span&gt; read_buf &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; BufReader::new(input_f);
&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;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; output_f &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; OpenOptions::new()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .write(&lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .create(&lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .open(output_file_name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .expect(&lt;span style=&#34;color:#a6e22e&#34;&gt;format!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;can&amp;#39;t open file[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;] with write option&amp;#34;&lt;/span&gt;, output_file_name).as_str());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    read_buf.lines().for_each(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;line&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;match&lt;/span&gt; line {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Ok(line) &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;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;let&lt;/span&gt; columns: Vec&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;_&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; line.split(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\t&amp;#39;&lt;/span&gt;).collect();
&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;writeln!&lt;/span&gt;(output_f, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{}&amp;#34;&lt;/span&gt;, columns[num]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            output_f.flush().expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Error during flush&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Err(_) &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;panic!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;parse error &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;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;13で出力結果を利用するので入力として出力ファイル名も受け取るようにしました。
問題としては、1列目と2列目を別々に出力すればいいので、1回の処理で書いても良かったのですが、1回1ファイルの出力という形で実装しました(効率は悪い)。&lt;/p&gt;
&lt;p&gt;改行コードあたりを考えるのがめんどくさかったので&lt;code&gt;writeln!&lt;/code&gt;マクロでファイルに書き出しています。が、普通に&lt;code&gt;write&lt;/code&gt;メソッドで改行コードを追加しても良かったのかなと。&lt;/p&gt;
&lt;p&gt;あとは、出力先ファイルが存在しない場合だけ&lt;code&gt;open&lt;/code&gt;するように&lt;code&gt;OpenOptions&lt;/code&gt;を利用してみています。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;flush&lt;/code&gt;を呼び出すべきなのかどうか?を調べないとな。。。&lt;/p&gt;
&lt;h2 id=&#34;13-col1txtとcol2txtをマージ&#34;&gt;13. col1.txtとcol2.txtをマージ&lt;/h2&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;merge_files&lt;/span&gt;(col1_file: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;, col2_file: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;, output_file_name: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&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;let&lt;/span&gt; col1_buf &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; BufReader::new(File::open(col1_file).expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;file not found&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:#66d9ef&#34;&gt;let&lt;/span&gt; col2_buf &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; BufReader::new(File::open(col2_file).expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;file not found&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:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; output_f &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; OpenOptions::new()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .write(&lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .create(&lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .open(output_file_name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .expect(&lt;span style=&#34;color:#a6e22e&#34;&gt;format!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;can&amp;#39;t open file[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;] with write option&amp;#34;&lt;/span&gt;, output_file_name).as_str());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    col1_buf
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .lines()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .zip(col2_buf.lines())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .for_each(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;(col1, col2)&lt;span style=&#34;color:#f92672&#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;let&lt;/span&gt; col1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; col1.expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;parse error col1&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:#66d9ef&#34;&gt;let&lt;/span&gt; col2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; col2.expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;parse error col2&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;writeln!&lt;/span&gt;(output_f, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{}&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\t&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&amp;#34;&lt;/span&gt;, col1, col2);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            output_f.flush().expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Error during flush&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;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;2つのファイル名を入力として受け取り、タブでくっつけて出力します。
&lt;code&gt;zip&lt;/code&gt;を利用することで、2つのイテレーターを同時に回しています。&lt;/p&gt;
&lt;h2 id=&#34;14-先頭からn行を出力&#34;&gt;14. 先頭からN行を出力&lt;/h2&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;head&lt;/span&gt;(input_file_name: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;, lines: &lt;span style=&#34;color:#66d9ef&#34;&gt;usize&lt;/span&gt;) -&amp;gt; String {
&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;let&lt;/span&gt; buf &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; BufReader::new(File::open(input_file_name).expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;file not found&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:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; head &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; String::new();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    buf.lines().take(lines).for_each(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;line&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        head.push_str(&lt;span style=&#34;color:#a6e22e&#34;&gt;format!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, line.expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;parse error&amp;#34;&lt;/span&gt;)).as_str());
&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;return&lt;/span&gt; head;
&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;a href=&#34;https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.take&#34;&gt;&lt;code&gt;take&lt;/code&gt;&lt;/a&gt;があります。
これを利用することで、引数に指定した数のエレメントが取得できるので、これでheadが実現できます。&lt;/p&gt;
&lt;h2 id=&#34;15-末尾のn行を出力&#34;&gt;15. 末尾のN行を出力&lt;/h2&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;tail&lt;/span&gt;(input_file_name: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;, lines: &lt;span style=&#34;color:#66d9ef&#34;&gt;usize&lt;/span&gt;) -&amp;gt; String {
&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;let&lt;/span&gt; buf &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; BufReader::new(File::open(input_file_name).expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;file not found&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:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; tail &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; String::new();
&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;let&lt;/span&gt; line_count &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; word_count(input_file_name);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    buf.lines().skip(line_count &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; lines).for_each(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;line&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tail.push_str(&lt;span style=&#34;color:#a6e22e&#34;&gt;format!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, line.expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;parse error&amp;#34;&lt;/span&gt;)).as_str());
&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;return&lt;/span&gt; tail;
&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;tailの場合は少し複雑で、11で作成した行数をカウントするメソッドで総行数を取り出し、そこから引数で指定された行数を引き算した数(=出力しない行数)を、イテレーターの&lt;code&gt;skip&lt;/code&gt;メソッドの引数に渡しています。これにより、指定された数のエレメントをスキップしたあとの処理がかけます。&lt;/p&gt;
&lt;h2 id=&#34;16-ファイルをn分割する&#34;&gt;16. ファイルをN分割する&lt;/h2&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;split_files&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    input_file_name: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    num: &lt;span style=&#34;color:#66d9ef&#34;&gt;usize&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    output_file_prefix: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    output_file_suffix: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&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;let&lt;/span&gt; total &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; word_count(input_file_name) &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;f64&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;let&lt;/span&gt; lines_in_file &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; total &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; num &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;f64&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;let&lt;/span&gt; lines_in_file &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lines_in_file.ceil() &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;usize&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#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;let&lt;/span&gt; buf &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; BufReader::new(File::open(input_file_name).expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;file not found&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; output_files: Vec&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;File&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; create_file_vec(output_file_prefix, num, output_file_suffix);
&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:#a6e22e&#34;&gt;println!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;split file each &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; lines.&amp;#34;&lt;/span&gt;, lines_in_file);
&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;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; lines &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; buf.lines();
&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;for&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; output_f &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; output_files {
&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;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; current &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;while&lt;/span&gt; current &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; lines_in_file &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;let&lt;/span&gt; line &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lines.next();
&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;if&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; Some(line_rs) &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; line {
&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;if&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; Ok(line_str) &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; line_rs {
&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;writeln!&lt;/span&gt;(output_f, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{}&amp;#34;&lt;/span&gt;, line_str);
&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;            current &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; current &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;        output_f.flush().expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;error during flush&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;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;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;create_file_vec&lt;/span&gt;(output_file_prefix: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;, num: &lt;span style=&#34;color:#66d9ef&#34;&gt;usize&lt;/span&gt;, output_file_suffix: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;) -&amp;gt; Vec&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;File&lt;span style=&#34;color:#f92672&#34;&gt;&amp;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;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; files &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Vec::with_capacity(num);
&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;for&lt;/span&gt; i &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;..&lt;/span&gt;num {
&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;let&lt;/span&gt; output_file_name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;format!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}{}{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, output_file_prefix, i &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, output_file_suffix);
&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;let&lt;/span&gt; output_f &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; OpenOptions::new()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .write(&lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .create(&lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .open(output_file_name.as_str())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .expect(&lt;span style=&#34;color:#a6e22e&#34;&gt;format!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;can&amp;#39;t open file[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;] with write option&amp;#34;&lt;/span&gt;, output_file_name).as_str());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        files.push(output_f);
&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;return&lt;/span&gt; files;
&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;p&gt;入力としては、分割するファイル数&lt;code&gt;N&lt;/code&gt;が指定されます。まずは、&lt;code&gt;総行数/N&lt;/code&gt;で各ファイルに保存されるべき行数を計算します。
次に、2つ目の関数をつかって、必要な数のファイルオブジェクトをベクトルとして生成します。&lt;/p&gt;
&lt;p&gt;ファイルオブジェクトのベクトルの要素を元にしたfor文を回しつつ、それぞれのファイルに必要な行数を出力している処理になっています。&lt;/p&gt;
&lt;p&gt;総行数が&lt;code&gt;N&lt;/code&gt;で割り切れない場合に&lt;code&gt;ceil&lt;/code&gt;で切り上げした行数にするというちょっとした処理を入れてあります。&lt;/p&gt;
&lt;h2 id=&#34;17-１列目の文字列の異なり&#34;&gt;17. １列目の文字列の異なり&lt;/h2&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;count_uniq_words&lt;/span&gt;(input_file_name: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;, col: &lt;span style=&#34;color:#66d9ef&#34;&gt;usize&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;usize&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;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; words &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; HashSet::new();
&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;let&lt;/span&gt; buf &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; BufReader::new(File::open(input_file_name).expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;file not found&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    buf.lines().for_each(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;line&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;match&lt;/span&gt; line {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Ok(line_str) &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;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;let&lt;/span&gt; columns: Vec&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;_&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; line_str.split(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\t&amp;#39;&lt;/span&gt;).collect();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            words.insert(columns[col].to_string());
&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;        Err(_) &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;panic!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;parse error &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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; words.len();
&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;HashSet&lt;/code&gt;を利用することでユニーク性を担保して、最後はHashSetの数を数え上げれば終了です。&lt;/p&gt;
&lt;h2 id=&#34;18-各行を3コラム目の数値の降順にソート&#34;&gt;18. 各行を3コラム目の数値の降順にソート&lt;/h2&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sort_on_col3&lt;/span&gt;(input_file_name: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;) -&amp;gt; String {
&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;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; lines: &lt;span style=&#34;color:#a6e22e&#34;&gt;BTreeSet&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Line&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; BTreeSet::new();
&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;let&lt;/span&gt; buf &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; BufReader::new(File::open(input_file_name).expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;file not found&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    buf.lines().for_each(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;line&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;match&lt;/span&gt; line {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Ok(line_str) &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;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;let&lt;/span&gt; columns: Vec&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;_&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; line_str.split(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\t&amp;#39;&lt;/span&gt;).collect();
&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;let&lt;/span&gt; num: &lt;span style=&#34;color:#66d9ef&#34;&gt;u32&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; columns[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;].parse().expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;parse error&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:#66d9ef&#34;&gt;let&lt;/span&gt; line &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Line {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                line: &lt;span style=&#34;color:#a6e22e&#34;&gt;line_str&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                num,
&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;            lines.insert(line);
&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;        Err(_) &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;panic!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;parse error&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; sorted &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; String::new();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lines.iter().for_each(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;line&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        sorted.push_str(&lt;span style=&#34;color:#a6e22e&#34;&gt;format!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, line.line).as_str());
&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;return&lt;/span&gt; sorted;
&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:#75715e&#34;&gt;#[derive(Eq)]&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;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Line&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    line: String,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    num: &lt;span style=&#34;color:#66d9ef&#34;&gt;u32&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;impl&lt;/span&gt; Ord &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; Line {
&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;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cmp&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self, other: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Self&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Ordering&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;let&lt;/span&gt; ord &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; other.num.cmp(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self.num);
&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;if&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; Ordering::Equal &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ord {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            other.line.cmp(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self.line)
&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;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ord
&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;impl&lt;/span&gt; PartialOrd &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; Line {
&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;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;partial_cmp&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self, other: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Self&lt;/span&gt;) -&amp;gt; Option&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Ordering&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Some(self.cmp(other))
&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;impl&lt;/span&gt; PartialEq &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; Line {
&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;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;eq&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self, other: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Self&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self.eq(other)
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Line&lt;/code&gt;という、行の文章と第3カラム目の値をもった構造体を作成しました。そこにEq、Ord、PartialOrd、PartialEqを実装し、3カラム目での大小比較できるようにしました。
この構造体をBTeeSetに格納していき、イテレーターで回すことで、ソートされた状態にしてあります。
同一数値の場合は行の降順でソートできるようにOrdを実装してあります。&lt;/p&gt;
&lt;h2 id=&#34;19-各行の1コラム目の文字列の出現頻度を求め出現頻度の高い順に並べる&#34;&gt;19. 各行の1コラム目の文字列の出現頻度を求め，出現頻度の高い順に並べる&lt;/h2&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sort_on_frequency&lt;/span&gt;(input_file_name: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;) -&amp;gt; String {
&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;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; names: &lt;span style=&#34;color:#a6e22e&#34;&gt;HashMap&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String, &lt;span style=&#34;color:#66d9ef&#34;&gt;u32&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; HashMap::new();
&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;let&lt;/span&gt; buf &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; BufReader::new(File::open(input_file_name).expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;file not found&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    buf.lines().for_each(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;line&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;match&lt;/span&gt; line {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Ok(line_str) &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;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;let&lt;/span&gt; columns: Vec&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;_&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; line_str.split(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\t&amp;#39;&lt;/span&gt;).collect();
&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;let&lt;/span&gt; name_str &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; columns[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;].to_string();
&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;let&lt;/span&gt; count &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; names.entry(name_str).or_insert(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;*&lt;/span&gt;count &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;        Err(_) &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;panic!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;parse error&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; sorted &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; String::new();
&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;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; sorted_names: Vec&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;String, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;u32&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; names.iter().collect();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sorted_names.sort_by(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;(aname, acount), (bname, bcount)&lt;span style=&#34;color:#f92672&#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;let&lt;/span&gt; ord &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; bcount.cmp(acount);
&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;if&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; Ordering::Equal &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ord {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            bname.cmp(aname)
&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;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ord
&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;    sorted_names.iter().for_each(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;(name, count)&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        sorted.push_str(&lt;span style=&#34;color:#a6e22e&#34;&gt;format!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, count, name).as_str());
&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;return&lt;/span&gt; sorted;
&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;もうすこしうまくできる気がしますが、いったんこれで。
数え上げのためにまずはHashMapに&lt;code&gt;第1カラムの文字列, 個数&lt;/code&gt;という組み合わせでデータを入れていきます。
出来上がったHashMapをタプルのベクターに変換し、変換したベクターの&lt;code&gt;sort_by&lt;/code&gt;メソッドに比較用の関数を渡すことで個数の降順に並べています。同一個数の場合は文字列の降順になっています。
で、最後に並びかわったベクターのイテレーターを使って出力しておしまいです。
内部的には最悪3回回る感じでしょうか?
最初からベクトルに入れつつソートできる仕組みにするようなのがいいのかなぁ?&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Unixコマンドの勉強になりましたw
あとは、HashMapなどの勉強にもなりました。
最後の方は効率がいまいち良くない気もしてはいますが、とりあえず第3章に進もうかと思います。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第2章の10から11まで(言語処理100本ノック2020)</title>
      <link>https://blog.johtani.info/blog/2020/05/08/rebootnlp100-ch02-10to11/</link>
      <pubDate>Fri, 08 May 2020 23:37:20 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/05/08/rebootnlp100-ch02-10to11/</guid>
      <description>&lt;p&gt;気づいたら1ヶ月サボってました、ごめんなさい。。。&lt;/p&gt;
&lt;p&gt;Rustで言語処理100本ノックの第2章をはじめました。&lt;/p&gt;
&lt;p&gt;前回は&lt;a href=&#34;https://blog.johtani.info/blog/2020/05/08/reboot-nlp100-finish-ch01&#34;&gt;こちら&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id=&#34;確認用のunixコマンド&#34;&gt;確認用のUnixコマンド&lt;/h2&gt;
&lt;p&gt;確認用のファイルを先に生成して置きました。
これで、Rustでコードを書いて、作成済みの確認ファイルを元に&lt;code&gt;assert_eq!&lt;/code&gt;でチェックするという方式を取ろうかと。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;気づいたら1ヶ月サボってました、ごめんなさい。。。&lt;/p&gt;
&lt;p&gt;Rustで言語処理100本ノックの第2章をはじめました。&lt;/p&gt;
&lt;p&gt;前回は&lt;a href=&#34;https://blog.johtani.info/blog/2020/05/08/reboot-nlp100-finish-ch01&#34;&gt;こちら&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id=&#34;確認用のunixコマンド&#34;&gt;確認用のUnixコマンド&lt;/h2&gt;
&lt;p&gt;確認用のファイルを先に生成して置きました。
これで、Rustでコードを書いて、作成済みの確認ファイルを元に&lt;code&gt;assert_eq!&lt;/code&gt;でチェックするという方式を取ろうかと。&lt;/p&gt;
&lt;p&gt;で、コマンド群は&lt;a href=&#34;https://github.com/johtani/nlp100-rust/blob/master/commands/chap02.sh&#34;&gt;こちら&lt;/a&gt;です。&lt;/p&gt;
&lt;p&gt;Unix/Linuxコマンド、昔から使っています。が、なにかちょっとした文字列処理やファイル処理をやるときは、Javaのプログラム(最近だとPython)を書くというのが基本になってるので、結構、使ったことの無いコマンドが今回ありました。使ったことがなかったのはこちらです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sed&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tr&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;expand&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;paste&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cut&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;split&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;sed&lt;/code&gt;とかは普通さわってるだろ?って思われそうですね。。。&lt;/p&gt;
&lt;p&gt;で、コマンドを&lt;code&gt;man&lt;/code&gt;で調べつつやりました、macOS上で。
これがまたいくつか罠があったので書き残しておきます(自分が知らないだけかもしれないので、おかしいところがあったらツッコミお願いします。)。&lt;/p&gt;
&lt;h3 id=&#34;sedコマンドでのタブの扱い&#34;&gt;&lt;code&gt;sed&lt;/code&gt;コマンドでのタブの扱い&lt;/h3&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-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## sed command for macOS. If using Linux, use &amp;#34;\t&amp;#34; for tab character&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat $INPUT_FILE_NAME | sed -e &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;s/	/ /g&amp;#39;&lt;/span&gt; &amp;gt; $OUTPUT_DIR/11_sed.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;\t&lt;/code&gt;で行けると思ったのですが、うまく動きませんでした。&lt;code&gt;&amp;lt;tab&amp;gt;&lt;/code&gt;みたいな書き方もあると思うのですが、これも駄目で、結局タブ文字をそのまま打ち込みました。。。
これ、めんどくさくないですか???
ちなみに、ターミナルで動作確認して、GitHubにあげてあるシェルファイルにコピペしてたのですが、CLionに貼り付けたらタブ文字がスペースに変換されてしまってて20分くらい悩みました。。。&lt;/p&gt;
&lt;h3 id=&#34;splitコマンドに-nオプションがない&#34;&gt;&lt;code&gt;split&lt;/code&gt;コマンドに&lt;code&gt;-n&lt;/code&gt;オプションがない&lt;/h3&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-sh&#34; data-lang=&#34;sh&#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;LINES&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;cat $OUTPUT_DIR/10.txt&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SPLIT_LINES&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;echo $LINES/$N | bc&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;split -a &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; -l $SPLIT_LINES $INPUT_FILE_NAME $OUTPUT_DIR/16_
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;split&lt;/code&gt;コマンドについてググると、&lt;code&gt;-n&lt;/code&gt;で指定した数のファイルに分割できるという記事がいくつも出てくるのですが、&lt;code&gt;man split&lt;/code&gt;をターミナル上でやるとそんなオプションがないと。。。
macOSがBSD系だからっぽいです。
ということで、行数を元に、指定した数(&lt;code&gt;N&lt;/code&gt;)で行数を割ってから、指定行数ごとにファイルを分割する方式にしました。&lt;/p&gt;
&lt;p&gt;これらのコマンドの違いはHomebrewとかでインストールするとなくなるのかなぁ?(めんどくさいので確認してないですが。。。)&lt;/p&gt;
&lt;p&gt;ってことで、2章のそれぞれの課題の正解ファイルの生成はこれでできたはずです。&lt;/p&gt;
&lt;h2 id=&#34;10-行数のカウント&#34;&gt;10. 行数のカウント&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;wc -l&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ch02-10 行数のカウント
&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;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;word_count&lt;/span&gt;(file_name: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;usize&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;let&lt;/span&gt; f &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; File::open(file_name).expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;file not found&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:#66d9ef&#34;&gt;let&lt;/span&gt; buf &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; BufReader::new(f);
&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;return&lt;/span&gt; buf.lines().count();
&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;ファイルを読み込んで行数を数えます。
文字列として読み込んで改行コードの数を数えるというのもありかな?と思いましたが、Rustの&lt;code&gt;BufReader&lt;/code&gt;に&lt;code&gt;lines()&lt;/code&gt;という行のイテレータ?が取れることがわかったので、それでカウントを取りました。&lt;/p&gt;
&lt;h2 id=&#34;11-タブをスペースに置換&#34;&gt;11. タブをスペースに置換&lt;/h2&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ch02-11 タブをスペースに置換
&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;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;tab_2_space&lt;/span&gt;(file_name: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;) -&amp;gt; String {
&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;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; f &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; File::open(file_name).expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;file not found&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:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; contents&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; String::new();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    f.read_to_string(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; contents).expect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;read error&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:#66d9ef&#34;&gt;return&lt;/span&gt; contents.replace(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\t&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &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;code&gt;replace&lt;/code&gt;で置換するという方式です。
ファイルが大きい場合にこれでいいのか?という問題がある気がしますが、まずはこの実装にしました。
やるとしたら、&lt;code&gt;read&lt;/code&gt;メソッドと&lt;code&gt;buffer&lt;/code&gt;を用意して、少しずつ読みながら、置換して吐き出す感じでしょうか?
ちゃんとした文字コードの区切りで取れるかどうかを気にしないと行けないと思うので、思ったよりはめんどくさくなりそう。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;BufReader&lt;/code&gt;をつかって&lt;code&gt;read_line&lt;/code&gt;のほうがましかも?&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、サボっていたのを再開しました。
Rustのコードを書く前に、Unixコマンドの処理に結構悩みましたw&lt;/p&gt;
&lt;p&gt;Rustのコードとしてはファイル処理なので、今後も役立つ気がしてます。
ということで、頑張っていくぞと。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第1章の08から09まで(言語処理100本ノック2020)</title>
      <link>https://blog.johtani.info/blog/2020/05/08/reboot-nlp100-finish-ch01/</link>
      <pubDate>Fri, 08 May 2020 16:40:57 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/05/08/reboot-nlp100-finish-ch01/</guid>
      <description>&lt;p&gt;Rustで言語処理100本ノックのリファクタリングの続き。&lt;/p&gt;
&lt;p&gt;前回は&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/09/reboot-nlp100-ch01-03to05/&#34;&gt;こちら&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;とっくに終わってたのに、ブログ書いてなかった。。。&lt;/p&gt;
&lt;h3 id=&#34;08-暗号文&#34;&gt;08. 暗号文&lt;/h3&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cipher&lt;/span&gt;(text: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;) -&amp;gt; String {
&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;return&lt;/span&gt; String::from_iter(text.chars().map(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;x&lt;span style=&#34;color:#f92672&#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;if&lt;/span&gt; x.is_ascii_alphanumeric() &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; x.is_lowercase() {
&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;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; b &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            x.encode_utf8(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; b);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            b[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;219&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; b[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;char&lt;/span&gt;::from(b[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            x
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Rustの文字列はUTF-8でエンコードされたテキストを保持しているので、文字コード自体は意識していないです。
&lt;code&gt;chars()&lt;/code&gt;でUnicodeスカラー値のイテレータが返ってくるので、1文字ずつ扱えるようになります。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Rustで言語処理100本ノックのリファクタリングの続き。&lt;/p&gt;
&lt;p&gt;前回は&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/09/reboot-nlp100-ch01-03to05/&#34;&gt;こちら&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;とっくに終わってたのに、ブログ書いてなかった。。。&lt;/p&gt;
&lt;h3 id=&#34;08-暗号文&#34;&gt;08. 暗号文&lt;/h3&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cipher&lt;/span&gt;(text: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;) -&amp;gt; String {
&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;return&lt;/span&gt; String::from_iter(text.chars().map(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;x&lt;span style=&#34;color:#f92672&#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;if&lt;/span&gt; x.is_ascii_alphanumeric() &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; x.is_lowercase() {
&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;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; b &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            x.encode_utf8(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; b);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            b[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;219&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; b[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;char&lt;/span&gt;::from(b[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            x
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Rustの文字列はUTF-8でエンコードされたテキストを保持しているので、文字コード自体は意識していないです。
&lt;code&gt;chars()&lt;/code&gt;でUnicodeスカラー値のイテレータが返ってくるので、1文字ずつ扱えるようになります。&lt;/p&gt;
&lt;p&gt;ただ、1文字をバイトとして扱うのに手こずりました。
&lt;code&gt;encode_utf8&lt;/code&gt;というメソッドを利用して1バイトだけ取り出して、計算するというのをやっています。
文字種の判別のメソッドが用意されているのは便利ですね。&lt;/p&gt;
&lt;p&gt;なんかもうちょっとスマートにできないのかな?と思いつつ動いたのでこれになってます。&lt;/p&gt;
&lt;h3 id=&#34;09-typoglycemia&#34;&gt;09. Typoglycemia&lt;/h3&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;typoglycemia&lt;/span&gt;(text: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt;) -&amp;gt; String {
&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;return&lt;/span&gt; text
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .split_whitespace()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .map(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;word&lt;span style=&#34;color:#f92672&#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;if&lt;/span&gt; word.len() &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                word.to_string()
&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;else&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;let&lt;/span&gt; original &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; word.chars().collect::&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Vec&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;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;let&lt;/span&gt; first &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; original.get(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;).unwrap();
&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;let&lt;/span&gt; last &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; original.last().unwrap();
&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;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; typo &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; original[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;..&lt;/span&gt;original.len() &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    .iter()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    .map(&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;x&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; x.clone())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    .collect::&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Vec&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;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;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; rng &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; thread_rng();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                typo.shuffle(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; rng);
&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;let&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; typo &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; String::from_iter(typo.iter());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                typo.insert(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, first.clone());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                typo.push(last.clone());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                typo
&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;        .collect::&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Vec&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .join(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &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;一応、1行で記述できたかな?
まずは、スペースで単語ごとに区切った後に、&lt;code&gt;word&lt;/code&gt;(単語)の長さによって、処理を分岐し、単語が5文字以上の場合にランダムに並び替えを行うというのをやっています。
文字単位で処理を行うために、&lt;code&gt;chars()&lt;/code&gt;で1文字ずつ取り出しています。
最初と最後の文字だけはそのままに、間の文字をランダムにシャッフルするというのをやるのに、もとの&lt;code&gt;word&lt;/code&gt;のスライスからコピーした文字列を作り出してから組み立て直すということをやっています。&lt;/p&gt;
&lt;p&gt;コピーしないでゴニョゴニョする方法ってあるのかなぁ?
思いつかなかったので、結構泥臭い感じの実装になってしまいました。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;めんどくさいので、コードをGitHubのソースコードからではなく、ブログにコードスニペットとしてコピペしました。Hugoでいい感じにGitHubのコードスニペット表示するのないかなぁ?&lt;/p&gt;
&lt;p&gt;ということで、2年越しで1章が終了しました。
2章もやらないとなぁ。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>ElasticのWorkplace Searchを触ってみる - その2 - インストールと起動</title>
      <link>https://blog.johtani.info/blog/2020/05/07/install-workplace-search/</link>
      <pubDate>Thu, 07 May 2020 11:32:50 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/05/07/install-workplace-search/</guid>
      <description>&lt;p&gt;前回はWorkplace Searchの概要について書きましたが、今回はインストールと構成要素について説明します。なお、2020/5/7時点での情報を元に本記事は書いていますのでご注意ください。基本的にはインストールと起動方法についての手順を元に書いています。所々に考察を挟んだ形の記事になっていますので、気になるところだけ呼んでいただければと。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;前回はWorkplace Searchの概要について書きましたが、今回はインストールと構成要素について説明します。なお、2020/5/7時点での情報を元に本記事は書いていますのでご注意ください。基本的にはインストールと起動方法についての手順を元に書いています。所々に考察を挟んだ形の記事になっていますので、気になるところだけ呼んでいただければと。&lt;/p&gt;
&lt;h2 id=&#34;記事一覧&#34;&gt;記事一覧&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/05/01/intro-workplace-search/&#34;&gt;ElasticのWorkplace Searchを触ってみる - その1&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/workplace-search/current/workplace-search-install.html&#34;&gt;公式リファレンス&lt;/a&gt;もしくは&lt;a href=&#34;https://www.elastic.co/jp/downloads/enterprise-search&#34;&gt;ダウンロードページ&lt;/a&gt;に記載があります。
現時点ではMacもしくはLinuxが対象でWindowsはまだサポート対象外となっています。&lt;/p&gt;
&lt;h3 id=&#34;必要なもの&#34;&gt;必要なもの&lt;/h3&gt;
&lt;p&gt;インストールに必要なものは以下になります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Elasticsearch 7.6.x + Platinum license
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/jp/elasticsearch/service&#34;&gt;Elastic CloudのElasticsearch Service&lt;/a&gt; もしくは&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/downloads/elasticsearch&#34;&gt;ダウンロード&lt;/a&gt;してローカルで起動&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;enterprise-search-7.6.0.tar.gz
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/jp/downloads/enterprise-search&#34;&gt;ダウンロードページはこちら&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Java 8もしくは11
&lt;ul&gt;
&lt;li&gt;Long Term Supportの対象であるJavaです。2020/5/7時点では8か11&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回はローカルにElasticsearchの7.6.2をインストールしてから試してみます。30日間のトライアルライセンスが有効になっているので、Platinumの機能を試すことができます。&lt;/p&gt;
&lt;p&gt;Javaの8か11が必要になります。Elasticsearchには7.xからJDKが同梱されるようになりましたが、Workplace SearchがJettyを元に動作しているからです(enterprise-search-7.6.0.tar.gzにjettyというフォルダあり)。&lt;/p&gt;
&lt;h3 id=&#34;インストール手順&#34;&gt;インストール手順&lt;/h3&gt;
&lt;p&gt;大まかには以下の3つです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Java 8もしくは11のインストール
&lt;ul&gt;
&lt;li&gt;14でも大丈夫でした(ローカルにはSDKMANでインストールした14.0.1が利用された)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Elasticsearchのインストール(Elastic Cloudの場合はクラスタの起動)
&lt;ul&gt;
&lt;li&gt;今回はローカルにインストール&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Workplace Searchのインストール&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Javaはもともとインストールされていたので、今回は2と3をインストールしました。どちらもローカルで起動するので、2つをダウンロードして&lt;code&gt;tar.gz&lt;/code&gt;ファイルを展開するだけになります。&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/workplace-search/current/workplace-search-install.html#running-enterprise-search&#34;&gt;起動方法に起動前の設定の手順&lt;/a&gt;も記載があります。
設定しながら起動していきます。&lt;/p&gt;
&lt;h4 id=&#34;elasticsearchの起動&#34;&gt;Elasticsearchの起動&lt;/h4&gt;
&lt;p&gt;既存のElasticsearchのクラスターがあり、Platinumのライセンスが有効になっている場合はこの手順は必要ありません。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Elasticsearchの設定ファイルでSecurity機能をオンに
&lt;ul&gt;
&lt;li&gt;7.1から基本的な&lt;a href=&#34;https://www.elastic.co/jp/subscriptions&#34;&gt;セキュリティ機能はベーシックの機能&lt;/a&gt;に含まれています。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Elasticsearchを起動
&lt;ul&gt;
&lt;li&gt;まずは起動(パスワードなどを設定するために必要)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Elasticsearchのパスワードの設定
&lt;ul&gt;
&lt;li&gt;Elasticsearchでデフォルトで用意されているユーザーのパスワードを設定してします。手順では自動で生成させる方法ですが、独自に設定することも可能です。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;workplace-searchの起動&#34;&gt;Workplace Searchの起動&lt;/h4&gt;
&lt;p&gt;Elasticsearchが起動したらWorkplace Searchの設定をして起動します。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Esへの接続設定を&lt;code&gt;config/enterprise-search.yml&lt;/code&gt;に指定
&lt;ul&gt;
&lt;li&gt;Esのパスワード設定時に生成された&lt;code&gt;elastic&lt;/code&gt;というユーザーのパスワードをここで指定。&lt;/li&gt;
&lt;li&gt;yamlファイルに記載があるが、&lt;code&gt;${ELASTICSEARCH_PASSWORD:changeme}&lt;/code&gt;という記述をした場合に環境変数を読み込める&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;allow_es_settings_modification: true&lt;/code&gt;を&lt;code&gt;config/enterprise-search.yml&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/workplace-search/current/workplace-search-install.html#elasticsearch-cluster-settings&#34;&gt;ここに記載があるような変更&lt;/a&gt;をWorkplace SearchがEsのクラスターに対して実行する模様。Workplace Search以外でも使用しているElasticsearchクラスターの場合は&lt;code&gt;allow_es_settings_modification&lt;/code&gt;を有効にする代わりに、リンク先にあるような設定を自分で追加する。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;secret_management.encryption_keys&lt;/code&gt;を複数設定
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/workplace-search/current/encryption-keys.html&#34;&gt;Encryption Keysのガイド&lt;/a&gt;に少し詳しい説明がある。&lt;/li&gt;
&lt;li&gt;opensslコマンドとかで作ればいいかな??&lt;/li&gt;
&lt;li&gt;1.と同じような設定をしようとしたがうまくいかなかったので、ファイルにキーを設定する方式にしました(バグ?)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;起動するときにデフォルトユーザーパスワードを指定
&lt;ul&gt;
&lt;li&gt;指定しなければ勝手に生成してコンソールに出力してくれるので、そちらの方がいいかと。&lt;/li&gt;
&lt;li&gt;今回は手順通りに指定した。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;起動確認のため&lt;code&gt;http://localhost:3002&lt;/code&gt;にアクセス&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;起動するとログが流れ、問題がなければ次のようにデフォルトユーザーの情報が出力されます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#########################################################

*** Default user credentials have been setup. These are only printed once, so please ensure they are recorded. ***
      username: enterprise_search
      password: pas...ple

#########################################################
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;そして無事起動に成功したことも出力されます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#########################################################

Success! Elastic Workplace Search is starting successfully.

In a few moments, you&amp;#39;ll be able to login at the following address:

* URL: http://localhost:3002
  * If this is your first time starting Workplace Search, check the console output above for your user authentication credentials.
  * Visit the documentation: https://swiftype.com/documentation/enterprise-search

Secret session key has been generated.

Set the key in your config file to persist user sessions through process restarts:

secret_session_key: c23...3


#########################################################
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ブラウザで画面にアクセスすると、次のような画面が表示されました。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20200507/first_page.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20200507/first_page.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h4 id=&#34;起動時のエラー&#34;&gt;起動時のエラー&lt;/h4&gt;
&lt;p&gt;いくつかのパターンも試してどんなエラーが出るのかを見てみました。
おまけですね。&lt;/p&gt;
&lt;h5 id=&#34;elasticsearchが見つからないエラー&#34;&gt;Elasticsearchが見つからないエラー&lt;/h5&gt;
&lt;p&gt;Esを起動しないでWorkplace Searchを起動してみました。&lt;/p&gt;
&lt;p&gt;200秒間アクセスしようと試みて駄目だったらエラーで終了みたいです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
[2020-05-07T03:48:33.645+00:00][13709][2002][app-server][INFO]: Failed to connect to Elasticsearch backend. Make sure it is running.
...
[2020-05-07T03:51:54.038+00:00][13709][2002][app-server][INFO]: Could not connect to Elasticsearch backend after 200s. Terminating...
[2020-05-07T03:51:54.039+00:00][13709][2002][app-server][ERROR]: 
--------------------------------------------------------------------------------

Error: Workplace Search is unable to connect to Elasticsearch. Ensure a healthy Elasticsearch cluster is running at http://127.0.0.1:9200 for user elastic.

--------------------------------------------------------------------------------
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;elasticsearchのsecurityがオフのときのエラー&#34;&gt;ElasticsearchのSecurityがオフのときのエラー&lt;/h5&gt;
&lt;p&gt;ちなみにSecurityをオフにしたままWorkplace Searchを起動した場合は以下のようなエラーが出ました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[2020-05-07T03:46:53.474+00:00][13567][2002][app-server][ERROR]: 
--------------------------------------------------------------------------------

Elastic Workplace Search requires Elasticsearch security features to be enabled.
Please enable Elasticsearch security features as outlined here:
  https://www.elastic.co/guide/en/workplace-search/current/workplace-search-install.html

--------------------------------------------------------------------------------
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;構成要素&#34;&gt;構成要素&lt;/h2&gt;
&lt;p&gt;ここまでインストールして起動してきました。
では、Workplace Searchがどういったコンポーネントから構成されているかを予測してみましょう(あくまで外から見た予想となります。そのうちElastic社のウェビナーとかイベントで内部の発表とかあるかも?)。&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/workplace-search/current/workplace-search-install.html#_minimum_hardware&#34;&gt;最小ハードウェア&lt;/a&gt;という記載があり、そこで何が動く可能性があるかというのがわかります。&lt;/p&gt;
&lt;p&gt;起動するものはこんな感じみたいです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Elasticsearch - 外部でもOK&lt;/li&gt;
&lt;li&gt;App Server - Workplace SearchのWeb機能&lt;/li&gt;
&lt;li&gt;Worker - クローラーとかかな?&lt;/li&gt;
&lt;li&gt;Filebeat - Workplace Searchのログ収集用&lt;/li&gt;
&lt;li&gt;その他プロセス - なんだろ?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;という具合です。&lt;/p&gt;
&lt;h3 id=&#34;設定などからの予想&#34;&gt;設定などからの予想&lt;/h3&gt;
&lt;p&gt;次は設定項目や起動時のログなどからの予想です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Worklpace Search配下のセキュアなデータストア - アクセストークンなどの管理のため&lt;/li&gt;
&lt;li&gt;JRubyアプリケーション - App ServerはJRuby上で動いているRailsアプリ&lt;/li&gt;
&lt;li&gt;Filebeatも起動している - Workplace Searchのログ収集のため?
&lt;ul&gt;
&lt;li&gt;Filebeatの接続設定はWorkplace Searchの設定値を利用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;では構成要素は&#34;&gt;では構成要素は?&lt;/h3&gt;
&lt;p&gt;ということで、現時点でわかった構成要素は以下のとおりです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Elasticsearch&lt;/li&gt;
&lt;li&gt;Workplace Search App Server - Railsアプリ on JRuby
&lt;ul&gt;
&lt;li&gt;Webアプリとは別に(内部?で)、いくつかのワーカーが存在する&lt;/li&gt;
&lt;li&gt;管理画面と検索画面の2種類が存在&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Filebeat - ログ収集&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;といった感じです。
まだ起動したばかりなのでこのくらいでしょうか。ログを見るともう少しわかりそうな気がします。&lt;/p&gt;
&lt;p&gt;基本的には、EsをバックエンドにしたRailsのミドルウェアになります。コネクターや検索画面はすべてWorkplace Searchのミドルウェア経由でアクセスする形になりますので、普通に検索で利用するユーザーにはElasticsearchの存在は見えない作りになっています。&lt;/p&gt;
&lt;h2 id=&#34;次は&#34;&gt;次は?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/workplace-search/current/workplace-search-getting-started.html&#34;&gt;Getting Started&lt;/a&gt;を元に、どんなアクターがいて、どんな機能が提供されているのか、どんな利用方法なのか?というのを見ていこうと思います。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>ElasticのWorkplace Searchを触ってみる - その1</title>
      <link>https://blog.johtani.info/blog/2020/05/01/intro-workplace-search/</link>
      <pubDate>Fri, 01 May 2020 16:29:04 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/05/01/intro-workplace-search/</guid>
      <description>&lt;p&gt;2月のElastic社のブログですが、Enterprise Searchとこれまで呼んでいた製品を&lt;a href=&#34;https://www.elastic.co/jp/workplace-search&#34;&gt;Workplace Search&lt;/a&gt;という製品名に変更し、App Searchなどを含む製品群を&lt;a href=&#34;https://www.elastic.co/jp/enterprise-search&#34;&gt;Enterprise Search&lt;/a&gt;という名前に変更しました(ちょっとややこしい)。
Workplace Search自体はまだβ版という位置づけですが、ダウンロードして試すことが可能です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;2月のElastic社のブログですが、Enterprise Searchとこれまで呼んでいた製品を&lt;a href=&#34;https://www.elastic.co/jp/workplace-search&#34;&gt;Workplace Search&lt;/a&gt;という製品名に変更し、App Searchなどを含む製品群を&lt;a href=&#34;https://www.elastic.co/jp/enterprise-search&#34;&gt;Enterprise Search&lt;/a&gt;という名前に変更しました(ちょっとややこしい)。
Workplace Search自体はまだβ版という位置づけですが、ダウンロードして試すことが可能です。&lt;/p&gt;
&lt;p&gt;きちんと触ったことがないので、ちょっと触って見ようかなと思い、何回かに分けてブログを書いてみます。まずは概要とかから。&lt;/p&gt;
&lt;h2 id=&#34;workplace-searchとは&#34;&gt;Workplace Searchとは?&lt;/h2&gt;
&lt;p&gt;Elasticsearchをバックエンドに利用するElastic社が提供するアプリケーション(ミドルウェア?)の1つです。&lt;/p&gt;
&lt;p&gt;もともとはSwiftypeという会社が作っていた、Site Search、App Searchと同じような系列で開発されている統合検索の検索エンジンミドルウェアという感じです。
製品ページを見るとわかりますが、様々なデータソースから、データをクロールしてElasticsearchに保存することで、統合された検索を提供することができるようになる製品です。
最近は会社のドキュメントがさまざまな場所(Google Drive、Saleseforce、GitHub、Dropboxなど)に保存されています。
それぞれで検索窓などはありますが、1箇所で検索することで横断的に検索でき、仕事の効率があがりますよね?ということで作られている製品です。&lt;/p&gt;
&lt;h3 id=&#34;提供利用方法は&#34;&gt;提供(利用)方法は?&lt;/h3&gt;
&lt;p&gt;今後の提供方法としては、Elastic Cloudで利用できるSaaS形式のものと、独自に(クラウドのコンピューティングエンジンやオンプレのサーバーなどで)Workplace Searchのアプリを起動する方法(オンプレ版)があります。後者の場合は、Elasticsearchのクラスターを用意する必要があります。なお、後者の場合、Elasticsearchの&lt;a href=&#34;https://www.elastic.co/jp/subscriptions&#34;&gt;サブスクリプションのプラチナライセンス&lt;/a&gt;が必要になるようです(&lt;a href=&#34;https://www.elastic.co/jp/downloads/enterprise-search&#34;&gt;ダウンロードページ&lt;/a&gt;に記載あり)&lt;/p&gt;
&lt;p&gt;まだ、β版という位置づけなので、今後どのように変更されるかはわかりませんが、今回は2020年5月1日時点でのベータ版(7.6.0)を元にどんなものかを紹介します。現時点で利用できるのはβ版のオンプレ版で、MacやLinuxで利用可能です。&lt;/p&gt;
&lt;h3 id=&#34;ダウンロードとインストール&#34;&gt;ダウンロードとインストール&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/downloads/enterprise-search&#34;&gt;ダウンロードページ&lt;/a&gt;にインストール方法などの記載があります。&lt;/p&gt;
&lt;p&gt;インストールして触って見るところはまた後日。&lt;/p&gt;
&lt;h2 id=&#34;ライセンス価格は&#34;&gt;ライセンス、価格は?&lt;/h2&gt;
&lt;p&gt;まだ不明です。SaaS版の提供はまだです。
オンプレ版については少なくとも、&lt;a href=&#34;https://www.elastic.co/jp/subscriptions&#34;&gt;Elasticのサブスクリプション&lt;/a&gt;のプラチナが必要になります。こちらは、価格は公開されていません。Elastich社もしくはパートナー企業での問い合わせが必要になります。
(たぶん、ドキュメントレベルのセキュリティとかSSOとかの仕組みがプラチナで提供されているのでそのあたりを使っているのでは?と想像してます。)&lt;/p&gt;
&lt;h2 id=&#34;想定できそうな用途は&#34;&gt;想定できそうな用途は?&lt;/h2&gt;
&lt;p&gt;社内の文書検索でしょうか。ただ、いわゆる昔ながらのエンタープライズサーチと呼ばれている、社内のファイルサーバーなどの文書検索ではなく、クラウドサービスを複数利用している会社が利用する想定になっています。&lt;/p&gt;
&lt;p&gt;例えば、開発者は社内Wiki(Confluence)で社内文書を書き、Issue管理にはJIRAやGitHubを活用しており、ただ、社内での説明にはGoogle Driveを利用しているといった場合です。こういう場合、あの機能についての説明や資料ってどこだっけ?というので、あちこち探し回ったりしないといけないです。また、営業部門やサポート、マーケティングなどが絡んでくると更に、SalesforceやZendeskといったデータソースも出てきます。
情報が散らばっていて、それらを探し出したりまとめるだけで時間を取られている場合などに便利かもしれません。&lt;/p&gt;
&lt;h2 id=&#34;次は&#34;&gt;次は?&lt;/h2&gt;
&lt;p&gt;実際にインストールしてから起動して、どんな感じで使えるのかといったところを見て、どんな機能が提供されているのかを見ていこうと思います。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>辞書の更新についての注意点</title>
      <link>https://blog.johtani.info/blog/2020/04/27/note-updating-dictionary/</link>
      <pubDate>Mon, 27 Apr 2020 10:44:15 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/04/27/note-updating-dictionary/</guid>
      <description>&lt;p&gt;先日、&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/22/custom-dictionary-after-7-4/&#34;&gt;Elasticsearchでのカスタム辞書の利用方法についてブログ&lt;/a&gt;を書きました。&lt;/p&gt;
&lt;p&gt;辞書の設定方法について記載しましたが、今回は辞書の更新について書いていなかったので、書いてみようと思います。
ここで「辞書」としているのは、Kuromojiのユーザー辞書、&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-synonym-graph-tokenfilter.html&#34;&gt;Synonym Graph Token FilterのSynonym辞書&lt;/a&gt;(いわゆる類義語辞書)のことになります。サードパーティのAnalyzer等に関する話ではありません。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;先日、&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/22/custom-dictionary-after-7-4/&#34;&gt;Elasticsearchでのカスタム辞書の利用方法についてブログ&lt;/a&gt;を書きました。&lt;/p&gt;
&lt;p&gt;辞書の設定方法について記載しましたが、今回は辞書の更新について書いていなかったので、書いてみようと思います。
ここで「辞書」としているのは、Kuromojiのユーザー辞書、&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-synonym-graph-tokenfilter.html&#34;&gt;Synonym Graph Token FilterのSynonym辞書&lt;/a&gt;(いわゆる類義語辞書)のことになります。サードパーティのAnalyzer等に関する話ではありません。&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はAnalyzerが切り出した単語を元に転置インデックスを作成して、検索を行っています(&lt;a href=&#34;https://noti.st/johtani/halVGM&#34;&gt;この仕組みに関するスライドはこちらを参照のこと&lt;/a&gt;)。
Analyzerが辞書を持っている場合、その辞書を元に単語を切り出して転置インデックスに利用します。
また、検索クエリの単語に対してもこのAnalyzerの辞書が利用されます。&lt;/p&gt;
&lt;p&gt;辞書に新しい単語を追加するということは、その単語に関連するドキュメントも更新しないと行けないということになります。&lt;/p&gt;
&lt;p&gt;例えば、Kuromojiを利用していて、「グランベリーパーク」という単語「グランベリー」「パーク」という単語に分割できるような新しい単語として辞書に追加する場合を考えてみましょう。ユーザーが「グランベリー」で検索しても検索結果として出てきてほしいという場合です。&lt;/p&gt;
&lt;p&gt;辞書に「グランベリーパーク」を登録していない頃に登録されたドキュメントは「グランベリーパーク」という1単語として転置インデックスの見出し語を切り出します(Kuromojiはカタカナの連続している文字列については未知語として1単語にし、「名詞-一般」の品詞を付与)。&lt;/p&gt;
&lt;p&gt;更新前でのドキュメントのAnalyze結果&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;「グランベリーパーク」「で」「ショッピング」
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;もし、辞書に「グランベリーパーク」を「グランベリー」「パーク」から構成される新規の単語として登録しそれを使用した場合、辞書を更新したあとから、「グランベリーパーク」という単語がAnalyzerからは出てこなくなります。&lt;/p&gt;
&lt;p&gt;更新後でのドキュメントのAnalyze結果&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;「グランベリー」「パーク」「で」「ショッピング」
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ということは、辞書更新以前のドキュメントは「グランベリーパーク」という見出し語に対して登録されているので、辞書更新以前に登録されているドキュメントは検索にヒットしなくなります。&lt;/p&gt;
&lt;p&gt;このように転置インデックスを利用している検索エンジンでは、単語の区切りが変更されるような辞書の更新があった場合、最低でも影響があるドキュメントについては再登録が必要となるわけです。&lt;/p&gt;
&lt;p&gt;これが大原則(辞書更新=データも更新)となります。
基本的には辞書の更新を行った場合は、ドキュメントの再インデックス(再登録)が必要となります。&lt;/p&gt;
&lt;h3 id=&#34;elasticsearchでの制限事項&#34;&gt;Elasticsearchでの制限事項&lt;/h3&gt;
&lt;p&gt;Elasticsearchでは、辞書の更新に関して実装上の制限事項が存在しています。
内部的な実装として、ElasticsearchではAnalyzerのインスタンス(正確にはAnalyzerのFactoryのインスタンス)の生成がインデックスに関する内部のインスタンスが生成されたタイミングの1回のみとなっています。&lt;/p&gt;
&lt;p&gt;このインスタンスの生成時に設定ファイル(辞書を含む)を読み込んでいます。&lt;/p&gt;
&lt;p&gt;言い換えると、辞書(ファイル、インデックス設定に関わらず)の読み込みは、インデックスが作られたタイミングのみということになります。
なおここで言う「インデックスが作られたタイミング」というのは、以下の2パターンです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;インデックス新規作成時&lt;/li&gt;
&lt;li&gt;インデックスオープン時&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;では、ここから辞書を更新してそれを既存のインデックスに適用する方法について説明しましょう。&lt;/p&gt;
&lt;h2 id=&#34;辞書の更新方法ファイル編&#34;&gt;辞書の更新方法(ファイル編)&lt;/h2&gt;
&lt;p&gt;前回のブログで説明しましたが、Elasticsearch 7.4よりも古いバージョンでは、ファイルでKuromojiのユーザー辞書を設定していました。まずはこちらの方法について説明します。前提として、すでにユーザー辞書を設定したKuromoji Tokenizerがインデックスに設定されているものとします(&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/plugins/current/analysis-kuromoji-tokenizer.html&#34;&gt;ユーザー辞書の設定方法については公式リファレンスを御覧ください&lt;/a&gt;)。&lt;/p&gt;
&lt;p&gt;辞書ファイルに新規にエントリーを追加しただけでは、設定は読み込まれていません。新規辞書を反映させるためには以下の手順が必要となります。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;更新した辞書ファイルの配布
&lt;ul&gt;
&lt;li&gt;複数ノードでElasticsearchのクラスターを構成している場合はすべてのノードに更新した辞書ファイルを配布する必要があります。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;インデックスのクローズ(&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-close.html&#34;&gt;公式リファレンス&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;設定ファイルを再読込させるために一度インデックスをクローズします。&lt;/li&gt;
&lt;li&gt;クローズするので、書き込み、検索などの処理を停止する必要があります。もし停止していない場合はクライアント側ではインデックスがクローズされているという旨のエラーを受け取ります(400で、&lt;code&gt;index_closed_exception&lt;/code&gt;)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;インデックスのオープン(&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-open-close.html&#34;&gt;公式リファレンス&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;設定ファイルを読み込みます。これで、新規追加された単語が読み込まれます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;再インデックス
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html&#34;&gt;&lt;code&gt;_update_by_query&lt;/code&gt;&lt;/a&gt;を利用することで、対象のインデックスのデータを再インデックスすることができます。条件無しでAPIを呼び出すとすべてのデータが再度登録されます。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_source&lt;/code&gt;が&lt;code&gt;false&lt;/code&gt;の場合は&lt;code&gt;_update_by_query&lt;/code&gt;は利用できません。元データをもう一度外部からElasticsearchに対して登録する必要があります。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&#34;https://gist.github.com/johtani/25e971ded639e3bea3229ebf861e62be#file-1_-_-json&#34;&gt;Kibanaでの手順をGistにしてあります&lt;/a&gt;。手順はこちらをご覧ください。&lt;/p&gt;
&lt;h2 id=&#34;辞書の更新方法インデックス設定編&#34;&gt;辞書の更新方法(インデックス設定編)&lt;/h2&gt;
&lt;p&gt;ファイルの場合とは少し手順が異なります。
インデックスの設定としてユーザー辞書を登録しているため、ファイルをElasticsearchのクラスターにあるノードに配布する必要がありません。
また、辞書の設定はインデックスの設定に指定してありますが、こちらは動的に設定変更できる項目ではないため、インデックスを先にクローズする必要があります。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;インデックスのクローズ(&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-close.html&#34;&gt;公式リファレンス&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;辞書の設定を更新するにはインデックスをクローズする必要があります。辞書の設定は動的に更新できる項目にはなっていないためです。&lt;/li&gt;
&lt;li&gt;オープンしているインデックスで更新しようとした場合は&lt;code&gt;illegal_argument_exception&lt;/code&gt;で&lt;code&gt;Can&#39;t update non dynamic settings...&lt;/code&gt;というメッセージが返ってきます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;辞書の更新(&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/7.6/indices-update-settings.html&#34;&gt;公式リファレンス:インデックス設定の更新&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;user_dictionary_rules&lt;/code&gt;に単語と追加します。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;インデックスのオープン(&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-open-close.html&#34;&gt;公式リファレンス&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;設定ファイルを読み込みます。これで、新規追加された単語が読み込まれます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;再インデックス
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html&#34;&gt;&lt;code&gt;_update_by_query&lt;/code&gt;&lt;/a&gt;を利用することで、対象のインデックスのデータを再インデックスすることができます。条件無しでAPIを呼び出すとすべてのデータが再度登録されます。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_source&lt;/code&gt;が&lt;code&gt;false&lt;/code&gt;の場合は&lt;code&gt;_update_by_query&lt;/code&gt;は利用できません。元データをもう一度外部からElasticsearchに対して登録する必要があります。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&#34;https://gist.github.com/johtani/25e971ded639e3bea3229ebf861e62be#file-2_-_-json&#34;&gt;Kibanaでの手順をGistにしてあります&lt;/a&gt;。手順はこちらをご覧ください。&lt;/p&gt;
&lt;h2 id=&#34;第3の方法新規インデックス作成&#34;&gt;第3の方法(新規インデックス作成)&lt;/h2&gt;
&lt;p&gt;ここまで、インデックスのクローズ、オープンで既存のインデックスに対して辞書を更新する方法について説明しました。
ただ、残念なことにAmazon Elasticsearch ServiceではElasticsearchが提供しているすべてのAPIが利用できるわけではありません(&lt;a href=&#34;https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/aes-supported-es-operations.html&#34;&gt;Amazon ESの利用可能なAPIの一覧はこちら&lt;/a&gt;)。
(&lt;code&gt;_close&lt;/code&gt;は駄目だけど&lt;code&gt;_open&lt;/code&gt;は呼べるのかな???)&lt;/p&gt;
&lt;p&gt;ということで、新規にインデックスを作成して、新しい辞書の設定を反映したインデックスを用意し、そこにデータをコピーもしくは登録するという方法になります(&lt;a href=&#34;https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/custom-packages.html&#34;&gt;Amazon ESのカスタム辞書のドキュメントに手順がありますね&lt;/a&gt;)。&lt;/p&gt;
&lt;p&gt;手順としては以下のとおりです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;辞書の更新(用意)
&lt;ul&gt;
&lt;li&gt;新しい単語などを登録した辞書を用意します。&lt;/li&gt;
&lt;li&gt;ファイル、インデックス設定どちらでもOKです。&lt;/li&gt;
&lt;li&gt;ファイルの場合は、既存のファイル名とは異なるファイル名にしたほうが混乱がなくなります。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;新規インデックス作成
&lt;ul&gt;
&lt;li&gt;1.で作成した辞書を元に新規インデックスを作成します。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;新規インデックスにデータコピー
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/7.6/docs-reindex.html&#34;&gt;&lt;code&gt;_reindex&lt;/code&gt; API&lt;/a&gt;を利用するとデータコピーが簡単です。&lt;code&gt;source&lt;/code&gt;と&lt;code&gt;dest&lt;/code&gt;を指定するだけです。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_source&lt;/code&gt;が&lt;code&gt;false&lt;/code&gt;の場合は&lt;code&gt;_update_by_query&lt;/code&gt;は利用できません。元データをもう一度外部からElasticsearchに対して登録する必要があります。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;アプリケーション側で新規インデックスを利用するように変更
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;_alias&lt;/code&gt;を使用しておくと切り替えが簡単です(&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/7.6/indices-add-alias.html&#34;&gt;公式リファレンスはこのあたり&lt;/a&gt;)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;考慮すべき点としては、サービスを提供しながら行う場合は、3.の&lt;code&gt;_reindex&lt;/code&gt;を実行し始めたタイミング以降の登録・更新データの扱いについてでしょうか。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;辞書の更新に関する大原則、制限事項、手順などについて説明しました。
辞書の変更は検索に大きく影響がでます。そのあたりをきちんと考慮しながら更新しましょう。
ユーザー辞書、カスタム辞書を扱う際の参考にしていただければと。
他にもユーザー辞書で気をつけないといけないこともありますが、今日はこのあたりで。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Kuromojiのカスタム辞書をインデックスの設定で指定</title>
      <link>https://blog.johtani.info/blog/2020/04/22/custom-dictionary-after-7-4/</link>
      <pubDate>Wed, 22 Apr 2020 10:30:56 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/04/22/custom-dictionary-after-7-4/</guid>
      <description>&lt;p&gt;Elasticsearchで日本語を扱うときに、カスタム辞書を使いたいという要望がよくあります。
&lt;a href=&#34;https://aws.amazon.com/jp/about-aws/whats-new/2020/04/custom-dictionary-files-now-supported-on-amazon-elasticsearch-service/&#34;&gt;AWSのElasticsearch Serviceでカスタム辞書ファイルを読み込める機能が発表されたようです&lt;/a&gt;。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Elasticsearchで日本語を扱うときに、カスタム辞書を使いたいという要望がよくあります。
&lt;a href=&#34;https://aws.amazon.com/jp/about-aws/whats-new/2020/04/custom-dictionary-files-now-supported-on-amazon-elasticsearch-service/&#34;&gt;AWSのElasticsearch Serviceでカスタム辞書ファイルを読み込める機能が発表されたようです&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;実は、Elasticsearchの7.4からファイルを使用しなくても日本語のTokenizerでカスタム辞書を利用することができるようになっています。&lt;/p&gt;
&lt;h2 id=&#34;カスタム辞書をインデックスの設定で指定&#34;&gt;カスタム辞書をインデックスの設定で指定&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/plugins/7.4/analysis-kuromoji-tokenizer.html#analysis-kuromoji-tokenizer&#34;&gt;やり方はドキュメントに記載&lt;/a&gt;があります。&lt;/p&gt;
&lt;p&gt;トークナイザーの設定をインデックスの設定に記述しますが、このときに
&lt;code&gt;user_dictionary_rules&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-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;PUT&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;custom_dic_sample&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:#f92672&#34;&gt;&amp;#34;settings&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:#f92672&#34;&gt;&amp;#34;index&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:#f92672&#34;&gt;&amp;#34;analysis&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:#f92672&#34;&gt;&amp;#34;tokenizer&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:#f92672&#34;&gt;&amp;#34;kuromoji_user_dict&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kuromoji_tokenizer&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:#f92672&#34;&gt;&amp;#34;mode&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;extended&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:#f92672&#34;&gt;&amp;#34;user_dictionary_rules&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:#e6db74&#34;&gt;&amp;#34;グランベリーパーク,グランベリー パーク,グランベリー パーク,カスタム名詞&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:#e6db74&#34;&gt;&amp;#34;高輪ゲートウェイ,高輪 ゲートウェイ,タカナワ ゲートウェイ,カスタム名詞&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;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;&amp;#34;analyzer&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:#f92672&#34;&gt;&amp;#34;my_analyzer&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;custom&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:#f92672&#34;&gt;&amp;#34;tokenizer&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kuromoji_user_dict&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;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&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;&amp;quot;単語,出てきてほしい単語列(スペース区切り),読みの単語列(スペース区切り),品詞名&amp;quot;&lt;/code&gt;になります。配列で設定可能で、複数の単語を登録したい場合は、カンマ区切りで登録していきます(上記例では2つの単語を登録しています)。&lt;/p&gt;
&lt;h2 id=&#34;_analyzeを利用して設定の確認&#34;&gt;_analyzeを利用して設定の確認&lt;/h2&gt;
&lt;p&gt;実際に上記の設定がうまく動作するかは&lt;code&gt;_analyze&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-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;GET&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;custom_dic_sample/_analyze&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:#f92672&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;グランベリーパークがオープンしました。&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:#f92672&#34;&gt;&amp;#34;analyzer&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;my_analyzer&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-json&#34; data-lang=&#34;json&#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;&amp;#34;tokens&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;グランベリー&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:#f92672&#34;&gt;&amp;#34;start_offset&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;&amp;#34;end_offset&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;6&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;&amp;#34;type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;word&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:#f92672&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#f92672&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;パーク&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:#f92672&#34;&gt;&amp;#34;start_offset&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;6&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;&amp;#34;end_offset&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;9&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;&amp;#34;type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;word&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:#f92672&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#f92672&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;が&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:#f92672&#34;&gt;&amp;#34;start_offset&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;9&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;&amp;#34;end_offset&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;10&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;&amp;#34;type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;word&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:#f92672&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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:#f92672&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;オープン&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:#f92672&#34;&gt;&amp;#34;start_offset&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;10&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;&amp;#34;end_offset&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;14&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;&amp;#34;type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;word&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:#f92672&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;3&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:#960050;background-color:#1e0010&#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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ちなみに、デフォルトの&lt;code&gt;kuromoji&lt;/code&gt;を利用した場合は、&lt;code&gt;グランベリーパーク&lt;/code&gt;が1単語として出力されます。&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-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;GET&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;_analyze&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:#f92672&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;グランベリーパークがオープンしました。&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:#f92672&#34;&gt;&amp;#34;analyzer&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kuromoji&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;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:#960050;background-color:#1e0010&#34;&gt;##&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#f92672&#34;&gt;&amp;#34;tokens&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;グランベリーパーク&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:#f92672&#34;&gt;&amp;#34;start_offset&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;&amp;#34;end_offset&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;9&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;&amp;#34;type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;word&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:#f92672&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#f92672&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;オープン&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:#f92672&#34;&gt;&amp;#34;start_offset&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;10&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;&amp;#34;end_offset&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;14&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;&amp;#34;type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;word&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:#f92672&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで、カスタム辞書を使用することで&lt;code&gt;グランベリー&lt;/code&gt;で検索された場合に、&lt;code&gt;グランベリーパーク&lt;/code&gt;もヒットするという仕組みです。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;_analyze&lt;/code&gt;は&lt;code&gt;explain&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-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;GET&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;custom_dic_sample/_analyze&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:#f92672&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;グランベリーパークがオープンしました。&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:#f92672&#34;&gt;&amp;#34;analyzer&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;my_analyzer&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:#f92672&#34;&gt;&amp;#34;explain&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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:#960050;background-color:#1e0010&#34;&gt;##&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#f92672&#34;&gt;&amp;#34;detail&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:#f92672&#34;&gt;&amp;#34;custom_analyzer&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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;&amp;#34;charfilters&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:#f92672&#34;&gt;&amp;#34;tokenizer&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:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kuromoji_user_dict&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:#f92672&#34;&gt;&amp;#34;tokens&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;グランベリー&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:#f92672&#34;&gt;&amp;#34;start_offset&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;&amp;#34;end_offset&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;6&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;&amp;#34;type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;word&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:#f92672&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;&amp;#34;baseForm&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;&amp;#34;bytes&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;[e3 82 b0 e3 83 a9 e3 83 b3 e3 83 99 e3 83 aa e3 83 bc]&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:#f92672&#34;&gt;&amp;#34;inflectionForm&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;&amp;#34;inflectionForm (en)&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;&amp;#34;inflectionType&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;&amp;#34;inflectionType (en)&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;&amp;#34;partOfSpeech&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;カスタム名詞&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:#f92672&#34;&gt;&amp;#34;partOfSpeech (en)&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;&amp;#34;positionLength&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;&amp;#34;pronunciation&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;&amp;#34;pronunciation (en)&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;&amp;#34;reading&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;グランベリー&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:#f92672&#34;&gt;&amp;#34;reading (en)&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;guramberi&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:#f92672&#34;&gt;&amp;#34;termFrequency&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;partOfSpeech&lt;/code&gt;にカスタム辞書で設定した&lt;code&gt;カスタム名詞&lt;/code&gt;が出力されていますね。
&lt;code&gt;_analyze&lt;/code&gt;のAPIはこのように、アナライザーの挙動の確認に非常に便利なので是非活用してみてください。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/johtani/analyze-api-ui-plugin&#34;&gt;KibanaでこのAPIを使うためのプラグイン&lt;/a&gt;も開発していますので、こちらも合わせて利用してみてください。&lt;/p&gt;
&lt;h2 id=&#34;注意点&#34;&gt;注意点&lt;/h2&gt;
&lt;p&gt;ちなみに、&lt;code&gt;user_dictionary&lt;/code&gt;と&lt;code&gt;user_dictionary_rules&lt;/code&gt;を&lt;a href=&#34;https://github.com/elastic/elasticsearch/blob/master/plugins/analysis-kuromoji/src/main/java/org/elasticsearch/index/analysis/KuromojiTokenizerFactory.java#L62&#34;&gt;両方指定した場合はエラー&lt;/a&gt;となります。
ファイルをベースにしつつ、追加の設定をするという使い方はできないので、注意しましょう。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;インデックスの設定で書くことにより、バックアップ・リストアは楽になるかな。ただ、クラスターステートに取り込まれるから、あまりにも巨大なカスタム辞書だと心配かなぁ。ファイルの場合はクラスターステートには取り込まれないので、そこは圧迫しない。&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1252790960108400641?ref_src=twsrc%5Etfw&#34;&gt;April 22, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;それ以外の注意点については、別途ブログを書きました。
&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/27/note-updating-dictionary/&#34;&gt;「辞書の更新についての注意点」&lt;/a&gt;、こちらも合わせてご覧ください。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;カスタム辞書をファイルではなくインデックスの設定値として設定する方法を紹介しました。こちらは、Elasticsearch 7.4で導入された機能になります。7.4以降を利用している場合はこちらを利用することも検討してはいかがでしょうか?
また、&lt;code&gt;_analyze&lt;/code&gt; APIも便利なので合わせて活用してみてください。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Rust the book - 第8章</title>
      <link>https://blog.johtani.info/blog/2020/04/16/chap8-rust-the-book/</link>
      <pubDate>Thu, 16 Apr 2020 18:17:30 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/04/16/chap8-rust-the-book/</guid>
      <description>&lt;p&gt;前回の記事はこちら。自分用のメモなので、読みにくいかもです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/23/start-reading-rust-the-book/&#34;&gt;Rust the Bookを読み始めた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/26/chap4-rust-the-book/&#34;&gt;Rust the book - 第4章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/02/chap5-rust-the-book/&#34;&gt;Rust the book - 第5章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/07/chap6-rust-the-book/&#34;&gt;Rust the book - 第6章&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;第8章&#34;&gt;第8章&lt;/h2&gt;
&lt;p&gt;7章はパッケージなので後回しにして、8章に入ります。
8章はコレクションです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;前回の記事はこちら。自分用のメモなので、読みにくいかもです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/23/start-reading-rust-the-book/&#34;&gt;Rust the Bookを読み始めた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/26/chap4-rust-the-book/&#34;&gt;Rust the book - 第4章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/02/chap5-rust-the-book/&#34;&gt;Rust the book - 第5章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/07/chap6-rust-the-book/&#34;&gt;Rust the book - 第6章&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;第8章&#34;&gt;第8章&lt;/h2&gt;
&lt;p&gt;7章はパッケージなので後回しにして、8章に入ります。
8章はコレクションです。&lt;/p&gt;
&lt;h3 id=&#34;ベクタ型&#34;&gt;ベクタ型&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ベクタは同じ型の値だけ保持可能。
&lt;ul&gt;
&lt;li&gt;ジェネリクスで型を指定可能 - &lt;code&gt;Vec&amp;lt;i32&amp;gt;&lt;/code&gt;とか。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vec!&lt;/code&gt;マクロで初期値とか設定すると便利。&lt;/li&gt;
&lt;li&gt;ベクタに値を追加するのは&lt;code&gt;push&lt;/code&gt;。もちろん値が変わるので元のベクタには&lt;code&gt;mut&lt;/code&gt;が必要&lt;/li&gt;
&lt;li&gt;ベクタのスコープ(ライフサイクル)は要素に対する参照があるのとないので話が変わってくる
&lt;ul&gt;
&lt;li&gt;メモリの確保などの影響で、ベクタ全体に対して借用の規則が矯正されると。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ベクタの値を読むのはいくつか方法あり
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;get&lt;/code&gt;メソッドはOptionを返す&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;amp;v[2]&lt;/code&gt;の添字記法の場合はパニックの可能性あり&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;走査(唐突に参照外しが出てきた)
&lt;ul&gt;
&lt;li&gt;単純に値を取り出す場合は&lt;code&gt;for - in &amp;amp;v&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Enumをベクタにいれることで、異なる型も保持可能(まぁ、Enumの型では固定されるけど)。
&lt;ul&gt;
&lt;li&gt;これだけのためにEnumを使うことってあるのかな?&lt;/li&gt;
&lt;li&gt;トレイとオブジェクトに関する文章はちょっとわかりにくい。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;説明以外のメソッドなどについてはAPIドキュメント見ましょうと(リンクも張ってくれてると嬉しいなぁと思ったり。まぁ、バージョンとかの絡みがあるから難しいか)。&lt;/p&gt;
&lt;h3 id=&#34;文字列型&#34;&gt;文字列型&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;文字列はUTF-8でエンコードされた文字を扱うための型。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;str&lt;/code&gt;は文字列データへの参照。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;String&lt;/code&gt;型は言語のコアではなく、標準ライブラリに入っている文字列型。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;他にもあるのか。。。&lt;code&gt;OsString&lt;/code&gt;とか。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;文字リテラルはDisplayトレイトを実装していると。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;.to_string()&lt;/code&gt; = &lt;code&gt;String::from&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stringはコレクションだから追加とかが可能なのか、なるほど。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;push_str&lt;/code&gt;と&lt;code&gt;push&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://doc.rust-jp.rs/book/second-edition/ch08-02-strings.html#a%E6%BC%94%E7%AE%97%E5%AD%90%E3%81%BE%E3%81%9F%E3%81%AFformat%E3%83%9E%E3%82%AF%E3%83%AD%E3%81%A7%E9%80%A3%E7%B5%90&#34;&gt;&lt;code&gt;+&lt;/code&gt;演算子での参照&lt;/a&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;amp;String&lt;/code&gt;は&lt;code&gt;&amp;amp;str&lt;/code&gt;に型強制(キャスト?)してくれる。してくれる場合としてくれない場合もあるのかな?&lt;code&gt;s2&lt;/code&gt;の所有権は奪わない形で扱うので&lt;code&gt;s2&lt;/code&gt;はこのあとも使えていると。&lt;/li&gt;
&lt;li&gt;ここでは、&lt;code&gt;s1&lt;/code&gt;を変更したあとに所有権が&lt;code&gt;s3&lt;/code&gt;に持っていかれてる?&lt;/li&gt;
&lt;li&gt;&lt;code&gt;format!&lt;/code&gt;を使うとどの所有権も奪わないので、これを使うほうが考え方は簡単そう。ただし、効率がいいかはわからん。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;添字記法でのアクセスを&lt;code&gt;String&lt;/code&gt;は許容していない&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文字の境界が必ずしも1バイトとは限らないから。&lt;/li&gt;
&lt;li&gt;スライスも同様。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;基本的には&lt;code&gt;.chars()&lt;/code&gt;で文字としてアクセスするのが良い。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;逆にバイト表現を得る方法はどうするんだろう?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/nlp100-rust/blob/master/src/chapter01/answer.rs#L155&#34;&gt;NLP100本ノックでは&lt;code&gt;encode_utf8&lt;/code&gt;メソッド使ったけど。&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;ハッシュマップ&#34;&gt;ハッシュマップ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;いろんな呼び方あるよね。Rustではハッシュマップだよ。&lt;/li&gt;
&lt;li&gt;ハッシュマップは&lt;code&gt;use&lt;/code&gt;しないと使えない&lt;/li&gt;
&lt;li&gt;キーは1つの型、値も1つの型&lt;/li&gt;
&lt;li&gt;タプルのベクタから&lt;code&gt;collect&lt;/code&gt;で生成。なるほど。
&lt;ul&gt;
&lt;li&gt;タプルのベクタだと、タプルの中身は同じものであることが言える?
&lt;ul&gt;
&lt;li&gt;-&amp;gt; 言える。エレメント数が異なるとコンパイルエラーになった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://doc.rust-jp.rs/book/second-edition/ch08-03-hash-maps.html#a%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%83%9E%E3%83%83%E3%83%97%E3%81%A8%E6%89%80%E6%9C%89%E6%A8%A9&#34;&gt;所有権周りの話。&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;これ、ベクタのときに話してほしい感じがした。&lt;/li&gt;
&lt;li&gt;値を渡すか参照を渡すかによって話が変わってくる。詳しくは10章&lt;/li&gt;
&lt;li&gt;このあたりが自分が混乱していた元だ。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;entry&lt;/code&gt;と&lt;code&gt;insert&lt;/code&gt;の違い
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;entry&lt;/code&gt;の戻り値は&lt;code&gt;Entry&lt;/code&gt;というenumで&lt;code&gt;or_insert&lt;/code&gt;というメソッドがありそれを使うと存在しない場合だけinsertが呼ばれる。
&lt;ul&gt;
&lt;li&gt;これ便利だ。毎回&lt;code&gt;exist&lt;/code&gt;あたりで存在チェックしてた気がする。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;or_insert&lt;/code&gt;は可変参照&lt;code&gt;&amp;amp;mut V&lt;/code&gt;を返す。
&lt;ul&gt;
&lt;li&gt;これを&lt;code&gt;let count&lt;/code&gt;で束縛するときに、中身が可変かどうかをcountには指定しないのか。。。&lt;/li&gt;
&lt;/ul&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;あと、これはRustに限らずですが、それぞれがどんな関数を持っているか、どんなメソッドを持っているか、どんなマクロが存在するかなどを探すときにみんなどうしてるんだろう?
人に教えてもらっているのか、APIリファレンスを探すのか、そういったところをみんながどういう感じにプログラミング言語を勉強しているか、業務で書いているのかと言うのが気になりました。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第1章の03から06まで(言語処理100本ノック2020)</title>
      <link>https://blog.johtani.info/blog/2020/04/09/reboot-nlp100-ch01-03to05/</link>
      <pubDate>Thu, 09 Apr 2020 18:14:55 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/04/09/reboot-nlp100-ch01-03to05/</guid>
      <description>&lt;p&gt;Rustで言語処理100本ノックのリファクタリングの続き。&lt;/p&gt;
&lt;p&gt;前回は&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/08/reboot-nlp10-with-rust/&#34;&gt;こちら&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;コードも載せたほうが見やすいかなぁ?&lt;/p&gt;
&lt;h3 id=&#34;03-円周率&#34;&gt;03. 円周率&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2018/02/19/nlp100-ch01-03to04/#03-%E5%86%86%E5%91%A8%E7%8E%87&#34;&gt;2年前はこちら&lt;/a&gt;。
どちらかというとJavaっぽい書き方かな?
入れ物を用意して、入力を整形して、それからループを回す感じで書いてました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Rustで言語処理100本ノックのリファクタリングの続き。&lt;/p&gt;
&lt;p&gt;前回は&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/08/reboot-nlp10-with-rust/&#34;&gt;こちら&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;コードも載せたほうが見やすいかなぁ?&lt;/p&gt;
&lt;h3 id=&#34;03-円周率&#34;&gt;03. 円周率&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2018/02/19/nlp100-ch01-03to04/#03-%E5%86%86%E5%91%A8%E7%8E%87&#34;&gt;2年前はこちら&lt;/a&gt;。
どちらかというとJavaっぽい書き方かな?
入れ物を用意して、入力を整形して、それからループを回す感じで書いてました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/johtani/nlp100-rust/blob/master/src/chapter01/answer.rs#L50&#34;&gt;今回は1行で収めてみました&lt;/a&gt;。
Rustっぽく、&lt;code&gt;return&lt;/code&gt;を省略してみました。
あとは、Iteratorを組み合わせる感じでやってます。
アルファベットの文字数ということで、&lt;code&gt;is_alphabetic()&lt;/code&gt;メソッドでfilterしてます。&lt;/p&gt;
&lt;h3 id=&#34;04-元素記号&#34;&gt;04. 元素記号&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2018/02/19/nlp100-ch01-03to04/#04-%E5%85%83%E7%B4%A0%E8%A8%98%E5%8F%B7&#34;&gt;2年前はこちら&lt;/a&gt;。
エラー処理が多いのと、文字の扱いがちょっと&lt;/p&gt;
&lt;p&gt;ここまで同様に&lt;a href=&#34;https://github.com/johtani/nlp100-rust/blob/master/src/chapter01/answer.rs#L64&#34;&gt;極力イテレータを利用する&lt;/a&gt;という方針でリファクタリングしました。
あとは、エラー処理を除去してます。
正常系だけのテストなのでスッキリさせました。&lt;/p&gt;
&lt;p&gt;こういった、ストリーム系?の書き方の場合にエラー処理をどう入れるかってところはちょっと悩みどころになるんじゃないかなぁ?と思いつつ、イレギュラーなものは後回しで(あとにやるのかなぁ?)&lt;/p&gt;
&lt;h3 id=&#34;05-n-gram&#34;&gt;05. n-gram&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2018/03/20/nlp100-ch01-05to06/#05-n-gram&#34;&gt;2年前はこちら&lt;/a&gt;。
これまでと同じく、入れ物を作ってから処理をしてます。&lt;/p&gt;
&lt;p&gt;同じく、&lt;a href=&#34;https://github.com/johtani/nlp100-rust/blob/master/src/chapter01/answer.rs#L82&#34;&gt;極力イテレータを利用する形&lt;/a&gt;で実装しました。
いくつか型の変換が必要なので、&lt;code&gt;.map()&lt;/code&gt;を呼び出して詰め替えたりしています。&lt;/p&gt;
&lt;h3 id=&#34;06-集合&#34;&gt;06. 集合&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2018/03/20/nlp100-ch01-05to06/#06-%E9%9B%86%E5%90%88&#34;&gt;2年前はこちら&lt;/a&gt;。
独自に実装しています。&lt;/p&gt;
&lt;p&gt;せっかく&lt;code&gt;05&lt;/code&gt;で文字n-gramの配列を返す処理を実装しているので、
そちらを呼び出して、Setに入れるという処理に書き換えました。
その後の集合に対する処理については特にリファクタリングしてないです。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;2年前にやってたところまでは追いつきました。
07は特にリファクタリングする必要がないので、次は08からの予定です。&lt;/p&gt;
&lt;p&gt;リファクタリングしているときになるのは、速度とかでしょうか。
実装の違いでなにか差が出るのかどうかはちょっと気になるところですが、
今回の目的ではないので、目をつぶって進める予定です。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>言語処理100本ノック、再び</title>
      <link>https://blog.johtani.info/blog/2020/04/08/reboot-nlp10-with-rust/</link>
      <pubDate>Wed, 08 Apr 2020 18:33:45 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/04/08/reboot-nlp10-with-rust/</guid>
      <description>&lt;p&gt;今回もツイートから。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;言語処理100本ノックの2020年版を公開しました。最近の自然言語処理の研究動向を反映し、深層ニューラルネットワークに関する問題を追加しました。留学生も一緒に取り組めるように多言語化を進め、その第１弾として英訳を部分公開しています（40番以降は順次公開予定）。 &lt;a href=&#34;https://t.co/52h362PIQQ&#34;&gt;https://t.co/52h362PIQQ&lt;/a&gt;&lt;/p&gt;&amp;mdash; Naoaki Okazaki (@chokkanorg) &lt;a href=&#34;https://x.com/chokkanorg/status/1247312205671874561?ref_src=twsrc%5Etfw&#34;&gt;April 6, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;&lt;a href=&#34;https://nlp100.github.io/ja/&#34;&gt;言語処理100本ノック&lt;/a&gt;が2020年版になったそうです。
そうです、2年前に初めて、&lt;a href=&#34;https://blog.johtani.info/blog/2018/03/20/nlp100-ch01-05to06/&#34;&gt;準備運動&lt;/a&gt;で止まっていたんです!(衝撃的な続かなさ。。。)&lt;/p&gt;
&lt;p&gt;ということで、Rust the bookも読んでいることだし、過去のプログラムをチェックしつつ再開しようかなと。
ということで、いくつかリファクタリングしてみました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今回もツイートから。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;言語処理100本ノックの2020年版を公開しました。最近の自然言語処理の研究動向を反映し、深層ニューラルネットワークに関する問題を追加しました。留学生も一緒に取り組めるように多言語化を進め、その第１弾として英訳を部分公開しています（40番以降は順次公開予定）。 &lt;a href=&#34;https://t.co/52h362PIQQ&#34;&gt;https://t.co/52h362PIQQ&lt;/a&gt;&lt;/p&gt;&amp;mdash; Naoaki Okazaki (@chokkanorg) &lt;a href=&#34;https://x.com/chokkanorg/status/1247312205671874561?ref_src=twsrc%5Etfw&#34;&gt;April 6, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;&lt;a href=&#34;https://nlp100.github.io/ja/&#34;&gt;言語処理100本ノック&lt;/a&gt;が2020年版になったそうです。
そうです、2年前に初めて、&lt;a href=&#34;https://blog.johtani.info/blog/2018/03/20/nlp100-ch01-05to06/&#34;&gt;準備運動&lt;/a&gt;で止まっていたんです!(衝撃的な続かなさ。。。)&lt;/p&gt;
&lt;p&gt;ということで、Rust the bookも読んでいることだし、過去のプログラムをチェックしつつ再開しようかなと。
ということで、いくつかリファクタリングしてみました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/johtani/nlp100-rust/blob/master/src/chapter01/answer.rs&#34;&gt;ソースはリポジトリ&lt;/a&gt;を御覧ください。&lt;/p&gt;
&lt;h3 id=&#34;00-文字列の逆順&#34;&gt;00. 文字列の逆順&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/johtani/nlp100-rust/blob/5439f96e8521bffe34689c23aa076eb3a2fe817b/src/chapter01/answer.rs#L6&#34;&gt;2年前の実装&lt;/a&gt;では、&lt;code&gt;chars()&lt;/code&gt;メソッドで取り出したあとに、&lt;code&gt;collect()&lt;/code&gt;でVecにしていたのですが、&lt;a href=&#34;https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.rev&#34;&gt;RustのIteratorトレイトに&lt;code&gt;rev()&lt;/code&gt;という便利なメソッドが存在していました&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;ということで、これを取り出すと、最初の文字列の逆順で文字を取り出すIteratorが取得できます。
あとは、&lt;a href=&#34;https://doc.rust-lang.org/std/iter/trait.FromIterator.html#tymethod.from_iter&#34;&gt;Stringが実装してくれている&lt;code&gt;from_iter&lt;/code&gt;&lt;/a&gt;に渡せば文字列が出来上がります。&lt;/p&gt;
&lt;h3 id=&#34;01-パタトクカシーー&#34;&gt;01. 「パタトクカシーー」&lt;/h3&gt;
&lt;p&gt;ストリーム処理っぽい書き方に変更しました。
2年前はIteratorを取り出して、詰替していましたが、
&lt;code&gt;enumerate()&lt;/code&gt;で添字と文字のタプルのイテレータに変換し、
&lt;code&gt;filter&lt;/code&gt;で添字が偶数のときだけフィルタリングして、
&lt;code&gt;map&lt;/code&gt;で対象の文字をまとめたイテレータにします。
で、最後はそれを元に文字列を生成することにしました。
&lt;code&gt;iter&lt;/code&gt;を使わないでそのまま&lt;code&gt;String::from_iter&lt;/code&gt;の引数に渡すことも可能ですね。&lt;/p&gt;
&lt;h3 id=&#34;02-パトカータクシーパタトクカシーー&#34;&gt;02. 「パトカー」＋「タクシー」＝「パタトクカシーー」&lt;/h3&gt;
&lt;p&gt;2年前は&lt;a href=&#34;https://github.com/johtani/nlp100-rust/blob/5439f96e8521bffe34689c23aa076eb3a2fe817b/src/chapter01/answer.rs#L30&#34;&gt;2つのIteratorを&lt;code&gt;loop&lt;/code&gt;で回して頑張って結合してました&lt;/a&gt;。
ではなく、&lt;a href=&#34;https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.zip&#34;&gt;&lt;code&gt;zip()&lt;/code&gt;&lt;/a&gt;を使って、2つのイテレータを組み合わせる方法に替えてみました。
このとき、2つの文字列が違う文字数の場合の処理として、長い方から取り出した文字をあとに結合する処理を追加で記述しました。
ちょっとスマートな感じになりましたかね?&lt;/p&gt;
&lt;p&gt;&lt;code&gt;zip&lt;/code&gt;したあとに出てきたタプルの文字列を結合するのに&lt;code&gt;format!&lt;/code&gt;マクロを使いましたが、他にいい方法有るかなぁ?&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;とりあえず最初の3つをリファクタリングしてみました。
残りもやりつつ、準備運動以降もがんばるぞと。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Rust the book - 第6章</title>
      <link>https://blog.johtani.info/blog/2020/04/07/chap6-rust-the-book/</link>
      <pubDate>Tue, 07 Apr 2020 19:27:11 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/04/07/chap6-rust-the-book/</guid>
      <description>&lt;p&gt;前回の記事はこちら。自分用のメモなので、読みにくいかもです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/23/start-reading-rust-the-book/&#34;&gt;Rust the Bookを読み始めた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/26/chap4-rust-the-book/&#34;&gt;Rust the book - 第4章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/02/chap5-rust-the-book/&#34;&gt;Rust the book - 第5章&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;第6章&#34;&gt;第6章&lt;/h2&gt;
&lt;p&gt;Enumです。&lt;code&gt;match&lt;/code&gt;式に大活躍&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;前回の記事はこちら。自分用のメモなので、読みにくいかもです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/23/start-reading-rust-the-book/&#34;&gt;Rust the Bookを読み始めた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/26/chap4-rust-the-book/&#34;&gt;Rust the book - 第4章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/04/02/chap5-rust-the-book/&#34;&gt;Rust the book - 第5章&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;第6章&#34;&gt;第6章&lt;/h2&gt;
&lt;p&gt;Enumです。&lt;code&gt;match&lt;/code&gt;式に大活躍&lt;/p&gt;
&lt;h3 id=&#34;enumを定義する&#34;&gt;Enumを定義する&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;列挙型は取りうる値をすべて&lt;em&gt;列挙&lt;/em&gt;できる。これが名前の由来&lt;/li&gt;
&lt;li&gt;列挙型と列挙子
&lt;ul&gt;
&lt;li&gt;2連コロン(&lt;code&gt;::&lt;/code&gt;)で列挙子を指定可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;列挙子にデータ(構造体も)が格納可能。
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://doc.rust-lang.org/stable/std/net/enum.IpAddr.html&#34;&gt;標準ライブラリに実装例あり。&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;疑問:&lt;code&gt;Write(String)&lt;/code&gt;とかはタプルの表現になるのかな?
&lt;ul&gt;
&lt;li&gt;と思ったが、タプルでは1つだけの変数を持つものは定義(正確には定義できるが、内部で普通の変数にもどされてるっぽい)できなかった。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;メソッド定義も可能
&lt;ul&gt;
&lt;li&gt;関連関数もできる? -&amp;gt; できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;optionの紹介&#34;&gt;Optionの紹介&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Rustに&lt;code&gt;null&lt;/code&gt;はない。代わりにOptionがある&lt;/li&gt;
&lt;li&gt;Noneを指定する場合に型が必要。Someの場合はすでに値が入るから推測可能なため。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;match制御フロー演算子&#34;&gt;match制御フロー演算子&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;アーム -&amp;gt; matchしたときの処理のこと
&lt;ul&gt;
&lt;li&gt;短い場合は波括弧は不要&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;returnなしでmatchが書いてあるだけだと、慣れない場合に値を返していることに気づかないかも(実際気づけてないかも)&lt;/li&gt;
&lt;li&gt;Enumが値を持っているときに、値の束縛がmatch式で可能&lt;/li&gt;
&lt;li&gt;すべての列挙子を網羅していないことをコンパイラが検知してくれるのはすごく助かる。
&lt;ul&gt;
&lt;li&gt;ただし、&lt;code&gt;_&lt;/code&gt;を利用していなければだけど&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;if-letで簡潔な制御フロー&#34;&gt;if letで簡潔な制御フロー&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;enumで1つのパターンのときに処理をしたい場合に使えるmatchの糖衣構文&lt;/li&gt;
&lt;li&gt;elseもかけるよ。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;enumに慣れていないので、値や構造体を持つenumを利用するという想像ができないことがありそうだなぁと読みながら思いました。
それになれると、色々とプログラムがシンプルに書ける部分が多くなりそうかな。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>KuromojiのCLIコマンドにJSON出力とラティス出力を追加</title>
      <link>https://blog.johtani.info/blog/2020/04/06/update-kuromoji-cli/</link>
      <pubDate>Mon, 06 Apr 2020 12:26:40 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/04/06/update-kuromoji-cli/</guid>
      <description>&lt;p&gt;Kuromoji-CLIの使い方などについては過去のブログを御覧ください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/02/28/kuromoji-cli/&#34;&gt;KuromojiのCLIコマンドとpicocliとGraalVM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/kuromoji-cli&#34;&gt;GitHubリポジトリ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Issueだけ上げていたJSON出力対応をしました。
また、ラティス(後述)の出力対応もしました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Kuromoji-CLIの使い方などについては過去のブログを御覧ください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/02/28/kuromoji-cli/&#34;&gt;KuromojiのCLIコマンドとpicocliとGraalVM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/kuromoji-cli&#34;&gt;GitHubリポジトリ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Issueだけ上げていたJSON出力対応をしました。
また、ラティス(後述)の出力対応もしました。&lt;/p&gt;
&lt;h2 id=&#34;json出力&#34;&gt;JSON出力&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/lindera-morphology/lindera-cli#output-format&#34;&gt;Lindera&lt;/a&gt;がJSON出力に対応してるのでそれを真似しました。
&lt;code&gt;-o json&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-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;% echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;春眠暁を覚えず&amp;#34;&lt;/span&gt; | build/graal/kuromoji -o json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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-json&#34; data-lang=&#34;json&#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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;春眠&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:#f92672&#34;&gt;&amp;#34;detail&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:#e6db74&#34;&gt;&amp;#34;名詞&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:#e6db74&#34;&gt;&amp;#34;一般&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:#e6db74&#34;&gt;&amp;#34;*&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:#e6db74&#34;&gt;&amp;#34;*&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:#e6db74&#34;&gt;&amp;#34;*&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:#e6db74&#34;&gt;&amp;#34;*&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:#e6db74&#34;&gt;&amp;#34;春眠&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:#e6db74&#34;&gt;&amp;#34;シュンミン&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:#e6db74&#34;&gt;&amp;#34;シュンミン&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;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:#f92672&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;暁&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:#f92672&#34;&gt;&amp;#34;detail&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:#e6db74&#34;&gt;&amp;#34;名詞&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:#e6db74&#34;&gt;&amp;#34;一般&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:#e6db74&#34;&gt;&amp;#34;*&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:#e6db74&#34;&gt;&amp;#34;*&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:#e6db74&#34;&gt;&amp;#34;*&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:#e6db74&#34;&gt;&amp;#34;*&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:#e6db74&#34;&gt;&amp;#34;暁&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:#e6db74&#34;&gt;&amp;#34;アカツキ&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:#e6db74&#34;&gt;&amp;#34;アカツキ&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;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:#f92672&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;を&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:#f92672&#34;&gt;&amp;#34;detail&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:#e6db74&#34;&gt;&amp;#34;助詞&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:#e6db74&#34;&gt;&amp;#34;格助詞&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:#e6db74&#34;&gt;&amp;#34;一般&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:#e6db74&#34;&gt;&amp;#34;*&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:#e6db74&#34;&gt;&amp;#34;*&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:#e6db74&#34;&gt;&amp;#34;*&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:#e6db74&#34;&gt;&amp;#34;を&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:#e6db74&#34;&gt;&amp;#34;ヲ&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:#e6db74&#34;&gt;&amp;#34;ヲ&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;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:#f92672&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;覚え&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:#f92672&#34;&gt;&amp;#34;detail&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:#e6db74&#34;&gt;&amp;#34;動詞&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:#e6db74&#34;&gt;&amp;#34;自立&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:#e6db74&#34;&gt;&amp;#34;*&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:#e6db74&#34;&gt;&amp;#34;*&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:#e6db74&#34;&gt;&amp;#34;一段&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:#e6db74&#34;&gt;&amp;#34;未然形&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:#e6db74&#34;&gt;&amp;#34;覚える&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:#e6db74&#34;&gt;&amp;#34;オボエ&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:#e6db74&#34;&gt;&amp;#34;オボエ&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;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:#f92672&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ず&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:#f92672&#34;&gt;&amp;#34;detail&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:#e6db74&#34;&gt;&amp;#34;助動詞&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:#e6db74&#34;&gt;&amp;#34;*&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:#e6db74&#34;&gt;&amp;#34;*&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:#e6db74&#34;&gt;&amp;#34;*&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:#e6db74&#34;&gt;&amp;#34;特殊・ヌ&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:#e6db74&#34;&gt;&amp;#34;連用ニ接続&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:#e6db74&#34;&gt;&amp;#34;ぬ&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:#e6db74&#34;&gt;&amp;#34;ズ&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:#e6db74&#34;&gt;&amp;#34;ズ&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;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;viterbiラティス出力&#34;&gt;Viterbiラティス出力&lt;/h2&gt;
&lt;p&gt;Kuromojiが内部でトークンをどのように切り出すかを計算するためのViterbiのラティスです。これを&lt;a href=&#34;http://www.graphviz.org/&#34;&gt;Graphviz&lt;/a&gt;というツールのDOTフォーマットのファイルとして出力できるメソッドがデバッグ用ですが、Kuromojiに用意されています。
こちらを呼び出して出力するオプション&lt;code&gt;-v&lt;/code&gt;(もしくは&lt;code&gt;--viterbi&lt;/code&gt;)を追加しました。
&lt;strong&gt;注意点として、このオプションを指定すると、DOTファイルが標準出力に出力され、トークンの結果は標準エラーに出力されます。&lt;/strong&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-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;春眠暁を覚えず&amp;#34;&lt;/span&gt; | build/graal/kuromoji -v &amp;gt; viterbi.dot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;.dot&lt;/code&gt;ファイル自体は画像ではないので、Graphvizの&lt;code&gt;dot&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-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dot -Tpng viterbi.dot -oviterbi.png
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで、PNGファイルが出来上がります。出来上がったファイルはこんな感じです。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20200406/viterbi.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20200406/viterbi.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;画像を見ていただくと、緑色のパスがあるのがわかります。
こちらが、Kuromojiが実際に採用した形態素のリストです。それ以外のパスは不採用だったパスとなります。&lt;/p&gt;
&lt;p&gt;ちなみに、macOSで1行で画像表示まで行うにはこんな感じで実行します。
&lt;code&gt;open&lt;/code&gt;コマンドでpreviewアプリを指定することで画像が表示できます。
Windowsは。。。わかりません、すみません。&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-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;% echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;春眠暁を覚えず&amp;#34;&lt;/span&gt; | build/graal/kuromoji -v -o json | dot -Tpng | open -f -a preview.app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;これ以前に複数辞書対応などもしていました。
今回は2つの出力形式を追加してみました。
特にViterbiラティス出力については、内部的にどのようなコスト計算で最終的な結果が出てきているかという理解に役立ちます。想定していない切れ方の場合は、そもそも想定している形態素になっていないか、コスト計算で不採用だったかなどを確認できますので、使ってみると面白いかもです。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Rust the book - 第5章</title>
      <link>https://blog.johtani.info/blog/2020/04/02/chap5-rust-the-book/</link>
      <pubDate>Thu, 02 Apr 2020 15:09:18 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/04/02/chap5-rust-the-book/</guid>
      <description>&lt;p&gt;前回の記事はこちら。自分用のメモなので、読みにくいかもです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/23/start-reading-rust-the-book/&#34;&gt;Rust the Bookを読み始めた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/26/chap4-rust-the-book/&#34;&gt;Rust the book - 第4章&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;第5章&#34;&gt;第5章&lt;/h2&gt;
&lt;p&gt;構造体です。勝手知ったるなんとやら?オブジェクト指向的な部分は問題ないかなぁと。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;前回の記事はこちら。自分用のメモなので、読みにくいかもです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/23/start-reading-rust-the-book/&#34;&gt;Rust the Bookを読み始めた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/26/chap4-rust-the-book/&#34;&gt;Rust the book - 第4章&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;第5章&#34;&gt;第5章&lt;/h2&gt;
&lt;p&gt;構造体です。勝手知ったるなんとやら?オブジェクト指向的な部分は問題ないかなぁと。&lt;/p&gt;
&lt;h3 id=&#34;定義とインスタンス化&#34;&gt;定義とインスタンス化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;struct&lt;/code&gt;で定義&lt;/li&gt;
&lt;li&gt;インスタンスの生成は引数は順不同でOK&lt;/li&gt;
&lt;li&gt;構造体のインスタンスを可変にするとフィールドの値も変更可能
&lt;ul&gt;
&lt;li&gt;特定のフィールドのみ可変にすることは不可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;インスタンス化する関数の最後でreturnなしでインスタンスの返却を暗黙にできる(return書いてほしいな。。。)&lt;/li&gt;
&lt;li&gt;インスタンス化時にフィールド初期化省略記法が可能(これはちょっと便利?)&lt;/li&gt;
&lt;li&gt;構造体更新記法&lt;code&gt;..user1&lt;/code&gt;のように、明示的に設定されていない他のフィールドをコピーしてくれる機能あり&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;タプル構造体&#34;&gt;タプル構造体&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;タプル構造体!? &lt;code&gt;struct Color(i32, i32, i32);&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;いつ使うんだろう?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;ユニット様構造体&#34;&gt;ユニット様構造体&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ユニット様構造体 = フィールドのない構造体。トレイトを実装したいけどインスタンスで持つ値はない場合に利用&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;ライフタイム&#34;&gt;ライフタイム&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;構造体が参照を持つときにライフタイムという話が出てくる。なるほど。
&lt;ul&gt;
&lt;li&gt;ライフタイム指定子が必要になる -&amp;gt; 10章での話&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;プログラム例&#34;&gt;プログラム例&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;タプルを引数かぁ。タプルは慣れないので構造体作りそう&lt;/li&gt;
&lt;li&gt;Debugトレイトと&lt;code&gt;{:?}&lt;/code&gt;という書き方
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;derive(Debug)&lt;/code&gt;でデバッグ用のトレイトを自動で実装=継承してくれる&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{:#?}&lt;/code&gt;だとpretty printになる(改行とか入る)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この辺の便利なトレイとは&lt;a href=&#34;https://doc.rust-jp.rs/book/second-edition/appendix-03-derivable-traits.html&#34;&gt;付録C&lt;/a&gt;にあるらしい。この辺はやりながら覚えるしかないか。&lt;/p&gt;
&lt;h3 id=&#34;メソッド記法&#34;&gt;メソッド記法&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;最初の引数は必ず&lt;code&gt;self&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;impl&lt;/code&gt;は構造体とは別の場所に書く = Javaのクラスとは違う&lt;/li&gt;
&lt;/ul&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Rectangle&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    width: &lt;span style=&#34;color:#66d9ef&#34;&gt;u32&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    height: &lt;span style=&#34;color:#66d9ef&#34;&gt;u32&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;impl&lt;/span&gt; Rectangle {
&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;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;area&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self) -&amp;gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;u32&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self.width &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; self.height
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;参照じゃない&lt;code&gt;self&lt;/code&gt;も使えるらしい。どういうときに使うんだろう?&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;関連関数&#34;&gt;関連関数&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;self&lt;/code&gt;なしの関数をimplにかける。Javaのスタティックメソッドみたいな感じ&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;その他&#34;&gt;その他&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;impl&lt;/code&gt;ブロックがあちこちにかける。これはつらいな。。。&lt;/li&gt;
&lt;li&gt;2つにわかれた&lt;code&gt;impl&lt;/code&gt;ブロックに同じメソッドを書いてみたら、CLionのプラグインではエラーを検知してもらえなかった。
&lt;ul&gt;
&lt;li&gt;cargo buildではきちんとエラーが表示された。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;blockquote&gt;
&lt;p&gt;複数のimplブロックが有用になるケースは第10章で見ますが、そこではジェネリック型と、トレイトについて議論します。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;人の構造体に自分のトレイトを適用したりもできる。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;実験&#34;&gt;実験&lt;/h4&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&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;trait&lt;/span&gt; Hoge {
&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;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;trim&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self);
&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;impl&lt;/span&gt; Hoge &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; String {
&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;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;trim&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self) {
&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;println!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;hogehoge &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self);
&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;let&lt;/span&gt; c &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; String::from(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;hoge&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    c.trim();
&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;println!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, fuga(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;c));
&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;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fuga&lt;/span&gt;(d: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;String) -&amp;gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;str&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    d.trim()
&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;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;hogehoge hoge
hoge
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;気になったのは以下の点。そのうち分かるようになってくるのかな。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;構造体更新記法はどういったときに使うのを想定して作ったんだろう?とか&lt;/li&gt;
&lt;li&gt;可変長引数はマクロじゃないとだめ&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>自宅の作業環境(2020)</title>
      <link>https://blog.johtani.info/blog/2020/03/26/working-facility/</link>
      <pubDate>Thu, 26 Mar 2020 19:11:51 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/03/26/working-facility/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.smokeymonkey.net/2020/03/wfh.html&#34;&gt;すもけさんが在宅勤務環境をブログ&lt;/a&gt;に書いてておもしろそうだな(あと、アフィリンク貼れるな)と思ったので自分の環境も書いてみようかなと。&lt;/p&gt;
&lt;p&gt;私自身は昨今の新型コロナウイルスの影響というのではなく、もう10年以上自宅でも作業ができる環境を整えています。
前前職の頃から家でも仕事をすることがよくあったので。今は、お客さんに恵まれていてリモートができる形で働かせていただいてます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://www.smokeymonkey.net/2020/03/wfh.html&#34;&gt;すもけさんが在宅勤務環境をブログ&lt;/a&gt;に書いてておもしろそうだな(あと、アフィリンク貼れるな)と思ったので自分の環境も書いてみようかなと。&lt;/p&gt;
&lt;p&gt;私自身は昨今の新型コロナウイルスの影響というのではなく、もう10年以上自宅でも作業ができる環境を整えています。
前前職の頃から家でも仕事をすることがよくあったので。今は、お客さんに恵まれていてリモートができる形で働かせていただいてます。&lt;/p&gt;
&lt;p&gt;机周りはこんな感じです。机はこれも15年以上前から使用しているエレクターの机です。椅子も15年以上前から使っているアーロンチェア(購入時は高いと思ったけど、これだけ使えているので大満足)です。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20200327/my_desk.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20200327/my_desk.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;メインのPCはMac Book Pro16インチを使っています。それとは別にMac miniがMac bookの後ろに隠れています。こっちはブラウジングや音楽を聞いたりするために使っています。&lt;/p&gt;
&lt;p&gt;まずはディスプレイ周りから。&lt;/p&gt;
&lt;h2 id=&#34;ディスプレイ周り&#34;&gt;ディスプレイ周り&lt;/h2&gt;
&lt;h3 id=&#34;ディスプレイ&#34;&gt;ディスプレイ&lt;/h3&gt;
&lt;p&gt;Acerの31インチディスプレイです。昨年の夏に購入しました。28インチの4Kディスプレイを探していたのですが、セールか何かで2-3000円の違いでこのサイズが買えたので、このサイズになっちゃいました。Mac Book ProはDisplay port-USB-Cケーブルで接続し、PS4をHDMIで接続しています。
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B0771DQYT5/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51pzzbdOrpL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B0771DQYT5/?tag=johtani-22&#34;&gt;
      【Amazon.co.jp 限定】Acer モニター ディスプレイ ET322QKwmiipx 31.5インチ
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;マイクの左側に写っているのはAppleのサンダーボルトディスプレイです。縦にしてブラウザやミュージックプレイヤーなどで音楽かけながら仕事をしています。
サブディスプレイって感じです。
Mac Book ProとMac miniの両方を操作するのですが、できれば同じキーボード+トラックパッドがいいなということで、&lt;a href=&#34;https://symless.com/synergy&#34;&gt;Synergy&lt;/a&gt;というソフトを使って、Mac Book Proのキーボードとマウスでネットワーク越しにMac miniを操作しています。ただ、マシンの再起動後などにこのソフトが起動していない場合もあるので、Mac Book Proの右側にMac miniのためのトラックパッドがおいてあります。&lt;/p&gt;
&lt;h3 id=&#34;ディスプレイアーム&#34;&gt;ディスプレイアーム&lt;/h3&gt;
&lt;p&gt;ディスプレイはそれぞれディスプレイアームを使っています。写真のようにMac Book Proを下に、外部ディスプレイを上にという上下で作業をしています。
16インチの画面だと普通のディスプレイの足だとメインディスプレイにかぶってしまうので、アームに切り替えました。
最初はグリーンハウスの激安を使っていたのですが、31インチのディスプレイだとアームの高さが足りなかったので、2つ目のガススプリング式のアームを追加で購入しました。ガススプリング式なのに5千円しないので、かなりお得感があります。ただ、ディスプレイは基本的に動かさないので、どちらかというとディスプレイの足の部分を効率良く使うことが目的です。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B072MYML17/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/315jvp&amp;#43;902L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B072MYML17/?tag=johtani-22&#34;&gt;
      Amazon | グリーンハウス 液晶ディスプレイアーム 4軸 クランプ式
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07C2DBDNC/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/31kFSKSWUTL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07C2DBDNC/?tag=johtani-22&#34;&gt;
      Amazon | HUANUO PC モニター アーム 液晶ディスプレイ アーム ガススプリング式
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;サウンド関連&#34;&gt;サウンド関連&lt;/h2&gt;
&lt;h3 id=&#34;スピーカー&#34;&gt;スピーカー&lt;/h3&gt;
&lt;p&gt;基本、音楽を聞きながら作業をするので、小型だけどしっかりと音がでるスピーカーを買いました。スタイルもいいし気に入ってます。
入力が2系統あるので、31インチディスプレイのヘッドフォン出力とMac miniのからの出力の2つをつないでいます。
仕事中はMac miniで音楽流しつつ、テレカンやゲームのときはメインディスプレイからの音が出る形です。
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B00CY6RCJU/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51Gh6Kh5GbL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B00CY6RCJU/?tag=johtani-22&#34;&gt;
      Amazon | ヤマハ パワードスピーカー NX-50
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h3 id=&#34;マイク&#34;&gt;マイク&lt;/h3&gt;
&lt;p&gt;前職がDeveloper Advocateということで、インタビューなどに行くこともあるかも?ということで小さめのも運びができるコンデンサマイクを購入してました。結局それほど持ち運びはしてないのですが、値段の割には音がいいんじゃないかな?一応、無指向と単一指向の2種類を切り替えることが可能です。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B001R76D42/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41NFYfWP0vL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B001R76D42/?tag=johtani-22&#34;&gt;
      Amazon | SAMSON マイク ポータブル USB コンデンサ Go Mic | コンデンサ | 楽器
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;マイクスタンド&#34;&gt;マイクスタンド&lt;/h3&gt;
&lt;p&gt;マイクはあったのですが、クリップ式でした。PCのディスプレイにクリップしていると、打鍵音を拾ってしまうので、マイクスタンドを最近導入しました。やすかったです。
前まではヘッドフォンのケーブルに付いているマイクで喋っていたのですが、服によってはマイクに擦れてしまい、ノイズが載っていました。
マイクスタンド+スピーカーでもスピーカーの音をマイクが拾わないので、最近はヘッドフォンを使用しないで気楽に話ができるようになっています。
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07Q8KVZWX/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/417h8kXC84L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07Q8KVZWX/?tag=johtani-22&#34;&gt;
      Amazon | Luling Arts マイクスタンド アーム 
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h2 id=&#34;その他&#34;&gt;その他&lt;/h2&gt;
&lt;h3 id=&#34;モニタスタンド&#34;&gt;モニタスタンド&lt;/h3&gt;
&lt;p&gt;Mac Book Proの後ろで見えにくいですが、Mac miniが下に入っていて、上にMac mini用のキーボード、スピーカー、Qiの充電パッドが載せてあります。
Mac miniのキーボードをじゃまにならないように置きたいという目的で購入しました。3次元で空間が利用できるので結構重宝してます。
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B0081MNH5E/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/31peje&amp;#43;WrvL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B0081MNH5E/?tag=johtani-22&#34;&gt;
      Amazon | サンワサプライ 机上液晶モニタスタンド(D200・黒) MR-LC303BK
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h3 id=&#34;充電関連&#34;&gt;充電関連&lt;/h3&gt;
&lt;p&gt;スマホ充電用にスピーカーの横においてあります。ただ、スイートスポットを探すのがちょっと大変で、時々充電できてないことがあったりします。。。
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07FT2PHKM/?tag=johtani-22&#34;&gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07FT2PHKM/?tag=johtani-22&#34;&gt;
      Amazon | DesertWest Qi 急速充電ワイヤレス充電器 【Qi認証済み/PSEマーク付き】15W 
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;USBでの様々な充電用にはMercariさんのカンファレンスでいただいたAnkerの充電器をおいてあります。Mi Band 4、キーボードなどの充電向けです。
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B00PK27K5Q/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/31RWjzgadDL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B00PK27K5Q/?tag=johtani-22&#34;&gt;
      Amazon | Anker PowerPort 6(60W 6ポート USB急速充電器) 
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;簡単ですが作業環境でした。だいたい満足しています。もうちょっと改善したいなと思っているのは次の点です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;USB-Cドック?ハブ?みたいなものがほしい
&lt;ul&gt;
&lt;li&gt;充電ケーブル、マイク、ディスプレイケーブル、有線LANの4つのケーブルがMac Book Proに刺さっており、ポートが全滅です。出先から帰ったときにつなぐのも少し面倒なので、1つか2つのポートでまとめられるといいなぁと思っています。が、ドック系はいい値段するのでまだ置き換わっていない感じです。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;スタンディングデスクが気になる
&lt;ul&gt;
&lt;li&gt;自宅でずっと座っているのはやはり気になるもので。スタンディングデスクにして時々たって作業したいなぁと思うことがあります。ただ、使ったことがないので、どれがいいのかわからず手を出せない状況です。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ウェブカメラいる?
&lt;ul&gt;
&lt;li&gt;Mac Book Proのカメラでオンラインミーティングなどしています。気にするほどのことではないとは思いますが、メインディスプレイを見ながらしゃべると下からカメラで撮影されている形になります。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今のところはこんな形です。なにかの参考になればと。
あと、なにかおすすめのもの(特にスタンディングデスク)があれば教えて下さい!&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Rust the book - 第4章</title>
      <link>https://blog.johtani.info/blog/2020/03/26/chap4-rust-the-book/</link>
      <pubDate>Thu, 26 Mar 2020 17:12:11 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/03/26/chap4-rust-the-book/</guid>
      <description>&lt;p&gt;前回の記事はこちら。自分用のメモなので、読みにくいかもです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/23/start-reading-rust-the-book/&#34;&gt;Rust the Bookを読み始めた&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;第4章&#34;&gt;第4章&lt;/h2&gt;
&lt;p&gt;第4章です。たぶん、これがいちばん大事な概念だと思います、Rustの。
そして、つまみ食いしながらRust書いてましたが、ここがきちんと理解できないまま書いてたってのもあります。。。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;前回の記事はこちら。自分用のメモなので、読みにくいかもです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/23/start-reading-rust-the-book/&#34;&gt;Rust the Bookを読み始めた&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;第4章&#34;&gt;第4章&lt;/h2&gt;
&lt;p&gt;第4章です。たぶん、これがいちばん大事な概念だと思います、Rustの。
そして、つまみ食いしながらRust書いてましたが、ここがきちんと理解できないまま書いてたってのもあります。。。&lt;/p&gt;
&lt;h3 id=&#34;所有権とは&#34;&gt;所有権とは?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;drop&lt;/code&gt;関数ってのがあって、明示的に呼ぶことも可能。次のような感じで。2つ目の&lt;code&gt;println!&lt;/code&gt;はエラーになる。sがもう無いのに借用しようとしてるから。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;fn main() {
    let mut s = String::from(&amp;#34;hello&amp;#34;);
    s.push_str(&amp;#34;, world!&amp;#34;);
    println!(&amp;#34;{}&amp;#34;, s);
    drop(s);
    println!(&amp;#34;{}&amp;#34;, s);
}
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;ムーブ - shallow copyではない。以下の2行目がムーブ。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;let s1 = String::from(&amp;#34;hello&amp;#34;);
let s2 = s1;

println!(&amp;#34;{}, world!&amp;#34;, s1);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;スタックとヒープの話が絡んでくる。あんまり意識すること無いよなぁ。
スタック = 固定長のデータを入れる場所。ポインタ、数値など
ヒープ = 可変長のデータが入る場所。可変の文字列とか。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クローン - ヒープのデータをコピーすること。&lt;/li&gt;
&lt;li&gt;コピー - スタックに収まるデータの場合はクローンが必要なくコピーで事足りる。
&lt;ul&gt;
&lt;li&gt;CopyトレイトとDropトレイトは同居できない。&lt;/li&gt;
&lt;li&gt;タプルのコピーはややこしそう&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://doc.rust-jp.rs/book/second-edition/ch04-01-what-is-ownership.html#a%E6%89%80%E6%9C%89%E6%A8%A9%E3%81%A8%E9%96%A2%E6%95%B0&#34;&gt;所有権と関数&lt;/a&gt;でまた、スタックに入れられるような変数と可変のオブジェクトの違いが出てくる。
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;takes_ownership(s: String)&lt;/code&gt;が参照を受け取れば問題なく、このあとも使える。&lt;/li&gt;
&lt;li&gt;戻り値でもムーブが発生&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;参照と借用&#34;&gt;参照と借用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;借用 - 関数の引数に参照を取ること&lt;/li&gt;
&lt;li&gt;可変な参照&lt;code&gt;&amp;amp;mut&lt;/code&gt;は1つ(不変な参照も含めて1つ)しか許さない
&lt;ul&gt;
&lt;li&gt;データの競合を防ぐため。&lt;/li&gt;
&lt;li&gt;不変な参照を複数用いるのはOK&lt;/li&gt;
&lt;li&gt;実際に変更が実行されるタイミングでエラーと判定される場合もある。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;let mut s = String::from(&amp;#34;hello&amp;#34;);

{
    let r1 = &amp;amp;mut s;

} // r1はここでスコープを抜けるので、問題なく新しい参照を作ることができる

let r2 = &amp;amp;mut s;
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;ダングリング参照はテスト書くときとかにやってるかも。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;fn dangle() -&amp;gt; &amp;amp;String { // dangleはStringへの参照を返す

    let s = String::from(&amp;#34;hello&amp;#34;); // sは新しいString

    &amp;amp;s // String sへの参照を返す
} // ここで、sはスコープを抜け、ドロップされる。そのメモリは消される。
  // 危険だ
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;スライス型&#34;&gt;スライス型&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;部分的な参照。開始位置+長さで構成されているっぽい&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;amp;str&lt;/code&gt;の説明がよくわからなかった。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://doc.rust-jp.rs/book/second-edition/ch04-03-slices.html#a%E5%BC%95%E6%95%B0%E3%81%A8%E3%81%97%E3%81%A6%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E3%82%B9%E3%83%A9%E3%82%A4%E3%82%B9&#34;&gt;引数としての文字列スライス&lt;/a&gt;のテクニックは色々と使いまわせそう。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;所有権、これまで特に難しいと思ってたのは、固定長の変数と、可変長の変数の違いを意識してなかったのが原因っぽい。
まぁ、Vecとかがどうなるのかとか、他にもいくつか気になるところはあるので、もうちょっとやらないといけないなと思いました。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>ElasticsearchのAnalyze APIのVisual Studio Codeのクライアントプラグイン</title>
      <link>https://blog.johtani.info/blog/2020/03/25/vsc-es-analzye-plugin/</link>
      <pubDate>Wed, 25 Mar 2020 11:10:05 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/03/25/vsc-es-analzye-plugin/</guid>
      <description>&lt;p&gt;先日、&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/19/azure-search-analyze-plugin&#34;&gt;Visual Studio Codeのプラグインを作ってみた(Azure Search Analyze Client)&lt;/a&gt;というブログを書きました。
このプラグインを作ってたタイミングで、Elasticの河村さん経由で、&lt;a href=&#34;https://msdevjp.connpass.com/event/169431/&#34;&gt;Microsoft Open Tech Night #9 w/ Elastic&lt;/a&gt;でなにかLTしませんか?という打診がありました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;先日、&lt;a href=&#34;https://blog.johtani.info/blog/2020/03/19/azure-search-analyze-plugin&#34;&gt;Visual Studio Codeのプラグインを作ってみた(Azure Search Analyze Client)&lt;/a&gt;というブログを書きました。
このプラグインを作ってたタイミングで、Elasticの河村さん経由で、&lt;a href=&#34;https://msdevjp.connpass.com/event/169431/&#34;&gt;Microsoft Open Tech Night #9 w/ Elastic&lt;/a&gt;でなにかLTしませんか?という打診がありました。&lt;/p&gt;
&lt;p&gt;仕組み的には似たようなものだし、Elasticsearch用の拡張機能も作れるし、発表のネタにもなるし一石二鳥では?ということで、LTを快諾し、昨日発表してきました。&lt;/p&gt;
&lt;h2 id=&#34;資料とか&#34;&gt;資料とか&lt;/h2&gt;
&lt;p&gt;発表資料やGitHubのリポジトリなどは、以下のとおりです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;発表資料 : &lt;a href=&#34;https://noti.st/johtani/vDhbXW/analyze-api-vs-code&#34;&gt;Analyze APIのVS Codeプラグインを作ってみた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub Repository : &lt;a href=&#34;https://github.com/johtani/vs-code-es-analyze-client&#34;&gt;https://github.com/johtani/vs-code-es-analyze-client&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=johtani.elasticsearch-analyze-api-client&#34;&gt;Visual Studio Code Marketplaceページ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;機能&#34;&gt;機能&lt;/h2&gt;
&lt;p&gt;まだ、必要最低限の機能を実装した感じです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Analyze APIのパラメータ入力用のエディタ起動(&lt;code&gt;Elasticsearch Analyze Client: Create Elasticsearch Analyze Request&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Esにリクエストを送信して結果の表示&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;インストールからリクエスト送信して結果が出てくるまでのデモです。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20200325/plugin-demo.gif&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20200325/plugin-demo.gif&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;1点LTのデモのときに話すのを忘れていましたが、&lt;code&gt;.esanalyze&lt;/code&gt;という拡張子のファイルであれば、このプラグインが入力値を見つけ出して、「&lt;code&gt;Analyze text with analyzers&lt;/code&gt;」というコマンド送信用のリンクをエディタ画面に表示する機能があります。
ですので、パラメータ入力用のエディタを起動し、値を設定したあとにファイルを&lt;code&gt;hoge.esanalyze&lt;/code&gt;というような名前で保存してもらえれば、後日そのファイルを開くことでリクエストが再送できます。&lt;/p&gt;
&lt;h3 id=&#34;azure-search版との機能の違い&#34;&gt;Azure Search版との機能の違い&lt;/h3&gt;
&lt;p&gt;先日のAzure Search向けのクライアントとの違いがいくつかあります。
ElasticsearchのAnalyze APIの方が多機能であるため、プラグインとしても違いがあったほうがいいかなと。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;入力がJSON形式&lt;/li&gt;
&lt;li&gt;結果画面に詳細表示切り替えボタンを追加&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;現時点では対応していませんが、&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-analyze.html#analyze-api-custom-analyzer-ex&#34;&gt;Analyze APIはカスタムのtokenizer、filter、char_filterの設定を入力として受け付けることが可能です&lt;/a&gt;。そのときに指定するのはJSON形式でtokenizerなどの設定を記述します。
今後、これらの対応をすることを考えると、入力全体をJSON形式で読み込めるほうがわかりやすいかなということで、入力はJSON形式で入力してもらうことを想定しました。&lt;/p&gt;
&lt;p&gt;結果画面に詳細表示切り替えボタンを追加したのは、2つの理由があります。1つはAzure SearchのAnalyze APIよりもTokenの情報としていくつか他の情報も存在するためです。複数のAnalyzerとの比較をする場合は、単語列だけを比較したいですが、Analyzer個別の詳細情報を見たい場合もあるので、切り替えができたほうがよいかなと。
2つ目の理由はまだ実装していませんが、&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-analyze.html#explain-analyze-api&#34;&gt;explainパラメータの出力&lt;/a&gt;への対応のためです。
explainパラメータを指定すると、カスタムAnalyzerの場合に、Analyzerの設定にあるchar_filter、tokenizer、token_filterのそれぞれのステップでの単語列の出力が結果として返ってきます。この結果には標準の出力よりもさらに多くのtokenの情報(例えば、kuromojiだと品詞情報、読み、原型など)が追加されてきます。これらの表示を切り替えることができたほうがよいかと。&lt;/p&gt;
&lt;p&gt;これらは、実は&lt;a href=&#34;https://github.com/johtani/analyze-api-ui-plugin/blob/master/docs/GETTING_STARTED.md#3-show-analyzed-result-of-custom-analyzer&#34;&gt;Kibanaのプラグインとしてすでに実装済み&lt;/a&gt;になっています。
同等の機能は実装できるかなという目論見もあり、そちらに合わせた感じにしてあります。&lt;/p&gt;
&lt;h2 id=&#34;今後の対応&#34;&gt;今後の対応&lt;/h2&gt;
&lt;p&gt;現時点では、Analyzer名の指定のみが可能となっています。Kibanaのプラグインと同程度の機能はGitHubのIssueとして登録してみました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/vs-code-es-analyze-client/issues/5&#34;&gt;explainパラメータ対応&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/vs-code-es-analyze-client/issues/3&#34;&gt;fieldパラメータ対応&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/vs-code-es-analyze-client/issues/4&#34;&gt;custom analyzer対応&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;その他に、インデックス名やアナライザ名の自動補完みたいな機能があると便利かも?と妄想していたりします(実装が大変かもですが。。。)。Kibanaのプラグインの場合は、Mappingやインデックス名を調べるときに、KibanaのConsoleからチェックすればよかったのですが、このプラグイン単体だとそのあたりの情報の取得に他のツール(Kibanaだったり、REST API Clientだったり)を使わないといけないという問題点はあるかなぁと。&lt;/p&gt;
&lt;p&gt;あとは、結果画面がこのままで本当に見やすいかどうか?なども気になってはいます。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;まだまだ、作ってみたというレベルのプラグインです。
どのくらいの人に使ってもらえるかもわかりませんが、こんな機能あるといい?など要望があればリクエストいただければと。
Twitterで聞いていただいてもいいですし、GitHubのIssueとして登録していただいても構いません。
そもそもいらないなぁなんて意見でももちろん大歓迎です。フィードバックお待ちしてます!&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Analyze APIのVS Codeプラグインを作ってみた</title>
      <link>https://blog.johtani.info/presentation/2020/analyze-api-vs-code/</link>
      <pubDate>Tue, 24 Mar 2020 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2020/analyze-api-vs-code/</guid>
      <description></description>
      <content:encoded></content:encoded>
    </item>
    
    <item>
      <title>Rust the Bookを読み始めた</title>
      <link>https://blog.johtani.info/blog/2020/03/23/start-reading-rust-the-book/</link>
      <pubDate>Mon, 23 Mar 2020 10:57:22 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/03/23/start-reading-rust-the-book/</guid>
      <description>&lt;p&gt;自転車本を読み始めましたが、その前にRust the bookを読んだほうが良いかも?と知り合いと話をしていてなったので、先にRust the bookを読み始めてます。
コツコツ読むってのが苦手なので、知り合いと小規模オンライン読書会しながら読むことになりました(基本的になにか書きながら、使い方を調べるので、存在そのものを知らない記述や使用法などがあったりする)。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;自転車本を読み始めましたが、その前にRust the bookを読んだほうが良いかも?と知り合いと話をしていてなったので、先にRust the bookを読み始めてます。
コツコツ読むってのが苦手なので、知り合いと小規模オンライン読書会しながら読むことになりました(基本的になにか書きながら、使い方を調べるので、存在そのものを知らない記述や使用法などがあったりする)。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://doc.rust-jp.rs/book/second-edition/&#34;&gt;日本語版Rust the book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://doc.rust-lang.org/book/title-page.html&#34;&gt;Rust the book&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;基本は日本語版を読んでいます。まずは1章から3章あたり。&lt;/p&gt;
&lt;p&gt;気になった点などを。自分用のメモなので、読みやすさとかは考えてないです(あとで自分が死ぬパターン?)。&lt;/p&gt;
&lt;h2 id=&#34;1章&#34;&gt;1章&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;rustfmt便利。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CLionのRustプラグインでは、保存時にrustfmtするというオプションがある。デフォルトはオフ。&amp;ldquo;Run rustfmt on Save&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cargoの&lt;code&gt;--bin&lt;/code&gt;オプション。意識してつけたことなかった=デフォルトだった。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ライブラリにするときは&lt;code&gt;--lib&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;2章&#34;&gt;2章&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;「変数を値に束縛」という言い回しにまだ慣れない。
&lt;ul&gt;
&lt;li&gt;「代入」という言い方に慣れているから?&lt;/li&gt;
&lt;li&gt;ただ、エラーにはassignってあるな。&amp;ldquo;error[E0384]: cannot assign twice to immutable variable &lt;code&gt;x&lt;/code&gt;&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;preludeというのがデフォルトで読み込まれる型が存在する場所。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.expect()&lt;/code&gt;により、Resultが評価済みになる&lt;/li&gt;
&lt;li&gt;マクロがまだ慣れない&lt;/li&gt;
&lt;li&gt;&lt;code&gt;extern crate rand;&lt;/code&gt;が&lt;a href=&#34;https://doc.rust-lang.org/book/ch02-00-guessing-game-tutorial.html#generating-a-random-number&#34;&gt;最新版だと要らなくなっている&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rand::Rng&lt;/code&gt;は&lt;code&gt;gen_range&lt;/code&gt;のためにuseしている。CLionだとかってにuseを推測して追加してくれた。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;match&lt;/code&gt;はswitch文みたいな感じ。けど、defaultが必ず実行されるって感じではないな。
&lt;ul&gt;
&lt;li&gt;ただし、全て網羅しないと怒られるのが便利。&lt;/li&gt;
&lt;li&gt;アームという呼び方が新鮮&lt;/li&gt;
&lt;li&gt;単一の式のときは{}が省略できる&lt;/li&gt;
&lt;li&gt;ブロック{}のときは、終わりにカンマを入力するとrustfmtが除去する(最後の条件かどうかは関係ない)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;シャドーイングは面白い。
&lt;ul&gt;
&lt;li&gt;よく、&lt;code&gt;hoge_str&lt;/code&gt;や&lt;code&gt;hoge_int&lt;/code&gt;のような変数を書くので、ありがたい。&lt;/li&gt;
&lt;li&gt;ただし、コードを読むときに少し混乱しそう?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;let ... match&lt;/code&gt;で変数への束縛でmatchが使えるのは便利(これまで知らなかったので、変数宣言して条件つけて束縛する処理書いてた)。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;シャドーイング&#34;&gt;シャドーイング?&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;fn main() {
    let x = 5;

    let x = x + 1;

    let x = x * 2;

    println!(&amp;#34;The value of x is: {}&amp;#34;, x);
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;とか&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;let spaces = &amp;#34;   &amp;#34;;
let spaces = spaces.len();
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;みたいに、同一変数名を使い回せること。再代入ではない&lt;/p&gt;
&lt;h2 id=&#34;3章&#34;&gt;3章&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;constは型注釈が必須&lt;/li&gt;
&lt;li&gt;&lt;code&gt;100_000&lt;/code&gt;のような記述が便利(&lt;a href=&#34;https://docs.oracle.com/javase/jp/8/docs/technotes/guides/language/underscores-literals.html&#34;&gt;Javaもできるって言われてびっくりしたw&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;タプルの中身を一部だけ書き換え可能。(mutを指定すれば)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tup.0 = 20;&lt;/code&gt;のような感じで。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;配列は固定長でかつ、同一の型のものだけが入る&lt;/li&gt;
&lt;li&gt;文末にセミコロンがない場合に四季になるというのはちょっと射にくいので辛いのでは。。。
&lt;ul&gt;
&lt;li&gt;自分は明示的に&lt;code&gt;return&lt;/code&gt;を書きたくなる。が、returnだと動かない場合もある。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;let ... if&lt;/code&gt;のような記述もできる。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(1..4)&lt;/code&gt;はRange型&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;おまけ&#34;&gt;おまけ&lt;/h3&gt;
&lt;p&gt;フィボナッチ数列計算してみろというのがまとめにあったので。こんな感じでいいのかな?&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;fn calc_fibonacci(n: usize) -&amp;gt; usize {
    if n == 0 {
        return 0;
    } else if n==1 {
        return 1;
    } else {
        return calc_fibonacci(n-1) + calc_fibonacci(n-2);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;その他&#34;&gt;その他&lt;/h2&gt;
&lt;p&gt;知り合いと読みすすめると、人が不思議に思ったところが、自分が理解が曖昧だったことなどに気づけて便利です。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Visual Studio Codeのプラグインを作ってみた(Azure Search Analyze Client)</title>
      <link>https://blog.johtani.info/blog/2020/03/19/azure-search-analyze-plugin/</link>
      <pubDate>Thu, 19 Mar 2020 10:50:15 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/03/19/azure-search-analyze-plugin/</guid>
      <description>&lt;h2 id=&#34;動機&#34;&gt;動機&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/search-what-is-azure-search&#34;&gt;Azure Cognitive Search&lt;/a&gt;を検索エンジンに使っているお客さんを手伝っています。
そこで、&lt;a href=&#34;https://noti.st/johtani/halVGM&#34;&gt;検索の基本的な話&lt;/a&gt;をさせていただきました(もともとJJUGナイトセミナーでしゃべる予定だったスライドがベース)。&lt;/p&gt;
&lt;p&gt;で、Elasticsearchなどの転置インデックスを利用している検索エンジンで検索の基本的な動作がどうなっているかを理解するのに、
個人的には一番重要だと思っているのがAnalysis(Analyze)の機能です。
転置インデックスの単語の切り出し方がどうなっているかによって、望んだ単語でうまく検索できているかいないかなどがわかります。&lt;/p&gt;</description>
      <content:encoded>&lt;h2 id=&#34;動機&#34;&gt;動機&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/search-what-is-azure-search&#34;&gt;Azure Cognitive Search&lt;/a&gt;を検索エンジンに使っているお客さんを手伝っています。
そこで、&lt;a href=&#34;https://noti.st/johtani/halVGM&#34;&gt;検索の基本的な話&lt;/a&gt;をさせていただきました(もともとJJUGナイトセミナーでしゃべる予定だったスライドがベース)。&lt;/p&gt;
&lt;p&gt;で、Elasticsearchなどの転置インデックスを利用している検索エンジンで検索の基本的な動作がどうなっているかを理解するのに、
個人的には一番重要だと思っているのがAnalysis(Analyze)の機能です。
転置インデックスの単語の切り出し方がどうなっているかによって、望んだ単語でうまく検索できているかいないかなどがわかります。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.microsoft.com/ja-jp/rest/api/searchservice/test-analyzer&#34;&gt;Azure Cognitive SearchもAnalyze Text&lt;/a&gt;というAPIを提供してくれています(内部的にはElasticsearchだし)。
APIはあるのですが、返ってくる結果はJSONです。また、他のAnalyzerの設定との違いなどをみたくなったりもします。
やはり、普段使っているツールなどで簡単にどういう単語が出てくるかがわかるとうれしんじゃないかなぁ?と。&lt;/p&gt;
&lt;p&gt;ということで、最初はPythonでちょっとAPI呼び出して、カンマ区切りで出力するものを作ってみたのですが、GUIとかあると便利かなぁという話になりました。
最近、ブログ書いたりするのにVisual Studio Codeを使い始めているので、これなら使いやすいかなと。
ということで、Visual Studio Codeの拡張機能(プラグイン?)としてインストールできる&lt;a href=&#34;https://github.com/johtani/azure-search-analyze-client&#34;&gt;ツール&lt;/a&gt;を作ってみました。
Azure Cognitive Searchを使っている人向けなので、ニッチなツールですが。。。&lt;/p&gt;
&lt;h3 id=&#34;余談&#34;&gt;余談&lt;/h3&gt;
&lt;p&gt;Elastic Stack(Elasticsearch)向けにはKibanaのプラグインでAnalyze APIを可視化するツールを作ってます。
&lt;a href=&#34;https://github.com/johtani/analyze-api-ui-plugin&#34;&gt;analyze-api-ui-plugin&lt;/a&gt;です。Elastic Stack、特にKibanaを必ず利用する方はこちらを使うと便利かもです。&lt;/p&gt;
&lt;h2 id=&#34;概要と機能&#34;&gt;概要と機能&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/azure-search-analyze-client&#34;&gt;GitHub リポジトリ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=johtani.azure-search-analyze-client&amp;amp;ssr=false#overview&#34;&gt;Visual Studio Marketplaceのページ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Marketplaceに公開しているので、&lt;code&gt;johtani&lt;/code&gt;や&lt;code&gt;Azure Search Analyze Client&lt;/code&gt;などで検索してもらえれば出てきてインストールができます。&lt;/p&gt;
&lt;p&gt;機能としては、以下の2つです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;テンプレートから入力値設定用のドキュメントを作成(&lt;code&gt;Untitled-1&lt;/code&gt;というドキュメントをエディタに新しく開く)&lt;/li&gt;
&lt;li&gt;Azure Cognitive SearchのAnalyze Text APIを呼び出して、結果をHTMLのテーブル形式で表示&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;入力値設定用のドキュメント作成&#34;&gt;入力値設定用のドキュメント作成&lt;/h3&gt;
&lt;p&gt;APIの呼び出しに必要な情報を記入してもらうのに、いくつか案を考えました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プラグインの設定に記入してもらう&lt;/li&gt;
&lt;li&gt;環境変数とかを読み出す&lt;/li&gt;
&lt;li&gt;テキストとして保存したファイルを使う&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;設定や環境変数だと、異なる環境に接続したりするときに、わざわざ設定し直すのがめんどくさいかもと。
で、愛用していた&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=humao.rest-client&#34;&gt;REST API Client&lt;/a&gt;を真似するのが良いかもという結論になり、&lt;code&gt;.analyze&lt;/code&gt;という拡張子のファイルから必要な項目を読み出して、APIを呼び出す形にしてあります。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Command Palette&lt;/code&gt;(左下の歯車マークもしくは、メニューのViewから開ける)から&lt;code&gt;Azure Search Analyze Client: Create Azure Search Analyze Request&lt;/code&gt;というコマンドを選びます。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20200319/command_palette.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20200319/command_palette.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;すると、以下のようなファイルがエディタに開きます。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20200319/input_template.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20200319/input_template.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;これらの項目をまずは埋めていきます。
それぞれの値がどういったものかは&lt;a href=&#34;https://github.com/johtani/azure-search-analyze-client&#34;&gt;GitHubのREADME&lt;/a&gt;を御覧ください。&lt;/p&gt;
&lt;p&gt;入力値エラー(存在チェックしかしていない)がある場合は、ダイアログが表示されます。&lt;/p&gt;
&lt;h3 id=&#34;結果表示&#34;&gt;結果表示&lt;/h3&gt;
&lt;p&gt;値を入力したら、設定値と&lt;code&gt;###&lt;/code&gt;の間に表示されている&lt;code&gt;Analyze text with analyzers&lt;/code&gt;というグレーの文字をクリックします。すると、APIにリクエストを送信し、結果が返ってきて、別のパネルとして表示されます。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20200319/response.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20200319/response.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;複数のAnalyzerを入力値に設定すると、それぞれがどのような区切り方をするかがわかります。
文字の下にある&lt;code&gt;[0:2]&lt;/code&gt;は、その単語がもとの文章の何文字目から何文字目までに出現しているかというオフセットの表示になります。&lt;/p&gt;
&lt;p&gt;もし、Analyzer名の設定ミスなどで指定されたAnalyzerがない場合は、結果画面にエラーが表示されるようにしています。&lt;/p&gt;
&lt;p&gt;以上が簡単な機能の説明です。
簡単なと言いつつ、これだけしか機能がありませんが。&lt;/p&gt;
&lt;h2 id=&#34;visual-studio-codeのプラグインの作り方&#34;&gt;Visual Studio Codeのプラグインの作り方&lt;/h2&gt;
&lt;p&gt;プラグイン自体の作り方に関しては&lt;a href=&#34;https://code.visualstudio.com/api/get-started/your-first-extension&#34;&gt;Visual Studio CodeのGetting Started&lt;/a&gt;がわかりやすかったです。
APIや機能が豊富なので、最初はちょっと戸惑いましたが、&lt;a href=&#34;https://github.com/microsoft/vscode-extension-samples&#34;&gt;サンプルもGitHubで多数公開&lt;/a&gt;されています。&lt;/p&gt;
&lt;p&gt;あとは、&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=humao.rest-client&#34;&gt;REST API Client&lt;/a&gt;を参考にさせていただきました。&lt;/p&gt;
&lt;p&gt;Getting Startedを一通り読むことで、なんとなくプラグインの作成からMarketplaceへのリリースまでが完了できました。
(TypeScriptに慣れていないのがあるので、プログラミング自体は手間取りましたが。。。)&lt;/p&gt;
&lt;h2 id=&#34;今後の対応&#34;&gt;今後の対応?&lt;/h2&gt;
&lt;p&gt;いまのところ、こんなところを考えていますが、こんな機能がほしい、バグが有るなどあれば、GitHubにIssueを上げていただければと(使う人すくないだろうけど)。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;いろいろなエラーに関する対応&lt;/li&gt;
&lt;li&gt;Readmeに画像をアップ&lt;/li&gt;
&lt;li&gt;アイコン作成?&lt;/li&gt;
&lt;li&gt;自動補完機能?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Visual Studio Codeの拡張機能を作ってみました。
Yeomanによるプロジェクトテンプレートが用意されているので、とりあえず、Hello worldを作るのは簡単でした。
試行錯誤しつつTypeScriptを書いたので、TypeScriptっぽくないところなどもあるかもですが、誰かの役に立つツールになってくれれば良いなぁと。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>本当にその検索は自分が想像している検索になってますか？</title>
      <link>https://blog.johtani.info/presentation/2020/halvgm/</link>
      <pubDate>Thu, 05 Mar 2020 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2020/halvgm/</guid>
      <description></description>
      <content:encoded></content:encoded>
    </item>
    
    <item>
      <title>実践Rust入門の3章を読み終わった</title>
      <link>https://blog.johtani.info/blog/2020/03/02/finish-bicycle-book-chap3/</link>
      <pubDate>Mon, 02 Mar 2020 18:20:13 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/03/02/finish-bicycle-book-chap3/</guid>
      <description>&lt;p&gt;これまで&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/31/start-reading-bicycle-book&#34;&gt;実践Rust入門はじめました&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/02/23/bicycle-book-chap3&#34;&gt;実践Rust入門の3章を読んでるところ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;3章終了&#34;&gt;3章終了&lt;/h2&gt;
&lt;p&gt;3章の終わりまで読み終えた。&lt;/p&gt;
&lt;p&gt;いきなり実践的なプログラムで少し面食らっていたが、ステップを追って所有権周りの話まで来たので、
なんとなくRustのいいところが理解できたような気がする。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;これまで&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/31/start-reading-bicycle-book&#34;&gt;実践Rust入門はじめました&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/02/23/bicycle-book-chap3&#34;&gt;実践Rust入門の3章を読んでるところ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;3章終了&#34;&gt;3章終了&lt;/h2&gt;
&lt;p&gt;3章の終わりまで読み終えた。&lt;/p&gt;
&lt;p&gt;いきなり実践的なプログラムで少し面食らっていたが、ステップを追って所有権周りの話まで来たので、
なんとなくRustのいいところが理解できたような気がする。&lt;/p&gt;
&lt;p&gt;ただ、最後の&lt;code&gt;split_at_mut&lt;/code&gt;が実際には内部でどういう形に変換することによって、コンパイルエラーにならずに、
借用がうまく行っているのかあたりは、まだきちんと理解できていない。&lt;/p&gt;
&lt;p&gt;これは、どの言語にも言えるんだけど、リファレンスをうまく読み解きながら、
自分がやりたい処理ができるかどうかを考えるのって結構むずかしいなぁと思う。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;benchmark.rs&lt;/code&gt;はコピペして実行しただけなので、またあとで読み返してみるかな。&lt;/p&gt;
&lt;p&gt;ということで、ここから先は、基本を勉強する感じで4章から読みつつ、なんかプログラムをまた書いてみるか。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>KuromojiのCLIコマンドとpicocliとGraalVM</title>
      <link>https://blog.johtani.info/blog/2020/02/28/kuromoji-cli/</link>
      <pubDate>Fri, 28 Feb 2020 11:49:39 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/02/28/kuromoji-cli/</guid>
      <description>&lt;h2 id=&#34;kuromoji-cli&#34;&gt;Kuromoji-CLI&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://qiita.com/mosuka/items/0fdaaf91f5530d427dc7&#34;&gt;Rust初心者がRust製の日本語形態素解析器の開発を引き継いでみた&lt;/a&gt;という記事にありますが、LinderaというRust製の日本語形態素解析が出てきました。KuromojiのRustクローンみたいなものです。
で、作者の人とのチャットの中で、「MeCabみたいなKuromojiのCLIないですかね？誰か知りませんか？」という話になりました。&lt;/p&gt;
&lt;p&gt;自分は普段はKuromojiの確認をするのは、Elasticsearch関連もしくは、Azure Searchなどだったりするので、
当たり前のようにKibanaを立ち上げたり、REST APIを叩いてましたが、たしかにコマンドラインインタフェースあると便利かも?
と思い、作ってみるかということに。&lt;/p&gt;</description>
      <content:encoded>&lt;h2 id=&#34;kuromoji-cli&#34;&gt;Kuromoji-CLI&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://qiita.com/mosuka/items/0fdaaf91f5530d427dc7&#34;&gt;Rust初心者がRust製の日本語形態素解析器の開発を引き継いでみた&lt;/a&gt;という記事にありますが、LinderaというRust製の日本語形態素解析が出てきました。KuromojiのRustクローンみたいなものです。
で、作者の人とのチャットの中で、「MeCabみたいなKuromojiのCLIないですかね？誰か知りませんか？」という話になりました。&lt;/p&gt;
&lt;p&gt;自分は普段はKuromojiの確認をするのは、Elasticsearch関連もしくは、Azure Searchなどだったりするので、
当たり前のようにKibanaを立ち上げたり、REST APIを叩いてましたが、たしかにコマンドラインインタフェースあると便利かも?
と思い、作ってみるかということに。&lt;/p&gt;
&lt;h2 id=&#34;picocli&#34;&gt;picocli&lt;/h2&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;いま、JavaでかんたんなCLI作るとなったら何がおすすめ？&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1232486871772459009?ref_src=twsrc%5Etfw&#34;&gt;February 26, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;で、いつものツイートです。で、&lt;a href=&#34;https://github.com/remkop/picocli&#34;&gt;picocli&lt;/a&gt;という返信がありました。
JavaでCLIのプログラムを書くのが簡単になりそうだと。
&lt;a href=&#34;https://picocli.info/&#34;&gt;ドキュメント&lt;/a&gt;もしっかりしてます。サンプルも載ってるし。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/johtani/kuromoji-cli/blob/master/src/main/java/info/johtani/misc/cli/kuromoji/KuromojiCli.java#L38&#34;&gt;Annotationで、コマンドの説明などパラメータ、オプションなどが記述でき、必須チェックなども可能です&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;また、オプションの説明文に関しては、テンプレートを用いることで、取りうる値をEnumの値で出力してくれたりといった便利機能まで備わっていました。&lt;/p&gt;
&lt;h2 id=&#34;graalvm&#34;&gt;GraalVM&lt;/h2&gt;
&lt;p&gt;また、&lt;a href=&#34;https://remkop.github.io/presentations/20190906/&#34;&gt;GRAALVMとPICOCLIでJAVAのネイティブコマンドラインアプリを作ろう&lt;/a&gt;というスライドも教えてもらい、ネイティブコマンドまで作れるらしいと。
なんて便利なんでしょう!ってことで、こちらもチャレンジしてみました。
GraalVMがどんなものかはなんとなくは知ってたのですが、何者だろう?とツイートしたところ、これまた返信が。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;っ 資料はかなり古いので現行版と乖離はあるけど概念は変わってないので..&lt;a href=&#34;https://t.co/KRQjhNdD9f&#34;&gt;https://t.co/KRQjhNdD9f&lt;/a&gt;&lt;/p&gt;&amp;mdash; たむたむ🏫 (@tamtam180) &lt;a href=&#34;https://x.com/tamtam180/status/1232654053458399233?ref_src=twsrc%5Etfw&#34;&gt;February 26, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;!--{{ 20220805 鍵付きツイートに変わっていたので &lt;tweet user=&#34;kitayama_t&#34; id=&#34;1232657370410389505&#34;&gt; }}--&gt;
&lt;p&gt;本当に、Twitter便利ですね。&lt;/p&gt;
&lt;p&gt;GraalVMがどんなものかもいただいた資料でサクッと理解できました。
ただ、picocliが実はものすごく良くできており、自分でインストールする必要も実はありませんでした。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/palantir/gradle-graal&#34;&gt;gradle-graal&lt;/a&gt;というGradleのプラグインと、
&lt;a href=&#34;https://github.com/remkop/picocli/tree/master/picocli-codegen&#34;&gt;Picocli Code Generation&lt;/a&gt;を利用することで、
以下のコマンドを実行することで、ネイティブコマンドアプリが作成できました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;gradle nativeImage
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;build.gradle&lt;/code&gt;ファイルに記述したのは、以下のような項目です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/kuromoji-cli/blob/master/build.gradle#L4&#34;&gt;pluginの利用&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/kuromoji-cli/blob/master/build.gradle#L28&#34;&gt;picocli-codegenをannotationProcessorとして呼び出し&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/kuromoji-cli/blob/master/build.gradle#L39&#34;&gt;jarに関する記述(メインクラスと依存するJarを含める設定)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/kuromoji-cli/blob/master/build.gradle#L46&#34;&gt;ネイティブコマンドの名前とか(gradle-graalの設定)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;辞書が読み込めなかった&#34;&gt;辞書が読み込めなかった&lt;/h2&gt;
&lt;p&gt;で、native imageを作って実行しましたが、Kuromojiが内包している辞書ファイルが読み込めませんでした。
どうやら、picocli-codegenの自動生成では対応できない、リソース関連設定が必要らしいと。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/remkop/picocli/tree/master/picocli-codegen#other-options&#34;&gt;picocli-godegenの設定&lt;/a&gt;を見ていて見つけたのが、&lt;code&gt;other.resource.patterns&lt;/code&gt;というオプションでした。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/johtani/kuromoji-cli/blob/master/build.gradle#L35&#34;&gt;kuromoji-cliのbuild.gradleに&lt;/a&gt;、その設定を加えたら辞書が読み込めるようになりました。&lt;/p&gt;
&lt;p&gt;この設定をどうやって書くのか?というのを探すのにちょっと時間がかかりました。Picocli作者のRemko Popmaさんの&lt;a href=&#34;https://github.com/remkop/picocli-native-image-demo/blob/master/build.gradle&#34;&gt;サンプルリポジトリに設定を利用した&lt;code&gt;build.gradle&lt;/code&gt;&lt;/a&gt;がありました。サンプル本当にありがたいですね。&lt;/p&gt;
&lt;h2 id=&#34;完成&#34;&gt;完成&lt;/h2&gt;
&lt;p&gt;出来上がったのは、&lt;a href=&#34;https://github.com/johtani/kuromoji-cli&#34;&gt;kuromoji-cli&lt;/a&gt;というリポジトリになります。
内部で利用しているのはAtilikaのKuromojiです。LuceneのKuromojiではないのでご注意を(LuceneのKuromojiで最初やってみたのですが、リフレクションなどが多用されてて、Single Imageにするのが手間がかかりそうだった)。
コマンドのポータビリティはそれほど無いと理解してる(あってる?)ので、利用してみたい方は、リポジトリをクローンしてからビルドしてみてください。&lt;/p&gt;
&lt;h3 id=&#34;参考資料&#34;&gt;参考資料&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.atilika.com/ja/kuromoji/&#34;&gt;kuromoji&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://picocli.info/&#34;&gt;Picocliドキュメント&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.slideshare.net/tamrin69/getting-started-graalvm&#34;&gt;Getting Started GraalVM / GraalVM超入門&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://speakerdeck.com/hhiroshell/graalvm-for-beginners&#34;&gt;一体何モノなの? GraalVM入門編 / GraalVM for beginners&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まだ途中&#34;&gt;まだ途中?&lt;/h2&gt;
&lt;p&gt;ほかにもあると便利かも?という機能があればIssueやPRを上げてください。
とりあえず、頭にあるのは以下のとおりです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JSONの出力はまだ未対応&lt;/li&gt;
&lt;li&gt;いろんな辞書をAtilikaのKuromojiはサポートしてるのでそのへんも対応してみる?&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>実践Rust入門の3章を読んでるところ</title>
      <link>https://blog.johtani.info/blog/2020/02/23/bicycle-book-chap3/</link>
      <pubDate>Sun, 23 Feb 2020 16:37:17 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/02/23/bicycle-book-chap3/</guid>
      <description>&lt;p&gt;これまでのはこちら。読書メモなので、本と合わせて読んでいただくのが良いです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/31/start-reading-bicycle-book&#34;&gt;実践Rust入門はじめました&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3章のクイックツアーを読んでます。
バイトニックソート自体の理解はちょっとおいておいて、読み進めています。
いくつか疑問に思ったことがあったので、またメモを。
まだ、3.5.7の手前ですが。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;これまでのはこちら。読書メモなので、本と合わせて読んでいただくのが良いです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/31/start-reading-bicycle-book&#34;&gt;実践Rust入門はじめました&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3章のクイックツアーを読んでます。
バイトニックソート自体の理解はちょっとおいておいて、読み進めています。
いくつか疑問に思ったことがあったので、またメモを。
まだ、3.5.7の手前ですが。&lt;/p&gt;
&lt;h2 id=&#34;疑問点&#34;&gt;疑問点&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;3.4.1のジェネリクス対応のテストケースの部分で、既存のu32用のテストケースの入力のデータ列に&lt;code&gt;Vec&amp;lt;u32&amp;gt;&lt;/code&gt;という型注釈をつけるのですが、
追加した文字列の入力データには注釈をここではつけないのはなんでなんだろう?&lt;em&gt;ちなみに、なくても動いた。バージョンの違いとかあるのかしら?&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3.4.6のmatch文&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;match&lt;/code&gt;文の引数?が&lt;code&gt;*order&lt;/code&gt;になっていたが、&lt;code&gt;order&lt;/code&gt;でも実行できた。引数にくるのが参照だから&lt;code&gt;*&lt;/code&gt;が付いてるんだとも運だが、なくても動くのはコンパイラがよしなに解釈してくれてるからかな?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;便利なツール&#34;&gt;便利なツール&lt;/h2&gt;
&lt;p&gt;Rust標準のツールの説明がいくつか3章で紹介されてて便利だったのでメモ。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;rustfmt&lt;/li&gt;
&lt;/ol&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-zsh&#34; data-lang=&#34;zsh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustfmt ファイル名
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;という形で使えるみたい。
プロジェクトごとだと&lt;code&gt;cargo fmt&lt;/code&gt;のほうが楽そうかな。&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;標準ライブラリAPIドキュメントをブラウザで閲覧&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;rustup doc --std
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これでデフォルトブラウザでRustの公式ドキュメントが開きます。
しかもローカルファイルだからサクサク。検索バーもついてて便利です。&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;エラーのドキュメントを閲覧&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;rustc --explain 308
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;コンパイル時にエラーが出たときに、&lt;code&gt;error[E0308]&lt;/code&gt;のようにコンソールに出てきます。
ヒントも出てくるのですが、詳細が上記のコマンドで読めるみたいです。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>2019年に買ってよかったもの</title>
      <link>https://blog.johtani.info/blog/2020/02/21/best-buy-2019/</link>
      <pubDate>Fri, 21 Feb 2020 17:05:02 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/02/21/best-buy-2019/</guid>
      <description>&lt;p&gt;もう2020年2月になってしまってますが、2019年に買って便利だったもの良かったものをいくつか記録に残しとこうかなと。&lt;/p&gt;
&lt;h2 id=&#34;bravia-kj-55x9500g&#34;&gt;BRAVIA KJ-55X9500G&lt;/h2&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07QLK1L4B/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51C3dTiPEuL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07QLK1L4B/?tag=johtani-22&#34;&gt;
      Amazon | ソニー SONY 49V型 液晶 テレビ ブラビア 4Kチューナー内蔵
      &lt;/a&gt;
    &lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;もう2020年2月になってしまってますが、2019年に買って便利だったもの良かったものをいくつか記録に残しとこうかなと。&lt;/p&gt;
&lt;h2 id=&#34;bravia-kj-55x9500g&#34;&gt;BRAVIA KJ-55X9500G&lt;/h2&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07QLK1L4B/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51C3dTiPEuL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07QLK1L4B/?tag=johtani-22&#34;&gt;
      Amazon | ソニー SONY 49V型 液晶 テレビ ブラビア 4Kチューナー内蔵
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;テレビをやっと買い替えました。
前に使っていたのはプラズマディスプレイで、10年以上たったもので、パネルの一部が赤い残像が残ってたりしました。
もう流石にいいでしょうということで、買い替えたのがSonyのテレビです。
4Kのチューナーもついているし、アップコンバーターもついているので普通の地上波でもきれいです。
まぁ、10年前のテレビに比べればたくさんいいことがありますよねw&lt;/p&gt;
&lt;p&gt;新しいTV買って一番活躍してるのはYouTubeボタンだったりします。
最近はミュージックビデオがYouTubeにたくさんあるので、King Gnuなどの音楽流したりするのに便利です(テレビなのに)。
今は、プライムビデオボタンがより活用される感じになってきてます(テレビなのにw)。&lt;/p&gt;
&lt;h2 id=&#34;sodastream&#34;&gt;Sodastream&lt;/h2&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07SJ71CS6/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41byl2ieA0L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07SJ71CS6/?tag=johtani-22&#34;&gt;
      Amazon｜スピリット ワンタッチ ホワイト スターターキット
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;ここ数年、炭酸を普段飲んでます。甘いもの飲まないようにって意味でも。。。
で、これを買うまでは、サントリーの天然水スパークリングレモンとかを、箱買いしてました。
が、まぁ、ペットボトルのゴミが半端ないんですよ。場所も取るし。&lt;/p&gt;
&lt;p&gt;ソーダストリームのことは知ってたのですが、自分で炭酸の量を考えながら、入れないといけないので避けていました。&lt;/p&gt;
&lt;p&gt;が、今回購入したものは、水の入ったボトルを指して、ボタン一つで3段階の炭酸を入れることができるんです!買って本当に重宝してます。うちでは1Lのボトルを1本追加して、2本で運用してます。
家族はなっちゃんのオレンジとかを炭酸割りしたり、カルピスソーダ作ったりして楽しんでます。
ワンタッチということで、簡単に入れられるので家族も重宝してます。&lt;/p&gt;
&lt;h2 id=&#34;nature-remo--chromecast&#34;&gt;Nature Remo + Chromecast&lt;/h2&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07CWNLHJ8/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/318xtUlwkjS._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07CWNLHJ8/?tag=johtani-22&#34;&gt;
      Amazon | Nature スマートリモコン Nature Remo mini Remo-2W1 
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Google Home miniがキャンペーンで手に入ったので、ベッドルームの照明やクーラーの操作もできそうなのでNature Remoを導入しました。
Chromecastは余っている液晶モニターにつないで、スマホからキャストできるようにしたり、音楽聞けるようにしてあります。&lt;/p&gt;
&lt;p&gt;Nature Remoは温度計などもついているので、部屋の温度に合わせてエアコンのオンオフなども可能で、
暑い夏にとても便利でした。寝る時間にはクーラーが入っているのですんなり寝れたりと。
スマホから電源オンオフできるのも便利ですね。
Chromecastはモニターにつなぎましたが、今は、Google Music Playのプレーヤーになってます。
(最近、家にあるCDを読み込んでGoogle Play Musicにアップしてる)。&lt;/p&gt;
&lt;p&gt;ただ、それ以上のことには使えてないので、もうちょっと面白いことしてみないとなぁ。&lt;/p&gt;
&lt;h2 id=&#34;モニターアーム&#34;&gt;モニターアーム&lt;/h2&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07C2DBDNC/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/31kFSKSWUTL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07C2DBDNC/?tag=johtani-22&#34;&gt;
      Amazon | HUANUO PC モニター アーム 液晶ディスプレイ アーム ガススプリング式
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B072MYML17/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/315jvp&amp;#43;902L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B072MYML17/?tag=johtani-22&#34;&gt;
      Amazon | グリーンハウス 液晶ディスプレイアーム 4軸 クランプ式
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;ディスプレイがふるくなってたので、4Kディスプレイに買い替えた(27インチで4万切るとかで安い。。。)んですが、Mac Book Pro 15インチ(今は16インチ)を使っていて、Macの画面がディスプレイにかぶるので
モニターアームを買いました。
1つ目がガススプリング式のアームです。なのに、5000円を切ってるんですよ。おそるべし。
2つ目はクランプ式です。アームにしたものの特に動かすことはなく、高さを出したいだけってことがあるので、クランプ式のも使ってます(家ではディスプレイ2枚使ってる)。
コスパ最高です。&lt;/p&gt;
&lt;h2 id=&#34;anker-powercore-10000-pd&#34;&gt;Anker PowerCore 10000 PD&lt;/h2&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07L4M82CK/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41vsdSJ4I4L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07L4M82CK/?tag=johtani-22&#34;&gt;
      Amazon | Anker PowerCore 10000 PD（10000mAh PD対応最小最軽量 大容量 モバイルバッテリー）
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Pixel 3にしてから、電池の持ちはよくはなってるんですが、もしもの時のためにモバイルバッテリーは話せないですよね。
PD対応なので、Pixel 3に急速充電ができるし、サイズもそれほどじゃまにならないサイズなので便利です。USB-Aもついているので、このあと紹介するイヤホンの充電ケーブルなんかも差し込めて大活躍です。&lt;/p&gt;
&lt;h2 id=&#34;サウンドピーツのイヤホン&#34;&gt;サウンドピーツのイヤホン&lt;/h2&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B083J83LBH/?tag=johtani-22&#34;&gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B083J83LBH/?tag=johtani-22&#34;&gt;
      Amazon | SOUNDPEATS(サウンドピーツ) Q35HD ワイヤレス イヤホン 高音質・低遅延 IPX8防水 
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;私が持ってるのはこの前のバージョンで、micro-USBで充電するタイプですが、こちらもコスパ最高です。
冬は防寒も兼ねてヘッドフォンをしているのですが、春から秋にかけてはこれまで、優先のイヤホンを使ってました。もしくは、Bluetoothのレシーバーに優先のイヤホンつけてました。電池切れたら、イヤホンさして使う感じで。
が、Pixel 3はイヤホンジャックがありません。ということで、ワイヤレスイヤホンに移行するかということで選んだのがこちらです。
世の中的には、完全ワイヤレスイヤホンが流行っていますが、片方無くなってしまうイメージしかわかなくて。。。
これが壊れても、完全ワイヤレスではなくつながったワイヤレスイヤホンを使うと思います。&lt;/p&gt;
&lt;h2 id=&#34;ヘッドルーペ&#34;&gt;ヘッドルーペ&lt;/h2&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B072J8HLN6/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41TjrlzmKgL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B072J8HLN6/?tag=johtani-22&#34;&gt;
      Amazon | Tumao ヘッドルーペ ルーペ メガネ LED付拡大鏡 眼鏡の上装着 メガネゴムバンド両用 5レンズ交換調節 
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;プラモデルをちょいちょい作るんですが、もう年ですね。。。細かいところが見にくくて。
ガンダムのRG系のプラモデルだと、1/144なんですよ。小さいんですよ。見えないんですよ。。。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;完成しましたー！ &lt;a href=&#34;https://t.co/S9QTS4kJDI&#34;&gt;pic.twitter.com/S9QTS4kJDI&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1229033901139451907?ref_src=twsrc%5Etfw&#34;&gt;February 16, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;ということで、ヘッドルーペ導入してみました。
最初は、卓上に置けるルーペにしてみたんですが、自分がルーペがあるところに動かないといけないの結構つらくて。
これのおかげで、プラモデル作成に問題はなくなりました。老眼とは関係なく、ちょっと猫背になっちゃうのが今は悩みの種ですが。。。こたつで作ってるからなぁ。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、いくつかよかったものを紹介してみました。
今年はちゃんと年末に書こう。。。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>ブログ移行日記(その5) - Jugemのブログを移行</title>
      <link>https://blog.johtani.info/blog/2020/02/21/import-jugem-posts/</link>
      <pubDate>Fri, 21 Feb 2020 12:04:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/02/21/import-jugem-posts/</guid>
      <description>&lt;p&gt;ブログ移行日記(その5)です。前回まではこちら&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/22/intro-hugo-and-theme/&#34;&gt;ブログ移行日記(その1)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/23/convert-md-from-octopress-to-hugo/&#34;&gt;ブログ移行日記(その2)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/24/setting-hugo/&#34;&gt;ブログ移行日記(その3)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/28/introduce-algolia/&#34;&gt;ブログ移行日記(その4)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回はこれまでとは異なる特殊な話です。&lt;/p&gt;
&lt;p&gt;最初にブログを書き始めたときに利用していたのが&lt;a href=&#34;http://johtani.jugem.jp/&#34;&gt;Jugem&lt;/a&gt;のブログでした。
その後、Octopressに移行して、今年、Hugoに移行したという流れです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ブログ移行日記(その5)です。前回まではこちら&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/22/intro-hugo-and-theme/&#34;&gt;ブログ移行日記(その1)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/23/convert-md-from-octopress-to-hugo/&#34;&gt;ブログ移行日記(その2)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/24/setting-hugo/&#34;&gt;ブログ移行日記(その3)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/28/introduce-algolia/&#34;&gt;ブログ移行日記(その4)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回はこれまでとは異なる特殊な話です。&lt;/p&gt;
&lt;p&gt;最初にブログを書き始めたときに利用していたのが&lt;a href=&#34;http://johtani.jugem.jp/&#34;&gt;Jugem&lt;/a&gt;のブログでした。
その後、Octopressに移行して、今年、Hugoに移行したという流れです。&lt;/p&gt;
&lt;p&gt;で、よくよく考えると、Jugemのブログも移行できるんじゃないか?となりました。
じゃあ、やってみるかと。なので、今回のブログは自分の備忘録です(興味のない人が大多数じゃないかな)。
一応、&lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo/blob/master/from_jugem_to_hugo.py&#34;&gt;Pythonで書いたプログラムはGitHubに上がっています&lt;/a&gt;。文字列置換と正規表現のオンパレードです。&lt;/p&gt;
&lt;h2 id=&#34;jugemからexport&#34;&gt;JugemからExport&lt;/h2&gt;
&lt;p&gt;まずは、移行元のデータが取り出せるかどうかを調べたところ、&lt;a href=&#34;https://support.jugem.jp/hc/ja/articles/222313727-%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E8%A8%98%E4%BA%8B%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AF%E5%87%BA%E6%9D%A5%E3%81%BE%E3%81%99%E3%81%8B-&#34;&gt;text形式もしくはXML形式でエクスポートが可能でした&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;変換処理が必要なはずなので、XMLでダウンロードします。
独自のXMLですが、&lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo/blob/master/from_jugem_to_hugo.py#L239&#34;&gt;記事ごとにXMLのタグ(&lt;code&gt;&amp;lt;entry&amp;gt;&lt;/code&gt;)でまとめられている&lt;/a&gt;ので、処理が楽です。&lt;/p&gt;
&lt;h2 id=&#34;xmlをmarkdownに&#34;&gt;XMLをMarkdownに&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;entry&amp;gt;&lt;/code&gt;タグの下に次のような項目が入っているので、&lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo/blob/master/from_jugem_to_hugo.py#L204&#34;&gt;抜き出します&lt;/a&gt;。&lt;/p&gt;
&lt;h3 id=&#34;ヘッダ部&#34;&gt;ヘッダ部&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;title - 記事タイトル&lt;/li&gt;
&lt;li&gt;author - 著者&lt;/li&gt;
&lt;li&gt;category - タグ&lt;/li&gt;
&lt;li&gt;date - 投稿日付&lt;/li&gt;
&lt;li&gt;description : 本文(先頭部分)&lt;/li&gt;
&lt;li&gt;sequel : 本文(つづき)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;titleからdateまでをHugoのMarkdownの&lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo/blob/master/from_jugem_to_hugo.py#L204&#34;&gt;ヘッダ部分として出力します&lt;/a&gt;。
&lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo/blob/master/from_jugem_to_hugo.py#L38&#34;&gt;日付は形式が違うので合わせるように変換&lt;/a&gt;し、
titleは&lt;code&gt;(Jugemより移植)&lt;/code&gt;という文字列を追加しました。&lt;/p&gt;
&lt;p&gt;また、Hugoの個別のコンテンツにするためにそれぞれをMarkdownのファイルに変換しています。
ファイル名は変換後の&lt;code&gt;date&lt;/code&gt;の先頭10文字(&lt;code&gt;yyyy-MM-dd&lt;/code&gt;)に&lt;code&gt;-&lt;/code&gt;を付け加えて、
タイトルを追加しました。&lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo/blob/master/from_jugem_to_hugo.py#L18&#34;&gt;ホントは英語のファイル名にしたかったんですが、ちょっと手抜き&lt;/a&gt;。ファイル名に使用できないような文字は&lt;code&gt;-&lt;/code&gt;に置換しています。&lt;/p&gt;
&lt;h3 id=&#34;本文&#34;&gt;本文&lt;/h3&gt;
&lt;p&gt;本文部分はもう少し複雑です。
まずは、&lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo/blob/master/from_jugem_to_hugo.py#L228&#34;&gt;descriptionとsequelから抜き出した文字列を結合&lt;/a&gt;します。&lt;/p&gt;
&lt;p&gt;で、内部の文字列に次のようなものがあるので、それぞれMarkdownに変換したりという処理を書いてます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo/blob/65e29cc7e613495e0d2c75e3f617c6f778085b61/from_jugem_to_hugo.py#L60&#34;&gt;HTMLのheadingタグをMarkdown形式に&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo/blob/65e29cc7e613495e0d2c75e3f617c6f778085b61/from_jugem_to_hugo.py#L66&#34;&gt;br、hr、del、strongなどのタグもMarkdown形式に&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo/blob/65e29cc7e613495e0d2c75e3f617c6f778085b61/from_jugem_to_hugo.py#L112&#34;&gt;aタグの処理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo/blob/65e29cc7e613495e0d2c75e3f617c6f778085b61/from_jugem_to_hugo.py#L93&#34;&gt;Amazonのアフィリエイトタグの処理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo/blob/65e29cc7e613495e0d2c75e3f617c6f778085b61/from_jugem_to_hugo.py#L161&#34;&gt;ul、olタグの処理&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;などです。
アフィリエイトタグは、数行に渡るの複数のHTMLタグで記述されているので、
&lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo/blob/65e29cc7e613495e0d2c75e3f617c6f778085b61/from_jugem_to_hugo.py#L146&#34;&gt;ASINと商品タイトルだけを抜き出しています&lt;/a&gt;。
Hugoでアフィリエイトのリンクを作るために、&lt;a href=&#34;https://github.com/ikemo3/hugo-amazon-jp&#34;&gt;hugo-amazon-jp&lt;/a&gt;という公開されているshortcodeを元に、カスタマイズしたものを使っています。
これ用に、&lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo/blob/65e29cc7e613495e0d2c75e3f617c6f778085b61/from_jugem_to_hugo.py#L104&#34;&gt;必要なASINとタイトルを別ファイルに出力&lt;/a&gt;したりしています。&lt;/p&gt;
&lt;p&gt;また、いくつか画像を使っている記事があったのですが、これが曲者でした。
XMLに入っているimgタグに画像へのURLがあるのですが、アクセスしても存在しないURL担っています。。。
&lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo/blob/65e29cc7e613495e0d2c75e3f617c6f778085b61/from_jugem_to_hugo.py#L130&#34;&gt;ブログで公開している画像のファイル名に似たものがXMLに入っていたので、URLを組み直して、ダウンロードするという処理も書いています&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;あとは、&lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo/blob/65e29cc7e613495e0d2c75e3f617c6f778085b61/from_jugem_to_hugo.py#L81&#34;&gt;昔ちょっと凝った書き方(spanタグで章みたいなことやってた)をしていた部分の処理&lt;/a&gt;を加えて完成です。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;元のXMLを見たり、抜き出したファイルを見ながら、トライアンドエラーでプログラムを書きました。
なんとなく変換できたなかっていうところで、取り込んで公開しました。
まだ、全部の記事をチェックしてないですが、なんとなく移植できたので一旦これでいいかなと。
昔の記事を見たときにおかしい場所があったら手で治すつもりでいます。&lt;/p&gt;
&lt;p&gt;なんか、もうちょっとうまくプログラムかけた気もしますが、書き捨てのプログラムだと思うのでこんなもんかな。&lt;/p&gt;
&lt;p&gt;1点気になっているところは、コメントの部分です。
ブログにコメントをいただいていたのですが、その部分は移植できてないです。&lt;/p&gt;
&lt;p&gt;Octopresに移植していこうは、&lt;a href=&#34;https://disqus.com/&#34;&gt;Disqus&lt;/a&gt;のサービスでコメント部分を提供しています。ここに移植するのも変な話だなぁと思っているので、本文にコメントを取り込む感じかなぁ？&lt;/p&gt;
&lt;p&gt;もともとのJugemのサイトもそのまままだ残してあるので、そのうち気が向いたらで。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Azure Cognitive Searchでインデックスを作って検索</title>
      <link>https://blog.johtani.info/blog/2020/02/19/research-azure-cognitive-search/</link>
      <pubDate>Wed, 19 Feb 2020 11:48:01 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/02/19/research-azure-cognitive-search/</guid>
      <description>&lt;p&gt;お手伝いしているお客さんがAzure Cognitive Searchを利用してます。
検索周り=Azure Cognitive Searchに関する手伝いをする形で入っており、
いくつか触った感触をブログにまとめてみようかと(お客さんからはOKいただいてます)。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;お手伝いしているお客さんがAzure Cognitive Searchを利用してます。
検索周り=Azure Cognitive Searchに関する手伝いをする形で入っており、
いくつか触った感触をブログにまとめてみようかと(お客さんからはOKいただいてます)。&lt;/p&gt;
&lt;h2 id=&#34;azure-cognitive-searchとは&#34;&gt;Azure Cognitive Searchとは？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://azure.microsoft.com/ja-jp/services/search/&#34;&gt;公式サイト&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;「AIを活用した」クラウド検索サービスと紹介されています。&lt;/p&gt;
&lt;p&gt;昔はAzure Searchと呼ばれていましたが、ここ最近はAzure Cognitive Searchと呼ばれているみたいです(&lt;a href=&#34;https://techcommunity.microsoft.com/t5/azure-ai/knowledge-mining-with-azure-cognitive-search/ba-p/1020774&#34;&gt;Microsoft Igniteで発表された話がまとまっているページもあります&lt;/a&gt;)。
もともと、検索エンジンのSaaSサービス(キーワード検索、あいまい検索、オートサジェスト、スコアリングなどの機能)として作られていた部分に、データの登録パイプラインにCognitive Serviceの便利な機能を簡単に使えるようにしたものというイメージでしょうか。&lt;/p&gt;
&lt;p&gt;バックエンドはElasticsearchのはずです。変わってなければ。
昔、Elastic社主催のユーザーカンファレンスで&lt;a href=&#34;https://www.elastic.co/jp/elasticon/2015/sf/powering-real-time-search-at-microsoft&#34;&gt;MSの方が公演された資料&lt;/a&gt;が公開されていたりします。
ちなみに質問が多いのでしょうか、&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/search-faq-frequently-asked-questions#what-is-the-difference-between-azure-cognitive-search-and-elasticsearch&#34;&gt;Azure Cognitive SearchとElasticsearchの違いはなんですか?&lt;/a&gt;というページがよくある質問のページに用意されていました。参考までに。&lt;/p&gt;
&lt;p&gt;今回はちょっとしたインデックスをつくって検索する部分を紹介してみようかと思います
(Cognitiveなところは機会があればまた)。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/search-create-service-portal&#34;&gt;普通の使い方&lt;/a&gt;については、Azureのドキュメントなどを読んで頂く形にします。
ポータルと呼ばれるブラウザ上でAzureのサービスを触ることができる画面が用意されています。
ここで、簡単な操作(インデックス作成、フィールドの追加)&lt;/p&gt;
&lt;p&gt;APIを使ってインデックス(特にAnalyzer)の設定をしたり、データをいれて、クエリしてみるというところをサクッと紹介しようと思います。&lt;/p&gt;
&lt;h2 id=&#34;インデックスの作り方&#34;&gt;インデックスの作り方&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/search-what-is-an-index#recommended-workflow&#34;&gt;インデックス作成に関するドキュメント&lt;/a&gt;も用意されています。最初はポータル(GUI)でインデックスを作成する方法が紹介されています。
ですが、今回はn-gram(n=2)のAnalyzerを利用したかったので、GUIではなくAPIでインデックスを作成しました。
&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/index-add-custom-analyzers&#34;&gt;カスタムアナライザー&lt;/a&gt;を利用する場合、REST APIを利用しなければ行けないということになっています。
n-gramのAnalyzerを含むインデックス生成のREST APIは以下のとおりです。こちらを実行することで、インデックスが作成されます(JSONの記述ミスなどがある場合はエラーが返ってきます)。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;@host = &amp;lt;サーチのサービス名&amp;gt;.search.windows.net
@api-key = &amp;lt;APIキー&amp;gt;

###

POST https://{{host}}/indexes/?api-version=2019-05-06
Content-Type: application/json
api-key: {{api-key}}

{
    &amp;#34;name&amp;#34;:&amp;#34;ngram-test&amp;#34;,
    &amp;#34;fields&amp;#34;:[
       {
          &amp;#34;name&amp;#34;:&amp;#34;id&amp;#34;,
          &amp;#34;type&amp;#34;:&amp;#34;Edm.String&amp;#34;,
          &amp;#34;key&amp;#34;:true,
          &amp;#34;searchable&amp;#34;:false
       },
       {
          &amp;#34;name&amp;#34;:&amp;#34;ngram&amp;#34;,
          &amp;#34;type&amp;#34;:&amp;#34;Edm.String&amp;#34;,
          &amp;#34;searchable&amp;#34;:true,
          &amp;#34;analyzer&amp;#34;:&amp;#34;bi_gram_analyzer&amp;#34;
       }
    ],
    &amp;#34;analyzers&amp;#34;:[
      {
         &amp;#34;name&amp;#34;:&amp;#34;bi_gram_analyzer&amp;#34;,
         &amp;#34;@odata.type&amp;#34;:&amp;#34;#Microsoft.Azure.Search.CustomAnalyzer&amp;#34;,
         &amp;#34;tokenizer&amp;#34;:&amp;#34;bi_gram_tokenizer&amp;#34;,
         &amp;#34;tokenFilters&amp;#34;:[
            &amp;#34;lowercase&amp;#34;
         ]
      }
    ],
    &amp;#34;tokenizers&amp;#34;:[
       {
          &amp;#34;name&amp;#34;:&amp;#34;bi_gram_tokenizer&amp;#34;,
          &amp;#34;@odata.type&amp;#34;:&amp;#34;#Microsoft.Azure.Search.NGramTokenizer&amp;#34;,
          &amp;#34;minGram&amp;#34;:2,
          &amp;#34;maxGram&amp;#34;:2
       }
    ]
 }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;なんだかどこかで見たことのある記述のようなそうでないような。。。
Analyzerは、charFilters(0以上複数可)、tokenizer(1つ必須)、tokenFilters(0以上複数可)から構成されます。
フィールドで指定するのはAnalyzerなので、まずanalyzersに&lt;code&gt;CustomAnalyzer&lt;/code&gt;の設定を行います。
名前は&lt;code&gt;bi_gram_analyzer&lt;/code&gt;にしました(好きに付けてください)。
&lt;code&gt;tokenizer&lt;/code&gt;にはこのあと設定するtokenizerの名前を設定します。ここでは、&lt;code&gt;bi_gram_tokenizer&lt;/code&gt;という名前にしています。
また、大文字小文字を気にせずに検索したいため、&lt;code&gt;tokenFilters&lt;/code&gt;に&lt;code&gt;lowercase&lt;/code&gt;を指定しています。こちらは&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/index-add-custom-analyzers#token-filters-reference&#34;&gt;すでに定義済み&lt;/a&gt;のため、定義済みの名前で呼び出すだけで使用できます。&lt;/p&gt;
&lt;p&gt;次が、&lt;code&gt;bi_gram_tokenizer&lt;/code&gt;の設定です。
n=2としたいので、&lt;code&gt;tokenizers&lt;/code&gt;配下にTokenizerの設定をします。
&lt;code&gt;@odata.type&amp;quot;:&amp;quot;#Microsoft.Azure.Search.NGramTokenizer&lt;/code&gt;がTokenizerの名前です(ちょっと独特な名前ですね)。
Tokenizerごとにオプションがあり、NGramTokenizerの場合は、&lt;code&gt;minGram&lt;/code&gt;、&lt;code&gt;maxGram&lt;/code&gt;がオプションに相当します。
今回は2文字ごとにトークンを出力したいので、minとmaxをそれぞれ2としています。&lt;/p&gt;
&lt;p&gt;これで、あとは、フィールドで&lt;code&gt;analyzer&lt;/code&gt;という設定に&lt;code&gt;bi_gram_analyzer&lt;/code&gt;を指定すればそのフィールドは&lt;code&gt;bi_gram_analyzer&lt;/code&gt;を使用してアナライズされるようになります(このへんはElasticsearchといっしょですね)。
フィールドは文字列を扱うので、&lt;code&gt;Edm.String&lt;/code&gt;というタイプにしてあります。データ型については、&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/search-what-is-an-index#fields-collection-and-field-attributes&#34;&gt;フィールドコレクションとフィールド属性&lt;/a&gt;というドキュメントを参考に設定しましょう。&lt;/p&gt;
&lt;h3 id=&#34;閑話休題---rest-client-exstension-for-visual-studio-code&#34;&gt;閑話休題 - REST Client Exstension for Visual Studio Code&lt;/h3&gt;
&lt;p&gt;なお、今回のサンプルは&lt;a href=&#34;https://github.com/Huachao/vscode-restclient&#34;&gt;REST Clinet Extention for Visual Studio Code&lt;/a&gt;を利用する想定の記述になっています。&lt;/p&gt;
&lt;p&gt;Visual Studio Codeで&lt;code&gt;.rest&lt;/code&gt;もしくは&lt;code&gt;.http&lt;/code&gt;というファイルに以下のAPIを記述すると、&lt;code&gt;Send Request&lt;/code&gt;というリンクがURLの上部に出てくるような拡張機能です。REST APIにリクエストするときに便利なツールになっています。
変数も使えるので、APIのキーやURLの一部をこのように共通化して、他の環境でも使いやすくできるのは素晴らしいなと。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20200220/rest_client_extension.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20200220/rest_client_extension.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h2 id=&#34;アナライザーの挙動の確認&#34;&gt;アナライザーの挙動の確認&lt;/h2&gt;
&lt;p&gt;設定したAnalyzerがきちんと機能しているかというのを確認する必要があります。
入力した文字列がきちんと想定している単語として切り出されて、転置インデックスの見出し語に使われるかというのが重要になるからです。&lt;/p&gt;
&lt;p&gt;Azure Cognitive Searchでもアナライザーのテスト用APIが用意されています。
&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/index-add-custom-analyzers#test-custom-analyzers&#34;&gt;使い方はこちら&lt;/a&gt;。
&lt;a href=&#34;https://docs.microsoft.com/ja-jp/rest/api/searchservice/test-analyzer&#34;&gt;APIの仕様のページもありました&lt;/a&gt;。
「&lt;code&gt;アナライザーの挙動はどんな感じ？&lt;/code&gt;」という文字列が、作成したインデックスの定義したアナライザー&lt;code&gt;bi_gram_analyzer&lt;/code&gt;により、
どのように分割されるかを確認するAPIの呼び出しは以下のとおりです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;###
POST https://{{host}}/indexes/ngram-test/analyze?api-version=2019-05-06
Content-Type: application/json
api-key: {{api-key}}

{
   &amp;#34;analyzer&amp;#34;:&amp;#34;bi_gram_analyzer&amp;#34;,
   &amp;#34;text&amp;#34;: &amp;#34;アナライザーの挙動はどんな感じ？&amp;#34;
}
&lt;/code&gt;&lt;/pre&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-json&#34; data-lang=&#34;json&#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;&amp;#34;@odata.context&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://{{host}}.search.windows.net/$metadata#Microsoft.Azure.Search.V2019_05_06.AnalyzeResult&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:#f92672&#34;&gt;&amp;#34;tokens&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;アナ&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:#f92672&#34;&gt;&amp;#34;startOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;&amp;#34;endOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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;&amp;#34;position&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#f92672&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ナラ&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:#f92672&#34;&gt;&amp;#34;startOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;&amp;#34;endOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;3&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;&amp;#34;position&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#f92672&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ライ&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:#f92672&#34;&gt;&amp;#34;startOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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;&amp;#34;endOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;4&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;&amp;#34;position&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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:#f92672&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;イザ&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:#f92672&#34;&gt;&amp;#34;startOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;3&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;&amp;#34;endOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;5&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;&amp;#34;position&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;3&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:#f92672&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ザー&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:#f92672&#34;&gt;&amp;#34;startOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;4&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;&amp;#34;endOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;6&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;&amp;#34;position&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;4&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:#f92672&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ーの&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:#f92672&#34;&gt;&amp;#34;startOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;5&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;&amp;#34;endOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;7&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;&amp;#34;position&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;5&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:#f92672&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;の挙&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:#f92672&#34;&gt;&amp;#34;startOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;6&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;&amp;#34;endOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;8&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;&amp;#34;position&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;6&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:#f92672&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;挙動&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:#f92672&#34;&gt;&amp;#34;startOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;7&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;&amp;#34;endOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;9&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;&amp;#34;position&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;7&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:#f92672&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;動は&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:#f92672&#34;&gt;&amp;#34;startOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;8&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;&amp;#34;endOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;10&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;&amp;#34;position&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;8&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:#f92672&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;はど&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:#f92672&#34;&gt;&amp;#34;startOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;9&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;&amp;#34;endOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;11&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;&amp;#34;position&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;9&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:#f92672&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;どん&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:#f92672&#34;&gt;&amp;#34;startOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;10&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;&amp;#34;endOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;12&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;&amp;#34;position&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;10&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:#f92672&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;んな&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:#f92672&#34;&gt;&amp;#34;startOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;11&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;&amp;#34;endOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;13&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;&amp;#34;position&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;11&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:#f92672&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;な感&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:#f92672&#34;&gt;&amp;#34;startOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;12&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;&amp;#34;endOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;14&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;&amp;#34;position&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;12&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:#f92672&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;感じ&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:#f92672&#34;&gt;&amp;#34;startOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;13&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;&amp;#34;endOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;15&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;&amp;#34;position&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;13&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:#f92672&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;じ？&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:#f92672&#34;&gt;&amp;#34;startOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;14&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;&amp;#34;endOffset&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;16&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;&amp;#34;position&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;14&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このAzure SearchのAnalyze API、使用できるオプションはすくないですが、&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-analyze.html&#34;&gt;ElasticsearchのAnalyze API&lt;/a&gt;と似ています。&lt;/p&gt;
&lt;h2 id=&#34;データの登録の仕方&#34;&gt;データの登録の仕方&lt;/h2&gt;
&lt;p&gt;データ登録もAPIからできます(あたりまえですね)。
&lt;a href=&#34;https://docs.microsoft.com/ja-jp/rest/api/searchservice/addupdate-or-delete-documents&#34;&gt;APIは1件ずつではなく、バルクで登録できる形で提供されています&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;サンプルとしては、以下のような形です。
&lt;code&gt;@search.action&lt;/code&gt;の部分(&lt;code&gt;search&lt;/code&gt;があるとわかりにくい気がするけど。。。)が、ドキュメントの登録、更新、削除の命令を書き込むところになります。
今回は単純に登録するだけなので、&lt;code&gt;upload&lt;/code&gt;を指定しました。
ほかにも&lt;a href=&#34;https://docs.microsoft.com/ja-jp/rest/api/searchservice/addupdate-or-delete-documents#document-actions&#34;&gt;いくつかアクションが用意されています。&lt;/a&gt;用途に合わせて指定する感じになります。
&lt;code&gt;id&lt;/code&gt;、&lt;code&gt;ngram&lt;/code&gt;はそれぞれフィールド名です。ドキュメントに登録したい値を記述します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
POST https://{{host}}/indexes/ngram-test/docs/index?api-version=2019-05-06
Content-Type: application/json
api-key: {{api-key}}

{
  &amp;#34;value&amp;#34;: [
    {          
      &amp;#34;@search.action&amp;#34;: &amp;#34;upload&amp;#34;,  
      &amp;#34;id&amp;#34;: &amp;#34;1&amp;#34;,
      &amp;#34;ngram&amp;#34;: &amp;#34;新しいAzure Searchの使い方&amp;#34;
    },
    {          
      &amp;#34;@search.action&amp;#34;: &amp;#34;upload&amp;#34;,  
      &amp;#34;id&amp;#34;: &amp;#34;2&amp;#34;,
      &amp;#34;ngram&amp;#34;: &amp;#34;Elasticsearchの紹介&amp;#34;
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;検索クエリ&#34;&gt;検索クエリ&lt;/h2&gt;
&lt;p&gt;最後は検索クエリです。
&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/search-query-overview&#34;&gt;検索クエリはいくつかのオプションがあります&lt;/a&gt;。
ざっくりだと、&lt;code&gt;queryType&lt;/code&gt;が&lt;code&gt;simple&lt;/code&gt;と&lt;code&gt;full&lt;/code&gt;という2種類が用意されており、ちょっとした検索を作る場合は&lt;code&gt;simple&lt;/code&gt;で事足りそうという感じです。
入力された単語(スペース区切りで複数扱い)をフィールド(複数可)に対していずれかの単語を含むもしくは、すべての単語を含むという検索に行くというパターンですね。
このときの、「いずれか」か「すべて」の設定が&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/search-query-overview#tips-for-unexpected-results&#34;&gt;&lt;code&gt;searchMode&lt;/code&gt;&lt;/a&gt;というパラメータになります。
&lt;code&gt;any&lt;/code&gt;の場合、Googleの検索と同様に、どれかの単語が入っているドキュメントが対象に、&lt;code&gt;all&lt;/code&gt;の場合すべての単語が含まれるドキュメントだけがたいしょうになるといった形です。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;queryType=full&lt;/code&gt;の場合はLuceneの構文でクエリがかけます。Elasticsearchの&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html&#34;&gt;Query String Query&lt;/a&gt;みたいな形です。&lt;/p&gt;
&lt;p&gt;簡単なサンプルは次のような感じです。このサンプル&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
POST https://{{host}}/indexes/multi-field-test/docs/search?api-version=2019-05-06
Content-Type: application/json
api-key: {{api-key}}

{
   &amp;#34;search&amp;#34;: &amp;#39;ngram:&amp;#34;使い方&amp;#34; ngram:&amp;#34;紹介&amp;#34;&amp;#39;,
   &amp;#34;queryType&amp;#34;: &amp;#34;full&amp;#34;,
   &amp;#34;searchMode&amp;#34;: &amp;#34;any&amp;#34;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;すこしだけクエリの補足を。
searchに入力された単語をダブルクォートで囲んでいます。これは、「使い方」という文字がbi_gram_analyzerにより「使い」「い方」に
分割されるのですが、必ずこの順序で出現したものだけを検索対象にしたい(フレーズ検索)という意味になります(*bi_*gramなので、「紹介」に関してはダブルクォートは厳密には必要ないです)。&lt;/p&gt;
&lt;p&gt;あと、レスポンスは今回記載していませんが、&lt;code&gt;@search.score&lt;/code&gt;という項目で、スコアが返ってきます。
デフォルトのスコア計算には何を使ってるんだろう?&lt;a href=&#34;https://docs.microsoft.com/ja-jp/azure/search/index-add-scoring-profiles#what-is-default-scoring&#34;&gt;ドキュメントにはTF-IDFとの記述があるのですが&lt;/a&gt;。。。カスタマイズもできそうです。&lt;/p&gt;
&lt;p&gt;少しオモシロイと思ったのは、スキーマ(インデックスの設定)に定義されているが、ドキュメントとしては登録していない項目についても、
Azure Cognitive Searchはドキュメントのフィールドが&lt;code&gt;null&lt;/code&gt;という形で返ってくるようでした。
そもそもフィールドが存在しないドキュメントとフィールドの値が&lt;code&gt;null&lt;/code&gt;のものの違いは無いようです。&lt;/p&gt;
&lt;p&gt;簡単ですが、インデックスの設定、ドキュメントの登録、検索の方法の紹介でした。&lt;/p&gt;
&lt;h2 id=&#34;ちょっと触った感想&#34;&gt;ちょっと触った感想&lt;/h2&gt;
&lt;p&gt;一番売りである、Cognitiveの部分はまだ触っていないです、すみません(こっちが売りな気もするんですが)。
検索エンジンの部分としては、Elasticsearchを知っていると、「あー、そんな感じね」という気持ちになれるサービスです。
個々のAPIやデータの形式は異なるので、きちんとAPIのリファレンスなどを確認しつつという形になりますが、なんとなくこういうAPIなどがありそうだな?と予測しつつ使えるかなと。
内部的にはElasticsearchだと思いますが、独自のAPIでラップされているおかげで、バージョンの違いなどを意識せずに使えるのではないかと思います。&lt;/p&gt;
&lt;p&gt;また、今回は紹介していませんが、マイクロソフト独自の各言語のアナライザー(日本語も含む)があります。
Luceneのアナライザーとマイクロソフトのアナライザーのどちらも利用できますので、ここの違いを見てみるのも面白そうだなと思いました。
緯度経度を利用した検索、フィルター検索(スコア計算対象にならない)、ファセット、スコア調整の機能なども備えているようです。&lt;/p&gt;
&lt;p&gt;なんにせよ、利用する場合やドキュメントを読む場合に、全文検索の仕組みをなんとなく知っておいたほうが読みやすいんじゃないかなというのが感想です。&lt;/p&gt;
&lt;p&gt;ここ数年はElasticsearchがメインでほかはほぼ触っていない状況だったので新しい製品に触れるのは面白いですね。
時間があったら、アナライザーの違いなども調べてみたいなと思います。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>「検索システム探訪」したいな=&gt;やりました</title>
      <link>https://blog.johtani.info/blog/2020/02/10/explore-search-system/</link>
      <pubDate>Mon, 10 Feb 2020 23:20:27 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/02/10/explore-search-system/</guid>
      <description>&lt;p&gt;また、ツイートから始まるお話です。
まだまだ、検索システムってどんなものかを勉強したいしということで、こんなのをツイートしてました。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;「検索システム探訪」みたいな名前がいいかな? &lt;a href=&#34;https://t.co/sG7BDdGI9h&#34;&gt;https://t.co/sG7BDdGI9h&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1225306152721739776?ref_src=twsrc%5Etfw&#34;&gt;February 6, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;検索について知り合いとお茶をしながら話をしていて、こういう話を聞くの面白いなぁと思ったので。
どんなことを個人的には聞きたいかな?というのをまとめといたほうがいいかと思いブログを書いています。
こんなことも面白そうだよね?&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;また、ツイートから始まるお話です。
まだまだ、検索システムってどんなものかを勉強したいしということで、こんなのをツイートしてました。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;「検索システム探訪」みたいな名前がいいかな? &lt;a href=&#34;https://t.co/sG7BDdGI9h&#34;&gt;https://t.co/sG7BDdGI9h&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1225306152721739776?ref_src=twsrc%5Etfw&#34;&gt;February 6, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;検索について知り合いとお茶をしながら話をしていて、こういう話を聞くの面白いなぁと思ったので。
どんなことを個人的には聞きたいかな?というのをまとめといたほうがいいかと思いブログを書いています。
こんなことも面白そうだよね?&lt;/p&gt;
&lt;h2 id=&#34;どんなこと聞きたいかな&#34;&gt;どんなこと聞きたいかな?&lt;/h2&gt;
&lt;p&gt;いまのところ思いついた内容はこんな感じかな?
こんなのも聞くと面白そうだよね?などありましたら、コメント欄に書いてもらえればと。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;利用しているシステム・サービスは?
&lt;ul&gt;
&lt;li&gt;構成やどこのサービスなのか？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;検索ユーザーはどんな人？
&lt;ul&gt;
&lt;li&gt;ユーザーの種類&lt;/li&gt;
&lt;li&gt;ユーザーの検索ニーズ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;検索対象データはどんなもの？
&lt;ul&gt;
&lt;li&gt;データ件数はどのくらい？&lt;/li&gt;
&lt;li&gt;属性、項目がどのくらいあるか？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;検索結果として出したいものは？
&lt;ul&gt;
&lt;li&gt;ソートはどんなものがあるの？&lt;/li&gt;
&lt;li&gt;ランキングで重要なものは？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;UI/UXはどんな感じ?
&lt;ul&gt;
&lt;li&gt;ハイライト、ソート、ファセット(Aggs)&lt;/li&gt;
&lt;li&gt;キーワードサジェスト、オートコンプリート&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;検索システムの監視(オブザバビリティ??)
&lt;ul&gt;
&lt;li&gt;ビジネス的な指標&lt;/li&gt;
&lt;li&gt;クエリログ、クリック(ユーザーに関する情報)&lt;/li&gt;
&lt;li&gt;システムメトリクス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;困っていることは？
&lt;ul&gt;
&lt;li&gt;ランキング&lt;/li&gt;
&lt;li&gt;クエリ&lt;/li&gt;
&lt;li&gt;検索システム分析&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;第1回やりました&#34;&gt;第1回やりました。&lt;/h2&gt;
&lt;p&gt;ちなみに、最初のツイートに対して、すぐに返事をくれた方がいました。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;うちでよければご説明します！&lt;/p&gt;&amp;mdash; Kizashi （令和もRailsエンジニア募集中） (@kizashi1122) &lt;a href=&#34;https://x.com/kizashi1122/status/1225293097329819648?ref_src=twsrc%5Etfw&#34;&gt;February 6, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;Twitter本当にありがとうございますという感じです。&lt;/p&gt;
&lt;p&gt;で、早速話を聞かせていただきました。大阪の方だったので、テレカンでやらせていただきました。
移動時間とか気にせずにできるので、テレカン形式いいですよね。&lt;/p&gt;
&lt;p&gt;内容は、非常に面白かったです。
使ってるシステムについて、どんなところで、どのようなように検索エンジンをつかっているのか、
どんなことで困っているのかなどをお聞きすることができました。&lt;/p&gt;
&lt;h3 id=&#34;20200213-追記&#34;&gt;2020/02/13 追記&lt;/h3&gt;
&lt;p&gt;対応していただいた&lt;a href=&#34;https://ingage.co.jp/&#34;&gt;Ingage&lt;/a&gt;の永田さんから、内容を公開しても良いという承諾をいただいたので、メモを公開します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;サービス : &lt;a href=&#34;https://ingage.jp/relation/&#34;&gt;Re:lation&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;問い合わせメールなどのチームで対応する対応&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;利用している検索エンジン
&lt;ul&gt;
&lt;li&gt;Elasticsearch (AWS Es)
&lt;ul&gt;
&lt;li&gt;ノード数 8 - 3 master + 5 data&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;データ
&lt;ul&gt;
&lt;li&gt;データ数 : 約1億5千万&lt;/li&gt;
&lt;li&gt;親子関係 : チケット - メール(=1ドキュメント) - コメント
&lt;ul&gt;
&lt;li&gt;画面としてはチケットの一覧=aggsでチケットIDの一覧を生成してリスト表示&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;インデックス数 : 5 = テナントごとに振り分けしてる。
&lt;ul&gt;
&lt;li&gt;8シャード - スケールアウトした場合も対応できるので。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PostgreSQLにマスターは保存&lt;/li&gt;
&lt;li&gt;データの単位はメール。コメントはtextの配列でメールに保存されている。&lt;/li&gt;
&lt;li&gt;EsはIDの一覧を返す。ただし、&lt;em&gt;チケットのIDの一覧&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;機能
&lt;ul&gt;
&lt;li&gt;ハイライト
&lt;ul&gt;
&lt;li&gt;Esではなく独自実装。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;クエリ
&lt;ul&gt;
&lt;li&gt;n-gramでやってる = kuromoji使ってない&lt;/li&gt;
&lt;li&gt;min=1, max=2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;悩み事
&lt;ul&gt;
&lt;li&gt;EBS上だったものをローカルにしたので速くなった。&lt;/li&gt;
&lt;li&gt;期間が長いと、検索結果一覧の表示が遅い
&lt;ul&gt;
&lt;li&gt;aggsが遅いのかな?&lt;/li&gt;
&lt;li&gt;検索結果一覧はチケットが持っているメールの日付の降順。結果一覧はチケットの一覧。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;詳細検索はDB、左のステータスもファセットも現在はDBから生成
&lt;ul&gt;
&lt;li&gt;Es使ったほうが早いかも?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;マルチテナントのつらさ&lt;/li&gt;
&lt;li&gt;検索ログ
&lt;ul&gt;
&lt;li&gt;独自ログはとっていない = アプリのログから判別&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;今後
&lt;ul&gt;
&lt;li&gt;アドレス帳検索&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;お誘いお待ちしております&#34;&gt;お誘いお待ちしております!&lt;/h2&gt;
&lt;p&gt;今後もこれやっていきたいなぁ。話してもいいよ!という方がいらっしゃいましたら、&lt;a href=&#34;https://twitter.com/johtani&#34;&gt;@johtani&lt;/a&gt;までDMもしくはメンションをください。お待ちしております!&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>ボードゲーム紹介</title>
      <link>https://blog.johtani.info/blog/2020/02/01/intro-board-game/</link>
      <pubDate>Sat, 01 Feb 2020 21:04:54 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/02/01/intro-board-game/</guid>
      <description>&lt;p&gt;年末、何種類かのボードゲームを家族で楽しみました。
家族の感想を交えて簡単に紹介しようかと思います。
家族や知人でボードゲームを購入するときの参考に参考にしてもらえたらと。
それぞれのゲームの詳細については、それぞれWikipediaなどのリンクを張っておくので、参考にしていただけたらと。
結構有名なボードゲームが多いのかな?&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;年末、何種類かのボードゲームを家族で楽しみました。
家族の感想を交えて簡単に紹介しようかと思います。
家族や知人でボードゲームを購入するときの参考に参考にしてもらえたらと。
それぞれのゲームの詳細については、それぞれWikipediaなどのリンクを張っておくので、参考にしていただけたらと。
結構有名なボードゲームが多いのかな?&lt;/p&gt;
&lt;h2 id=&#34;カタン&#34;&gt;カタン&lt;/h2&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B017SB7QLO/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51Nwc2zQKRL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B017SB7QLO/?tag=johtani-22&#34;&gt;
      Amazon | カタン スタンダード版 | ボードゲーム | おもちゃ
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;簡単な紹介&#34;&gt;簡単な紹介&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;プレーヤー数 : 3-4名 (拡張版を追加すると5-6名でもプレイできるみたい)&lt;/li&gt;
&lt;li&gt;対象年齢 : 10歳以上&lt;/li&gt;
&lt;li&gt;種類 : 対戦型&lt;/li&gt;
&lt;li&gt;紹介 : &lt;a href=&#34;https://ja.wikipedia.org/wiki/%E3%82%AB%E3%82%BF%E3%83%B3%E3%81%AE%E9%96%8B%E6%8B%93%E8%80%85%E3%81%9F%E3%81%A1&#34;&gt;大航海時代に発見された無人島を複数の入植者たちが開拓していき、もっとも繁栄したプレイヤーが勝利するという内容のボードゲーム(Wikipediaより)&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;特徴 : 5種類の資源を元に、道を作ったり、開拓地や都市を作ったり、サイコロを使った運も必要ですが、プレーヤー同士で手持ちの資源を交渉することも可能なゲームです。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;感想&#34;&gt;感想&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;最初の配置が重要な気がします。資源の組み合わせによってできることが変わってくるので、何をやりたいかというのを元に考えて配置するのが重要そうです(私はまだうまくできてませんがw)。&lt;/li&gt;
&lt;li&gt;プレーヤー同士の交渉も1つの手段なので、会話しながら、自然と交渉術も身についてきそうです。&lt;/li&gt;
&lt;li&gt;戦略だけじゃなくサイコロを使った運もあるので、子供と大人が混ざっていても偏った結果にはならないです。&lt;/li&gt;
&lt;li&gt;自分の道や町が発展していくのも楽しみの1つです。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;お化け屋敷の宝石ハンター&#34;&gt;お化け屋敷の宝石ハンター&lt;/h2&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B01FLADSW0/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/61fkRyearfL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B01FLADSW0/?tag=johtani-22&#34;&gt;
      Amazon | お化け屋敷の宝石ハンター FBH20 | おもちゃ | おもちゃ
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;簡単な紹介-1&#34;&gt;簡単な紹介&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;プレーヤー数 : 2-4名&lt;/li&gt;
&lt;li&gt;対象年齢 : 8歳以上&lt;/li&gt;
&lt;li&gt;種類 : 協力型&lt;/li&gt;
&lt;li&gt;紹介 : &lt;a href=&#34;http://mattel.co.jp/toys/mattel_games/&#34;&gt;お化け屋敷がおばけでいっぱいになる前に、みんなで協力して８つの宝石をみつけて、屋敷から脱出しよう！(メーカーホームページより)&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;特徴 : 対戦ではなくプレーヤーみんなで協力してやるボードゲーム。おばけのフィギュアも可愛いです。サイコロを利用した運もありますが、みんなでどういった戦略で宝石を取り出すかなど会話も進むゲームです。上級編という難しめのルールも用意されているので、ハラハラ・ドキドキしながらプレイできます。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;感想-1&#34;&gt;感想&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;負けて悔しくなったり機嫌が悪くなることがないのがいいですね。&lt;/li&gt;
&lt;li&gt;普通のルールだと少し物足りない感じですが、上級編のルールはより、みんなで協力する必要が出てきます。&lt;/li&gt;
&lt;li&gt;また、上級編のルールは絶妙な難易度で、もう一度やりたいと思わせるのが良い仕組みです。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;ラビリンス&#34;&gt;ラビリンス&lt;/h2&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B0002YM10Q/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/5136SHyrG5L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B0002YM10Q/?tag=johtani-22&#34;&gt;
      Amazon | ラビリンス (Labyrinth) ボードゲーム | ボードゲーム | おもちゃ
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;簡単な紹介-2&#34;&gt;簡単な紹介&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;プレーヤー数 : 1-4名&lt;/li&gt;
&lt;li&gt;対象年齢 : 8歳以上&lt;/li&gt;
&lt;li&gt;種類 : 対戦型&lt;/li&gt;
&lt;li&gt;紹介 : &lt;a href=&#34;http://ganguoroshi.jp/item/4005556264445.html&#34;&gt;動く迷路で宝探し！通路が動く不思議な迷路の中に、「宝物」や「奇妙な生き物」が隠されています。プレイヤーはこれらを集めてこなければなりませんが、そのためには、巧みに迷路を動かさなければなりません。(メーカーホームページより)&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;特徴 : サイコロがないボードゲームです。先を予測しながら人のじゃまをしつつ、自分に有利に進めていくゲームです。プレーヤー個別に難易度を変えられる仕組みがあります(子供だけに有利なルール設定が可能)。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;感想-2&#34;&gt;感想&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;子供ルールがあるので、1度のゲームで別々の難易度が設定できるのがいいです。左右盲の人には子供ルールとかもありです。&lt;/li&gt;
&lt;li&gt;ラビリンスが得意な人は地図を読むのが得意な人だと思います。&lt;/li&gt;
&lt;li&gt;頭も使うけど、自分が望んだ道ができた時の快感があります。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;モノポリー&#34;&gt;モノポリー&lt;/h2&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07BB4FDLG/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/514amTZoJYL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B07BB4FDLG/?tag=johtani-22&#34;&gt;
      Amazon | ハズブロ ボードゲーム モノポリー クラシック C1009 正規品 | ボードゲーム | おもちゃ
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;簡単な紹介-3&#34;&gt;簡単な紹介&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;プレーヤー数 : 2-6名&lt;/li&gt;
&lt;li&gt;対象年齢 : 8歳以上&lt;/li&gt;
&lt;li&gt;種類 : 対戦型&lt;/li&gt;
&lt;li&gt;紹介 : &lt;a href=&#34;https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%8E%E3%83%9D%E3%83%AA%E3%83%BC&#34;&gt;プレイヤーは双六の要領で盤上を周回しながら他プレイヤーと盤上の不動産を取引することにより同一グループを揃え、家やホテルを建設することで他のプレイヤーから高額なレンタル料を徴収して自らの資産を増やし、最終的に他のプレイヤーを全て破産させることを目的とする。モノポリーとは英語で「独占」を意味する。(Wikipediaより)&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;特徴 : 資本主義とは?みたいなのを体験できるゲーム。すごろく型ですが、ゴールがあるわけではなく、決着がつくまでぐるぐる回る感じです。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;感想-3&#34;&gt;感想&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;資本主義を象徴しているゲーム展開。真剣勝負間違いなしです。&lt;/li&gt;
&lt;li&gt;負けると途中退場ってのがちょっとつらいです。。。&lt;/li&gt;
&lt;li&gt;カタンとは違った感じの交渉術になります。&lt;/li&gt;
&lt;li&gt;コマが色んな種類があってかわいいです。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;パンデミック&#34;&gt;パンデミック&lt;/h2&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B00DKSX2TK/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51P&amp;#43;E7qq-1L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B00DKSX2TK/?tag=johtani-22&#34;&gt;
      Amazon | パンデミック:新たなる試練 (Pandemic) 日本語版 ボードゲーム | ボードゲーム | おもちゃ
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;簡単な紹介-4&#34;&gt;簡単な紹介&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;プレーヤー数 : 2-4名&lt;/li&gt;
&lt;li&gt;対象年齢 : 8歳以上&lt;/li&gt;
&lt;li&gt;種類 : 協力型&lt;/li&gt;
&lt;li&gt;紹介 : &lt;a href=&#34;https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%B3%E3%83%87%E3%83%9F%E3%83%83%E3%82%AF_(%E3%83%9C%E3%83%BC%E3%83%89%E3%82%B2%E3%83%BC%E3%83%A0)&#34;&gt;『パンデミック』（Pandemic）は、プレイヤーが新型ウイルス対策チームの一員となり、協力しあい感染症の世界的流行（パンデミック）に立ち向かうというボードゲームである。(Wikipediaより)&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;特徴 : プレーヤーが個別のロール(役割)を持っており、よりみんなで協力をしないとウイルスに打ち勝てない感じです。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;感想-4&#34;&gt;感想&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ルールが結構複雑で、理解しながらだと少し時間かかりました。&lt;/li&gt;
&lt;li&gt;8歳以上になっていますが、少しむずかしい印象でした。&lt;/li&gt;
&lt;li&gt;戦略、戦術が問われる形のゲームなのでしっかり理解すると楽しそう。&lt;/li&gt;
&lt;li&gt;世界地図上で、ウイルスと戦っていく感じは臨場感があって面白いです。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;ナインタイル&#34;&gt;ナインタイル&lt;/h2&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B073CM2RVL/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51p1ggF4o8L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B073CM2RVL/?tag=johtani-22&#34;&gt;
      Amazon | ナインタイル | カードゲーム・トランプ | おもちゃ
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;簡単な紹介-5&#34;&gt;簡単な紹介&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;プレーヤー数 : 2-4名&lt;/li&gt;
&lt;li&gt;対象年齢 : 6歳以上&lt;/li&gt;
&lt;li&gt;種類 : スピード対戦型&lt;/li&gt;
&lt;li&gt;紹介 : &lt;a href=&#34;https://oinkgms.com/jp/nine-tiles&#34;&gt;「ナインタイル」の基本ルールは、それぞれの手元にある、９枚のタイルを自由に動かしたりひっくり返したりして、誰よりも早くお題どおりに並べるだけ。(公式サイトより)&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;特徴 : ボードゲームというか、カードゲーム。ルールは簡単ですが、記憶力と素早さが重要です。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;感想-5&#34;&gt;感想&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;脳トレに良さそう(子供に勝てませんでした。。。)。&lt;/li&gt;
&lt;li&gt;瞬発力+記憶力が重要。&lt;/li&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;
</content:encoded>
    </item>
    
    <item>
      <title>実践Rust入門はじめました</title>
      <link>https://blog.johtani.info/blog/2020/01/31/start-reading-bicycle-book/</link>
      <pubDate>Fri, 31 Jan 2020 21:58:12 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/01/31/start-reading-bicycle-book/</guid>
      <description>&lt;p&gt;実践Rust入門という本を買っていた(去年の7月だ。。。)のですが、積んであったので、時間を作って読み始めようかと。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4297105594/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51e5B1Zx&amp;#43;yL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4297105594/?tag=johtani-22&#34;&gt;
      実践Rust入門[言語仕様から開発手法まで] | κeen, 河野 達也, 小松 礼人 |本 | 通販 | Amazon
      &lt;/a&gt;
    &lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;実践Rust入門という本を買っていた(去年の7月だ。。。)のですが、積んであったので、時間を作って読み始めようかと。&lt;/p&gt;
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4297105594/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51e5B1Zx&amp;#43;yL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4297105594/?tag=johtani-22&#34;&gt;
      実践Rust入門[言語仕様から開発手法まで] | κeen, 河野 達也, 小松 礼人 |本 | 通販 | Amazon
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;経緯&#34;&gt;経緯&lt;/h2&gt;
&lt;p&gt;もともとは、&lt;a href=&#34;https://blog.johtani.info/blog/2018/02/14/start-nlp100-with-rust/#undefined&#34;&gt;言語処理100本ノックはじめました(Rust)&lt;/a&gt;という感じで、触っていたのですが、場当たり的にやってても時間を持っていかれるだけだなということに気づいたのが最初です。&lt;/p&gt;
&lt;p&gt;今年の目標は、覚えられなので、ちょっとずつでもアウトプットしていこうってのもあり、
読書記録をつけつつ、読んでいこうかなぁと。&lt;/p&gt;
&lt;h2 id=&#34;どこまで読んだ&#34;&gt;どこまで読んだ?&lt;/h2&gt;
&lt;p&gt;2章の&lt;code&gt;2-2-5&lt;/code&gt;までです。
前回、Rustの環境はセットアップしていたのですが、新PCに切り替わったので、&lt;code&gt;rustup&lt;/code&gt;からはじめました。&lt;/p&gt;
&lt;h3 id=&#34;rustup&#34;&gt;rustup&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;rustup&lt;/code&gt;ではデフォルト設定のままではなく、&lt;code&gt;PATH&lt;/code&gt;変数の書き換えだけはしない形でインストールを行いました。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;PATH&lt;/code&gt;変数は&lt;code&gt;.zshrc&lt;/code&gt;ファイルで変更したかったためです(&lt;code&gt;rustup&lt;/code&gt;コマンドに変更して貰う場合は&lt;code&gt;.profile&lt;/code&gt;などのファイルが変更されそうだったため)。&lt;/p&gt;
&lt;p&gt;インストールが終わったあとに&lt;code&gt;.zshrc&lt;/code&gt;に以下の行を追加しました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;### For Rust env
source $HOME/.cargo/env
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;疑問点&#34;&gt;疑問点&lt;/h2&gt;
&lt;p&gt;ここまで読んだ疑問点です。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;cargo new hello&lt;/code&gt;したあとに&lt;code&gt;main.rs&lt;/code&gt;に以下の&lt;code&gt;main()&lt;/code&gt;関数が出来上がっている!?&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;fn main() {
    println!(&amp;#34;Hello, world!&amp;#34;);
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;驚きましたが、&lt;code&gt;cargo new hoge&lt;/code&gt;ってやっても、おなじ&lt;code&gt;main.rs&lt;/code&gt;ができてました。デフォルトで出来上がるんですね。どんな超能力!?と思ってしまいましたw&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;&lt;code&gt;cargo new hello&lt;/code&gt;して出来上がった&lt;code&gt;Cargo.toml&lt;/code&gt;に著者名が入力されていた。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;authors = [&amp;#34;Jun Ohtani &amp;lt;メアド&amp;gt;&amp;#34;]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;なんで?と思いました。まだ解明してないです。
本を読んでいけばわかるかな?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;予想:gitの設定(&lt;code&gt;~/.gitconfig&lt;/code&gt;)に氏名とメアドが設定されているので、これを利用しているのかな?&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>フリーランスはじめました(仮)</title>
      <link>https://blog.johtani.info/blog/2020/01/31/start-freelance/</link>
      <pubDate>Fri, 31 Jan 2020 20:37:39 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/01/31/start-freelance/</guid>
      <description>&lt;p&gt;12月に&lt;a href=&#34;https://blog.johtani.info/blog/2019/12/06/leaving-elastic/&#34;&gt;退職します&lt;/a&gt;ブログを書きましたが、その後どうなったのか?という話をしてないなと思ったので、一応現在の状況を書き留めておこううかと。&lt;/p&gt;
&lt;h2 id=&#34;結論&#34;&gt;結論&lt;/h2&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;実際にはフリーランスとして働き始めてます。検索周りをお手伝いするお仕事を。読解いとこあれば所属するつもりでもいるし。&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1221819238811230208?ref_src=twsrc%5Etfw&#34;&gt;January 27, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;フリーランスとして最初の仕事はElasticsearchではなく、Azure Cognitive Searchの支援だったりします。Esで困ってる方の手伝いもしますので、興味ある方はDMください。&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1223087120014725122?ref_src=twsrc%5Etfw&#34;&gt;January 31, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;2020年1月24日が、正式なElasticの退職日でした(有給休暇消化してた)。
で、現在のステータスはこのツイートです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;12月に&lt;a href=&#34;https://blog.johtani.info/blog/2019/12/06/leaving-elastic/&#34;&gt;退職します&lt;/a&gt;ブログを書きましたが、その後どうなったのか?という話をしてないなと思ったので、一応現在の状況を書き留めておこううかと。&lt;/p&gt;
&lt;h2 id=&#34;結論&#34;&gt;結論&lt;/h2&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;実際にはフリーランスとして働き始めてます。検索周りをお手伝いするお仕事を。読解いとこあれば所属するつもりでもいるし。&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1221819238811230208?ref_src=twsrc%5Etfw&#34;&gt;January 27, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;フリーランスとして最初の仕事はElasticsearchではなく、Azure Cognitive Searchの支援だったりします。Esで困ってる方の手伝いもしますので、興味ある方はDMください。&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1223087120014725122?ref_src=twsrc%5Etfw&#34;&gt;January 31, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;2020年1月24日が、正式なElasticの退職日でした(有給休暇消化してた)。
で、現在のステータスはこのツイートです。&lt;/p&gt;
&lt;h2 id=&#34;現在の心境&#34;&gt;現在の心境&lt;/h2&gt;
&lt;p&gt;どこかに就職してガッツリ検索もやりたいし、いろんな会社の検索やElastic Stackに関するお手伝いをするのにも興味があるし、どちらにも興味がある状況です。まぁ、検索に興味が尽きないというのだけは決まってますかね。&lt;/p&gt;
&lt;p&gt;悩んでいるところに、幸いにもAzure Search周りで手伝ってほしいという話が舞い込んできたので、フリーランスとしてお手伝いをさせていただいてます(現時点で、半稼働で、が3月末まで)。&lt;/p&gt;
&lt;p&gt;Elastic Stackなどの知見もあるのでのお手伝いをするというのもありかなぁと。お仕事発注してもいいな?という方があれば、TwitterのDMなど、連絡をいただければと。&lt;/p&gt;
&lt;p&gt;現在の状況でした。&lt;/p&gt;
&lt;p&gt;副業ができる会社に就職するのがどっちもできていいのかも?&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>ブログ移行日記(その4) - 検索機能(Algolia)の導入</title>
      <link>https://blog.johtani.info/blog/2020/01/28/introduce-algolia/</link>
      <pubDate>Tue, 28 Jan 2020 13:40:04 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/01/28/introduce-algolia/</guid>
      <description>&lt;p&gt;ブログ移行日記(その4)です。その他の記事はこちら。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/22/intro-hugo-and-theme/&#34;&gt;ブログ移行日記(その1)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/23/convert-md-from-octopress-to-hugo/&#34;&gt;ブログ移行日記(その2)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/24/setting-hugo/&#34;&gt;ブログ移行日記(その3)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/02/21/import-jugem-posts/&#34;&gt;ブログ移行日記(その5)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;前回までで、なんとなく移行は終わってます。
今回はテーマで使えるようになっているブログの検索機能の導入の話です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ブログ移行日記(その4)です。その他の記事はこちら。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/22/intro-hugo-and-theme/&#34;&gt;ブログ移行日記(その1)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/23/convert-md-from-octopress-to-hugo/&#34;&gt;ブログ移行日記(その2)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/24/setting-hugo/&#34;&gt;ブログ移行日記(その3)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/02/21/import-jugem-posts/&#34;&gt;ブログ移行日記(その5)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;前回までで、なんとなく移行は終わってます。
今回はテーマで使えるようになっているブログの検索機能の導入の話です。&lt;/p&gt;
&lt;p&gt;検索サービスは&lt;a href=&#34;https://www.algolia.com/&#34;&gt;Algolia&lt;/a&gt;を利用します。
OctopressのころはElastic社のサービスである&lt;a href=&#34;https://www.elastic.co/jp/site-search&#34;&gt;Elastic Site Search&lt;/a&gt;の機能を利用して、クローリングしてから検索できるようにしていましたが、Hugoで導入できるモジュール?があったので、今回からこちらに移行しました。&lt;/p&gt;
&lt;h2 id=&#34;参考記事&#34;&gt;参考記事&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/zhaohuabing/hugo-theme-cleanwhite#site-search-with-algolia&#34;&gt;Clean White ThemeのREADME(Algoliaの設定方法)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;参考ブログ:&lt;a href=&#34;https://blog.uni-3.app/2019/01/02/hugo-algolia-search/&#34;&gt;hugoで作ったblogにalgoliaで全文検索機能を追加する&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;algoliaとは&#34;&gt;Algoliaとは?&lt;/h2&gt;
&lt;p&gt;検索のas-a-serviceをやっている会社です。&lt;a href=&#34;https://en.wikipedia.org/wiki/Algolia&#34;&gt;Wikipediaによると本社はサンフランシスコにあるみたいですね&lt;/a&gt;(フランスの会社のイメージでした。起業された方がフランス出身だからかなぁ?)。
クラウドで検索インデックスを保持でき、API経由で検索したり登録したりできる感じのサービスです。内部で使われているのはOSSではない独自の検索エンジンです。&lt;/p&gt;
&lt;p&gt;クラウドで提供されているサービスなのでサクッと検索を使い始めることができるのがいい点ですね。
また、&lt;a href=&#34;https://www.algolia.com/pricing/&#34;&gt;小さな非商用のプロジェクトにフリーで利用できるプラン&lt;/a&gt;も提供されているようです(2020年1月現在)。&lt;/p&gt;
&lt;h2 id=&#34;algoliaのサービス登録からインデックス作成&#34;&gt;Algoliaのサービス登録からインデックス作成&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/zhaohuabing/hugo-theme-cleanwhite#site-search-with-algolia&#34;&gt;私が利用しているテーマで設定する方法&lt;/a&gt;の記載があったので手順の通りにやってみました。
大きく2つの作業(Algolia側とHugo側)が必要です。まずは、Algoliaで必要な作業から。作業の流れだけ記載しておきます。&lt;a href=&#34;https://forestry.io/blog/search-with-algolia-in-hugo/#3-create-your-index-in-algolia&#34;&gt;詳細は「Static site search with Hugo + Algolia」の3)&lt;/a&gt;を確認してください。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Algoliaのサインアップ(すでにアカウントがあれば不要)&lt;/li&gt;
&lt;li&gt;New Applicationの作成(名前とプランの指定)&lt;/li&gt;
&lt;li&gt;リージョンの指定&lt;/li&gt;
&lt;li&gt;インデックス名の指定&lt;/li&gt;
&lt;li&gt;APIキーを確認&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;です。これで、Algolia側の準備は完了です。&lt;/p&gt;
&lt;p&gt;今回は関係ないですが、Algoliaの管理画面で、利用状況(データ登録などの操作回数、クエリの回数、インデックスに保存されているレコード数)の確認が可能です。
ほかにも有料プランを利用すると&lt;a href=&#34;https://www.algolia.com/doc/guides/getting-insights-and-analytics/search-analytics/out-of-the-box-analytics/&#34;&gt;Analytics&lt;/a&gt;などもできるようです。&lt;/p&gt;
&lt;h2 id=&#34;hugo側で必要な設定&#34;&gt;Hugo側で必要な設定&lt;/h2&gt;
&lt;p&gt;今度はHugo側です。Hugoのサイトのディレクトリに移動してからの作業です。&lt;/p&gt;
&lt;p&gt;仕組みとしては、&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Hugoのoutput機能でAlgolia向けのJSONファイルを生成する&lt;/li&gt;
&lt;li&gt;Node.jsのライブラリを使用してAlgoliaに1.で生成したJSONを登録、更新する&lt;/li&gt;
&lt;li&gt;検索画面の作成&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;という流れになります。
ですので、作業としては以下のとおりです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Output出力の設定(すでにテーマ側で設定されているので、特に作業は必要なし)&lt;/li&gt;
&lt;li&gt;npm環境の構築(Hugoのconfig.tomlと同じディレクトリ階層)
&lt;ol&gt;
&lt;li&gt;Node.jsのインストール(必要であれば)&lt;/li&gt;
&lt;li&gt;npm環境の初期化&lt;/li&gt;
&lt;li&gt;npmでatomic-algoliaのインストール&lt;/li&gt;
&lt;li&gt;atomic-algolia向けの設定(登録のためのAPI関連の設定)&lt;/li&gt;
&lt;li&gt;Algolia向けJSONの出力設定&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;検索関連の設定
&lt;ol&gt;
&lt;li&gt;content/search/placeholder.mdの作成&lt;/li&gt;
&lt;li&gt;検索用のAPIキーなどを設定&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;npm関連の作業&#34;&gt;npm関連の作業&lt;/h3&gt;
&lt;p&gt;以下、npm関連の作業です。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Node.jsのインストール(必要であれば)
&lt;ul&gt;
&lt;li&gt;割愛します。環境に合わせてインストールしてください。私はnvm経由でインストールしています。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;npm環境の初期化
&lt;ul&gt;
&lt;li&gt;Hugoのディレクトリで&lt;code&gt;nvm init&lt;/code&gt;を実行&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;npmでatomic-algoliaのインストール
&lt;ul&gt;
&lt;li&gt;Hugoのディレクトリで&lt;code&gt;npm install atomic-algolia --save&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;atomic-algolia向けの設定(登録のためのAPI関連の設定)
&lt;ul&gt;
&lt;li&gt;Hugoのディレクトリに&lt;code&gt;.env&lt;/code&gt;ファイルを作成し、以下を設定します。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Algolia向けJSONの出力設定
&lt;ul&gt;
&lt;li&gt;特に変更なし(&lt;code&gt;config.toml&lt;/code&gt;に少し設定があります)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ALGOLIA_APP_ID&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;AlgoliaのApplication ID
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ALGOLIA_ADMIN_KEY&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;AlgoliaのAdmin API Key
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ALGOLIA_INDEX_NAME&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;先程作ったインデックス名
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ALGOLIA_INDEX_FILE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;public/algolia.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最後の&lt;code&gt;ALGOLIA_INDEX_FILE&lt;/code&gt;は固定文字列でいいと思います。
&lt;code&gt;hugo&lt;/code&gt;コマンドを実行すると&lt;code&gt;public&lt;/code&gt;ディレクトリ配下に&lt;code&gt;algolia.json&lt;/code&gt;というファイルが生成され、Algolia登録用のJSONが出力されています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;余談 : algolia.jsonの出力の設定は、config.tomlに記載があります。また、JSONファイルのテンプレート自体は&lt;code&gt;themes/hugo-theme-cleanwhite/layouts/_default/list.algolia.json&lt;/code&gt;にあります。Algoliaに登録するデータの構造など変更をする場合はこのテンプレートをカスタマイズすれば良さそうです。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;検索関連の設定&#34;&gt;検索関連の設定&lt;/h3&gt;
&lt;p&gt;実際に検索の画面を表示するために、検索用の画面と、検索用のAPIの設定が必要です。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;content/search/placeholder.mdの作成
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/search/&lt;/code&gt;が検索用のページになります。空のファイルです。実際にはJavaScriptが検索用の窓を表示したりしてくれます(これが必要な理由がまだ不明だなぁ)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;検索用のAPIキーなどを設定
&lt;ul&gt;
&lt;li&gt;検索のためのAPIキーなどの設定が必要となります。&lt;a href=&#34;https://github.com/zhaohuabing/hugo-theme-cleanwhite/blob/master/exampleSite/config.toml#L32&#34;&gt;テーマ作者の方のサンプルの&lt;code&gt;config.toml&lt;/code&gt;にパラメータは用意されています&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;algolia_search&lt;/span&gt; = &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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;algolia_appId&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AlgoliaのApplication ID&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;algolia_indexName&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;作成したインデックス名&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;algolia_apiKey&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AlgoliaのSearch-Only API Key&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以上でAlgolia関連の設定などの作業が終了です。&lt;/p&gt;
&lt;h2 id=&#34;algoliaへのデータ登録方法&#34;&gt;Algoliaへのデータ登録方法&lt;/h2&gt;
&lt;p&gt;最後に、実際にデータを登録する必要があります。
手順は、以下のとおりです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;hugo&lt;/code&gt;コマンドの実行(htmlと一緒に登録データの&lt;code&gt;algolia.json&lt;/code&gt;を生成)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;npm run algolia&lt;/code&gt;コマンドの実行(atomic-algoliaを利用してAlgoliaにデータを登録)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;設定などが問題なければ、Algoliaの管理画面で登録ができているはずです。
実際にブログのデプロイには&lt;code&gt;deploy.sh&lt;/code&gt;というファイルをこちらを元に作成して使っています。このなかで、&lt;code&gt;hugo&lt;/code&gt;コマンド実行後に&lt;code&gt;npm run algolia&lt;/code&gt;を実行するようにしいます。&lt;/p&gt;
&lt;h2 id=&#34;今後の課題&#34;&gt;今後の課題&lt;/h2&gt;
&lt;p&gt;Hugoで生成された記事はそれぞれのブログポスト以外に、タグごとのページも生成されています。
こちらも実はAlgoliaのインデックスに登録されていて、タグを入力すると、タグ名のリンクが出てきます。&lt;/p&gt;
&lt;p&gt;こちらは&lt;code&gt;elasticsearch&lt;/code&gt;で検索したときの検索結果です。1件目はタグページです。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20200128/tag.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20200128/tag.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;これらのページはAlgoliaに登録しないようにするのが良さそうかな?と考えているところです(考えてるだけ)。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2020/01/29更新&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;list.algolia.json&lt;/code&gt;を編集して、記事だけをインデックスするように修正しました。
テーマに存在する&lt;code&gt;layouts/_default/list.algolia.json&lt;/code&gt;を、自分のところにコピーし、次のように変更しました。if文を1行追加して、&lt;code&gt;post&lt;/code&gt;という種類のものだけを出力するようにしました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{{/* Generates a valid Algolia search index */}}
{{- $.Scratch.Add &amp;#34;index&amp;#34; slice -}}
{{- $section := $.Site.GetPage &amp;#34;section&amp;#34; .Section }}
{{- range .Site.AllPages -}}
  {{- if or (and (.IsDescendant $section) (and (not .Draft) (not .Params.private))) $section.IsHome -}}
    {{- if (and (eq .Section &amp;#34;post&amp;#34;) (ne .URL &amp;#34;/post/&amp;#34;)) -}}
      {{- $.Scratch.Add &amp;#34;index&amp;#34; (dict &amp;#34;objectID&amp;#34; .UniqueID &amp;#34;date&amp;#34; .Date.UTC.Unix &amp;#34;description&amp;#34; .Description &amp;#34;dir&amp;#34; .Dir &amp;#34;expirydate&amp;#34; .ExpiryDate.UTC.Unix &amp;#34;fuzzywordcount&amp;#34; .FuzzyWordCount &amp;#34;keywords&amp;#34; .Keywords &amp;#34;kind&amp;#34; .Kind &amp;#34;lang&amp;#34; .Lang &amp;#34;lastmod&amp;#34; .Lastmod.UTC.Unix &amp;#34;permalink&amp;#34; .Permalink &amp;#34;publishdate&amp;#34; .PublishDate &amp;#34;readingtime&amp;#34; .ReadingTime &amp;#34;relpermalink&amp;#34; .RelPermalink &amp;#34;html&amp;#34; .Params.Description &amp;#34;title&amp;#34; .Title &amp;#34;type&amp;#34; .Type &amp;#34;url&amp;#34; .URL &amp;#34;weight&amp;#34; .Weight &amp;#34;wordcount&amp;#34; .WordCount &amp;#34;section&amp;#34; .Section &amp;#34;tags&amp;#34; .Params.Tags &amp;#34;categories&amp;#34; .Params.Categories &amp;#34;author&amp;#34; .Params.authors &amp;#34;content&amp;#34; .Params.Description &amp;#34;excerpt_html&amp;#34; .Params.Description &amp;#34;excerpt_text&amp;#34; .Params.Description &amp;#34;summary&amp;#34; .Summary)}}
    {{- end -}}
  {{- end -}}
{{- end -}}
{{- $.Scratch.Get &amp;#34;index&amp;#34; | jsonify -}}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;これで、ブログ内記事検索ができるようになります。
Algoliaは個人の非商用利用の場合、フリープランが用意されているのがありがたいですね。
まだ、Hugoと連携しただけで、Algolia自体でどんな機能があって、どんなことができそうかといったところは調べていませんが、簡単に利用できるのはとても助かります。&lt;/p&gt;
&lt;p&gt;まぁ、個人ブログの検索機能ってそんなに使う人はいないんですが、自分としては便利かなぁと。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>ブログ移行日記(その3) - Hugoの設定と微調整(テーマに合わせた)</title>
      <link>https://blog.johtani.info/blog/2020/01/24/setting-hugo/</link>
      <pubDate>Fri, 24 Jan 2020 17:04:41 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/01/24/setting-hugo/</guid>
      <description>&lt;p&gt;ブログ移行日記(その3)です。その他の記事はこちら。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/22/intro-hugo-and-theme/&#34;&gt;ブログ移行日記(その1)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/23/convert-md-from-octopress-to-hugo/&#34;&gt;ブログ移行日記(その2)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/28/introduce-algolia/&#34;&gt;ブログ移行日記(その4)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/02/21/import-jugem-posts/&#34;&gt;ブログ移行日記(その5)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回は、Hugoの設定とテーマの一部変更した点について記載します。&lt;/p&gt;
&lt;h2 id=&#34;設定ファイルconfigtoml&#34;&gt;設定ファイル(config.toml)&lt;/h2&gt;
&lt;p&gt;Hugoの設定ファイルは&lt;code&gt;config.toml&lt;/code&gt;になります。&lt;code&gt;hogo new site&lt;/code&gt;コマンドで生成したディレクトリの中にデフォルトで含まれていますが、こちらではなく、テーマの作者が用意してくれた&lt;a href=&#34;https://github.com/zhaohuabing/hugo-theme-cleanwhite/blob/master/exampleSite/config.toml&#34;&gt;&lt;code&gt;config.toml&lt;/code&gt;&lt;/a&gt;を元に変更を加えました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ブログ移行日記(その3)です。その他の記事はこちら。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/22/intro-hugo-and-theme/&#34;&gt;ブログ移行日記(その1)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/23/convert-md-from-octopress-to-hugo/&#34;&gt;ブログ移行日記(その2)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/28/introduce-algolia/&#34;&gt;ブログ移行日記(その4)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/02/21/import-jugem-posts/&#34;&gt;ブログ移行日記(その5)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回は、Hugoの設定とテーマの一部変更した点について記載します。&lt;/p&gt;
&lt;h2 id=&#34;設定ファイルconfigtoml&#34;&gt;設定ファイル(config.toml)&lt;/h2&gt;
&lt;p&gt;Hugoの設定ファイルは&lt;code&gt;config.toml&lt;/code&gt;になります。&lt;code&gt;hogo new site&lt;/code&gt;コマンドで生成したディレクトリの中にデフォルトで含まれていますが、こちらではなく、テーマの作者が用意してくれた&lt;a href=&#34;https://github.com/zhaohuabing/hugo-theme-cleanwhite/blob/master/exampleSite/config.toml&#34;&gt;&lt;code&gt;config.toml&lt;/code&gt;&lt;/a&gt;を元に変更を加えました。&lt;/p&gt;
&lt;p&gt;ちなみにテーマの作者の方が&lt;a href=&#34;https://github.com/zhaohuabing/hugo-theme-cleanwhite/tree/master/exampleSite&#34;&gt;設定とコンテンツを含めたサンプル&lt;/a&gt;も公開してくれています。設定やディレクトリの構成はこちらを参考にしました。&lt;/p&gt;
&lt;p&gt;設定ファイルで変更した項目は以下のとおりです。&lt;/p&gt;
&lt;h3 id=&#34;サイトのタイトルや説明など&#34;&gt;サイトのタイトルや説明など&lt;/h3&gt;
&lt;p&gt;特記することはありません。好きなように変えました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;baseurl&lt;/li&gt;
&lt;li&gt;title&lt;/li&gt;
&lt;li&gt;SEOTitle&lt;/li&gt;
&lt;li&gt;description&lt;/li&gt;
&lt;li&gt;keyword&lt;/li&gt;
&lt;li&gt;slogan&lt;/li&gt;
&lt;li&gt;sidebar_about_descrption&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;画像関連ヘッダーや著者近影&#34;&gt;画像関連(ヘッダーや著者近影)&lt;/h3&gt;
&lt;p&gt;画像の置き場は&lt;code&gt;static/images/&lt;/code&gt;ディレクトリですが、設定ファイルには
&lt;code&gt;images/&lt;/code&gt;から設定します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;header_image : ブログのヘッダー背景&lt;/li&gt;
&lt;li&gt;sidebar_avatar : 著者近影&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;言語周り特に多言語対応する予定は無いのですが&#34;&gt;言語周り(特に多言語対応する予定は無いのですが)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;languageCode = &amp;ldquo;ja&amp;rdquo;&lt;/li&gt;
&lt;li&gt;defaultContentLanguage = &amp;ldquo;ja&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;オフにした機能削除した項目&#34;&gt;オフにした機能、削除した項目&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;freands = false&lt;/li&gt;
&lt;li&gt;bookmarks = false&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上記の設定変更以外に、&lt;code&gt;[[params.bookmark_link]]&lt;/code&gt;や&lt;code&gt;[[params.friend_link]]&lt;/code&gt;も削除。&lt;/p&gt;
&lt;p&gt;中国のサービスや、特化した設定など。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Baidu Analytics関連&lt;/li&gt;
&lt;li&gt;Disqus proxy関連&lt;/li&gt;
&lt;li&gt;Reward(wechat pay &amp;amp; alipay関連)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;paramssocial関連&#34;&gt;params.social関連&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;rss = true&lt;/li&gt;
&lt;li&gt;twitter&lt;/li&gt;
&lt;li&gt;linkedin&lt;/li&gt;
&lt;li&gt;github&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ほかはすべてコメントアウト。&lt;/p&gt;
&lt;h3 id=&#34;外部サービス関連&#34;&gt;外部サービス関連&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;disqusShortname : Disqusのショートネーム&lt;/li&gt;
&lt;li&gt;googleAnalytics : Gooogle AnalyticsのトラッキングID&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.algolia.com/&#34;&gt;algolia関連&lt;/a&gt; : &lt;em&gt;別のブログ記事として、設定方法などを書きます。&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;追加した設定昨日のブログで説明済み&#34;&gt;追加した設定(&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/23/convert-md-from-octopress-to-hugo/&#34;&gt;昨日のブログで説明済み&lt;/a&gt;)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Octopressと同じ形のパーマリンク&lt;/li&gt;
&lt;/ul&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-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;permalinks&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;post&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/blog/:year/:month/:day/:slug&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Markdownファイル中のHTMLタグ表示&lt;/li&gt;
&lt;/ul&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-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;markup&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;goldmark&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;renderer&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;unsafe&lt;/span&gt; = &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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;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;そのままテーマを適用するだけでうまく行けばよかったのですが、フォントの問題が発生しました。テーマの作者の方が中国の方だから?かどうかはわかりませんが、デフォルトのままだと中華フォントになってしまいました。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;あー、中華フォントだな。 &lt;a href=&#34;https://t.co/OvHpY4LSp1&#34;&gt;pic.twitter.com/OvHpY4LSp1&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1217703951522353152?ref_src=twsrc%5Etfw&#34;&gt;January 16, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;&lt;code&gt;config.toml&lt;/code&gt;に&lt;code&gt;custom_css&lt;/code&gt;という設定があり、こちらで指定したCSSのファイルがテーマの&lt;code&gt;layouts/partials/head.html&lt;/code&gt;から読み込まれる仕組みがあるようなので、フォントに関するCSSをこの機能を使用して指定するようにしました。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;config.toml&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-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;custom_css&lt;/span&gt; = [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;css/custom-font.css&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;cssファイルについては、&lt;code&gt;static/css/custom-font.css&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-css&#34; data-lang=&#34;css&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;body&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;h2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;h3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;h4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;h5&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;h6&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt; .&lt;span style=&#34;color:#a6e22e&#34;&gt;navbar-custom&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;font-family&lt;/span&gt;: Helvetica,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Sawarabi Gothic&amp;#34;&lt;/span&gt;,Meiryo,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;メイリオ&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hiragino Kaku Gothic ProN&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ヒラギノ角ゴ ProN&amp;#34;&lt;/span&gt;,YuGothic,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;游ゴシック&amp;#34;&lt;/span&gt;,Arial,&lt;span style=&#34;color:#66d9ef&#34;&gt;sans-serif&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:#a6e22e&#34;&gt;sidebar-container&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;color&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;#404040&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;font-size&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;14&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;px&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;faviconの変更&#34;&gt;faviconの変更&lt;/h3&gt;
&lt;p&gt;テーマに&lt;code&gt;favicon.ico&lt;/code&gt;が含まれていたのですが、せっかくなので独自のものに変えてみようかと。
ただ、残念ながら、こちらはパスおよびファイル名が&lt;code&gt;layouts/partials/head.html&lt;/code&gt;に&lt;a href=&#34;https://github.com/zhaohuabing/hugo-theme-cleanwhite/blob/c93ea6d2cfaf41f76bb49510c55643ea984e8990/layouts/partials/head.html#L46&#34;&gt;直書き&lt;/a&gt;されていました。&lt;/p&gt;
&lt;p&gt;画像は&lt;code&gt;images&lt;/code&gt;配下にと思っていたのですが、このパスだけを変更するために&lt;code&gt;head.html&lt;/code&gt;を自分の配下にコピーしてカスタマイズするのもどうかと思った(テーマに変更やバグ修正が入るたびに手動でコピーするのはなぁと思った)ので、&lt;code&gt;static/img/favicon.ico&lt;/code&gt;ファイルを作成しました。&lt;/p&gt;
&lt;p&gt;テーマよりもHugoのプロジェクトにあるファイルを優先するようなので、ファイルだけをプロジェクトに作成しました。&lt;/p&gt;
&lt;h3 id=&#34;記事一覧のテンプレート&#34;&gt;記事一覧のテンプレート&lt;/h3&gt;
&lt;p&gt;記事の一覧で表示される、作成者と作成日時が英語表記でかつ、冗長な感じがしたので、スッキリさせるために、&lt;code&gt;layouts/partials/post_list.html&lt;/code&gt;をテーマからコピーして、次のように変更しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;元の形式は : &lt;code&gt;Posted by author Monday, January 2, 2006&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;現在の形式 : &lt;code&gt;2006-01-02 by author&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;記事のテンプレート&#34;&gt;記事のテンプレート&lt;/h3&gt;
&lt;p&gt;今回採用したテーマでは、記事の先頭に記事のセクションを元に目次を生成してくれるものでした。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;目次をコンテンツから自動で作ってくれるの便利だな。 &lt;a href=&#34;https://t.co/9bU3sLnUrm&#34;&gt;pic.twitter.com/9bU3sLnUrm&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1217734384159117312?ref_src=twsrc%5Etfw&#34;&gt;January 16, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;とても便利です。ただ、表示が「TOC」なんです。
英語でしかも「ToC」という表記ならまだ気にならなかったかもですが、&lt;a href=&#34;https://github.com/zhaohuabing/hugo-theme-cleanwhite/blob/c93ea6d2cfaf41f76bb49510c55643ea984e8990/layouts/_default/single.html#L60&#34;&gt;大文字だと&lt;/a&gt;流石に気になったので、プロジェクトの&lt;code&gt;layouts/_default/single.html&lt;/code&gt;にコピーして「目次」という日本語に書き換えました。
このHTMLにテーマで修正が入った場合はどうしようかなぁ。。。というのが目下の悩みです。。。&lt;/p&gt;
&lt;h3 id=&#34;archetypeテンプレートの追加&#34;&gt;Archetypeテンプレートの追加&lt;/h3&gt;
&lt;p&gt;最後は新規記事を書くときに生成されるMarkdownのメタデータの追加です。
Hugoには&lt;a href=&#34;https://gohugo.io/content-management/archetypes/#what-are-archetypes&#34;&gt;Archetypes&lt;/a&gt;というのが存在します。&lt;/p&gt;
&lt;p&gt;Hugoでは&lt;code&gt;hugo new 記事&lt;/code&gt;としたときに、記事の種類(&lt;code&gt;content/ディレクトリ名=記事のタイプ&lt;/code&gt;)によって、作成するmarkdownファイルをテンプレートから生成する機能があります。この生成時に使われるのが&lt;code&gt;archetypes&lt;/code&gt;というディレクトリにあるファイルです。&lt;/p&gt;
&lt;p&gt;私のブログサイトでは、今のところ&lt;code&gt;content/post&lt;/code&gt;というブログの記事だけを書く予定ですので、&lt;code&gt;archetypes/post.md&lt;/code&gt;というファイルを作って以下のようなメタデータを&lt;code&gt;hugo new&lt;/code&gt;したときに自動で生成するようにしました(&lt;a href=&#34;https://github.com/zhaohuabing/hugo-theme-cleanwhite/blob/c93ea6d2cfaf41f76bb49510c55643ea984e8990/archetypes/post.md&#34;&gt;テーマにあった&lt;code&gt;post.md&lt;/code&gt;ファイル&lt;/a&gt;の代わり)。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---
layout: post
title: &amp;#34;{{ replace .Name &amp;#34;-&amp;#34; &amp;#34; &amp;#34; | title }}&amp;#34;
slug: &amp;#34;{{ substr .Name 11 }}&amp;#34;
author: johtani
date: {{ .Date }}
comments: true
tags: []
draft: true
---
&lt;/code&gt;&lt;/pre&gt;&lt;ol&gt;
&lt;li&gt;タイトルはファイル名のハイフンを空白に変換したもの(実際にはファイル名は英語にしているので、使いませんが。。。)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;slug&lt;/code&gt;はファイル名の先頭から&lt;code&gt;YYYY-MM-DD-&lt;/code&gt;という11文字を除いたもの。これは、OctopressのURLに合わせるために使用するURLの一部の文字列です。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;author: johtani&lt;/code&gt; : 著者は私だけだから固定文字列&lt;/li&gt;
&lt;li&gt;&lt;code&gt;comments: true&lt;/code&gt; : ブログ記事にはDisqusのコメント機能を利用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tags: []&lt;/code&gt; : 各内容によってタグを付けるが、生成時には空&lt;/li&gt;
&lt;li&gt;&lt;code&gt;draft: true&lt;/code&gt; : 明示的にこの行を消すまではドラフト記事としたいため&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;という感じです。ほかにどのよなメタデータがあるのかまではまだ調べていないので、今後また適宜変更していくと思います。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Hugoの設定や、テーマそのままではなく独自の変更を加えた部分を思い出して書き出してみました。&lt;/p&gt;
&lt;p&gt;これで、&lt;a href=&#34;https://www.algolia.com/&#34;&gt;Algolia&lt;/a&gt;に関する部分以外はだいたい思い出して書いたと思います。
次は、Algoliaの使い方と設定について書き残す予定です。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>ブログ移行日記(その2) - Markdownファイルの変換</title>
      <link>https://blog.johtani.info/blog/2020/01/23/convert-md-from-octopress-to-hugo/</link>
      <pubDate>Thu, 23 Jan 2020 19:31:54 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/01/23/convert-md-from-octopress-to-hugo/</guid>
      <description>&lt;p&gt;その他の記事はこちら&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/22/intro-hugo-and-theme/&#34;&gt;ブログ移行日記(その1)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/24/setting-hugo/&#34;&gt;ブログ移行日記(その3)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/28/introduce-algolia/&#34;&gt;ブログ移行日記(その4)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/02/21/import-jugem-posts/&#34;&gt;ブログ移行日記(その5)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ブログ移行日記(その2)です。&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/22/intro-hugo-and-theme/&#34;&gt;前回&lt;/a&gt;はHugoとは?というのと、自分が選んだテーマについて記載しました。
本家の手順などを参考にすると、Hugoにテーマを適用し、でHTMLを生成して、表示するところまでできるはずです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;その他の記事はこちら&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/22/intro-hugo-and-theme/&#34;&gt;ブログ移行日記(その1)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/24/setting-hugo/&#34;&gt;ブログ移行日記(その3)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/28/introduce-algolia/&#34;&gt;ブログ移行日記(その4)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/02/21/import-jugem-posts/&#34;&gt;ブログ移行日記(その5)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ブログ移行日記(その2)です。&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/22/intro-hugo-and-theme/&#34;&gt;前回&lt;/a&gt;はHugoとは?というのと、自分が選んだテーマについて記載しました。
本家の手順などを参考にすると、Hugoにテーマを適用し、でHTMLを生成して、表示するところまでできるはずです。&lt;/p&gt;
&lt;p&gt;今回は、OctopressのmarkdownファイルをHugo用に変換する方法について紹介します。お手製ですが、Pythonスクリプトを作ったので、そちらも合わせて簡単に紹介する予定です。&lt;/p&gt;
&lt;h2 id=&#34;参考ブログ&#34;&gt;参考ブログ&lt;/h2&gt;
&lt;p&gt;「Octopress Hugo 移行」でググるといくつか出てきます。先人の知恵ありがたいですね。
ということで、私はこちらの2つのブログを参考にさせていただきました。ありがとうございます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://iriya-ufo.net/blog/2018/12/27/octopress-to-hugo/&#34;&gt;Octopress から Hugo へ移行した - iriya-ufo&amp;rsquo;s blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gam0022.net/blog/2016/09/25/migrated-from-octopress-to-hugo/&#34;&gt;OctopressからHugoへ移行する方法 | gam0022.net&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;画像のコピー&#34;&gt;画像のコピー&lt;/h2&gt;
&lt;p&gt;画像はそのまま上記参考ブログを元に&lt;code&gt;source/images&lt;/code&gt;から&lt;code&gt;static/images&lt;/code&gt;にコピーしました。特にディレクトリ構造の変更とかもしませんでした。&lt;/p&gt;
&lt;h2 id=&#34;コンテンツのコピー&#34;&gt;コンテンツのコピー&lt;/h2&gt;
&lt;p&gt;こちらは、コピーのタイミングでいくつか変換などの処理を行いました。
ファイルの変換には&lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo&#34;&gt;Pythonのスクリプト&lt;/a&gt;を書きました。
自分向けの移行ツールなんで、ディレクトリ名とか引数にすらしてないです。。。&lt;/p&gt;
&lt;p&gt;参考ブログと同様の変換&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo/blob/master/fileconverter.py#L65&#34;&gt;メタデータの日付変換&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo/blob/master/fileconverter.py#L106&#34;&gt;categoriesをtagsに変換&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo/blob/master/fileconverter.py#L83&#34;&gt;画像タグの変換&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;タイトル、画像のサイズなどに合わせていくつか分岐があります。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;参考ブログとは異なる変換、変更&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo/blob/master/fileconverter.py#L110&#34;&gt;コードブロックは無変換&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://gohugo.io/content-management/syntax-highlighting/#highlighting-in-code-fences&#34;&gt;0.60.0からCode Fencesに対応&lt;/a&gt;したみたいなので不要でした。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo/blob/master/fileconverter.py#L38&#34;&gt;ディレクトリ構造の変更&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;ファイルを年ごとのディレクトリに格納(これまでは、全てのファイルが同一ディレクトリにあった)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo/blob/master/fileconverter.py#L38&#34;&gt;拡張子の変更 (&lt;code&gt;.markdown&lt;/code&gt; -&amp;gt; &lt;code&gt;.md&lt;/code&gt;)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo/blob/master/fileconverter.py#L76&#34;&gt;メタデータに&lt;code&gt;author&lt;/code&gt;の追加(自分しか書かないんですけどね)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;urlをoctopressに合わせる&#34;&gt;URLをOctopressに合わせる&lt;/h2&gt;
&lt;p&gt;Google検索からの流入もあり、これまでのURLに変更はかけたくないなと。
こちらも参考ブログに記載があるので、&lt;a href=&#34;https://gam0022.net/blog/2016/09/25/migrated-from-octopress-to-hugo/#octopress%E3%81%A8%E5%90%8C%E4%B8%80%E3%81%AE%E3%83%91%E3%83%BC%E3%83%9E%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%AB%E3%81%99%E3%82%8B-%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3&#34;&gt;そのまま参考に&lt;/a&gt;させていただきました。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;slug&lt;/code&gt;については、&lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo/blob/master/fileconverter.py#L80&#34;&gt;移行ツール&lt;/a&gt;でファイル名を元に追加する処理を書きました。&lt;/p&gt;
&lt;h2 id=&#34;htmlを含んだmarkdownの対応&#34;&gt;HTMLを含んだMarkdownの対応&lt;/h2&gt;
&lt;p&gt;TweetやAmazonのアフィリエイトのリンクがHTMLタグでいくつかの記事に含まれており、デフォルトの設定だと表示されません。
&lt;code&gt;config.toml&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-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;markup&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;goldmark&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;renderer&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;unsafe&lt;/span&gt; = &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;名前が&lt;code&gt;unsafe&lt;/code&gt;なので、ちょっと気になりますが。。。
すべての記事を表示してチェックしてみたわけではないので、おかしな記事を見つけた方は連絡をいただけると助かります。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;OctopressのファイルをHugo用にコピーや変換した方法を思い出しながら書いてみました。基本的には参考ブログに上げた2つのブログを真似したものになります。&lt;/p&gt;
&lt;p&gt;次は、利用したテーマのサンプル設定を元に、自分用に変更した点などについて書き残しておこうかな?&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>ブログ移行日記(その1) - Hugoとテーマ</title>
      <link>https://blog.johtani.info/blog/2020/01/22/intro-hugo-and-theme/</link>
      <pubDate>Wed, 22 Jan 2020 11:23:34 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/01/22/intro-hugo-and-theme/</guid>
      <description>&lt;p&gt;その他の記事はこちら&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/23/convert-md-from-octopress-to-hugo/&#34;&gt;ブログ移行日記(その2)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/24/setting-hugo/&#34;&gt;ブログ移行日記(その3)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/28/introduce-algolia/&#34;&gt;ブログ移行日記(その4)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/02/21/import-jugem-posts/&#34;&gt;ブログ移行日記(その5)&lt;/a&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;ってことで、Hugo勧められたし、テーマが豊富だしということで、乗り換えた次第です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;その他の記事はこちら&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/23/convert-md-from-octopress-to-hugo/&#34;&gt;ブログ移行日記(その2)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/24/setting-hugo/&#34;&gt;ブログ移行日記(その3)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/01/28/introduce-algolia/&#34;&gt;ブログ移行日記(その4)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2020/02/21/import-jugem-posts/&#34;&gt;ブログ移行日記(その5)&lt;/a&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;ってことで、Hugo勧められたし、テーマが豊富だしということで、乗り換えた次第です。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;(元)同僚に教えてもらった記事を見てる。Gatsbyも気になるんだけど、デザインセンスないし、テーマが豊富なのがいいなぁ。/ Comparison of Gatsby vs Jekyll vs Hugo | GatsbyJS - &lt;a href=&#34;https://t.co/yUbKiBmtMS&#34;&gt;https://t.co/yUbKiBmtMS&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://x.com/johtani/status/1215141907967311872?ref_src=twsrc%5Etfw&#34;&gt;January 9, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.x.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;一応Gatsbyのサイトにあった比較も見たのですが、テーマの豊富さが勝ちました。デザインを自分でやれるほどではないので。&lt;/p&gt;
&lt;h2 id=&#34;理由&#34;&gt;理由&lt;/h2&gt;
&lt;p&gt;乗り換えるに至ったのは主に2つの理由です。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Octopressが更新されていない&lt;/li&gt;
&lt;li&gt;ページが増えてきてサイトの生成に時間がかかる&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;前に使っていた&lt;a href=&#34;http://octopress.org/&#34;&gt;Octopress&lt;/a&gt;も&lt;a href=&#34;https://github.com/jekyll/jekyll&#34;&gt;Jekyll&lt;/a&gt;というものがベースになっていました。
Jekyllは今でも更新があるのですが、Octopressが更新されなくなってしまったのと、Rubyがベースになっているため?なのかはわかりませんが、
ブログのページ数が増えてきて、サイトのビルドに時間がかかってくるようになりました。&lt;/p&gt;
&lt;h2 id=&#34;結果&#34;&gt;結果&lt;/h2&gt;
&lt;p&gt;まだ、改良点があるかもですが、とりあえず公開できる感じになったと思ったんで切り替えました。&lt;/p&gt;
&lt;p&gt;前のブログはこんな感じで、&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20200122/octopress.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20200122/octopress.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;移行後はこんな感じです。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20200122/hugo.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20200122/hugo.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h2 id=&#34;hugoとは&#34;&gt;Hugoとは?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://gohugo.io/&#34;&gt;公式サイト&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こちらにあるように、Go言語で実装されているウェブサイト構築フレームワークです。
Go言語で実装されているのもあり、インストールが簡単でした。
Macを使っていますが、&lt;a href=&#34;https://gohugo.io/getting-started/installing/#macos&#34;&gt;Homebrewでインストール&lt;/a&gt;ができてしまいます。
他の方法もあるようでしたが、Emacsをインストールするのにbrewを入れているので、brewでインストールしました。&lt;/p&gt;
&lt;p&gt;使い方は色んな人が書いてるし、公式ドキュメントを見ていただけばいいかな。&lt;/p&gt;
&lt;h2 id=&#34;テーマとは&#34;&gt;テーマとは?&lt;/h2&gt;
&lt;p&gt;Hugoのサイトに&lt;a href=&#34;https://themes.gohugo.io/&#34;&gt;テーマの一覧&lt;/a&gt;があります。
一応、個人のブログなので、それなりにデザインを入れつつ、他の人と違う感じにしたいなと。
テーマ一覧をざっと眺めて良さそうなのをピックアップしたら、最終的にこちらのテーマになりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/zhaohuabing/hugo-theme-cleanwhite&#34;&gt;Clean White&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;それなりに更新されてますし、DisqusとSearch(Algolia)が使えるのでこのテーマに決めました。
テーマのインストール方法などは&lt;a href=&#34;https://github.com/zhaohuabing/hugo-theme-cleanwhite&#34;&gt;GitHubのREADMEの「Quick Start」&lt;/a&gt;に記載があります。&lt;/p&gt;
&lt;p&gt;私は、Hugo自体の設定などをGitHubで管理したかったので、&lt;code&gt;git submodule&lt;/code&gt;を利用して、次のような構成になりました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;hugo - main repository
├── archetypes
├── content
├── data
├── layouts
├── public - github.com/johtani/johtani.github.io
├── resources
├── static
└── themes
    └── hugo-theme-cleanwhite - github.com/zhaohuabing/hugo-theme-cleanwhite.git
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hugo&lt;/code&gt; : &lt;code&gt;hugo new site&lt;/code&gt;コマンドで作成されたディレクトリです。このディレクトリでまず&lt;code&gt;git init&lt;/code&gt;しました(このリポジトリはプライベートで管理してます)。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;themes/hugo-theme-cleanwhite&lt;/code&gt; : テーマのQuick Startにある&lt;code&gt;git submodule add&lt;/code&gt;コマンドでサブモジュールとしてテーマをインストールしました。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;public&lt;/code&gt; : hugoが生成するHTMLのトップのディレクトリがこちらです。私はGitHub pagesを利用してブログを公開しているので、&lt;code&gt;git submodule add&lt;/code&gt;で&lt;code&gt;johtani.github.io&lt;/code&gt;をサブモジュールにしました。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hugoで生成したHTMLなどをGitHub pagesで公開するときの手順などは&lt;a href=&#34;https://gohugo.io/hosting-and-deployment/hosting-on-github/#types-of-github-pages&#34;&gt;Hugoのドキュメント&lt;/a&gt;に記載がありました。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Hugoに移行した理由や、Hugoとテーマの簡単な紹介でした。
テーマが豊富なのはデザイン力(りょく)がない身としてはありがたいですよね。
次はOctopressのmarkdownファイルをHugo用に変換したり、それに関する設定周りの話を書く予定です。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>About</title>
      <link>https://blog.johtani.info/top/about/</link>
      <pubDate>Thu, 16 Jan 2020 18:33:15 +0900</pubDate>
      
      <guid>https://blog.johtani.info/top/about/</guid>
      <description>&lt;p&gt;フリーランスの検索エンジニア/コンサルタント。
元Elastic社のDeveloper Advocate。&lt;/p&gt;
&lt;p&gt;ElasticsearchやOpenSearch、Weaviateなど検索サーバーや、検索サービスに興味があり、&lt;a href=&#34;https://search-tech.connpass.com/&#34;&gt;検索技術勉強会&lt;/a&gt;の運営などを行っている。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;フリーランスの検索エンジニア/コンサルタント。
元Elastic社のDeveloper Advocate。&lt;/p&gt;
&lt;p&gt;ElasticsearchやOpenSearch、Weaviateなど検索サーバーや、検索サービスに興味があり、&lt;a href=&#34;https://search-tech.connpass.com/&#34;&gt;検索技術勉強会&lt;/a&gt;の運営などを行っている。&lt;/p&gt;
&lt;h2 id=&#34;talks&#34;&gt;Talks&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://noti.st/johtani&#34;&gt;noti.st/johtani&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://speakerdeck.com/johtani/&#34;&gt;speakerdeck.com/johtani/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;books&#34;&gt;Books&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.lambdanote.com/collections/ir-system&#34;&gt;検索システム ― 実務者のための開発改善ガイドブック / 2022&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://gihyo.jp/book/2017/978-4-7741-9218-5&#34;&gt;データ分析基盤構築入門 / 2017&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://gihyo.jp/book/2014/978-4-7741-6983-5&#34;&gt;サーバ／インフラエンジニア養成読本 ログ収集〜可視化編 / 2014&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.amazon.co.jp/dp/4048662023/&#34;&gt;(翻訳)高速スケーラブル検索エンジン ElasticSearch Server / 2014&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://gihyo.jp/book/2014/978-4-7741-6163-1&#34;&gt;［改訂新版］Apache Solr入門 / 2013&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://gihyo.jp/book/2010/978-4-7741-4175-6&#34;&gt;Apache Solr入門 / 2010&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>OctopressからHugoへ移行中(まだ途中)</title>
      <link>https://blog.johtani.info/blog/2020/01/16/moving-to-hugo/</link>
      <pubDate>Thu, 16 Jan 2020 18:23:37 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2020/01/16/moving-to-hugo/</guid>
      <description>&lt;p&gt;5年くらい、Octopressを使用していましたが、更新されなくなっているのと、コンテンツの生成に時間がかかることもあり、
ほかのプラットフォームを使用するように変更しました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;5年くらい、Octopressを使用していましたが、更新されなくなっているのと、コンテンツの生成に時間がかかることもあり、
ほかのプラットフォームを使用するように変更しました。&lt;/p&gt;
&lt;p&gt;とりあえず、今回の移行で参考にした記事とかURLをリストアップしてみました。
詳細についてはまた明日以降で。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参考記事
&lt;ul&gt;
&lt;li&gt;移行関連 : &lt;a href=&#34;https://iriya-ufo.net/blog/2018/12/27/octopress-to-hugo/#github-pages-&#34;&gt;https://iriya-ufo.net/blog/2018/12/27/octopress-to-hugo/#github-pages-&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;移行関連 : &lt;a href=&#34;https://gam0022.net/blog/2016/09/25/migrated-from-octopress-to-hugo/&#34;&gt;https://gam0022.net/blog/2016/09/25/migrated-from-octopress-to-hugo/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hugo自体の日本語紹介記事 : &lt;a href=&#34;https://knowledge.sakura.ad.jp/22908/&#34;&gt;https://knowledge.sakura.ad.jp/22908/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Hugo概要
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://gohugo.io/&#34;&gt;https://gohugo.io/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;テーマ
&lt;ul&gt;
&lt;li&gt;一覧 : &lt;a href=&#34;https://themes.gohugo.io/&#34;&gt;https://themes.gohugo.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;利用したテーマ : &lt;a href=&#34;https://github.com/zhaohuabing/hugo-theme-cleanwhite&#34;&gt;https://github.com/zhaohuabing/hugo-theme-cleanwhite&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;データ移行
&lt;ul&gt;
&lt;li&gt;作ったスクリプト : &lt;a href=&#34;https://github.com/johtani/from-octopress-to-hugo&#34;&gt;https://github.com/johtani/from-octopress-to-hugo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;favicon
&lt;ul&gt;
&lt;li&gt;作ったサイト : &lt;a href=&#34;http://emblemmatic.org/markmaker/#/&#34;&gt;http://emblemmatic.org/markmaker/#/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Algoliaセッティング
&lt;ul&gt;
&lt;li&gt;参考 : &lt;a href=&#34;https://blog.uni-3.app/2019/01/02/hugo-algolia-search/&#34;&gt;https://blog.uni-3.app/2019/01/02/hugo-algolia-search/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;GitHub Pagesでの運用
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://gohugo.io/hosting-and-deployment/hosting-on-github/#types-of-github-pages&#34;&gt;https://gohugo.io/hosting-and-deployment/hosting-on-github/#types-of-github-pages&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;残タスク&#34;&gt;残タスク&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Amazonのアフィリンクをきれいに表示するlayoutか何かを用意する?　&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>今年の振り返りと来年の抱負（2019）</title>
      <link>https://blog.johtani.info/blog/2019/12/31/looking-back-2019/</link>
      <pubDate>Tue, 31 Dec 2019 12:59:03 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2019/12/31/looking-back-2019/</guid>
      <description>&lt;p&gt;今年も振り返りブログ書いてます。Sasukeがついてる。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;振り返り2018年に書いた抱負から&#34;&gt;振り返り（2018年に書いた抱負から）&lt;/h2&gt;
&lt;p&gt;まずは去年の抱負を元に。&lt;/p&gt;
&lt;h5 id=&#34;toeic&#34;&gt;TOEIC&lt;/h5&gt;
&lt;p&gt;受けました。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;お。TOEICの点上がってた（まだまだだけど。。。）&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://twitter.com/johtani/status/1186137471551041537?ref_src=twsrc%5Etfw&#34;&gt;October 21, 2019&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;無事、上がってました。テストの点数を上げるのが目的ではなく、今の実力が
どんな感じかというのを確認するために受けました。
前回までが低かったのもあるんですが。
また、数年後に受けてみるのかな?&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今年も振り返りブログ書いてます。Sasukeがついてる。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;振り返り2018年に書いた抱負から&#34;&gt;振り返り（2018年に書いた抱負から）&lt;/h2&gt;
&lt;p&gt;まずは去年の抱負を元に。&lt;/p&gt;
&lt;h5 id=&#34;toeic&#34;&gt;TOEIC&lt;/h5&gt;
&lt;p&gt;受けました。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;お。TOEICの点上がってた（まだまだだけど。。。）&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://twitter.com/johtani/status/1186137471551041537?ref_src=twsrc%5Etfw&#34;&gt;October 21, 2019&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;無事、上がってました。テストの点数を上げるのが目的ではなく、今の実力が
どんな感じかというのを確認するために受けました。
前回までが低かったのもあるんですが。
また、数年後に受けてみるのかな?&lt;/p&gt;
&lt;h5 id=&#34;cfp見つけて応募--いろんな場所に顔を出す&#34;&gt;CfP見つけて応募 &amp;amp; いろんな場所に顔を出す&lt;/h5&gt;
&lt;p&gt;色んな所には顔を出しました。
CfPはそれほど出せていなく、とちぎRubyとDevRelJPで喋った程度かと。
12月に最終出社日を迎えたので、今後は顔を出したりCfP見つけて応募も、
一旦休憩に入る予定です。&lt;/p&gt;
&lt;h5 id=&#34;もっとブログ&#34;&gt;もっとブログ！&lt;/h5&gt;
&lt;p&gt;12月に入ってから、一気に増えてますねw
Elasticでは結局それほどかけなかったなぁ。&lt;/p&gt;
&lt;h5 id=&#34;rustの継続&#34;&gt;Rustの継続&lt;/h5&gt;
&lt;p&gt;こっちは、書籍も買ったのに手がついてないです。
来年に書籍を読みながら再入門する予定です。&lt;/p&gt;
&lt;h5 id=&#34;開発の継続&#34;&gt;開発の継続&lt;/h5&gt;
&lt;p&gt;一応ほそぼそと続けてますが、メンテナンスですね。
Analyzer向けの&lt;a href=&#34;https://github.com/johtani/analyze-api-ui-plugin&#34;&gt;Kibanaのプラグイン&lt;/a&gt;のバージョンアップにだけ対応していたり。
年初にReact化には着手しました。
あとは、Luceneにちょっとしたパッチ(Lukeの画面とKuromojiのUniDic対応)を送った感じかな。もっとLucene周りやりたいかな。&lt;/p&gt;
&lt;h5 id=&#34;日本でエンジニア獲得&#34;&gt;日本でエンジニア獲得!&lt;/h5&gt;
&lt;p&gt;トレーナーやエンジニアが入社してくれました!
が、私が退職してしまいますが。。。
私自体が次のステップに移らないとなぁと。
Elasticに興味がある人いたら、中の人を紹介できるので声をかけてください!&lt;/p&gt;
&lt;h2 id=&#34;振り返り今年あったできごと&#34;&gt;振り返り(今年あったできごと)&lt;/h2&gt;
&lt;p&gt;さて、ここからは今年の出来事を。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;検索技術勉強会発足&lt;/li&gt;
&lt;li&gt;勉強会運営座談会&lt;/li&gt;
&lt;li&gt;初フロリダ&lt;/li&gt;
&lt;li&gt;初カナダ&amp;amp;初ナイアガラの滝&lt;/li&gt;
&lt;li&gt;退職(予定)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;検索技術勉強会ってのをはじめました(&lt;a href=&#34;http://blog.johtani.info/blog/2019/02/26/start-search-engineering-tech-talk/&#34;&gt;はじめましたブログはこちら&lt;/a&gt;)。
やっぱり検索の話を聞いたり考えたりするのが好きなので、もっといろんな話を聞く機会がほしいなぁと。ツイートすると何人かの知り合いが手を上げてくれたので、初めて見たのが2月でした。
所属会社もあったので、自分が全面に出ない形で運営に協力するという形式でやっています。なんだかんだで&lt;a href=&#34;https://search-tech.connpass.com/&#34;&gt;もう4回も開催できています&lt;/a&gt;。スピーカーへの声掛けなど、複数人で運営するとそのあたりが多様性が出るし、楽になるのですごくいいなぁと。
来年も2月か3月にやりたいねと話をしているところです。興味のある方は、ぜひスピーカーを!&lt;/p&gt;
&lt;p&gt;で、その流れで、他の勉強会の運営ってみんなどうしてるんだろう?
という疑問も出てきたので、&lt;a href=&#34;http://blog.johtani.info/blog/2019/04/25/meetup-organizer-drinkup/&#34;&gt;勉強会運営座談会&lt;/a&gt;なるものもやってみました。少人数で集まって、勉強会の運営ってどんなやり方してます?どんなことに困ってます?みたいなのを共有してみました。
自分自身がそれほど、ほかの勉強会の運営に顔を出してたわけでもなく、やり方をみんなはどうやって共有してるのかなぁ?というのが気になったので。
思った以上に属人化してるのかもなぁというのが感想でした。
ドタバタしてたので、あれからやってませんが、共有する勉強会みたいなのも面白いのかも?&lt;/p&gt;
&lt;p&gt;今年も2回ほどElasticの社内イベントで海外に行かせてもらいました。
5月にフロリダと11月にトロントでした。
フロリダでは、NASAにも行けたし、トロントでは足を伸ばしてナイアガラの滝を見に行くなどもしてみました。こういう機会が定期的にあるのは、いいですよねぇ。&lt;/p&gt;
&lt;p&gt;最後は、&lt;a href=&#34;http://blog.johtani.info/blog/2019/12/06/leaving-elastic/&#34;&gt;退職イベント&lt;/a&gt;ですね。5年5ヶ月勤めたElasticでの仕事が、12/6で最終出社日でした。実際の退職日は1/24となっています(現在有給休暇消化中)。長かったような、短かったような。日本で1人目で入社してさまざまなことをやらせてもらい、本当に色んな経験ができました。英語も上達したし。
ただ、外にいることでできることがありそうだなと感じたこともあってのこの決断でした。&lt;/p&gt;
&lt;p&gt;最終出社日以降、色んな人とランチさせてもらったりしています。
次に何をやろうかな?ってのんびり考えながら休んでいるところなので。
やっぱり、検索周りのことをやりたいなぁというのが念頭にあるので、そのあたりで模索中という感じです。
が、せっかくの機会なので、少しのんびりしようかなとも思ってます。
なので、プラモデルの作成や配達業(デス・ストランディング)をやってみたり、16インチMacbookのセットアップしながらブログ書いたりしています。
年明けに入ったら、プログラミングもちょっとやりたいな。&lt;/p&gt;
&lt;p&gt;あとこの場を借りて、ブログの欲しい物リストのものを送っていただいた皆様に感謝を述べさせていただきます。本当にありがとうございました!この感謝はまた何かの機会にでも!&lt;/p&gt;
&lt;h2 id=&#34;来年の抱負&#34;&gt;来年の抱負&lt;/h2&gt;
&lt;p&gt;ということで、来年の抱負です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;職につく&lt;/li&gt;
&lt;li&gt;ブログプラットフォームの移行&lt;/li&gt;
&lt;li&gt;プログラミング&lt;/li&gt;
&lt;li&gt;Rust再入門&lt;/li&gt;
&lt;li&gt;検索の勉強&lt;/li&gt;
&lt;li&gt;検索技術勉強会の継続&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;まぁ、まずは職につかないとですね。どこかに在籍しつつ、副業で検索周りのこととかやるのもありかもなぁと考えたりしています(プラモデルつくりながらw)。&lt;/p&gt;
&lt;p&gt;ブログのプラットフォームをOctopressからHugoあたりに移行しようかなと思ってます。Octopress自体がもう開発がされてないようですし。Hugoだとテンプレート?テーマ?がそれなりにありそうなので良さそうかなぁと。移行プログラムも書かないとかな。新しいものを調べるのって楽しいですよね。&lt;/p&gt;
&lt;p&gt;プログラミングも復活させたいなと。どうしてもこれまでは、しゃべるのをメインにしていたので、後回しにしてしまっていたのもあります。まぁ、向いてないのかもと思ったりもしますが、下手の横好きなりに少しずつでも何かを改善したり作ったりしたいなと。
勉強会の運営周りですこし楽をするためのプログラム書いたりもしているので、この辺もブログに書こうかな?&lt;/p&gt;
&lt;p&gt;Rustは&lt;a href=&#34;https://github.com/tantivy-search/tantivy&#34;&gt;Tantivy&lt;/a&gt;というプロダクトも出てきているし、勉強しようと思って、&lt;a href=&#34;https://gihyo.jp/book/2019/978-4-297-10559-4&#34;&gt;自転車本&lt;/a&gt;を買いつつ、Kindleの肥やしにしているので、手を動かそうとおもいます。
ブログ書いてサボった場合の可視化しないとなw&lt;/p&gt;
&lt;p&gt;検索の勉強もやりたいなと。これまではElasticsearchに注力していましたが、ほかのプロダクトやサービスも調べてみたいなと。教えを請いに皆さんのところにお邪魔するかもしれないので、そのときは優しくしてください。&lt;/p&gt;
&lt;p&gt;今年始めた検索技術勉強会を今後も継続できるようにしたいなと。
で、運営周りを楽にできるような仕組みをもう少し導入できればなぁと考えていきたいなと思います。&lt;/p&gt;
&lt;p&gt;さて、嵐の曲も始まったし終わりです。&lt;/p&gt;
&lt;p&gt;今年も様々な方々に助けていただきました。また、最終出社日以降にランチを一緒にさせていただいたり、遊びに行かせていただいたりとありがとうございました。年明けもひましてるので、ぜひランチしましょうw&lt;/p&gt;
&lt;p&gt;来年はなにやってるんだろうなぁ?
今後も皆さんよろしくおねがいします!!&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>macOS標準のターミナルのウィンドウグループが便利</title>
      <link>https://blog.johtani.info/blog/2019/12/23/whats-window-group-of-terminal/</link>
      <pubDate>Mon, 23 Dec 2019 10:14:39 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2019/12/23/whats-window-group-of-terminal/</guid>
      <description>&lt;p&gt;このブログ書こうと思って、これまでMacのセットアップしてたんだった。。。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;普段、macOSの標準ターミナルを使ってます。
で、ターミナルを使うシーンは次のような感じです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;このブログ書こうと思って、これまでMacのセットアップしてたんだった。。。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;普段、macOSの標準ターミナルを使ってます。
で、ターミナルを使うシーンは次のような感じです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ブログのデプロイ（参考：&lt;a href=&#34;http://blog.johtani.info/blog/2019/12/16/dockernize-octopress/&#34;&gt;Octopress環境のDockerイメージ化&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;ElasticsearchとKibanaの動作確認
&lt;ol&gt;
&lt;li&gt;Elasticsearchの起動用ターミナル&lt;/li&gt;
&lt;li&gt;Kibanaの起動用ターミナル&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;プラグインの開発(&lt;a href=&#34;https://github.com/johtani/elasticsearch-ingest-csv&#34;&gt;elasticsearch-ingest-csv&lt;/a&gt; と &lt;a href=&#34;https://github.com/johtani/analyze-api-ui-plugin&#34;&gt;analyze_api_ui&lt;/a&gt;)
&lt;ol&gt;
&lt;li&gt;elasticsearchのリポジトリ&lt;/li&gt;
&lt;li&gt;kibanaのリポジトリ&lt;/li&gt;
&lt;li&gt;ingest-csvのリポジトリ&lt;/li&gt;
&lt;li&gt;analyze_api_uiのリポジトリ&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;上記のように1.以外については複数のターミナルをそれぞれのディレクトリで起動して使っています。
これらの3つのパターンのときに、毎回ターミナル(シーンによっては複数のウィンドウ)を開いて、ディレクトリに移動って大変だなと。&lt;/p&gt;
&lt;h2 id=&#34;ウィンドウグループって&#34;&gt;ウィンドウグループって？&lt;/h2&gt;
&lt;p&gt;そこで、ターミナルに便利な機能がないのかな?と思い、メニューを見ていたところ「ウィンドウグループ」というのがあったので調べて、現在の使い方に至っています。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20191223/window_group_menu.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20191223/window_group_menu.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href=&#34;https://support.apple.com/ja-jp/guide/terminal/trml15652/mac&#34;&gt;ウィンドウグループの使い方の説明はこちらです&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;使い方にあるようにウィンドウの場所、設定、タブなどを保存できます。
そして、「ウィンドウグループを開く」というメニューから保存しておいたグループを開くと、簡単に作業環境が再現可能になります。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20191223/open_window_group.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20191223/open_window_group.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;開くときのメニューはこんな感じです。&lt;/p&gt;
&lt;h2 id=&#34;作り方&#34;&gt;作り方&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://support.apple.com/ja-jp/guide/terminal/trml15652/mac&#34;&gt;ウィンドウグループの使い方&lt;/a&gt;に載ってます。
まずは、保存したいターミナルを開いて、開いたときに移動していたいディレクトリに移動します。
複数のタブやウィンドウを開いた状態にしたい場合は、複数ターミナルを起動して、それぞれ移動したいディレクトリに移動しておきます。&lt;/p&gt;
&lt;p&gt;グループとしてまとめたいウィンドウが起動できたら、あとは、「ウィンドウ」メニューの「ウィンドウをグループとして保存」を選択します。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20191223/save_window_group.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20191223/save_window_group.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;これだけです。あとは、使いたくなったときに開くだけです。
簡単ですよね?&lt;/p&gt;
&lt;p&gt;作るときの注意点としては、複数のウィンドウグループを作りたいときは、
それぞれグループごとに作成しては、個別にやる必要があります。
現在開いているターミナルのうち、あれとこれをウィンドウにしたいというやり方はできないので、そこだけ注意点です。
環境ごとにプロファイル(バックグラウンドの色やテーマ)を覚えさせることができるので、1.のシーンだとIceberg、2.のシーンではBasic、3.のシーンではHomevrewで設定していたりします。
(ただ、Preztoのテーマを&lt;code&gt;agnoster&lt;/code&gt;にしてしまったので、Basicだとプロンプトが見にくくてしょうがないのですが。。。)&lt;/p&gt;
&lt;h2 id=&#34;設定はどんな感じ&#34;&gt;設定はどんな感じ？？&lt;/h2&gt;
&lt;p&gt;ウィンドウグループの管理については、ターミナルの「環境設定」に管理用の画面があります。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20191223/config_window_group.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20191223/config_window_group.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;この画面でいらないグループを削除したり、設定のエクスポート/インポートも可能です。&lt;/p&gt;
&lt;h2 id=&#34;私の使い方&#34;&gt;私の使い方&lt;/h2&gt;
&lt;p&gt;3つの利用シーンは説明しました。
すべてのウィンドウグループを変更するたびにインポート/エクスポートしてます。
上記1.と3.のユースケースはほぼ変更がないので、エクスポートしたものを移植用に管理していますが、2.のユースケースについては、頻繁に更新しています(ElasticsearchとKibanaのバージョンをアップしないといけないので)。&lt;/p&gt;
&lt;p&gt;このとき、MacのGUIで毎回設定をしているわけではありません。
エクスポートしたファイルは、&lt;code&gt;.terminal&lt;/code&gt;という名のXMLファイルになっています。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20191223/terminal_file.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20191223/terminal_file.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;その中に、次のようなパスが記述されています。このバージョン番号の部分をアップデートのたびにemacsなどで変更し、ターミナルの管理画面で、削除してからインポートし直すだけで、バージョンアップに対応している感じです。&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-xml&#34; data-lang=&#34;xml&#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;&amp;lt;key&amp;gt;&lt;/span&gt;Tab Working Directory URL&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;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;&amp;lt;string&amp;gt;&lt;/span&gt;file://johtani-mac-15.local/Users/johtani/tmp/elastic_stack/v7.5/elasticsearch-7.5.1/&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/string&amp;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;&amp;lt;key&amp;gt;&lt;/span&gt;Tab Working Directory URL String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;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;&amp;lt;string&amp;gt;&lt;/span&gt;file://johtani-mac-15.local/Users/johtani/tmp/elastic_stack/v7.5/elasticsearch-7.5.1&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、標準ターミナルのウィンドウグループを使うと、よく開くディレクトリやウィンドウ、タブを覚えて置かせることができるので、それぞれの環境向けのターミナルを、好きなときに開くことができるようになります。
私は、ウィンドウは1つで複数のタブをウィンドウグループという形で覚えさせておくことで、各シーンの切り替え、もしくは併用を閉じたり開いたりを簡単にできるようにしています。&lt;/p&gt;
&lt;p&gt;他のターミナルソフトを使うと似たようなことが簡単にできたりするのかな?
みなさんがどうやってこのような作業やってるのかな?ってのはちょっと気になるところです。&lt;/p&gt;
&lt;h2 id=&#34;余談いつものようにツイートとその反応&#34;&gt;余談（いつものようにツイートとその反応）&lt;/h2&gt;
&lt;p&gt;ちなみに、みんなどんなターミナル環境なんだろう？と思いツイートしてみた結果はこちらです。
(コメントRTってうまいことひろえないのかなぁ？)&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;Mac標準のターミナル使ってる人ってどのくらいいるんだろ？iTermとか入れてるのかな？tmuxとか？&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://twitter.com/johtani/status/1204686169260187648?ref_src=twsrc%5Etfw&#34;&gt;December 11, 2019&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;Iterm2使ってtmux使って今はIterm2だなー&lt;br&gt;&lt;br&gt;command2回押すだけでターミナル出すくせが抜けん &lt;a href=&#34;https://t.co/P8o4M1HSoj&#34;&gt;https://t.co/P8o4M1HSoj&lt;/a&gt;&lt;/p&gt;&amp;mdash; GO☆ | TAFDATA (@_gogoponz) &lt;a href=&#34;https://twitter.com/_gogoponz/status/1204736394800685057?ref_src=twsrc%5Etfw&#34;&gt;December 11, 2019&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;Alacritty + tmux やなー。標準はもう使ってない。 &lt;a href=&#34;https://t.co/HI7hPCg3uo&#34;&gt;https://t.co/HI7hPCg3uo&lt;/a&gt;&lt;/p&gt;&amp;mdash; Ryo HIGASHIGAWA (@biwakonbu) &lt;a href=&#34;https://twitter.com/biwakonbu/status/1204729048137527296?ref_src=twsrc%5Etfw&#34;&gt;December 11, 2019&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;標準です &lt;a href=&#34;https://t.co/W27e2pcq3j&#34;&gt;https://t.co/W27e2pcq3j&lt;/a&gt;&lt;/p&gt;&amp;mdash; shin higuchi @Acroquest (@shin0higuchi) &lt;a href=&#34;https://twitter.com/shin0higuchi/status/1204727472937267200?ref_src=twsrc%5Etfw&#34;&gt;December 11, 2019&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;Macを買って以来、ずっと結局標準ターミナル以外使っていない感じ。珍しかったのか。。 &lt;a href=&#34;https://t.co/Zjz32SgjC6&#34;&gt;https://t.co/Zjz32SgjC6&lt;/a&gt;&lt;/p&gt;&amp;mdash; Kazuhiro Hara™ (@kara_d) &lt;a href=&#34;https://twitter.com/kara_d/status/1204689857982779393?ref_src=twsrc%5Etfw&#34;&gt;December 11, 2019&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
</content:encoded>
    </item>
    
    <item>
      <title>homeshick導入</title>
      <link>https://blog.johtani.info/blog/2019/12/18/introduce-homeshick/</link>
      <pubDate>Wed, 18 Dec 2019 08:11:06 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2019/12/18/introduce-homeshick/</guid>
      <description>&lt;p&gt;ドットファイル系（&lt;code&gt;.emacs&lt;/code&gt;とか）をこれまでは、PCを引っ越すたびにコピーしてたんですが、いいかげん、GitHubとかで管理したいなと。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;で、ツイートしたところ（こればっかりだなｗ）、homeshick(homesick)が便利だよとの情報を得たので使ってみました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ドットファイル系（&lt;code&gt;.emacs&lt;/code&gt;とか）をこれまでは、PCを引っ越すたびにコピーしてたんですが、いいかげん、GitHubとかで管理したいなと。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;で、ツイートしたところ（こればっかりだなｗ）、homeshick(homesick)が便利だよとの情報を得たので使ってみました。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;homesick、正確にいうとhomeshickを使ってます。悪くないです&lt;/p&gt;&amp;mdash; 🤓k.bigwheel🤓 (@k_bigwheel) &lt;a href=&#34;https://twitter.com/k_bigwheel/status/1204263176566525952?ref_src=twsrc%5Etfw&#34;&gt;December 10, 2019&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;h3 id=&#34;使い方とか&#34;&gt;使い方とか&lt;/h3&gt;
&lt;p&gt;実物はGitHubで公開されていました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/andsens/homeshick&#34;&gt;https://github.com/andsens/homeshick&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;何者かというと、ホームディレクトリにあるドットファイル(&lt;code&gt;.zshrc&lt;/code&gt;など)をgitコマンドで管理するのを楽にしてくれるシェルの関数群みたいです。
インストールは至ってかんたんで、git cloneで持ってくるだけです。&lt;a href=&#34;https://github.com/andsens/homeshick&#34;&gt;homeshick&lt;/a&gt;のリポジトリのREADMEに記載があります。&lt;/p&gt;
&lt;p&gt;使い方は&lt;a href=&#34;https://github.com/andsens/homeshick/wiki/Tutorials&#34;&gt;Tutorials&lt;/a&gt;にあります。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;homeshick generate ほげほげ&lt;/code&gt;で管理する単位（castle）を作ります。&lt;code&gt;ほげほげ&lt;/code&gt;が名称です。今回私は&lt;code&gt;dotfiles&lt;/code&gt;にしました。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;homeshick track ほげほげ .zshrc&lt;/code&gt;で管理したいファイルを指定します。すると、&lt;code&gt;homeshick&lt;/code&gt;が対象のファイル（ここでは&lt;code&gt;.zshrc&lt;/code&gt;）を&lt;code&gt;castle&lt;/code&gt;の保存先ディレクトリにコピーしてから、シンボリックリンクをホームディレクトリ上に作ってくれます。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;homeshick cd ほげほげ&lt;/code&gt;で、&lt;code&gt;castle&lt;/code&gt;の実際のディレクトリに移動します。実態は&lt;code&gt;.homeshick/repos/ほげほげ&lt;/code&gt;です。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git remote&lt;/code&gt;コマンドで&lt;code&gt;castle&lt;/code&gt;とGitHubの関連をつけて、あとは、普通にgitコマンドでコミットしたりすればOKです。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;すごく簡単に導入できました。あとは、実際にtrackしたいファイルを追加していく感じです。
現状は、&lt;code&gt;.zshrc&lt;/code&gt;、&lt;code&gt;.gitconfig&lt;/code&gt;あたりを管理しています。
ついでに、homebrewでインストールしたものも&lt;code&gt;brew bundle dump&lt;/code&gt;で出力して、homeshickで管理することで、brewでインストールしたものの管理もできそう（&lt;a href=&#34;https://github.com/Homebrew/homebrew-bundle#dump&#34;&gt;参考&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;ってことで、至極かんたんでした。すばらしい。&lt;/p&gt;
&lt;h3 id=&#34;参考&#34;&gt;参考&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/andsens/homeshick&#34;&gt;homeshick&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/andsens/homeshick/wiki/Tutorials&#34;&gt;Tutorials&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://qiita.com/yu_suke1994/items/830c7ab8a6bf75044001&#34;&gt;Qiita : homeshickを使ったdotfilesの管理&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>zshへの移行</title>
      <link>https://blog.johtani.info/blog/2019/12/17/move-to-zsh/</link>
      <pubDate>Tue, 17 Dec 2019 09:35:03 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2019/12/17/move-to-zsh/</guid>
      <description>&lt;p&gt;Macbook Proが新しくなり、OSがCatalinaになっちゃいました。
これまで使ってた、&lt;code&gt;.bash_profile&lt;/code&gt;をコピーしてターミナルを立ち上げたところ、
なんか色々と設定が動いてないな？と思ったら、&lt;code&gt;zsh&lt;/code&gt;がデフォルトに切り替わってました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Macbook Proが新しくなり、OSがCatalinaになっちゃいました。
これまで使ってた、&lt;code&gt;.bash_profile&lt;/code&gt;をコピーしてターミナルを立ち上げたところ、
なんか色々と設定が動いてないな？と思ったら、&lt;code&gt;zsh&lt;/code&gt;がデフォルトに切り替わってました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;ということで、デフォルト変わったし、時間あるしzshってどんな感じなのか調べてみようと。&lt;/p&gt;
&lt;h2 id=&#34;準備前ツイート&#34;&gt;準備前（ツイート）&lt;/h2&gt;
&lt;p&gt;で、ツイートをしたところ、海外の方？より返信が来ました。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;I have a series of posts explaining the transition: &lt;a href=&#34;https://t.co/dz8QNjxxGf&#34;&gt;https://t.co/dz8QNjxxGf&lt;/a&gt;&lt;/p&gt;&amp;mdash; Scripting OS X (@scriptingosx) &lt;a href=&#34;https://twitter.com/scriptingosx/status/1204279491331264513?ref_src=twsrc%5Etfw&#34;&gt;December 10, 2019&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;おもしろそうなので、ざっくりと読んでみました。zshを利用されているTwitterの知り合いの何人かからは&lt;code&gt;zsh&lt;/code&gt; + &lt;code&gt;oh-my-zsh&lt;/code&gt;がいいよとコメント頂いてたんですが、&lt;/p&gt;
&lt;h2 id=&#34;moving-to-zsh&#34;&gt;Moving to zsh&lt;/h2&gt;
&lt;p&gt;Catalinaからzshがデフォルトになるからと、手元の環境を変更するための話をブログにまとめてくれてます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://scriptingosx.com/2019/06/moving-to-zsh/&#34;&gt;Moving to zsh&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;サラッと読んだので、いくつか抜粋すると&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;bashでいくつか今設定しているものがあるのでその説明
&lt;ol&gt;
&lt;li&gt;alias - ファイルをそれぞれの拡張子ごとにアプリを切り替えてる（&lt;a href=&#34;https://scriptingosx.com/2017/02/the-macos-open-command/&#34;&gt;&lt;code&gt;open&lt;/code&gt;コマンドの利用例があって参考になりました&lt;/a&gt;）。&lt;/li&gt;
&lt;li&gt;functions - &lt;code&gt;man&lt;/code&gt;コマンドのときに新しいWindowひらいたりとか&lt;/li&gt;
&lt;li&gt;shell settings - 大文字小文字関係なくファイル名をTabで候補を表示したり、historyをターミナル個別ではなく共有できるような設定にしたり&lt;/li&gt;
&lt;li&gt;prompt - 現在のディレクトリがどこかとか表示したり&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;zshの設定ファイル群の説明&lt;/li&gt;
&lt;li&gt;shellオプションの抜粋&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;といった感じでした（途中で読むのやめましたが。。。）&lt;/p&gt;
&lt;p&gt;面白かったのは、&lt;a href=&#34;https://scriptingosx.com/2019/07/moving-to-zsh-part-7-miscellanea/&#34;&gt;Suffix Aliasesです&lt;/a&gt;。
ファイル名だけをターミナルで指定すると、拡張子に応じて起動するコマンドを切り替えたりできると（結局まだ採用はしてないですがｗ）&lt;/p&gt;
&lt;h2 id=&#34;結局&#34;&gt;結局？&lt;/h2&gt;
&lt;p&gt;結局、上記ブログを読んでいろんなオプションあるんだなぁ。と思ったのですが、手っ取り早く試すために&lt;a href=&#34;https://github.com/sorin-ionescu/prezto&#34;&gt;Prezto&lt;/a&gt;をインストールしました。
以下のような構成になってます。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;なるほど、これがzsh + prezto + powerline fontか。前までgit-promptを拾ってきてbashに組み込んでたけど、ブランチ表示されるし便利だな。 &lt;a href=&#34;https://t.co/Z2ArBgRZey&#34;&gt;pic.twitter.com/Z2ArBgRZey&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://twitter.com/johtani/status/1205038841133854720?ref_src=twsrc%5Etfw&#34;&gt;December 12, 2019&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;ul&gt;
&lt;li&gt;Mac標準ターミナル&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://cocopon.github.io/iceberg.vim/&#34;&gt;Iceberg&lt;/a&gt; プロファイル&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/powerline/fonts&#34;&gt;Powerline font&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/sorin-ionescu/prezto&#34;&gt;Prezto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;agnoster theme - &lt;code&gt;prompt agnoster&lt;/code&gt; or ~/.zpreztorc の変更&lt;/li&gt;
&lt;li&gt;.zshrcにいくつかaliasなどを追加。&lt;a href=&#34;https://gist.github.com/johtani/e669a78af70fb34728d4d3be72724526&#34;&gt;参考:gist&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Preztoのデフォルトでlessなどからエディタを立ち上げるとnanoが起動したので、vimに変更&lt;/li&gt;
&lt;li&gt;Preztoが作る設定と自分の設定を混ぜたくなかったので、.zshrcでinit.zshを呼び出し&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;になりました。フォントサイズだけはちょっと大きくしました（老眼ェ。。。）
ターミナルの参考にさせていただいたブログは「&lt;a href=&#34;https://qiita.com/Angelan1720/items/60431c85592fe90fcdd5&#34;&gt;preztoでzsh構築した時のメモ&lt;/a&gt; 」です。&lt;/p&gt;
&lt;h2 id=&#34;ターミナルソフト余談&#34;&gt;ターミナルソフト(余談？)&lt;/h2&gt;
&lt;p&gt;terminalも人によっては、色んなものを使ってたなと思いツイートしました。
結構みなさん標準のterminalを使ってるみたいでした。ただ、私が聞いたこともないターミナルソフトもちらほらあったので、色々あるんだなぁと。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;Mac標準のターミナル使ってる人ってどのくらいいるんだろ？iTermとか入れてるのかな？tmuxとか？&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://twitter.com/johtani/status/1204686169260187648?ref_src=twsrc%5Etfw&#34;&gt;December 11, 2019&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Octopress環境のDockerイメージ化</title>
      <link>https://blog.johtani.info/blog/2019/12/16/dockernize-octopress/</link>
      <pubDate>Mon, 16 Dec 2019 10:01:01 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2019/12/16/dockernize-octopress/</guid>
      <description>&lt;p&gt;最近使っていたPCが手元からなくなったので、16インチ Macbook Proをセットアップしているところです。
で、時間もあるのでこれまでほったらかしてきた、このブログの環境をちょっと変更しようかなと。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;最近使っていたPCが手元からなくなったので、16インチ Macbook Proをセットアップしているところです。
で、時間もあるのでこれまでほったらかしてきた、このブログの環境をちょっと変更しようかなと。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;まずは、変更するにしても、Octopressのブログの環境自体は必要です。
実際に、移行する前のこの記事自体も書いているわけですし。&lt;/p&gt;
&lt;p&gt;ただ、今後なくなる環境をローカル環境にセットアップするのもどうかと思い、Docker環境にしてみました。&lt;/p&gt;
&lt;h3 id=&#34;参考&#34;&gt;参考&lt;/h3&gt;
&lt;p&gt;&amp;ldquo;Octopress Docker image&amp;quot;でググって出てきたサイトを参考にしました。&lt;/p&gt;
&lt;p&gt;参考ブログ：&lt;a href=&#34;http://pappanyn.me/blog/2017/04/12/octopress-in-a-docker-container/&#34;&gt;Octopress in a Docker Container&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;セットアップからdockerイメージのビルドまで&#34;&gt;セットアップからDockerイメージのビルドまで&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Docker for Mac自体もインストールしていなかったので、インストールしておきます。&lt;/li&gt;
&lt;li&gt;参考ブログの方がGitHubのリポジトリにDockerfileをアップしてくれているので、手順に従い、cloneします。
&lt;ol&gt;
&lt;li&gt;cloneしたDockerfileの3行目に&lt;code&gt;ENV LC_ALL C.UTF-8&lt;/code&gt;を追加します（UTF-8でブログを書いており、previewした場合にエラーが出たため）&lt;/li&gt;
&lt;li&gt;参考ブログにある「Build the docker image」の手順に従い、Gemfile、.gitconfigをコピーしてイメージをビルドします。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;参考ブログの「Rakefile」にあるように、自分の&lt;code&gt;octopress/Rakefile&lt;/code&gt;の&lt;code&gt;Process.spawn(...)&lt;/code&gt;にアドレスを追加します（Dockerコンテナの外からアクセスできるように）&lt;/li&gt;
&lt;li&gt;自分のoctopressにある&lt;code&gt;Gemfile.lock&lt;/code&gt;を削除しました（ビルドしたイメージにはいるGemと一部バージョンが異なる記載のものがあったため）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ここまでで、&lt;/p&gt;
&lt;h3 id=&#34;docker-run&#34;&gt;Docker run&lt;/h3&gt;
&lt;p&gt;実際にコンテナを実行するためのスクリプトを書きました（書いたと言っても参考ブログにある起動コマンドを叩いてるだけですが。。。）&lt;/p&gt;
&lt;p&gt;&lt;code&gt;launch-octopress-docker.sh&lt;/code&gt;というファイル名で以下のコマンドを実行してるだけです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;!/bin/sh
docker run -p 4000:4000 --rm --volume /Users/johtani/projects/blog/octopress:/octopress --volume /Users/johtani/.ssh:/home/blogger/.ssh -ti blog/octopress /bin/bash
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;このシェルを起動すると、Dockerコンテナにbashで接続し、&lt;code&gt;/octopress&lt;/code&gt;ディレクトリにログインしています。
あとは、いつものように&lt;code&gt;rake new_post[&amp;quot;....&amp;quot;]&lt;/code&gt;で新規記事のテンプレートを作成したりすればOKです。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;rake generate; rake preview&lt;/code&gt;と実行してからローカルのブラウザで&lt;code&gt;http://localhost:4000&lt;/code&gt;に接続すればプレビューも可能。&lt;/p&gt;
&lt;p&gt;ということで、このDockerファイルとかを持っておけば、他の環境でもかんたんにOctopressの環境が再現できそうです。
先人の知恵有り難し。
これで、クリーンなまま他のブログ環境に移行できそう。&lt;/p&gt;
&lt;h2 id=&#34;追記20191217&#34;&gt;追記(2019/12/17)&lt;/h2&gt;
&lt;p&gt;Docker環境でいくつか問題があったので、追記しておきます。&lt;/p&gt;
&lt;h3 id=&#34;docker-for-macが再起動しない&#34;&gt;Docker for Macが再起動しない&lt;/h3&gt;
&lt;p&gt;Docker for MacがCatalina環境だと問題があるみたいでした。
CPUの数やメモリの数を変更してDockerを再起動したところ、ずっとStartingのまま。&lt;/p&gt;
&lt;p&gt;解決方法としては、&lt;a href=&#34;https://github.com/docker/for-mac/issues/3941#issuecomment-539101508&#34;&gt;launchctlの設定に$PATHを追加するみたい&lt;/a&gt;。これで、問題なく起動するようになった気がする&lt;/p&gt;
&lt;h3 id=&#34;sshの設定ファイルの問題&#34;&gt;sshの設定ファイルの問題&lt;/h3&gt;
&lt;p&gt;.ssh/configにMacのKeyChainを利用する設定を記載してるんですが、Ubuntu上だとこの設定のせいで、エラーが出てしまいます。
&lt;a href=&#34;https://gotohayato.com/content/466/&#34;&gt;IgnoreUnknownという設定で、知らないオプションがあったら無視するという設定になる模様&lt;/a&gt;。ということで、Dockerコンテナ上で&lt;code&gt;rake deploy&lt;/code&gt;のときにエラーが出てたのが解消できました。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>退職します</title>
      <link>https://blog.johtani.info/blog/2019/12/06/leaving-elastic/</link>
      <pubDate>Fri, 06 Dec 2019 15:51:30 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2019/12/06/leaving-elastic/</guid>
      <description>&lt;p&gt;本日、Elasticでの最終出社日でした。実際の退職日はまだ先ですが、有休消化という感じです。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;思い返せばもう5年と5ヶ月も前ですが、&lt;a href=&#34;https://blog.johtani.info/blog/2014/07/01/join-elasticsearch/&#34;&gt;Elastic（当時はElasticsearchって社名だった）に参加しました&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;社名も変わりましたし、プロダクトの数も増えたし、IPOもしました。
初の外資＋スタートアップということもあり、ものすごくエキサイティングな5年半でした。
Elasticを離れはしますが、検索自体にはまだまだ興味があるので、LuceneやElasticsearchになにかしら関わる感じのことをする予定です。
&lt;a href=&#34;https://search-tech.connpass.com&#34;&gt;検索技術勉強会&lt;/a&gt;も今後もやっていきますし。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;本日、Elasticでの最終出社日でした。実際の退職日はまだ先ですが、有休消化という感じです。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;思い返せばもう5年と5ヶ月も前ですが、&lt;a href=&#34;https://blog.johtani.info/blog/2014/07/01/join-elasticsearch/&#34;&gt;Elastic（当時はElasticsearchって社名だった）に参加しました&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;社名も変わりましたし、プロダクトの数も増えたし、IPOもしました。
初の外資＋スタートアップということもあり、ものすごくエキサイティングな5年半でした。
Elasticを離れはしますが、検索自体にはまだまだ興味があるので、LuceneやElasticsearchになにかしら関わる感じのことをする予定です。
&lt;a href=&#34;https://search-tech.connpass.com&#34;&gt;検索技術勉強会&lt;/a&gt;も今後もやっていきますし。&lt;/p&gt;
&lt;p&gt;ただ、激動の5年半だったので、退職日までちょっとゆっくりしようと思っています。
次にどんなことをするのかはまた、別の機会にでも。&lt;/p&gt;
&lt;h2 id=&#34;おまけ&#34;&gt;おまけ&lt;/h2&gt;
&lt;p&gt;ということで、まぁお約束です。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.amazon.jp/hz/wishlist/ls/29EMX20UN9P16?ref_=wl_share&#34;&gt;ほしい物リストはこちら&lt;/a&gt;&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Apache LuceneのKuromojiのUniDicビルド対応パッチについて</title>
      <link>https://blog.johtani.info/blog/2019/12/04/about-lucene-4056/</link>
      <pubDate>Wed, 04 Dec 2019 00:00:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2019/12/04/about-lucene-4056/</guid>
      <description>&lt;p&gt;これは、&lt;a href=&#34;https://qiita.com/advent-calendar/2019/search&#34;&gt;情報検索・検索エンジン Advent Calendar 2019&lt;/a&gt; の 4 日目の記事です。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;1日目から、質の高いエントリーが続いていましたが、一旦休憩して頂く感じの記事になってます。気軽に読んでくださいw。Advent Calendarつくらないの？と煽ったのもあり、穴を埋めようかなと。　&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;これは、&lt;a href=&#34;https://qiita.com/advent-calendar/2019/search&#34;&gt;情報検索・検索エンジン Advent Calendar 2019&lt;/a&gt; の 4 日目の記事です。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;1日目から、質の高いエントリーが続いていましたが、一旦休憩して頂く感じの記事になってます。気軽に読んでくださいw。Advent Calendarつくらないの？と煽ったのもあり、穴を埋めようかなと。　&lt;/p&gt;
&lt;h2 id=&#34;発端&#34;&gt;発端&lt;/h2&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;ちょっと先ですがこういうのやります。実装寄りの話やOSS開発に興味がある方，きてください～ / Lucene 版 &lt;a href=&#34;https://twitter.com/hashtag/Kuromoji?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#Kuromoji&lt;/a&gt; のコードを読む会（辞書ビルダー編） &lt;a href=&#34;https://t.co/NgEmUohoPo&#34;&gt;https://t.co/NgEmUohoPo&lt;/a&gt; &lt;a href=&#34;https://twitter.com/hashtag/kuromoji?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#kuromoji&lt;/a&gt;&lt;/p&gt;&amp;mdash; Tomoko Uchida (@moco_beta) &lt;a href=&#34;https://twitter.com/moco_beta/status/1169795202376073217?ref_src=twsrc%5Etfw&#34;&gt;September 6, 2019&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;&lt;a href=&#34;https://search-tech.connpass.com/event/146365/&#34;&gt;「Lucene 版 #Kuromoji のコードを読む会（辞書ビルダー編）」&lt;/a&gt;という勉強会があり、参加したところ、UniDicの辞書のビルドがコケるという話を聞いたんで、ちょっとやってみるかと。&lt;/p&gt;
&lt;p&gt;ちなみに、Kuromojiとは、Apache Luceneに入っている、日本語向けの形態素解析ライブラリです。IPAdicの辞書を内包しており、SolrやElasticsearchといった、Apache Luceneを利用している検索エンジンで手軽に使える形態素解析ライブラリになっています。が、対応している辞書がデフォルトだとIPAdicなのです。&lt;/p&gt;
&lt;h2 id=&#34;問題点&#34;&gt;問題点&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://issues.apache.org/jira/browse/LUCENE-4056&#34;&gt;LUCENE-4056&lt;/a&gt;というIssueが上がっています。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;build.xml&lt;/code&gt;には記載はないけど、&lt;a href=&#34;https://github.com/apache/lucene-solr/blob/master/lucene/analysis/kuromoji/src/java/org/apache/lucene/analysis/ja/util/DictionaryBuilder.java#L44&#34;&gt;辞書のビルダーは対応していそうな雰囲気&lt;/a&gt;を醸し出しているので、試してみたというのが発端？かと。で、実際に動かしてみると動かない点がありましたと。&lt;/p&gt;
&lt;p&gt;また、Issueの会話で出ていたUniDicの辞書のライセンスの話もありました。
ただ、&lt;a href=&#34;https://unidic.ninjal.ac.jp&#34;&gt;UniDic&lt;/a&gt;がライセンスを変更したので、このあたりはクリアできそうかなと。&lt;/p&gt;
&lt;h2 id=&#34;パッチ&#34;&gt;パッチ&lt;/h2&gt;
&lt;p&gt;ということで、動かしてみていくつか修正してパッチを作りました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/apache/lucene-solr/pull/935&#34;&gt;https://github.com/apache/lucene-solr/pull/935&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;最近のLuceneはGitHubでプルリク遅れるのが便利ですね。
そんなに大したことはやってないです。以下の点が問題だったので直しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IPAdicとUniDicで語彙定義ファイルのCSVの形式（カラムの数）が異なる&lt;/li&gt;
&lt;li&gt;unk.defのカラム数も異なる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;あとは、辞書のダウンロードの部分や&lt;code&gt;build.xml&lt;/code&gt;での処理を追加した形です。
このプルリクを適用したlucene-solrのソースディレクトリを持ってきて、手元でjarをビルドすれば普通はIPAdicの辞書を内包したkuromojiのjarファイルが出来上がります。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;lucene/analysis/kuromoji/build.xml&lt;/code&gt;ファイルを、&lt;a href=&#34;https://gist.github.com/johtani/91cfd2753aba2e001c1d39f47666ada7&#34;&gt;このGist&lt;/a&gt;にあるように変更して、&lt;code&gt;ant build-dict&lt;/code&gt;とやれば辞書のビルドが可能です。
また、&lt;code&gt;cd lucene/;ant jar&lt;/code&gt;とすれば、UniDicの辞書を内包したjarファイルもビルドできます(&lt;code&gt;lucene/build/analysis/kuromoji&lt;/code&gt;の下にjarファイルができあがります)。&lt;/p&gt;
&lt;h2 id=&#34;確認&#34;&gt;確認？&lt;/h2&gt;
&lt;p&gt;一応、パッチは動くのですが、パッチ自体はUniDicの辞書をビルドする仕組みはオフのままです。なので、テストをどうやろう？というところでやなんで止まっています。。。&lt;/p&gt;
&lt;p&gt;ただ、実際に作ったパッチできちんとIPAdicとUniDicがそれぞれビルドできているかの確認はしないとなと。&lt;/p&gt;
&lt;p&gt;ということで、2つのjarファイルを読み込んで、それぞれトークナイズして、その出力を表示する&lt;a href=&#34;https://github.com/johtani/check-dictionary&#34;&gt;ツールを作ってみました&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;上記パッチを適用したlucene-solrのソースを持ってきて、IPAdicの辞書を内包したkuromojiのjarファイルと、UniDicの辞書を内包したjarファイルを用意し、ツールの支持に従って、ファイルをディレクトリに配置して、実行すれば以下のような出力がされるようになっています（とりあえず作ったものなので、Javaファイルにトークナイズしたいテキストを書かないといけないのですが）。&lt;/p&gt;
&lt;p&gt;たとえば、「自転車と自動車の違いはなんでしょう？」という文字列を入力すると、以下のような出力になりました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;+++ ipadic ++++++++++++++
token[0] is [自転車]
token[1] is [と]
token[2] is [自動車]
token[3] is [の]
token[4] is [違い]
token[5] is [は]
token[6] is [なん]
token[7] is [でしょ]
token[8] is [う]
+++ unidic ++++++++++++++
token[0] is [自転]
token[1] is [車]
token[2] is [と]
token[3] is [自動]
token[4] is [車]
token[5] is [の]
token[6] is [違い]
token[7] is [は]
token[8] is [なん]
token[9] is [でしょう]
&lt;/code&gt;&lt;/pre&gt;&lt;!-- textlint-disable jtf-style/4.3.2.大かっこ［］ --&gt;
&lt;p&gt;UniDicは[短単位]で語彙が扱われるため、「自転車」や「自動車」がそれぞれ「自転」「車」、「自動」「車」という形でトークナイズされていることがわかります。&lt;/p&gt;
&lt;!-- textlint-enable jtf-style/4.3.2.大かっこ［］ --&gt;
&lt;p&gt;どちらがより便利なのか？というのは用途によっても変わってくるかと思いますが、検索の転置インデックスとしては、より短い単語で区切られている方が、より多くの文書にヒットする可能性が高くなるので、便利な可能性が高いです。&lt;/p&gt;
&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;
&lt;p&gt;ということで、パッチを作ってみたものの、まだ取り込まれていない状況です。
着地点をどうするかって話かなと思っています。興味があれば遊んでみていただければと。&lt;/p&gt;
&lt;p&gt;将来的には、&lt;a href=&#34;https://issues.apache.org/jira/browse/LUCENE-8816&#34;&gt;辞書をjarから切り離して別のディレクトリやjarとして使えるようにしよう&lt;/a&gt;というIssueも作られています。こちらがすすめば、UniDicだけでなく、その他の辞書を切り替えながら使えるようになる日が来るのではないでしょうか？&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>2019年のElastic StackとElastic</title>
      <link>https://blog.johtani.info/blog/2019/12/01/whats-happen-at-elastic-in-2019/</link>
      <pubDate>Sun, 01 Dec 2019 00:00:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2019/12/01/whats-happen-at-elastic-in-2019/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://qiita.com/advent-calendar/2018/elasticsearch&#34;&gt;Elastic stack (Elasticsearch) Advent Calendar 2019&lt;/a&gt;の1日目の記事になります。&lt;/p&gt;
&lt;p&gt;まだ、1ヶ月を残してますが、簡単に今年起こったことを振り返ってみようと思います。毎年恒例ですね、ここ数年。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://qiita.com/advent-calendar/2018/elasticsearch&#34;&gt;Elastic stack (Elasticsearch) Advent Calendar 2019&lt;/a&gt;の1日目の記事になります。&lt;/p&gt;
&lt;p&gt;まだ、1ヶ月を残してますが、簡単に今年起こったことを振り返ってみようと思います。毎年恒例ですね、ここ数年。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h3 id=&#34;elastic-stack-660リリース1月&#34;&gt;Elastic Stack 6.6.0リリース(1月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/elastic-stack-6-6-0-released&#34;&gt;リリース記事はこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Elastic APMが6.6のリリースと同時にElastic CloudでAPM Serverが無料で利用できるようになったのが地味に便利でした。APMのデモをやるために、それまでは手元にAPM Serverの起動が必要だったので。。。&lt;/p&gt;
&lt;p&gt;ユーザーの方たちにはIndex Lifecycle Management（インデックスライフサイクル管理：ILM）がリリースされたのが便利だったと思います。
まだ、ベータでしたが、インデックスの世代管理を格段に便利にしてくれるツールになり、現在では必須アイテムとなっています。
もう一つ、地味に便利なのは、KibanaからElasticsearchへの接続を複数指定できるようになった点かと思います。&lt;/p&gt;
&lt;h3 id=&#34;elatic-common-schemaのベータリリース2月&#34;&gt;Elatic Common Schemaのベータリリース(2月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/introducing-the-elastic-common-schema&#34;&gt;リリース記事はこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Elastic Stackではメトリック、APM、ログなど、様々なデータを一元的に可視化することができるという利点があります。ただ、一元的にデータを可視化、検索するためには異なるデータセットに統一されたフィールド名が欠かせません。そのための手段としてElasticが公開したのが&lt;a href=&#34;https://github.com/elastic/ecs&#34;&gt;Elastic Common Schema&lt;/a&gt;です。
各種データの項目名、型などを共通化する仕様をGitHub上で公開しています。最近のBeatsのモジュールはこのElastic Common Schemaに則ってデータが定義されるようになってきています。これにより、ログからメトリックへ、APMからログデータへというシームレスな移動ができるようになっています。&lt;/p&gt;
&lt;h3 id=&#34;elastic-stack-670リリース3月&#34;&gt;Elastic Stack 6.7.0リリース(3月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/elastic-stack-6-7-0-released&#34;&gt;リリース記事はこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Elastic MapsやUptimeといった、これまでの可視化とは異なる便利なアプリが増え始めました。Mapsでは地図の表現が格段にアップしたので、コレまで以上に地理情報と合わせた可視化が楽しくなりました。&lt;/p&gt;
&lt;p&gt;もちろん、基本的に必要な技術が着実にGAされていくのもElastic Stackの素晴らしい点です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Index Lifecycle Management(ILM)がGA&lt;/li&gt;
&lt;li&gt;Cross Cluster Replication(CCR)がGA&lt;/li&gt;
&lt;li&gt;CanvasがGA&lt;/li&gt;
&lt;li&gt;Logs &amp;amp; Infra UIがGA&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;elastic-stack-700リリース4月&#34;&gt;Elastic Stack 7.0.0リリース(4月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/elastic-stack-7-0-0-released&#34;&gt;リリース記事はこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;メジャーバージョンのリリースです。
KibanaのUIが刷新されたり、Elasticsearchのクラスター管理の機能が新規に構築されたり、様々な改善がこのリリースでも入っています。また、メジャーバージョンのリリースのタイミングが、さまざまな大きな仕様の変更や改善が入るタイミングでもあります。これまで以上にパフォーマンスが改善（Top-Nクエリ高速化など）されたり、新しい機能の追加（ナノ秒のサポート）されたりしました。&lt;/p&gt;
&lt;h3 id=&#34;elasticsearchのセキュリティの主要な機能が無料に5月&#34;&gt;Elasticsearchのセキュリティの主要な機能が無料に(5月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/security-for-elasticsearch-is-now-free&#34;&gt;リリース記事はこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;6.8.0および7.1.0のリリースはこの機能の無償提供となりました。
結構衝撃的な話だったのではないかなぁと。これ以前は有償の機能だったセキュリティの以下の機能をElastic License配下で無料で提供する形に変わりました。まだ、ご存知でない方は、データの安全のためにもセキュリティ機能を利用することをおすすめします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TLSによる通信暗号化&lt;/li&gt;
&lt;li&gt;ユーザー作成と管理にファイルおよびネイティブのレルム認証を使用可能&lt;/li&gt;
&lt;li&gt;クラスターAPIとインデックスに対するユーザーアクセスの管理にロールベースのアクセス制御を使用可能、またSpaces機能でKibanaのマルチテナンシーの安全性を向上&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;elasticon19開催5月&#34;&gt;Elastic{ON}19開催(5月)&lt;/h3&gt;
&lt;p&gt;今年も東京で開催しました。ビデオなどはこちらで公開されています。
&lt;a href=&#34;https://www.elastic.co/elasticon/tour/2019/tokyo&#34;&gt;https://www.elastic.co/elasticon/tour/2019/tokyo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;今回も偉そうにElatic Stackの新しくなった点を紹介するなどしてました。。。&lt;/p&gt;
&lt;h3 id=&#34;elastic-stack-720リリース6月&#34;&gt;Elastic Stack 7.2.0リリース(6月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/elastic-stack-7-2-0-released&#34;&gt;リリース記事はこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/introducing-elastic-siem&#34;&gt;Elastic SIEMがベータリリース&lt;/a&gt;されたのがこのタイミングです。
2月の発表したElastic Common Schemaをフルに活用していると言ってもいいのがこの機能になります。まだ今後もどんどん改善が入るであろうきのうになります。&lt;/p&gt;
&lt;p&gt;また、Elasticsearchをバックエンドにした検索ミドルウェアとして利用いただける&lt;a href=&#34;https://www.elastic.co/blog/elastic-app-search-7-2-0-released&#34;&gt;Elastic App Searchのセルフマネージド版&lt;/a&gt;もこのタイミングでリリースされています。&lt;/p&gt;
&lt;p&gt;さらに、このリリースの直前には&lt;a href=&#34;https://www.elastic.co/jp/blog/announcing-elastic-cloud-on-kubernetes-eck-0-9-0-alpha-2&#34;&gt;Elastic Cloud on Kuberunetes(ECK)というものベータリリース&lt;/a&gt;されました。少しわかりにくいかもですが、ElasticsearchやKibanaをKubernetesのOperatorとして利用できるようになっています。こちらもElastic Licenseでリリースされているのでk8s上でKibanaやEsを管理しようとしている方は触ってみると面白いかもです。&lt;/p&gt;
&lt;h3 id=&#34;elastic-cloud-elasticsearch-serviceがgcp日本で利用可能に7月&#34;&gt;Elastic Cloud Elasticsearch ServiceがGCP日本で利用可能に(7月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/elasticsearch-service-is-now-available-on-google-cloud-platform-gcp-in-japan&#34;&gt;リリース記事はこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Elastic Cloudもプラットフォームが拡大した年でした。
Google Cloud Platformの東京リージョンを選択できるようになりました。さらなる統合（支払いをGCP経由にまとめたり、GCPのコンソールから利用できたりなど）も進んでいます。&lt;/p&gt;
&lt;h3 id=&#34;elastic-stack-730リリース8月&#34;&gt;Elastic Stack 7.3.0リリース(8月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/elastic-stack-7-3-0-released&#34;&gt;リリース記事はこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;データフレームと呼ばれるデータ取り込み時のピボット機能が導入されました。また、MapsのGAリリース、Elastic APMの.NETエージェント正式リリースなど、細かいですが様々なものがリリースされています。&lt;/p&gt;
&lt;h3 id=&#34;elastic-cloud-elasticsearch-serviceがazureで利用可能に9月&#34;&gt;Elastic Cloud Elasticsearch ServiceがAzureで利用可能に(9月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/elasticsearch-service-on-elastic-cloud-now-available-on-microsoft-azure&#34;&gt;リリース記事はこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Microsoft Azureへのデプロイも可能になりました。残念ながらまだ日本リージョンには来ていないですが、今後出てくるはずです！さまざまなクラウドベンダーのサポートにより、より多くの人に使っていただけるようになるのかと。&lt;/p&gt;
&lt;h3 id=&#34;elastic-stack-740リリース10月&#34;&gt;Elastic Stack 7.4.0リリース(10月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/elastic-stack-7-4-0-released&#34;&gt;リリース記事はこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;もう7.4.2まで出ていますが、いい感じの間隔で7.0、7.2、7.3と来ていますね。
7.4では、スナップショットリストアがKibanaから簡単に行えるようになりました。これまではKibanaのConsoleでJSONを見ながら管理されていたかもですが、GUIにより今どんなスナップショットがあるのか、どれをリストアするのかといった操作が簡単にできるようになっています。&lt;/p&gt;
&lt;p&gt;KibanaについてはPKI認証のサポートなども始まり、様々な認証方式でより便利にKibanaが使えるようになっています。&lt;/p&gt;
&lt;h3 id=&#34;12月&#34;&gt;12月？&lt;/h3&gt;
&lt;p&gt;12月ですし、&lt;a href=&#34;https://www.meetup.com/ja-JP/Tokyo-Elastic-Fantastics/events/266551992/&#34;&gt;Elasticsearch勉強会では「LT＆忘年会」ということで、懇親会がメインの勉強会として12/6に開催&lt;/a&gt;します。悪路クエストの緑川さん、吉岡さんに主体となっていただき、マイクロソフトさんを会場に借りて開催予定です。興味のある方はぜひご参加ください。
LTもおまちしています！&lt;/p&gt;
&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;
&lt;p&gt;駆け足でしたが今年を振り返ってみました。
今年も色々ありました。残すところあと1ヶ月です！&lt;/p&gt;
&lt;p&gt;さて、&lt;a href=&#34;https://qiita.com/advent-calendar/2019/elasticsearch&#34;&gt;Elastic Stack Advent Calendar 2019&lt;/a&gt;は今日から25日まで続きます。今年は&lt;a href=&#34;https://qiita.com/advent-calendar/2019/elasticsearch2&#34;&gt;その2&lt;/a&gt;もできています！こらからの記事を楽しみにしています！
本日は&lt;a href=&#34;https://qiita.com/advent-calendar/2019/elasticsearch2&#34;&gt;その2&lt;/a&gt;で**[kaibadash@github]**さんが「5分でできるElastic stack環境構築」というのを書いてくれてるはずです！&lt;/p&gt;
&lt;p&gt;ということで、次は&lt;a href=&#34;https://qiita.com/KunihikoKido&#34;&gt;KunihikoKido&lt;/a&gt;さんの「
Elastic Cloud を使うようになって設計方針やら変わったことについて書きます。」になります。お楽しみに！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Bonfire Data &amp; Science #1に参加しました</title>
      <link>https://blog.johtani.info/blog/2019/10/25/bonefire-01/</link>
      <pubDate>Fri, 25 Oct 2019 19:40:02 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2019/10/25/bonefire-01/</guid>
      <description>&lt;p&gt;Bonfire Data &amp;amp; Science #1にブログ枠で参加してきました。
ということで、メモです。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;ul&gt;
&lt;li&gt;日時 : 2019/10/25 19:00 - 21:30&lt;/li&gt;
&lt;li&gt;場所 : Yahoo! Japan&lt;/li&gt;
&lt;li&gt;サイト : &lt;a href=&#34;https://yj-meetup.connpass.com/event/148121/&#34;&gt;https://yj-meetup.connpass.com/event/148121/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ハッシュタグ: &lt;a href=&#34;https://twitter.com/search?q=%23yjbonfire%20&amp;amp;src=typed_query&amp;amp;f=live&#34;&gt;#yjbonfire&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;概要&#34;&gt;概要&lt;/h2&gt;
&lt;p&gt;Data &amp;amp; Scienceとは？
データとサイエンスに関わる人達の情報共有のための勉強会/交流会&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Bonfire Data &amp;amp; Science #1にブログ枠で参加してきました。
ということで、メモです。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;ul&gt;
&lt;li&gt;日時 : 2019/10/25 19:00 - 21:30&lt;/li&gt;
&lt;li&gt;場所 : Yahoo! Japan&lt;/li&gt;
&lt;li&gt;サイト : &lt;a href=&#34;https://yj-meetup.connpass.com/event/148121/&#34;&gt;https://yj-meetup.connpass.com/event/148121/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ハッシュタグ: &lt;a href=&#34;https://twitter.com/search?q=%23yjbonfire%20&amp;amp;src=typed_query&amp;amp;f=live&#34;&gt;#yjbonfire&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;概要&#34;&gt;概要&lt;/h2&gt;
&lt;p&gt;Data &amp;amp; Scienceとは？
データとサイエンスに関わる人達の情報共有のための勉強会/交流会&lt;/p&gt;
&lt;p&gt;サイトから引用です。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;第1回のテーマは「画像検索」です！

最近EC系のサイトで類似画像検索が出来るようになったけどどうやってるの？
画像検索のモデルってどうしてるの？
画像検索のインフラはどうしてるの？
私たちの会社でも画像検索を用いたサービスを構築できるだろうか？
こういった疑問に答えたり、いま抱えている悩みを解決するヒントを得る場になればと思っています。

今回は、画像検索を行なっているヤフー, メルカリ, ZOZOテクノロジーズの3社に事例と基盤技術について登壇いただきます。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;QAはこちら。https://app.sli.do/event/w3wayjmv/live/questions&lt;/p&gt;
&lt;h2 id=&#34;mercari画像検索について仮&#34;&gt;Mercari画像検索について(仮)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;発表者：荒瀬晃介(株式会社メルカリ / AIエンジニアリングチーム)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AIエンジニアチーム&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;写真検索プロジェクトのTech Lead&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;iOSのみで提供の写真検索&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;システムオーバービュー&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MobileNet v2で特徴抽出&lt;/li&gt;
&lt;li&gt;ANNのインデックスを使ってDBに入れる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;論文も発表済み（3本）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;今日の発表はこの内の2本を元に話をします。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;c2cでの問題点&#34;&gt;C2Cでの問題点&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;商品は床やテーブル上で撮影&lt;/li&gt;
&lt;li&gt;クエリは着用（着ている）画像が使われやすい。
&lt;ul&gt;
&lt;li&gt;人が写ってる写真が結果に多いと業者が出展しているように見えてしまう。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;提案手法&#34;&gt;提案手法&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;人が写ってるものから人の代表ベクトルを抜き取る (クエリ時にのみ処理を実施しているので変更が容易)&lt;/li&gt;
&lt;li&gt;特徴変換ベクトル
&lt;ul&gt;
&lt;li&gt;トップスなど、分類ごとに学習させてからベクトルを構成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;なんでMobileNet v2?
&lt;ul&gt;
&lt;li&gt;エッジデバイスでの処理を見据えて選択&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;インフラ&#34;&gt;インフラ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Docker + k8s&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CRDを使ってる？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;training&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コンテナベースパイプライン
&lt;ul&gt;
&lt;li&gt;いくつかのバッチ処理を工程ごとにパイプライン化&lt;/li&gt;
&lt;li&gt;バッチ実行情報をカスタムリソースとしている＝再実行が簡単（復旧作業が容易）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;画像を扱う＝ダウンロードが時間がかかる -&amp;gt; 復旧しやすいようにPVにある程度キャッシュさせている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Serving&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GCP側&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;なぜ2つに別れてるんだろう？実際のサービスも2つに分かれてたりするんだろうか？&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;将来の展望&#34;&gt;将来の展望&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Realtime Image Search
&lt;ul&gt;
&lt;li&gt;カメラでものを写している状態でそれが何かを検索できる。&lt;/li&gt;
&lt;li&gt;物体検出＋特徴抽出をエッジで行うためできる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;エッジの性能により違いが出てきたりするっぽい&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;qa&#34;&gt;QA&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Q: 業者が想定されると、購入意欲を下げるというのは実験した結果？それとも想像？
&lt;ul&gt;
&lt;li&gt;A: 実験はしていないが、e-commerceにおいての研究がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q: どういう理由でマルチクラウドにしたんでしょう?
&lt;ul&gt;
&lt;li&gt;A: 画像のマスターがAWS。メルカリのマイクロサービスはGKEなので、サービング環境がGCP&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q: 画像の内、服のエリアが大部分で体の面積が少ない場合と、メガネや帽子のように、アイテムの方の面積が少ない場合で、トレーニングに必要なデータ数は変わりましたか？
&lt;ul&gt;
&lt;li&gt;A: カテゴリによる性質の違うはある。ので、改善は必要。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;zozo画像検索について仮&#34;&gt;ZOZO画像検索について(仮)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;発表者：平田拓也(株式会社ZOZO / AIエンジニアリングチーム)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(聞き逃した。。。)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;WEAR&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;マルチサイズ&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;チーム構成&#34;&gt;チーム構成&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;研究所＋ML Opsチーム&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;使用しているアルゴリズム&#34;&gt;使用しているアルゴリズム&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;物体検出アルゴリズム&lt;/li&gt;
&lt;li&gt;特徴量抽出アルゴリズム&lt;/li&gt;
&lt;li&gt;近似最近傍探索（approximate nearest neighbor, ANN）&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;インフラ-1&#34;&gt;インフラ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;GCPを採用。
&lt;ul&gt;
&lt;li&gt;BigQuery上にデータ基盤がある&lt;/li&gt;
&lt;li&gt;Managed GPUが必要&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;なんでk8s?
&lt;ul&gt;
&lt;li&gt;コンテナ&lt;/li&gt;
&lt;li&gt;Cloud Runがなかった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;アーキテクチャ&#34;&gt;アーキテクチャ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;マイクロサービス化されている&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://techblog.zozo.com/entry/cloudnext19tokyo-imagesearch&#34;&gt;Google Cloud Next 2019 Tokyoでsonotsさんの発表があるよ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;監視項目&#34;&gt;監視項目&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;CPUなどは見ていない&lt;/li&gt;
&lt;li&gt;レスポンスタイムとステータス監視&lt;/li&gt;
&lt;li&gt;リクエスト数&lt;/li&gt;
&lt;li&gt;APM&lt;/li&gt;
&lt;li&gt;使ってるものStackdriver + Datadog + Sentry
&lt;ul&gt;
&lt;li&gt;Warningが30分で続けたら通知などができるのがStackdriver&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;画像検索の改善のためにやっていること&#34;&gt;画像検索の改善のためにやっていること&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;課題
&lt;ul&gt;
&lt;li&gt;レイテンシーが大きい
&lt;ul&gt;
&lt;li&gt;推論が大変？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;急激なトラフィックの増加に対応できない
&lt;ul&gt;
&lt;li&gt;GPUのスケールアウトが問題 -&amp;gt; 先行投資が必要&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;流れ
&lt;ol&gt;
&lt;li&gt;キャッシュありなし&lt;/li&gt;
&lt;li&gt;物体検出 (GPU)&lt;/li&gt;
&lt;li&gt;特徴量抽出 (GPU)&lt;/li&gt;
&lt;li&gt;近似最近傍探索&lt;/li&gt;
&lt;li&gt;DBから取得&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2と3が問題&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2と3を特徴量DBという形でデータが登録された時点で特徴量などを計算してしまうことでGPUへの依存をなくした。&lt;/li&gt;
&lt;li&gt;Apache AirFlowが便利？&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;cloud-composerとapache-airflow&#34;&gt;Cloud ComposerとApache AirFlow&lt;/h4&gt;
&lt;p&gt;Cloud Composerに関するいくつかのTipsがありました。&lt;/p&gt;
&lt;h4 id=&#34;qa-1&#34;&gt;QA&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Q: 推論をCPUでやったらどれぐらい遅いんだろう
&lt;ul&gt;
&lt;li&gt;A: GPUインスタンス代金 &amp;lt; それと同等の速度を出すためのCPUインスタンス代金&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q: k8sスケールアウト時のリソース割当を最適化する為、resource limit / request標準化 or 時系列分析などから自動調整するなどはされていますか？
&lt;ul&gt;
&lt;li&gt;A: &amp;hellip;聞き逃した&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q: (TCOを考慮したクラスタ構成) Cloud Composerの値段が高いようなパプリッククラウド利用の課題対策としてプライベートクラウドとのハイブリッド構成にされているのでしょうか？もしハイブリッド構成でしたら、パブリック or クラウドを切り分ける基準はございますか。
&lt;ul&gt;
&lt;li&gt;A: GKEオンリー&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q: cloud composerでairflowを使う辛い点は？
&lt;ul&gt;
&lt;li&gt;A: 不安定さ。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;yahooショッピングにおける画像検索仮&#34;&gt;Yahoo!ショッピングにおける画像検索(仮)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;発表者：佐藤 純一(ヤフー株式会社)&lt;/li&gt;
&lt;li&gt;商品検索APIの開発とか検索エンジンの保守とか&lt;/li&gt;
&lt;li&gt;類似画像検索システムの開発が直近の仕事&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;類似画像検索&#34;&gt;類似画像検索&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ヤフーショッピング
&lt;ul&gt;
&lt;li&gt;3億の商品&lt;/li&gt;
&lt;li&gt;ファッション系はビジュアルが重要＝言語による表現が難しい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;iOSとAndroid
&lt;ul&gt;
&lt;li&gt;Androidだとカメラで撮影してから検索みたいなことも可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;システム概要&#34;&gt;システム概要&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;物体検出&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;ノイズ除去&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;特徴抽出&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;インデックス(NGT) -&amp;gt; &lt;a href=&#34;https://github.com/yahoojapan/NGT&#34;&gt;https://github.com/yahoojapan/NGT&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;1000万件を超える&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;検索&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;アプリの画像をAPIに投げてベクトルから、近いものn件を取得&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;ベクトル化インデックス更新&#34;&gt;ベクトル化/インデックス更新&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;GPUマシン&lt;/li&gt;
&lt;li&gt;Kafka使ってる&lt;/li&gt;
&lt;li&gt;クラウドストレージに日次？バックアップみたいに保存&lt;/li&gt;
&lt;li&gt;差分更新の仕組みがある&lt;/li&gt;
&lt;li&gt;メンズとレディースは分けている
&lt;ul&gt;
&lt;li&gt;絞り込み検索のために分離（インデックスのメタデータとしてタグがある）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;システム構成&#34;&gt;システム構成&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Kafka&lt;/li&gt;
&lt;li&gt;TensolflowServing&lt;/li&gt;
&lt;li&gt;可視化？監視？はGrafana＋Prometheus&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;開発を通しての学び&#34;&gt;開発を通しての学び&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;自動デプロイとかテスト&lt;/li&gt;
&lt;li&gt;検索精度の確認ツールを作る
&lt;ul&gt;
&lt;li&gt;コレ重要だよね。何が変更してるかとか、何が正しいかってのが必要だし。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;復旧可能、早期復旧の仕組みを容易&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;今後の方針&#34;&gt;今後の方針&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;対象商品の拡大&lt;/li&gt;
&lt;li&gt;物体検出特徴抽出モデルの性能改善&lt;/li&gt;
&lt;li&gt;NGTの検索システムをValdに移行
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/vdaas/vald&#34;&gt;Vald&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;k8s上で動作、分散検索、分散インデキシングなどの機能を提供予定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;qa-2&#34;&gt;QA&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Q: iOS(既存の画像)とAndroid(カメラで撮る)で画像検索の方式が違うのはなぜ？
&lt;ul&gt;
&lt;li&gt;A: アプリの違い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q: 1枚の写真に沢山写っている中で、対象の商品をどう識別しているんでしょう。靴もトップスもボトムスも写っていたら、かなり難しそう
&lt;ul&gt;
&lt;li&gt;A: Yahooブラウザの場合は1番大きな領域のものを選択。Yahoo shoppingだと選択可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;ngtについて仮&#34;&gt;NGTについて(仮)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;発表者：岩崎 雅二郎(ヤフー株式会社)&lt;/li&gt;
&lt;li&gt;類似画像検索を20年くらいやってる&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;近傍検索ライブラリ&#34;&gt;近傍検索ライブラリ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/yahoojapan/NGT&#34;&gt;https://github.com/yahoojapan/NGT&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;高次元ベクトルの近傍検索&lt;/li&gt;
&lt;li&gt;ツリーとグラフによるインデックス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;近傍検索とは?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;距離空間上でのクエリの近傍のオブジェクトを取得
&lt;ul&gt;
&lt;li&gt;k最近傍検索（通常はこっち）&lt;/li&gt;
&lt;li&gt;範囲検索（あんまり使われない）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;NGTの特徴&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;世界トップレベルの高速高精度な近似近傍検索&lt;/li&gt;
&lt;li&gt;OSS&lt;/li&gt;
&lt;li&gt;追加削除が可能（削除がとくに難しいらしい）&lt;/li&gt;
&lt;li&gt;多様な利用形態（Python、C++、C、Go、コマンドライン）&lt;/li&gt;
&lt;li&gt;サーバ版NGT（ngtd、vald）を提供&lt;/li&gt;
&lt;li&gt;共有メモリ版でメモリサイズ以上のデータ登録可能&lt;/li&gt;
&lt;li&gt;量子化版NGT（NGTQ）により。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ANNベンチマークによりテスト&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;実行環境が決められているらしい。誰が実行しても比較可能&lt;/li&gt;
&lt;li&gt;グラフベースの検索の仕組みのほうが性能がいいというのがベンチマーク結果からわかる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;なんではやいの&#34;&gt;なんではやいの？&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;インデックス生成
&lt;ul&gt;
&lt;li&gt;ツリー（グラフの探索起点の取得に利用する。DVP-tree）&lt;/li&gt;
&lt;li&gt;グラフ（ANNG）
&lt;ul&gt;
&lt;li&gt;ノードを逐次追加しつつ、近傍ノードを検索してから接続するというのを繰り返している&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;検索
&lt;ul&gt;
&lt;li&gt;ツリーから絞り込みつつ、グラフを検索する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ANNGに課題があるのでONNG（Optimized Nearest Neighbors Graph）に
&lt;ul&gt;
&lt;li&gt;ノード単位の次数（入出）を最適化&lt;/li&gt;
&lt;li&gt;データセットによって有効な次数が違う。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;ngtを利用した深層学習で&#34;&gt;NGTを利用した深層学習で。。。&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Yahoo!ラボ FavNavi&lt;/li&gt;
&lt;li&gt;特徴量の構成（低次特徴量（300次元）、カテゴリ特徴量（128次元）、領域アスペクト比（1次元））
&lt;ul&gt;
&lt;li&gt;個別の特徴量だけだとイマイチな結果になるが、組み合わせるといい感じになる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;モデル性西洋学習データ&#34;&gt;モデル性西洋学習データ&lt;/h4&gt;
&lt;p&gt;スライドがあればいいなぁ（表書くの大変だし。。。）&lt;/p&gt;
&lt;h4 id=&#34;qa-3&#34;&gt;QA&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Q: 実際のお客さまの利用を考えると、近似近隣の密度が異なるので、近いものばかりの検索結果や遠いものも含んでしまった検索結果が出ると思うのですが、遠いものが含まれてしまうと、閾値でフィルタしたりするのでしょうか?
&lt;ul&gt;
&lt;li&gt;A: NGTは近いものしかないので、外れ値ってなんでしょう。。。
&lt;ul&gt;
&lt;li&gt;検索のフィルタリングをある程度している（カテゴリとか）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch NEXT STEP 2を頂きました</title>
      <link>https://blog.johtani.info/blog/2019/10/10/review-es-next-step-2/</link>
      <pubDate>Thu, 10 Oct 2019 15:56:29 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2019/10/10/review-es-next-step-2/</guid>
      <description>&lt;p&gt;この間の&lt;a href=&#34;https://www.meetup.com/ja-JP/Tokyo-Elastic-Fantastics/events/264954133/&#34;&gt;Elasticsearch勉強会&lt;/a&gt;でAcroquest Technologyの人たちが&lt;a href=&#34;http://acro-engineer.hatenablog.com/entry/2019/09/19/120000&#34;&gt;技術書展7で販売されていた書籍&lt;/a&gt;を頂いてしまいました。なので、軽く読んでの感想と宣伝です（これ、電子版とかで買えないのかな？）。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Elasticのパートナーとしても活躍していただいてますが、こういう感じでさまざまなところでElastic Stackを広めていただいていて感謝しかありません。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;この間の&lt;a href=&#34;https://www.meetup.com/ja-JP/Tokyo-Elastic-Fantastics/events/264954133/&#34;&gt;Elasticsearch勉強会&lt;/a&gt;でAcroquest Technologyの人たちが&lt;a href=&#34;http://acro-engineer.hatenablog.com/entry/2019/09/19/120000&#34;&gt;技術書展7で販売されていた書籍&lt;/a&gt;を頂いてしまいました。なので、軽く読んでの感想と宣伝です（これ、電子版とかで買えないのかな？）。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Elasticのパートナーとしても活躍していただいてますが、こういう感じでさまざまなところでElastic Stackを広めていただいていて感謝しかありません。&lt;/p&gt;
&lt;p&gt;章立てとしては以下の通りです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Elasticsearchでエンタープライズサーチを実現する&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;同僚が作成、メンテナンスしている&lt;a href=&#34;https://fscrawler.readthedocs.io/en/latest/#&#34;&gt;FSCrawler&lt;/a&gt;を使った例も書かれています。ローカルのファイル（PDFやJSONとか）をサクッとElasticsearchにインストールしたりするのには便利です。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Kibana Canvasによる柔軟な可視化&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Canvasについてどんなものなのか？というのと&lt;a href=&#34;https://github.com/elastic/examples/tree/master/canvas/elasticoffee&#34;&gt;elasticcofee&lt;/a&gt;というサンプルを元に、その変更の仕方などが説明されています。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Elastic APMによるアプリケーションパフォーマンス監視&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Go AgentとAPM自体の使い方の説明です。最近強化されている他の機能との連携（AlertingやMachine Learning）についても触れてくれています。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;Kubernetesクラスタのメトリクス・ログ・性能情報の可視化&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Azure上でAzure Kubernetes Serviceの上で動いているアプリなどをBeats、APMでデータを取りつつ、他のAzure上に&lt;a href=&#34;https://azuremarketplace.microsoft.com/en-us/marketplace/apps/elastic.elasticsearch?tab=Overview&#34;&gt;Azure Marketplaceのテンプレート&lt;/a&gt;を用いて起動したElasticsearchとKibanaの環境を用いて可視化する方法が説明されています。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ということで、薄い本ですが、手順をおって説明されていたり、7.3と新しいバージョンで書かれているのですばらしいなぁと。
前作の&lt;a href=&#34;https://amzn.to/322j99v&#34;&gt;「Elasticsearch NEXT STEP」&lt;/a&gt;に引き続きインプレスさんから出たりするのかなぁ？&lt;/p&gt;
&lt;p&gt;ちなみに、Elastic APMのRubyに関して興味がある方は、私が前に発表したときの資料がありますので、&lt;a href=&#34;https://noti.st/johtani/eJPLbZ/elastic&#34;&gt;こちらを参考に&lt;/a&gt;してみてください。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elastic Stackで始めるアプリケーション監視</title>
      <link>https://blog.johtani.info/presentation/2019/elastic-stack/</link>
      <pubDate>Fri, 04 Oct 2019 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2019/elastic-stack/</guid>
      <description></description>
      <content:encoded></content:encoded>
    </item>
    
    <item>
      <title>ソフトウェアのテストしてますか？では、ドキュメントは？</title>
      <link>https://blog.johtani.info/presentation/2019/a9o44g/</link>
      <pubDate>Sat, 07 Sep 2019 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2019/a9o44g/</guid>
      <description></description>
      <content:encoded></content:encoded>
    </item>
    
    <item>
      <title>アプリケーション(パフォーマンス) 監視入門 - Elastic編</title>
      <link>https://blog.johtani.info/presentation/2019/elastic/</link>
      <pubDate>Sat, 29 Jun 2019 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2019/elastic/</guid>
      <description></description>
      <content:encoded></content:encoded>
    </item>
    
    <item>
      <title>勉強会の受付自作？アプリ？HTMLについて</title>
      <link>https://blog.johtani.info/blog/2019/06/19/qr-code-with-meetup-dot-com/</link>
      <pubDate>Wed, 19 Jun 2019 19:10:44 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2019/06/19/qr-code-with-meetup-dot-com/</guid>
      <description>&lt;p&gt;Twitterで「Meetup.comに切り替えたらー」みたいな話があったので、
受付用アプリとかなくてという話になったので、普段Elasticsearch勉強会で使用している
QRコード生成の仕組みを紹介してみようかと。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Twitterで「Meetup.comに切り替えたらー」みたいな話があったので、
受付用アプリとかなくてという話になったので、普段Elasticsearch勉強会で使用している
QRコード生成の仕組みを紹介してみようかと。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;HTMLだけで済むようにQRコードを生成する&lt;code&gt;jquery.qrcode.min.js&lt;/code&gt;ってのを使用してます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://gist.github.com/johtani/657df4dcfa7c31a86575760e23b64f7d&#34;&gt;HTMLコードはこちら&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id=&#34;仕組み&#34;&gt;仕組み&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;1枚だけのHTMLを生成&lt;/li&gt;
&lt;li&gt;Meetupの&lt;a href=&#34;https://www.meetup.com/ja-JP/meetup_api/auth/#oauth2&#34;&gt;OAuth2&lt;/a&gt;の仕組みを利用(consumer keyを発行する必要あり。)&lt;/li&gt;
&lt;li&gt;Meetup APIを利用してユーザー情報取得&lt;/li&gt;
&lt;li&gt;取得したユーザー情報をGoogle Formに埋め込んだ形で表示するURLを組み立てる&lt;/li&gt;
&lt;li&gt;組み立てたURLをQRコードにしてHTMLに表示&lt;/li&gt;
&lt;li&gt;受付で、QRコードリーダーを使って、QRコードを読み込むとGoogle Formが開くので、「送信」ボタンを押す&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;1-htmlの作成&#34;&gt;1. HTMLの作成&lt;/h3&gt;
&lt;p&gt;QRコードを表示するためのHTMLを作成します。Gistに貼り付けてあるので、参考にしてもらえれば。
いくつか埋め込まないといけないものがあるので、個別にそれは説明します。&lt;/p&gt;
&lt;h3 id=&#34;2-google-formの準備&#34;&gt;2. Google Formの準備&lt;/h3&gt;
&lt;p&gt;Elasticsearch勉強会では、出席者の情報として、IDと氏名をリストとして保存しています。
目的としては、何人実際に参加したかを計測するのが目的です。
ですので、参加者リストのGoogle Formを作成します。
で、作成した後に、プレビューを表示する。こんな感じ。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:300&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20190619/google_form.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20190619/google_form.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;この時のプレビューのURLをQRコードのURLとして使いたいので、このURLをQRコード表示のHTMLに埋め込みます。&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:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;createGoogleFormURL&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;data&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;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;obj&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;entry.1744035444&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;id&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:#e6db74&#34;&gt;&amp;#34;entry.2031666715&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;name&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;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://docs.google.com/forms/d/e/&amp;lt;GOOGLE_FORM_ID&amp;gt;/viewform?&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;param&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;obj&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;return&lt;/code&gt;に書いてある&lt;code&gt;https&lt;/code&gt;で始まる文字列をまず、先ほどのURLで置き換えます。
次に、プレビューのHTMLの中から&lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt;タグを探して、&lt;code&gt;name&lt;/code&gt;の値を抜き出します。
それを&lt;code&gt;obj&lt;/code&gt;のキーに利用します。&lt;code&gt;entry.&lt;/code&gt;で始まる文字列が該当します。&lt;/p&gt;
&lt;p&gt;これで、このURLをQRコードにすれば、値（ここだとIDと氏名）が埋め込まれた形のGoogle Formがスマホのブラウザで起動します。&lt;/p&gt;
&lt;h3 id=&#34;3-meetup-apiの準備&#34;&gt;3. Meetup APIの準備&lt;/h3&gt;
&lt;p&gt;MeetupのAPIを利用できるようにします。Meetup.comにログインするとみれるAPIのページがあります。
&lt;a href=&#34;https://secure.meetup.com/meetup_api&#34;&gt;https://secure.meetup.com/meetup_api&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;まず、OAuthを利用するためのConsumer Keyを発行します。&lt;/p&gt;
&lt;p&gt;メニューのOAuth Consumersをクリックして、&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:400&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20190619/meetup_oauth_consumers.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20190619/meetup_oauth_consumers.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;&amp;ldquo;Create New Consumer&amp;quot;をクリックします。
すると、次のような画面が開きます。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:400&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20190619/meetup_oauth_create_consumer.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20190619/meetup_oauth_create_consumer.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;&lt;code&gt;Consumer name&lt;/code&gt;と&lt;code&gt;Redirect URI&lt;/code&gt;が重要です。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Consumer name&lt;/code&gt;はユーザーがMeetup経由で認証するときに、その認証画面で表示される名前になります。
わかりやすい名前を表示してあげると良いかと。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Redirect URI&lt;/code&gt;が一番重要です。実際にOAuthで認証が通った後に表示するHTMLを提供しているURLを指定します。
Elasticsearch勉強会の場合は、私のドメインにwwwをつけた&amp;quot;https://www.johtani.info&amp;quot;を指定しています。
実際にQRコード表示用のHTMLを配置するHTTPサーバーのトップのURLを指定します。
（ちなみに、私のウェブサーバーはS3で運用してます。ですので、HTMLをS3のバケットにアップロードしてあるだけです）&lt;/p&gt;
&lt;p&gt;必須項目を入力したあと、最下部にある&lt;code&gt;Register Consumer&lt;/code&gt;ボタンを押せばキーが生成されます。
生成されたキーがOAuth2のURLのパラメータに必要になります。&lt;/p&gt;
&lt;p&gt;これで、リダイレクトの準備が整いました。&lt;/p&gt;
&lt;p&gt;OAuth2のURLには、&lt;a href=&#34;https://www.meetup.com/ja-JP/meetup_api/auth/#oauth2implicit&#34;&gt;Implicit Flow&lt;/a&gt;を利用します。
これで、リダイレクト先のHTMLにトークンがわたるので、Meetup APIにこのトークンが使えるようになります。&lt;/p&gt;
&lt;p&gt;認証用のURLはこちらです。このURLを参加者宛のメールに入れて毎回送信しています。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;https://secure.meetup.com/ja-JP/oauth2/authorize?response_type=token&amp;amp;redirect_uri=&amp;lt;QRコード表示HTMLのURL&amp;gt;&amp;amp;client_id=&amp;lt;コンシューマーキー&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;参加者はこのリンクをクリックすることで、次のような画面が出てきます。
ログインしていない場合はLog in画面が表示され、まずはログインを促されます。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:400&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20190619/meetup_oauth_page.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20190619/meetup_oauth_page.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;で、Allowをクリックすれば、&lt;code&gt;redirect_uri&lt;/code&gt;に指定されているページが表示されるわけです。&lt;/p&gt;
&lt;p&gt;QRコード表示用のHTMLでは、次のAPIを使用して、ログインしているユーザーの情報を取得してきています。&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:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;getMemberId&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;$&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getJSON&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;https://api.meetup.com/2/member/self/?only=id,name&amp;amp;access_token=&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;getToken&lt;/span&gt;(), &lt;span style=&#34;color:#a6e22e&#34;&gt;displayQRCode&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;ここで取れた値が、先ほどの「2. Google Formの準備」で説明したコードの&lt;code&gt;data&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-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;createGoogleFormURL&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;data&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;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;obj&lt;/span&gt; &lt;span style=&#34;color:#f92672&#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:#e6db74&#34;&gt;&amp;#34;entry.1744035444&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;id&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:#e6db74&#34;&gt;&amp;#34;entry.2031666715&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;name&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;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://docs.google.com/forms/d/e/&amp;lt;GOOGLE_FORM_ID&amp;gt;/viewform?&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;param&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;obj&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;4-qrコードの表示&#34;&gt;4. QRコードの表示&lt;/h3&gt;
&lt;p&gt;あとは、&lt;a href=&#34;https://github.com/jeromeetienne/jquery-qrcode&#34;&gt;&lt;code&gt;jquery.qrcode.min.js&lt;/code&gt;&lt;/a&gt;を使用してURLを表示するだけです。&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:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;displayQRCode&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;data&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;$&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;#qrcode&amp;#39;&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;qrcode&lt;/span&gt;({&lt;span style=&#34;color:#a6e22e&#34;&gt;width&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;128&lt;/span&gt;,&lt;span style=&#34;color:#a6e22e&#34;&gt;height&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;128&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;text&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;createGoogleFormURL&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;data&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;サイズとURLを指定するだけですね。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;あとは、受付で、参加者の方が表示してくれたQRコードをスマホのQRコードリーダーやカメラで読み込めばGoogle Formが開いて必要な情報は入っているので、「送信ボタン」を押せば参加者リストが出来上がっていくという形になります。&lt;/p&gt;
&lt;p&gt;毎回勉強会の前日に、前回のGoogle Formを「コピー」してから、各回の勉強会の登録者フォームを作成しています。
コピーすることにより、Google Formの&lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt;タグに使用される&lt;code&gt;name&lt;/code&gt;もそのままコピーされるので、
QRコード生成用のHTMLを書き換える部分の手間が減る形になっています（気づくまで数回かかったw）。&lt;/p&gt;
&lt;p&gt;ですので、QRコードのHTMLの中身としては、「勉強会のページへのリンク」、「Google Formへのリンク」の2つを書き換えてから毎回アップロードしているだけとなっています。&lt;/p&gt;
&lt;p&gt;このやり方が、スマートかどうかはわからないですが、受付アプリがない中、Meetup.comから取得した参加者リストのExcelやプリントアウトしたリストを元に参加者をチェックするよりは、手間が省けてるんじゃないかなぁと。&lt;/p&gt;
&lt;p&gt;残念ながら、QRコードの存在を知らないでそのまま勉強会にくる人がいるので、受付で最低一人はMeetup.comの参加者リストから、
名前を検索してチェックするという作業もやってもらってます。
QRコードを持ってきた方がすんなり受付を通過できるようになってますので、ぜひQRコードを持って勉強会にきてもらえればと。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>What’s new in Elastic Stack 7.1?</title>
      <link>https://blog.johtani.info/presentation/2019/whats-new-in-elastic-stack-7-1/</link>
      <pubDate>Thu, 23 May 2019 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2019/whats-new-in-elastic-stack-7-1/</guid>
      <description></description>
      <content:encoded></content:encoded>
    </item>
    
    <item>
      <title>勉強会運営座談会ってのをやってみた</title>
      <link>https://blog.johtani.info/blog/2019/04/26/meetup-organizer-drinkup/</link>
      <pubDate>Fri, 26 Apr 2019 00:02:06 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2019/04/26/meetup-organizer-drinkup/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.meetup.com/ja-JP/Tokyo-Elastic-Fantastics/&#34;&gt;Elasticsearch勉強会&lt;/a&gt;や&lt;a href=&#34;https://search-tech.connpass.com&#34;&gt;検索技術勉強会&lt;/a&gt;やってるんだけど、独学で勉強会やってるなーと思い、みんなはどうやってるんだろうとツイートしてみたところ。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; data-lang=&#34;ja&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;あー、勉強会運営座談会したい。&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://twitter.com/johtani/status/1113015829195481088?ref_src=twsrc%5Etfw&#34;&gt;2019年4月2日&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; data-conversation=&#34;none&#34; data-lang=&#34;ja&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;面白そう&lt;/p&gt;&amp;mdash; 機械の体を手に入れるのよ鉄郎 (@tetsuroito) &lt;a href=&#34;https://twitter.com/tetsuroito/status/1113017239937081344?ref_src=twsrc%5Etfw&#34;&gt;2019年4月2日&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; data-conversation=&#34;none&#34; data-lang=&#34;ja&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;やってみるか。&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://twitter.com/johtani/status/1113017372653215744?ref_src=twsrc%5Etfw&#34;&gt;2019年4月2日&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; data-conversation=&#34;none&#34; data-lang=&#34;ja&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;やりましょう&lt;/p&gt;&amp;mdash; 機械の体を手に入れるのよ鉄郎 (@tetsuroito) &lt;a href=&#34;https://twitter.com/tetsuroito/status/1113017409928015872?ref_src=twsrc%5Etfw&#34;&gt;2019年4月2日&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;ってことで、何人か釣れたので、&lt;a href=&#34;https://connpass.com/event/126699/&#34;&gt;勉強会運営座談会&lt;/a&gt;をやってみました。
会場提供していただいた、&lt;a href=&#34;https://classi.jp&#34;&gt;Classiさん&lt;/a&gt;ありがとうございました！&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://www.meetup.com/ja-JP/Tokyo-Elastic-Fantastics/&#34;&gt;Elasticsearch勉強会&lt;/a&gt;や&lt;a href=&#34;https://search-tech.connpass.com&#34;&gt;検索技術勉強会&lt;/a&gt;やってるんだけど、独学で勉強会やってるなーと思い、みんなはどうやってるんだろうとツイートしてみたところ。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; data-lang=&#34;ja&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;あー、勉強会運営座談会したい。&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://twitter.com/johtani/status/1113015829195481088?ref_src=twsrc%5Etfw&#34;&gt;2019年4月2日&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; data-conversation=&#34;none&#34; data-lang=&#34;ja&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;面白そう&lt;/p&gt;&amp;mdash; 機械の体を手に入れるのよ鉄郎 (@tetsuroito) &lt;a href=&#34;https://twitter.com/tetsuroito/status/1113017239937081344?ref_src=twsrc%5Etfw&#34;&gt;2019年4月2日&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; data-conversation=&#34;none&#34; data-lang=&#34;ja&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;やってみるか。&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://twitter.com/johtani/status/1113017372653215744?ref_src=twsrc%5Etfw&#34;&gt;2019年4月2日&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; data-conversation=&#34;none&#34; data-lang=&#34;ja&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;やりましょう&lt;/p&gt;&amp;mdash; 機械の体を手に入れるのよ鉄郎 (@tetsuroito) &lt;a href=&#34;https://twitter.com/tetsuroito/status/1113017409928015872?ref_src=twsrc%5Etfw&#34;&gt;2019年4月2日&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;ってことで、何人か釣れたので、&lt;a href=&#34;https://connpass.com/event/126699/&#34;&gt;勉強会運営座談会&lt;/a&gt;をやってみました。
会場提供していただいた、&lt;a href=&#34;https://classi.jp&#34;&gt;Classiさん&lt;/a&gt;ありがとうございました！&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;参加してくれた人たちはまぁ、勉強会のサイトを見ていただければなんとなくわかるかなと。
自己紹介とどんな勉強会、読書会運営してますってとこから始めて、次のようなトピックについてピザ食いながら3時間くらい話しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スピーカーの募集方法
&lt;ul&gt;
&lt;li&gt;運営側から声かけてる？それとも公募してる？&lt;/li&gt;
&lt;li&gt;登壇時間とかどうしてる？&lt;/li&gt;
&lt;li&gt;スピーカーになってもらうためになんかやってる？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;スケジュール管理
&lt;ul&gt;
&lt;li&gt;会場探し、スピーカー探し、イベントページ作るタイミングは？&lt;/li&gt;
&lt;li&gt;複数拠点開催したことある？&lt;/li&gt;
&lt;li&gt;ハンズオンとかはどうしてる？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;土日開催？平日開催？&lt;/li&gt;
&lt;li&gt;アンケートとってますか？&lt;/li&gt;
&lt;li&gt;使用してるイベントサイトは？&lt;/li&gt;
&lt;li&gt;ドタキャン対応どうしてる？出欠とったりしてる？懇親会の規模とかどうやって見積もってる？&lt;/li&gt;
&lt;li&gt;運営費用関連はどうしてる？
&lt;ul&gt;
&lt;li&gt;グッズとか、ツールとか、スピーカーへの謝礼とか&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;運営って複数でやってる？
&lt;ul&gt;
&lt;li&gt;その時のツールは？&lt;/li&gt;
&lt;li&gt;運営メンバーにはどうやってなってもらう？&lt;/li&gt;
&lt;li&gt;録画配信とかまで手が回る？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;会場探すの大変じゃない？
&lt;ul&gt;
&lt;li&gt;会場の部屋の使い方はどうしてる？&lt;/li&gt;
&lt;/ul&gt;
&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;p&gt;そもそもは、勉強会の運営って本業ではない（はずな）ので、いかに楽をしつつうまく運営できるかってのを知りたいのと、
他の人どうやってるかってのからアイデアもらえるといいなーと思ったんでやってみました。
他のツールがどんなものかとか知れたし、あー、そういうやり方すればいいのねーみたいなのも知れたので、次回以降の勉強会に活かせればなーと。
自分がやってるやり方とかもブログ書くといいのかなぁ？&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; data-lang=&#34;ja&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;残念です！次回もやるかもしれないので、 &lt;a href=&#34;https://twitter.com/johtani?ref_src=twsrc%5Etfw&#34;&gt;@johtani&lt;/a&gt; さんに期待してください！&lt;/p&gt;&amp;mdash; 機械の体を手に入れるのよ鉄郎 (@tetsuroito) &lt;a href=&#34;https://twitter.com/tetsuroito/status/1121413483331895296?ref_src=twsrc%5Etfw&#34;&gt;2019年4月25日&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;次回やるのかなぁ？興味ある人いるのかなぁ？&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elastic Stackでマイクロサービス 運用を楽にするには？</title>
      <link>https://blog.johtani.info/presentation/2019/elastic-stack-i27mqg/</link>
      <pubDate>Wed, 17 Apr 2019 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2019/elastic-stack-i27mqg/</guid>
      <description></description>
      <content:encoded></content:encoded>
    </item>
    
    <item>
      <title>Elastic StackでKafkaをモニタリング！ を始めてみるには？</title>
      <link>https://blog.johtani.info/presentation/2019/elastic-stack-kafka/</link>
      <pubDate>Tue, 09 Apr 2019 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2019/elastic-stack-kafka/</guid>
      <description></description>
      <content:encoded></content:encoded>
    </item>
    
    <item>
      <title>Elastic再入門 #elasticsearchjp</title>
      <link>https://blog.johtani.info/presentation/2019/elastic-elasticsearchjp/</link>
      <pubDate>Wed, 20 Mar 2019 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2019/elastic-elasticsearchjp/</guid>
      <description></description>
      <content:encoded></content:encoded>
    </item>
    
    <item>
      <title>Search Engineering Tech Talk(検索技術勉強会)の運営として参加して始めてみました。</title>
      <link>https://blog.johtani.info/blog/2019/02/26/start-search-engineering-tech-talk/</link>
      <pubDate>Tue, 26 Feb 2019 23:38:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2019/02/26/start-search-engineering-tech-talk/</guid>
      <description>&lt;p&gt;どーも、johtaniです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://search-tech.connpass.com/event/112866/&#34;&gt;Search Engineering Tech Talk&lt;/a&gt;という勉強会に運営として参加して、第1回の勉強会を開始しました。
本日（2/26）は第1回目だったので、ブログを残しておこうかと。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;どーも、johtaniです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://search-tech.connpass.com/event/112866/&#34;&gt;Search Engineering Tech Talk&lt;/a&gt;という勉強会に運営として参加して、第1回の勉強会を開始しました。
本日（2/26）は第1回目だったので、ブログを残しておこうかと。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;勉強会自体の資料については&lt;a href=&#34;https://search-tech.connpass.com/event/112866/&#34;&gt;第1回の勉強会のページ&lt;/a&gt;にあるし、勉強会の感想とかブログはツイートやみんながブログを書いてくれると思うので、勉強会開催の経緯などについてブログを残しておこうかと。&lt;/p&gt;
&lt;h2 id=&#34;なんで始めたの&#34;&gt;なんで始めたの？&lt;/h2&gt;
&lt;p&gt;私自身が古くはFAST Searchに始まり、何か縁があって、
検索のシステムに長く携わってきたこと（Apache Solrの本書いたり、Elasticsearch勉強会始めたり）もあり、
検索が面白いなと日々思ってます（思ってるだけかもしれないが）。&lt;/p&gt;
&lt;p&gt;で、これまでElasticsearch勉強会をやっているのですが、検索エンジン固有の話ではない、
いわゆる検索の共通の課題というのがあるなぁと。
そういう課題やノウハウって、製品に限らず共有できれば面白いことがもっとできるんじゃないだろうか？
と感じることが多々ありまして。
オープンソースのコミュニティをソースコードをベースではなく、共通の課題・話題を中心としたコミュニティが
あってもいいんじゃないかなぁと。&lt;/p&gt;
&lt;p&gt;まぁ、要は、私がみんなの検索で困ってることとか、どうやって検索システム考えてるのかが聞きたかったわけですよ。&lt;/p&gt;
&lt;p&gt;ということで、一人でやっても面白くないので、興味ありそうな人を募ってやってみようということを始めたのが2018年12月くらいです。&lt;/p&gt;
&lt;h2 id=&#34;運営とかどうしてるの&#34;&gt;運営とかどうしてるの？&lt;/h2&gt;
&lt;p&gt;まずは、共同主催者（コアメンバー）を募集してみようということで、Googleフォーム作って、
興味ありそうな人がいる場所に投稿してみました。（TwitterとかFBとか）
で集まったのが今回紹介したメンバー（&lt;a href=&#34;https://noti.st/johtani/ZsQG5A/search-engineering-tech-talk&#34;&gt;スライド参照&lt;/a&gt;）です。
ユーザー企業の人もいれば、私みたいな検索エンジンの人もいるので面白い感じにできたかなぁと。
で、スピーカーを運営や知り合いに声をかけて第1回をやってみたという感じです。&lt;/p&gt;
&lt;h2 id=&#34;今後どうするの&#34;&gt;今後どうするの？&lt;/h2&gt;
&lt;p&gt;残念ながら次回はまだ未定です。
2ヶ月に1回くらいのペースで開催できればなーと思ってますが、スピーカーが集まるかなどによるかなぁと。
ということで、&lt;a href=&#34;https://search-tech.connpass.com&#34;&gt;勉強会のグループのページ&lt;/a&gt;にスピーカー応募フォームのリンクがありますので、スピーカーに興味がある方は入力していただければと。&lt;/p&gt;
&lt;p&gt;もちろん第2回はやりたいので、勉強会のページからの連絡をお待ちください！！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Search Engineering Tech Talk オープニング</title>
      <link>https://blog.johtani.info/presentation/2019/search-engineering-tech-talk/</link>
      <pubDate>Tue, 26 Feb 2019 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2019/search-engineering-tech-talk/</guid>
      <description></description>
      <content:encoded></content:encoded>
    </item>
    
    <item>
      <title>Elastic Stackでマイクロサービス運用を楽にするには？ - Elastic Stackの活用 -</title>
      <link>https://blog.johtani.info/presentation/2019/elastic-stack-elastic-stack/</link>
      <pubDate>Fri, 22 Feb 2019 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2019/elastic-stack-elastic-stack/</guid>
      <description></description>
      <content:encoded></content:encoded>
    </item>
    
    <item>
      <title>Elastic Stackでマイクロサービス運用を楽にするには？ - Elastic Stackの活用 -</title>
      <link>https://blog.johtani.info/presentation/2019/elastic-stack-elastic-stack-uhoeh9/</link>
      <pubDate>Tue, 05 Feb 2019 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2019/elastic-stack-elastic-stack-uhoeh9/</guid>
      <description></description>
      <content:encoded></content:encoded>
    </item>
    
    <item>
      <title>Elastic Stackでマイクロサービス運用を楽にするには？ - Elastic Stackの活用 -</title>
      <link>https://blog.johtani.info/presentation/2019/elastic-stack-elastic-stack-femcwl/</link>
      <pubDate>Fri, 25 Jan 2019 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2019/elastic-stack-elastic-stack-femcwl/</guid>
      <description></description>
      <content:encoded></content:encoded>
    </item>
    
    <item>
      <title>今年の振り返りと来年の抱負（2018）</title>
      <link>https://blog.johtani.info/blog/2018/12/31/looking-back-2018/</link>
      <pubDate>Mon, 31 Dec 2018 16:14:45 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2018/12/31/looking-back-2018/</guid>
      <description>&lt;p&gt;今年も振り返りブログをかけてます。よかったw&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;振り返り2017年に書いた抱負から&#34;&gt;振り返り（2017年に書いた抱負から）&lt;/h2&gt;
&lt;p&gt;まずは去年の抱負を元に。&lt;/p&gt;
&lt;h5 id=&#34;もっと英語の継続toeic&#34;&gt;もっと英語の継続＆TOEIC&lt;/h5&gt;
&lt;p&gt;まぁ、継続してます。英会話も続けてますし、海外TVドラマや映画見てます。
ただ、昨年書いたTOEICはイベントが被りまくってて受けれてないです。。。
来年は受けれればいいが。
ちなみに見たドラマはこの辺。あんまり見てないなぁ。
「はじまりのうた」は飛行機の中で見たんですが、よかったです。
最近は音楽系の映画が好きなのかなぁ。グレーテストマンショー（ミュージカル風）とかもハマったし。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今年も振り返りブログをかけてます。よかったw&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;振り返り2017年に書いた抱負から&#34;&gt;振り返り（2017年に書いた抱負から）&lt;/h2&gt;
&lt;p&gt;まずは去年の抱負を元に。&lt;/p&gt;
&lt;h5 id=&#34;もっと英語の継続toeic&#34;&gt;もっと英語の継続＆TOEIC&lt;/h5&gt;
&lt;p&gt;まぁ、継続してます。英会話も続けてますし、海外TVドラマや映画見てます。
ただ、昨年書いたTOEICはイベントが被りまくってて受けれてないです。。。
来年は受けれればいいが。
ちなみに見たドラマはこの辺。あんまり見てないなぁ。
「はじまりのうた」は飛行機の中で見たんですが、よかったです。
最近は音楽系の映画が好きなのかなぁ。グレーテストマンショー（ミュージカル風）とかもハマったし。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Game of Thrones&lt;/li&gt;
&lt;li&gt;はじまりのうた BEGIN AGAIN (映画)&lt;/li&gt;
&lt;li&gt;24 シーズン4まで&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今は、ボキャブラリのなさに苦しんでる感じです。キクタンとかするべきなのかもなぁ。
基本勉強が下手だからなー。&lt;/p&gt;
&lt;h5 id=&#34;継続的にイベントに登壇--cfpもっと出すぞ&#34;&gt;継続的にイベントに登壇 ＆ CfPもっと出すぞ！&lt;/h5&gt;
&lt;p&gt;OSCには出てました。あとは、いくつかに呼ばれて出たりでしょうか。
CfPはJJUGしか出せてない気がするんで、もっと出さないとですね。。。
春のJJUGでは20分で短すぎた「オープンソースとビジネスモデル」の話（同僚のネタ）が
今年面白かった内容かなぁと。
もっと話を作るのをうまくしないとだろうなぁ。
ユースケースが増えてるんで、もっといろんなところに出ていかないとなぁと。
ブースの出し方とかもちょっと考えないといけないかもなーと思ってたり。
マンネリになってきてる気がするんで、なんか取り入れないとなぁ。&lt;/p&gt;
&lt;h5 id=&#34;もっとブログ&#34;&gt;もっとブログ！&lt;/h5&gt;
&lt;p&gt;出だしはよかったんですが、途中でRustネタのブログも止まってしまいましたね。。。
業務が忙しくなったのを言い訳にして時間が取れなくなってるんで、
もっと習慣つけないとなぁ。&lt;/p&gt;
&lt;h5 id=&#34;雑誌やweb系雑誌で記事を&#34;&gt;雑誌やWeb系雑誌で記事を。&lt;/h5&gt;
&lt;p&gt;できてないです。。。どうすっかなぁ。
重い腰上げないのが問題なんですけどね。。。
自社のウェビナーとかはそこそこやってましたが。&lt;/p&gt;
&lt;h5 id=&#34;コミュニティを別の方法で盛り上げ&#34;&gt;コミュニティを別の方法で盛り上げ&lt;/h5&gt;
&lt;p&gt;フォーラムは皆さんのおかげで盛り上がってきてる気がしてます。
別の方法ではなく、勉強会を9月から毎月開催にして、ユースケースごとに切り替えてみました。
あとは、&lt;a href=&#34;http://bit.ly/SpeakerElasticTokyoMeetup&#34;&gt;スピーカー登録用のフォーム&lt;/a&gt;の用意とかして、継続的に楽にスピーカーの人たちが見つけられるようにと。
私は「全然」関わってないんですが、技術書典でいろんな方に書籍を書いていただきました。
また、&lt;a href=&#34;https://elasticlover.hatenablog.jp/archive&#34;&gt;Elasticlover&lt;/a&gt;という毎週いろんな記事をまとめていただけ助かりました。
少しでも感謝をということで、コミュニティランチというイベントで、フォーラムで回答していただいてる方や、書籍を出していただいた方を招いてCEOのShayとランチするというイベントもやってみました。
少しは盛り上げられたかなぁ。
次は、ハッカソンみたいなのとかやってみるのもありなのかなぁ？（サポートしきれない気がするんだよなぁ）&lt;/p&gt;
&lt;h5 id=&#34;elasticsearchなど検索系の開発にも参加&#34;&gt;Elasticsearchなど検索系の開発にも参加&lt;/h5&gt;
&lt;p&gt;開発。。。
Analyzer向けの&lt;a href=&#34;https://github.com/johtani/analyze-api-ui-plugin&#34;&gt;Kibanaのプラグイン&lt;/a&gt;の開発は継続してますが、あんまり開発してないですねぇ（&lt;a href=&#34;https://github.com/johtani&#34;&gt;GitHubの草&lt;/a&gt;をみながら)。
ちょっとしたPRはやったりしてますが、もっとやりたい。。。
とりあえず、来年しょっぱなは、検索系じゃないですが、KibanaのプラグインのReact化をやらないとなぁと。&lt;/p&gt;
&lt;h2 id=&#34;振り返り今年あったできごと&#34;&gt;振り返り(今年あったできごと)&lt;/h2&gt;
&lt;p&gt;さて、反省が多かったですが、ここからは今年の出来事を。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;初スノーシュー in US&lt;/li&gt;
&lt;li&gt;オフィス引越し&lt;/li&gt;
&lt;li&gt;パリで料理w&lt;/li&gt;
&lt;li&gt;K8sとde:code&lt;/li&gt;
&lt;li&gt;QNAPとか&lt;/li&gt;
&lt;li&gt;IPO!&lt;/li&gt;
&lt;li&gt;初のオンライン登壇&lt;/li&gt;
&lt;li&gt;初アイルランド!&lt;/li&gt;
&lt;li&gt;Pixel3 XL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今年も初モノがちらほら。&lt;/p&gt;
&lt;p&gt;アメリカでスノーシューやりました。昨年は釣りでしたが、今年はスノーシューでした。
スノーシューはすごくよかったんですが、サンフランシスコから社内ミーティングのある場所までの
移動に10時間バスに缶詰という変な初モノもありました。。。
スノーリゾートのある山の上にバスで移動だったんですが、前日までの天候の生でチェーン規制が出てしまい、登りかけた山を降りて、違う経路で登り直すという長旅でした。。。
途中からずっとゲームオブスローンズみてました。。。&lt;/p&gt;
&lt;p&gt;オフィスが引っ越しました。人数が増えてきたのもあり、銀座のWeWorkに引っ越しました（私はあんまり行かなかったりしますがw）。
ただ、すでに手狭になってきて、来年はまた引っ越してるかもなぁ。
今年の終わりで日本のメンバーが22名に増えました！すごい！4年半前の22倍！&lt;/p&gt;
&lt;p&gt;パリで料理もしましたwセールスのキックオフミーティングがパリで開催され、なぜか参加してきました。
そこで、DevRelチームのミーティング＆ディナーがあったんですが、ディナーがアクティビティ付きで、チームのみんなとパリで料理やカクテル作ってきました。
まさか、パリで手巻き寿司作るとは思わなかった（怖くて食べてないですw）&lt;/p&gt;
&lt;p&gt;今年はイベントが連続することが多かったです。パリから帰ってすぐに&lt;a href=&#34;https://thinkit.co.jp/article/13087&#34;&gt;de:codeでMSの川崎さんと登壇&lt;/a&gt;したりしました。Kubernetesを触る機会ができたんでよかったですが、時差ボケは辛かったw今年は他にもカンファレンス直後にトレーニングだったりと、夏に喉やられちゃいました。喉に負担をかけない話し方の練習すべきなんだろうなぁ。&lt;/p&gt;
&lt;p&gt;自宅の環境もちょっと整えました。10年前から使ってた、TeraStationを&lt;a href=&#34;https://amzn.to/2QZFxPe&#34;&gt;QNAPに刷新&lt;/a&gt;。快適に検索できるわ、クラウドにバックアップとれるわで、すごく快適です。
あとは、自室のディスプレイをディスプレイアームにつけたり、壊れたモニタースピーカーを&lt;a href=&#34;https://amzn.to/2EX5qsB&#34;&gt;Yamahaのパワードスピーカー&lt;/a&gt;に買い替えたりと。
ちょこちょこ自宅で作業したりするんで、快適です。&lt;/p&gt;
&lt;p&gt;今年はめでたいことに会社がIPOしました。&lt;a href=&#34;https://www.elastic.co/blog/ze-bell-has-rung-thank-you-users-customers-and-partners&#34;&gt;ニューヨーク証券取引所で株式公開しました&lt;/a&gt;。
転職して4年、初体験なんで何がどうってのはいまいち実感わかないんですが、順調にきてるのは嬉しい限りです。今後も頑張りますよ！&lt;/p&gt;
&lt;p&gt;自社のウェビナーでは、オンライン登壇してたんですが、&lt;a href=&#34;https://wp.infra-workshop.tech/event/elastic-stack-%E5%85%A5%E9%96%80/&#34;&gt;インフラ勉強会でオンライン登壇&lt;/a&gt;させていただきました。
Elastic Stackの入門的な話をさせていただいたので、興味があればみていただければと。
こういうのにはマイクが非常に重要だなというのが結論です。ウェビナーで使ってる&lt;a href=&#34;https://amzn.to/2EZvvHo&#34;&gt;Shureのマイク&lt;/a&gt;で話したので聞き取りやすかったです。
来年はもっと手軽にちょっとしたウェビナーとかポッドキャストやろうかな、ということで、持ち運び用に&lt;a href=&#34;https://amzn.to/2EZs6sm&#34;&gt;SAM SONGo Mic&lt;/a&gt;を購入してみたのでどっかで試してみたいなー。&lt;/p&gt;
&lt;p&gt;アイルランド（ダブリン）にも行きました。これまた、社内のミーティングなんですけどね。半年に1度エンジニアが集まる社内イベントがあるので、いろんなところに旅をさせてもらっていて、すごく楽しいです。
みんなにも会えるし。ただ、アイルランドの英語はきつかった。。。&lt;/p&gt;
&lt;p&gt;最後はPixel3です。SonyのXperiaをここ数年は使ってたんですが、電池の持ちなどが悪くなったんで、気になってたPixel3に変えました。すごくいい。いらないものが入ってないのもいい。あと&lt;a href=&#34;https://twitter.com/johtani/status/1073185795870085120&#34;&gt;カメラがすごくいい&lt;/a&gt;。他の機能をまだちゃんと調べてないんで、誰か便利機能知ってたら教えてくださいw&lt;/p&gt;
&lt;p&gt;とまぁ、こんな感じでした。&lt;/p&gt;
&lt;h2 id=&#34;来年の抱負&#34;&gt;来年の抱負&lt;/h2&gt;
&lt;p&gt;最後は来年の抱負を。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TOEIC&lt;/li&gt;
&lt;li&gt;CfP見つけて応募 &amp;amp; いろんな場所に顔を出す&lt;/li&gt;
&lt;li&gt;もっとブログ！&lt;/li&gt;
&lt;li&gt;Rustの継続&lt;/li&gt;
&lt;li&gt;開発の継続&lt;/li&gt;
&lt;li&gt;日本でエンジニア獲得!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;まぁ、英語ですね。これは地道にやるしかないんだろうなと思いつつ、コツコツが苦手でw
とりあえず、今年はどこかでTOEIC受けないとな。&lt;/p&gt;
&lt;p&gt;いつも行かないけど、弊社プロダクトに関係のあるカンファレンスのCfPを見つけ出して、
応募しまくって、少しでもしゃべらないとなぁ。喋れなくても、Elasticsearchがらみで登壇していただいてる方がいるカンファレンスには顔を出していきたいなぁと。
登壇される方いたら、ぜひ連絡ください！あとは、CfPのサイトを探す仕組みを作らないとなぁ。
検索サイト作るかなぁ。
あとは、カンファレンスではなく、いろんな会社に遊びにいきたいと思ってます。
入門的な話をしてほしいような方、こんな使い方してますっていう話をしていただける方、大募集です。
これもGoogle Formでも作ってみるか。&lt;/p&gt;
&lt;p&gt;ブログなぁ。&lt;a href=&#34;https://amzn.to/2EZhzwf&#34;&gt;小さな習慣&lt;/a&gt;を読んだのに、習慣化できてないので、なんとかしないとという意味で。。。が、頑張ります。。。&lt;/p&gt;
&lt;p&gt;Rustの継続＆開発の継続もですね。Java歴が長いので、他の言語を勉強しようと思ってRustやってますがなかなか身についてないというか、時間を取れてない。これもコツコツやらないとなー
検索関連の開発もちょっとずつやりたいなと思ってるんで、&lt;a href=&#34;https://github.com/DmitryKey/luke/issues/134&#34;&gt;LukeへContribute&lt;/a&gt;しようかな。&lt;/p&gt;
&lt;p&gt;切実なんですが、日本に弊社のエンジニアを増やしたいなと。特に人前で喋ってもらえる人が増えると助かるんです。弊社最近、ユースケースが増えてきてて、追いつかなくてwダレカタスケテーw&lt;/p&gt;
&lt;p&gt;さーて、そろそろ紅白のサザンが始まるんで終わりです。&lt;/p&gt;
&lt;p&gt;今年も様々な方々に様々な面で助けていただきました。本当にお世話になりました。
この場を借りてお礼申し上げます。&lt;/p&gt;
&lt;p&gt;来年ももちろん、助けてもらうんで、よろしくお願いいたします！
あと、話聞きたい方、声かけてくださーい。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elastic Stack 7.0で入ってくる新機能をちょっと紹介</title>
      <link>https://blog.johtani.info/blog/2018/12/25/whats-new-in-elastic-stack-7/</link>
      <pubDate>Tue, 25 Dec 2018 00:00:01 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2018/12/25/whats-new-in-elastic-stack-7/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://qiita.com/advent-calendar/2018/elasticsearch&#34;&gt;Elastic stack (Elasticsearch) Advent Calendar 2018&lt;/a&gt;の25日目の記事になります。
今年最後のAdvent Calendarです！来年も忘れてなければやるはず！&lt;/p&gt;
&lt;p&gt;今日は、すでにalpha2までリリースされた7系でどんな変更が入るのかをちょっとだけ紹介します。
ほんとにちょっとだけですよ。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://qiita.com/advent-calendar/2018/elasticsearch&#34;&gt;Elastic stack (Elasticsearch) Advent Calendar 2018&lt;/a&gt;の25日目の記事になります。
今年最後のAdvent Calendarです！来年も忘れてなければやるはず！&lt;/p&gt;
&lt;p&gt;今日は、すでにalpha2までリリースされた7系でどんな変更が入るのかをちょっとだけ紹介します。
ほんとにちょっとだけですよ。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h3 id=&#34;kibanaのk7-design-kibana&#34;&gt;Kibanaのk7 design (kibana)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/kibana/master/release-notes-7.0.0-alpha1.html#K7-design-7.0.0&#34;&gt;Kibanaの新デザインです。K7って呼ぶのかな？&lt;/a&gt;&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20181225/k7dashboard.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20181225/k7dashboard.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;まだ、メニューと一部が実装されているだけですが、7.0.0でガラッと変わりそうです。
そのほかの画面の&lt;a href=&#34;https://github.com/elastic/kibana/issues?utf8=%E2%9C%93&amp;amp;q=is%3Aissue+is%3Aopen+k7&#34;&gt;Issueはこちら&lt;/a&gt;です。
&amp;ldquo;k7&amp;quot;で検索しただけですが。メタIssueが見つからなかったんで。&lt;a href=&#34;https://github.com/elastic/kibana/issues/25736&#34;&gt;例えば、こんな感じでアプリとかのスイッチとかがこんな感じになるよというデザイン案が観れたりします&lt;/a&gt;。&lt;/p&gt;
&lt;h3 id=&#34;zen2-elasticsearch&#34;&gt;Zen2 (elasticsearch)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/master/modules-discovery.html&#34;&gt;Elasticsearchの新しいクラスター管理機構アルゴリズム&lt;/a&gt;になります。
Zenと呼ばれる独自実装のものを6系までは使っていましたが、7系向けに変更がかかりました。
実際には、Nodeを探す仕組み、Masterの選出アルゴリズム、クラスター状態の管理などを行います。
上記のリンクにあるようにドキュメントも詳しくなりました。
信頼性をさらに向上し、設定ミスを起こしにくくして、より使いやすくという目的で様々な変更が加えられています。
これが、&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues/32006&#34;&gt;メタIssue&lt;/a&gt;かな？
アルゴリズムの変更や、クラスターの状態の管理の方法などの変更に関するIssueやPRにリンクが貼ってあります。&lt;/p&gt;
&lt;h3 id=&#34;新しいデータタイプ-elasticsearch&#34;&gt;新しいデータタイプ (elasticsearch)&lt;/h3&gt;
&lt;h4 id=&#34;featurefeature-vector-datatype&#34;&gt;Feature/Feature vector datatype&lt;/h4&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/master/feature.html&#34;&gt;ドキュメントはこちら&lt;/a&gt;と&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/master/feature-vector.html&#34;&gt;こちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/master/query-dsl-feature-query.html&#34;&gt;feature query&lt;/a&gt;と合わせて使用するためのフィールドで、しかもクエリのスコア計算「のみ」に使用するフィールドになります。
検索条件やソート、Aggregationの対象ではなく、クエリのスコアに影響させたい値を入れておくためのフィールドです。
6から追加された機能の「&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/master/search-uri-request.html&#34;&gt;track_total_hits&lt;/a&gt;」をfalseにした時と合わせると、function_scoreなどで計算をしていた場合よりも、検索性能が上がるという利点まであります。
ちなみに、「track_total_hits」は検索ヒット数を計算しないで、上位のデータを取得する時にクエリを早くするといったことができる機能になります。
&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/master/index-modules-index-sorting.html&#34;&gt;Index Sorting&lt;/a&gt;と組み合わせることで威力が発揮できる仕組みになるはずです。&lt;/p&gt;
&lt;h3 id=&#34;filebeat-supports-netflow-beats&#34;&gt;Filebeat supports NetFlow (beats)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-input-netflow.html&#34;&gt;NetFlowが入力&lt;/a&gt;として追加されます。
Filebeatと言いつつ、File以外の入力が徐々に増えてきてますね（UDPやTCPにも対応しましたし）。
ネットワーク機器などの監視を行う方などにはさらに便利になってくるのではないでしょうか？
（私はこの辺りは不得手なので、誰か使ってみてもらえればと！）&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;まだ、序の口って感じですが、今年はこの辺で。7系ではここであげた以外にも様々な機能が追加されています（もしくは予定です）。
Elasticのドキュメントの良いところは、masterブランチのドキュメントも公開されていることです。
ドキュメントのバージョンを&lt;code&gt;7.0.0-alpha2&lt;/code&gt;にすれば、masterブランチで追加されたページが見れるので、
興味のある方は眺めてみていただければと。物によって、リリースノートが書かれていなかったりするので注意は必要ですが。&lt;/p&gt;
&lt;p&gt;今年もあと数日になりましたが、Advent Calendarへの参加ありがとうございました！
来年ももちろんやりますので、年始からネタを考えてくださいね。&lt;/p&gt;
&lt;p&gt;来年一発目は、&lt;a href=&#34;https://www.meetup.com/ja-JP/Tokyo-Elastic-Fantastics/events/257301177/&#34;&gt;第28回Elasticsearch勉強会 - 6.5機能紹介 -&lt;/a&gt;になります。ウェビナーでも紹介しましたが、6.5で入った様々な新機能をデモありで紹介する予定です。
興味のある方はぜひご参加ください。&lt;/p&gt;
&lt;p&gt;では、来年もよろしくお願いいたします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>2018年のElastic StackとElastic</title>
      <link>https://blog.johtani.info/blog/2018/12/01/whats-happen-at-elastic-in-2018/</link>
      <pubDate>Sat, 01 Dec 2018 10:48:38 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2018/12/01/whats-happen-at-elastic-in-2018/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://qiita.com/advent-calendar/2018/elasticsearch&#34;&gt;Elastic stack (Elasticsearch) Advent Calendar 2018&lt;/a&gt;の1日目の記事になります。&lt;/p&gt;
&lt;p&gt;ちょっと遅れちゃいました。。。
まだ、1ヶ月を残してますが、簡単に今年起こったことを振り返ってみようと思います。毎年恒例ですね、ここ数年。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://qiita.com/advent-calendar/2018/elasticsearch&#34;&gt;Elastic stack (Elasticsearch) Advent Calendar 2018&lt;/a&gt;の1日目の記事になります。&lt;/p&gt;
&lt;p&gt;ちょっと遅れちゃいました。。。
まだ、1ヶ月を残してますが、簡単に今年起こったことを振り返ってみようと思います。毎年恒例ですね、ここ数年。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h3 id=&#34;elastic-stack-620リリース2月&#34;&gt;Elastic Stack 6.2.0リリース(2月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/elastic-stack-6-2-0-released&#34;&gt;リリース記事はこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;APMがGAリリースされ、Beats monitoring UIも追加されました。Stackとしての統一度がちょっとずつ上がってきた感じですね。
Kibanaのホーム画面（左メニューのKibanaアイコンをクリックした時）にデータ登録のチュートリアル的な画面が追加されています。
特にBeatsを利用する時の流れが簡単にわかるのがいい感じです。Metricsなどはローカルでちょっと試すのにも簡単な流れですので、ぜひ一度やってみてもらいたいなと。
個人的にはtermsを使ったパイチャートで、&lt;a href=&#34;https://github.com/elastic/kibana/pull/15525&#34;&gt;その他の数値がどのくらいあるかといった表示ができるよう&lt;/a&gt;になって、やっと帰ってきた！（Kibana 3の頃にはあった機能）という印象でした。&lt;/p&gt;
&lt;h3 id=&#34;elasticon18開催2月&#34;&gt;Elastic{ON}18開催(2月)&lt;/h3&gt;
&lt;p&gt;第4回目のユーザーカンファレンスがSFで開催されました。
今年のキーノートが今年最大のニュースですね。
&lt;a href=&#34;https://www.elastic.co/jp/blog/doubling-down-on-open&#34;&gt;X-Packのコードの公開が発表された&lt;/a&gt;のがこの時でした。
個人的に今後もオープンソースに携わっていきたいと思いながら日々働いていますが、
Elasticのオープンソースへのこだわりと、シンプルな考え方を再確認して素晴らしい会社で働けてるなーと。
商用のソースコードを公開してユーザーや顧客の皆さんとより良いものを作っていきたいという形ですので、今後もよろしくお願いします！
&lt;a href=&#34;https://www.elastic.co/elasticon/conf/2018/sf/opening-keynote&#34;&gt;キーノートの動画はこちら&lt;/a&gt;からご覧いただけます。&lt;/p&gt;
&lt;p&gt;そのほかにも次のような発表が行われました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SQL for elasticsearch&lt;/li&gt;
&lt;li&gt;Canvas&lt;/li&gt;
&lt;li&gt;Elastic App Search(旧Swiftype)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;elastic-stack-630リリース6月&#34;&gt;Elastic Stack 6.3.0リリース(6月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/elastic-stack-6-3-0-released&#34;&gt;リリース記事はこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2月末のElastic{ON}で発表されたX-Packのコードの公開にはやはり時間がかかりました。
有償コードのリポジトリとの統合やライセンスの変更、テスト環境などなど、色々大変だったみたいです。
ようやく公開され、ベーシックのライセンスの扱いなども変わり、より使いやすくなったのがこのタイミングです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;X-Packをプラグインとしてのインストールが不要に&lt;/li&gt;
&lt;li&gt;ベーシックライセンスがデフォルトでONに。6.3から登録などが不要に。&lt;/li&gt;
&lt;li&gt;Apache 2.0ライセンスの部分のみのディストリビューションも別途ダウンロードできるようになどなど&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/webinars/elastic-stack-6-3&#34;&gt;日本でもリリースウェビナーをやりました&lt;/a&gt;。ご覧いただけましたかね？&lt;/p&gt;
&lt;h3 id=&#34;elastic-cloud-elasticsearch-serviceがより使いやすく8月&#34;&gt;Elastic Cloud Elasticsearch Serviceがより使いやすく(8月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/the-next-generation-elasticsearch-service-hot-warm-clusters-machine-learning-more-hardware-choices-and-new-pricing&#34;&gt;リリース記事はこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;これまでは、メモリとストレージの比率だけしか指定できなかったのですが、
このリリースで様々なユースケースに応じた組み合わせが可能になりました。
CPUやメモリリソースよりもストレージを大きくしたりなどです。
専用マスターノードを追加できたり、待望の機械学習（Machine Learning）が提供されたりと色々と変更があり使いやすくなったかと。
昔からよく聞かれる、Kuromojiなどのカスタム辞書を登録する機能もあるので、Elastic Cloud便利です。
&lt;a href=&#34;https://www.elastic.co/jp/cloud/elasticsearch-service&#34;&gt;ご存知ない方は、14日間のトライアル&lt;/a&gt;もありますので試していただければと！&lt;/p&gt;
&lt;h3 id=&#34;elastic-stack-640リリース8月&#34;&gt;Elastic Stack 6.4.0リリース(8月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/elastic-stack-6-4-0-released&#34;&gt;リリース記事はこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;フィールドエイリアスや韓国語のアナライザーがElasticsearchに追加されました。
Kibanaはデザインがここからさらに少しずつ変更が入ってたりします。
&lt;a href=&#34;https://elastic.github.io/eui/#/&#34;&gt;Elastic UIフレームワークと呼ばれるデザイン用のライブラリ&lt;/a&gt;が、ElasticのプロダクトのUIに取り込まれていってる感じです。統一感が取れてきてますよね。私が開発している&lt;a href=&#34;https://github.com/johtani/analyze-api-ui-plugin/issues/25&#34;&gt;Analyze UIのプラグインにも取り込みました&lt;/a&gt;。
あとは、マイクロソフトのde:codeで話をさせていただいた、&lt;a href=&#34;https://www.elastic.co/blog/logstash-6-4-0-released&#34;&gt;Logstash向けのAzure Moduleがリリース&lt;/a&gt;されたのもこのバージョンでした。AzureのEvent Hubからデータを取り込んで、SQLデータベースのモニタリングや、ユーザーの認証などをとってKibanaで可視化するものです。&lt;/p&gt;
&lt;p&gt;もっとも気に入っているのはサンプルデータの登録が簡単になったことです。これまでは、KibanaとElasticsearchを用意した後に、データを入れるためにFilebeatなどを使ってから、ようやくKibanaで遊べるという形でした。
6.4からは、ElasticsearchとKibanaを立ち上げて、Kibanaのホーム画面の「Sample Data」のリンクを押した後に、「Sample flght data」の「Add」ボタンを押せばKibanaからデータが登録されます（&lt;a href=&#34;https://www.elastic.co/guide/en/kibana/current/tutorial-sample-data.html&#34;&gt;サンプルデータについてはこちら&lt;/a&gt;）。とりあえず触ってみたいという方への敷居がさらに下がったのではないかなぁと。&lt;/p&gt;
&lt;h3 id=&#34;elastic認定エンジニア第1号8月&#34;&gt;Elastic認定エンジニア第1号(8月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/celebrating-the-first-elastic-certified-engineer&#34;&gt;ブログ記事はこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;認定制度も始まりました。Elasticsearchの知識、経験を問われるテストを受けていただき、合格すると認定されるというやつです。
なんと、社外で世界初の認定エンジニアがアクロクエストの吉岡さんでした（上記ブログ参照）。
私もトレーナーやってるのもあり、慌てて認定をとったりしましたw。
認定テストは筆記ではなく、実際に作業をするテストなので実践的です。
トレーニングの受講が必須ではないのも面白いなぁと思いました。
トレーニングや認定エンジニアに興味がある方は、&lt;a href=&#34;https://training.elastic.co&#34;&gt;Elasticのトレーニングのサイト&lt;/a&gt;をご覧ください。
1月末にはまた、日本語でElasticsearchのトレーニングも開催されます！&lt;/p&gt;
&lt;h3 id=&#34;elastic-cloud-enterprise-20リリース9月&#34;&gt;Elastic Cloud Enterprise 2.0リリース(9月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/elastic-cloud-enterprise-2-0-0-released&#34;&gt;リリース記事はこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/products/ece&#34;&gt;Elastic Cloud Enterprise&lt;/a&gt;をご存知ない方もいらっしゃるかもしれません。
Elastic Cloudの裏側で利用しているクラスターの起動などの仕組みを製品として提供しているのがこちらになります。
Elastic Cloudで機械学習や様々な構成ができるようになったものがリリースされたのがこの2.0です。
複数のElasticsearchクラスターを管理したい場合には、こちらが便利なツールになってるんじゃないかなぁと。
部署ごとにクラスターを提供するといったことが可能になるので、乱立する前に利用するのも便利かなーと。&lt;/p&gt;
&lt;h3 id=&#34;ニューヨーク証券取引所で株式を公開10月&#34;&gt;ニューヨーク証券取引所で株式を公開(10月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/ze-bell-has-rung-thank-you-users-customers-and-partners&#34;&gt;ブログ記事&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;日本語でブログ10月&#34;&gt;日本語でブログ(10月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/how-to-configure-elasticsearch-cluster-better&#34;&gt;Elasticsearchの運用に関する典型的な4つの誤解&lt;/a&gt;というブログを書きました。4年も働いてるのに、会社のブログに翻訳以外で書いたことなかったので。。。
Twitterや勉強会、ブログ記事などで見かけるよくある誤解に関する記事を書いてみました。
Elasticは英語のブログも活発に書かれているのですが、今後もこのような形で日本語でのブログも頑張りますので、
読んでみたいものなどあればコメントいただければと。&lt;/p&gt;
&lt;p&gt;まぁ、&lt;a href=&#34;https://www.elastic.co/jp/blog/author/kosho-owa&#34;&gt;弊社の大輪は色々書いてるんで&lt;/a&gt;、私がもっと頑張れって話ですかね。。。&lt;/p&gt;
&lt;h3 id=&#34;elastic-stack-650リリース11月&#34;&gt;Elastic Stack 6.5.0リリース(11月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/elastic-stack-6-5-0-released&#34;&gt;リリース記事はこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;昨日（11/30）のウェビナーでも話をさせていただきましたが、Elastic Stack 6.5は「本当にマイナーリリース？？？」と思うほど盛りだくさんの機能がリリースされました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インフラUI、ログUI&lt;/li&gt;
&lt;li&gt;Elastic APMの分散トレーシング対応&lt;/li&gt;
&lt;li&gt;Java &amp;amp; Go APM Agent GAリリース&lt;/li&gt;
&lt;li&gt;Cross Cluster Replication&lt;/li&gt;
&lt;li&gt;ODBCドライバー&lt;/li&gt;
&lt;li&gt;Kibana Canvas&lt;/li&gt;
&lt;li&gt;Kibana Spaces&lt;/li&gt;
&lt;li&gt;Data Visualizer for files&lt;/li&gt;
&lt;li&gt;Functionbeat&lt;/li&gt;
&lt;li&gt;LogstashのApp Search output&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;リストアップしただけでもこれです。45分のウェビナーでは伝えきれてないなぁとも思ってますので、何か検討しようと思います！&lt;/p&gt;
&lt;h3 id=&#34;elasticsearch勉強会3月から12月&#34;&gt;Elasticsearch勉強会(3月から12月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.meetup.com/ja-JP/Tokyo-Elastic-Fantastics/&#34;&gt;Elasticsearch勉強会ページ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;今年は、6回の勉強会を開催（1つは12月19日開催）しました。
9月からは、ユースケースなど、もっと参加者の皆さんの興味があることにフォーカスしながら開催をしてみ始めました。
参加しやすくなってればいいのですが。。。
そろそろまたアンケートをとったりして、参加しやすいか、どんな改善がしてほしいかなどを聞きたいなと思っています。&lt;/p&gt;
&lt;p&gt;12月はもっと皆さんと喋りたいなということで、&lt;a href=&#34;https://www.meetup.com/ja-JP/Tokyo-Elastic-Fantastics/events/256619262/&#34;&gt;スピーカーなしの「LT&amp;amp;忘年会」&lt;/a&gt;にしてみました。
私やElasticのものも参加するので、ぜひ色々聞いたり、他のコミュニティの方達の使い方を聞き出して、
新しい発見をしていただければなーと思います。LTでスピーカーの練習をするってものありですよ！（まだ誰も応募してくれてない。。。）
発表することで、フィードバックがもらえて、自分の使い方に自信が持てたり、その他の視点を得ることができると思いますので、
ぜひ発表してみていただければと。&lt;/p&gt;
&lt;h3 id=&#34;12月のjohtani出没イベント&#34;&gt;12月のjohtani出没イベント&lt;/h3&gt;
&lt;p&gt;12月は以下のイベントにブースを出してます。イベントに参加される方はぜひブースにお立ち寄りください！！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;12/4-5 : &lt;a href=&#34;https://containerdays.jp&#34;&gt;Japan Container Days&lt;/a&gt; - 東京&lt;/li&gt;
&lt;li&gt;12/8 : &lt;a href=&#34;https://www.ospn.jp/osc2018-fukuoka/&#34;&gt;OSC福岡&lt;/a&gt; - 福岡&lt;/li&gt;
&lt;li&gt;12/15 : &lt;a href=&#34;http://www.java-users.jp/ccc2018fall/#/&#34;&gt;JJUG CCC 2018 Fall&lt;/a&gt; - 東京&lt;/li&gt;
&lt;li&gt;12/19 : &lt;a href=&#34;https://www.meetup.com/ja-JP/Tokyo-Elastic-Fantastics/events/256619262/&#34;&gt;第27回Elasticsearch勉強会&lt;/a&gt; - 東京&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;なんか、忙しそうだな。。。&lt;/p&gt;
&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;
&lt;p&gt;駆け足でしたが今年を振り返ってみました。
今年も色々ありましたが、今後もよろしくお願いいたします。&lt;/p&gt;
&lt;p&gt;さて、&lt;a href=&#34;https://qiita.com/advent-calendar/2018/elasticsearch&#34;&gt;Elastic Stack Advent Calendar 2018&lt;/a&gt;は今日から25日まで続きます。こらからの記事を楽しみにしています！&lt;/p&gt;
&lt;p&gt;ということで、次は&lt;a href=&#34;https://qiita.com/kaibadash@github&#34;&gt;kaibadash@github&lt;/a&gt;さんの「ぼくの考えた最強のElasticsearch index設定を最強にわかりやすく書くぞ！！！」になります。お楽しみに！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elastic Stack入門ウェビナー for インフラ勉強会</title>
      <link>https://blog.johtani.info/presentation/2018/elastic-stack-for/</link>
      <pubDate>Tue, 06 Nov 2018 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2018/elastic-stack-for/</guid>
      <description></description>
      <content:encoded></content:encoded>
    </item>
    
    <item>
      <title>様々なメトリクスやログを集めてシステム解析 - Elastic Stackの入門と活用 - / Getting started Elastic Stack for logging/metrics</title>
      <link>https://blog.johtani.info/presentation/2018/metrics/</link>
      <pubDate>Sat, 27 Oct 2018 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2018/metrics/</guid>
      <description>&lt;p&gt;OSC 2018 Tokyo/Fall での発表資料になります。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;OSC 2018 Tokyo/Fall での発表資料になります。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>新規導入した長期出張用のアイテムをいくつか紹介</title>
      <link>https://blog.johtani.info/blog/2018/10/18/items-for-long-businesstrip/</link>
      <pubDate>Thu, 18 Oct 2018 01:34:55 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2018/10/18/items-for-long-businesstrip/</guid>
      <description>&lt;p&gt;（転職する少し前までパスポートすら持ってなかったのに）今の会社に転職してから、半年に1度の割合で海外への出張が発生する生活を送っています。
4年目になりますが、今回いくつか新しいガジェット？アイテム？を出張用に導入したので感想を書いておこうかなと。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;（転職する少し前までパスポートすら持ってなかったのに）今の会社に転職してから、半年に1度の割合で海外への出張が発生する生活を送っています。
4年目になりますが、今回いくつか新しいガジェット？アイテム？を出張用に導入したので感想を書いておこうかなと。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;とりあえず、以下の4つです。&lt;/p&gt;
&lt;h2 id=&#34;felimoa-ネック-ピロー&#34;&gt;Felimoa ネック ピロー&lt;/h2&gt;
&lt;p&gt;これまでは、無印で購入した「&lt;a href=&#34;https://www.muji.net/store/cmdty/detail/4550002125325&#34;&gt;フィットするネックピロー&lt;/a&gt;」を使ってました。
特に使ってる間は問題ないのですが、どうしてもかさばります。。。
そんな時、FBで見かけたのがこちら。&lt;/p&gt;
&lt;iframe style=&#34;width:240px;height:240px;&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34; scrolling=&#34;no&#34; frameborder=&#34;0&#34; src=&#34;https://rcm-fe.amazon-adsystem.com/e/cm?ref=tf_til&amp;t=johtani-22&amp;m=amazon&amp;o=9&amp;p=8&amp;l=as1&amp;IS2=1&amp;detail=1&amp;asins=B077GQR2QC&amp;linkId=68ae5d69e21ae8138332beb9d301a542&amp;bc1=000000&amp;lt1=_blank&amp;fc1=333333&amp;lc1=0066c0&amp;bg1=ffffff&amp;f=ifr&#34;&gt;
    &lt;/iframe&gt;
&lt;p&gt;厚みがないので、持ち運びが便利でした（商品紹介の中にありますが、リュックにつけると邪魔にならない）。
飛行機の中で使うので、それほど暑くない場所なので、ムレる感じでもなく。
ただ、ヘッドフォン＋真横にフレームがくる形になるとヘッドフォンに干渉するので、
私はフレームを顎の下の方に寄せた形で使ってました。
軽さと場所を取らないのがよかったです。&lt;/p&gt;
&lt;h2 id=&#34;ノイズキャンセリングヘッドフォン&#34;&gt;ノイズキャンセリングヘッドフォン&lt;/h2&gt;
&lt;p&gt;これまでは、&lt;a href=&#34;https://www.sony.jp/walkman/products/NW-A840_series/&#34;&gt;SONYのNW-A847&lt;/a&gt;という
ノイズキャンセリング機能付きのウォークマン＋アクセサリーで外部入力を取り込む形で、飛行機で映画を見ていました。
これ自体が8年前の製品ですね。。。
これとは別に、冬の寒い時期は防寒も兼ねてヘッドフォンを使用しています。
&lt;a href=&#34;https://www.sony.jp/headphone/products/MDR-10R/&#34;&gt;MDR-10R&lt;/a&gt;を使ってたんですが、昨年こんな感じになりまして。。。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; data-lang=&#34;ja&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;応急処置 &lt;a href=&#34;https://t.co/uDErZWpPVC&#34;&gt;pic.twitter.com/uDErZWpPVC&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://twitter.com/johtani/status/928850255222681601?ref_src=twsrc%5Etfw&#34;&gt;2017年11月10日&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;で、ヘッドフォンの買い替えを検討してたんです。
そこへ飛び込んできたのがSonyの新しいノイズキャンセリングヘッドフォンでしたと。&lt;/p&gt;
&lt;iframe style=&#34;width:120px;height:240px;&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34; scrolling=&#34;no&#34; frameborder=&#34;0&#34; src=&#34;//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=johtani-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=B07GZ8DZC8&amp;linkId=0b91ad46d6f630a45d53c65eba62725a&#34;&gt;&lt;/iframe&gt;
&lt;p&gt;せっかく買い換えるし、今度はいいものを長くということでフライト前日に購入してしまいました。
結論としては高いけど買ってよかったと。よかった点はこんな感じです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;軽い&lt;/li&gt;
&lt;li&gt;イヤーパッドが耳を抑えることがないので長時間でも気にならない&lt;/li&gt;
&lt;li&gt;人の声だけノイズキャンセリングをオフにする（騒音などはキャンセルしてくれる）&lt;/li&gt;
&lt;li&gt;バッテリーが長時間&lt;/li&gt;
&lt;li&gt;ヘッドフォンを外さないでも案内を聞くことができる「クイックアテンションモード」&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;などなど。行きのフライトで5時間も遅れが出ましたが、空港、飛行機内で非常に快適に過ごせました。
大事に使おう。。。&lt;/p&gt;
&lt;h2 id=&#34;cw-x&#34;&gt;cw-x&lt;/h2&gt;
&lt;p&gt;知り合いがFBにアップしてて、立ちっぱなしの仕事だったり、長時間のフライトでも足が疲れないという噂を聞いて購入しました。&lt;/p&gt;
&lt;iframe style=&#34;width:120px;height:240px;&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34; scrolling=&#34;no&#34; frameborder=&#34;0&#34; src=&#34;//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=johtani-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=B01BKDX2QY&amp;linkId=5af7d1ce20febf92530820e8e6b66284&#34;&gt;&lt;/iframe&gt;
&lt;p&gt;長時間のフライトの後に、ホテルで1泊しても足の疲れって結構残ってるんです。
今回、12時間のフライトでズボンの下に履いて行きましたが、足の疲れがほぼありませんでした。
デブになりつつあり、足太くなって来てるので、履くのはちょっと苦労しますが。。。もともときつめに作ってるんじゃないかなぁ（希望的観測）。
帰りも使用しましたが、帰りはフライト前に1万歩ほどダブリンの街中を歩き回ってたので、流石に疲れが出てます。。。
今度は、カンファレンスのブースなどで立つことが多いシーンでも使ってみて、疲れがどうなるかを試してみようと思います。&lt;/p&gt;
&lt;h2 id=&#34;携帯ウォシュレット&#34;&gt;携帯ウォシュレット&lt;/h2&gt;
&lt;p&gt;初めて購入しました。海外のホテルで1週間とか連泊するんですが、トイレットペーパーがやはり硬めなのが気になって。。。&lt;/p&gt;
&lt;iframe style=&#34;width:120px;height:240px;&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34; scrolling=&#34;no&#34; frameborder=&#34;0&#34; src=&#34;//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=johtani-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=B005FDJ8SM&amp;linkId=e959d19209ac105a9f0e30ab00e2c4be&#34;&gt;&lt;/iframe&gt;
&lt;p&gt;世界に誇る日本の技術の一つだと確信してますw
ドイツに長期出張してた友人が便利だよと言ってたので、思い切って購入して持って行きました。
硬めのトイレットペーパーも気にならなくなるのでとても幸せな気分ですw&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;とりあえず、今回はこんな感じです。
総じて導入してよかったなという感じでした。
他にもおすすめ出張グッズとかあればコメントいただけると嬉しいです。&lt;/p&gt;
&lt;p&gt;普段使ってるものとか、どういうものを持っていってるとか興味ある人いるかなぁ？
ではでは。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第25回Elasticsearch勉強会を開催しました。</title>
      <link>https://blog.johtani.info/blog/2018/10/17/26th-elasticsearch-tokyo-meetup/</link>
      <pubDate>Wed, 17 Oct 2018 17:33:50 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2018/10/17/26th-elasticsearch-tokyo-meetup/</guid>
      <description>&lt;p&gt;毎月開催の2回目になります。
今回は日経さんの会場をお借りしての開催となりました。&lt;/p&gt;
&lt;p&gt;前回から、スピーカーの募集をhttp://bit.ly/SpeakerElasticTokyoMeetup で行なっております。
ぜひ皆さんのノウハウを共有していただけると助かります。
また、次回もすでにスケジュール済みです。次回は&lt;a href=&#34;https://www.meetup.com/ja-JP/Tokyo-Elastic-Fantastics/events/254646236/&#34;&gt;「ログ/メトリック分析」回&lt;/a&gt;になります。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;毎月開催の2回目になります。
今回は日経さんの会場をお借りしての開催となりました。&lt;/p&gt;
&lt;p&gt;前回から、スピーカーの募集をhttp://bit.ly/SpeakerElasticTokyoMeetup で行なっております。
ぜひ皆さんのノウハウを共有していただけると助かります。
また、次回もすでにスケジュール済みです。次回は&lt;a href=&#34;https://www.meetup.com/ja-JP/Tokyo-Elastic-Fantastics/events/254646236/&#34;&gt;「ログ/メトリック分析」回&lt;/a&gt;になります。&lt;/p&gt;
&lt;p&gt;以下は、個人的なメモになります。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h3 id=&#34;メディアコンテンツ向け記事検索dbとして使うelasticsearch--future-architect-株式会社-村田-靖拓さん-twitter-famipapamart&#34;&gt;メディアコンテンツ向け記事検索DBとして使うElasticsearch / Future Architect 株式会社 村田 靖拓さん (twitter: @famipapamart)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;メディア記事コンテンツ検索&lt;/li&gt;
&lt;li&gt;全ての情報が1indexに入っているようにすること。&lt;/li&gt;
&lt;li&gt;typeは少し悩んだ。&lt;/li&gt;
&lt;li&gt;範囲検索にはならない場合がある。（文字列で登録してWildcard検索できるようにした）&lt;/li&gt;
&lt;li&gt;kuromojiで基本対応&lt;/li&gt;
&lt;li&gt;異体字についてはchar filterでマッピング&lt;/li&gt;
&lt;li&gt;細かな設定とかもスライドにて公開予定。
&lt;ul&gt;
&lt;li&gt;基本的なプラグインだけで対応した&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Dynamic Field mappingを有効にしたまま対応&lt;/li&gt;
&lt;li&gt;パフォーマンス検証&lt;/li&gt;
&lt;li&gt;初回のインデックスのロードは&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-search-speed.html#_warm_up_the_filesystem_cache&#34;&gt;この辺かなぁ？&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;自力でQueryのoffset-limitを構築するのかぁ。
&lt;ul&gt;
&lt;li&gt;ソート条件が固定らしいのでできる方法&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;minne-での検索運用仮--_shiro16-さん&#34;&gt;minne での検索運用(仮) / @_shiro16 さん&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ハンドメイドなものをマーケットプレイスがminne&lt;/li&gt;
&lt;li&gt;SolrからElasticsearchに切り替えた話 2016/02以降はEs
&lt;ul&gt;
&lt;li&gt;昔は、DBからSolrへ同期&lt;/li&gt;
&lt;li&gt;Es版ではDBからの同期ではなく、Workerに対してリクエストを入れる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;現状は独自にEC2で運用中&lt;/li&gt;
&lt;li&gt;ユーザーが求めているものがきちんとでているかを計測している
&lt;ul&gt;
&lt;li&gt;行動ログはどんな感じ？&lt;/li&gt;
&lt;li&gt;TDにログを入れて、CTRとかを計算してre:dashで可視化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;A/Bテストも実施
&lt;ul&gt;
&lt;li&gt;指標はキャンペーンなどが実施されている場合にブレる場合もある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;トレンドをログから知ることができる&lt;/li&gt;
&lt;li&gt;Function Scoreでスコアを変更してる
&lt;ul&gt;
&lt;li&gt;季節的な単語でスコアを変更したりする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ドリンクの対応などをして聴けてないところが。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;query_stringのはなし--加藤遼さん日本経済新聞社&#34;&gt;query_stringのはなし / 加藤遼さん　(日本経済新聞社)&lt;/h3&gt;
&lt;p&gt;電池が切れそう＋ピザとかの手配をしていたらメモが取れず。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;苦労が滲み出る感じのセッションでした。&lt;/li&gt;
&lt;li&gt;query_string queryが実際にどんなクエリになっているかの説明を交えて説明してもらえたのはすごくよかったんじゃないかと。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;検索は話してくれる人が多いし話題に事欠かないなぁという印象でした。
今回も、スピーカーの皆さん、会場提供をしていただいた日経さんありがとうございました。&lt;/p&gt;
&lt;p&gt;他のユースケースのスピーカーも募集してます。ぜひMeetup.comの概要に記載してあるリンクからスピーカーの応募をお願いします！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elastic Stack 入門 2018.09 / Getting started Elastic Stack 2018.09</title>
      <link>https://blog.johtani.info/presentation/2018/getting-started-elastic-stack-2018-dot-09/</link>
      <pubDate>Wed, 19 Sep 2018 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2018/getting-started-elastic-stack-2018-dot-09/</guid>
      <description>&lt;p&gt;第24回Elasticsearch勉強会「入門編」で使用した資料です。
#elasticsearchjp&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;第24回Elasticsearch勉強会「入門編」で使用した資料です。
#elasticsearchjp&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>え?SQLで入門?する  ElasticsearchとElastic Stack / Getting started Elastic Stack with SQL</title>
      <link>https://blog.johtani.info/presentation/2018/getting-started-elastic-stack-with-sql/</link>
      <pubDate>Wed, 19 Sep 2018 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2018/getting-started-elastic-stack-with-sql/</guid>
      <description>&lt;p&gt;db tech showcase 2018での発表資料です。
タイトルはだいぶ煽り気味で、Elastic Stackの入門の話がメインです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;db tech showcase 2018での発表資料です。
タイトルはだいぶ煽り気味で、Elastic Stackの入門の話がメインです。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>JJUGナイトセミナーで話しました</title>
      <link>https://blog.johtani.info/blog/2018/07/29/apm-java-at-jjug/</link>
      <pubDate>Sun, 29 Jul 2018 14:45:30 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2018/07/29/apm-java-at-jjug/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://jjug.doorkeeper.jp/events/77485&#34;&gt;7/25にJJUGナイトセミナー&lt;/a&gt;でElastic Stackの紹介とAPMのJava Agentの紹介をしたので、補足のブログです。
（久々に書くな。。。）&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;スライドとサンプルアプリのリポジトリはこちら。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://jjug.doorkeeper.jp/events/77485&#34;&gt;7/25にJJUGナイトセミナー&lt;/a&gt;でElastic Stackの紹介とAPMのJava Agentの紹介をしたので、補足のブログです。
（久々に書くな。。。）&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;スライドとサンプルアプリのリポジトリはこちら。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スライド：https://speakerdeck.com/johtani/intro-elastic-stack-and-elastic-apm-java&lt;/li&gt;
&lt;li&gt;リポジトリ：https://github.com/johtani/apm-beats-kubernetes-demo/tree/master&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;サンプルアプリ&#34;&gt;サンプルアプリ&lt;/h3&gt;
&lt;p&gt;勉強会の頭でサンプルアプリへのアクセス用QRコードを用意して質問してもらう感じにしました。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20180729/APM___Beats_demo_app.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20180729/APM___Beats_demo_app.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;アプリ自体が質問の受付と、そこにある質問に対して聞きたいかどうかのVoteができる仕組みになっています。
セッション最後にこの画面をみながら答えました。
手を挙げていただくよりも、匿名（名前入れるようになってますが、実名である必要はない）で登録できるし、
みんなが聞きたいかどうかもわかるので便利だなぁと。&lt;/p&gt;
&lt;p&gt;元は、Elastic{ON} 2018であった「&lt;a href=&#34;https://www.elastic.co/webinars/elasticsearch-log-collection-with-kubernetes-docker-and-containers&#34;&gt;Docker &amp;amp; Kubernetes Log Collection and Monitoring with Beats and Elasticsearch&lt;/a&gt;」のサンプルアプリです。
これをSpring Bootに移植して、ちょっとだけサンプルコードを追加したものになります。&lt;/p&gt;
&lt;h3 id=&#34;構成とかの補足&#34;&gt;構成とかの補足&lt;/h3&gt;
&lt;p&gt;スライド、GitHubのリポジトリのREADMEにある図は、k8s上のサンプルアプリケーションの構成だけでした。
ElasticsearchとKibanaを含めた図はこんな感じです。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20180729/system-overview.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20180729/system-overview.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;k8s上の各種Beats、APM Serverは一旦Elastic CLoud Elasticsearch Service（AWS Tokyoリージョンにデプロイ）に対してデータを投げます。
で、KibanaはGKE(k8s on GCP)で動かして、実際に勉強会ではkubectl proxyで接続してから表示していました。
この構成にしている理由は次の理由です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Elastic CloudのElasticsearchクラスターにデータを投げている理由
&lt;ul&gt;
&lt;li&gt;クラスターの起動が簡単。&lt;/li&gt;
&lt;li&gt;データを永続化したい。k8sのアプリは必要がなくなったらデータを削除したいから。&lt;/li&gt;
&lt;li&gt;k8sのdeploymentを書く手間を省く&lt;/li&gt;
&lt;li&gt;普段使ってるので。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;KibanaをGKEで動かした理由
&lt;ul&gt;
&lt;li&gt;Elastic Cloudでは*「現時点(7/29現在)」*で、KibanaでAPM専用のUIを起動できない&lt;/li&gt;
&lt;li&gt;ローカルである必要はない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;といったところです。
Elastic Cloudのインスタンスを起動したままにしておけば、デモをしなくても、このタイミングのログ、メトリクスを
再利用して話をすることも可能です。&lt;/p&gt;
&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;
&lt;p&gt;ということで、簡単ですが、構成の補足でした。
勉強会では告知したのですが、今後の勉強会はトピックスごとでやりたいなと。ということで、どんなトピックスに興味があるのか、スピーカーの応募にはどんなツールが話しやすいかなどといったことのアンケートを集めております。ぜひご協力ください！
また、アンケート、このブログに関する質問がある場合は、&lt;a href=&#34;https://twitter.com/johtani&#34;&gt;@johtani&lt;/a&gt;、もしくはブログへのコメントでお願い致します。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; data-lang=&#34;ja&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;今後の勉強会のやり方などについてアンケートを実施中です。&lt;a href=&#34;https://t.co/XU15CHro0n&#34;&gt;https://t.co/XU15CHro0n&lt;/a&gt; 皆さん是非ご協力ください。ここにない項目については返信をお願いします。 &lt;a href=&#34;https://twitter.com/hashtag/elasticsearchjp?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#elasticsearchjp&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://twitter.com/johtani/status/1021388358730170368?ref_src=twsrc%5Etfw&#34;&gt;2018年7月23日&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elastic Stackで始めるJavaアプリのパフォーマンス監視 / Intro Elastic Stack and Elastic APM Java</title>
      <link>https://blog.johtani.info/presentation/2018/intro-elastic-stack-and-elastic-apm-java/</link>
      <pubDate>Wed, 25 Jul 2018 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2018/intro-elastic-stack-and-elastic-apm-java/</guid>
      <description>&lt;p&gt;2018/07/25のJJUG ナイトセミナーで使用したスライドになります。&lt;/p&gt;
&lt;p&gt;サンプルアプリ、Beats系の設定は以下のGitHubリポジトリで公開してます。
&lt;a href=&#34;https://github.com/johtani/apm-beats-kubernetes-demo/&#34;&gt;https://github.com/johtani/apm-beats-kubernetes-demo/&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;2018/07/25のJJUG ナイトセミナーで使用したスライドになります。&lt;/p&gt;
&lt;p&gt;サンプルアプリ、Beats系の設定は以下のGitHubリポジトリで公開してます。
&lt;a href=&#34;https://github.com/johtani/apm-beats-kubernetes-demo/&#34;&gt;https://github.com/johtani/apm-beats-kubernetes-demo/&lt;/a&gt;&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>What&#39;s new in Elastic Stack 6.3</title>
      <link>https://blog.johtani.info/presentation/2018/whats-new-in-elastic-stack-6-dot-3/</link>
      <pubDate>Wed, 25 Jul 2018 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2018/whats-new-in-elastic-stack-6-dot-3/</guid>
      <description>&lt;p&gt;第23回Elasticsarch勉強会で発表した6.3の新機能の紹介スライドです。&lt;/p&gt;
&lt;p&gt;Webinarの録画ビデオではデモもありますので、参考にしていただければと。
&lt;a href=&#34;https://www.elastic.co/jp/webinars/elastic-stack-6-3&#34;&gt;https://www.elastic.co/jp/webinars/elastic-stack-6-3&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;第23回Elasticsarch勉強会で発表した6.3の新機能の紹介スライドです。&lt;/p&gt;
&lt;p&gt;Webinarの録画ビデオではデモもありますので、参考にしていただければと。
&lt;a href=&#34;https://www.elastic.co/jp/webinars/elastic-stack-6-3&#34;&gt;https://www.elastic.co/jp/webinars/elastic-stack-6-3&lt;/a&gt;&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>様々なメトリクスやログを集めてシステム解析  - Elastic Stackの入門と活用 - / Intro Elastic Stack</title>
      <link>https://blog.johtani.info/presentation/2018/intro-elastic-stack-1/</link>
      <pubDate>Wed, 11 Jul 2018 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2018/intro-elastic-stack-1/</guid>
      <description>&lt;p&gt;OSC Hokkaido 2018での発表資料です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;OSC Hokkaido 2018での発表資料です。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Intro Elastic Stack at Telemetry WG</title>
      <link>https://blog.johtani.info/presentation/2018/intro-elastic-stack-at-telemetry-wg/</link>
      <pubDate>Thu, 05 Jul 2018 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2018/intro-elastic-stack-at-telemetry-wg/</guid>
      <description>&lt;p&gt;2018/06/29にTelemetryWGで使用したスライド。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;2018/06/29にTelemetryWGで使用したスライド。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>FOSS Backstage 2018に参加しました</title>
      <link>https://blog.johtani.info/blog/2018/06/21/report-of-foss-backstage-2018/</link>
      <pubDate>Thu, 21 Jun 2018 16:02:13 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2018/06/21/report-of-foss-backstage-2018/</guid>
      <description>&lt;p&gt;ベルリンで開催された&lt;a href=&#34;https://foss-backstage.de/&#34;&gt;FOSS Backstage&lt;/a&gt;というカンファレンスに参加してきました。
残念ながら、参加だけですが。
この直前に同じ会場で開催された&lt;a href=&#34;https://berlinbuzzwords.de/&#34;&gt;Berlin Buzzwords&lt;/a&gt;には昨年参加しました。今年は、少しだけお邪魔した感じだったんで、ちょっとだけ記事書くかも。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ベルリンで開催された&lt;a href=&#34;https://foss-backstage.de/&#34;&gt;FOSS Backstage&lt;/a&gt;というカンファレンスに参加してきました。
残念ながら、参加だけですが。
この直前に同じ会場で開催された&lt;a href=&#34;https://berlinbuzzwords.de/&#34;&gt;Berlin Buzzwords&lt;/a&gt;には昨年参加しました。今年は、少しだけお邪魔した感じだったんで、ちょっとだけ記事書くかも。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://foss-backstage.de/about&#34;&gt;FOSS Backstageの趣旨&lt;/a&gt;は、FOSS(Free Open Source Software)に関するガバナンス(コミュニティや開発チームの運営とか) 、コラボレーション、法律？経済の話題になります。
今読んでる、アートオブコミュニティも似たような感じかも。
ということで、いくつかセッションの内容と感想を。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;以下は、参加したセッションのいくつかの感想になります。&lt;/p&gt;
&lt;h2 id=&#34;keynote&#34;&gt;Keynote&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;タイトル: &lt;a href=&#34;https://foss-backstage.de/session/20-years-open-source-stories-early-days&#34;&gt;20 years of Open Source – stories from the early days&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;ldquo;Open Source Heroes&amp;quot;という書籍を書いているところ。Open Source Initiativeの20周年&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open sourceについて6つの大事なことを、OSSの20年を振り返りながら、どんな人がいて、どんなことが起きたかを例として説明。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;私自身はあまりOSSの歴史などには詳しくなかったので、知らない人の話が多かった。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MSによるGitHubの買収の話もタイムリーだったのでちょっと話が出ていた。MSのCEOはOSSをよくわかっているし。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open Sourceについての6つの大事なこと&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Transparency - Transparency is not negotiable in Open Source. If it&amp;rsquo;s not transparent, it is not Open Source.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;例としては、Reactのライセンスの話やGoogleのデータの取り扱いについて&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;People - Open Source is People&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;People with working together is key to successful Open Source. Generally, kind.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Company like strategic advantage&lt;/li&gt;
&lt;li&gt;Pay attention?&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Code 4 America -&amp;gt; Code 4 cities&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;Money - Changes universe&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Apache runs as economic&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;6&#34;&gt;
&lt;li&gt;Tag? Tack? Tuck?&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;GitHubの買収の話も出てきた。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;cultivating-empathy&#34;&gt;Cultivating Empathy&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Link: &lt;a href=&#34;https://foss-backstage.de/session/cultivating-empathy&#34;&gt;https://foss-backstage.de/session/cultivating-empathy&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Elasticに入った時にお世話になったLeslieのTalkです。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Analyze UIとKibanaのプラグインの作成方法（第3回）</title>
      <link>https://blog.johtani.info/blog/2018/04/20/directory-layout-and-architecture/</link>
      <pubDate>Fri, 20 Apr 2018 15:30:01 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2018/04/20/directory-layout-and-architecture/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://blog.johtani.info/blog/2018/02/09/getting-started-template-kibana-plugin/&#34;&gt;第2回&lt;/a&gt;から少し間が空いてしまいましたが、templateで作成したプラグインのディレクトリ構成とどういう流れでデータがやり取りされるかについてみていきます。
（2018/02月時点で作成したディレクトリ構成にしたがって説明します）
ちなみに、JavaScriptの優れた開発者ではないので、誤解している点や、効率の悪い書き方などがあるかもしれません。見つけた場合は、連絡をいただければと思います。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;http://blog.johtani.info/blog/2018/02/09/getting-started-template-kibana-plugin/&#34;&gt;第2回&lt;/a&gt;から少し間が空いてしまいましたが、templateで作成したプラグインのディレクトリ構成とどういう流れでデータがやり取りされるかについてみていきます。
（2018/02月時点で作成したディレクトリ構成にしたがって説明します）
ちなみに、JavaScriptの優れた開発者ではないので、誤解している点や、効率の悪い書き方などがあるかもしれません。見つけた場合は、連絡をいただければと思います。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;では、まずは作成したディレクトリ構成についてみていきましょう。&lt;/p&gt;
&lt;h2 id=&#34;ディレクトリ構成&#34;&gt;ディレクトリ構成&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;simple-sample-kibana-plugin&lt;/code&gt;がプラグインのプロジェクトのトップディレクトリになります。このディレクトリに次のような構成でサブディレクトリが存在します(なお、画像はIntelliJに取り込んだ後のディレクトリになっているので、&lt;code&gt;.iml&lt;/code&gt;など、不要なファイル/ディレクトリが存在しています)。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:400&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20180420/directories.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20180420/directories.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;主要なディレクトリ、ファイルについて簡単に一覧で説明します(順不同)。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;ファイル/ディレクトリ名&lt;/th&gt;
          &lt;th&gt;説明&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;index.js&lt;/td&gt;
          &lt;td&gt;プラグインの本体。Kibanaはこのファイルのオブジェクトを読み込みプラグインを起動。設定などの読み込みもこちら。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;package.json&lt;/td&gt;
          &lt;td&gt;npm/yarnのパッケージに関する情報を定義するファイル&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;README.md&lt;/td&gt;
          &lt;td&gt;README。プラグインの説明などを記載する。インストール方法なども記載すると便利&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;public&lt;/td&gt;
          &lt;td&gt;ブラウザ側に配布されるプログラムや画像一式&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;public/less/main.less&lt;/td&gt;
          &lt;td&gt;LESS用のファイル。アプリ固有のスタイルなどを記載&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;public/app.js&lt;/td&gt;
          &lt;td&gt;ブラウザ側で読み込まれるプラグインのモジュールなど。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;public/template/index.html&lt;/td&gt;
          &lt;td&gt;HTMLのテンプレート。ブラウザ上での描画に利用&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;server/routes&lt;/td&gt;
          &lt;td&gt;Kibanaサーバー側で動作するプラグイン。hapi.jsを利用してREST APIを実装する&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;重要なファイルについて少しだけ説明します。&lt;/p&gt;
&lt;h4 id=&#34;packagejson&#34;&gt;package.json&lt;/h4&gt;
&lt;p&gt;npmやyarnでビルドなどをするときに使用するパッケージ情報を記載するためのファイルです。
プラグインの名前、バージョン、説明などを記載します。
Kibanaのバージョンについてもこちらで管理します。この情報を
また、ライブラリなどの依存関係についてもこちらで記載しています。
以下、抜粋。&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-json&#34; data-lang=&#34;json&#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;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;simple-sample-kibana-plugin&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:#f92672&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;0.0.0&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:#f92672&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Sample plugin for explaining how to make kibana app&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:#f92672&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;index.js&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:#f92672&#34;&gt;&amp;#34;kibana&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:#f92672&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;6.2.1&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:#f92672&#34;&gt;&amp;#34;templateVersion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;7.2.4&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;scripts&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:#f92672&#34;&gt;&amp;#34;lint&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;eslint **/*.js&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:#960050;background-color:#1e0010&#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:#f92672&#34;&gt;&amp;#34;devDependencies&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:#f92672&#34;&gt;&amp;#34;@elastic/eslint-config-kibana&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^0.14.0&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:#f92672&#34;&gt;&amp;#34;@elastic/eslint-import-resolver-kibana&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^0.9.0&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:#f92672&#34;&gt;&amp;#34;@elastic/plugin-helpers&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^7.1.3&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:#960050;background-color:#1e0010&#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;&amp;#34;expect.js&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^0.3.1&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;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;version&lt;/code&gt;などをリリースするたびに変更しています。&lt;/p&gt;
&lt;h4 id=&#34;indexjs&#34;&gt;index.js&lt;/h4&gt;
&lt;p&gt;最初にKibanaに読み込まれるオブジェクトになります。
Kibanaのアプリの名前や、必要なモジュールなどを記載します。&lt;/p&gt;
&lt;p&gt;また、&lt;code&gt;kibana.yml&lt;/code&gt;から設定など読み込む処理なども書くことができます。&lt;/p&gt;
&lt;p&gt;2行目の&lt;code&gt;exampleRoute&lt;/code&gt;はサーバー側のAPIとして利用するhapi.js用のファイルのパスになります。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;uiExports&lt;/code&gt;はこのアプリの画面に関する設定などの記載になります。
&lt;code&gt;app&lt;/code&gt;の部分が実際にアプリの情報で、
&lt;code&gt;main&lt;/code&gt;があとで説明するこのプラグインのUIのためのJavaScriptファイル(public/app.js)になります。mainですので、最初に読み込まれる処理が記載されているものを指定します。&lt;code&gt;app.js&lt;/code&gt;というファイル名を変更する場合は、こちらの&lt;code&gt;app&lt;/code&gt;の部分を変更したファイルに合わせましょう。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;config(Joi)&lt;/code&gt;の関数が設定ファイルの読み込みなどの処理を記載する場所です。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;init(server, options)&lt;/code&gt;の関数が初期化処理を記載する場所になります。
このサンプルアプリでは、2行目の&lt;code&gt;import&lt;/code&gt;で読み込んだhapi.js用のファイルの関数を呼び出しています。引数で渡している&lt;code&gt;server&lt;/code&gt;がhapi.jsの&lt;code&gt;server&lt;/code&gt;オブジェクトになります。
&lt;code&gt;route&lt;/code&gt;メソッドを使用して作成しているプラグイン用のREST APIを追加しています。&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:#66d9ef&#34;&gt;import&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;resolve&lt;/span&gt; } &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;path&amp;#39;&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;import&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;exampleRoute&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;./server/routes/example&amp;#39;&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;export&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;default&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;kibana&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;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;kibana&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Plugin&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;require&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;elasticsearch&amp;#39;&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;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;simple-sample-kibana-plugin&amp;#39;&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;uiExports&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#a6e22e&#34;&gt;app&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#a6e22e&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Simple Sample Kibana Plugin&amp;#39;&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;description&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Sample plugin for explaining how to make kibana app&amp;#39;&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;main&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;plugins/simple-sample-kibana-plugin/app&amp;#39;&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&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:#a6e22e&#34;&gt;config&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;Joi&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;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Joi&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;object&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;enabled&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Joi&lt;/span&gt;.&lt;span style=&#34;color:#66d9ef&#34;&gt;boolean&lt;/span&gt;().&lt;span style=&#34;color:#66d9ef&#34;&gt;default&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;true&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;default&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:#a6e22e&#34;&gt;init&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;server&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;options&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;// Add server routes and initialize the plugin here
&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;exampleRoute&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;server&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;publicappjs&#34;&gt;public/app.js&lt;/h4&gt;
&lt;p&gt;画面用のモジュールです。
&lt;code&gt;uiRoutes&lt;/code&gt;という機能を使用して、アプリの呼び出しURLを定義します。テンプレートで作成したばかりの場合は、&lt;code&gt;/&lt;/code&gt;というURLが追加されるのみです。&lt;/p&gt;
&lt;p&gt;実際に画面を表示する際に動くコントローラーの部分はその下の
&lt;code&gt;uiModules.controller&lt;/code&gt;に指定してあるfunctionが画面描画の
処理を書く部分になります。
templateで作成したプラグインでは、&amp;ldquo;title&amp;quot;など表示に必要なデータを&lt;code&gt;$scope&lt;/code&gt;というオブジェクトに詰め込んでいます。
これはAngularJS(1系)でのモデルオブジェクトになります。&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:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;moment&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;moment&amp;#39;&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;import&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;uiModules&lt;/span&gt; } &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ui/modules&amp;#39;&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;import&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;uiRoutes&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ui/routes&amp;#39;&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;import&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ui/autoload/styles&amp;#39;&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;import&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;./less/main.less&amp;#39;&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;import&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;template&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;./templates/index.html&amp;#39;&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:#a6e22e&#34;&gt;uiRoutes&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;enable&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;uiRoutes&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;when&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/&amp;#39;&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;template&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;resolve&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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&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:#a6e22e&#34;&gt;uiModules&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;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;app/simple-sample-kibana-plugin&amp;#39;&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;controller&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;simpleSampleKibanaPluginHelloWorld&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;$scope&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;$route&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;$interval&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;$scope&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;title&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Simple Sample Kibana Plugin&amp;#39;&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;$scope&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;description&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Sample plugin for explaining how to make kibana app&amp;#39;&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:#a6e22e&#34;&gt;$scope&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;$watch&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;$destroy&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;unsubscribe&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;h4 id=&#34;serverroutesexamplejs&#34;&gt;server/routes/example.js&lt;/h4&gt;
&lt;p&gt;&lt;a href=&#34;https://hapijs.com&#34;&gt;hapi.js&lt;/a&gt;というNode.jsのためのサーバーフレームワークです。
このフレームワークをKibanaは使っており、Kibanaのサーバーとブラウザとのやり取りに使用するREST APIを記述するために使用しています。
例えば、Elasticsearchとのやり取りを実際に行うAPIなどをこのREST API内部で記述します。&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:#66d9ef&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;default&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;server&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:#a6e22e&#34;&gt;server&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;route&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;path&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/api/simple-sample-kibana-plugin/example&amp;#39;&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;method&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;GET&amp;#39;&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;handler&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;req&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;reply&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;reply&lt;/span&gt;({ &lt;span style=&#34;color:#a6e22e&#34;&gt;time&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Date()).&lt;span style=&#34;color:#a6e22e&#34;&gt;toISOString&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&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;path&lt;/code&gt;の部分がブラウザ側からアクセスするURLになります。
実際にElasticsearchとやり取りする処理の書き方については、次回の記事で説明します。&lt;/p&gt;
&lt;h2 id=&#34;アーキテクチャ簡易版&#34;&gt;アーキテクチャ（簡易版）&lt;/h2&gt;
&lt;p&gt;ざっくりですが、ファイルやディレクトリについて説明しました。
簡単なデータのやり取りについての流れを説明します。&lt;/p&gt;
&lt;p&gt;Kibana自体はNode.jsで実装されサーバーとして動作していますが、ブラウザでアクセスすることで画面を描画しています。
簡単なコンポーネントを並べるとデータのやり取りはこのような形です。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20180420/architecture.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20180420/architecture.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;すごく簡易で大雑把な絵ですが。。。&lt;/p&gt;
&lt;p&gt;実際のプラグインとしては大きく、2つの処理があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ブラウザ上の処理
&lt;ul&gt;
&lt;li&gt;クリックなどのイベント処理&lt;/li&gt;
&lt;li&gt;HTMLなどのレンダリング処理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Kibanaサーバー上の処理(Elasticsearchなどとの通信が必要な場合)
&lt;ul&gt;
&lt;li&gt;外部との通信処理&lt;/li&gt;
&lt;li&gt;ブラウザ上では重い処理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;絵に記載しましたが、ブラウザ上の処理についてはAngularJSが主なフレームワークで、サーバー上の処理についてはhapi.jsがフレームワークとなっています。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、今回はディレクトリ構造とファイルの説明、どういったフレームワークが使われ、データのやり取りがどのように行われているか説明しました。&lt;/p&gt;
&lt;p&gt;次回からは、実際に私が作成した&lt;a href=&#34;https://github.com/johtani/analyze-api-ui-plugin&#34;&gt;Analyze UI&lt;/a&gt;を元にElasticsearchとのデータのやり取りなどについて紹介していきます。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>カンファレンス情報の探し方（CfP、スポンサー応募、開催期間など）？</title>
      <link>https://blog.johtani.info/blog/2018/03/24/how-to-find-conferences/</link>
      <pubDate>Sat, 24 Mar 2018 13:50:12 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2018/03/24/how-to-find-conferences/</guid>
      <description>&lt;p&gt;#MANABIYA のブースでセッション時間の合間はお客さん少ないので、ブログを書いてみたり。
ここ数年、スポンサーとして色々なカンファレンスに参加してるんですが、それについてちょっと気なることがあったので。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;#MANABIYA のブースでセッション時間の合間はお客さん少ないので、ブログを書いてみたり。
ここ数年、スポンサーとして色々なカンファレンスに参加してるんですが、それについてちょっと気なることがあったので。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;スポンサー情報ってどうやって探してます&#34;&gt;スポンサー情報ってどうやって探してます？&lt;/h2&gt;
&lt;p&gt;職業柄、カンファレンスにCfP出してセッションしてみたり（落ちること多いけど）、スポンサーとしてブースを出したりしています。&lt;/p&gt;
&lt;p&gt;で、疑問があるんですが、みなさんどうやってカンファレンスの情報をゲットしてます？&lt;/p&gt;
&lt;p&gt;数年やって来て、検索したりして見つけてスポンサーした結果、
これまでスポンサーしていたので、情報が流れてくるという感じになりました。
それ以外だと、@yusuke さんに教えてもらったりと言うのがあったんですが。。。&lt;/p&gt;
&lt;p&gt;自分が知らない、自分のTwitterで流れてこないという情報をどうやったら集められるかな？と言うのが今の課題になってます。
と言うことで、ブログを書いてみました。&lt;/p&gt;
&lt;h2 id=&#34;カンファレンスを検索できるサイトとか便利&#34;&gt;カンファレンスを検索できるサイトとか便利？&lt;/h2&gt;
&lt;p&gt;で、私の会社は検索エンジンの会社なんで、検索できると便利では？と考えるんです。&lt;/p&gt;
&lt;p&gt;CfPの応募期間で絞り込みできたり、場所で検索できたり、スポンサー情報を取得する方法が載ってたりすると便利なのではないかなと。
便利に思うのが自分だけでは？と言うのがあるんですが。。。&lt;/p&gt;
&lt;p&gt;あると嬉しい人、データを掲載したいなと言う人いますでしょうか？
Google Formなどで入力してもらえるようにして何か作るのもありかなぁと考えているところです。
それとも、スポンサーを募っているカンファレンスのスタッフや企業の人は、こういう情報は特定の人にだけ知ってもらったりしたいでしょうか？&lt;/p&gt;
&lt;p&gt;自分だけではわからないことが多いので、懸念事項や、それダメでしょ？
あると便利！などのフィードバックをいただけると助かります。&lt;/p&gt;
&lt;p&gt;それ以外に、カンファレンス自体の場所、開催日程、サイトへのURLなどが検索できると便利だったりするかも？というのもあります。&lt;/p&gt;
&lt;p&gt;とりあえず、自分が知ってるものだけ、個人的に検索できるようにしたりするのがいいかなぁ。。。
コメントお待ちしてます！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第1章の05から06までやってみた（言語処理100本ノック）</title>
      <link>https://blog.johtani.info/blog/2018/03/20/nlp100-ch01-05to06/</link>
      <pubDate>Tue, 20 Mar 2018 21:34:45 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2018/03/20/nlp100-ch01-05to06/</guid>
      <description>&lt;p&gt;Rustで言語処理100本ノックの続きで、05と06です。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h3 id=&#34;05-n-gram&#34;&gt;05. n-gram&lt;/h3&gt;
&lt;p&gt;問題は&lt;a href=&#34;http://www.cl.ecei.tohoku.ac.jp/nlp100/#sec05&#34;&gt;こちら&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;みんな大好きn-gramです。単語と文字があるので、それぞれ別関数として実装しました。問題はbi-gramと&lt;code&gt;n=2&lt;/code&gt;だったのですが、一応、&lt;code&gt;n&lt;/code&gt;を引数に取る形にして実装しました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Rustで言語処理100本ノックの続きで、05と06です。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h3 id=&#34;05-n-gram&#34;&gt;05. n-gram&lt;/h3&gt;
&lt;p&gt;問題は&lt;a href=&#34;http://www.cl.ecei.tohoku.ac.jp/nlp100/#sec05&#34;&gt;こちら&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;みんな大好きn-gramです。単語と文字があるので、それぞれ別関数として実装しました。問題はbi-gramと&lt;code&gt;n=2&lt;/code&gt;だったのですが、一応、&lt;code&gt;n&lt;/code&gt;を引数に取る形にして実装しました。&lt;/p&gt;
&lt;p&gt;まずは、単語です。&lt;/p&gt;
&lt;script src=&#34;http://gist-it.appspot.com/https://github.com/johtani/nlp100-rust/blob/5439f96e8521bffe34689c23aa076eb3a2fe817b/src/chapter01/answer.rs?slice=128:139&#34;&gt;&lt;/script&gt;
&lt;p&gt;前に実装した時は、自分で頑張って、先頭から数えたりしてたんですが、Rustには&lt;a href=&#34;https://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/std/primitive.slice.html#method.windows&#34;&gt;windows(n)&lt;/a&gt;という便利なメソッドがsliceにあり、これを利用したらこんな簡単になりました。
sliceは特定のシーケンス（配列）に対してある特定のサイズのViewを作ってくれます（説明あってる？）。
ということで、文字列から、単語の配列（スペース区切りで単語にしている）を作り出して、&lt;code&gt;windows(n)&lt;/code&gt;メソッドを通すと、
&lt;code&gt;n&lt;/code&gt;で指定した数字の個数だけの単語の配列を先頭から、1単語ずつずらして作ってくれます。まさに、n-gram!
戻り値は配列の配列です。
1点だけ疑問点があるのは、「空白で区切ったものが単語」という考え方で良いかどうか？という点です。特に問題文にはそれが明示されていなかったので、このような前提を置いてあります。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;invalid_n(text, n)&lt;/code&gt;は&lt;code&gt;n&lt;/code&gt;の値や入力された文字列をチェックする関数です。入力チェックですね。&lt;code&gt;n&lt;/code&gt;が1よりも小さい場合、入力文字列が空文字の場合は、warningでメッセージを出して、空の配列を返す仕組みになっています。&lt;/p&gt;
&lt;script src=&#34;http://gist-it.appspot.com/https://github.com/johtani/nlp100-rust/blob/5439f96e8521bffe34689c23aa076eb3a2fe817b/src/chapter01/answer.rs?slice=115:126&#34;&gt;&lt;/script&gt;
&lt;p&gt;次は、文字です。&lt;/p&gt;
&lt;script src=&#34;http://gist-it.appspot.com/https://github.com/johtani/nlp100-rust/blob/5439f96e8521bffe34689c23aa076eb3a2fe817b/src/chapter01/answer.rs?slice=128:139&#34;&gt;&lt;/script&gt;
&lt;p&gt;単語とほぼ一緒ですが、入力文字列を、1文字ずつの配列にしているところが異なります。
また、&lt;code&gt;windows&lt;/code&gt;メソッドで取り出された、1文字ずつの&lt;code&gt;n&lt;/code&gt;個の配列を文字列に修正してから、結果の配列に入れています。
ここでも疑問は空白をどう扱うか？になります。
現時点では、空白も1文字とカウントして扱うことにしてあります。
どっちがいいのかなぁ？&lt;/p&gt;
&lt;h3 id=&#34;06-集合&#34;&gt;06. 集合&lt;/h3&gt;
&lt;p&gt;問題は&lt;a href=&#34;http://www.cl.ecei.tohoku.ac.jp/nlp100/#sec06&#34;&gt;こちら&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;まずは、文字n-gramで出てきた文字列をSetに入れる関数から。&lt;/p&gt;
&lt;script src=&#34;http://gist-it.appspot.com/https://github.com/johtani/nlp100-rust/blob/5439f96e8521bffe34689c23aa076eb3a2fe817b/src/chapter01/answer.rs?slice=159:174&#34;&gt;&lt;/script&gt;
&lt;p&gt;n-gramの問題で実装した文字n-gramの関数の戻り値を配列ではなく、BTreeSetに変えたものになります。比較などがしやすいように？と思い、BTreeSetを利用していますが、実装としてはHashSetでも問題ないかと。
この関数の集合（Set）を元に、和集合、積集合、差集合を求める関数を実装しました。&lt;/p&gt;
&lt;script src=&#34;http://gist-it.appspot.com/https://github.com/johtani/nlp100-rust/blob/5439f96e8521bffe34689c23aa076eb3a2fe817b/src/chapter01/answer.rs?slice=176:187&#34;&gt;&lt;/script&gt;
&lt;p&gt;Setのメソッドとして、それぞれ、&lt;code&gt;union&lt;/code&gt;＝和集合、&lt;code&gt;intersection&lt;/code&gt;＝積集合、&lt;code&gt;difference&lt;/code&gt;＝差集合のメソッドが用意されているので、特に困ることはなかったです。
差集合については、1-2と2-1で結果が異なるはずなので、それぞれをテストケース、main.rsで出力するようにしてあります。&lt;/p&gt;
&lt;h3 id=&#34;所感&#34;&gt;所感&lt;/h3&gt;
&lt;p&gt;今回は、Rustがすでに実装してくれているメソッドがあったので楽ができました。
やりたいことに相当するメソッドがあるかどうかを調べるためにリファレンスを探さないといけないのがちょっと苦労しましたが。。。
ということで、今日はこの辺りまで。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第1章の03から04までやってみた（言語処理100本ノック）</title>
      <link>https://blog.johtani.info/blog/2018/02/19/nlp100-ch01-03to04/</link>
      <pubDate>Mon, 19 Feb 2018 18:34:08 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2018/02/19/nlp100-ch01-03to04/</guid>
      <description>&lt;p&gt;Rustで言語処理100本ノックの続きで、03と04です。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h3 id=&#34;03-円周率&#34;&gt;03. 円周率&lt;/h3&gt;
&lt;p&gt;問題は&lt;a href=&#34;http://www.cl.ecei.tohoku.ac.jp/nlp100/#sec03&#34;&gt;こちら&lt;/a&gt;。&lt;/p&gt;
&lt;script src=&#34;http://gist-it.appspot.com/http://github.com/johtani/nlp100-rust/blob/8ca508cc16fbc7a11ac04bbc43687dfec4f25483/src/chapter01/answer/mod.rs?slice=60:71&#34;&gt;&lt;/script&gt;
&lt;p&gt;入力文字列を&lt;code&gt;.split_whitespace()&lt;/code&gt;で分割しておいて、単語ごとのベクタを作り出し、そこに対して文字を数えました。「アルファベットの」という注意書きがあるので&amp;quot;,&amp;ldquo;や&amp;rdquo;.&amp;ldquo;は含めずに数えるのかなということで、
charの&lt;code&gt;.is_alphabetic()&lt;/code&gt;で&lt;code&gt;A-z&lt;/code&gt;までの判定をしつつ、文字のベクタを作ってから、そのベクタの長さを詰め込むという感じでやりました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Rustで言語処理100本ノックの続きで、03と04です。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h3 id=&#34;03-円周率&#34;&gt;03. 円周率&lt;/h3&gt;
&lt;p&gt;問題は&lt;a href=&#34;http://www.cl.ecei.tohoku.ac.jp/nlp100/#sec03&#34;&gt;こちら&lt;/a&gt;。&lt;/p&gt;
&lt;script src=&#34;http://gist-it.appspot.com/http://github.com/johtani/nlp100-rust/blob/8ca508cc16fbc7a11ac04bbc43687dfec4f25483/src/chapter01/answer/mod.rs?slice=60:71&#34;&gt;&lt;/script&gt;
&lt;p&gt;入力文字列を&lt;code&gt;.split_whitespace()&lt;/code&gt;で分割しておいて、単語ごとのベクタを作り出し、そこに対して文字を数えました。「アルファベットの」という注意書きがあるので&amp;quot;,&amp;ldquo;や&amp;rdquo;.&amp;ldquo;は含めずに数えるのかなということで、
charの&lt;code&gt;.is_alphabetic()&lt;/code&gt;で&lt;code&gt;A-z&lt;/code&gt;までの判定をしつつ、文字のベクタを作ってから、そのベクタの長さを詰め込むという感じでやりました。&lt;/p&gt;
&lt;p&gt;これ、ひょっとして、collectでベクタにしなくても、i32とかの変数でカウントするとベクタ作らなくてもいいなじゃにか？というのに書きながら気づいた。。。
必要じゃないオブジェクトを作ってるよなぁ。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.filter().map&lt;/code&gt;とかかな？この辺りの操作がイマイチ苦手。Javaでもまだ馴染めてないところなんだよなぁ。頭固すぎ。&lt;/p&gt;
&lt;h3 id=&#34;04-元素記号&#34;&gt;04. 元素記号&lt;/h3&gt;
&lt;p&gt;問題は&lt;a href=&#34;http://www.cl.ecei.tohoku.ac.jp/nlp100/#sec04&#34;&gt;こちら&lt;/a&gt;。&lt;/p&gt;
&lt;script src=&#34;http://gist-it.appspot.com/http://github.com/johtani/nlp100-rust/blob/8ca508cc16fbc7a11ac04bbc43687dfec4f25483/src/chapter01/answer/mod.rs?slice=73:112&#34;&gt;&lt;/script&gt;
&lt;p&gt;大作ですね。何だろう、大作。。。
「最終的に連想配列（辞書型もしくはマップ型）」ということだったので、BTreeMapに詰め込んでます。
HashMapでもいいんですが、文字列で出力した時にキーが並んで見やすいからという理由で、BTreeMap使いました。それ以上の理由はないです。普通にやるなら、HashMapかな？&lt;/p&gt;
&lt;p&gt;入力として、1文字だけの出力をする場所（インデックス番号）の配列を受け取ってます。1点だけ、チェックしていない、けど入力値の想定をしていて、&lt;code&gt;idx_one_symbols&lt;/code&gt;がソートされていて、小さいものから順番に出てくるものとしてます。関数作って、チェックすべきかな？&lt;/p&gt;
&lt;p&gt;で、指定された場所の最後のものが入力文字列よりも大きいかどうかというチェックもしています。（あー、テストケース書いてないな）この辺りのせいでちょっと長めになってます。&lt;/p&gt;
&lt;p&gt;単語の配列を作るのは03の時と同じやり方です。
回しかたがちょっと違って、&lt;code&gt;.iter().enumerate()&lt;/code&gt;で回して、添字と値をタプル？でとりだしてます。添字を見ながら1文字取り出すのか、2文字取り出すのかの判断が必要だからです。あとは一緒ですね。1文字取り出すときは、&lt;code&gt;.first()&lt;/code&gt;を使って見ました。
実は、2文字取り出す時と、1文字の時と同じロジック使った方が共通化できて、短くなった？？？&lt;/p&gt;
&lt;p&gt;ということで、こんな感じでした。いつものようにツッコミお待ちしてます。&lt;/p&gt;
&lt;h3 id=&#34;所感&#34;&gt;所感&lt;/h3&gt;
&lt;p&gt;問題それぞれについてではなく、
やってて思ったのですが、問題に対して想定される結果が記載されていると嬉しいなと思いました。
ロジックについては、各自実装者に寄ったり、言語によって違いが出たりするし、議論するベースになっていいかなと思うんですが、
問題で想定されている結果（出力）があると、自分の実装にケアが足りないところがないのか？とか、ケアしなくていい点とかがわかるのかもなぁと。
ユニットテスト相当のものがあると楽かなぁと。&lt;/p&gt;
&lt;p&gt;このケースどうするんだろ？みたいなのが、ところどころコメントに残ったりしてます。
出題の意図としては、その部分も議論の対象ということなのかな？&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第1章の00から02までやってみた（言語処理100本ノック）</title>
      <link>https://blog.johtani.info/blog/2018/02/15/nlp100-ch01-00to02/</link>
      <pubDate>Thu, 15 Feb 2018 21:59:01 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2018/02/15/nlp100-ch01-00to02/</guid>
      <description>&lt;p&gt;「鉄は熱いうちに打て」ということで、言語処理100本ノックの第1章の00から02を実装してみました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;さて、これが効率がいいのかどうかはさておき。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;「鉄は熱いうちに打て」ということで、言語処理100本ノックの第1章の00から02を実装してみました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;さて、これが効率がいいのかどうかはさておき。&lt;/p&gt;
&lt;h3 id=&#34;00-文字列の逆順&#34;&gt;00. 文字列の逆順&lt;/h3&gt;
&lt;p&gt;問題は&lt;a href=&#34;http://www.cl.ecei.tohoku.ac.jp/nlp100/#sec00&#34;&gt;こちら&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;最初、&lt;a href=&#34;https://github.com/johtani/nlp100-rust/blob/48567d107511541d0401af4ef58c6abb98a6083b/src/chapter01/answer.rs&#34;&gt;Vecのreverse()で逆順にして0からlen()まで回してた&lt;/a&gt;んですが、pop()がいい感じに後ろから取れることがわかったんで、切り替えました。
シンプルかな？&lt;/p&gt;
&lt;script src=&#34;http://gist-it.appspot.com/http://github.com/johtani/nlp100-rust/blob/ccbdf272adbb5aa738dc73e78e3667e4300a49c1/src/chapter01/answer.rs?slice=2:12&#34;&gt;&lt;/script&gt;
&lt;h3 id=&#34;01-パタトクカシーー&#34;&gt;01. 「パタトクカシーー」&lt;/h3&gt;
&lt;p&gt;問題は&lt;a href=&#34;http://www.cl.ecei.tohoku.ac.jp/nlp100/#sec01&#34;&gt;こちら&lt;/a&gt;。&lt;/p&gt;
&lt;script src=&#34;http://gist-it.appspot.com/http://github.com/johtani/nlp100-rust/blob/ccbdf272adbb5aa738dc73e78e3667e4300a49c1/src/chapter01/answer.rs?slice=14:24&#34;&gt;&lt;/script&gt;
&lt;p&gt;1文字ずつ取り出して、インデックスの番号が2で割ってあまりが0なら文字列に追加していくってのでやってみました。
（ブログ書いてるところで、&lt;code&gt;i in 0..char_array.len()&lt;/code&gt;じゃなくて、&lt;code&gt;(i, x) in char_array.iter().enumerate()&lt;/code&gt;に切り替えました。）
matchとか使って綺麗に書けたりするのかなぁ？&lt;/p&gt;
&lt;h3 id=&#34;02-パトカータクシーパタトクカシーー&#34;&gt;02. 「パトカー」＋「タクシー」＝「パタトクカシーー」&lt;/h3&gt;
&lt;p&gt;問題は&lt;a href=&#34;http://www.cl.ecei.tohoku.ac.jp/nlp100/#sec02&#34;&gt;こちら&lt;/a&gt;。&lt;/p&gt;
&lt;script src=&#34;http://gist-it.appspot.com/http://github.com/johtani/nlp100-rust/blob/ccbdf272adbb5aa738dc73e78e3667e4300a49c1/src/chapter01/answer.rs?slice=26:56&#34;&gt;&lt;/script&gt;
&lt;p&gt;だいぶ思考錯誤してる感じがソースに現れてます。
とりあえず、両方の文字列をcharsの配列にして個々のイテレータを回しながら、next()の戻り値があれば追加していく感じにして、
終了条件が両方Noneを通ったらにしてるけど、、、
なんか、もっと綺麗にできないのかなぁ。。。
next()のタプル返す関数作って、とかでなんかできたりするかなぁ？&lt;/p&gt;
&lt;h3 id=&#34;gist-it&#34;&gt;gist-it&lt;/h3&gt;
&lt;p&gt;関係ないですが、GitHubのコードを貼り付けるのに便利なサービスがあるみたいです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://gist-it.appspot.com&#34;&gt;http://gist-it.appspot.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;これほんと便利だな。行数指定もできるし。
説明するのが簡単だ。&lt;/p&gt;
&lt;p&gt;とりあえず、今日はこの辺まで。なんか、いい知恵あれば教えてください！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>言語処理100本ノックはじめました(Rust)</title>
      <link>https://blog.johtani.info/blog/2018/02/14/start-nlp100-with-rust/</link>
      <pubDate>Wed, 14 Feb 2018 19:52:31 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2018/02/14/start-nlp100-with-rust/</guid>
      <description>&lt;p&gt;ども。新しいもの始めないと頭が退化する。。。ということで、こちら（
&lt;a href=&#34;http://blog.katsyoshi.org/blog/2018/01/16/happy-new-year-and-new-language/&#34;&gt;happy new year and new language - katsyoshiのめもみたいなもの&lt;/a&gt;）のブログに触発されて、言語処理100本ノックをはじめてみました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ども。新しいもの始めないと頭が退化する。。。ということで、こちら（
&lt;a href=&#34;http://blog.katsyoshi.org/blog/2018/01/16/happy-new-year-and-new-language/&#34;&gt;happy new year and new language - katsyoshiのめもみたいなもの&lt;/a&gt;）のブログに触発されて、言語処理100本ノックをはじめてみました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;&lt;a href=&#34;http://www.cl.ecei.tohoku.ac.jp/nlp100/#ch1&#34;&gt;言語処理100本ノック&lt;/a&gt;とは、自然言語処理になるのかな、東北大学の研究室の先生が公開している言語処理に関する実践的な課題をベースにプログラミングなどのスキルを学んでいくための問題集です。
元々はPythonを対象とされているようですが、Rustでやってみようかと。
まぁ、先ほどあげたブログの二番煎じです。。。
ちなみに、インスパイアされた元のブログの方はRust book 2nd editionを読み終えたらしいですが、私はかじった程度です（ダメかも？）。&lt;/p&gt;
&lt;p&gt;NLPもRustもかじった程度なので、苦戦しそうですが、ちょっとずつやっていこうかなと。
ということで、準備運動の第1章から始めようかと。
GitHubにちょっとずつあげていく予定です。
&lt;a href=&#34;https://github.com/johtani/nlp100-rust&#34;&gt;https://github.com/johtani/nlp100-rust&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;まぁ、まずは宣言のブログを書いてみただけです。
続いてなかったら、叱咤激励してください。叱咤だけかも？&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Analyze UIとKibanaのプラグインの作成方法（第2回）</title>
      <link>https://blog.johtani.info/blog/2018/02/09/getting-started-template-kibana-plugin/</link>
      <pubDate>Fri, 09 Feb 2018 18:17:37 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2018/02/09/getting-started-template-kibana-plugin/</guid>
      <description>&lt;p&gt;第1回では、&lt;a href=&#34;https://github.com/johtani/analyze-api-ui-plugin&#34;&gt;Analyze UIというプラグイン&lt;/a&gt;の紹介をしました、ごく簡単にですが。&lt;/p&gt;
&lt;p&gt;第2回では、Kibanaのプラグインの作成方法を順を追って見ていこうと思います。今回は、プラグインのプロジェクトの作り方を説明します。
どんなファイルがあるのかなどについては第3回で説明します（2018/02月現在の方法になります。残念ながら、Kibanaのプラグイン作成自体はまだExperimentalな話になっていますので、変更がある可能性があります）。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;第1回では、&lt;a href=&#34;https://github.com/johtani/analyze-api-ui-plugin&#34;&gt;Analyze UIというプラグイン&lt;/a&gt;の紹介をしました、ごく簡単にですが。&lt;/p&gt;
&lt;p&gt;第2回では、Kibanaのプラグインの作成方法を順を追って見ていこうと思います。今回は、プラグインのプロジェクトの作り方を説明します。
どんなファイルがあるのかなどについては第3回で説明します（2018/02月現在の方法になります。残念ながら、Kibanaのプラグイン作成自体はまだExperimentalな話になっていますので、変更がある可能性があります）。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;実はそれほど難しいというわけではありません。Kibanaのプラグインを作成するためのテンプレートが用意されています。&lt;a href=&#34;https://github.com/elastic/template-kibana-plugin/&#34;&gt;template-kiban-plugin&lt;/a&gt;です。
テンプレートのリポジトリのREADMEに作業手順の記載があります。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;KibanaのリポジトリをClone、Checkout&lt;/li&gt;
&lt;li&gt;Node.jsの環境を用意する&lt;/li&gt;
&lt;li&gt;Kibanaを起動できるようにする&lt;/li&gt;
&lt;li&gt;SAOのインストール&lt;/li&gt;
&lt;li&gt;テンプレートによるプロジェクトファイルの生成&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;順を追って説明します。
&lt;code&gt;PLUGIN_DEV_DIR&lt;/code&gt;というディレクトリ配下で作業をしている想定になります。&lt;/p&gt;
&lt;h2 id=&#34;1-kibanaのリポジトリをclonecheckout&#34;&gt;1. KibanaのリポジトリをClone、Checkout&lt;/h2&gt;
&lt;p&gt;開発環境として、Kibanaが必要です。Kibanaのプラグインを作るので。
手順などは&lt;a href=&#34;https://github.com/elastic/kibana/blob/6.2/CONTRIBUTING.md#contributing-code&#34;&gt;KibanaのCONTRIBUTING.md&lt;/a&gt;に記載があります。
ということで、まずはKibanaのリポジトリをCloneします。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cd PLUGIN_DEV_DIR
git clone git@github.com:elastic/kibana.git
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;このままだと、masterブランチなので、開発したい対象のKibanaのバージョンのブランチもしくはタグをcloneします。今回は6.2.1向けということで、次のようになります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git checkout v6.2.1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これで、ソースが6.2.1向けになりました。&lt;/p&gt;
&lt;h2 id=&#34;2-nodejsの環境を用意する&#34;&gt;2. Node.jsの環境を用意する&lt;/h2&gt;
&lt;p&gt;Node.jsをインストールします。
Kibanaのリポジトリに&lt;code&gt;.node-version&lt;/code&gt;というファイルがあります。
こちらにNode.jsのバージョンが記載されています。
Kibanaが使用しているNode.jsを利用できるようにします。ローカルでは&lt;a href=&#34;https://github.com/creationix/nvm#installation&#34;&gt;nvm&lt;/a&gt;利用してインストールしました。後から、切り替えが可能だからです。
nvm自体のインストールについては&lt;a href=&#34;https://github.com/creationix/nvm&#34;&gt;nvmのサイト&lt;/a&gt;をご覧ください。
nvmがインストールできたら、次のコマンドで、Kibanaが使用しているバージョンをインストールします。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cd kibana
nvm install &amp;#34;$(cat .node-version)&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;すでにnvmを利用している場合などは、Kibana起動時にKibanaのバージョンに合わせたNode.jsに切り替えるようにしてください。&lt;/p&gt;
&lt;h2 id=&#34;3-kibanaを起動できるようにする&#34;&gt;3. Kibanaを起動できるようにする&lt;/h2&gt;
&lt;p&gt;Kibanaでは&lt;a href=&#34;https://yarnpkg.com/lang/en/&#34;&gt;yarn&lt;/a&gt;というjavascript向けのパッケージマネージャーを利用して起動やビルドなどを行います。まずはyarnをインストールします。&lt;a href=&#34;https://github.com/elastic/kibana/pull/15485&#34;&gt;最近npmからyarnに切り替えた&lt;/a&gt;ようです。
私はMacだったので、&lt;a href=&#34;https://yarnpkg.com/en/docs/install&#34;&gt;brewでインストール&lt;/a&gt;しました。
インストールできたら、次のコマンドを実行します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;yarn
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これにより、package.jsonから必要なライブラリなどをダウンロードして来てくれます。
問題なければ「✨  Done in 439.30s.」というような表示がされます（結構時間かかりますね）。
では、Kibanaを起動できるか確認してみましょう。
さらに、Elasticsearchも起動してみます。
Kibanaのpackage.jsonの中にはElasticsearchを起動するためのスクリプトも用意されています。実際には&lt;a href=&#34;https://gruntjs.com&#34;&gt;grunt&lt;/a&gt;を利用してタスクを実行しているようです。Elasticsearchの起動にはJavaが必要になります。
今回は6.2.1なので、JDK 8以降がインストールされている必要があります。
こちらはインストールされているものとします。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;yarn elasticsearch
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;で起動できます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;gt;&amp;gt; Started 1 Elasticsearch nodes.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;という表示が出てればOKです。
次にKibanaです。別のTerminalを起動して、以下のコマンドで起動できます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;yarn start
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これだけです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;server    log   [06:58:56.930] [info][listening] Server running at http://localhost:5603
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;この辺りが出てればKibanaのServerは起動済みです。また、Elasticsearchに接続できていれば、次のログが出ているはずです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;server    log   [07:02:18.010] [info][status][plugin:elasticsearch@6.2.1] Status changed from red to green - Ready
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Elasticsearch接続用のKibanaのプラグインの状態になります。
これで、Kibanaの環境が整ったことが確認できました。
もちろん、Elasticsearchに関しては、yarnで起動せずに、tar.gzなどでダウンロードして来たElasticsearchを起動しておき、アクセスするといったことも可能です。プラグインなどをElasticsearchにもいれてテストしたい場合などはそちらの方が便利かもしれません。&lt;/p&gt;
&lt;h2 id=&#34;4-saoのインストール&#34;&gt;4. SAOのインストール&lt;/h2&gt;
&lt;p&gt;では、一度、ElasticsearchとKibanaを停止しましょう。フォワグラウンドで起動しているので、それぞれのTerminalでCtrl+Cで停止できます。
Kibanaのプラグイン作成むけに、テンプレートが作られています。&lt;a href=&#34;https://sao.js.org&#34;&gt;sao.js&lt;/a&gt;というGitHubのリポジトリやnpmのパッケージをテンプレートとして使うことができるツールを利用してプラグインのプロジェクト（リポジトリ）を作成します。
実際にテンプレートとなるリポジトリは&lt;a href=&#34;https://github.com/elastic/template-kibana-plugin&#34;&gt;template-kibana-plugin&lt;/a&gt;になります。
まずはSaoのインストールです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;npm install -g sao
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;プラグインのテンプレートのページには上記のようにnpmを利用したインストール方法になっていますが、次のようにyarnでも可能です。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;yarn global add sao
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これで、saoがインストールできました。&lt;/p&gt;
&lt;h2 id=&#34;5-テンプレートによるプロジェクトファイルの生成&#34;&gt;5. テンプレートによるプロジェクトファイルの生成&lt;/h2&gt;
&lt;p&gt;あとは、テンプレートを元にプロジェクトを作成します。
&lt;code&gt;PLUGIN_DEV_DIR&lt;/code&gt;ディレクトリ配下に、kibanaと同じ階層で作成するプラグイン用のディレクトリを作成します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mkdir simple-sample-kibana-plugin
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;以下のような構成になります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;kibana                      simple-sample-kibana-plugin
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;次にテンプレートを適用していきます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cd simple-sample-kibana-plugin
sao kibana-plugin@7.2.4
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;2行目がsaoを利用してプロジェクトを作成しているコマンドになります。
すると、次のような質問が出て来ます。
これらに答えるとプロジェクトに必要なファイル（package.jsonやREADME.mdなど）に入力した情報を適用したものを作ってくれます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;? Name of your plugin?
? Provide a short description
? What Kibana version are you targeting?
? Should an app component be generated?
? Should translation files be generated?
? Should an hack component be generated?
? Should a server API be generated?
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;実際に答えた内容はこちら。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;? Name of your plugin? simple-sample-kibana-plugin
? Provide a short description Sample plugin for explaining how to make kibana app
? What Kibana version are you targeting? 6.2.1
? Should an app component be generated? Yes
? Should translation files be generated? Yes
? Should an hack component be generated? Yes
? Should a server API be generated? Yes
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;プラグインの名前などは、ディレクトリ名と同じものを入力補完してくれているので、そのままEnterでもOKです。
Descriptionについてはわかりやすいものを入力しましょう。
バージョンは、先ほどのKibanaのリポジトリに合わせて、&lt;code&gt;6.2.1&lt;/code&gt;にしてあります。
あとは、作るプラグインの種類に応じて、必要なコンポーネントを作るかどうかの質問にYes/Noで答えます。
今回はサンプルの説明ということもあるので、全てYesで答えました。
ちなみに、私が実際に作成した&lt;a href=&#34;https://github.com/johtani/analyze-api-ui-plugin/&#34;&gt;analyze-api-ui-plugin&lt;/a&gt;では、&lt;code&gt;app&lt;/code&gt;と&lt;code&gt;translation&lt;/code&gt;と&lt;code&gt;server&lt;/code&gt;の3つを作成しました。
ただし、&lt;code&gt;translation&lt;/code&gt;については現在はテンプレートで作成したままのファイルが入っており、実際には利用してないです。&lt;/p&gt;
&lt;p&gt;完了したら、プラグインのサンプル入りのプロジェクトが完成です。
もう一度、Elasticsearchを立ち上げて、プラグインのプロジェクトからKibanaを起動してアクセスしてみます。まずは、&lt;code&gt;PLUGIN_DEV_DIR/kibana&lt;/code&gt;ディレクトリの下で、Elasticsearchを起動します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;yarn elasticsearch
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;次に、&lt;code&gt;PLUGIN_DEV_DIR/simple-sample-kibana-plugin&lt;/code&gt;ディレクトリの下で、以下のコマンドを実行し、プラグインが入った状態のKibanaを起動します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;yarn start
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;問題なく起動すれば、ブラウザでアクセスすると次のような画面が表示されるはずです。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:800&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20180214/sample_start.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20180214/sample_start.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;左側にメニューが1つ増えています。
クリックすると、上記画像のような画面が表示されるはずです。&lt;/p&gt;
&lt;p&gt;これで、カスタムプラグインの開発ができる環境ができました！
次回は、プロジェクトのディレクトリ構成や、どんなツールが内部で使用されてデータのやり取りが行われているかについて説明します。お楽しみに。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>What&#39;s new in Elastic Stack 6.1?</title>
      <link>https://blog.johtani.info/presentation/2018/whats-new-in-elastic-stack-6-dot-1/</link>
      <pubDate>Tue, 30 Jan 2018 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2018/whats-new-in-elastic-stack-6-dot-1/</guid>
      <description>&lt;p&gt;LINE Dev Meetupで発表した資料になります。
&lt;a href=&#34;https://line.connpass.com/event/76226/&#34;&gt;https://line.connpass.com/event/76226/&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;LINE Dev Meetupで発表した資料になります。
&lt;a href=&#34;https://line.connpass.com/event/76226/&#34;&gt;https://line.connpass.com/event/76226/&lt;/a&gt;&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Analyze UIとKibanaのプラグインの作成方法（第1回）</title>
      <link>https://blog.johtani.info/blog/2018/01/19/how-to-make-kibana-plugin-example-analysis-ui/</link>
      <pubDate>Fri, 19 Jan 2018 15:36:46 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2018/01/19/how-to-make-kibana-plugin-example-analysis-ui/</guid>
      <description>&lt;p&gt;あけましておめでとうございます。今年はサボりがちだったブログをちょっとずつ復活させようかと。
ということで、第1弾として、昨年少し作っていたKibanaのプラグインを何度かに分けて紹介したいと思います。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;あけましておめでとうございます。今年はサボりがちだったブログをちょっとずつ復活させようかと。
ということで、第1弾として、昨年少し作っていたKibanaのプラグインを何度かに分けて紹介したいと思います。&lt;/p&gt;
&lt;p&gt;今回は&lt;a href=&#34;https://github.com/johtani/analyze-api-ui-plugin&#34;&gt;Analyze UIというプラグイン&lt;/a&gt;の紹介です。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;今回はインストール方法と簡単な機能紹介です。
細かな紹介は個別にやりたいと思います。&lt;/p&gt;
&lt;h3 id=&#34;analyze-ui-pluginとは&#34;&gt;Analyze UI pluginとは？&lt;/h3&gt;
&lt;p&gt;Elasticsearchの&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-analyze.html&#34;&gt;&lt;code&gt;_analyze&lt;/code&gt;というAPI&lt;/a&gt;(個人的に好きなAPIです)をご存知でしょうか？&lt;/p&gt;
&lt;p&gt;Elasticsearchは全文検索エンジンで、データの検索には&lt;a href=&#34;https://ja.wikipedia.org/wiki/%E8%BB%A2%E7%BD%AE%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9&#34;&gt;転置インデックス&lt;/a&gt;というものを使用します。
Elasticsearchにデータを登録する際に、&lt;code&gt;text&lt;/code&gt;型のデータの場合、この転置インデックスのキーとなる単語を決める処理のことを&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis.html&#34;&gt;Analysis&lt;/a&gt;と呼びます（Analysisの詳細については割愛します。後日説明するかも？）。
このAnalysisの処理が、入力されたデータの文字列に対してどのように行われて、結果としてどんな単語がキーとして用いられているかを確認できる機能が&lt;code&gt;_analyze&lt;/code&gt; APIです。検索で単語がうまくヒットしないな？とか、なんで、こんなので検索結果に出てくるんだ？といった場合、このAPIを利用すると、どのような単語で転置インデックスが作られているかがわかるので、検索にヒットしない/する理由を見つけることができます。&lt;/p&gt;
&lt;p&gt;Elasticsearchの便利な点はRESTfulなAPI＋JSONでやりとりができる点なのですが、&lt;code&gt;_analyze&lt;/code&gt; APIの結果をJSONで受け取っても、見るのにちょっと苦労します。。。こんな感じ。&lt;/p&gt;
&lt;p&gt;リクエスト：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;POST _analyze
{
  &amp;#34;analyzer&amp;#34;: &amp;#34;kuromoji&amp;#34;,
  &amp;#34;text&amp;#34;: &amp;#34;今年はブログをいっぱい書きますよ！&amp;#34;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;レスポンス：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{
  &amp;#34;tokens&amp;#34;: [
    {
      &amp;#34;token&amp;#34;: &amp;#34;今年&amp;#34;,
      &amp;#34;start_offset&amp;#34;: 0,
      &amp;#34;end_offset&amp;#34;: 2,
      &amp;#34;type&amp;#34;: &amp;#34;word&amp;#34;,
      &amp;#34;position&amp;#34;: 0
    },
    {
      &amp;#34;token&amp;#34;: &amp;#34;ブログ&amp;#34;,
      &amp;#34;start_offset&amp;#34;: 3,
      &amp;#34;end_offset&amp;#34;: 6,
      &amp;#34;type&amp;#34;: &amp;#34;word&amp;#34;,
      &amp;#34;position&amp;#34;: 2
    },
    {
      &amp;#34;token&amp;#34;: &amp;#34;いっぱい&amp;#34;,
      &amp;#34;start_offset&amp;#34;: 7,
      &amp;#34;end_offset&amp;#34;: 11,
      &amp;#34;type&amp;#34;: &amp;#34;word&amp;#34;,
      &amp;#34;position&amp;#34;: 4
    },
    {
      &amp;#34;token&amp;#34;: &amp;#34;書く&amp;#34;,
      &amp;#34;start_offset&amp;#34;: 11,
      &amp;#34;end_offset&amp;#34;: 13,
      &amp;#34;type&amp;#34;: &amp;#34;word&amp;#34;,
      &amp;#34;position&amp;#34;: 5
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;このくらいの量であればまだなんとかなりますが、文章が長くなると辛いですよね。&lt;/p&gt;
&lt;p&gt;ということで、GUIがあると便利だろうなぁと。で、作ってみましたというのが今日紹介するKibana用のAnalyze UIプラグインです。
こんな感じで、Kibanaのアプリの一部として動作しブラウザ上で、入力テキストの文字列がどのようにanalyzeされて、単語になるかがわかります。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:800&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20180119/analyze_ui_sample_1.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20180119/analyze_ui_sample_1.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;（先ほどのAPIのサンプルと同じものを画面で入力した結果になります）。&lt;/p&gt;
&lt;h3 id=&#34;インストール方法&#34;&gt;インストール方法&lt;/h3&gt;
&lt;p&gt;現時点の最新版Kibana（6.1.2）に対応しています。
Kibanaのディレクトリで&lt;code&gt;kibana-plugin&lt;/code&gt;コマンドを利用してインストールします。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./bin/kibana-plugin install https://github.com/johtani/analyze-api-ui-plugin/releases/download/6.1.2/analyze-api-ui-plugin-6.1.2.zip
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これだけです。
で、Kibanaを起動していただくと、左のメニューに「Analyze UI」という項目が増えています。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:400&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20180119/kibana_menu.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20180119/kibana_menu.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;クリックすると、Analyze UIが表示されます。&lt;/p&gt;
&lt;p&gt;初期画面は入力された文字を特定のAnalyzerで処理した場合の結果を見るための画面です。綱目の説明は画像をご覧ください。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:800&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20180119/intro_analyze_ui_1.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20180119/intro_analyze_ui_1.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;先ほどのJSONよりは見やすくなったかと思います。
そのほかにもいくつか画面や機能があるのですが、今日はこの辺りで。
「&lt;code&gt;_analyze&lt;/code&gt; API便利なんだけど、JSONは。。。」とか「検索うまくできないなぁなんでだろう？」と思っている方は、ぜひ試して見ていただければと。
問題点などありましたら、GitHubのIssueを登録してください。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>今年の振り返りと来年の抱負（2017）</title>
      <link>https://blog.johtani.info/blog/2017/12/31/looking-back-2017/</link>
      <pubDate>Sun, 31 Dec 2017 21:30:43 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2017/12/31/looking-back-2017/</guid>
      <description>&lt;p&gt;今年は紅白を見ながら書いてます。
今年はいろんなところに出張に行ったなぁ。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;振り返り2016年に書いた抱負から&#34;&gt;振り返り（2016年に書いた抱負から）&lt;/h2&gt;
&lt;p&gt;まずは去年の抱負を元に。&lt;/p&gt;
&lt;h5 id=&#34;もちろん英語の継続&#34;&gt;もちろん英語の継続&lt;/h5&gt;
&lt;p&gt;もちろん継続してます。英会話しながら海外TVドラマや映画を見てます。
ちょっとずつ英語字幕でも見ようとしてますが、まだまだだなぁ。
あと、TOEICを受けてないんで、それは受けないと。
見たドラマはこの辺です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今年は紅白を見ながら書いてます。
今年はいろんなところに出張に行ったなぁ。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;振り返り2016年に書いた抱負から&#34;&gt;振り返り（2016年に書いた抱負から）&lt;/h2&gt;
&lt;p&gt;まずは去年の抱負を元に。&lt;/p&gt;
&lt;h5 id=&#34;もちろん英語の継続&#34;&gt;もちろん英語の継続&lt;/h5&gt;
&lt;p&gt;もちろん継続してます。英会話しながら海外TVドラマや映画を見てます。
ちょっとずつ英語字幕でも見ようとしてますが、まだまだだなぁ。
あと、TOEICを受けてないんで、それは受けないと。
見たドラマはこの辺です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ER&lt;/li&gt;
&lt;li&gt;ウォーキング・デッド&lt;/li&gt;
&lt;li&gt;Agent of Shield&lt;/li&gt;
&lt;li&gt;SUITS&lt;/li&gt;
&lt;li&gt;Mr.Robot(いまいち話の展開についていけなかった)&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;継続的にイベントに登壇&#34;&gt;継続的にイベントに登壇&lt;/h5&gt;
&lt;p&gt;OSCに今年もブース出してセッション持ってました。
勉強会ももちろんやりました。
あと、外部のカンファレンス（FOSS4G、BigData Analytics、db tech showcaseなど）や
勉強会(monitoring勉強会やCA.ioなど)にも登壇させていただきました。
もっと外部から読んでいただいたり、CfPに応募して通過できるようにしないとなぁ。&lt;/p&gt;
&lt;h5 id=&#34;もっと開発ブログ&#34;&gt;もっと開発＆ブログ&lt;/h5&gt;
&lt;p&gt;ブログはすみません。。。来年頑張ります。。。
ブログの代わりに&lt;a href=&#34;https://www.amazon.co.jp/dp/477419218X?tag=johtani-22&amp;amp;camp=243&amp;amp;creative=1615&amp;amp;linkCode=as1&amp;amp;creativeASIN=477419218X&amp;amp;adid=1MB8R50WWEJ3JC8VXN60&amp;amp;&#34;&gt;書籍&lt;/a&gt;を出せました。データ分析基盤系の書籍になるので、興味のある方はのぞいて見ていただければ。&lt;/p&gt;
&lt;p&gt;開発はちょっとやってます。今年後半はKibanaのプラグインとかをちょっと書いてました。
Ingest-CSVもちょこちょこバージョンアップに追従してたりします。&lt;/p&gt;
&lt;h5 id=&#34;サポートエンジニア獲得&#34;&gt;サポートエンジニア獲得！&lt;/h5&gt;
&lt;p&gt;獲得しました！（自分の成果かどうかはわかりませんが。。。）
今は3名体制でサポートしてもらってます。おかげさまでだいぶサポートする機会が減ってきました。
開発は&lt;a href=&#34;https://www.elastic.co/about/careers&#34;&gt;世界各地どこでも募集中&lt;/a&gt;だったりしますので、ぜひ連絡いただければと。&lt;/p&gt;
&lt;h5 id=&#34;個人的な検索勉強会の再開&#34;&gt;個人的な検索勉強会の再開&lt;/h5&gt;
&lt;p&gt;再開しました。&lt;a href=&#34;http://amzn.to/2CmYcw9&#34;&gt;検索エンジン自作入門&lt;/a&gt;を知人と隔週くらいで読んでます。読んでるだけではあれなんで、実装もしてたり。全然違う言語でトライして見ようと思ったのでRustで書き始めてます。まずは、単純なところからと思ったんですが、
Rustの書き方の違いにだいぶ戸惑ってます。。。&lt;/p&gt;
&lt;h2 id=&#34;振り返り今年あったできごと&#34;&gt;振り返り(今年あったできごと)&lt;/h2&gt;
&lt;p&gt;ここからは今年の出来事を。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;初アメリカで釣り&lt;/li&gt;
&lt;li&gt;Nintendo Switch!&lt;/li&gt;
&lt;li&gt;初Japanチームオフサイト&lt;/li&gt;
&lt;li&gt;チーム変更&lt;/li&gt;
&lt;li&gt;初Berlin Buzzword!&lt;/li&gt;
&lt;li&gt;母校（大学）訪問&lt;/li&gt;
&lt;li&gt;Kibanaプラグイン開発&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今年も初モノがちらほらとありますね。
今年もカレンダー振り返ってたら「え？これ今年だったの？」ってのがちらほらありました。。。&lt;/p&gt;
&lt;p&gt;アメリカで釣りやりました。自社のカンファレンスElastic{ON}のあとに、エンジニアが集まるミーティングがあるんですが、そこで1日Fun Dayがあって、そこで釣りをやりました。
魚群探知機とかで魚探すんですね、最近のは。2、3匹釣ったので非常に楽しかったです。
来年はスノーシューにチャレンジする予定。&lt;/p&gt;
&lt;p&gt;Nintendo Switch買って、ゼルダやりました。今はイカやってます。
イカ欲はちょっと減ってるかもなぁ、1に比べると。
あとは、子供に買ったマリオやったりしてるかな。&lt;/p&gt;
&lt;p&gt;ここ10年くらい行きたいと思っていたカンファレンス、&lt;a href=&#34;https://berlinbuzzwords.de&#34;&gt;Berlin Buzzword&lt;/a&gt;に行ってきました！
これが今年一番嬉しかった出来事です。Luceneコミッターの方々にも会えたし。特にPoliceman JenkinsのUweさんに会えたのが本当に感激でした。。。
来年も行けるといいなぁ。。。&lt;/p&gt;
&lt;p&gt;今年も出張が多めだったのであちこち飛び回ってたなぁ。
そんな飛び回っている中で、故郷である広島（出身地？）に出張で行ったので、母校に顔を出してきました。
変わってなかった。。。自分が一期生なので、自分が入学した時はまだクレーンとか立ってるような新校舎だったんだけど、それが20年くらい経て、だいぶ古くなってました。。。
広島市内は港近くに高速道路とか出ててだいぶ様変わりしてました。
ただ、小学校も高校も変わってなかったなぁ。久々に高校の同級生にも会えたし。
また、機会があればぜひ行きたいなと。帰省する場所ではなくなったので、行く機会がないんですよね。。。&lt;/p&gt;
&lt;p&gt;開発もちょっとやってます。Kibanaのプラグインに挑戦して見てます。
いまだにJavaScriptは苦手なんですが。。。
ちょっとずつ改良して、ひょっとすると本体とかに取り込めるかな？
あとは、今年始めたRustをちょっとずつ継続して行きたいなと。&lt;/p&gt;
&lt;h2 id=&#34;来年の抱負&#34;&gt;来年の抱負&lt;/h2&gt;
&lt;p&gt;最後は来年の抱負を。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;もっと英語の継続＆TOEIC&lt;/li&gt;
&lt;li&gt;継続的にイベントに登壇&lt;/li&gt;
&lt;li&gt;CfPもっと出すぞ！&lt;/li&gt;
&lt;li&gt;もっとブログ！&lt;/li&gt;
&lt;li&gt;雑誌やWeb系雑誌で記事を。&lt;/li&gt;
&lt;li&gt;コミュニティを別の方法で盛り上げ&lt;/li&gt;
&lt;li&gt;Elasticsearchなど検索系の開発にも参加&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;英語はもちろんですね。今年は12月の自社イベントに合わせて多くのAPJチームの人が来て、
チームで会話できたし、もっと英語やらないとなぁと。前よりもちょっとは喋れるようになった気がしてます（気がしてるだけで、喋れてるかどうかは不明）。あとは、TOEIC受けて、実力チェックしてみないとなぁ。&lt;/p&gt;
&lt;p&gt;イベント登壇はまぁ、DevRelですから、一応。
来年もとりあえず、3月までは毎月どこかでブース出してます。
Ask Me Anything的なブースの出し方を今年はしてみようかなと思ってるので、
ちょっと使い始めたけど、この辺よくわからないと思ってる方、ぜひ質問しに来てください。
ブース出すだけじゃなくて、スピーカーとしていろんな場所で喋れるようにしないとなぁと。
もっと幅広く知ってもらえるように雑誌とかで連載できるようにしたいなぁと思ってます。
また、日本語の入り口の情報を増やすためにブログも書かないとなぁ。&lt;/p&gt;
&lt;p&gt;勉強会も継続しますが、別の方法でも盛り上げて行きたいなぁと。
勉強会はどうしても聞く人が多くて、ユーザーの間での交流や情報交換とまでは行ってない気がするし、&lt;a href=&#34;http://discuss.elastic.co&#34;&gt;discuss.elastic.co&lt;/a&gt;というフォーラムで質問は増えて来てるけど、もう少し交流しやすい場があると使ってもらえるかなぁ？と思っていたり。
何かおすすめとかあれば、連絡ください。
meetup.comの勉強会のページにも掲示板はついてるんだけど交流しにくそうだし。&lt;/p&gt;
&lt;p&gt;来年は自分が最も興味のある検索系の開発にも参加したいなぁと。
Elasticsearchをちょっとずつ時間見つけてやってたりはしますが、もう少し首を突っ込んで行きたいなぁと。&lt;a href=&#34;http://blog.johtani.info/blog/2017/11/10/welcome-swiftype/&#34;&gt;Swiftype&lt;/a&gt;もジョインしたし。もっと検索やって行きたい気持ちが強いので。&lt;/p&gt;
&lt;p&gt;さて、ということで、今年もあと1時間なくなりました。
今年も様々な面で色々な方々に助けていただけました。本当にお世話になりました。
この場を借りてお礼申し上げます。&lt;/p&gt;
&lt;p&gt;来年ももちろん、色々な方に助けてもらうと思いますが、よろしくお願いいたします！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>2018年のElasticは？</title>
      <link>https://blog.johtani.info/blog/2017/12/24/elastic-2018/</link>
      <pubDate>Sun, 24 Dec 2017 23:10:16 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2017/12/24/elastic-2018/</guid>
      <description>&lt;p&gt;Merry Christmas!
&lt;a href=&#34;https://qiita.com/advent-calendar/2017/elasticsearch&#34;&gt;Elastic Stack Advent Calendar 2017&lt;/a&gt;の24日目の記事になります。&lt;/p&gt;
&lt;p&gt;ちょっとですが、2018年のElasticについて書いてみようかと思います。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;イベント&#34;&gt;イベント&lt;/h2&gt;
&lt;p&gt;いくつか出展が決まっているイベントがあるのでまずは宣伝を。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Merry Christmas!
&lt;a href=&#34;https://qiita.com/advent-calendar/2017/elasticsearch&#34;&gt;Elastic Stack Advent Calendar 2017&lt;/a&gt;の24日目の記事になります。&lt;/p&gt;
&lt;p&gt;ちょっとですが、2018年のElasticについて書いてみようかと思います。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;イベント&#34;&gt;イベント&lt;/h2&gt;
&lt;p&gt;いくつか出展が決まっているイベントがあるのでまずは宣伝を。&lt;/p&gt;
&lt;h4 id=&#34;osc-osaka-2018&#34;&gt;OSC Osaka 2018&lt;/h4&gt;
&lt;p&gt;まずは、1月25日、26日に&lt;a href=&#34;https://www.ospn.jp/osc2018-osaka/&#34;&gt;OSC Osaka 2018&lt;/a&gt;に出展し、話をします。参加者がいそうであれば、25日や26日の夜に勉強会もありかなぁと思っています。
セッションでは入門的な話をする予定です。ブースにいますので、色々質問がある関西の方はぜひご参加ください。&lt;/p&gt;
&lt;h4 id=&#34;developer-summit-2018&#34;&gt;Developer Summit 2018&lt;/h4&gt;
&lt;p&gt;2月15日、16日は&lt;a href=&#34;http://event.shoeisha.jp/devsumi/20180215&#34;&gt;Developer Summit 2018&lt;/a&gt;に出展します。
こちらでもブースにいますので、AMA（Ask Me Anything）的に使っていただくのもいいかなと。
デブサミに参加される方はぜひお立ち寄りください。&lt;/p&gt;
&lt;h4 id=&#34;manabiya&#34;&gt;Manabiya&lt;/h4&gt;
&lt;p&gt;3月23日、24日は&lt;a href=&#34;https://manabiya.tech&#34;&gt;Manabiya&lt;/a&gt;に出展します。
こちらでもAMAのつもりでブースを出す予定です。質問がある方はぜひお立ち寄りください。
こちらのイベントは初めての開催になるようなので、どんなイベントになるか楽しみにしています。&lt;/p&gt;
&lt;p&gt;イベント回りはこの辺りで。
また、1月末に勉強会を予定しています。決まり次第また&lt;a href=&#34;https://www.meetup.com/ja-JP/Tokyo-Elastic-Fantastics/&#34;&gt;Meetup.com&lt;/a&gt;の方々にメールを出す予定です。&lt;/p&gt;
&lt;h2 id=&#34;elastic-stackの2018年は&#34;&gt;Elastic Stackの2018年は？&lt;/h2&gt;
&lt;h4 id=&#34;canvas&#34;&gt;Canvas!&lt;/h4&gt;
&lt;p&gt;昨年のElastic{ON}でみなさんをCanvasがリリースされるかなぁと。
現在、みなさんにテストしてもらえるように&lt;a href=&#34;http://canvas.elastic.co&#34;&gt;canvas.elastic.co&lt;/a&gt;というサイトを公開中で、実際にインストールして試すことができるようになっています。
ぜひ、触って、全く新しいUIを体験して見てください。&lt;/p&gt;
&lt;h4 id=&#34;sql&#34;&gt;SQL?&lt;/h4&gt;
&lt;p&gt;こちらも昨年のElastic{ON}でみなさんから反響があったものです。
もう直ぐでてくるのではないかなぁと。&lt;/p&gt;
&lt;h4 id=&#34;その他は&#34;&gt;その他は？&lt;/h4&gt;
&lt;p&gt;いくつか面白そうで、取り込み済みのものをピックアップしておきます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/27478&#34;&gt;Add ranking evaluation API&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;検索クエリなどに対して検索結果のランクのクオリティを評価するためのAPIの追加（7.0予定）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;JDK9サポート？
&lt;ul&gt;
&lt;li&gt;6.2でサポートされそうです。が、&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/6.x/setup.html#jvm-version&#34;&gt;LTSのJDK8が推奨のままの予定&lt;/a&gt;です。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;High-level REST ClientでいくつかAPIが追加
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/27574&#34;&gt;https://github.com/elastic/elasticsearch/pull/27574&lt;/a&gt;、https://github.com/elastic/elasticsearch/pull/27351&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;APM正式リリース？
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/jp/solutions/apm&#34;&gt;ベータ版&lt;/a&gt;がリリースされているので、秒読み段階？&lt;/li&gt;
&lt;/ul&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/elasticon/conf/2018/sf&#34;&gt;Elastic{ON} 2018&lt;/a&gt;に参加するのが一番です！（ステマ）
私も参加予定ですので、ぜひ、現地でお会いし、色々な情報をゲットしましょう。&lt;/p&gt;
&lt;p&gt;明日で、今年のAdvent Calendarも最後です。micci184さんの記事を楽しみにしましょう！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>2017年のElastic StackとElastic</title>
      <link>https://blog.johtani.info/blog/2017/12/01/whats-happen-at-elastic-in-2017/</link>
      <pubDate>Fri, 01 Dec 2017 00:00:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2017/12/01/whats-happen-at-elastic-in-2017/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://qiita.com/advent-calendar/2017/elasticsearch&#34;&gt;Elastic stack (Elasticsearch) Advent Calendar 2017&lt;/a&gt;の1日目の記事になります。&lt;/p&gt;
&lt;p&gt;まだ、1ヶ月を残していますが、簡単に今年起こったことを振り返ってみようかと思います。思った以上に色々ありましたね。。。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://qiita.com/advent-calendar/2017/elasticsearch&#34;&gt;Elastic stack (Elasticsearch) Advent Calendar 2017&lt;/a&gt;の1日目の記事になります。&lt;/p&gt;
&lt;p&gt;まだ、1ヶ月を残していますが、簡単に今年起こったことを振り返ってみようかと思います。思った以上に色々ありましたね。。。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h3 id=&#34;elastic-stack-520リリース-1月&#34;&gt;Elastic Stack 5.2.0リリース (1月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/elastic-stack-5-2-0-released&#34;&gt;リリース記事はこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;HeatmapがKibanaで追加されたり、Heartbeatがベータですが追加されました。
個人的には、Terms aggregationの&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/5.2/search-aggregations-bucket-terms-aggregation.html#_filtering_values_with_partitions&#34;&gt;Filtering Valuesによるパーティション&lt;/a&gt;が便利になったと思います。Terms Aggsでページングに似たことができるようになりました。&lt;/p&gt;
&lt;h3 id=&#34;elasticon17開催-3月&#34;&gt;Elastic{ON}17開催 (3月)&lt;/h3&gt;
&lt;p&gt;第3回目のユーザカンファレンスが開催されました。
バレーダンサーの踊りから始まったキーノート、様々なユーザ企業によるユースケース発表などいろいろありました。
&lt;a href=&#34;https://www.elastic.co/elasticon/conf/2017/sf&#34;&gt;セッションはこちらのサイトから&lt;/a&gt;から録画を見ることができます。
&lt;a href=&#34;https://www.elastic.co/elasticon/conf/2017/sf/elasticsearch-sql&#34;&gt;SQL for Elasticsearch&lt;/a&gt;やAwardが目を引いたと思います。SQL対応まだ出てきていないですが、もうすぐじゃないかと！&lt;/p&gt;
&lt;h3 id=&#34;elastic-stack-530リリース-3月&#34;&gt;Elastic Stack 5.3.0リリース (3月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/blog/elastic-stack-5-3-0-released&#34;&gt;リリース記事はこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-modules-overview.html&#34;&gt;Filebeat module&lt;/a&gt;が導入され、ログファイルを取り込んでKibanaで可視化するまでの手順がより簡単になりました。Elasticの目指しているものの一つに、シンプルな使い方、簡単にはじめられることといったものがあります。KibanaのTimepickerもより便利になったのも、このバージョンからです。&lt;/p&gt;
&lt;h3 id=&#34;shayがceoに-5月&#34;&gt;ShayがCEOに (5月)&lt;/h3&gt;
&lt;p&gt;2月にすでに発表されていましたが、Elasticsearchの生みの親のShay BanonがCEOに正式に就任しました。CEOになってさらに、精力的に様々なことをやっていて、本当にすごいなと思います。&lt;/p&gt;
&lt;h3 id=&#34;elastic-stack-540600-alpha1リリース-5月&#34;&gt;Elastic Stack 5.4.0、6.0.0-alpha1リリース (5月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/blog/elastic-stack-5-4-0-released&#34;&gt;5.4.0リリース記事はこちら&lt;/a&gt;、&lt;a href=&#34;https://www.elastic.co/blog/elastic-stack-6-0-0-alpha1-released&#34;&gt;6.0.0-alpha1リリース記事はこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;5.4.0は節目になるリリースでした。Machine Learningがベータリリースとして、X-Packに追加されましたし、ElasticsearchではCross Cluster Searchの改善が進みました。LogstashではPersistent QueueがGAになりましたし、KibanaにはTime Series Visual BuilderやEvent Contextなどが追加されますます使いやすくなりました。&lt;/p&gt;
&lt;p&gt;また、6.0.0のalpha版も同時にリリースされ、様々な方からのフィードバックが集まり始めました。&lt;/p&gt;
&lt;h3 id=&#34;elastic-cloud-enterprise-gaリリース-5月&#34;&gt;Elastic Cloud Enterprise GAリリース (5月)&lt;/h3&gt;
&lt;p&gt;Elastic Cloudのバックエンドの技術を製品に採用したものになります。
多くのElasticsearchクラスタを管理しないといけない方には朗報でした。&lt;/p&gt;
&lt;h3 id=&#34;opbeatがjoin-6月&#34;&gt;OpbeatがJoin (6月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/blog/welcome-opbeat-to-the-elastic-family&#34;&gt;Opbeatチームがジョイン&lt;/a&gt;したのが6月です。Elastic StackがAPM(Application Performance Monitoring)でも活躍することになりそうです。APMの仕組みとしては、APM Agentをアプリ側に配置し、APM Serverへデータを送信し、Elasticsearchに保存、Kibanaで可視化するという流れになります。&lt;/p&gt;
&lt;h3 id=&#34;elastic-stack-550リリース-7月&#34;&gt;Elastic Stack 5.5.0リリース (7月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/blog/kibana-5-5-0-released&#34;&gt;リリース記事はこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Machime LearningがGAリリースになったのが5.5.0です。色々な方から質問を受けました。それ以外にも、ElasticsearchのWindows MSI InstallerやKibanaのFilter editorなどが追加されました。Filter editorはこれまで検索条件を記述するのが難しいと感じていたKibanaユーザにとても喜んでもらえたものじゃないかなと。
GrokDebuggerが導入されたのもこのタイミングです。&lt;/p&gt;
&lt;h3 id=&#34;elastic-stack-560リリース-9月&#34;&gt;Elastic Stack 5.6.0リリース (9月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/blog/elastic-stack-5-6-0-released&#34;&gt;リリース記事はこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;5系最後のマイナーリリースであり、6へのアップグレードが楽になる様々な仕組みが用意されたのがこのバージョンです。ElasticsearchのJava High level REST clientが導入されたのもこのバージョンです。本当に様々な機能が次のメジャーバージョンとの互換性のために組み込まれています。。。&lt;/p&gt;
&lt;h3 id=&#34;elastic-cloud-on-gcp-9月&#34;&gt;Elastic Cloud on GCP (9月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/blog/announcing-the-ga-of-elastic-cloud-hosted-elasticsearch-on-google-cloud-platform-gcp&#34;&gt;リリース記事はこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;これまで、AWS上のみで展開していたElastic CloudがGCP上でも展開されることになりました。残念ながら、日本リージョンはまだありませんが、問い合わせなどが増えれば今後サポートされる可能性が高くなると思います！&lt;/p&gt;
&lt;h3 id=&#34;elastic-apm-alpha-9月&#34;&gt;Elastic APM alpha (9月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/apm/get-started/current/overview.html&#34;&gt;リリース記事はこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;OpbeatチームによりElastic StackのAPMがAlphaですがリリースされました。APMがOpen Sourceで利用できるんです！Agentがもっと増えてくると色々なことに使えるようになると思います。ぜひAgentを作成してみてください！&lt;/p&gt;
&lt;h3 id=&#34;elastic-stack-600リリース-11月&#34;&gt;Elastic Stack 6.0.0リリース (11月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/blog/elastic-stack-6-0-0-released&#34;&gt;リリース記事はこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;待ちに待った6.0.0のリリースです。&lt;a href=&#34;https://events.elastic.co/6-0-elastic-stack-jp&#34;&gt;新機能については本日(12/1)の昼に行われるウェビナーをご覧ください！&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;swiftypeがjoin-11月&#34;&gt;SwiftypeがJoin (11月)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/about/press/elastic-acquires-saas-site-search-leader-swiftype&#34;&gt;ニュースリリースはこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Swiftypeと呼ばれる検索のSaaSを提供している会社がジョインしました。
個人的には今年一番嬉しいニュースです。やはり、検索が好きなので。
簡単に&lt;a href=&#34;http://blog.johtani.info/blog/2017/11/10/welcome-swiftype/&#34;&gt;Site Searchを構築できる仕組み&lt;/a&gt;は非常に面白いものです。
興味のある方は、ぜひ触ってみてください。日本語固有の機能などはまだないので、今後関わっていければなーと。&lt;/p&gt;
&lt;h3 id=&#34;elasticon-tour-tokyo開催-12月&#34;&gt;Elastic{ON} Tour Tokyo開催 (12月)&lt;/h3&gt;
&lt;p&gt;まだ開催前ですが、今年も&lt;a href=&#34;https://www.elastic.co/elasticon/tour/2017/tokyo&#34;&gt;東京で1dayイベントを開催&lt;/a&gt;します。
残念ながら、もうSold outなので、キャンセル待ちになってしまっているみたいですが。私もスピーカーとして喋りますし、AMAブースにも立っています。
参加される方はぜひ声をかけていただければと思います。&lt;/p&gt;
&lt;h4 id=&#34;osc-2017enterprise-12月&#34;&gt;OSC 2017.Enterprise (12月)&lt;/h4&gt;
&lt;p&gt;オープンソースカンファレンスで今年も様々な都市に出張しました。
今年の締めくくりということで、&lt;a href=&#34;https://www.ospn.jp/osc2017.enterprise/&#34;&gt;12/8に渋谷で開催されるカンファレンス&lt;/a&gt;に出展します。時間のある方は、ぜひブースに遊びに来てください。入門者向けのセッションもあるので、こちらもお待ちしております。&lt;/p&gt;
&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;
&lt;p&gt;超駆け足ですが、今年を振り返ってみました。
今年もいろんなことがありました。書くのが大変だったw。
OSCなどイベントで声をかけていただいた皆様、ありがとうございました。&lt;/p&gt;
&lt;p&gt;さて、&lt;a href=&#34;https://qiita.com/advent-calendar/2017/elasticsearch&#34;&gt;Elastic Stack Advent Calendar 2017&lt;/a&gt;は始まったばかりです。これからの記事を楽しみにしています！&lt;/p&gt;
&lt;h4 id=&#34;ということで&#34;&gt;ということで、&lt;/h4&gt;
&lt;p&gt;次は&lt;a href=&#34;https://qiita.com/aeroastro&#34;&gt;aeroastroさん&lt;/a&gt;の「Elasticsearchのインデックスを本当の意味で無停止再構築する方法」（&lt;a href=&#34;https://qiita.com/advent-calendar/2017/elasticsearch&#34;&gt;Advent Calendarのページはこちら&lt;/a&gt;）になります、お楽しみに！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>システムメトリクス・ログのリアルタイム解析入門 - Elastic Stackを活用して -</title>
      <link>https://blog.johtani.info/presentation/2017/sisutemumetorikusurogufalseriarutaimujie-xi-ru-men-elastic-stackwohuo-yong-site/</link>
      <pubDate>Sun, 26 Nov 2017 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2017/sisutemumetorikusurogufalseriarutaimujie-xi-ru-men-elastic-stackwohuo-yong-site/</guid>
      <description>&lt;p&gt;OSC広島2017で使用した資料になります。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;OSC広島2017で使用した資料になります。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Swiftypeがジョインしたので触ってみました</title>
      <link>https://blog.johtani.info/blog/2017/11/10/welcome-swiftype/</link>
      <pubDate>Fri, 10 Nov 2017 11:14:49 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2017/11/10/welcome-swiftype/</guid>
      <description>&lt;h1 id=&#34;swiftypeでサイト内検索&#34;&gt;Swiftypeでサイト内検索？&lt;/h1&gt;
&lt;p&gt;プレスリリース：&lt;a href=&#34;https://www.elastic.co/jp/about/press/elastic-acquires-saas-site-search-leader-swiftype&#34;&gt;Elasticがサイト内検索サービス最大手のSwiftypeを買収&lt;/a&gt;が出ましたが、SwiftypeチームがElasticにジョインしました！&lt;/p&gt;
&lt;h2 id=&#34;自分のブログ検索に導入してみる&#34;&gt;自分のブログ検索に導入してみる？&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://swiftype.com/&#34;&gt;Swiftype&lt;/a&gt;はSite Searchをサービスとして提供しています。
実際に指定したサイトのデータをクロールして、インデキシングし、検索できるようになります。
ものは試しということで、自分のブログを登録してみました。検索窓はつけてないですが。
14日間のFree trialがあるのでそちらで試してみましょう。
検索窓はデモとか作れたらかな。&lt;/p&gt;</description>
      <content:encoded>&lt;h1 id=&#34;swiftypeでサイト内検索&#34;&gt;Swiftypeでサイト内検索？&lt;/h1&gt;
&lt;p&gt;プレスリリース：&lt;a href=&#34;https://www.elastic.co/jp/about/press/elastic-acquires-saas-site-search-leader-swiftype&#34;&gt;Elasticがサイト内検索サービス最大手のSwiftypeを買収&lt;/a&gt;が出ましたが、SwiftypeチームがElasticにジョインしました！&lt;/p&gt;
&lt;h2 id=&#34;自分のブログ検索に導入してみる&#34;&gt;自分のブログ検索に導入してみる？&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://swiftype.com/&#34;&gt;Swiftype&lt;/a&gt;はSite Searchをサービスとして提供しています。
実際に指定したサイトのデータをクロールして、インデキシングし、検索できるようになります。
ものは試しということで、自分のブログを登録してみました。検索窓はつけてないですが。
14日間のFree trialがあるのでそちらで試してみましょう。
検索窓はデモとか作れたらかな。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;ということでfree-trialへ&#34;&gt;ということで、Free trialへ&lt;/h2&gt;
&lt;p&gt;まずはユーザ登録です。Googleのアカウントと連携するか、Swiftypeにメルアドを登録するかが選択できます。
登録できたら、次にどちらのプロダクトを使うかという選択画面が出てきます。
今回はサイト検索して見たいので、「Site Search」の「START FREE TRIAL」をクリックします。&lt;/p&gt;
&lt;h2 id=&#34;engineの指定&#34;&gt;Engineの指定&lt;/h2&gt;
&lt;p&gt;Web Crawlerを利用するか、独自にSwiftypeのAPIを利用してデータを登録するかを選択します。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20171110/01_Create_Search_Engine___Swiftype.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20171110/01_Create_Search_Engine___Swiftype.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;今回は、お手軽な方のCrawlerを選択します。
すると次に、クロールしたいURLの指定画面が出てきます。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20171110/02_Create_Crawler-based_Search_Engine___Swiftype.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20171110/02_Create_Crawler-based_Search_Engine___Swiftype.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;今回は自分のブログなので、&amp;lsquo;&lt;a href=&#34;http://blog.johtani.info&#34;&gt;http://blog.johtani.info&lt;/a&gt;&amp;rsquo;を指定します。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20171110/03_Create_Crawler-based_Search_Engine___Swiftype.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20171110/03_Create_Crawler-based_Search_Engine___Swiftype.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;で少し待つと、URLのチェック（存在チェックとか、接続チェックとか）が終わり、今回作成するEngineに名前をつける画面が出てきます。
「My Blog search」という名前にしてみました。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20171110/04_https___app_swiftype_com_engines_my-blog-search_precrawls_166127_settings.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20171110/04_https___app_swiftype_com_engines_my-blog-search_precrawls_166127_settings.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;sitemapがあるかどうかをCrawlerがチェックしています。
私のBlogはOctopressでできていて、sitemap.xmlも作ってくれているので、これを元にCrawlerはクロールをしてくれます。そのほかにも&lt;a href=&#34;https://swiftype.com/documentation/crawler&#34;&gt;RSSやAtomサポートもあるみたいですね&lt;/a&gt;。
「COMPLETE SETUP」を押すと、Engineの管理画面が出てきます。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20171110/05_My_Blog_search_Overview___Swiftype.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20171110/05_My_Blog_search_Overview___Swiftype.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;「CRAWLING」という表示が出ています。クロールしている最中です。これが終われば、「PREVIEW」に代わり、検索できる準備ができたことになります。
実際にPREVIEWして見ると、次のような検索ができるようになります。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20171110/06_My_Blog_search_Overview___Swiftype_PREVIEW.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20171110/06_My_Blog_search_Overview___Swiftype_PREVIEW.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;そのほかにはWeightの調整画面などもありますね。フィールド毎に重み付けを変えて見たりもできます。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20171110/07_Weights___Swiftype.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20171110/07_Weights___Swiftype.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;日本語独自のAnalyzerなどはまだないので、そのあたりができてくるともっと便利になりそうです。
とりあえず、気になる方は触って見てはいかがでしょうか？
個人的は検索に関するサービスが出てきたのですごく楽しみにしています！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch 6.0 is coming  at CA.io</title>
      <link>https://blog.johtani.info/presentation/2017/elasticsearch-6-dot-0-is-coming-at-ca-dot-io/</link>
      <pubDate>Wed, 04 Oct 2017 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2017/elasticsearch-6-dot-0-is-coming-at-ca-dot-io/</guid>
      <description>&lt;p&gt;「マッチングサービスを支えるElasticsearch」で登壇した時の資料になります。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;「マッチングサービスを支えるElasticsearch」で登壇した時の資料になります。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elastic Stackによるログの監視入門</title>
      <link>https://blog.johtani.info/presentation/2017/elastic-stackniyorurogufalsejian-shi-ru-men/</link>
      <pubDate>Tue, 26 Sep 2017 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2017/elastic-stackniyorurogufalsejian-shi-ru-men/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://mackerelio.connpass.com/event/66208/&#34;&gt;https://mackerelio.connpass.com/event/66208/&lt;/a&gt; での発表資料です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://mackerelio.connpass.com/event/66208/&#34;&gt;https://mackerelio.connpass.com/event/66208/&lt;/a&gt; での発表資料です。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>データ分析基盤構築入門 を一部執筆しました。</title>
      <link>https://blog.johtani.info/blog/2017/09/21/release-intro-logging-analysis-system/</link>
      <pubDate>Thu, 21 Sep 2017 10:02:30 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2017/09/21/release-intro-logging-analysis-system/</guid>
      <description>&lt;p&gt;久々に執筆しました。といっても、&lt;a href=&#34;http://blog.johtani.info/blog/2014/08/04/release-magazine-book-of-log-aggs-and-viz/&#34;&gt;以前の書籍&lt;/a&gt;の更新版です。
まぁ、更新版といっても、私以外の方々は結構な量を書き直しor新規書き起こしされてますが。。。&lt;/p&gt;
&lt;p&gt;ということで、みなさん「買って」から感想をいただけるとうれしいです！（以下の画像でAmazonにジャンプできます！Kindle版も発売中です。）&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;久々に執筆しました。といっても、&lt;a href=&#34;http://blog.johtani.info/blog/2014/08/04/release-magazine-book-of-log-aggs-and-viz/&#34;&gt;以前の書籍&lt;/a&gt;の更新版です。
まぁ、更新版といっても、私以外の方々は結構な量を書き直しor新規書き起こしされてますが。。。&lt;/p&gt;
&lt;p&gt;ということで、みなさん「買って」から感想をいただけるとうれしいです！（以下の画像でAmazonにジャンプできます！Kindle版も発売中です。）&lt;/p&gt;
&lt;p&gt;&lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/477419218X/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=477419218X&amp;linkCode=as2&amp;tag=johtani-22&amp;linkId=f7cbe8130343ea340b18b53eba20d4b7&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=JP&amp;ASIN=477419218X&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL250_&amp;tag=johtani-22&#34; &gt;&lt;/a&gt;&lt;img src=&#34;//ir-jp.amazon-adsystem.com/e/ir?t=johtani-22&amp;l=am2&amp;o=9&amp;a=477419218X&#34; width=&#34;1&#34; height=&#34;1&#34; border=&#34;0&#34; alt=&#34;&#34; style=&#34;border:none !important; margin:0px !important;&#34; /&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;今回もElasticsearchの章を担当しました。
5.4ベースで書きましたが、ちょっとずつ6でどう変わるかなども記載してあります。
また、付録ではLogstashやBeatsにもちょっと触れています。
また、自分が一番好きなKibanaの機能であるDev ToolsのConsoleについても記載してあります。こちらも合わせて目を通していただければと。&lt;/p&gt;
&lt;p&gt;みなさんのフィードバック（ツイート、ブログ、Amazonのコメントなどなど）をお待ちしております！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elastic stackにおける 地理情報の利用方法 #foss4gj</title>
      <link>https://blog.johtani.info/presentation/2017/elastic-stackniokeru-di-li-qing-bao-falseli-yong-fang-fa-number-foss4gj/</link>
      <pubDate>Sat, 16 Sep 2017 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2017/elastic-stackniokeru-di-li-qing-bao-falseli-yong-fang-fa-number-foss4gj/</guid>
      <description>&lt;p&gt;FOSS4G Tokyo 2017での発表資料です。
Geo系の紹介になります。&lt;/p&gt;
&lt;p&gt;公式ドキュメントはこちら。https://www.elastic.co/guide
右上の虫眼鏡マークで知りたい機能を検索してください。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;FOSS4G Tokyo 2017での発表資料です。
Geo系の紹介になります。&lt;/p&gt;
&lt;p&gt;公式ドキュメントはこちら。https://www.elastic.co/guide
右上の虫眼鏡マークで知りたい機能を検索してください。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elastic Stack 5.4 と 5.5のアップデート情報</title>
      <link>https://blog.johtani.info/presentation/2017/elastic-stack-5-dot-4-to-5-dot-5falseatupudetoqing-bao/</link>
      <pubDate>Tue, 01 Aug 2017 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2017/elastic-stack-5-dot-4-to-5-dot-5falseatupudetoqing-bao/</guid>
      <description>&lt;p&gt;第20回Elasticsearch勉強会の資料です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;第20回Elasticsearch勉強会の資料です。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elastic Stackでメトリクス＆ログ解析</title>
      <link>https://blog.johtani.info/presentation/2017/elastic-stackdemetorikusu-rogujie-xi/</link>
      <pubDate>Tue, 30 May 2017 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2017/elastic-stackdemetorikusu-rogujie-xi/</guid>
      <description>&lt;p&gt;OSC Nagoya 2017で発表した資料になります。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;OSC Nagoya 2017で発表した資料になります。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>検索座談会ってのをやってみた</title>
      <link>https://blog.johtani.info/blog/2017/05/25/search-meetup/</link>
      <pubDate>Thu, 25 May 2017 00:24:13 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2017/05/25/search-meetup/</guid>
      <description>&lt;p&gt;久々のブログ。
Elasticsearch勉強会を主催してますが、
プロダクトを超えて、検索で共通してある課題とか、悩みとか、あるかなぁと。
その辺りを話す場所を考えてみるのいいかもと思い、検索座談会ってのを5人でやってみた。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;久々のブログ。
Elasticsearch勉強会を主催してますが、
プロダクトを超えて、検索で共通してある課題とか、悩みとか、あるかなぁと。
その辺りを話す場所を考えてみるのいいかもと思い、検索座談会ってのを5人でやってみた。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;とりあえず、初めてなので、5名ほどで。プロダクトはかぶってない感じでした。&lt;/p&gt;
&lt;h3 id=&#34;話した議題はこの辺り&#34;&gt;話した議題はこの辺り。&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;形態素解析の辞書は何を使ってる？有償のもの？
&lt;ul&gt;
&lt;li&gt;そもそも形態素解析？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;辞書の更新とかは？
&lt;ul&gt;
&lt;li&gt;シノニムってどうしてる？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;サジェストとかのデータはどう作ってる？どうしてる？
&lt;ul&gt;
&lt;li&gt;検索ログとかから作ってる？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;検索結果のランキングって検索結果だけで決めるの？
&lt;ul&gt;
&lt;li&gt;検索漏れとかキーワードのミスマッチとかどうしてる？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;今後話したい内容はこの辺かな&#34;&gt;今後話したい内容はこの辺かな？&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;緯度経度系の検索&lt;/li&gt;
&lt;li&gt;画像検索、音声検索&lt;/li&gt;
&lt;li&gt;検索のキーワードの調査とかしてる人とかいるかな？&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;p&gt;もちろん、Elasticsearch勉強会は別でやっていきますよ。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>What&#39;s new Elastic Stack 5.1 &amp; 5.2</title>
      <link>https://blog.johtani.info/presentation/2017/whats-new-elastic-stack-5-dot-1-and-5-dot-2/</link>
      <pubDate>Tue, 21 Feb 2017 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2017/whats-new-elastic-stack-5-dot-1-and-5-dot-2/</guid>
      <description>&lt;p&gt;Elasticsearch Study Session Tokyo slides&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Elasticsearch Study Session Tokyo slides&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elastic Stackを利用して データから様々な気づきを見つける</title>
      <link>https://blog.johtani.info/presentation/2017/elastic-stackwoli-yong-site-detakarayang-naqi-dukiwojian-tukeru/</link>
      <pubDate>Tue, 07 Feb 2017 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2017/elastic-stackwoli-yong-site-detakarayang-naqi-dukiwojian-tukeru/</guid>
      <description>&lt;p&gt;#BigDataTokyo BigData Analytics Tokyoでの発表スライドです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;#BigDataTokyo BigData Analytics Tokyoでの発表スライドです。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elastic stackではじめる ログ解析入門</title>
      <link>https://blog.johtani.info/presentation/2017/elastic-stackdehazimeru-rogujie-xi-ru-men/</link>
      <pubDate>Thu, 02 Feb 2017 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2017/elastic-stackdehazimeru-rogujie-xi-ru-men/</guid>
      <description>&lt;p&gt;OSC Osaka 2017 セッション資料&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;OSC Osaka 2017 セッション資料&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>今年の振り返りと来年の抱負（2016）</title>
      <link>https://blog.johtani.info/blog/2016/12/31/looking-back-2016/</link>
      <pubDate>Sat, 31 Dec 2016 22:22:14 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2016/12/31/looking-back-2016/</guid>
      <description>&lt;p&gt;今年はRioのプレイバック見ながら書いてます。
今年はなんか長い一年だった気が。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;振り返り2015年に書いた抱負から&#34;&gt;振り返り（2015年に書いた抱負から）&lt;/h2&gt;
&lt;p&gt;まずは去年の抱負を元に。&lt;/p&gt;
&lt;h5 id=&#34;英語の継続&#34;&gt;英語の継続&lt;/h5&gt;
&lt;p&gt;継続してます。まぁ当たり前ですが。もう少し話す機会増やさないとだなぁと思いつつ。英会話しながら、海外TVドラマ見ながら。
見たドラマはこの辺かな？&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今年はRioのプレイバック見ながら書いてます。
今年はなんか長い一年だった気が。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;振り返り2015年に書いた抱負から&#34;&gt;振り返り（2015年に書いた抱負から）&lt;/h2&gt;
&lt;p&gt;まずは去年の抱負を元に。&lt;/p&gt;
&lt;h5 id=&#34;英語の継続&#34;&gt;英語の継続&lt;/h5&gt;
&lt;p&gt;継続してます。まぁ当たり前ですが。もう少し話す機会増やさないとだなぁと思いつつ。英会話しながら、海外TVドラマ見ながら。
見たドラマはこの辺かな？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ER&lt;/li&gt;
&lt;li&gt;SUITS&lt;/li&gt;
&lt;li&gt;メンタリスト&lt;/li&gt;
&lt;li&gt;Numb3rs&lt;/li&gt;
&lt;li&gt;エレメンタリー&lt;/li&gt;
&lt;li&gt;Agent of Shield&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;あと、映画も見てます。とりあえず、耳を慣らすために字幕ありで見てるので、
英語だけでとは行きませんが。。。
そろそろ同じ映画を英語字幕で見るとかしたほうがいいのかもなぁ。&lt;/p&gt;
&lt;h5 id=&#34;もっとelasticsearchの開発に参加&#34;&gt;もっとElasticsearchの開発に参加&lt;/h5&gt;
&lt;p&gt;一応参加してます。ちょっとずつですが。
イベントが重なるとできなくなるので、小さなPRとかを細々とって感じですが。。。&lt;/p&gt;
&lt;h5 id=&#34;人員の倍増&#34;&gt;人員の倍増？&lt;/h5&gt;
&lt;p&gt;倍増したかな？現時点で日本は8名になりました。そのうち1人は完全リモートです。
来年も倍増とは行かないだろうなぁ。取り急ぎ、サポートエンジニアが足りてないのでそこを埋めないと。。。&lt;/p&gt;
&lt;h5 id=&#34;日本語情報発信&#34;&gt;日本語情報発信&lt;/h5&gt;
&lt;p&gt;これはちょっと足踏みしてるかも。ブログの翻訳とかはやってるんですが、もう少しなんとかしないとなぁ。ブログも書かないと。。。&lt;/p&gt;
&lt;h5 id=&#34;splatoon-s&#34;&gt;Splatoon S+?&lt;/h5&gt;
&lt;p&gt;なりました！とりあえずS+とSを行ったり来たりしてる感じです。
メインはノヴァネオですが、Sに落ちたら違う武器でS+に上がるまでチャレンジするってのをやってます。わかば、バケスロソーダ、プライム、ワサビくらいはやったかな？
そろそろまた違う武器かなぁ。S+99は無理そうなんで。。。&lt;/p&gt;
&lt;h2 id=&#34;振り返り今年あったできごと&#34;&gt;振り返り(今年あったできごと)&lt;/h2&gt;
&lt;p&gt;その他の今年の出来事。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;初香港&lt;/li&gt;
&lt;li&gt;初プラハ&lt;/li&gt;
&lt;li&gt;OSCなど、東京以外でのカンファレンス参加&lt;/li&gt;
&lt;li&gt;厄年&lt;/li&gt;
&lt;li&gt;東京オフィス！&lt;/li&gt;
&lt;li&gt;BBLとかトレーニング&lt;/li&gt;
&lt;li&gt;lucene-gosenをちょっとメンテ&lt;/li&gt;
&lt;li&gt;Podcastデビュー？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;初モノ今年も多いかな。
今年は、昨年よりは長く感じた一年でした。
月1くらいで出張してたのもあるのかなぁ？
香港、プラハはもちろん会社のイベントです。
香港はジャッキーチェンの映画を彷彿とさせるところがちょくちょくあって面白かったです。
ビルとかの補修の足場が竹竿とか。
プラハも面白かったです。やっぱりヨーロッパの古い町は歴史のある建物が多くて楽しいです。&lt;/p&gt;
&lt;p&gt;OSCなどのイベントも色々行きました。福岡、名古屋、大阪、京都、札幌と回りました。
それとは別に大阪、福岡も行ったかな。
来年は沖縄と広島に行きたいなぁ。。。
出張のついで？じゃないですが、御朱印集めし始めました。神社仏閣もいいですよねぇ。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://blog.johtani.info/blog/2016/06/30/broken-something-in-this-year/&#34;&gt;厄年&lt;/a&gt;はきつかった。。。たまたまだとは思うけど、お祓いに行ったのが効いたのかなぁ。後半は特に問題なかったかな。腕時計無くしたと思ったら見つかったりしたし。&lt;/p&gt;
&lt;p&gt;弊社東京オフィスができました。（あんまり行ってないけど）
ときどきアクロクエストさんがセミナーを開いたりしてます。
昨年のTour Tokyo後のMeetupでもイベントスペースを使って、Drinkup（勉強会の懇親会だけバージョン）もやりました。
今後もちょこちょことイベントをやってみようかな？&lt;/p&gt;
&lt;p&gt;BBLも始めました。あまりきちんと宣伝してないからそれほど依頼は来てないですが。
あとは、今年も2回日本語でトレーニングしました。
前回はほぼ満席にまでなりました。
来年も頑張りたいかな。ショートカットするためにもいいと思うんで、トレーニングを受けて欲しいんです。。。&lt;/p&gt;
&lt;p&gt;lucene-gosenのメンテもしました。
といってもプログラムではなく、ビルドシステムをAntからGradleに変更したんですが。
来年もちょっとずつ触りたいな。機能面で拡充するかはわからないですが。。。&lt;/p&gt;
&lt;p&gt;Podcastにもデビューさせていただきました。
wyukawaさんのPodcastです。「&lt;a href=&#34;http://wyukawa.tumblr.com/post/153257053753/johtani%E3%81%95%E3%82%93%E3%81%A8elasticsearch%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E8%A9%B1%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-guest&#34;&gt;johtaniさんとElasticsearchについて話しました&lt;/a&gt;」楽しかったです。
また出たいなぁというか、喋るの面白かった！&lt;/p&gt;
&lt;h2 id=&#34;来年の抱負&#34;&gt;来年の抱負&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;もちろん英語の継続&lt;/li&gt;
&lt;li&gt;継続的にイベントに登壇&lt;/li&gt;
&lt;li&gt;もっと開発＆ブログ&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;p&gt;来年もいろんなカンファレンスなどに出てブース出したり、セッション持ったりして&lt;/p&gt;
&lt;!-- textlint-disable ja-technical-writing/ja-no-successive-word --&gt;
&lt;p&gt;もっともっと広めていかないとなぁ。&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-successive-word --&gt;
&lt;p&gt;あとは、勉強会とMeetupもやっていかないと。入門編と上級編みたいに分けてみるのもありかなぁと考えて見たり。
スピーカー、ご意見募集しております。&lt;/p&gt;
&lt;p&gt;開発に時間をさくための時間の活用をしていかないとなぁと。
どうも時間の使い方がまだ上手くないので。ブログも一緒ですね。。。
月1くらいのペースではかきたいな。。。
ブログもそうだけど書籍もかな？？？？
あと、外資系の他の会社の人ともまた飲みたいなー。&lt;/p&gt;
&lt;p&gt;開発の時間を確保という面ではサポートエンジニアも募集中です。
最近、クライアントが増えて来てチケットが増えて来てるんで、サポートしたりもしてるんです。。。
自分の時間を増やすためにもサポートエンジニアを確保しないと。誰かいい人いないかなぁ。&lt;/p&gt;
&lt;p&gt;個人的にやってた勉強会を忙しいって言って中断してるので、再開しないと。。。&lt;/p&gt;
&lt;p&gt;ということで、今年もあと數十分になってしまいました。
今年も色々な方に助けていただけました。お世話になりました。
この場を借りてお礼申し上げます。&lt;/p&gt;
&lt;p&gt;来年もいろんな方々に助けてもらうと思いますが、よろしくお願いいたします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>2016年のElastic Stack</title>
      <link>https://blog.johtani.info/blog/2016/12/25/elasticsearch-6-features/</link>
      <pubDate>Sun, 25 Dec 2016 00:03:50 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2016/12/25/elasticsearch-6-features/</guid>
      <description>&lt;p&gt;Merry Christmas!
&lt;a href=&#34;http://qiita.com/advent-calendar/2016/elastic&#34;&gt;Elastic stack Advent Calendar 2016&lt;/a&gt; 最終日の記事になります。&lt;/p&gt;
&lt;p&gt;簡単に今年の変遷を振り返ってみます。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;elasticsearch-22-2月&#34;&gt;Elasticsearch 2.2 (2月)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/elasticsearch-2-2-0-and-2-1-2-and-1-7-5-released&#34;&gt;Elasticsearch 2.2.0、2.1.2、1.7.5リリース&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;クエリプロファイラやGeo系の性能改善などが取り込まれました。
また、同時期にリリースされたKibana 4.4ではColor pickerやShare用のURLの短縮化機能なども追加されました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Merry Christmas!
&lt;a href=&#34;http://qiita.com/advent-calendar/2016/elastic&#34;&gt;Elastic stack Advent Calendar 2016&lt;/a&gt; 最終日の記事になります。&lt;/p&gt;
&lt;p&gt;簡単に今年の変遷を振り返ってみます。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;elasticsearch-22-2月&#34;&gt;Elasticsearch 2.2 (2月)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/elasticsearch-2-2-0-and-2-1-2-and-1-7-5-released&#34;&gt;Elasticsearch 2.2.0、2.1.2、1.7.5リリース&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;クエリプロファイラやGeo系の性能改善などが取り込まれました。
また、同時期にリリースされたKibana 4.4ではColor pickerやShare用のURLの短縮化機能なども追加されました。&lt;/p&gt;
&lt;h2 id=&#34;第2回目のユーザカンファレンスelasticon開催2月&#34;&gt;第2回目のユーザカンファレンス、Elastic{ON}開催（2月）&lt;/h2&gt;
&lt;p&gt;サンフランシスコで、弊社第2回目のカンファレンスが開催されました。
2015年の会場よりも大きくなり、多数の方に参加いただきました。
ここで、以下の発表がありました。&lt;/p&gt;
&lt;h3 id=&#34;elastic-stackとx-packの紹介&#34;&gt;Elastic StackとX-Packの紹介&lt;/h3&gt;
&lt;p&gt;これまで、ELK stackと呼ばれて意味明日が、Beatsチームの参加により、ELKだけではなくなったこともあり、Elastic Stackと呼び名を変える事になりました。
また、Marvel、Shield、Watcherなどの商用の拡張機能についても、
単体の名称ではなく、X（Extension）-Packと1つの名前になる事に。
詳細については&lt;a href=&#34;https://www.elastic.co/jp/blog/heya-elastic-stack-and-x-pack&#34;&gt;公式のブログ&lt;/a&gt;をご覧ください。&lt;/p&gt;
&lt;h3 id=&#34;elastic-cloudとelastic-cloud-enterpriseの発表&#34;&gt;Elastic CloudとElastic Cloud Enterpriseの発表&lt;/h3&gt;
&lt;p&gt;2015年にElasticにジョインし、
これまでFound.no（Found）と呼ばれていた弊社のElasticsearch as a Serviceが&lt;a href=&#34;https://www.elastic.co/jp/blog/introducing-elastic-cloud-and-elastic-cloud-enterprise&#34;&gt;Elastic Cloudと名称変更&lt;/a&gt;しました。
また、Elastic Cloudで培っているノウハウを詰め込んだElastic Cloud Enterpriseも発表しました。実際に利用可能になるまでには
まだもう少しかかってしまいますが、アルファ版が公開されていますので、興味のある方は触ってみてください。&lt;/p&gt;
&lt;p&gt;Elastic{ON}2016で撮影された、&lt;a href=&#34;https://www.elastic.co/blog/life-without-elasticsearch-elasticon16&#34;&gt;「Elasticsearchがないあなたの人生はどうなりますか？」&lt;/a&gt; といった面白い動画も公開されています。&lt;/p&gt;
&lt;h2 id=&#34;elasticsearch-23リリース3月&#34;&gt;Elasticsearch 2.3リリース（3月）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/elasticsearch-2-3-0-and-2-2-2-released&#34;&gt;Elasticsearch 2.3.0および2.2.2をリリース&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Reindex APIが登場し、Mappingの変更やShard数の変更など、色々とデータの更新などがやりやすくなりました。
また、Task Managementの機能も追加され、長時間かかる処理を間違った場合などの対処が楽になりました。
個人的には、Deprecation Loggingの機能が導入されたことが嬉しいこととなります。次期メジャーバージョンで廃止される機能についてログに出力されるようになりました。
実際に運用されているアプリで利用している機能が今後なくなるかどうかをログを見るとわかるという仕組みです。&lt;/p&gt;
&lt;h2 id=&#34;rally登場4月&#34;&gt;Rally登場（4月）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/announcing-rally-benchmarking-for-elasticsearch&#34;&gt;Rally登場：Elasticsearchのベンチマークツール&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Elasticsearchのベンチマークツールがリリースされました。
定期的にElasticsearchの性能を計測することは問題点を見つける事に役に立ちます。そういった手助けをしてくれるツールが公開されることは非常に便利なことかと。&lt;/p&gt;
&lt;h2 id=&#34;elastic-stack-5-alpha1-リリース4月&#34;&gt;Elastic Stack 5 alpha1 リリース（4月）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/elastic-stack-release-5-0-0-alpha-1&#34;&gt;Elastic Stack 5.0.0 alpha 1 リリース&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ingest NodeやLucene 6、新しいKibanaのUIなど多くのものが詰まっていました。ここから多くのユーザにテストしてもらい、5.0の正式リリースを迎えることができました。&lt;/p&gt;
&lt;h2 id=&#34;elasticsearch-240リリース8月&#34;&gt;Elasticsearch 2.4.0リリース（8月）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/release-bonanza-elasticsearch-graph-shield-watcher-marvel-reporting-logstash-2-4-beats-1-3-and-kibana-4-6-are-now-available&#34;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2.xの最後のマイナーバージョンリリースです。
Reportingなどの追加とドットつきフィールド名の復活がありました。&lt;/p&gt;
&lt;h2 id=&#34;elastic-stack-500-beta1-リリース9月&#34;&gt;Elastic Stack 5.0.0 beta1 リリース（9月）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/elastic-stack-release-5-0-0-beta1&#34;&gt;Elastic Stack Release - 5.0.0-beta1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ついにベータです。Painlessがスクリプトのデフォルトになったり、TimelionがKibanaに取り込まれるなど、正式リリースまであと少し！&lt;/p&gt;
&lt;h2 id=&#34;prelertチームジョイン9月&#34;&gt;Prelertチームジョイン（9月）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/welcome-prelert-to-the-elastic-team&#34;&gt;Welcome Prelert to the Elastic Team&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Machine Learningエンジンを開発し、Elasticsearch,Kibanaとの組み合わせの製品をリリースしていたPrelertという会社がジョインしました。
Elasticsearchに保存された多くのデータをより活用していただくことができるかと思います。
Elastic{ON} Tour 2016 Tokyoで弊社SAの大輪の発表も人気があるものでした。まだベータ段階ですが、利用して見ることも可能です。
ビデオなどが公開されたらまたツイートしようと思います。&lt;/p&gt;
&lt;h2 id=&#34;elasticon-tour-tokyo-2016開催12月&#34;&gt;Elastic{ON} Tour Tokyo 2016開催（12月）&lt;/h2&gt;
&lt;p&gt;今年で2回目のTokyoローカルの1日イベントでした。
ブログは「まだ」書いてませんが、、、今回も盛りだくさんのイベントになりました。
早朝のトレーニング（ハンズオンではない）にも80名近くの方に参加していただけましたし、私はKibanaのキーノート＋デモという大役をもらいましたし、ちょっと大変でした。
今年もAMA（Ask Me Anything）ブースが大盛況でした。
色々な方から、弊社のサポート、開発者が色々な質問を受け、それに答えるという形です。楽しんでいただけたかと思います。
来年もぜひ開催したいなと思っています。&lt;/p&gt;
&lt;p&gt;また、&lt;a href=&#34;https://www.elastic.co/blog/first-wave-of-elasticon-17-sessions-revealed&#34;&gt;Elastic{ON}17のセッションも&lt;/a&gt;いくつか発表されています。
ぜひ、サンフランシスコで行われる本場のカンファレンスにもご参加ください！&lt;/p&gt;
&lt;h2 id=&#34;来年は&#34;&gt;来年は？&lt;/h2&gt;
&lt;p&gt;1月後半か2月に&lt;a href=&#34;https://www.meetup.com/ja-JP/Tokyo-Elastic-Fantastics/&#34;&gt;Elasticsearch勉強会&lt;/a&gt;を検討しようと思っています。スピーカーに興味のある方は連絡いただければと。&lt;/p&gt;
&lt;p&gt;会社としては、&lt;a href=&#34;https://www.elastic.co/elasticon/conf/2017/sf&#34;&gt;Elastic{ON}2017&lt;/a&gt;が3月にまた開催されます。これで3回目となります。もちろん私も参加予定なので、参加される方は、現地で会いましょう！&lt;/p&gt;
&lt;p&gt;そのほかにも&lt;a href=&#34;http://www.bigdatacon.jp/ja/&#34;&gt;BIG DATA ANALYTICS TOKYO&lt;/a&gt;やオープンソースカンファレンス（&lt;a href=&#34;http://www.ospn.jp/osc2017-osaka/&#34;&gt;大阪&lt;/a&gt;）、&lt;a href=&#34;http://event.shoeisha.jp/devsumi/20170216/&#34;&gt;デブサミ&lt;/a&gt;といったカンファレンスに参加（登壇・ブースなど）予定です。
参加される方は、ぜひブースまでお越しください。&lt;/p&gt;
&lt;p&gt;では、また来年のAdvent Calendarでお会いしましょう！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch 5.0の便利機能紹介？</title>
      <link>https://blog.johtani.info/blog/2016/12/01/elasticsearch-5-dot-0-highlight/</link>
      <pubDate>Thu, 01 Dec 2016 17:34:30 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2016/12/01/elasticsearch-5-dot-0-highlight/</guid>
      <description>&lt;p&gt;Elastic stack Advent Calendar 1日目の記事になります。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/elasticsearch-5-0-0-released&#34;&gt;Elasticsearch 5.0&lt;/a&gt;が10月末にリリースされました。
リリースのブログでいくつか紹介されているのですが、そこでは紹介されていない機能について2、3紹介しようと思います。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Elastic stack Advent Calendar 1日目の記事になります。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/jp/blog/elasticsearch-5-0-0-released&#34;&gt;Elasticsearch 5.0&lt;/a&gt;が10月末にリリースされました。
リリースのブログでいくつか紹介されているのですが、そこでは紹介されていない機能について2、3紹介しようと思います。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;その前に、5.0、あれ？その前は2.xじゃなかったっけ？？と困惑されている方もいるかと思うので、簡単に5となった経緯の紹介をしようかと。&lt;/p&gt;
&lt;h3 id=&#34;バージョン番号&#34;&gt;バージョン番号&lt;/h3&gt;
&lt;p&gt;なぜ2から5に飛んだのかという話ですが、このスライドがその紹介になっています。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://speakerdeck.com/johtani/elastic-stack-5-dot-0-alpha1-alpha5?slide=5&#34;&gt;https://speakerdeck.com/johtani/elastic-stack-5-dot-0-alpha1-alpha5?slide=5&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/elasticon/conf/2016/sf/opening-keynote&#34;&gt;Elastic{ON} 2016のキーノート&lt;/a&gt;でも紹介がありましたが、KibanaやLogstashとElasticsearchを組み合わせて使うときにバージョンのミスマッチで動かないというユーザの声が上がっていました。
2.xのリリースから、同じ日にKibana、Logstash、Beatsもリリースするようになったのですが、
やはり、バージョン番号が異なるため、ミスマッチで動かないというユーザが時々いました。&lt;/p&gt;
&lt;p&gt;Elastic Stackという名称にもなったため、バージョン番号をそろえようという事になり、
Elasticsearch、Kibana、Logstash、Beats全てが5.0.0としてリリースされ、
今後は同じバージョン番号になります。&lt;/p&gt;
&lt;p&gt;ちなみに、「5」になった理由はKibanaのメジャーバージョンが「4」だったためです。&lt;/p&gt;
&lt;p&gt;さて、では、いくつか機能の紹介を。&lt;/p&gt;
&lt;h3 id=&#34;reindex-from-remote-cluster&#34;&gt;Reindex from remote cluster&lt;/h3&gt;
&lt;p&gt;Reindexが2.3から導入されました。データの再登録ができるようになり、マッピングの変更や
Shardの数の変更などが柔軟に行えるようになりました。
便利でしたが、あくまでも同一のクラスタでデータを登録し直す形でした。&lt;/p&gt;
&lt;p&gt;5.0からはこの機能に加えて、&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-reindex.html#reindex-from-remote&#34;&gt;異なるクラスタからデータを取得してReindex&lt;/a&gt;を行うことができるようになりました。
こんな形になります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;POST _reindex
{
  &amp;#34;source&amp;#34;: {
    &amp;#34;remote&amp;#34;: {
      &amp;#34;host&amp;#34;: &amp;#34;http://otherhost:9200&amp;#34;,
      &amp;#34;username&amp;#34;: &amp;#34;user&amp;#34;,
      &amp;#34;password&amp;#34;: &amp;#34;pass&amp;#34;
    },
    &amp;#34;index&amp;#34;: &amp;#34;source&amp;#34;,
    &amp;#34;query&amp;#34;: {
      &amp;#34;match&amp;#34;: {
        &amp;#34;test&amp;#34;: &amp;#34;data&amp;#34;
      }
    }
  },
  &amp;#34;dest&amp;#34;: {
    &amp;#34;index&amp;#34;: &amp;#34;dest&amp;#34;
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;username&lt;/code&gt;と&lt;code&gt;password&lt;/code&gt;はリモートのクラスタに認証の気候が存在する場合に利用できるオプションです。
また、ReindexのAPIはクエリを使用して、必要なデータだけを取得することが可能です。
この機能により、1.xや2.xのクラスタからデータを移行することが可能になります。&lt;/p&gt;
&lt;h3 id=&#34;custom-analyzer-test-using-analyze-api&#34;&gt;Custom analyzer test using Analyze API&lt;/h3&gt;
&lt;p&gt;もう一つ、ちょっとだけ便利な機能を紹介します。
独自にAnalyzerを定義（TokenizerとToken Filterなどを個別に設定）して、その挙動を確認するとき、2.xまでは、インデックスを作成してそのインデックスに対して&lt;code&gt;_analyze&lt;/code&gt; APIを呼び出す必要がありました。&lt;/p&gt;
&lt;p&gt;5.xからは&lt;code&gt;_analyze&lt;/code&gt; APIの読み出しのパラメータで指定できるようになりました。
こんな感じです。ここでは、&lt;code&gt;lowercase&lt;/code&gt;フィルタのあとに、&lt;code&gt;{...}&lt;/code&gt;で&lt;code&gt;stop&lt;/code&gt;フィルタを
パラメータの中で、指定しています。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curl -XGET &amp;#39;localhost:9200/_analyze&amp;#39; -d &amp;#39;
{
  &amp;#34;tokenizer&amp;#34; : &amp;#34;whitespace&amp;#34;,
  &amp;#34;filter&amp;#34; : [&amp;#34;lowercase&amp;#34;, {&amp;#34;type&amp;#34;: &amp;#34;stop&amp;#34;, &amp;#34;stopwords&amp;#34;: [&amp;#34;a&amp;#34;, &amp;#34;is&amp;#34;, &amp;#34;this&amp;#34;]}],
  &amp;#34;text&amp;#34; : &amp;#34;this is a test&amp;#34;
}&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ちょっとだけですが、Analyzerなどを試すのが楽になるのではないでしょうか？&lt;/p&gt;
&lt;p&gt;ということで、以上が1日目の記事でした。
Logstashなど、他の5.0.0に関する記事もAdvent Calendarに空きがあるようなので、個別にかこうかなと思います。お楽しみに！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elastic stackで始めるログ解析入門</title>
      <link>https://blog.johtani.info/presentation/2016/elastic-stackdeshi-merurogujie-xi-ru-men/</link>
      <pubDate>Sat, 19 Nov 2016 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2016/elastic-stackdeshi-merurogujie-xi-ru-men/</guid>
      <description>&lt;p&gt;2016/11/19のOSC福岡2016で発表した資料です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;2016/11/19のOSC福岡2016で発表した資料です。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elastic Stackの紹介</title>
      <link>https://blog.johtani.info/presentation/2016/elastic-stackfalseshao-jie-1/</link>
      <pubDate>Tue, 15 Nov 2016 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2016/elastic-stackfalseshao-jie-1/</guid>
      <description>&lt;p&gt;ヒカラボさんの大阪イベントで利用したスライドです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ヒカラボさんの大阪イベントで利用したスライドです。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elastic Stack 5.0 alpha1 - alpha5</title>
      <link>https://blog.johtani.info/presentation/2016/elastic-stack-5-dot-0-alpha1-alpha5/</link>
      <pubDate>Fri, 16 Sep 2016 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2016/elastic-stack-5-dot-0-alpha1-alpha5/</guid>
      <description>&lt;p&gt;第17回Elasticsearch勉強会での発表資料&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;第17回Elasticsearch勉強会での発表資料&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elastic Stack 5.0 alpha 1-4</title>
      <link>https://blog.johtani.info/presentation/2016/elastic-stack-5-dot-0-alpha-1-4/</link>
      <pubDate>Fri, 02 Sep 2016 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2016/elastic-stack-5-dot-0-alpha-1-4/</guid>
      <description>&lt;p&gt;Elasticsearch勉強会京都での発表資料。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Elasticsearch勉強会京都での発表資料。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearchの始め方</title>
      <link>https://blog.johtani.info/presentation/2016/elasticsearchfalseshi-mefang/</link>
      <pubDate>Fri, 02 Sep 2016 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2016/elasticsearchfalseshi-mefang/</guid>
      <description>&lt;p&gt;2016/09/02 JJUG ナイトセミナーでの発表資料。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;2016/09/02 JJUG ナイトセミナーでの発表資料。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Lucene Kuromoji for NEologdで指定した品詞の単語を抜き出すIngest Pluginを書いてみた #elasticsearchjp</title>
      <link>https://blog.johtani.info/blog/2016/07/22/making-ingest-processor-plugin-with-cookiecutter/</link>
      <pubDate>Fri, 22 Jul 2016 13:26:56 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2016/07/22/making-ingest-processor-plugin-with-cookiecutter/</guid>
      <description>&lt;p&gt;久しぶりに、技術的なブログ書いてます。&lt;/p&gt;
&lt;p&gt;Ingest Processorのプラグインを作ってみたくなったので、書いてみました。
ただ書いてみるんじゃ3番煎じになりそうなので、&lt;a href=&#34;https://cookiecutter.readthedocs.io/en/latest/readme.html&#34;&gt;cookiecutter&lt;/a&gt;を使ってみました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;久しぶりに、技術的なブログ書いてます。&lt;/p&gt;
&lt;p&gt;Ingest Processorのプラグインを作ってみたくなったので、書いてみました。
ただ書いてみるんじゃ3番煎じになりそうなので、&lt;a href=&#34;https://cookiecutter.readthedocs.io/en/latest/readme.html&#34;&gt;cookiecutter&lt;/a&gt;を使ってみました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;と言っても、同僚のAlexが&lt;a href=&#34;https://discuss.elastic.co/t/cookiecutter-template-for-writing-ingest-processors/52985&#34;&gt;cookiecutter-elasticsearch-ingest-processor&lt;/a&gt;と言うテンプレートを作ってくれているのを使っただけですが。（https://discuss.elastic.co に投稿された記事で、使い方がアニメgifで説明されててわかりやすいです）&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://cookiecutter.readthedocs.io/en/latest/readme.html&#34;&gt;cookiecutter&lt;/a&gt;とは、コマンドラインで質問に答えると、テンプレートからプロジェクトが生成できるツールです。
Elasticでは、カスタムBeatを作る時に利用する例がいつかの日本語ブログや発表資料で話題になっていました。
これのIngest Processorのプラグインバージョンです。&lt;/p&gt;
&lt;p&gt;今回は、NEologdも使ってみたかったので、Lucene Kuromoji for NEologdを利用して
指定した品詞の単語だけを抽出するProcessorを作ってみました。&lt;/p&gt;
&lt;p&gt;GitHubのプロジェクト：https://github.com/johtani/elasticsearch-ingest-kuromoji-pos-extract&lt;/p&gt;
&lt;h3 id=&#34;cookiecutterの使い方&#34;&gt;Cookiecutterの使い方&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://cookiecutter.readthedocs.io/en/latest/readme.html&#34;&gt;Cookiecutterのインストールはサイト&lt;/a&gt;をご覧ください。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cookiecutter gh:spinscale/cookiecutter-elasticsearch-ingest-processor
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;あとは、出てくる以下の項目を指定するだけです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;processor_type&lt;/code&gt; : Ingest Processorのタイプ名です。&lt;code&gt;kuromoji_part_of_speech_extract&lt;/code&gt;としました。（Alexのだと&lt;code&gt;_&lt;/code&gt;を使うとちょっと問題があるので後述）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;description&lt;/code&gt; : readme.mdに利用されます。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;developer_name&lt;/code&gt; : 名前を記載。Javaのファイルのヘッダに利用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;elasticsearch_version&lt;/code&gt; : デフォルトで&lt;code&gt;5.0.0-alpha4&lt;/code&gt;が指定されているので、特に指定せず&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以上の質問に答えたら、プロジェクトのディレクトリ構造が出来上がってます。
プロジェクトのビルドなどにはGradleを利用します。&lt;/p&gt;
&lt;h3 id=&#34;プロジェクトのintellij-idea用のファイルを生成&#34;&gt;プロジェクトのIntelliJ IDEA用のファイルを生成&lt;/h3&gt;
&lt;p&gt;build.gradleファイルでGradleのideaプラグインがapplyされているので、以下のコマンドを叩けばIntelliJ IDEAのプロジェクトファイル（？）が生成され、IntelliJで開けばすぐに開発ができる状態にできます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;gradle idea
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;コーディング&#34;&gt;コーディング&lt;/h3&gt;
&lt;p&gt;あとは、必要処理をコーディングします。
実際にコーディングするクラスは&lt;code&gt;org.elasticsearch.plugin.ingest.kuromoji_part_of_speech_extract&lt;/code&gt;のパッケージにある以下の2つです。（パッケージ名にはprocessor_typeの名前が指定されている）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IngestKuromojiPartOfSpeechExtractPlugin&lt;/li&gt;
&lt;li&gt;KuromojiPartOfSpeechExtractProcessor&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;ingestkuromojipartofspeechextractplugin&#34;&gt;IngestKuromojiPartOfSpeechExtractPlugin&lt;/h4&gt;
&lt;p&gt;Pluginというクラスは、プラグインをNodeのModuleとして登録する処理を書くクラスとなります。
生成してすぐは、次のような形になっています。（※importやクラス定義の部分は省略しています。）&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:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;final&lt;/span&gt; Setting&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; YOUR_SETTING &lt;span style=&#34;color:#f92672&#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;new&lt;/span&gt; Setting&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ingest.kuromoji_part_of_speech_extract.setting&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;, (value) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; value, Setting.&lt;span style=&#34;color:#a6e22e&#34;&gt;Property&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;NodeScope&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:#a6e22e&#34;&gt;@Override&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;public&lt;/span&gt; List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Setting&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&amp;gt;&amp;gt;&lt;/span&gt; getSettings() {
&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;return&lt;/span&gt; Arrays.&lt;span style=&#34;color:#a6e22e&#34;&gt;asList&lt;/span&gt;(YOUR_SETTING);
&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;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;onModule&lt;/span&gt;(NodeModule nodeModule) &lt;span style=&#34;color:#66d9ef&#34;&gt;throws&lt;/span&gt; IOException {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        nodeModule.&lt;span style=&#34;color:#a6e22e&#34;&gt;registerProcessor&lt;/span&gt;(KuromojiPartOfSpeechExtractProcessor.&lt;span style=&#34;color:#a6e22e&#34;&gt;TYPE&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                (registry) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; KuromojiPartOfSpeechExtractProcessor.&lt;span style=&#34;color:#a6e22e&#34;&gt;Factory&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;YOUR_SETTING&lt;/code&gt;プロパティと&lt;code&gt;getSettings()&lt;/code&gt;メソッドは&lt;code&gt;elasticsearch.yml&lt;/code&gt;で指定したい設定を記述する場合の例になります。今回は特に必要ないので両方削除しました。
最終系は&lt;a href=&#34;https://github.com/johtani/elasticsearch-ingest-kuromoji-pos-extract&#34;&gt;GitHubのコード&lt;/a&gt;をご覧ください。&lt;/p&gt;
&lt;h4 id=&#34;kuromojipartofspeechextractprocessor&#34;&gt;KuromojiPartOfSpeechExtractProcessor&lt;/h4&gt;
&lt;p&gt;Processorは実際にIngest Nodeで行う処理を書くところです。&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:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;final&lt;/span&gt; String TYPE &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kuromoji_part_of_speech_extract&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;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;final&lt;/span&gt; String field;
&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;final&lt;/span&gt; String targetField;
&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;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;KuromojiPartOfSpeechExtractProcessor&lt;/span&gt;(String tag, String field, String targetField) &lt;span style=&#34;color:#66d9ef&#34;&gt;throws&lt;/span&gt; IOException {
&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;super&lt;/span&gt;(tag);
&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;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;field&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; field;
&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;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;targetField&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; targetField;
&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:#a6e22e&#34;&gt;@Override&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;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;execute&lt;/span&gt;(IngestDocument ingestDocument) &lt;span style=&#34;color:#66d9ef&#34;&gt;throws&lt;/span&gt; Exception {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        String content &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ingestDocument.&lt;span style=&#34;color:#a6e22e&#34;&gt;getFieldValue&lt;/span&gt;(field, String.&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 style=&#34;color:#75715e&#34;&gt;// TODO implement me!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ingestDocument.&lt;span style=&#34;color:#a6e22e&#34;&gt;setFieldValue&lt;/span&gt;(targetField, content);
&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:#a6e22e&#34;&gt;@Override&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;public&lt;/span&gt; String &lt;span style=&#34;color:#a6e22e&#34;&gt;getType&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;return&lt;/span&gt; TYPE;
&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;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Factory&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; AbstractProcessorFactory&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;KuromojiPartOfSpeechExtractProcessor&lt;span style=&#34;color:#f92672&#34;&gt;&amp;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:#a6e22e&#34;&gt;@Override&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;public&lt;/span&gt; KuromojiPartOfSpeechExtractProcessor &lt;span style=&#34;color:#a6e22e&#34;&gt;doCreate&lt;/span&gt;(String processorTag, Map&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String, Object&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; config) &lt;span style=&#34;color:#66d9ef&#34;&gt;throws&lt;/span&gt; Exception {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            String field &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; readStringProperty(TYPE, processorTag, config, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;field&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            String targetField &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; readStringProperty(TYPE, processorTag, config, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;target_field&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;default_field_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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; KuromojiPartOfSpeechExtractProcessor(processorTag, field, targetField);
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;TYPE&lt;/code&gt;が&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/master/put-pipeline-api.html&#34;&gt;Ingest APIのPipelineでProcessorを指定するときに使う名前&lt;/a&gt;になります。ここは、cookiecutterの時にprocessor_typeに入力した文字列になっています。
&lt;code&gt;kuromoji_part_of_speech_extract&lt;/code&gt;だと長いので、&lt;code&gt;kuromoji_pos_extract&lt;/code&gt;に変えました。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;execute()&lt;/code&gt;メソッドに&lt;code&gt;// TODO implement me!&lt;/code&gt;とあります。
この部分に実際の処理を記述していきます。&lt;/p&gt;
&lt;p&gt;あとは、&lt;code&gt;Factory&lt;/code&gt;クラスでIngest APIで指定された設定項目を読み込みます。
今回作成した&lt;code&gt;elasticsearch-ingest-kuromoji-pos-extract&lt;/code&gt;では品詞を指定する必要があるので、&lt;code&gt;pos_tags&lt;/code&gt;を指定できるように処理を追加しました。&lt;/p&gt;
&lt;p&gt;私が実装したものの説明をするとちょっと長くなりそうなので、&lt;a href=&#34;https://github.com/johtani/elasticsearch-ingest-kuromoji-pos-extract&#34;&gt;GitHubのコード&lt;/a&gt;をご覧ください。&lt;/p&gt;
&lt;h3 id=&#34;テストのコーディング&#34;&gt;テストのコーディング&lt;/h3&gt;
&lt;p&gt;テストのクラスもテンプレートで生成されています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;KuromojiPartOfSpeechExtractProcessorTests&lt;/li&gt;
&lt;li&gt;KuromojiPartOfSpeechExtractRestIT&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;kuromojipartofspeechextractprocessortests&#34;&gt;KuromojiPartOfSpeechExtractProcessorTests&lt;/h4&gt;
&lt;p&gt;Processorクラスのテストになります。生成直後は次のような感じです。&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;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;testThatProcessorWorks&lt;/span&gt;() &lt;span style=&#34;color:#66d9ef&#34;&gt;throws&lt;/span&gt; Exception {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Map&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String, Object&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; document &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; HashMap&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    document.&lt;span style=&#34;color:#a6e22e&#34;&gt;put&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;source_field&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;fancy source field content&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    IngestDocument ingestDocument &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; RandomDocumentPicks.&lt;span style=&#34;color:#a6e22e&#34;&gt;randomIngestDocument&lt;/span&gt;(random(), document);
&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;    KuromojiPartOfSpeechExtractProcessor processor &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; KuromojiPartOfSpeechExtractProcessor(randomAsciiOfLength(10), &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;source_field&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;target_field&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    processor.&lt;span style=&#34;color:#a6e22e&#34;&gt;execute&lt;/span&gt;(ingestDocument);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Map&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String, Object&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; data &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ingestDocument.&lt;span style=&#34;color:#a6e22e&#34;&gt;getSourceAndMetadata&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;    assertThat(data, hasKey(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;target_field&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    assertThat(data.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;target_field&amp;#34;&lt;/span&gt;), is(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;fancy source field content&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:#75715e&#34;&gt;// TODO add fancy assertions here&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;h4 id=&#34;kuromojipartofspeechextractrestit&#34;&gt;KuromojiPartOfSpeechExtractRestIT&lt;/h4&gt;
&lt;p&gt;こちらはIntegration Testになります。
実際にElasticsearchに対して外部からAPIを叩くような感じです。
APIを叩くときに利用するJSONの設定やアサーションは&lt;code&gt;src/test/resources&lt;/code&gt;にyamlファイルがあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;10_basic.yaml&lt;/li&gt;
&lt;li&gt;20_kuromoji_part_of_speech_extract_processor.yaml&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;10_basic.yaml&lt;/code&gt;はプラグインがインストールされているかの確認のテストです。特に変更する必要はないです。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;20_kuromoji_part_of_speech_extract_processor.yaml&lt;/code&gt;は実際にコーディングしたProcessorが動くかどうかのテストです。&lt;/p&gt;
&lt;p&gt;テストの内容については、&lt;a href=&#34;https://github.com/johtani/elasticsearch-ingest-kuromoji-pos-extract&#34;&gt;GitHubのコード&lt;/a&gt;をご覧ください。&lt;/p&gt;
&lt;h3 id=&#34;テストの実行とzipの生成&#34;&gt;テストの実行とZipの生成&lt;/h3&gt;
&lt;p&gt;テストの実行とZipの生成は次のコマンドを実行すればOKです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;gradle check
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;テストに問題があった場合は、コケますし、問題なければ&lt;code&gt;SUCCESS&lt;/code&gt;と表示が出ます。
成功した場合は&lt;code&gt;build/distributions/&lt;/code&gt;というディレクトリにzipファイルができています。
これをElasticsearchのpluginコマンドでインストールすれば動きます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bin/plugin install file:///path/to/elasticsearch-ingest-kuromoji-pos-extract/build/distribution/ingest-kuromoji_part_of_speech_extract-0.0.1-SNAPSHOT.zip
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;kuromoji_pos_extractの利用方法&#34;&gt;kuromoji_pos_extractの利用方法&lt;/h3&gt;
&lt;p&gt;Ingest APIには便利な&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/master/simulate-pipeline-api.html&#34;&gt;Simulate Pipeline API&lt;/a&gt;があります。&lt;/p&gt;
&lt;p&gt;ということで、&lt;a href=&#34;https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md&#34;&gt;mecab-ipadic-NEologd&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-JSON&#34; data-lang=&#34;JSON&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;POST&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;_ingest/pipeline/_simulate&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:#f92672&#34;&gt;&amp;#34;pipeline&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:#f92672&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kuromoji neologd extract test&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:#f92672&#34;&gt;&amp;#34;processors&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;kuromoji_pos_extract&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:#f92672&#34;&gt;&amp;#34;field&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;body&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:#f92672&#34;&gt;&amp;#34;target_field&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;noun_field&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:#f92672&#34;&gt;&amp;#34;pos_tags&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:#e6db74&#34;&gt;&amp;#34;名詞-固有名詞-組織&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:#e6db74&#34;&gt;&amp;#34;名詞-固有名詞-一般&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:#e6db74&#34;&gt;&amp;#34;名詞-固有名詞-人名-一般&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:#e6db74&#34;&gt;&amp;#34;名詞-固有名詞-地域-一般&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:#e6db74&#34;&gt;&amp;#34;名詞-固有名詞-地域-国&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;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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;docs&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;_index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;index&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:#f92672&#34;&gt;&amp;#34;_type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;type&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:#f92672&#34;&gt;&amp;#34;_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;id&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:#f92672&#34;&gt;&amp;#34;_source&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:#f92672&#34;&gt;&amp;#34;body&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;10日放送の「中居正広のミになる図書館」（テレビ朝日系）で、SMAPの中居正広が、篠原信一の過去の勘違いを明かす一幕があった。&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;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;/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-JSON&#34; data-lang=&#34;JSON&#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;&amp;#34;docs&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;doc&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:#f92672&#34;&gt;&amp;#34;_index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;index&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:#f92672&#34;&gt;&amp;#34;_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;id&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:#f92672&#34;&gt;&amp;#34;_type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;type&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:#f92672&#34;&gt;&amp;#34;_source&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:#f92672&#34;&gt;&amp;#34;noun_field&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:#e6db74&#34;&gt;&amp;#34;10日&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:#e6db74&#34;&gt;&amp;#34;中居正広のミになる図書館&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:#e6db74&#34;&gt;&amp;#34;テレビ朝日&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:#e6db74&#34;&gt;&amp;#34;SMAP&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:#e6db74&#34;&gt;&amp;#34;中居正広&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:#e6db74&#34;&gt;&amp;#34;篠原信一&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;body&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;10日放送の「中居正広のミになる図書館」（テレビ朝日系）で、SMAPの中居正広が、篠原信一の過去の勘違いを明かす一幕があった。&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;_ingest&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:#f92672&#34;&gt;&amp;#34;timestamp&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2016-07-22T06:18:49.007+0000&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;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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;noun_field&lt;/code&gt;に固有名詞の単語が抜き出せているのがわかるかと思います。&lt;/p&gt;
&lt;h3 id=&#34;alexのテンプレートで困った点&#34;&gt;Alexのテンプレートで困った点&lt;/h3&gt;
&lt;p&gt;テンプレートは便利だったのですが、&lt;code&gt;processor_type&lt;/code&gt;に&lt;code&gt;_&lt;/code&gt;を使用したタイプ名を指定すると次のような問題（？）が発生しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クラス名が&lt;code&gt;Kuromoji_part_of_speech_extractProcessor&lt;/code&gt;となってしまう&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;深刻な問題ではないのですが、JavaだとCamel Caseが普通なのでちょっと気になって。
ということで、&lt;a href=&#34;https://github.com/spinscale/cookiecutter-elasticsearch-ingest-processor/pull/1&#34;&gt;プルリク&lt;/a&gt;作って出してみました。まだ取り込まれてないかな。&lt;/p&gt;
&lt;p&gt;取り込み前に使いたい方は以下のコマンドを実行してください。
&lt;code&gt;processor_class_name&lt;/code&gt;という項目が増えています。
デフォルトだと&lt;code&gt;processor_type&lt;/code&gt;の&lt;code&gt;_&lt;/code&gt;の部分を取り除きつつCamel Caseにしたものが入ります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cookiecutter gh:johtani/cookiecutter-elasticsearch-ingest-processor
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;
&lt;p&gt;ということで、とりあえず作ってみましたというものになります。
特徴的な単語（固有名詞だけ）を抜き出して、別のフィールドにできるので、タグみたいなものをこれを使って前処理で作れるようになるかなぁと。&lt;/p&gt;
&lt;h2 id=&#34;参考ブログ元ネタ&#34;&gt;参考ブログ（元ネタ？）&lt;/h2&gt;
&lt;p&gt;インスパイア元となったブログです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://dev.classmethod.jp/server-side/elasticsearch/ingest-plugin-useragent/&#34;&gt;User Agentを解析するIngest Pluginを書いてみた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.cybozu.io/entry/2016/07/05/080000&#34;&gt;Elasticsearch 5.0.0のIngest Node用プラグインを書いた話&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>よく物が壊れる年</title>
      <link>https://blog.johtani.info/blog/2016/06/30/broken-something-in-this-year/</link>
      <pubDate>Thu, 30 Jun 2016 10:57:38 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2016/06/30/broken-something-in-this-year/</guid>
      <description>&lt;p&gt;なんか、今年はよく物が壊れる、厄年だからかなぁ？&lt;/p&gt;
&lt;p&gt;ということで、記念に何が壊れたかをブログに残しておこうかと。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;ol&gt;
&lt;li&gt;腕時計（壊れてないかな）
&lt;ul&gt;
&lt;li&gt;電波腕時計を使ってたんだけど、電池がへたってたのでオーバーホールしてもらった。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Moto 360（壊れたというか。。。）
&lt;ul&gt;
&lt;li&gt;何度かバージョンアップしてるんだけど、数ヶ月前から、ちょっと触っただけで電源が落ちる現象が。ファームウェアのせいかAndroid Wearのバージョンアップのせいかわからないけど。。。挙げ句の果てに、電源を入れるために充電器にセットしないといけないと言う酷い仕様。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;自転車前輪
&lt;ul&gt;
&lt;li&gt;自転車で車道を横切る側溝の蓋の間に前輪がはまってすっ転んでしまい、タイヤのスポークがちょっと曲がってしまう&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ジーンズその1
&lt;ul&gt;
&lt;li&gt;自転車で転んだ時に、膝とかこすって破れる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ジーンズその2
&lt;ul&gt;
&lt;li&gt;福岡出張中に雨で滑って派手に転んで、膝に大きな穴が。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;リュック
&lt;ul&gt;
&lt;li&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; data-lang=&#34;ja&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;あー、怪しいなと思ってたんだけど、やっぱりこわれた、、、 &lt;a href=&#34;https://t.co/CD2Y7t6AOD&#34;&gt;pic.twitter.com/CD2Y7t6AOD&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;なんか、今年はよく物が壊れる、厄年だからかなぁ？&lt;/p&gt;
&lt;p&gt;ということで、記念に何が壊れたかをブログに残しておこうかと。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;ol&gt;
&lt;li&gt;腕時計（壊れてないかな）
&lt;ul&gt;
&lt;li&gt;電波腕時計を使ってたんだけど、電池がへたってたのでオーバーホールしてもらった。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Moto 360（壊れたというか。。。）
&lt;ul&gt;
&lt;li&gt;何度かバージョンアップしてるんだけど、数ヶ月前から、ちょっと触っただけで電源が落ちる現象が。ファームウェアのせいかAndroid Wearのバージョンアップのせいかわからないけど。。。挙げ句の果てに、電源を入れるために充電器にセットしないといけないと言う酷い仕様。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;自転車前輪
&lt;ul&gt;
&lt;li&gt;自転車で車道を横切る側溝の蓋の間に前輪がはまってすっ転んでしまい、タイヤのスポークがちょっと曲がってしまう&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ジーンズその1
&lt;ul&gt;
&lt;li&gt;自転車で転んだ時に、膝とかこすって破れる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ジーンズその2
&lt;ul&gt;
&lt;li&gt;福岡出張中に雨で滑って派手に転んで、膝に大きな穴が。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;リュック
&lt;ul&gt;
&lt;li&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; data-lang=&#34;ja&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;あー、怪しいなと思ってたんだけど、やっぱりこわれた、、、 &lt;a href=&#34;https://t.co/CD2Y7t6AOD&#34;&gt;pic.twitter.com/CD2Y7t6AOD&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://twitter.com/johtani/status/743409932981014528&#34;&gt;2016年6月16日&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;//platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;怪しいとは思ってたんだけど。。。
ということで、リュックを新調しつつ修理に出してるところ。
5. Xperia Z3
* 先週金曜日にカメラのレンズが結露してるなぁと思ったら、電源が入らなくなった。補償サービスに入ってたんで、新しいZ3を次の日に送付してもらい復旧。いろいろなアプリがログインしないといけないのでかなり大変だった。。。&lt;/p&gt;
&lt;p&gt;まだ、半年残ってるので他にも壊れるのかなぁ。。。
お祓いしてもらったので、何もなければいいんだけど。&lt;/p&gt;
&lt;p&gt;ということで、なんとなく&lt;a href=&#34;http://www.amazon.co.jp/registry/wishlist/29EMX20UN9P16/ref=cm_sw_r_tw_ws_NhjDxb61H9RBS&#34;&gt;欲しいものリスト&lt;/a&gt;を貼っておきますね。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第16回Elasticsearch勉強会を開催しました。 #elasticsearchjp</title>
      <link>https://blog.johtani.info/blog/2016/06/28/16th-elasticsearch-meetup/</link>
      <pubDate>Tue, 28 Jun 2016 13:55:55 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2016/06/28/16th-elasticsearch-meetup/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://elasticsearch.doorkeeper.jp/events/46539&#34;&gt;第16回Elasticsearch勉強会&lt;/a&gt;を開催しました。
スタッフの皆さん、スピーカーの皆さん、会場提供していただいた&lt;a href=&#34;http://recruit-tech.co.jp&#34;&gt;リクルートテクノロジーズさん&lt;/a&gt;、ありがとうございました！
今回は、司会だけに注力してみました（）。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h3 id=&#34;チェックイン数など&#34;&gt;チェックイン数など&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;チェックインした人：141名&lt;/li&gt;
&lt;li&gt;キャンセルしなかった人：67名&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;でした。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://elasticsearch.doorkeeper.jp/events/46539&#34;&gt;第16回Elasticsearch勉強会&lt;/a&gt;を開催しました。
スタッフの皆さん、スピーカーの皆さん、会場提供していただいた&lt;a href=&#34;http://recruit-tech.co.jp&#34;&gt;リクルートテクノロジーズさん&lt;/a&gt;、ありがとうございました！
今回は、司会だけに注力してみました（）。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h3 id=&#34;チェックイン数など&#34;&gt;チェックイン数など&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;チェックインした人：141名&lt;/li&gt;
&lt;li&gt;キャンセルしなかった人：67名&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;でした。&lt;/p&gt;
&lt;p&gt;今回は、参加希望者が多くて、当日にも100名近いキャンセル待ちの方がいたので、
240名まで、参加者枠を増枠（会場キャパ190名程度）して対応しました。
まぁ、読み通り、1/3の方はキャンセルしない形でした。
天気も良く電車の遅延などもなさそうだったので、ちょっとドキドキしてたのですが。&lt;/p&gt;
&lt;p&gt;以下は簡単なメモです。&lt;/p&gt;
&lt;h2 id=&#34;logstashとelasticsearchで作るenterprise-search-platform-elastic-kosho-owa&#34;&gt;「LogstashとElasticsearchで作るEnterprise Search Platform」/ Elastic Kosho Owa&lt;/h2&gt;
&lt;p&gt;スライド：https://speakerdeck.com/kosho/enabling-enterprise-search-platform-with-elastic-stack&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使ってるLogstashの設定ファイルを elastic-japan at elastic dot co に送るとTシャツがもらえるらしい。&lt;/li&gt;
&lt;li&gt;Logstashの&lt;a href=&#34;https://github.com/logstash-plugins/logstash-filter-ruby/blob/master/lib/logstash/filters/ruby.rb&#34;&gt;filter-ruby&lt;/a&gt;はここで、evalしてcallしてるから、特にforkとかしてないかと。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;企業業界情報プラットフォームspeedaにおけるelasticsearchの活用--株式会社ユーザベース-北内-啓さん&#34;&gt;「企業・業界情報プラットフォームSPEEDAにおけるElasticsearchの活用」 / 株式会社ユーザベース 北内 啓さん&lt;/h2&gt;
&lt;p&gt;スライド：http://www.slideshare.net/tau3000/speedaelasticsearch-63510388&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アルゴリズム関連の開発担当&lt;/li&gt;
&lt;li&gt;企業データをいろんな軸で検索したい
&lt;ul&gt;
&lt;li&gt;データ数が約70億レコードになりそう（通貨 x MySQL）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;300万企業データ＋Nestedとかで持ってる。
&lt;ul&gt;
&lt;li&gt;11万フィールド？？？&lt;/li&gt;
&lt;li&gt;10台の物理サーバに24仮想マシン&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;企業名の検索
&lt;ul&gt;
&lt;li&gt;recall重視&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;NewsPicksの検索機能
&lt;ul&gt;
&lt;li&gt;「日本 化粧品 売上高」業界のデータとかも観れるのかな？有料会員向け機能&lt;/li&gt;
&lt;li&gt;登録済みキーワードかどうかをRDB＋Esに検索して、ID化するっぽい
&lt;ul&gt;
&lt;li&gt;ID（Analyze必要ない）検索だから、termクエリだった、サンプルが。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ノードの役割分担
&lt;ul&gt;
&lt;li&gt;更新はMasterNode経由でDataNodeへ。&lt;/li&gt;
&lt;li&gt;検索はClientNode経由でDataNodeへ。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;1.xかぁ。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;elasticsearchベースの全文検索システムfess--株式会社エヌツーエスエム-菅谷信介さん&#34;&gt;「Elasticsearchベースの全文検索システムFess」 / 株式会社エヌツーエスエム 菅谷信介さん&lt;/h2&gt;
&lt;p&gt;スライド：http://www.slideshare.net/shinsuke/elasticsearchfess&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;10.xからSolrをやめてElasticsearchへ。&lt;/li&gt;
&lt;li&gt;日本語検索
&lt;ul&gt;
&lt;li&gt;bigram＋形態素（1文字検索とかに対応するため）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;NeologDに対応したkuromojiを利用&lt;/li&gt;
&lt;li&gt;DBFluteをESFluteとしてEs対応&lt;/li&gt;
&lt;li&gt;KOPFを組み込んで使ってる&lt;/li&gt;
&lt;li&gt;configをREST API経由で更新できるプラグインあり&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;lt&#34;&gt;LT&lt;/h2&gt;
&lt;h3 id=&#34;elasticsearchとgcpのネットワークでハマった話-株式会社サイバーエージェント-平田大地-さん-daichild&#34;&gt;「ElasticsearchとGCPのネットワークでハマった話」 株式会社サイバーエージェント 平田大地 さん @daichild&lt;/h3&gt;
&lt;p&gt;スライド：https://speakerdeck.com/daic_h/gcpfalsenetutowakudehamatutahua&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;hhkb2 2刀流！&lt;/li&gt;
&lt;li&gt;networkのKeep-alive周りで困ったよというお話。&lt;/li&gt;
&lt;li&gt;後で聞いたけど、&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/plugins/current/cloud-gce.html&#34;&gt;GCE Cloud Plugin&lt;/a&gt;は使ってるそうです。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;06/28 17:00追記&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pingを定期的に実行させることで回避も出来るようです。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/2.3/modules-transport.html#_tcp_transport&#34;&gt;transport.ping_schedule&lt;/a&gt;に時間を指定します。通常のNode（Transport以外）は&amp;rsquo;-1&amp;rsquo;が指定してあり、動作してません。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;スクリプトフィールドで作るランキングみたいな何かiwag-さん&#34;&gt;「スクリプトフィールドで作るランキングみたいな何か」iwag さん&lt;/h3&gt;
&lt;p&gt;スライド：https://speakerdeck.com/iwag/elasticsearch-dezuo-rurankingu&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1.xかぁ。。。&lt;/li&gt;
&lt;li&gt;あとは、&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html&#34;&gt;function_score&lt;/a&gt;とかも面白いですよ！&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;その他感想などのブログ&#34;&gt;その他、感想などのブログ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://tsuyoshi-nakamura.hatenablog.com/entry/2016/06/28/115244&#34;&gt;第16回elasticsearch勉強会に参加してきた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://masutaka.net/chalow/2016-06-28-1.html&#34;&gt;第16回Elasticsearch勉強会に参加してきた &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ宣伝&#34;&gt;まとめ＋宣伝？&lt;/h2&gt;
&lt;p&gt;1.xがまだまだいますねぇ、早く2.xにアップしましょう！（5.0ももう直ぐだし）。懇親会でも色々と話しましたが、https://discuss.elastic.co というフォーラムあるので、ぜひ活用してください。&lt;/p&gt;
&lt;p&gt;次回は8月末か9月頭かでしょうか。
&lt;a href=&#34;http://www.ospn.jp/osc2016-kyoto/&#34;&gt;7月末にOSC京都&lt;/a&gt;に出没するので、京都で勉強会やりたいと思ってます！
会場とかスピーカーとか興味ある人連絡ください。&lt;/p&gt;
&lt;p&gt;東京の勉強会のスピーカーも随時募集中ですので、連絡ください。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Introduce Elastic stack 5.0 alpha 1/2/3</title>
      <link>https://blog.johtani.info/presentation/2016/3/</link>
      <pubDate>Sat, 11 Jun 2016 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2016/3/</guid>
      <description>&lt;p&gt;2016/06/10のアクロクエストさんのハンズオンでのLT資料&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;2016/06/10のアクロクエストさんのハンズオンでのLT資料&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Beatsシリーズでお手軽 メトリック収集可視化</title>
      <link>https://blog.johtani.info/presentation/2016/beatssirizudeoshou-qing-metoritukushou-ji-ke-shi-hua/</link>
      <pubDate>Sat, 21 May 2016 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2016/beatssirizudeoshou-qing-metoritukushou-ji-ke-shi-hua/</guid>
      <description>&lt;p&gt;JJUG CCC 2016 Springで発表した時の資料です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;JJUG CCC 2016 Springで発表した時の資料です。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elastic Stackの紹介 in 福岡</title>
      <link>https://blog.johtani.info/presentation/2016/elastic-stackfalseshao-jie-in-fu-gang/</link>
      <pubDate>Wed, 27 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2016/elastic-stackfalseshao-jie-in-fu-gang/</guid>
      <description>&lt;p&gt;「Elasticsearch勉強会 in 福岡」で使用したスライド&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;「Elasticsearch勉強会 in 福岡」で使用したスライド&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Introduction Elastic Stack 5.0 alpha1</title>
      <link>https://blog.johtani.info/presentation/2016/introduction-elastic-stack-5-dot-0-alpha1/</link>
      <pubDate>Tue, 12 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2016/introduction-elastic-stack-5-dot-0-alpha1/</guid>
      <description>&lt;p&gt;【Developers.IO 特別編】Elastic 勉強会 #cmdevio #elastic での発表資料です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;【Developers.IO 特別編】Elastic 勉強会 #cmdevio #elastic での発表資料です。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Next version of Elastic Stack ?</title>
      <link>https://blog.johtani.info/presentation/2016/next-version-of-elastic-stack/</link>
      <pubDate>Wed, 23 Mar 2016 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2016/next-version-of-elastic-stack/</guid>
      <description>&lt;p&gt;道玄坂LT祭り &amp;ldquo;LAST GIGS&amp;rdquo; (クラウドとビッグデータと私 (&amp;hellip;時々OSS))発表資料。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://atnd.org/events/67382&#34;&gt;https://atnd.org/events/67382&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;道玄坂LT祭り &amp;ldquo;LAST GIGS&amp;rdquo; (クラウドとビッグデータと私 (&amp;hellip;時々OSS))発表資料。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://atnd.org/events/67382&#34;&gt;https://atnd.org/events/67382&lt;/a&gt;&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第15回Elasticsearch勉強会を開催しました。 #elasticsearchjp</title>
      <link>https://blog.johtani.info/blog/2016/03/17/15th-elasticsearch-jp/</link>
      <pubDate>Thu, 17 Mar 2016 12:43:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2016/03/17/15th-elasticsearch-jp/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://elasticsearch.doorkeeper.jp/events/40444&#34;&gt;第15回Elasticsearch勉強会&lt;/a&gt;を開催しました。
スタッフの皆さん、スピーカーの皆さん、会場提供していただいた&lt;a href=&#34;http://recruit-tech.co.jp&#34;&gt;リクルートテクノロジーズさん&lt;/a&gt;、ありがとうございました！
今回は、Elastic{on} 2016開催直後ということで、大半はElastic{on}に関する話でした。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://elasticsearch.doorkeeper.jp/events/40444&#34;&gt;第15回Elasticsearch勉強会&lt;/a&gt;を開催しました。
スタッフの皆さん、スピーカーの皆さん、会場提供していただいた&lt;a href=&#34;http://recruit-tech.co.jp&#34;&gt;リクルートテクノロジーズさん&lt;/a&gt;、ありがとうございました！
今回は、Elastic{on} 2016開催直後ということで、大半はElastic{on}に関する話でした。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h3 id=&#34;チェックイン数など&#34;&gt;チェックイン数など&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;チェックインした人：114名&lt;/li&gt;
&lt;li&gt;キャンセルしなかった人：62名&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;でした。
今回は、少しおそめで1時間前にキャンセル待ちがいない状態にしました。
まぁ、いつもの感じでしょうか。数値も安定してきた感じですかね。&lt;/p&gt;
&lt;h2 id=&#34;elasticsearchと機械学習を実際に連携させる--preferred-networks-america-inc-cto-久保田展行kubota-nobuyuki-さん&#34;&gt;&amp;ldquo;Elasticsearchと機械学習を実際に連携させる&amp;rdquo; / &lt;a href=&#34;https://www.preferred-networks.jp&#34;&gt;Preferred Networks America, Inc.&lt;/a&gt; CTO 久保田展行(Kubota Nobuyuki) さん&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/nobu_k/elasticsearch-59627321&#34;&gt;Elasticsearchと機械学習を実際に連携させる&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://blog.johtani.info/blog/2016/01/08/14th-elasticcsearch-jp/&#34;&gt;前回の続き&lt;/a&gt;の話で、今回が本題でした。&lt;/p&gt;
&lt;p&gt;勉強会直前に発表された&lt;a href=&#34;http://sensorbee.io&#34;&gt;SensorBee&lt;/a&gt;をElasticsearchと一緒に使うとどんなことができるかというお話です。
まぁ、前処理重要ですよねというのが、いつものことですが、印象的でした。
いつものようにわかりやすい説明だったので、使ってブログを書いて欲しいなと。&lt;/p&gt;
&lt;p&gt;発表の中で、説明に出てきたデモとか。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://research.preferred.jp/2016/01/ces2016/&#34;&gt;CES2016でロボットカーのデモを展示してきました&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;elasticon-2016レポート--elastic-jun-ohtani&#34;&gt;&amp;ldquo;Elastic{ON} 2016レポート&amp;rdquo; / Elastic Jun Ohtani&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://speakerdeck.com/johtani/elastic-on-2016-repoto&#34;&gt;elastic{on} 2016 レポート&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;写真多めで、キーノートをメインに話をしました。&lt;/p&gt;
&lt;p&gt;簡単なまとめとしては&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プロダクトロゴができました。&lt;a href=&#34;https://www.elastic.co/brand&#34;&gt;ロゴ画像などはこちら&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;次のメインバージョンは全て5.0。（&lt;a href=&#34;https://www.elastic.co/v5&#34;&gt;5.0に関する通知が欲しい人はこちらで登録できます&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/elasticon/conf/2016/sf&#34;&gt;elastic{on} 2016のビデオなどはこちら&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;BBL始めます。連絡ください&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;elasticonの過ごし方--クラスメソッド株式会社-藤本-真司-さん&#34;&gt;&amp;ldquo;Elastic{ON}の過ごし方&amp;rdquo; / クラスメソッド株式会社 藤本 真司 さん&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://dev.classmethod.jp/server-side/elasticsearch/elasticsearch-study-15-lt/&#34;&gt;Elastic{ON}の過ごし方&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;印象に残ったのは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「自他共に認めるブログの会社」&lt;/li&gt;
&lt;li&gt;4/12にSAPさんに会場を借りてElastic＆クラスメソッドでイベントやります。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;やっぱりご飯が美味しいんですねぇ。
早速&lt;a href=&#34;http://dev.classmethod.jp/server-side/elasticsearch/elasticsearch-study-15-lt/&#34;&gt;ブログ&lt;/a&gt;が書かれてました。&lt;/p&gt;
&lt;h2 id=&#34;elasticon-2016-見るべきセッション資料-7選--acroquest-technology株式会社-谷本-心-さん&#34;&gt;&amp;ldquo;Elastic{ON} 2016 見るべきセッション資料 7選&amp;rdquo; / Acroquest Technology株式会社 谷本 心 さん&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://speakerdeck.com/shintanimoto/elastic-on-2016-jian-rubekisetusiyonzi-liao-7xuan-number-elasticsearchjp&#34;&gt;Elastic{ON} 2016 見るべきセッション資料 7選 #elasticsearchjp&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;印象に残ったのは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;東京でハンズオンやる会場提供者募集中！&lt;/li&gt;
&lt;li&gt;Ingest Node（参考：&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/master/ingest.html&#34;&gt;Ingest Nodeのドキュメントは公開中。&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;Reindex API（参考：&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/17060&#34;&gt;Backport reindex to 2.x &lt;/a&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;その他感想などのブログ&#34;&gt;その他、感想などのブログ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://dev.classmethod.jp/server-side/elasticsearch/elasticsearch-study-15-lt/&#34;&gt;第15回elasticsearch勉強会にLTで登壇しました #elasticsearch #elasticsearchjp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/Kazuhira/20160316/1458142636&#34;&gt;第15回elasticsearch勉強会に参加してきました #elasticsearch #elasticsearchjp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ宣伝&#34;&gt;まとめ＋宣伝&lt;/h2&gt;
&lt;p&gt;来年のElastic{ON}に参加したいと思っていただけたらよかったなと。&lt;/p&gt;
&lt;p&gt;4/12にクラスメソッドさんとイベントを行います。また、ツイートすると思います。&lt;/p&gt;
&lt;p&gt;次回はいつも通りだと5月中旬になるかと思います（大丈夫かな？&lt;a href=&#34;http://www.ospn.jp/osc2016-nagoya/&#34;&gt;OSC 2016 Nagoya&lt;/a&gt;でしゃべったり、ブース出したりとかするけど）。
5末に名古屋に出没します。名古屋で勉強会できればやりたいと思ってます。会場とかスピーカーとか興味がある方は連絡ください。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>elastic{on} 2016 レポート</title>
      <link>https://blog.johtani.info/presentation/2016/elastic-on-2016-repoto/</link>
      <pubDate>Thu, 17 Mar 2016 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2016/elastic-on-2016-repoto/</guid>
      <description>&lt;p&gt;第15回Elasticsearch勉強会の発表資料。
elastic{on} 2016のキーノートの紹介とBBL開始のお知らせ。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;第15回Elasticsearch勉強会の発表資料。
elastic{on} 2016のキーノートの紹介とBBL開始のお知らせ。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>「自然言語処理の基本と技術」を読んでる</title>
      <link>https://blog.johtani.info/blog/2016/03/14/review-basics-and-tech-of-nlp/</link>
      <pubDate>Mon, 14 Mar 2016 22:34:12 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2016/03/14/review-basics-and-tech-of-nlp/</guid>
      <description>&lt;p&gt;久々のポスト。。。&lt;/p&gt;
&lt;p&gt;久々に、技術書読んでます。&lt;a href=&#34;http://amzn.to/1QSplr1&#34;&gt;「自然言語処理の基本と技術」&lt;/a&gt;という本です。&lt;/p&gt;
&lt;p&gt;監修の方のツイートを見て気になったので、買ってみました。
書籍のサイトの説明はこんな感じでした。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;blockquote&gt;
&lt;p&gt;本書は、この未来に不可欠となるに違いない自然言語処理の、技術的、ビジネス的基礎知識をくまなくコンパクトに図解した一冊です。
著者陣もそれぞれの分野の第一線で活躍するエキスパート揃い！&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;久々のポスト。。。&lt;/p&gt;
&lt;p&gt;久々に、技術書読んでます。&lt;a href=&#34;http://amzn.to/1QSplr1&#34;&gt;「自然言語処理の基本と技術」&lt;/a&gt;という本です。&lt;/p&gt;
&lt;p&gt;監修の方のツイートを見て気になったので、買ってみました。
書籍のサイトの説明はこんな感じでした。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;blockquote&gt;
&lt;p&gt;本書は、この未来に不可欠となるに違いない自然言語処理の、技術的、ビジネス的基礎知識をくまなくコンパクトに図解した一冊です。
著者陣もそれぞれの分野の第一線で活躍するエキスパート揃い！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;確かに著者陣がすごいです。&lt;/p&gt;
&lt;p&gt;まだ、「はじめに」と自分に関係のある「情報検索」の章を流し読みしただけなんですが、次のような特徴がある本です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;平易な単語で説明してある（難しい専門用語が少ない）&lt;/li&gt;
&lt;li&gt;数式が出てこない（多分。少なくとも読んだ部分では見てない）&lt;/li&gt;
&lt;li&gt;説明には例と図解がある&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;情報検索の章で言うと、全文検索でよく使われる転置インデックス（索引という単語が使われてる）がなぜ必要なのか、どういう感じで作られるのか、
転置インデックスに利用する索引の単語をどうやって作るのか（文字N-Gramや形態素解析）、単語の正規化（ステミングやストップワード）などの説明が
本当にわかりやすく書かれています。
スコアリングについても触れられています。&lt;/p&gt;
&lt;p&gt;Elasticsearchも転置インデックスを用いた検索を行っており、
MappingでAnalyzerの指定をしている理由などの理解に役に立つと思います。&lt;/p&gt;
&lt;p&gt;全文検索システムがどのように検索を処理しているかをざっくり理解するのにはもってこいじゃないかと。
1点残念だなと思ったのは、書籍に「索引」がありませんでした（本の索引を思い浮かべてくださいっていう説明あったんだけど）。。。
Kindle版を購入すれば「検索」できるのかな？&lt;/p&gt;
&lt;p&gt;ということで、まだ、流し読みしただけなんですが、「すごく」オススメです。
購入はこちらから！&lt;/p&gt;
&lt;iframe src=&#34;http://rcm-fe.amazon-adsystem.com/e/cm?t=johtani-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=479812852X&amp;nou=1&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr&#34; style=&#34;width:120px;height:240px;&#34; scrolling=&#34;no&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34; frameborder=&#34;0&#34;&gt;&lt;/iframe&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticスタックではじめるログ解析入門 #osc16ep</title>
      <link>https://blog.johtani.info/presentation/2016/elasticsutatukudehazimerurogujie-xi-ru-men-number-osc16ep/</link>
      <pubDate>Fri, 29 Jan 2016 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2016/elasticsutatukudehazimerurogujie-xi-ru-men-number-osc16ep/</guid>
      <description>&lt;p&gt;オープンソースカンファレンス 2016 Enterprise@Osakaでの発表資料&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;オープンソースカンファレンス 2016 Enterprise@Osakaでの発表資料&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第14回Elasticsearch勉強会を開催しました。 #elasticsearchjp</title>
      <link>https://blog.johtani.info/blog/2016/01/08/14th-elasticcsearch-jp/</link>
      <pubDate>Fri, 08 Jan 2016 11:34:56 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2016/01/08/14th-elasticcsearch-jp/</guid>
      <description>&lt;p&gt;あけましておめでとうございます、johtaniです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://elasticsearch.doorkeeper.jp/events/36330&#34;&gt;第14回Elasticsearch勉強会&lt;/a&gt;を開催しました。
スタッフの皆さん、スピーカーの皆さん、会場提供していただいた&lt;a href=&#34;http://recruit-tech.co.jp&#34;&gt;リクルートテクノロジーズさん&lt;/a&gt;、ありがとうございました！
今年もよろしくお願いします！参加していただき盛り上げていただいた参加者の皆さんもありがとうございました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;あけましておめでとうございます、johtaniです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://elasticsearch.doorkeeper.jp/events/36330&#34;&gt;第14回Elasticsearch勉強会&lt;/a&gt;を開催しました。
スタッフの皆さん、スピーカーの皆さん、会場提供していただいた&lt;a href=&#34;http://recruit-tech.co.jp&#34;&gt;リクルートテクノロジーズさん&lt;/a&gt;、ありがとうございました！
今年もよろしくお願いします！参加していただき盛り上げていただいた参加者の皆さんもありがとうございました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h3 id=&#34;チェックイン数など&#34;&gt;チェックイン数など&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;チェックインした人：122名&lt;/li&gt;
&lt;li&gt;キャンセルしなかった人：58名&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;でした。
今回も当日の昼の時点でキャンセル待ちがない状態にしていました。
いくつか電車が止まっていたという話を聞いていたので、開始を5分遅らせ、
受付は45分くらいまで開けておくという対応をしてもらいました。&lt;/p&gt;
&lt;h3 id=&#34;ココが辛いよelasticsearch--株式会社リクルートテクノロジー-tatakaba-さん&#34;&gt;&amp;ldquo;ココが辛いよelasticsearch&amp;rdquo; / 株式会社リクルートテクノロジー @tatakaba さん&lt;/h3&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/takahitotakabayashi/elasticsearch-56936397&#34;&gt;ココが辛いよelasticsearch&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;実際にいくつかのサービスで運用されている内容とどういった機能を利用しているか、
どういったものを独自に作っているかという話をしていただきました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;独自PluginでA/Bテストしてる&lt;/li&gt;
&lt;li&gt;Snapshotの活用&lt;/li&gt;
&lt;li&gt;Index作成は環境に合わせて行っている。&lt;/li&gt;
&lt;li&gt;バージョンは混在&lt;/li&gt;
&lt;li&gt;PusnaRSのバージョンアップの話。
&lt;ul&gt;
&lt;li&gt;2つのバージョンのクラスタを用意してリアルタイムに切り替え。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Elasticsearchの活用
&lt;ul&gt;
&lt;li&gt;QueryのRewrite：&lt;/li&gt;
&lt;li&gt;SolrのリクエストをEsで受け付けたり。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;辛い話。
&lt;ul&gt;
&lt;li&gt;バージョンアップが辛い&lt;/li&gt;
&lt;li&gt;Riverなくなるのつらい&lt;/li&gt;
&lt;li&gt;データずれるのつらい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;補足：&lt;/p&gt;
&lt;h4 id=&#34;バージョンアップについて&#34;&gt;バージョンアップについて&lt;/h4&gt;
&lt;p&gt;1.x系から2.x系にアップされるのであれば、こちらを必ず試してください。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/elastic/elasticsearch-migration&#34;&gt;https://github.com/elastic/elasticsearch-migration&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;「.」が使えなくなるという話は、Solrとの大きな違いになるのかもなぁと。
ネスト構造のデータの表記を「.」で行うというのを厳密に行えるように、
「.」を使えなくしたというのがあるかと。&lt;/p&gt;
&lt;h4 id=&#34;riverについて&#34;&gt;Riverについて&lt;/h4&gt;
&lt;p&gt;Riverがなくなった理由については、https://www.elastic.co/blog/deprecating-rivers で記載があります。
便利なのですが、負荷が偏ったり、スケールしないとかいう問題点があるかなと。&lt;/p&gt;
&lt;p&gt;良いサンプルとしては、JDBC Riverなどは、Javaのプログラムとして起動できるように変更されていたりします。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/jprante/elasticsearch-jdbc/wiki/jdbc-plugin-feeder-mode-as-an-alternative-to-the-deprecated-elasticsearch-river-api&#34;&gt;https://github.com/jprante/elasticsearch-jdbc/wiki/jdbc-plugin-feeder-mode-as-an-alternative-to-the-deprecated-elasticsearch-river-api&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;（&lt;strong&gt;個人的&lt;/strong&gt; には、SolrのDIHもRiverもあんまり好きではなかったです。データの変換処理と、ロード処理は別々にしたい人だったので。）&lt;/p&gt;
&lt;h4 id=&#34;データのズレなど&#34;&gt;データのズレなど&lt;/h4&gt;
&lt;p&gt;耐障害性とか信頼性に関しては、どういった問題点があるのか、どういった対応をしているのかというのがまとめられたページが用意されています。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/resiliency/current/index.html&#34;&gt;https://www.elastic.co/guide/en/elasticsearch/resiliency/current/index.html&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;機械学習を利用したちょっとリッチな検索--preferred-networks-america-inc-cto-久保田展行kubota-nobuyuki-さん&#34;&gt;「機械学習を利用したちょっとリッチな検索」 / Preferred Networks America, Inc. CTO 久保田展行(Kubota Nobuyuki) さん&lt;/h3&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/nobu_k/ss-56810268&#34;&gt;機械学習を利用したちょっとリッチな検索&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;来日していただき、機械学習と検索の話をしてもらいました。
本編は次回の発表かもw&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;機械学習を元に、検索対象の情報を元の情報から増やしてあげる。&lt;/li&gt;
&lt;li&gt;増えた情報を検索できるようにする&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;今日のゴール&#34;&gt;今日のゴール：&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;機械学習とはどういうものか？&lt;/li&gt;
&lt;li&gt;データの集め方とか、アノテーションとか&lt;/li&gt;
&lt;li&gt;学習の方法（ツールやライブラリに依存）&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;esでの活用方法&#34;&gt;Esでの活用方法&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;オフラインで学習させて、情報を付与した後に、Elasticsearchに入れる&lt;/li&gt;
&lt;li&gt;Jubatus＋fluentdで&lt;/li&gt;
&lt;li&gt;ChainerサポートのOSSのツールを公開予定&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;「ここからが本当の地獄だ。。。」ってのが聴きたいw&lt;/p&gt;
&lt;h3 id=&#34;lucene-query-再考---domain-specific-query-実装----supership株式会社-インフラ事業開発本部検索グループ-大川真吾-さん&#34;&gt;「Lucene Query 再考 - Domain Specific Query 実装 -」 / Supership株式会社 インフラ事業開発本部検索グループ 大川真吾 さん&lt;/h3&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/ShingoOKAWA/elasticsearch-20150107-56772462&#34;&gt;Lucene Query 再考 - Domain Specific Query 実装 -&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Luceneのクエリに関する話と、クエリパーサーに関する話でした。
こういった濃い話も勉強会でしてもらえると、色々な参加者に楽しんでいただけるかなぁと。
次回も続きを話してもらう予定です。&lt;/p&gt;
&lt;p&gt;補足：&lt;/p&gt;
&lt;p&gt;参考までにですが、Elasticsearchに入門したての人向けに、
Analyzerとか転置インデックスとかの話をした時のスライドになります。
&lt;a href=&#34;https://speakerdeck.com/johtani/lucenetori-ben-yu-falsejian-suo&#34;&gt;https://speakerdeck.com/johtani/lucenetori-ben-yu-falsejian-suo&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;lt&#34;&gt;LT:&lt;/h3&gt;
&lt;h4 id=&#34;fluentd-meets-beats--repeatedly-さん&#34;&gt;Fluentd meets Beats / @repeatedly さん&lt;/h4&gt;
&lt;p&gt;スライド：http://www.slideshare.net/repeatedly/fluentpluginbeats-at-elasticsearch-meetup-14&lt;/p&gt;
&lt;p&gt;参考Qiita：http://qiita.com/repeatedly/items/77af41788f0b3ccdefd2&lt;/p&gt;
&lt;p&gt;Beatsの説明をTDの人からしてもらうなどw
FluentdにBeatsからのデータを流し込めるようにしたプラグインが出たという話でした。&lt;/p&gt;
&lt;p&gt;filebeatの性能の件は社内で聞いてみようかと。&lt;/p&gt;
&lt;h4 id=&#34;elasticsearchインデクシングのパフォーマンスを測ってみた--日本ibm黒澤亮二さん&#34;&gt;Elasticsearchインデクシングのパフォーマンスを測ってみた / 日本IBM　黒澤亮二さん&lt;/h4&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/kuron99/elasticsearch-56784623&#34;&gt;Elasticsearchインデクシングのパフォーマンスを測ってみた&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;参考Qiita：http://qiita.com/rjkuro/items/e79eec7ffb0511b7c678&lt;/p&gt;
&lt;p&gt;細かな性能測定の結果を駆け足で話してもらいました。
皆さんもこの指標をもとに、手元の環境を計測してみたりしてみてもらえればと。&lt;/p&gt;
&lt;p&gt;あとは、2.x系になってるので、同じ方法で計測してもらってまた
発表してもらえると嬉しいなー（棒）&lt;/p&gt;
&lt;h2 id=&#34;その他感想などのブログ&#34;&gt;その他、感想などのブログ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://acro-engineer.hatenablog.com/entry/2016/01/08/123857&#34;&gt;Elasticsearch勉強会　第14回フィードバック&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ宣伝&#34;&gt;まとめ＋宣伝&lt;/h2&gt;
&lt;p&gt;久々に（初めてかな？）、ゲストがいないのに自分が喋りませんでした。
次回は3月中旬を予定してます。
次回は、Elastic{ON}16の報告をする予定です。いろいろと発表あるだろうし。&lt;/p&gt;
&lt;p&gt;あと、今月末の1/29に&lt;a href=&#34;http://www.ospn.jp/osc2016.enterprise-osaka/&#34;&gt;オープンソースカンファレンス 2016.enterprise@Osaka&lt;/a&gt;にブース出展します。
セミナー枠でも弊社OSSプロダクトの概要を話しする予定です。
関西の方は、ぜひ参加していただければと。ブースでお待ちしております。&lt;/p&gt;
&lt;p&gt;また、スピーカーや場所が用意できたら、出張勉強会もまたやりたいなと思っています。
興味ある方は、連絡ください！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>今年の振り返りと来年の抱負（2015）</title>
      <link>https://blog.johtani.info/blog/2015/12/31/looking-back-2015/</link>
      <pubDate>Thu, 31 Dec 2015 21:33:02 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/12/31/looking-back-2015/</guid>
      <description>&lt;p&gt;今年は紅白見ながら書いてます。
早い一年だったなぁ。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;振り返り2014年に書いた抱負から&#34;&gt;振り返り(2014年に書いた抱負から)&lt;/h2&gt;
&lt;p&gt;まずは去年の抱負を元に振り返りをば。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;英語の継続&lt;/li&gt;
&lt;li&gt;海外のイベントへの参加&lt;/li&gt;
&lt;li&gt;多岐にわたるイベントでのスピーカー&lt;/li&gt;
&lt;li&gt;日本の人員の倍増！？&lt;/li&gt;
&lt;li&gt;Elasticsearchに関する日本語の情報発信&lt;/li&gt;
&lt;li&gt;Elasticsearch座談会みたいなものの開催&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;英語はまぁ、継続してます。亀の歩みですが。。。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今年は紅白見ながら書いてます。
早い一年だったなぁ。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;振り返り2014年に書いた抱負から&#34;&gt;振り返り(2014年に書いた抱負から)&lt;/h2&gt;
&lt;p&gt;まずは去年の抱負を元に振り返りをば。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;英語の継続&lt;/li&gt;
&lt;li&gt;海外のイベントへの参加&lt;/li&gt;
&lt;li&gt;多岐にわたるイベントでのスピーカー&lt;/li&gt;
&lt;li&gt;日本の人員の倍増！？&lt;/li&gt;
&lt;li&gt;Elasticsearchに関する日本語の情報発信&lt;/li&gt;
&lt;li&gt;Elasticsearch座談会みたいなものの開催&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;英語はまぁ、継続してます。亀の歩みですが。。。&lt;/p&gt;
&lt;p&gt;海外のイベントへの参加は、&lt;a href=&#34;http://blog.johtani.info/blog/2015/03/11/attend-elasticon/&#34;&gt;自社のイベント&lt;/a&gt;だけでした。&lt;a href=&#34;https://www.elastic.co/elasticon/conf/2016/sf&#34;&gt;来年のElastic{ON}&lt;/a&gt;ももちろん参加です。来年こそBerlin Buzzwords行きたいな。。。&lt;/p&gt;
&lt;p&gt;多岐にわたるイベントとまではいってないですかね。。。来年はOSC(&lt;a href=&#34;http://www.ospn.jp/osc2016.enterprise-osaka/&#34;&gt;大阪&lt;/a&gt;や&lt;a href=&#34;http://www.ospn.jp/osc2016-spring/&#34;&gt;東京&lt;/a&gt;)に出没予定です。参加される方は、声をかけていただければと。&lt;/p&gt;
&lt;p&gt;人員は倍増しました！営業の方が参画されたのがかなり助かってます。
今現在で4名です！来年も倍増できるかなぁ？&lt;/p&gt;
&lt;p&gt;日本語の情報発信はリリースブログの翻訳が多めでした。来年は独自コンテンツも増やさないとなぁ。
あとやっぱ書籍かなぁ。。。座談会は来年の課題に。。。&lt;/p&gt;
&lt;h2 id=&#34;振り返り今年あったできごと&#34;&gt;振り返り(今年あったできごと)&lt;/h2&gt;
&lt;p&gt;その他の今年の出来事。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;初渡米&lt;/li&gt;
&lt;li&gt;初バルセロナ&lt;/li&gt;
&lt;li&gt;東京以外で勉強会&lt;/li&gt;
&lt;li&gt;初自社イベント（日本で）&lt;/li&gt;
&lt;li&gt;初トレーナー&lt;/li&gt;
&lt;li&gt;不惑&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今年も初モノ多いですね。今年も楽しい一年でした。
自社イベントでアメリカやバルセロナなどに行きました。40年近く、海外に行ったことないせいか、海外に行って経験することが面白いです。&lt;/p&gt;
&lt;p&gt;東京以外での勉強会もやりました。名古屋、大阪、京都、北海道と。
来年もOSCで訪れた場所で勉強会を開催したいなぁと。&lt;/p&gt;
&lt;p&gt;自社のイベント（Elastic{ON} Tour Tokyo）も東京でやりました。
どうなることかと思っていましたが、朝から大勢の方に来ていただけてホッとしました。
自分のトークがどうだったのかという反応も気になりますが。。。
せっかくShayたちが来ていたので、もっとブースに話しに来てもらえるともっと嬉しかったかもなぁと。&lt;/p&gt;
&lt;p&gt;Tour Tokyoを挟んで自社の公式トレーニングのトレーナーもやりました。
日本で3回目にして、初の日本語でのトレーニングでした。前の2回は逐次通訳だったんですが。
トレーニングって大変だなぁと思ったのと、やはり日本語でトレーニングを受けられるとだいぶ違うだろうなという実感がありました。
来年もできればいいなと。トレーニング自体があったことを知らない人もいたのかなぁ？&lt;/p&gt;
&lt;h2 id=&#34;来年の抱負&#34;&gt;来年の抱負&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;英語の継続&lt;/li&gt;
&lt;li&gt;もっとElasticsearchの開発に参加&lt;/li&gt;
&lt;li&gt;人員の倍増？&lt;/li&gt;
&lt;li&gt;日本語情報発信&lt;/li&gt;
&lt;li&gt;Splatoon S+?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;英語あいかわらず出来てないので、頑張らないと。
もっと喋ったりしないとなんだろうなぁ。&lt;/p&gt;
&lt;p&gt;来年は開発をもっとやりたいなと。
来年1月にはセールスのエンジニアが加入するので、開発にもっと時間を割きたいなと。&lt;/p&gt;
&lt;p&gt;人員は倍増できるように頑張りたいです。少なくとも、2人が1月に入ることは決まってるんで、後二人！&lt;/p&gt;
&lt;p&gt;ブログももっと書かないとですね。新機能とかこんな使い方できるよとか。
どんな記事が欲しいかとかコメントもらえると楽なので、突っ込みくださいw&lt;/p&gt;
&lt;p&gt;最後は、完全に私用ですね。Splatoonにはまってますw
SとA+を行ったり来たりで。。。&lt;/p&gt;
&lt;p&gt;ということで、今年はあと、数時間ですが、色々とお世話になりました。 この場を借りてお礼申し上げます。&lt;/p&gt;
&lt;p&gt;来年も、いろんな方に絡んでいくとは思いますが、よろしくお願いいたします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>2015年のElasticsearch</title>
      <link>https://blog.johtani.info/blog/2015/12/25/about-elasticsearch-in-2015/</link>
      <pubDate>Fri, 25 Dec 2015 13:29:54 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/12/25/about-elasticsearch-in-2015/</guid>
      <description>&lt;p&gt;今年最後のAdvent Calendarとなります。&lt;/p&gt;
&lt;p&gt;この記事は&lt;a href=&#34;http://qiita.com/advent-calendar/2015/elasticsearch&#34;&gt;Elasticsearch Advent Calendar 2015&lt;/a&gt;の最終日のエントリです。&lt;/p&gt;
&lt;p&gt;簡単に今年の変遷を、Elasticsearchをベースに振り返ってみようかと思います。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今年最後のAdvent Calendarとなります。&lt;/p&gt;
&lt;p&gt;この記事は&lt;a href=&#34;http://qiita.com/advent-calendar/2015/elasticsearch&#34;&gt;Elasticsearch Advent Calendar 2015&lt;/a&gt;の最終日のエントリです。&lt;/p&gt;
&lt;p&gt;簡単に今年の変遷を、Elasticsearchをベースに振り返ってみようかと思います。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;kibana-4リリース2月&#34;&gt;Kibana 4リリース（2月）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.johtani.info/blog/2015/02/20/kibana-4-literally-ja/&#34;&gt;Kibana 4（日本語訳）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;いきなり、Elasticsearchではない話題ですが。
AggregationベースのKibanaがリリースされました。
画面が黒くないというので、話題になりましたw
12月末時点では、4.3.1になっています。
Sub Aggregationによる強力なグラフ表示や異なるインデックスに対するグラフを
一つのダッシュボードに表示できるといったことができるようになりました。&lt;/p&gt;
&lt;h2 id=&#34;セキュリティ向けプラグインshieldのリリース2月&#34;&gt;セキュリティ向けプラグインShieldのリリース（2月）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.johtani.info/blog/2015/02/27/you-know-for-security-shield-goes-ga-ja/&#34;&gt;セキュリティ向けプラグインShieldのリリース（日本語訳）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;商用向けのプラグインの第2弾です。
セキュリティ強化のためのプラグインで、いろいろなところで引き合いがあったりします。&lt;/p&gt;
&lt;h2 id=&#34;初のユーザカンファレンスelasticon開催3月&#34;&gt;初のユーザカンファレンス、Elastic{ON}開催（3月）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.johtani.info/blog/2015/03/11/attend-elasticon/&#34;&gt;#elasticon に参加中&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;サンフランシスコで、弊社初のカンファレンスが開催されました。（来年（2016年）もサンフランシスコで開催されます。）
また、ここで、以下の2点の発表がありました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ロゴ及びドメイン名などの変更&lt;/li&gt;
&lt;li&gt;Foundのジョイン&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;約1300名が参加する大イベントでした。
初の渡米で楽しんできましたが、ドメインの切り替えなどは大変でした。。。
まだ、ロゴを変えて1年経ってないということが実感できてないです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/found&#34;&gt;Found&lt;/a&gt;のジョインはまだまだ、日本で知名度が出てないかもなぁと。
もっと広めないと。
利点としては以下の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;新バージョンがすぐに利用可能に。また、バージョンアップも画面で指定可能&lt;/li&gt;
&lt;li&gt;公式プラグイン＋その他いくつかのプラグインが利用可能&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;elasticsearch-15-リリース4月&#34;&gt;Elasticsearch 1.5 リリース（4月）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.johtani.info/blog/2015/04/01/elasticsearch-1-5-0-released-ja/&#34;&gt;Elasticsearch 1.5.0リリース（日本語訳）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;主に、resiliencyに関する改良になります。
毎リリースで信頼性向上につながる改良が含まれる形になっています。
このリリースの近くで初の東京の外での勉強会を&lt;a href=&#34;http://blog.johtani.info/blog/2015/04/04/elasticsearch-study-session-at-nagoya/&#34;&gt;名古屋で開催&lt;/a&gt;したりもしました。&lt;/p&gt;
&lt;h2 id=&#34;discusselasticcoをオープン5月&#34;&gt;discuss.elastic.coをオープン（5月）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://discuss.elastic.co&#34;&gt;https://discuss.elastic.co&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これまでは、Google Groupsを使っていましたが、Elasticが提供しているプロダクトが
別々のグループであったために、プロダクトにまたがった質問がやりにくかったり、検索がしにくかったりという問題点がありました。
今では、過去のGoogle Groupsのデータも移行されているので、是非参加して、質問・回答してみてください。
&lt;a href=&#34;https://discuss.elastic.co/c/in-your-native-tongue/18-category&#34;&gt;日本語でやりとりできるカテゴリ&lt;/a&gt;もあるので、どんどん、やりとりしていただければ。&lt;/p&gt;
&lt;h2 id=&#34;elasticsearch-16-リリース6月&#34;&gt;Elasticsearch 1.6 リリース（6月）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.johtani.info/blog/2015/06/10/elasticsearch-1-6-0-released-ja/&#34;&gt;Elasticsearch 1.6.0リリース（日本語訳）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2.0に向けたUpgrade APIが含まれるなど、次期リリースに向けた準備が整いつつあるリリースでした。
他にもsynced flushの取り込みやレスポンスのJSONのフィルタリングなど細かな改善も取り込まれています。&lt;/p&gt;
&lt;h2 id=&#34;found-premiumとstandardリリース7月&#34;&gt;Found PremiumとStandardリリース（7月）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.johtani.info/blog/2015/07/07/we-just-made-found-more-awesome-ja/&#34;&gt;さらに進化したFound（日本語訳）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Foundに弊社のサポートチームがサポートできるプレミアムが追加されました。
これにより、商用プラグインとして提供しているShieldが（現在はWatcherも）利用できるなど、
より便利になりました。また、Kibana 4も無料で提供されていたりします。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/found/pricing&#34;&gt;小さなサイズのものですと、無料で試していただける&lt;/a&gt;ものもあるので、試してみてもらえればと。&lt;/p&gt;
&lt;h2 id=&#34;elasticsearch-17-リリース7月&#34;&gt;Elasticsearch 1.7 リリース（7月）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.johtani.info/blog/2015/07/22/elasticsearch-1-7-0-and-1-6-1-released-ja/&#34;&gt;Elasticsearch 1.7.0 および 1.6.1リリース（日本語訳）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;1.x系、最後のリリースでした。
小さい改善ですが、セキュリティフィックス、クラスタの安定化に寄与する機能改善が含まれています。&lt;/p&gt;
&lt;p&gt;この&lt;a href=&#34;http://blog.johtani.info/blog/2015/07/16/kansai-1st-elasticsearch-jp/&#34;&gt;リリース直前に大阪、京都で勉強会も開催してみました。&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;elasticsearch-200-beta1-リリース8月&#34;&gt;Elasticsearch 2.0.0-beta1 リリース（8月）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.johtani.info/blog/2015/08/27/elasticsearch-2-0-0-beta1-released-ja/&#34;&gt;Elasticsearch 2.0.0-beta1リリース（日本語訳）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;待ちに待った、Lucene 5ベースのElasticsearchの登場でした。
doc_valuesがデフォルトになったり、エラーが構造化されて見やすくなったり、
Pipeline Aggregationが導入されたりしています。
また、問題点の洗い出しも兼ねて、ベータリリースとして、本リリースまでに多くのIssueをあげていただきました。&lt;/p&gt;
&lt;h2 id=&#34;elasticsearch-200-リリース10月&#34;&gt;Elasticsearch 2.0.0 リリース（10月）&lt;/h2&gt;
&lt;p&gt;2.0の本リリースです。リリースまでに、beta1、2及び、rc1がリリースされました。&lt;/p&gt;
&lt;p&gt;追加された機能や目玉の改善については「&lt;a href=&#34;https://speakerdeck.com/johtani/elasticsearch-2-dot-0falseshao-jie&#34;&gt;Elasticsearch 2.0の紹介&lt;/a&gt;」のスライドを参考にしていただければと。&lt;/p&gt;
&lt;p&gt;また、Elasticsearch 2.0のリリースに合わせて、商用プラグインやLogstash、Kibanaの新しいバージョンがリリースされました。
Kibanaなどは、プラットフォームとしての機能を備え、Senseや&lt;a href=&#34;http://blog.johtani.info/blog/2015/12/01/introduction-timelion/&#34;&gt;Timelion&lt;/a&gt;と言ったプラグインアプリもリリースされています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.johtani.info/blog/2015/10/29/logstash-2-0-0-released-ja/&#34;&gt;Logstash 2.0.0リリース（日本語訳）
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.johtani.info/blog/2015/10/29/kibana-4-2-0-ja/&#34;&gt;Kibana 4.2.0リリース（日本語訳）
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.johtani.info/blog/2015/10/30/sense-2-0-0-beta1-ja/&#34;&gt;Senseの歴史 - Sense 2.0.0-beta1の紹介(日本語訳)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.johtani.info/blog/2015/10/30/shield-watcher-and-marvel-2-0-ga-released-ja/&#34;&gt;Shield、Watcher、Marvel 2.0.0 GAリリース（日本語訳）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;elasticsearch-210-リリース11月&#34;&gt;Elasticsearch 2.1.0 リリース（11月）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-2-1-0-and-2-0-1-released&#34;&gt;Elasticsearch 2.1.0 and 2.0.1 released&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;beats-100のリリース11月&#34;&gt;Beats 1.0.0のリリース（11月）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/beats-1-0-0&#34;&gt;The Beats 1.0.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Go言語で書かれた軽量データシッパーになります。
パケットをキャプチャしてElasticsearchに送る&lt;a href=&#34;https://www.elastic.co/downloads/beats/packetbeat&#34;&gt;Packetbeat&lt;/a&gt;、
topコマンドで取れるデータなどを&lt;a href=&#34;https://www.elastic.co/downloads/beats/topbeat&#34;&gt;Topbeat&lt;/a&gt;、
ログファイルなどを取り込み配送する&lt;a href=&#34;https://www.elastic.co/downloads/beats/filebeat&#34;&gt;Filebeat&lt;/a&gt;がリリースされました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/beats/libbeat/current/index.html&#34;&gt;libbeat&lt;/a&gt;と呼ばれる、
ベースとなるライブラリを元にしたプロダクトで、Logstashのエージェントのような使い方もできるようになっています。&lt;/p&gt;
&lt;p&gt;Go言語に興味のある方などは、調べてみてはいかがでしょう？&lt;/p&gt;
&lt;h2 id=&#34;来年は&#34;&gt;来年は？&lt;/h2&gt;
&lt;p&gt;日本では、&lt;a href=&#34;https://elasticsearch.doorkeeper.jp/events/36330&#34;&gt;1/7に第14回Elasticsearch勉強会&lt;/a&gt;を開催します。
すでに、38名のキャンセル待ちとなっていますが、おそらく、年明けにキャンセルがそこそこ出ると思うので、まだ間に合うんじゃないかなぁと。&lt;/p&gt;
&lt;p&gt;会社としては、&lt;a href=&#34;https://www.elastic.co/elasticon/conf/2016/sf&#34;&gt;Elastic{ON}16&lt;/a&gt;が控えています。参加される方は、ぜひ現地で声をかけてください！！&lt;/p&gt;
&lt;p&gt;その他にもイベント、オープンソースカンファレンス（まずは、&lt;a href=&#34;https://www.ospn.jp/osc2016.enterprise-osaka/&#34;&gt;大阪&lt;/a&gt;、&lt;a href=&#34;http://www.ospn.jp/osc2016-spring/&#34;&gt;東京&lt;/a&gt;）などに出没する予定ですので、こちらも参加していただければと。&lt;/p&gt;
&lt;p&gt;では、また来年のAdvent Calendarでお会いしましょう！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Timelionの紹介 - Elasticsearch Advent Calendar 2015 1日目</title>
      <link>https://blog.johtani.info/blog/2015/12/01/introduction-timelion/</link>
      <pubDate>Tue, 01 Dec 2015 11:28:11 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/12/01/introduction-timelion/</guid>
      <description>&lt;p&gt;こんにちは、&lt;a href=&#34;https://twitter.com/johtani&#34;&gt;@johtani&lt;/a&gt;です。&lt;/p&gt;
&lt;p&gt;早いもので、師走です。今年もあと少しとなりました（今月が一番忙しかったりしますが。。。）。
ということで、Advent Calendarの季節が始まりました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;こんにちは、&lt;a href=&#34;https://twitter.com/johtani&#34;&gt;@johtani&lt;/a&gt;です。&lt;/p&gt;
&lt;p&gt;早いもので、師走です。今年もあと少しとなりました（今月が一番忙しかったりしますが。。。）。
ということで、Advent Calendarの季節が始まりました。&lt;/p&gt;
&lt;p&gt;この記事は&lt;a href=&#34;http://qiita.com/advent-calendar/2015/elasticsearch&#34;&gt;Elasticsearch Advent Calendar 2015&lt;/a&gt;の1日目のエントリです。&lt;/p&gt;
&lt;p&gt;今日は、最近公開された&lt;a href=&#34;https://github.com/elastic/timelion&#34;&gt;Timelion&lt;/a&gt;の紹介をしたいと思います。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;timelion&#34;&gt;Timelion?&lt;/h2&gt;
&lt;p&gt;11/12に公開されたばかりのアプリになります。（&lt;a href=&#34;https://www.elastic.co/blog/timelion-timeline&#34;&gt;公式のブログはこちら&lt;/a&gt;。ブログでは動画による説明もあり）&lt;/p&gt;
&lt;p&gt;Kibanaにプラグインとしてインストールすることで使用することができるようになるアプリです。
Timelionと書いて「Timeline」と読むようです。
Kibanaとは異なるグラフ描画のプラグインになっています。&lt;/p&gt;
&lt;h3 id=&#34;kibana-42からプラットフォーム化&#34;&gt;Kibana 4.2からプラットフォーム化&lt;/h3&gt;
&lt;p&gt;Kibana 4.2から、Kibanaにプラグイン機構が導入されました。
Kibanaとしての機能以外にも、プラグインとして、アプリを追加できるようになっています。
Timelionもその一つです。&lt;/p&gt;
&lt;h3 id=&#34;インストール&#34;&gt;インストール&lt;/h3&gt;
&lt;p&gt;Timelionを試してみるには、ElasticsearchとKibanaが必要になります。（こちらは、すでにインストールされているとして。。。）&lt;/p&gt;
&lt;p&gt;Kibanaのコマンドを利用して、プラグインをインストールします。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bin/kibana plugin -i kibana/timelion
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;インストールしたら、Kibanaにアクセスして、Timelionを呼び出します。&lt;/p&gt;
&lt;h3 id=&#34;timelionへアクセス&#34;&gt;Timelionへアクセス&lt;/h3&gt;
&lt;p&gt;ブラウザで&lt;code&gt;localhost:5601&lt;/code&gt;にアクセスすると、Kibanaが出てきます。
Kibanaのプラグイン選択のアイコンをクリックし、Timelionのアイコンをクリックします。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20151201/switch_to_timelion.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20151201/switch_to_timelion.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;すると、初期画面はこんな感じです。
直近15分のElasticsearchに入っているデータが全部出てきます。
チュートリアルも出てきてます（初回起動時に出たはず）&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20151201/tutrial_timelion.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20151201/tutrial_timelion.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Kibanaでの検索窓の部分に関数を指定していくことで、グラフが描画できるツールになっています。&lt;/p&gt;
&lt;h3 id=&#34;サンプル気温データを可視化&#34;&gt;サンプル：気温データを可視化&lt;/h3&gt;
&lt;p&gt;百聞は一見に如かずということで、
&lt;a href=&#34;http://www.data.jma.go.jp/gmd/risk/obsdl/index.php&#34;&gt;気象庁のデータ&lt;/a&gt;を使って、
ちょっとしたグラフを書いてみました。
1年間の気温の推移と日照時間になります。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20151201/tenperature_naha_and_sapporo.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20151201/tenperature_naha_and_sapporo.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;上のグラフが那覇、下グラフが札幌の気温のグラフになります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;赤いライン：最高気温&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;h5 id=&#34;青いラインの最低気温&#34;&gt;青いラインの最低気温&lt;/h5&gt;
&lt;p&gt;気温のグラフになります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;.es(index=&amp;#39;tenki2&amp;#39;, q=&amp;#39;city:naha&amp;#39;, metric=&amp;#39;avg:temperature_min&amp;#39;).label(&amp;#39;min&amp;#39;),
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;.es()&lt;/code&gt;がelasticsearchに対するデータ取得の関数です。
引数は次のような意味になります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;index：対象とするインデックス名&lt;/li&gt;
&lt;li&gt;q：検索クエリ。ここでは、cityというフィールドにnahaで検索。&lt;/li&gt;
&lt;li&gt;metric：描画対象となっているデータの入ったフィールド。temperature_minというフィールドの1日毎の平均値を取得&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最低気温と最高気温は別々のフィールドに格納してあります。最高気温の場合は（temperature_max）を指定します。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.label(min)&lt;/code&gt;で、グラフの凡例の指定です。
残念ながら、日本語の指定は現時点（2015年12月01日時点）ではうまくいかなかったです。（https://github.com/elastic/timelion/issues/17）&lt;/p&gt;
&lt;p&gt;デフォルトでは、線グラフが選択されているので、グラフの種類は特に指定はしていません。
明確に指定する場合は&lt;code&gt;lines()&lt;/code&gt;を指定します。&lt;/p&gt;
&lt;h5 id=&#34;黄色い棒グラフの日照時間&#34;&gt;黄色い棒グラフの日照時間&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;.es(index=&amp;#39;tenki2&amp;#39;, q=&amp;#39;city:naha&amp;#39;, metric=&amp;#39;avg:sunlight&amp;#39;).label(sunlight).bars()
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;.es()&lt;/code&gt;に関しては最低気温のグラフとほぼ一緒です。異なるのは、metricの取得対象のフィールド名です。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.label()&lt;/code&gt;で凡例を指定しています。先程と同様です。&lt;/p&gt;
&lt;p&gt;最後に、棒グラフにしたいため、&lt;code&gt;.bars()&lt;/code&gt;を指定しています。&lt;/p&gt;
&lt;p&gt;その他に用意されている関数について知りたい場合は、Timelionのヘルプを表示すると説明が出てきます。
&lt;code&gt;cusum()&lt;/code&gt;のような値を累積して表示するような関数も用意されています。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20151201/about_help.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20151201/about_help.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;
&lt;p&gt;Kibanaとは少し違うアプローチで時系列データを描画するためのツールとなっています。
線グラフと棒グラフを一つのグラフに描画したりもできますし、
累積のグラフなんかも描画できるようになっています。&lt;/p&gt;
&lt;p&gt;実験的なプロジェクトである、Timelionの紹介でした。
ここでのノウハウがkibanaにフィードバックされると色々と面白いことになるんじゃないかなと。&lt;/p&gt;
&lt;h3 id=&#34;ということで&#34;&gt;ということで、&lt;/h3&gt;
&lt;p&gt;明日は、&lt;a href=&#34;http://qiita.com/zoetro&#34;&gt;zoetro&lt;/a&gt;さんの「Kibanaのプラグインの話」になります。
お楽しみに！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第13回Elasticsearch勉強会を開催しました。#elasticsearchjp</title>
      <link>https://blog.johtani.info/blog/2015/11/10/13th-elasticsearch-jp/</link>
      <pubDate>Tue, 10 Nov 2015 17:22:58 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/11/10/13th-elasticsearch-jp/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://elasticsearch.doorkeeper.jp/events/33631&#34;&gt;第13回Elasticsearch勉強会&lt;/a&gt;を開催しました。
スタッフの皆さん、スピーカーの皆さん、会場提供していただいた&lt;a href=&#34;http://recruit-tech.co.jp&#34;&gt;リクルートテクノロジーズさん&lt;/a&gt;、ありがとうございました！
来年もよろしくお願いします！参加していただき盛り上げていただいた参加者の皆さんもありがとうございました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://elasticsearch.doorkeeper.jp/events/33631&#34;&gt;第13回Elasticsearch勉強会&lt;/a&gt;を開催しました。
スタッフの皆さん、スピーカーの皆さん、会場提供していただいた&lt;a href=&#34;http://recruit-tech.co.jp&#34;&gt;リクルートテクノロジーズさん&lt;/a&gt;、ありがとうございました！
来年もよろしくお願いします！参加していただき盛り上げていただいた参加者の皆さんもありがとうございました。&lt;/p&gt;
&lt;p&gt;7月同様、&lt;a href=&#34;http://samuraism.com&#34;&gt;サムライズム&lt;/a&gt;の&lt;a href=&#34;https://twitter.com/yusuke&#34;&gt;@yusuke&lt;/a&gt;さんに
テキスト翻訳していただき、大変助かりました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h3 id=&#34;チェックイン数など&#34;&gt;チェックイン数など&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;チェックインした人：100名&lt;/li&gt;
&lt;li&gt;キャンセルしなかった人：36名&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;でした。
今回は当日の時点でキャンセル待ちがない状態にしていました。
雨もあって、これなかった人もいるのでしょうか。&lt;/p&gt;
&lt;h2 id=&#34;beyond-the-basics-with-elasticsearch--honza-král--elastic&#34;&gt;&amp;ldquo;Beyond the basics with Elasticsearch&amp;rdquo; / Honza Král / Elastic&lt;/h2&gt;
&lt;p&gt;スライド：https://speakerdeck.com/elasticsearch/beyond-the-basics-with-elasticsearch&lt;br&gt;
参考ビデオ（別のカンファレンスで話した時のビデオ）：https://www.youtube.com/watch?v=yIixWzjTNog&lt;/p&gt;
&lt;p&gt;Pycon HKでアジアに来ていたHonzaに、ついでに日本で話をしてもらうという企画で、
前回から1カ月足らずでの開催となりました。
Elasticsearchの基本的な検索機能とは別の機能に関して少し話をしてもらった感じです。
&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/search-percolate.html&#34;&gt;Percolator&lt;/a&gt;と&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html&#34;&gt;Aggregation&lt;/a&gt;の話でした。&lt;/p&gt;
&lt;p&gt;詳しくはビデオやスライドを見てもらうのがいいかなと。&lt;/p&gt;
&lt;h2 id=&#34;how-did-we-use-foundno-for-our-services--株式会社アイリッジtakuya-noguchi-さん-tn961ir&#34;&gt;&amp;ldquo;How did we use Found.no for our services?&amp;rdquo; / 株式会社アイリッジ　Takuya Noguchi さん @tn961ir&lt;/h2&gt;
&lt;p&gt;スライド：未定&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Foundユーザー。1.7までの話。&lt;/li&gt;
&lt;li&gt;社内で独自にクラスタを構築していたが、managed serviceを利用したいと思っていた。&lt;/li&gt;
&lt;li&gt;Found用のACLがShieldに&lt;/li&gt;
&lt;li&gt;マルチバイトのインデックス名とかも使いたいが、Nginxとの連携でちょっと。。。&lt;/li&gt;
&lt;li&gt;セキュリティ関連の話も。Securityに関する報告はこういうものも用意されてるので、こちらに相談してもらうのがいいかも。https://www.elastic.co/community/security&lt;/li&gt;
&lt;li&gt;要望がいくつか。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;ログ収集の仕組みを再考しようあとマウンテンビューに行ってきました--acroquest-technology株式会社-谷本-心さん-cero_t&#34;&gt;&amp;ldquo;ログ収集の仕組みを再考しよう！　あとマウンテンビューに行ってきました。&amp;rdquo; / Acroquest Technology株式会社 谷本 心さん @cero_t&lt;/h2&gt;
&lt;p&gt;スライド：http://www.slideshare.net/shintanimoto/lets-reconsider-about-collecting-logs-plus-visiting-elasticmoutain-view&lt;/p&gt;
&lt;p&gt;ログの小話から始まり、ログに関する考え方とかを披露してもらいました。
さらに踏み込んだログの活用の方法の話になるかと思いきや、
思いっきり話が飛んで、マウンテンビューのElasticオフィスに遊びに行った写真が出てきましたw&lt;/p&gt;
&lt;p&gt;写真の後は、弊社のTanya（&lt;a href=&#34;https://www.elastic.co/elasticon/tour/2015/tokyo&#34;&gt;来月のElastic{ON} Tour Tokyo&lt;/a&gt;で来日予定）から
聞いた弊社製品に関する話をしていただきました。
きっと、Beatsに関して次は話してくれるんだろうなぁ（棒）。
流れ的には、&lt;a href=&#34;https://www.elastic.co/elasticon/conf/2016/sf&#34;&gt;来年の2月にサンフランシスコで開催されるElastic{ON}16&lt;/a&gt;につながりそうだったので、ここで宣伝しときますね。
今年3月に開催されたイベントには残念ながら日本の方はいなかったので、次回は日本の方がいると嬉しいなぁと。&lt;/p&gt;
&lt;h2 id=&#34;lt-elasticsearch-を使った単語共起頻度の計算--株式会社はてなidtakuya-a-さん&#34;&gt;LT &amp;ldquo;「Elasticsearch を使った単語共起頻度の計算」&amp;rdquo; / 株式会社はてな　id:takuya-a さん&lt;/h2&gt;
&lt;p&gt;スライド：未定&lt;/p&gt;
&lt;p&gt;一風変わったElasticsearchの使い方的な話でした。
検索用にデータを登録してあるElasticsearchから単語の頻度情報を抜き出して、
別のインデックスに登録するという感じでしょうか。
こういうのが、実は、Elasticsearchに機能としてあると便利だったりするのかもなぁと思ってみたり。&lt;/p&gt;
&lt;p&gt;LTよりはちょっと長かったですかねw&lt;/p&gt;
&lt;h2 id=&#34;その他感想などのブログ&#34;&gt;その他、感想などのブログ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://arika.hateblo.jp/entry/2015/11/09/204652&#34;&gt;elasticsearch勉強会&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ宣伝&#34;&gt;まとめ＋宣伝&lt;/h2&gt;
&lt;p&gt;今回も@yusukeさんのテキスト翻訳に助けていただきました。ほんとありがとうございます。
今年の勉強会はこれがラストになります。
来月は、トレーニングと&lt;a href=&#34;https://www.elastic.co/elasticon/tour/2015/tokyo&#34;&gt;Elastic{ON} Tour Tokyo&lt;/a&gt;があるので忙しくなりそうですが、
参加予定の方は楽しみにしていてください！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Operations : &lt;a href=&#34;http://training.elastic.co/class/Operations/Japan/Dec&#34;&gt;http://training.elastic.co/class/Operations/Japan/Dec&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Developer : &lt;a href=&#34;http://training.elastic.co/class/Developer/Japan/Dec&#34;&gt;http://training.elastic.co/class/Developer/Japan/Dec&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Senseの歴史 - Sense 2.0.0-beta1の紹介(日本語訳)</title>
      <link>https://blog.johtani.info/blog/2015/10/30/sense-2-0-0-beta1-ja/</link>
      <pubDate>Fri, 30 Oct 2015 17:55:06 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/10/30/sense-2-0-0-beta1-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/sense-2-0-0-beta1&#34;&gt;The Story of Sense - Announcing Sense 2.0.0-beta1&lt;/a&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;誕生&#34;&gt;誕生&lt;/h2&gt;
&lt;p&gt;よくある良いプロジェクト同様、Senseもビールを飲みながら考えつきました。
&lt;a href=&#34;https://en.wikipedia.org/wiki/Amstel&#34;&gt;Amstel&lt;/a&gt;での手漕ぎボートのセッションの後で。
友人の&lt;a href=&#34;https://twitter.com/jkaizer&#34;&gt;Jasper&lt;/a&gt;と私はJasperの&lt;a href=&#34;http://q42.nl/&#34;&gt;会社&lt;/a&gt;で毎年行われる
&lt;a href=&#34;http://w00t.camp/&#34;&gt;ハッカソン&lt;/a&gt;について話をしていました。
このハッカソンはどのようなアイデアでどんなチームで行うかを聞き取りされる、厳密なハッカソンです。
その時、私とJasperはChromeブラウザに別のヒストリーを表示するという作業をやると&lt;a href=&#34;https://twitter.com/anneveling&#34;&gt;Anne Veling&lt;/a&gt;に話をしていました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/sense-2-0-0-beta1&#34;&gt;The Story of Sense - Announcing Sense 2.0.0-beta1&lt;/a&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;誕生&#34;&gt;誕生&lt;/h2&gt;
&lt;p&gt;よくある良いプロジェクト同様、Senseもビールを飲みながら考えつきました。
&lt;a href=&#34;https://en.wikipedia.org/wiki/Amstel&#34;&gt;Amstel&lt;/a&gt;での手漕ぎボートのセッションの後で。
友人の&lt;a href=&#34;https://twitter.com/jkaizer&#34;&gt;Jasper&lt;/a&gt;と私はJasperの&lt;a href=&#34;http://q42.nl/&#34;&gt;会社&lt;/a&gt;で毎年行われる
&lt;a href=&#34;http://w00t.camp/&#34;&gt;ハッカソン&lt;/a&gt;について話をしていました。
このハッカソンはどのようなアイデアでどんなチームで行うかを聞き取りされる、厳密なハッカソンです。
その時、私とJasperはChromeブラウザに別のヒストリーを表示するという作業をやると&lt;a href=&#34;https://twitter.com/anneveling&#34;&gt;Anne Veling&lt;/a&gt;に話をしていました。&lt;/p&gt;
&lt;p&gt;Jasperと私はElasticsearchのユーザでしたが、リッチなREST APIにリクエストを送信するための
便利なツールがないと知っていました。
恥ずべきことに、cURLコマンドを利用するターミナルがその時の一番良いツールでした。
皆さん、ターミナルでボディつきのリクエストをサブミットするのがどのくらい不便かというのをわかるために、
5秒ほどターミナルで実行してみてください。
タイプミスのような単純なことでさえ、すべてのコマンドを再タイプしなければならなかったり、
複数行サポートのターミナルと戦ったりです。
ウェブベースのJSONエディタを見つけ出して、それをベースにすることが必要でした。&lt;/p&gt;
&lt;h2 id=&#34;終わりなきウィークエンド&#34;&gt;終わりなきウィークエンド&lt;/h2&gt;
&lt;p&gt;リサーチをして、Anneに電話しました。
私は彼に、History Pageのプロジェクトにもコミットするが、
Elasticsearchユーザなので、便利なコンソールを開発する時間も欲しいという話をしました。
私たちは、&lt;a href=&#34;https://ace.c9.io/&#34;&gt;Ace&lt;/a&gt;オンラインエディタを利用して、
自動でAPIを認識するナレッジベースを構築し、
コンテキストに沿ったサジェストを大なうようにしました。
Anneはすぐに、それが素晴らしいと同意してくれました。
しかし、彼は、ハッカソンの基本的なルール（週末にそれが終わる必要がある）に違反しているので、
そのアイデアを却下するしかありませんでした。
確かに、私たちが提案していたものは行えませんでした。
最後に、私たちは、ChromeのHistory Pageの素晴らしい置き換えについて実装しました。&lt;/p&gt;
&lt;p&gt;それでも、私はチャレンジし、それが終わるであろうことを終わるであろうことを証明しなければなりませんでした。
次の週末（といくつかの終業後 :)）に、私はそれを作りました。
Senseの誕生です。
それは、まだバグだらけでしたが、動きました。
これを見せるとみんな興奮しました。&lt;/p&gt;
&lt;h2 id=&#34;初期&#34;&gt;初期&lt;/h2&gt;
&lt;p&gt;Knowledge Baseの拡張とバグのフィックスで数日を過ごしました。
Senseは広まり始め、ずっと古いバグのあるバージョンを利用しないといけないのかと私は恐れました。
SenseをChromeのExtentionとしてリリースすることを決め、リリースすると自動的に更新されるようにしました。
History Panelのような機能を一つづつ追加するようにしました。&lt;/p&gt;
&lt;p&gt;Elasticにジョインしてから、会社の人たちがSenseを使用しているということを聞き、とても幸せでした。
特に、&lt;a href=&#34;https://twitter.com/clintongormley&#34;&gt;Clint&lt;/a&gt;と話をしたときのことを覚えています。
彼は、&amp;ldquo;You know what Sense should do? It should use this format and allow you to have multiple requests in the editor&amp;rdquo;
「Senseになにをすべきかわかる？フォーマットを使うべきだし、エディタで複数のリクエストを持つようにするべきだ」
と言いました。
もちろん、その他のチャレンジも行いました。これは、簡単なものではなく、Aceの詳細を知る必要がありました。
それは新しいAceモード（Aceによって利用されているハイライティングロジック）です。
これは、Senseのサジェストエンジンに密に統合されました。&lt;/p&gt;
&lt;p&gt;次のものが古いSenseのスクリーンショットです。&lt;/p&gt;
&lt;p&gt;画像あり。Figure 1. Sense 0.7
&lt;a href=&#34;https://www.elastic.co/blog/sense-2-0-0-beta1&#34;&gt;※画像に関しては原文をご覧ください。&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;APIのURLを入力すると、JSONのボディが入力されます。
うまく切り離すことができ、AceのスタンダードJSONモードを使っていました。
しかし、ここで、次のようなフォーマットをどうやってサポートするか考える必要がありました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;GET _cluster/health
POST index/_settings
{
  &amp;#34;index&amp;#34;: { &amp;#34;number_of_replicas&amp;#34;: 3 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これは、Aceが3つの異なるものをどうやってパースするかを知る必要があるということです。
HTTPメソッドとURLとJSONボディです。
また、困ったことに、前に説明した前に説明した通り、明らかに別々にはならないものでした。
JSONボディが完全であることを知る唯一の方法はかっこを数えることです。
それは、いくつかの作業とAceのカスタマイズが必要でしたが、それらを切り離すことができました。
そして、Senseのシンタックスが生まれたのです（Thanks Clint!）&lt;/p&gt;
&lt;h2 id=&#34;marvel時代&#34;&gt;Marvel時代&lt;/h2&gt;
&lt;p&gt;就業時間中、私の優先すべき仕事は&lt;a href=&#34;https://www.elastic.co/products/marvel&#34;&gt;Marvel&lt;/a&gt;の開発になりました。
これは、Elasticsearchのための管理と監視のためのソリューションです。
（side note: Marvelは生まれ変わっています。（&amp;quot;&lt;a href=&#34;https://www.elastic.co/blog/shield-watcher-and-marvel-2-0-ga-released&#34;&gt;Shield, Watcher, and Marvel 2.0.0 GA Released&lt;/a&gt;&amp;quot;））
Marvelは開発環境ではフリーなので、MarvelにSenseを組み込むことにしました。
これにより、Senseの開発が日中も行えるようになり、多くのユーザに利用され始めました。
また、Senseは実際に真の&lt;a href=&#34;https://twitter.com/spenceralger&#34;&gt;JavaScript開発者&lt;/a&gt;によって開発されました。
彼は、コードをクリーンにし、ブラウザにおける最新の技術を私に教えてくれました。&lt;/p&gt;
&lt;p&gt;この期間のSenseは数回書き換えられています。
最も顕著なものは、個別のURLとJSONのサジェストエンジンを書き換えて、
1つのサジェストエンジンにしこれらのコンテキストで動作するようにし、さらに3つ目のコンテキスト（URLパラメータ）を追加したことです。&lt;/p&gt;
&lt;p&gt;新しいエンジンはまた、複数のサジェストコンテキストをメンテナンスするのが簡単になりました。
例えば、&lt;code&gt;_search API&lt;/code&gt;のソートパラメータを考えます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;GET _search
{
  &amp;#34;sort&amp;#34;: [
     &amp;#34;timestamp&amp;#34;: &amp;#34;desc&amp;#34;,
     &amp;#34;price&amp;#34;: {
        &amp;#34;order&amp;#34;: &amp;#34;desc&amp;#34;.
        &amp;#34;missing&amp;#34;: &amp;#34;last&amp;#34;
     },
     &amp;#34;nested_filter&amp;#34;: { &amp;#34;term&amp;#34;: { ... }},
     &amp;#34;_score&amp;#34;
  ]
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ユーザがどこにいるかによって、Senseは単純な値（&lt;code&gt;_score&lt;/code&gt;のような）か、
複雑な構造（&lt;code&gt;order&lt;/code&gt;と&lt;code&gt;missing&lt;/code&gt;のような）やフィルタ（&lt;code&gt;nested_filter&lt;/code&gt;のような）も
サジェストする必要があります。
これらのサジェストのパスが一度に処理され、無関係なものは除外されます。&lt;/p&gt;
&lt;h2 id=&#34;sense-20の紹介&#34;&gt;Sense 2.0の紹介！&lt;/h2&gt;
&lt;p&gt;Marvel 1.xはKibana 3.0をベースにしていました。
これは、データの探索やダッシュボードツールとして素晴らしいものでした。
しかし、Kibanaチームはさらに素晴らしいものを出しました。
Kibana 4.xはElasticsearchをバックエンドとするUIアプリを簡単に構築することができる
プラットフォームとして設計されています。
実際に、&lt;a href=&#34;https://www.elastic.co/guide/en/marvel/current/index.html&#34;&gt;Marvel 2.0&lt;/a&gt;はKibanaの
プラットフォームで利用できる最初のアプリです。&lt;/p&gt;
&lt;p&gt;Senseの話に戻します。
ElasticsearchのAPIとやりとりする一般的なコンソールです。
これをKibanaのアプリぴったりだと気付きました。
ということで、&lt;a href=&#34;https://github.com/elastic/sense/&#34;&gt;Sense 2.0&lt;/a&gt;をKibanaアプリとしてオープンソースで公開しました。
開発及び本番環境で利用してください。&lt;/p&gt;
&lt;p&gt;Figure 2. Screenshot Sense 2.0
&lt;a href=&#34;https://www.elastic.co/blog/sense-2-0-0-beta1&#34;&gt;※画像に関しては原文をご覧ください。&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;リリースのハイライト&#34;&gt;リリースのハイライト&lt;/h2&gt;
&lt;p&gt;Sense 2.0の新しい機能をここで簡単に紹介します。
（すべての変更点については&lt;a href=&#34;https://www.elastic.co/guide/en/sense/current/release_notes.html#_2_0_0_beta1&#34;&gt;こちら&lt;/a&gt;をご覧ください。）&lt;/p&gt;
&lt;h4 id=&#34;elasticsearch-20&#34;&gt;Elasticsearch 2.0&lt;/h4&gt;
&lt;p&gt;SenseのナレッジベースをElasticsearch 2.0サポートに更新しました。
新しいPipeline aggregationにも対応しています。&lt;/p&gt;
&lt;h4 id=&#34;複数リクエストの実行&#34;&gt;複数リクエストの実行&lt;/h4&gt;
&lt;p&gt;テストやいくつかの一連のコマンドを繰り返し実行したい時があるでしょう。
その時に、それら全てをSenseに記述し、
実行したいリクエストを選択状態にしてElasticsearchにリクエストできます。&lt;/p&gt;
&lt;p&gt;Figure 3. Submit multiple requests
&lt;a href=&#34;https://www.elastic.co/blog/sense-2-0-0-beta1&#34;&gt;※画像に関しては原文をご覧ください。&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Senseは、Elasticsearchにリクエストを一つずつ送信し、それぞれの出力結果を右のパネルに表示します。
これは、問題のデバッグや複数のシナリオでのクエリの組み合わせの実行に非常に便利です。&lt;/p&gt;
&lt;h4 id=&#34;複数リクエストのコピーペースト&#34;&gt;複数リクエストのコピーペースト&lt;/h4&gt;
&lt;p&gt;複数リクストを選択し、フォーマットしたり、cURLのコマンドとしてコピーすることも可能です。&lt;/p&gt;
&lt;p&gt;Figure 4. Copy multiple requests as cURL
&lt;a href=&#34;https://www.elastic.co/blog/sense-2-0-0-beta1&#34;&gt;※画像に関しては原文をご覧ください。&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# Delete all data in the `website` index
curl -XDELETE &amp;#34;http://localhost:9200/website&amp;#34;
# Create a document with ID 123
curl -XPUT &amp;#34;http://localhost:9200/website/blog/123&amp;#34; -d&amp;#39;
{
  &amp;#34;title&amp;#34;: &amp;#34;My first blog entry&amp;#34;,
  &amp;#34;text&amp;#34;:  &amp;#34;Just trying this out...&amp;#34;,
  &amp;#34;date&amp;#34;:  &amp;#34;2014/01/01&amp;#34;
}&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;もちろん、複数のcURLコマンドをコピーしてSenseにペースとすると、Senseはそれらをパースしてくれます。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Sense 2.0.0のベータリリースです。
実際に多くの作業が終わった認識です。すぐにGAが出るでしょう。&lt;/p&gt;
&lt;p&gt;Sense 2.0を知り、試していただくために、新しい&lt;a href=&#34;https://www.elastic.co/guide/en/sense/current/index.html&#34;&gt;ドキュメント&lt;/a&gt;を参考にしてください。
バグやリクエストがある場合は、&lt;a href=&#34;https://discuss.elastic.co/c/ecosystem&#34;&gt;フォーラム&lt;/a&gt;や&lt;a href=&#34;https://github.com/elastic/sense/issues&#34;&gt;GitHubのIssue&lt;/a&gt;に登録をお願いします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Shield、Watcher、Marvel 2.0.0 GAリリース（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2015/10/30/shield-watcher-and-marvel-2-0-ga-released-ja/</link>
      <pubDate>Fri, 30 Oct 2015 16:21:31 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/10/30/shield-watcher-and-marvel-2-0-ga-released-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/shield-watcher-and-marvel-2-0-ga-released&#34;&gt;Shield, Watcher, and Marvel 2.0.0 GA Released&lt;/a&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;本日（10/28）Shield、WatcherおよびMarvel 2.0をリリースしました。
これが、&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-2-0-0-released&#34;&gt;Elasticsearch 2.0&lt;/a&gt;に対応したこれらのプラグインの最初のリリースです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/shield-watcher-and-marvel-2-0-ga-released&#34;&gt;Shield, Watcher, and Marvel 2.0.0 GA Released&lt;/a&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;本日（10/28）Shield、WatcherおよびMarvel 2.0をリリースしました。
これが、&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-2-0-0-released&#34;&gt;Elasticsearch 2.0&lt;/a&gt;に対応したこれらのプラグインの最初のリリースです。&lt;/p&gt;
&lt;p&gt;Elasticsearch 2.0対応のほかに、ShieldとWatcher 2.0は、
セキュリティとアラートを拡張するいくつかの新しい素敵な機能も備えています。&lt;/p&gt;
&lt;h2 id=&#34;shield&#34;&gt;Shield&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;拡張可能なレルム - Sheild 1.xはユーザ認証のコア的なものを定義するのにフォーカスし
3つの認証メカニズム（&lt;em&gt;esusers&lt;/em&gt;、LDAP/AD、PKI）を提供しました。
これらを提供することで、多くのユーザおよびユースケースをカバー出来ましたが、
追加の認証メカニズムを統合する必要があることもわかっていました。
ということで、Shieldのレルムベースの認証システムをユーザが利用、拡張できるようにオープンにし、
ユーザ認証を扱うためのレルム実装をプラグインとして拡張できるようにしました。
特定もしくはプロプライエタリな認証メカニズムが必要なユーザもShieldの強力な
セキュリティ機能（ロールベースの認証、セキュアな通信など）をフルに活用できるようになりました。
カスタムレルムの詳細については、&lt;a href=&#34;https://www.elastic.co/guide/en/shield/current/custom-realms.html&#34;&gt;こちら&lt;/a&gt;をご覧ください。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;フィールドとドキュメントのACL - Shield 2.0はフィールドとドキュメントレベルのアクセス制御機能を提供します。
これは、ロールごとにアクセス可能なフィールドやドキュメントを定義できます。
この新しい機能は、設定の変更するよりも便利です。
このアクセス制御はElasticsearchのLuceneインデックスという最も低レベルで実装されています。
その結果として、このメンテナンスがより簡単であるだけでなく、より良くなっています。
詳細については&lt;a href=&#34;https://www.elastic.co/guide/en/shield/current/setting-up-field-and-document-level-security.html&#34;&gt;こちら&lt;/a&gt;をご覧ください。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ユーザなりすまし - Shield 2.0で、ユーザなりすましの機能が実装されました。
これは、ユーザ（適切なパーミッションを持った）が、他のユーザになることができ、
それらのユーザのためにリクエストを実行できます。
これは、Elasticsearch上に構築されたアプリケーションがすでにユーザ認証を行いますが、
認可はElasticsearchサイドで行う必要があるような場合に有用です。
このシナリオで、アプリケーションの&amp;quot;main&amp;quot;ユーザを設定でき、正しくなりすましを割り当て、
ElasticsearchにアプリケーションユーザとしてリクエストをElasticsearchに実行させることができます。
詳細については、&lt;a href=&#34;https://www.elastic.co/guide/en/shield/current/submitting-requests-for-other-users.html&#34;&gt;こちら&lt;/a&gt;をご覧ください。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;watcher&#34;&gt;Watcher&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SlackとHipChatインテグレーション - SlackとHipChatはチーム/グループコラボレーションツールです。
これらは、急速に主流になり、組織の主な内部コミュニケーションハブとなっています。
Watcher 2.0はチャンネル/ルームやユーザにこれらのコミュニケーションチャネル経由で、Watchの通知を行うことができるアクションを
実装しました。
&lt;a href=&#34;https://www.elastic.co/guide/en/watcher/current/configuring-slack.html&#34;&gt;slack&lt;/a&gt;や&lt;a href=&#34;https://www.elastic.co/guide/en/watcher/current/configuring-hipchat.html&#34;&gt;hipchat&lt;/a&gt;アクションについてはドキュメントをご覧ください。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Array Compare Condition - 新しいconditionはタイムシリーズのデータのスパイクを検知するのを簡単にします。
&lt;a href=&#34;https://www.elastic.co/guide/en/watcher/current/condition.html#condition-compare&#34;&gt;compare&lt;/a&gt; conditionは1.xで導入されましたが、このコンディションはElasticsearchのダイナミックスクリプト機能を有効にする必要がアンク使えます。
詳細については&lt;a href=&#34;https://www.elastic.co/guide/en/watcher/current/condition.html#condition-array-compare&#34;&gt;array_compare&lt;/a&gt; conditionをご覧ください。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Watchの有効・無効化 - ユーザからの多かったリクエストとして、Watchの無効化がありました。
1.xには、登録済みのWatchを無効にする機能がありませんでした。
これは、Watchを消すか、Watchのトリガーを変更することで回避していました。
これは、全体としてはWatchを管理するのを難しくする回避方法でしかありません。
2.0では、APIを呼び出すだけで、Watchの変更をすることなく、簡単にWatchの有効化・無効化が可能になりました。
これは1.0からあるべき基本的な機能でしたが、ついにこの問題を解決しました。
詳細は&lt;a href=&#34;https://www.elastic.co/guide/en/watcher/current/watch-active-state.html#watch-active-state&#34;&gt;こちら&lt;/a&gt;をご覧ください。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;marvel&#34;&gt;Marvel&lt;/h2&gt;
&lt;p&gt;Marvel 2.0を紹介するのに興奮しています。
Kibana 4をベースとした、再設計されたUIを持っています。
Marvel 1.xで学んだ多くのことを導入し、より使いやすく監視しやすいUIになっています。
ShieldとWatcherと同様に、最初のMarvelのリリースは将来的な成長の基盤となり
Elasticsearch2.0を効率的に管理するための主要なメトリックにフォーカスしています。&lt;/p&gt;
&lt;p&gt;画像あり。
&lt;a href=&#34;https://www.elastic.co/blog/shield-watcher-and-marvel-2-0-ga-released&#34;&gt;※画像に関しては原文をご覧ください。&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;再設計により、インタフェースを6ページに減らしています。&lt;/p&gt;
&lt;h3 id=&#34;cluster-list&#34;&gt;Cluster list&lt;/h3&gt;
&lt;p&gt;画像あり。
&lt;a href=&#34;https://www.elastic.co/blog/shield-watcher-and-marvel-2-0-ga-released&#34;&gt;※画像に関しては原文をご覧ください。&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ユーザやカスタマーの多くは複数のクラスタを利用しています。
新しいMarvelはそれらを集中的にモニタリングする一つのクラスタからそれらを簡単に監視できます。
各クラスタのデータ送信先をこのモニタリングクラスタにするだけです。&lt;/p&gt;
&lt;h3 id=&#34;cluster-overview&#34;&gt;Cluster Overview&lt;/h3&gt;
&lt;p&gt;画像あり。
&lt;a href=&#34;https://www.elastic.co/blog/shield-watcher-and-marvel-2-0-ga-released&#34;&gt;※画像に関しては原文をご覧ください。&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;クラスタオーバービューはある一つのクラスタの主要な性能メトリックを見ることができ、
素早くスパイクを発見できます。
このページはまた、アクティブなシャードのリカバリやリロケーションも見ることができます。&lt;/p&gt;
&lt;h3 id=&#34;indices-list&#34;&gt;Indices List&lt;/h3&gt;
&lt;p&gt;画像あり。
&lt;a href=&#34;https://www.elastic.co/blog/shield-watcher-and-marvel-2-0-ga-released&#34;&gt;※画像に関しては原文をご覧ください。&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;インデックスのリストにはクラスタにあるすべてのインデックスとその属性が表示されます。
テーブルはライブでアップデートされ、フィルタリングやソートも可能です。
一番大きなインデックスは？といったことも調べられます。&lt;/p&gt;
&lt;h3 id=&#34;index-detail&#34;&gt;Index Detail&lt;/h3&gt;
&lt;p&gt;画像あり。
&lt;a href=&#34;https://www.elastic.co/blog/shield-watcher-and-marvel-2-0-ga-released&#34;&gt;※画像に関しては原文をご覧ください。&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;インデックス詳細ページはインデックスの主な性能メトリックを見ることができ、シャードの配置についても表示します。&lt;/p&gt;
&lt;h3 id=&#34;nodes-list&#34;&gt;Nodes List&lt;/h3&gt;
&lt;p&gt;画像あり。
&lt;a href=&#34;https://www.elastic.co/blog/shield-watcher-and-marvel-2-0-ga-released&#34;&gt;※画像に関しては原文をご覧ください。&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ノードリストはクラスタにあるノードとその主な性能メトリックを見ることができます。
テーブルはライブでアップデートされ、フィルタリングも可能です。
高いCPU利用率やディスクの残り容量なども簡単にわかるようになっています。&lt;/p&gt;
&lt;h3 id=&#34;node-detail&#34;&gt;Node Detail&lt;/h3&gt;
&lt;p&gt;画像あり。
&lt;a href=&#34;https://www.elastic.co/blog/shield-watcher-and-marvel-2-0-ga-released&#34;&gt;※画像に関しては原文をご覧ください。&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ノード詳細ページは個別のノードに関する主な性能メトリックを見ることができ、ノードにあるシャードのリストも見ることができます。&lt;/p&gt;
&lt;p&gt;新しいMarvelはKibana 4の上に構築されたので、管理方法が変わっています。
Marvelのインストールは2つのステップがあります。
marvel-agentとmarvel user interfaceです。&lt;/p&gt;
&lt;h2 id=&#34;marvel-agent&#34;&gt;Marvel Agent&lt;/h2&gt;
&lt;p&gt;marvel-agentはElasticsearchクラスタにプラグインとしてインストールします。
主なパフォーマンス情報を取得し、ローカルもしくは分離されたモニタリングクラスタにデータを保存・送信します。&lt;/p&gt;
&lt;h2 id=&#34;marvel-user-interface&#34;&gt;Marvel User Interface&lt;/h2&gt;
&lt;p&gt;Marvel UIはKibanaのプラグインとしてインストールします。
これは、Kibana 4.2の新しいプラグインインフラを利用し、
Marvel Appとして、Kibanaのインタフェースとは個別に提供されます。
Kibanaのアプリの切り替えは次の画像の通りです。&lt;/p&gt;
&lt;p&gt;画像あり。
&lt;a href=&#34;https://www.elastic.co/blog/shield-watcher-and-marvel-2-0-ga-released&#34;&gt;※画像に関しては原文をご覧ください。&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2.0リリースは私たちのプロダクトの大きな一歩です。またユーザの意見を常にお待ちしています。
ぜひ、Webフォーラム（https://discuss.elastic.co）やメール（info@elastic.co）でご意見を。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch 2.0.0リリース(日本語訳)</title>
      <link>https://blog.johtani.info/blog/2015/10/29/elasticsearch-2-0-0-released-ja/</link>
      <pubDate>Thu, 29 Oct 2015 16:20:43 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/10/29/elasticsearch-2-0-0-released-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-2-0-0-released&#34;&gt;Elasticsearch 2.0.0 GA released&lt;/a&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Elasticsearch 1.0.0のリリース以降、
477のコミッター2,799のpull requestがあった、
**Elasticsearch 2.0.0 GA（Lucene 5.2.1ベース）**をリリースしました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-2-0-0-released&#34;&gt;Elasticsearch 2.0.0 GA released&lt;/a&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Elasticsearch 1.0.0のリリース以降、
477のコミッター2,799のpull requestがあった、
**Elasticsearch 2.0.0 GA（Lucene 5.2.1ベース）**をリリースしました。&lt;/p&gt;
&lt;p&gt;それだけでなく、&lt;a href=&#34;#shield-watcher&#34;&gt;Shield（セキュリティプラグイン）とWatcher（アラーティングプラグイン）&lt;/a&gt;、
新しくなった&lt;a href=&#34;#marvel&#34;&gt;Marvel（モニタリングプラグイン）&lt;/a&gt;（プロダクション環境でフリー！）、
また、新しくオープンソースとなった&lt;a href=&#34;#sense&#34;&gt;Sense editor&lt;/a&gt;の2.0.0もリリースしました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-2-0-0&#34;&gt;Elasticsearch 2.0.0&lt;/a&gt;のダウンロードはこちらから。
また、&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/2.0/breaking-changes-2.0.html&#34;&gt;2.0.0での重要な変更点についてはこちら&lt;/a&gt;をご覧ください。
全ての変更点については、次をご覧ください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-2-0-0&#34;&gt;Changes list for Elasticsearch 2.0.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-2-0-0-rc1&#34;&gt;Changes list for Elasticsearch 2.0.0-rc1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-2-0-0-beta2&#34;&gt;Changes list for Elasticsearch 2.0.0-beta2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-2-0-0-beta1&#34;&gt;Changes list for Elasticsearch 2.0.0-beta1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;商用プラグインについてはこちらです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/shield/2.0.0/release-notes.html#_2_0_0&#34;&gt;Shield 2.0.0 change logs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/watcher/2.0.0/release-notes.html#_2_0_0&#34;&gt;Watcher 2.0.0 change logs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;elasticsearchの新機能&#34;&gt;Elasticsearchの新機能&lt;/h2&gt;
&lt;p&gt;Elasticsearch 2.0.0には素晴らしい新機能があります。&lt;/p&gt;
&lt;h4 id=&#34;pipeline-aggregations&#34;&gt;Pipeline Aggregations&lt;/h4&gt;
&lt;p&gt;Aggregationsで導関数や移動平均のような他のAggregationの結果に対する計算が可能となります。
この機能はクライアントサイドで実装しなければなりませんでしたが、
Elasticsearchに計算させることで、より強力な解析のクエリを簡単に組み立て、クライアントのコードを簡略化できます。
これは、予測解析や予測解析や例外検知といった可能性をもたらします。
Pipeline Aggregationについては次をご覧ください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/out-of-this-world-aggregations&#34;&gt;Out of this world aggregations.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/staying-in-control-with-moving-averages-part-1&#34;&gt;Staying in Control with Moving Averages - Part 1.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/staying-in-control-with-moving-averages-part-2&#34;&gt;Staying in Control with Moving Averages - Part 2.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;queryfilter-merging&#34;&gt;Query/Filter merging&lt;/h4&gt;
&lt;p&gt;フィルタはもうありません。
全てのフィルタ条件はクエリとなりました。
クエリコンテキストで使用した場合、関連度のスコアに影響し、フィルタコンテキストで使用した場合、
これまでのフィルタのように、ヒットしなかったドキュメントを除外するだけとなります。
この変更はクエリの実行時に自動的に最も効率的な順序で実行するように最適化されることを意味します。
例えば、遅いクエリ（フレーズやgeo）の最初の実行は速い近似フェーズで実行され、
それから、遅い正確なフェーズで結果を修正します。
フィルタコンテキストでは、直近でよく使われた条件が自動的にキャッシュされます。
詳細については、&amp;quot;&lt;a href=&#34;https://www.elastic.co/blog/better-query-execution-coming-elasticsearch-2-0&#34;&gt;Better query execution coming to Elasticsearch 2.0&lt;/a&gt;&amp;ldquo;をご覧ください。&lt;/p&gt;
&lt;h4 id=&#34;設定可能な圧縮率&#34;&gt;設定可能な圧縮率&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;_source&lt;/code&gt;のようなStored fieldsは高速なLZ4（デフォルト）で圧縮するか、インデックスサイズを小さくできるDEFLATE
で圧縮できます。
これは、特にロギングのケースで便利です。
古いインデックスをオプティマイズする前に&lt;code&gt;best_compression&lt;/code&gt;に変更することができます。
詳細については&amp;rdquo;&lt;a href=&#34;https://www.elastic.co/blog/store-compression-in-lucene-and-elasticsearch&#34;&gt;Store compression in Lucene and Elasticsearch&lt;/a&gt;&amp;ldquo;をご覧ください。&lt;/p&gt;
&lt;h4 id=&#34;堅牢に&#34;&gt;堅牢に&lt;/h4&gt;
&lt;p&gt;新しいElasticsearchはJava Security Managerの元で実行されます。
これは、セキュリティの観点で大きな前進です。
Seciruty ManagerはElastcsearchにより制限をかけ、ハッカーによりシステムに対して何でもできるようなものを制限します。
Elasticsearchはまた、インデキシングの観点でも堅牢になっています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ドキュメントはインデキシングリクエストに答える前に、耐久性のためにディスクに&lt;code&gt;fsync&lt;/code&gt;されます。&lt;/li&gt;
&lt;li&gt;すべてのファイルはチェックサムにより、早期に障害を検知します。&lt;/li&gt;
&lt;li&gt;すべてのファイルはどんなファイルへの書き込みもアトミックです&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最後に、システム管理者から要請の多かった変更として、
設定されて居ないノードがパブリックなネットワークから参加しないようになりました。
Elasticsearchは&lt;a href=&#34;https://manage.contentstack.io/blog/elasticsearch-unplugged&#34;&gt;デフォルトではローカルホストのみにバインド&lt;/a&gt;します。マルチキャストは無くなりました。（プラグインとして残っています。）&lt;/p&gt;
&lt;h4 id=&#34;パフォーマンスと信頼性&#34;&gt;パフォーマンスと信頼性&lt;/h4&gt;
&lt;p&gt;上記以外にも細かな修正がElasticsearchとLuceneにはあります。
より安定し、信頼性をあげ、簡単に設定できるようにするものです。例えば、次のようなものです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ヒープの使用率の低減（doc valuesがデフォルト、マージ時のメモリ使用率の削減、
roaring bitsetsによるフィルタキャッシュ）&lt;/li&gt;
&lt;li&gt;構造化され読みやすくなった例外&lt;/li&gt;
&lt;li&gt;設定の代わりに、フィードバックループを使用した自動調整&lt;/li&gt;
&lt;li&gt;安全で明確で信頼性のあるタイプマッピングの大きな修正&lt;/li&gt;
&lt;li&gt;クラスタ状態の差分変更による伝搬の高速化および、大きなクラスタでのより安定的に&lt;/li&gt;
&lt;li&gt;normsの圧縮の改善。これまではヒープスペースを大きく利用していた。&lt;/li&gt;
&lt;li&gt;マージの自動的な調整（不可解な設定の微調整が必要ない）&lt;/li&gt;
&lt;li&gt;より詳細なLuceneのメモリリポート&lt;/li&gt;
&lt;li&gt;最適化されたクエリ実行を活用するためにParent/childを書き換え&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;コアプラグイン&#34;&gt;コアプラグイン&lt;/h4&gt;
&lt;p&gt;公式にサポートされたコアプラグインはElasticsearchと同じバージョン番号で同じタイミングでリリースされます。
インストールするプラグインとElasticsearchの複雑なバージョンの対応表に悩まされる必要はもうありません。
コアプラグインのインストールは次のように簡略化されています。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bin/plugin install analysis-icu
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;shieldとwatcherの新機能&#34;&gt;&lt;a name=&#34;shield-watcher&#34;&gt;ShieldとWatcherの新機能&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;商用プラグインも新しい機能をリリースしました。&lt;/p&gt;
&lt;h4 id=&#34;shield&#34;&gt;Shield&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;フィールドおよびドキュメントレベルのアクセス制御&lt;/li&gt;
&lt;li&gt;ユーザのなりすまし&lt;/li&gt;
&lt;li&gt;カスタム拡張可能な認証レルム&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;watcher&#34;&gt;Watcher&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;個別のWatchを有効/無効に&lt;/li&gt;
&lt;li&gt;SlackやHipChatへの通知&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらの詳細については“&lt;a href=&#34;https://www.elastic.co/blog/shield-watcher-and-marvel-2-0-ga-released&#34;&gt;Shield, Watcher, and Marvel 2.0.0 GA Released&lt;/a&gt;”をご覧ください。&lt;/p&gt;
&lt;p&gt;コアプラグイン同様、商用プラグインもElasticsearchのバージョンと同じものが同時にリリースされます。
インストールは次の通りです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bin/plugin install license
bin/plugin install shield
bin/plugin install watcher
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;marvel-200はプロダクションでの利用もフリーに&#34;&gt;&lt;a name=&#34;marvel&#34;&gt;Marvel 2.0.0はプロダクションでの利用もフリーに&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Marvelモニタリングプラグインはカスタマに非常に価値のあるもので、
ユーザの発展とともに問題を診断したり見つけたりするのに役に立ってきました。
私たちは、何を改善でき、Mαrvelを一から書き直すことで、いろいろとわかったことがあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Marvel UIを新しい&lt;a href=&#34;https://www.elastic.co/blog/kibana-4-2-0&#34;&gt;Kibanaプラットフォーム&lt;/a&gt;上に構築&lt;/li&gt;
&lt;li&gt;ダッシュボードにはより簡単に問題を発見するために、最も重要なメトリックを可視化&lt;/li&gt;
&lt;li&gt;1つのインストールで、複数のクラスタのモニタリングをサポート（商用サポート対象）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一番良い点はMarvelがすべてのElasticsearchユーザに対してプロダクション環境でフリーになったことです！
ライセンスが必要ですが、課金の必要はありません。
もし、マルチクラスタモニタリングサポートが必要な場合、それは商用サポート対象となります。&lt;/p&gt;
&lt;p&gt;詳細に関しては“&lt;a href=&#34;https://www.elastic.co/blog/shield-watcher-and-marvel-2-0-ga-released&#34;&gt;Shield, Watcher, and Marvel 2.0.0 GA Released&lt;/a&gt;”をご覧ください。&lt;/p&gt;
&lt;h2 id=&#34;sense-editorがオープンソースに&#34;&gt;&lt;a name=&#34;sense&#34;&gt;Sense editorがオープンソースに&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Sense（ブラウザベースのElasticsearchリクエストとDSL向けのエディタ）を
&lt;a href=&#34;https://www.elastic.co/blog/kibana-4-2-0&#34;&gt;Kibanaプラットフォーム&lt;/a&gt;のアプリとして、オープンソースにしました。
また、このリリースで新しい機能が追加されています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;複数のcURLリクエストをペースとすると、Sense表記に変更&lt;/li&gt;
&lt;li&gt;複数のSenseリクエストをcURL表記にしてコピー&lt;/li&gt;
&lt;li&gt;複数のリクエストを一度に実行可能&lt;/li&gt;
&lt;li&gt;Elasticsearch 2.0サポートとなった自動補完機能&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SenseはKibanaのアプリとして次のようにインストールします。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./bin/kibana plugin --install elastic/sense
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Senseの詳細については、&amp;quot;&lt;a href=&#34;https://www.elastic.co/blog/sense-2-0-0-beta1&#34;&gt;The Story of Sense - Announcing Sense 2.0.0-beta1&lt;/a&gt;&amp;ldquo;をご覧ください。&lt;/p&gt;
&lt;h2 id=&#34;elasticsearch-migration-plugin&#34;&gt;Elasticsearch Migration Plugin&lt;/h2&gt;
&lt;p&gt;Elasticsearch Migration PluginはElasticsearch 1.xから2.0にアップグレードする時の良い出発点となります。
1.xのElasticsearchクラスタにサイトプラグインとしてインストールすると、
アップグレードする前に解決すべき問題があるかどうかを検知してくれます。
（例えば、Lucene 3のような古いインデックスや、2.0.0にした場合に動作しない問題のある
マッピング（&lt;a href=&#34;https://www.elastic.co/blog/great-mapping-refactoring&#34;&gt;The Great Mapping Refactoring&lt;/a&gt;）のような問題）&lt;/p&gt;
&lt;p&gt;プラグインに関して&lt;a href=&#34;http://github.com/elastic/elasticsearch-migration&#34;&gt;Elasticsearch Migration repository&lt;/a&gt;をご覧ください。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ぜひ、&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-2-0-0&#34;&gt;Elasticsearch 2.0.0&lt;/a&gt;をダウンロードして、試してみてください。
そして、感想をTwitter(&lt;a href=&#34;https://twitter.com/elastic&#34;&gt;@elastic&lt;/a&gt;)や&lt;a href=&#34;https://discuss.elastic.co/c/elasticsearch&#34;&gt;Webフォーラム&lt;/a&gt;などで教えて下さい。
また、問題がありましたら、&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues&#34;&gt;GitHub issues page&lt;/a&gt;で報告をお願いします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Kibana 4.2.0リリース（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2015/10/29/kibana-4-2-0-ja/</link>
      <pubDate>Thu, 29 Oct 2015 16:20:19 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/10/29/kibana-4-2-0-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/kibana-4-2-0&#34;&gt;Kibana 4.2.0 released&lt;/a&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Elasticsearch 2.0 + Kibana 4.2 = 💚
Elasticsearch 2.0サポートのKibanaの最初のリリースです。
これが何を意味するでしょう？
速さ、安定さ、新しい機能。
試してみたい方は、&lt;a href=&#34;https://www.elastic.co/downloads/kibana&#34;&gt;いますぐダウンロード&lt;/a&gt;してください。
そうでない方は、Kibana 4.2の楽しい機能について読んでみてください。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/kibana-4-2-0&#34;&gt;Kibana 4.2.0 released&lt;/a&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Elasticsearch 2.0 + Kibana 4.2 = 💚
Elasticsearch 2.0サポートのKibanaの最初のリリースです。
これが何を意味するでしょう？
速さ、安定さ、新しい機能。
試してみたい方は、&lt;a href=&#34;https://www.elastic.co/downloads/kibana&#34;&gt;いますぐダウンロード&lt;/a&gt;してください。
そうでない方は、Kibana 4.2の楽しい機能について読んでみてください。&lt;/p&gt;
&lt;h3 id=&#34;暗黒面は怖い&#34;&gt;暗黒面は怖い？&lt;/h3&gt;
&lt;p&gt;そんなことありません。
私たちは常にチャートチャートとダッシュボードを組み立てている組み立てている間は明るいバックグラウンドを使うことを推奨してきましたが、
時々、巨大なスクリーンで暗い部屋で誰も明るい画面から目を背けないようにしたいでしょう。
その影響を小さくするためにダークモードを導入しました。
あなたは、NOCや天文台、その他の暗い場所でKibanaのダッシュボードを楽しむことができます。&lt;/p&gt;
&lt;p&gt;画像あり。
&lt;a href=&#34;https://www.elastic.co/blog/kibana-4-2-0&#34;&gt;※画像に関しては原文をご覧ください。&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;地図のカスタマイズ&#34;&gt;地図のカスタマイズ&lt;/h3&gt;
&lt;p&gt;Kibanaの地図は素晴らしいですが、もっと多くのオプションが望まれていると聞きました。
もし地図に関して知識があるなら、Kibana 4.2のWMSバックグラウンド地図サポートを試してみてください。
WMSは非常に強力で、US Geological Surveyを含む多くの無料サービスがあります。
&lt;a href=&#34;http://viewer.nationalmap.gov/example/services/serviceList.html&#34;&gt;http://viewer.nationalmap.gov/example/services/serviceList.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;画像あり。
&lt;a href=&#34;https://www.elastic.co/blog/kibana-4-2-0&#34;&gt;※画像に関しては原文をご覧ください。&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;シナリオは&#34;&gt;シナリオは？&lt;/h3&gt;
&lt;p&gt;何かおかしい時、何が起こっているかを正しく知ってもらいたいので、Kibanaがそのタイミングで注目したいコンポーネントがあるなら、
どのように動いているかという概要を知るためのサーバステータスページを作りました。
もちろん、全てがOKであるというのを知りたいだけの場合でも、settingメニューのStatusタブからいつでも呼び出せます。&lt;/p&gt;
&lt;p&gt;画像あり。
&lt;a href=&#34;https://www.elastic.co/blog/kibana-4-2-0&#34;&gt;※画像に関しては原文をご覧ください。&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;全てにおいて速く&#34;&gt;全てにおいて速く&lt;/h3&gt;
&lt;p&gt;ブラウザリフレッシュはKibana 4.2の新しいコードビルディングシステムのおかげで、さらに早くなりました。
また、メモリを覚えてます？&lt;strike&gt;Pepperidge Farm&lt;/strike&gt;Kibanaが覚えています。&lt;/p&gt;
&lt;!-- textlint-disable ja-technical-writing/ja-no-successive-word --&gt;
&lt;p&gt;Kibana 4.2は小さな小さな小さなメモリフットプリントを管理している間、長い長い長い時間実行されているダッシュボードを見ることができるような&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-successive-word --&gt;
&lt;p&gt;大きなメモリのクリーンアップも含んでいます。&lt;/p&gt;
&lt;h3 id=&#34;もっとありますが&#34;&gt;もっとありますが。。。&lt;/h3&gt;
&lt;p&gt;小さな微調整がいくつもあります。また、今後紹介する本当に刺激的なものの基礎を気づき上げてきました。
これからも&lt;a href=&#34;http://elastic.co/blog&#34;&gt;Elasticのブログ&lt;/a&gt;、&lt;a href=&#34;https://twitter.com/elastic&#34;&gt;Twitter&lt;/a&gt;、&lt;a href=&#34;https://github.com/elastic/kibana&#34;&gt;KibanaのGitHubリポジトリ&lt;/a&gt;に注目し、&lt;strike&gt;モンスタートラック&lt;/strike&gt;&lt;strong&gt;アナリティクス&lt;/strong&gt;の瞬間に立ち会ってください。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Logstash 2.0.0リリース（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2015/10/29/logstash-2-0-0-released-ja/</link>
      <pubDate>Thu, 29 Oct 2015 16:19:57 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/10/29/logstash-2-0-0-released-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/logstash-2-0-0-released&#34;&gt;Logstash 2.0.0 released&lt;/a&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Logstash 2.0.0が本日（10/28）リリースされました。
この&lt;a href=&#34;https://www.elastic.co/downloads/logstash&#34;&gt;リリース&lt;/a&gt;は
いくつかの設定に関する重要な変更があります。
詳細については、&lt;a href=&#34;https://github.com/elastic/logstash/blob/2.0/CHANGELOG.md&#34;&gt;changelog&lt;/a&gt;または、新しい&lt;a href=&#34;https://www.elastic.co/guide/en/logstash/2.0/breaking-changes.html&#34;&gt;breaking changes&lt;/a&gt;ドキュメントをご覧下さい。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/logstash-2-0-0-released&#34;&gt;Logstash 2.0.0 released&lt;/a&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Logstash 2.0.0が本日（10/28）リリースされました。
この&lt;a href=&#34;https://www.elastic.co/downloads/logstash&#34;&gt;リリース&lt;/a&gt;は
いくつかの設定に関する重要な変更があります。
詳細については、&lt;a href=&#34;https://github.com/elastic/logstash/blob/2.0/CHANGELOG.md&#34;&gt;changelog&lt;/a&gt;または、新しい&lt;a href=&#34;https://www.elastic.co/guide/en/logstash/2.0/breaking-changes.html&#34;&gt;breaking changes&lt;/a&gt;ドキュメントをご覧下さい。&lt;/p&gt;
&lt;p&gt;これまでの2.0.0直前のリリースに関する変更点はこちらをご覧ください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/logstash-2-0-0-beta1-released&#34;&gt;beta1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/logstash-2-0-0-beta2-released&#34;&gt;beta2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/logstash-2-0-0-beta3-released&#34;&gt;beta3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/logstash-2-0-0-rc1-released&#34;&gt;RC&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ここでは、2.0の主な変更点の概要を説明します。&lt;/p&gt;
&lt;h3 id=&#34;elasticsearch-20との互換性&#34;&gt;Elasticsearch 2.0との互換性&lt;/h3&gt;
&lt;p&gt;多くの機能および改善を含んだ&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-2-0-0-released&#34;&gt;Elasticsearch 2.0がリリース&lt;/a&gt;されました。
Logstash 2.0はこのリリースに対応しています。
Logstashのこれまでのリリースでは、デフォルトで、Javaの &lt;code&gt;node client&lt;/code&gt;をElasticsearchとの通信として
使用してきました。
2.0では、HTTPクライアントがデフォルトになります。
これにより、シームレスにユーザのデータを取り込み、付加価値をつけ、Elasticsearchに保存して解析することができます。&lt;/p&gt;
&lt;p&gt;HTTPは他のプロトコル（&lt;code&gt;node&lt;/code&gt;や&lt;code&gt;transport&lt;/code&gt;）同等の機能を持っていますが、
単一のクライアントに接続する時に、少しだけ遅いですが、管理や動作がより簡単です。
HTTPプロトコルを使うことで、Elasticsearchのバージョンのアップグレードが、Logstashのアップグレードすることなく
行うことができます。
デフォルトをHTTPに変更したさらに詳しい情報については&lt;a href=&#34;https://www.elastic.co/blog/logstash-2-0-0-beta1-released&#34;&gt;beta1のブログ&lt;/a&gt;をご覧ください。&lt;/p&gt;
&lt;p&gt;他のプロトコル（&lt;code&gt;node&lt;/code&gt;と&lt;code&gt;transport&lt;/code&gt;）もサポートしますが、これらを利用する場合には、
プラグインを別途インストールする必要があります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bin/plugin install --version 2.0.0 logstash-output-elasticsearch_java
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;互換性のマトリックス&#34;&gt;互換性のマトリックス&lt;/h4&gt;
&lt;p&gt;LogstashとElasticsearchのバージョンの互換性は次のようになります。&lt;/p&gt;
&lt;p&gt;画像あり。
&lt;a href=&#34;https://www.elastic.co/blog/kibana-4-2-0&#34;&gt;※画像に関しては原文をご覧ください。&lt;/a&gt;
#Image &lt;a href=&#34;https://www.elastic.co/assets/bltde5b69e2164aa82f%2Fcompat_matrix.png&#34;&gt;https://www.elastic.co/assets/bltde5b69e2164aa82f%2Fcompat_matrix.png&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;shield-20との互換性&#34;&gt;Shield 2.0との互換性&lt;/h2&gt;
&lt;p&gt;このリリースはShield 2.0リリースにも対応しています。
HTTPプロトコルで、追加のプラグインは必要ありません。
&lt;a href=&#34;https://www.elastic.co/guide/en/shield/current/logstash.html&#34;&gt;こちらのドキュメント&lt;/a&gt;をご覧ください。
&lt;code&gt;transport&lt;/code&gt;プロトコルでは、Shield 2.0対応のプラグインを個別にインストールする必要があります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bin/plugin install --version 2.0.0 logstash-output-elasticsearch_java_shield
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;パフォーマンスの改善&#34;&gt;パフォーマンスの改善&lt;/h2&gt;
&lt;p&gt;このリリースはまた、多くの部分のパフォーマンスの改善を含んでおり、Logstashを利用してデータをより早く処理することができます。
いくつかをここで説明します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;UserAgentとGeoIPフィルタ&lt;/strong&gt;：これらのフィルタで、LRUキャッシュを追加して改善しています。
これにより、IPとユーザエージェントがまとまって現れるというWebリクエストの特性を用いています。
ユーザエージェントフィルタのケースでは、サンプルデータセットにおいて3.7倍ほど早くなりました。
GeoIPでは、1.69倍早くなっています。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;JSONプロセシング&lt;/strong&gt;：LogstashでJSONのsiriaraizu/でシリアライズに利用しているJrJacksonを新しいバージョンにしました。
これにより、JSONの処理が改善されています。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;フィルタワーカーのより良い値をデフォルトに&lt;/strong&gt;：以前のリリースでは、&lt;code&gt;filter_workers&lt;/code&gt;の設定は1がデフォルトでした。
これは、フィルタの処理を行うワーカーが1つであるという意味です。
&lt;code&gt;filter_workers&lt;/code&gt;の設定のデフォルト値はCPUコア数の半分の値を設定します。フィルタ実行の並列性が上がります。
ですので、複雑なgrokパターンやuseragentフィルタの処理がにとっては重要です。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;filebeat-support&#34;&gt;Filebeat Support&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/products/beats/filebeat&#34;&gt;Filebeat&lt;/a&gt;のベータバージョンを&lt;a href=&#34;https://www.elastic.co/blog/beats-beta4-filebeat-lightweight-log-forwarding&#34;&gt;先日リリース&lt;/a&gt;しました。
これは、Logstash Forwarderの次期バージョンです。
Filebeatはファイルベースのログをさらに処理するためにLogstashに送るためのエージェントです。
2.0.0は&lt;a href=&#34;https://www.elastic.co/guide/en/logstash/2.0/plugins-inputs-beats.html&#34;&gt;logstash-input-beatsプラグイン&lt;/a&gt;を使えばFilebeat 1.0.0-beta4とすぐに動作します。&lt;/p&gt;
&lt;h2 id=&#34;シャットダウン操作&#34;&gt;シャットダウン操作&lt;/h2&gt;
&lt;p&gt;これまでのLogstashでは、シャットダウンが開始した時に、例外の機構でシャットダウンが開始したことを
プラグインに通知していました。
この処理はサードパーティのコードを使ったプラグインで問題を起こしていました。
Logstashはどの例外を処理するか知らないため、予期しない動作をしていました。
これを修正するためにAPI呼び出し（例えば&lt;code&gt;stop&lt;/code&gt;）を各プラグインにシャットダウンのイベントを通知し、
プラグイン自身がきちんと停止するようにしました。
これは、200以上のプラグインに新しいAPIを利用するように修正しないといけないことを意味しました。
しかし、Logstashの停止についてはまだ完全にはフィックスしていません。
とちゅうでおわっているoutputがシャットダウンを遅らせる可能性があるからです。
2.0でAPIの破壊的な変更は適切なリリースでの変更を繰り返すことができる出発点です。&lt;/p&gt;
&lt;p&gt;プラグインの開発者へ：もし、Logstash　1.5のプラグインを開発しているなら、
シャットダウンに関する新しいAPIのリストに関するbreaking changesのドキュメントに助言をください。
また、&lt;a href=&#34;https://github.com/logstash-plugins/logstash-input-example&#34;&gt;example input&lt;/a&gt;リポジトリにて、新しいシャットダウンメカニズムの使い方のサンプルコードを提供しています。&lt;/p&gt;
&lt;h2 id=&#34;ドキュメント&#34;&gt;ドキュメント&lt;/h2&gt;
&lt;p&gt;2.0に更新された&lt;a href=&#34;https://www.elastic.co/guide/en/logstash/2.0/index.html&#34;&gt;ドキュメントはこちら&lt;/a&gt;です。設定の変更についてもこちらをご覧ください。&lt;/p&gt;
&lt;h3 id=&#34;20へのアップデート&#34;&gt;2.0へのアップデート&lt;/h3&gt;
&lt;p&gt;2.0へアップデートする前に、&lt;a href=&#34;https://www.elastic.co/guide/en/logstash/2.0/upgrading-logstash.html&#34;&gt;アップデートガイド&lt;/a&gt;もご覧ください。&lt;/p&gt;
&lt;h2 id=&#34;フィードバック&#34;&gt;フィードバック&lt;/h2&gt;
&lt;p&gt;2.0のリリースできたことに、多くのコントリビューター、ユーザに感謝しています。
このリリースに含まれている多くのパッチと全てのプレリリースのテストにも感謝しています。
将来の修正やリリースなどについては&lt;a href=&#34;https://www.elastic.co/guide/en/logstash-roadmap/current/index.html&#34;&gt;ロードマップ&lt;/a&gt;をご覧ください。
2.0は&lt;a href=&#34;https://www.elastic.co/downloads/logstash&#34;&gt;今日リリース&lt;/a&gt;されました。
ご意見ご感想は&lt;a href=&#34;https://discuss.elastic.co/c/logstash&#34;&gt;Webフォーラム&lt;/a&gt;で！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Release, we have（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2015/10/29/release-we-have-ja/</link>
      <pubDate>Thu, 29 Oct 2015 14:18:59 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/10/29/release-we-have-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/release-we-have&#34;&gt;Relase, we have&lt;/a&gt;
※画像に関しては原文をご覧ください。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Elasticにとって大きな1日（社内では「release bonanza」と呼んでいる）です。
多くの主要なプロダクトを新たにリリースしました。
そして、本日、それらを一緒に利用する時にそれらを一緒に利用する時にユーザの体験についてまとめてみました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/release-we-have&#34;&gt;Relase, we have&lt;/a&gt;
※画像に関しては原文をご覧ください。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Elasticにとって大きな1日（社内では「release bonanza」と呼んでいる）です。
多くの主要なプロダクトを新たにリリースしました。
そして、本日、それらを一緒に利用する時にそれらを一緒に利用する時にユーザの体験についてまとめてみました。&lt;/p&gt;
&lt;p&gt;次の通りです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-2-0-0-released&#34;&gt;Elasticsearch 2.0&lt;/a&gt;リリース。
大きなマイルストーン、チームによる改善、そして、コミュニティからの素晴らしい貢献。
Pipeline Aggsと呼ばれる新しいタイプのaggregations、
クエリとフィルタのコンセプトを統合することにより簡素化されたクエリDSL、
better compressionオプション、
JavaのSecurity Managerを有効にすることによる強化されたセキュリティ、
FSの挙動に関する強化（fsync、checksum、atmicなリネーム）、
パフォーマンス、マッピングの挙動の一貫性などなどです。
また、我々のチームによる改善も含まれているLucene 5ベースにアップグレードしています。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/blog/kibana-4-2-0&#34;&gt;Kibana 4.2&lt;/a&gt;リリース。
Elasticsearch 2.0対応、ダークテーマ、カスタマイズ可能な地図、多くの改善。
Kibana 4.2の多くに作業については外部プラグインサポートといった、内蔵に関するものでした。
この後の説明に続きます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/blog/shield-watcher-and-marvel-2-0-ga-released&#34;&gt;Marvel 2.0&lt;/a&gt;リリース。
Elasticsearch 2.0対応、合理化されたメトリックス、簡素化されたUI、
多くはKibanaプラグイン（Kibanaプラットフォーム上に構築）としての書き換えです。
このKibana拡張の最初の努力は、Kibanaのプラグインをどうやって書くか、
Kibanaユーザに公式に何をする必要があるかといったものを特定するのに役立ちました。
おっと、忘れるところでした、Marvelを全てのユーザにフリーで使えるようにしました。
マルチクラスタサポートについては有償となります。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/blog/sense-2-0-0-beta1&#34;&gt;Sense 2.0&lt;/a&gt;リリース。
2つ目のKibanaプラグインがこれです。
SenseをKibanaプラグインとして書き換えました。
Elasticsearch 2.0サポート、複数リクエストの実行、
curlへのコピーなどです。
おっと、忘れるところでした。オープンソースとすることにしました！&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/blog/shield-watcher-and-marvel-2-0-ga-released&#34;&gt;Shield + Watcher 2.0&lt;/a&gt;リリース。ElasticsearchのためのセキュリティプラグインであるShieldと、アラート管理のためのプラグインであるWatcherにも
多くの結果が入っています。
最も要求のあった機能である、フィールドお呼びドキュメントレベルでのセキュリティについて、Luceneに落とし込んで実装しました。
また、セキュリティの操作についてプラガブルに実装できるように変更しました。
Watcherは監視の無効化、SlackやHipChatへの通知（bot ops向け）が可能です。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/blog/logstash-2-0-0-released&#34;&gt;Logstash 2.0&lt;/a&gt;リリース。
Elasticsearch 2.0のサポート、クリーンな停止、全面的なパフォーマンス改善、&lt;a href=&#34;https://www.elastic.co/products/beats&#34;&gt;Beats&lt;/a&gt;サポート。&lt;/p&gt;
&lt;p&gt;ご覧の通り、すべてのプロダクトに関する大きな結果です。
チーム間およびFoundの開発者との間での密な連携に感謝します。
これらが私たちが公式にElasticsearch / Kibanaをホストしている&lt;a href=&#34;https://www.elastic.co/found&#34;&gt;Found&lt;/a&gt;で
利用可能です。&lt;/p&gt;
&lt;p&gt;ひゅう、息切れしました。
チームがしてきたことは、感動的で、謙虚で、刺激的です！
Elasticが会社として、全てのユーザ、コントリビュータがどのように私たちの大きなミッションに対する結果をもたらしたかという素晴らしい良い例です。
ユーザに愛され、楽しまれ、成功に導き、革新させる製品を是非ご利用ください。ありがとうございます。&lt;/p&gt;
&lt;p&gt;&amp;ldquo;A Lion, in Africa?&amp;rdquo; - まだまだ終わりではありません。この文言で終わりにしますが、すぐに（本当にすぐに）戻ってきます。;)&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch 2.0の紹介</title>
      <link>https://blog.johtani.info/presentation/2015/elasticsearch-2-dot-0falseshao-jie/</link>
      <pubDate>Fri, 09 Oct 2015 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2015/elasticsearch-2-dot-0falseshao-jie/</guid>
      <description>&lt;p&gt;第12回Elasticsearch勉強会で使用した資料です。
Elasticsearch2.0の変更点などの紹介をしました。&lt;/p&gt;
&lt;p&gt;発表時にはブラウザで表示したMigrationプラグインの画面を追加してあります。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;第12回Elasticsearch勉強会で使用した資料です。
Elasticsearch2.0の変更点などの紹介をしました。&lt;/p&gt;
&lt;p&gt;発表時にはブラウザで表示したMigrationプラグインの画面を追加してあります。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>elasticsearch-2-0-0-rc1-released-ja</title>
      <link>https://blog.johtani.info/blog/2015/10/08/elasticsearch-2-0-0-rc1-released-ja/</link>
      <pubDate>Thu, 08 Oct 2015 12:28:36 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/10/08/elasticsearch-2-0-0-rc1-released-ja/</guid>
      <description></description>
      <content:encoded></content:encoded>
    </item>
    
    <item>
      <title>Shield および Watcher 2.0.0-beta2リリース（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2015/09/18/shield-and-watcher-2-0-0-beta2-released-ja/</link>
      <pubDate>Fri, 18 Sep 2015 17:32:10 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/09/18/shield-and-watcher-2-0-0-beta2-released-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-2-0-0-beta1-released&#34;&gt;Elasticsearch 2.0.0-beta1 released&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-2-0-0-beta1-released&#34;&gt;Elasticsearch 2.0.0-beta1 released&lt;/a&gt;&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch 2.0.0-beta2リリース（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2015/09/18/elasticsearch-2-0-0-beta2-released-ja/</link>
      <pubDate>Fri, 18 Sep 2015 17:31:41 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/09/18/elasticsearch-2-0-0-beta2-released-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-2-0-0-beta2-released&#34;&gt;Elasticsearch 2.0.0-beta2 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日（9/17）、&lt;strong&gt;Lucene 5.2.1&lt;/strong&gt;ベースの&lt;strong&gt;Elasticsearch 2.0.0-beta2&lt;/strong&gt;をリリースしました。
本リリースが2.0.0のRCの前の最後のベータリリースになります。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-2-0-0-beta2-released&#34;&gt;Elasticsearch 2.0.0-beta2 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日（9/17）、&lt;strong&gt;Lucene 5.2.1&lt;/strong&gt;ベースの&lt;strong&gt;Elasticsearch 2.0.0-beta2&lt;/strong&gt;をリリースしました。
本リリースが2.0.0のRCの前の最後のベータリリースになります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意事項&lt;/strong&gt;
本リリースはベータリリースであり、テストを目的としたものとなります。
Elasticsearch 2.0.0-beta2はElasticsearch 2.0.0-beta1と互換がありません。
また、Elasticsearch 2.0.0 GAと互換性があるかどうかの保証はありません。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本番環境には利用しないでください。&lt;/strong&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-2-0-0-beta2&#34;&gt;Elasticsearch 2.0.0-beta2のダウンロードおよび、すべての変更についてはリンク&lt;/a&gt;をごらんください。&lt;/p&gt;
&lt;p&gt;2.0.0-beta1をテストし、問題点を報告していただいた皆様、ありがとうございます。
2.0.0-beta1のあとのElasticsearchのコアの部分の修正のほとんどはバグフィックスになりますが、
&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/12893&#34;&gt;geo_shapeフィールドの&lt;code&gt;points_only&lt;/code&gt;最適化&lt;/a&gt;のようなちょっとした改善も含んでいます。&lt;/p&gt;
&lt;p&gt;また、本リリースでは、商用プラグインの重要な新機能もあります。
こちらについては&lt;a href=&#34;https://www.elastic.co/blog/shield-and-watcher-2.0.0-beta2-released&#34;&gt;Shield and Watcher 2.0.0-beta2 released&lt;/a&gt;をごらんください。
簡単な紹介は次の通りです。&lt;/p&gt;
&lt;h3 id=&#34;shieldの新機能&#34;&gt;Shieldの新機能&lt;/h3&gt;
&lt;h5 id=&#34;ドキュメントおよびフィールドレベルのセキュリティ&#34;&gt;ドキュメントおよびフィールドレベルのセキュリティ&lt;/h5&gt;
&lt;p&gt;Shieldは、クエリを利用したインデックスにあるドキュメントへのアクセスを制御するためのロールを定義できるようになりました。
また、ドキュメントにある特定のフィールドに関するアクセス制限も可能です。
フィルタされたエイリアスのような形ではなく、ドキュメントを検索したり、IDで取得したりする場合にこれらの制限が利用できます。
詳細は&lt;a href=&#34;https://www.elastic.co/guide/en/shield/2.0.0-beta2/setting-up-field-and-document-level-security.html&#34;&gt;Field- and Document-level Security&lt;/a&gt;をごらんください&lt;/p&gt;
&lt;h5 id=&#34;ユーザなりすまし&#34;&gt;ユーザなりすまし&lt;/h5&gt;
&lt;p&gt;特定のユーザーに他のユーザーに扮して、彼らのためにリクエストを実行する能力を与えることが、現在できます。
これは、認証がアプリケーションによって実行される場合に便利です。
そして、それは、ユーザの許可レベルを考慮するようにElasticsearchにリクエストします。
詳細は&lt;a href=&#34;https://www.elastic.co/guide/en/shield/2.0.0-beta2/submitting-requests-for-other-users.html&#34;&gt;Submitting Requests for Other Users&lt;/a&gt;をごらんください。&lt;/p&gt;
&lt;h5 id=&#34;プラガブルな認証レルム&#34;&gt;プラガブルな認証レルム&lt;/h5&gt;
&lt;p&gt;このリリースで、サードパーティの拡張のための認証レルムのインフラを公開しました。
もし、特定の認証要求があり、Shieldがサポートしていない（が、内部の認証管理システムを使いたいような）場合、
これらの要求に見合う新しい認証レルムを利用するプラグインを作成可能です。
詳細は&lt;a href=&#34;https://www.elastic.co/guide/en/shield/2.0.0-beta2/custom-realms.html&#34;&gt;Custom Realms&lt;/a&gt;をごらんください。&lt;/p&gt;
&lt;h3 id=&#34;watcherの新機能&#34;&gt;Watcherの新機能&lt;/h3&gt;
&lt;h5 id=&#34;監視の一時&#34;&gt;監視の一時&lt;/h5&gt;
&lt;p&gt;新しく、&lt;code&gt;active&lt;/code&gt; / &lt;code&gt;inactive&lt;/code&gt; の状態がwatchに追加されました。
これらは、Watchを中断したり、要求に応じて再開させたりできます。
詳しくは、&lt;a href=&#34;https://www.elastic.co/guide/en/watcher/2.0.0-beta2/watch-active-state.html&#34;&gt;Active State&lt;/a&gt;をごらんください。&lt;/p&gt;
&lt;h5 id=&#34;チャットのための新しいアクション&#34;&gt;チャットのための新しいアクション&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;slack&lt;/code&gt;と&lt;code&gt;hipchat&lt;/code&gt;アクションが追加されました。
これは、Watcherが通知を、SlackやHipchatのユーザに直接送ったり、
チームのチャットルームに送ったりすることが出来るようにします。
詳細については、&lt;a href=&#34;https://www.elastic.co/guide/en/watcher/2.0.0-beta2/actions.html#actions-slack&#34;&gt;Slack action&lt;/a&gt;および、&lt;a href=&#34;https://www.elastic.co/guide/en/watcher/2.0.0-beta2/actions.html#actions-hipchat&#34;&gt;Hipchat action&lt;/a&gt;をごらんください。&lt;/p&gt;
&lt;h2 id=&#34;20に関するこれまでのブログ記事&#34;&gt;2.0に関するこれまでのブログ記事&lt;/h2&gt;
&lt;p&gt;これまでのリリースについての情報はこれらのブログ記事をごらんください。&lt;/p&gt;
&lt;p&gt;* &lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-2-0-0-beta1-released&#34;&gt;Elasticsearch 2.0.0.beta1 released&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-2.0.0.beta1-coming-soon&#34;&gt;Elasticsearch 2.0.0.beta1 coming soon!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/great-mapping-refactoring&#34;&gt;The Great Mapping Refactoring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/store-compression-in-lucene-and-elasticsearch&#34;&gt;Store compression in Lucene and Elasticsearch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/better-query-execution-coming-elasticsearch-2-0&#34;&gt;Better query execution coming to Elasticsearch 2.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/out-of-this-world-aggregations&#34;&gt;Out of this world aggregations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/staying-in-control-with-moving-averages-part-1&#34;&gt;Staying in Control with Moving Averages - Part 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/staying-in-control-with-moving-averages-part-2&#34;&gt;Staying in Control with Moving Averages - Part 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/core-delete-by-query-is-a-plugin&#34;&gt;The Delete by Query API Is now a plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-unplugged&#34;&gt;Elasticsearch unplugged - Networking changes in 2.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;また、&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/2.0/index.html&#34;&gt;Elasticsearch 2.0.0-beta2のドキュメント&lt;/a&gt;や&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/2.0/breaking-changes-2.0.html&#34;&gt;2.0のbreaking changesのリスト&lt;/a&gt;もごらんください。&lt;/p&gt;
&lt;h2 id=&#34;elsticsearch-migration-plugin&#34;&gt;Elsticsearch Migration Plugin&lt;/h2&gt;
&lt;p&gt;Elasticsearch Migration Pluginは、既存のインデックスをアップグレードする
必要があるか、他に必要な行動がないかについて、Elasticsearch
2.0.0-beta2を試す前に確認する助けとなります。
Lucene 3のような古いインデックスや、2.0.0にした場合に動作しない問題のある
マッピングのような問題を発見できます。&lt;/p&gt;
&lt;p&gt;プラグインの動作に関してはElasticsearch Migration repositoryをごらんください。&lt;/p&gt;
&lt;h2 id=&#34;テストしましょう&#34;&gt;テストしましょう！&lt;/h2&gt;
&lt;p&gt;Elasticsearch 2.0.0 GAをすぐにリリースできるようにより多くのベータテスターをお待ちしています。&lt;/p&gt;
&lt;p&gt;ぜひ、&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-2-0-0-beta2&#34;&gt;Elasticsearch 2.0.0-beta2&lt;/a&gt;をダウンロードして、試してみてください。
そして、感想をTwitter(&lt;a href=&#34;https://twitter.com/elastic&#34;&gt;@elastic&lt;/a&gt;)や&lt;a href=&#34;https://discuss.elastic.co/c/elasticsearch&#34;&gt;Webフォーラム&lt;/a&gt;などで教えて下さい。
また、問題がありましたら、&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues&#34;&gt;GitHub issues page&lt;/a&gt;で報告をお願いします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Introduction Elastic in 札幌勉強会</title>
      <link>https://blog.johtani.info/presentation/2015/introduction-elastic-in-zha-huang-mian-qiang-hui/</link>
      <pubDate>Tue, 08 Sep 2015 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2015/introduction-elastic-in-zha-huang-mian-qiang-hui/</guid>
      <description>&lt;p&gt;札幌で開催したElasticsearch勉強会の資料です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;札幌で開催したElasticsearch勉強会の資料です。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch-pluginで始める全文検索（Couchbase Live Tokyo 2015資料）</title>
      <link>https://blog.johtani.info/presentation/2015/elasticsearch-plugindeshi-meruquan-wen-jian-suo-couchbase-live-tokyo-2015zi-liao/</link>
      <pubDate>Tue, 01 Sep 2015 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2015/elasticsearch-plugindeshi-meruquan-wen-jian-suo-couchbase-live-tokyo-2015zi-liao/</guid>
      <description>&lt;p&gt;Couchbase Live Tokyo 2015で発表した資料です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Couchbase Live Tokyo 2015で発表した資料です。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>staying-in-control-with-moving-averages-part-1-ja</title>
      <link>https://blog.johtani.info/blog/2015/08/31/staying-in-control-with-moving-averages-part-1-ja/</link>
      <pubDate>Mon, 31 Aug 2015 14:15:41 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/08/31/staying-in-control-with-moving-averages-part-1-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/staying-in-control-with-moving-averages-part-1&#34;&gt;Staying in Control with Moving Averages - Part 1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;製造やビジネスのプロセスでは、一般的なツールとして、
&lt;em&gt;control chart&lt;/em&gt;と呼ばれるツールがあります。
1920年にDr. Walter Shewhartによって作成され、
control chartはプロセスが管理されているか、管理されていないかを
決定するために利用されます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/staying-in-control-with-moving-averages-part-1&#34;&gt;Staying in Control with Moving Averages - Part 1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;製造やビジネスのプロセスでは、一般的なツールとして、
&lt;em&gt;control chart&lt;/em&gt;と呼ばれるツールがあります。
1920年にDr. Walter Shewhartによって作成され、
control chartはプロセスが管理されているか、管理されていないかを
決定するために利用されます。&lt;/p&gt;
&lt;p&gt;当時、Dr. Shewhartはベル研究所で電話線の信号品質の改善に取り組んでいました。
貧弱なマシンのコンポーネントが信号の低下の原因となっていたので、
より均一的なコンポーネントを提供するための製造行程の改善が、
信号品質の改善の重要なステップでした。&lt;/p&gt;
&lt;p&gt;Dr. Shewhartは、それらの行程（製造やそれ以外）を
自然変異の量として捉えました。
キーは、変数が（管理できている）挙動のタイミングと
（管理ができていない）急に変化がおこったタイミングを特定することでした。
管理ができなくなったプロセスは、問題を修正するために停止する必要があります。
粗悪なコンポーネントを乱造する代わりにです。&lt;/p&gt;
&lt;p&gt;Control chartは値が特定の量の平均から逸脱した場合にアラーティングするために有効です。
実際、それらは非常にシンプルで直感的で、単純さと堅牢さによって、例外検知として直感的です。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch unplugged - 2.0におけるネットワークの変更(日本語訳)</title>
      <link>https://blog.johtani.info/blog/2015/08/28/elasticsearch-unplugged-ja/</link>
      <pubDate>Fri, 28 Aug 2015 12:01:30 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/08/28/elasticsearch-unplugged-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-unplugged&#34;&gt;Elasticsearch unplugged - Networking changes in 2.0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Elasticsearchをローカルのマシンで起動します。
そして、昨日試したデータを削除するために&lt;code&gt;DELETE *&lt;/code&gt;を実行します。
すると、悲しそうな叫びを同僚が発していることに気づき、なぜそんなことになっているのか不思議に思うでしょう。。。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-unplugged&#34;&gt;Elasticsearch unplugged - Networking changes in 2.0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Elasticsearchをローカルのマシンで起動します。
そして、昨日試したデータを削除するために&lt;code&gt;DELETE *&lt;/code&gt;を実行します。
すると、悲しそうな叫びを同僚が発していることに気づき、なぜそんなことになっているのか不思議に思うでしょう。。。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Elasticsearchはいつも、親しみやすいものでした。
複数ノードのクラスタがどのように機能するのかをテストするには、
ローカルのマシンでいくつかのElasticsearchのインスタンスを起動するだけでした。
起動したインスタンスはマルチキャストを利用して自動的にお互いを見つけて、1つのクラスタになり、負荷を共有し始めます。
しかし、これは親しみやすすぎました。
カンファレンスなどで、ローカルのマシンでElasticsearchを起動してみてください。
すると100ノードのクラスタに参加しているのがすぐにわかるでしょう。&lt;/p&gt;
&lt;p&gt;もうすぐリリースされる、2.0.0-beta1では、Elasticsearchが通信先を選択するネットワークの機能に関する変更があります。
ただし、これまで通り、簡単に開発者が経験できる機能も残っています。&lt;/p&gt;
&lt;h2 id=&#34;localhostへのバインド&#34;&gt;localhostへのバインド&lt;/h2&gt;
&lt;p&gt;以前、Elasticsearchはデフォルトで、利用可能なネットワークインタフェース全てにバインドしていました。
そこから、一番適したインタフェースを&lt;code&gt;publish_host&lt;/code&gt;として選択しようとします。
このアドレスはElasticsearchがクラスタの他のノードとやりとりするためのアドレスです。&lt;/p&gt;
&lt;p&gt;Elasticsearch 2.0では、デフォルトでは、&lt;code&gt;localhost&lt;/code&gt;にのみバインドします。
&lt;code&gt;127.0.0.1&lt;/code&gt;（IPv4）と&lt;code&gt;[::1]&lt;/code&gt;（IPv6）の両方にバインドしようとします。
また、どちらかのみの環境でも動作します。
この変更は、特に指定がない限り、Elasticsearchがネットワーク上の他のノードと接続しません。
本番環境に移行する場合は、&lt;code&gt;network.host&lt;/code&gt;パラメータを使って設定しましょう。
設定は、&lt;code&gt;elasticsearch.yml&lt;/code&gt;に記述するか、コマンドラインで指定します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bin/elasticsearch --network.host 192.168.1.5
bin/elasticsearch --network.host _non_loopback_
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;network.host&lt;/code&gt;の全てのオプションについては、&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/2.0/modules-network.html&#34;&gt;network settingsのドキュメント&lt;/a&gt;をごらんください。&lt;/p&gt;
&lt;h2 id=&#34;マルチキャストは廃止&#34;&gt;マルチキャストは廃止&lt;/h2&gt;
&lt;p&gt;Elasticsearch 1.xはネットワークの他のノードに接続・探索するためにマルチキャストを使用しました。
マルチキャストは魔法のような挙動です。。。
残念ながら、マルチキャストのサポートは良くも悪くもあります。
Linuxはローカルホストでマルチキャストの待ち受けをしていません。
OS/Xは構成されたアドレスの全てのインタフェースにマルチキャストで配信できます。
また、ネットワークによってはマルチキャストはデフォルトでは使用できなくなっています。&lt;/p&gt;
&lt;p&gt;Elasticsearch 2.0は異なるアプローチを採用しました。
マルチキャストを廃止します（ただし、新たにプラグインとして提供します）。
代わりに、ローカルホストでは、Elasticsearchは&lt;code&gt;transport.tcp.port&lt;/code&gt;で指定されている範囲（デフォルトは&lt;code&gt;9300-9400&lt;/code&gt;）の最初の5ポートに対してユニキャストを使用できるようにします。&lt;/p&gt;
&lt;p&gt;これは、開発者のための、設定することなく自動的にクラスタを組むという機能を残しています。
しかし、本番に移行するときは、&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/2.0/modules-discovery-zen.html#unicast&#34;&gt;unicast hosts&lt;/a&gt;で次のようにリストを指定する必要があります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;discovery.zen.ping.unicast.hosts: [ 192.168.1.2,  192.168.1.3 ]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;unicast hostsとしてクラスタにあるノードの全てのリストを指定する必要はありません。
少なくとも、マスタノードとして選出されるべきものを指定します。
巨大なクラスタでは、3つの専用のマスタノードを持っており、この3つをunicast hostsとして設定することを推奨しています。&lt;/p&gt;
&lt;p&gt;これにより、開発の知識・経験が、私たちの推奨する本番でのネットワーク設定に、より近いものとなります。&lt;/p&gt;
&lt;h2 id=&#34;ノード情報の変更&#34;&gt;ノード情報の変更&lt;/h2&gt;
&lt;p&gt;最後に、&lt;code&gt;inet[/127.0.0.1:9200]&lt;/code&gt;といったシンタックスを廃止します。
これは、Elasticsearchが&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-nodes-info.html&#34;&gt;nodes-info API&lt;/a&gt;などで、使用していたIPアドレスのためのシンタックスです。
今は、RFCに準拠した形で表示します。
&lt;code&gt;127.0.0.1:9200&lt;/code&gt;（IPv4）や&lt;code&gt;[::1]:9200&lt;/code&gt;（IPv6）のようにです。&lt;/p&gt;
&lt;p&gt;質問がある場合は、&lt;a href=&#34;https://discuss.elastic.co/c/elasticsearch&#34;&gt;ElasticsearchのWebフォーラム&lt;/a&gt;で質問してください。ベータはもうすぐです！（翻訳した時点で、すでにベータリリースされています。）&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch 2.0.0-beta1リリース（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2015/08/27/elasticsearch-2-0-0-beta1-released-ja/</link>
      <pubDate>Thu, 27 Aug 2015 10:29:12 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/08/27/elasticsearch-2-0-0-beta1-released-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-2-0-0-beta1-released&#34;&gt;Elasticsearch 2.0.0-beta1 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日（8/26）、&lt;strong&gt;Lucene 5.2.1&lt;/strong&gt;ベースの&lt;strong&gt;Elasticsearch 2.0.0-beta1&lt;/strong&gt;をリリースしました。
本リリースは469名のコミッターからの2,500以上ものpull requestを含んでいます。
pull requestのうち、約850が2.0のための新規のものとなります。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-2-0-0-beta1-released&#34;&gt;Elasticsearch 2.0.0-beta1 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日（8/26）、&lt;strong&gt;Lucene 5.2.1&lt;/strong&gt;ベースの&lt;strong&gt;Elasticsearch 2.0.0-beta1&lt;/strong&gt;をリリースしました。
本リリースは469名のコミッターからの2,500以上ものpull requestを含んでいます。
pull requestのうち、約850が2.0のための新規のものとなります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意事項&lt;/strong&gt;
本リリースはベータリリースであり、テストを目的としたものとなります。
Elasticsearch 2.0.0-beta1は Elasticsearch 2.0.0 GAと互換性があるかどうかの保証はありません。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本番環境には利用しないでください。&lt;/strong&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-2-0-0-beta1&#34;&gt;Elasticsearch 2.0.0-beta1のダウンロードおよび、すべての変更についてはリンク&lt;/a&gt;をごらんください。&lt;/p&gt;
&lt;p&gt;Elasticsearch 2.0.0-beta1には次の新しい変更が含まれています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pipeline Aggregations：これは、他のaggregationsの結果に対するAggregationを実行できます（導関数、移動平均、Holt Winter予測アルゴリズムなども含む）&lt;/li&gt;
&lt;li&gt;ディスクやファイルシステムキャッシュにより適したより良いデータの圧縮&lt;/li&gt;
&lt;li&gt;doc-valuesがデフォルトになったこと、マージ実行時のメモリ使用量の低減、フィルターキャッシュのためのroaring bitsetsなどにより、ヒープの使用率がより効率的に。&lt;/li&gt;
&lt;li&gt;構造化された例外&lt;/li&gt;
&lt;li&gt;最適化されたクエリ実行順序、フィルタの自動キャッシュ、より高速なクエリに書き換えられたparent-child&lt;/li&gt;
&lt;li&gt;設定の代わりに、フィードバックループを使用した自動調整&lt;/li&gt;
&lt;li&gt;トランザクションログへの書き込みがデフォルトで、アトミックでかつ冗長に&lt;/li&gt;
&lt;li&gt;安全で明確で信頼性のあるタイプマッピング&lt;/li&gt;
&lt;li&gt;デフォルトでローカルホストでのみクラスタを構成&lt;/li&gt;
&lt;li&gt;クラスタ状態の差分によりより高速に変更を伝搬&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上記の変更以外にも、多くのElasticsearchおよびLuceneに対する継続的な変更が含まれています。
これらは、Elasticsearch 2.0をより安全に、より簡単に、より良いものにしています。
本リリースに関するより詳しい情報が次のブログにあるので、参考にしてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-2.0.0.beta1-coming-soon&#34;&gt;Elasticsearch 2.0.0.beta1 coming soon!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/great-mapping-refactoring&#34;&gt;The Great Mapping Refactoring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/store-compression-in-lucene-and-elasticsearch&#34;&gt;Store compression in Lucene and Elasticsearch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/better-query-execution-coming-elasticsearch-2-0&#34;&gt;Better query execution coming to Elasticsearch 2.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/out-of-this-world-aggregations&#34;&gt;Out of this world aggregations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/staying-in-control-with-moving-averages-part-1&#34;&gt;Staying in Control with Moving Averages - Part 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/staying-in-control-with-moving-averages-part-2&#34;&gt;Staying in Control with Moving Averages - Part 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/core-delete-by-query-is-a-plugin&#34;&gt;The Delete by Query API Is now a plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-unplugged&#34;&gt;Elasticsearch unplugged - Networking changes in 2.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;また、&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/2.0/index.html&#34;&gt;Elasticsearch 2.0.0-beta1のドキュメント&lt;/a&gt;も参考になります。
特に、&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/2.0/breaking-changes-2.0.html&#34;&gt;2.0での重大な変更点について&lt;/a&gt;は必ずごらんください。&lt;/p&gt;
&lt;h2 id=&#34;core-plugins&#34;&gt;Core plugins&lt;/h2&gt;
&lt;p&gt;コアプラグインの開発の方法を変更しました。
公式にサポートしているプラグインは、現在&lt;a href=&#34;https://github.com/elastic/elasticsearch/tree/master/plugins&#34;&gt;elasticsearchのリポジトリ&lt;/a&gt;に含まれています。
これにより、コアと一緒にテストされ、Elasticsearchと同じタイミングでリリースされます。
コアプラグインはElasticsearchと同じバージョン番号隣ます。
インストールは次のようになります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo bin/plugin install analysis-icu
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/plugins/2.0/index.html&#34;&gt;プラグインの新しいドキュメント&lt;/a&gt;は私たちのWebサイトの&lt;a href=&#34;https://www.elastic.co/guide/index.html&#34;&gt;Guide&lt;/a&gt;にあります。&lt;/p&gt;
&lt;h2 id=&#34;commercial-plugins&#34;&gt;Commercial plugins&lt;/h2&gt;
&lt;p&gt;私たちの商用プラグインもElasticsearchと同じバージョン番号となり、Elasticsearchと一緒にリリースされます。
ShieldやWatcherはすでに2.0.0-beta1が利用可能です。
インストールのコマンドは次のようになります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo bin/plugin install license
sudo bin/plugin install shield
sudo bin/plugin install watcher
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;MarvelおよびSenseに関する新しい情報もありますが、もう少しお待ちください。&lt;/p&gt;
&lt;p&gt;2.0.0-beta1の商用プラグインに関するドキュメントは次のリンクからごらんください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/shield/2.0.0-beta1/index.html&#34;&gt;Shield 2.0.0-beta1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/watcher/2.0.0-beta1/index.html&#34;&gt;Watcher 2.0.0-beta1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;elasticsearch-migration-plugin&#34;&gt;Elasticsearch Migration plugin&lt;/h2&gt;
&lt;p&gt;Elasticsearch 2.0.0-beta1を試す前に、
既存のインデックスのアップグレードするためになにか行う必要があるかどうかを確認するためのElasticsearch Migration Pluginもリリースしました。
2.0.0では機能しない、問題のあるマッピングなどを見つけるために便利なプラグインです。&lt;/p&gt;
&lt;p&gt;このプラグインの利用方法については&lt;a href=&#34;http://github.com/elastic/elasticsearch-migration&#34;&gt;Elasticsearch Migration repository&lt;/a&gt;をごらんください。&lt;/p&gt;
&lt;h2 id=&#34;既知の問題&#34;&gt;既知の問題&lt;/h2&gt;
&lt;p&gt;同じインデックスの異なるタイプに、同じ名前の&lt;code&gt;ip&lt;/code&gt;タイプのフィールドを追加した時に、問題があることがわかっています。
この問題は次のリリースでフィックスされます。詳細は&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues/13112&#34;&gt;#13112&lt;/a&gt;をごらんください。&lt;/p&gt;
&lt;h2 id=&#34;テストしましょう&#34;&gt;テストしましょう！&lt;/h2&gt;
&lt;p&gt;Elasticsearch 2.0.0 GAをすぐにリリースできるようにより多くのベータテスターをお待ちしています。&lt;/p&gt;
&lt;p&gt;ぜひ、&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-2-0-0-beta1&#34;&gt;Elasticsearch 2.0.0-beta1&lt;/a&gt;をダウンロードして、試してみてください。
そして、感想をTwitter(&lt;a href=&#34;https://twitter.com/elastic&#34;&gt;@elastic&lt;/a&gt;)や&lt;a href=&#34;https://discuss.elastic.co/c/elasticsearch&#34;&gt;Webフォーラム&lt;/a&gt;などで教えて下さい。
また、問題がありましたら、&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues&#34;&gt;GitHub issues page&lt;/a&gt;で報告をお願いします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Delete by Query APIはプラグインへ（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2015/08/20/core-delete-by-query-is-a-plugin-ja/</link>
      <pubDate>Thu, 20 Aug 2015 13:24:04 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/08/20/core-delete-by-query-is-a-plugin-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/core-delete-by-query-is-a-plugin&#34;&gt;The Delete by Query API Is now a plugin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Elasticsearchの2.0.0-beta1では、これまであった &lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/1.6/docs-delete-by-query.html&#34;&gt;Delete by Query API&lt;/a&gt;が&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/10859&#34;&gt;削除&lt;/a&gt;され、
新しく &lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/plugins/2.0/plugins-delete-by-query.html&#34;&gt;Delete by Query plugin&lt;/a&gt;に&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/11516&#34;&gt;置き換え&lt;/a&gt;られています。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/core-delete-by-query-is-a-plugin&#34;&gt;The Delete by Query API Is now a plugin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Elasticsearchの2.0.0-beta1では、これまであった &lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/1.6/docs-delete-by-query.html&#34;&gt;Delete by Query API&lt;/a&gt;が&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/10859&#34;&gt;削除&lt;/a&gt;され、
新しく &lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/plugins/2.0/plugins-delete-by-query.html&#34;&gt;Delete by Query plugin&lt;/a&gt;に&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/11516&#34;&gt;置き換え&lt;/a&gt;られています。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;もし、Delete by Query を利用する場合、2.0にアップグレードしたあとは、プラグインをインストールし、ドキュメントに従ってください。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bin/plugin install delete-by-query
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;なぜプラグインに&#34;&gt;なぜプラグインに？&lt;/h2&gt;
&lt;p&gt;ElasticsearchのコアなAPIの品質を保つためであり、以前のDelete by Queryの実装は簡単にはフィックスできない大きな問題がありました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;各リクエストのあとに、&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/1.6/indices-refresh.html&#34;&gt;refresh&lt;/a&gt;を実行します。これは、&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues/3593&#34;&gt;削除されたデータが想定外に検索に出てこないようにするため&lt;/a&gt;です。&lt;br&gt;
また、&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues/6025&#34;&gt;セグメントが大量にでき、マージが大量に発生し、ヒープが大量に消費されてインデキシングが劇的にスローダウンし&lt;/a&gt;、クラスタの複数のノードがクラッシュしてしまう状況も引き起こしました。&lt;/li&gt;
&lt;li&gt;このクエリは、プライマリ、レプリカの両方で実行されるため、ことなるドキュメントを削除し、矛盾したレプリカ（データの破損）を引き起こしました。&lt;/li&gt;
&lt;li&gt;アップグレードが不安定になります。これは、Delete by Queryリクエストがトランザクションログの中にクエリとして残るためです。そのため、アップグレードのあとに正確にパースされなかったり正確に実行されないかもしれません。例えば、インデックスエイリアスに対するリクエストで、それが削除された後の場合に&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues/10262&#34;&gt;このようなバグ&lt;/a&gt;が発生します。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;対照的に、&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/plugins/2.0/plugins-delete-by-query.html&#34;&gt;新しいプラグイン&lt;/a&gt;は、安全な実装です。
&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/guide/current/scan-scroll.html&#34;&gt;scanとscrollリクエスト&lt;/a&gt;でクエリにマッチしたIDを見つけ、そのIDを使って、&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html&#34;&gt;bulk indexing API&lt;/a&gt;で削除します。&lt;/p&gt;
&lt;p&gt;この実装は、遅い必要があります。特に、クエリが多くのドキュメントを削除する場合です。
もし、多くのドキュメントをこのAPIを利用して削除する場合、アプリケーションをテストしてください。
そして、&lt;a href=&#34;https://www.elastic.co/blog/lucenes-handling-of-deleted-documents&#34;&gt;代わりにインデックス全体を消す&lt;/a&gt;ようなアプローチに切り替えることができないか検討してください。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/plugins/2.0/delete-by-query-plugin-reason.html&#34;&gt;Delete by Query pluginのドキュメント&lt;/a&gt;に、新しい実装についての違いなどのより詳しい説明があります。&lt;/p&gt;
&lt;h2 id=&#34;elasticsearch-coreを最小限に&#34;&gt;Elasticsearch coreを最小限に&lt;/h2&gt;
&lt;p&gt;プラグインに切り替えることは、簡単な決断ではありませんでした。
多くのユーザは問題なく、Delete by Queryを利用していました。
しかし、危険が常にそこにあり、些細とは言い切れない数のユーザが上記のような深刻な問題に遭遇していました。&lt;/p&gt;
&lt;p&gt;さらに、Elsticsearchのコアは信頼できるものでなければなりません。
他のコアAPIを利用して実装できる機能は、コアに含みません。特に、それがバグを含んでいる場合。
コアのすべての機能は強固であるべきで、Delete by Queryは人気があり、高性能ですが、そうではありませんでした。&lt;/p&gt;
&lt;p&gt;必要に応じて、このような難しいトレードオフの末、信頼性と品質を選びます。&lt;/p&gt;
&lt;h2 id=&#34;マッピングの削除の廃止&#34;&gt;マッピングの削除の廃止&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/1.6/indices-delete-mapping.html&#34;&gt;タイプのマッピングを削除する機能&lt;/a&gt;も2.0で&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues/8877&#34;&gt;廃止&lt;/a&gt;されます。
これは、同じフィールド名を、異なるフィールドのタイプで再利用した場合に、インデックスの破損を引き起こす可能性があるためです。&lt;/p&gt;
&lt;p&gt;しかし、&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-all-query.html&#34;&gt;Match All Query&lt;/a&gt;で、Delete by Queryプラグインに対してタイプを指定することで、タイプのすべてのドキュメントを削除することはできます。
または、1つのインデックスに異なるタイプを複数含める代わりに、個別のインデックスに分割するようなアプローチに変更することを検討してください。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>#javajo ちょっとだけ検索入門</title>
      <link>https://blog.johtani.info/presentation/2015/number-javajo-tiyotutodakejian-suo-ru-men/</link>
      <pubDate>Fri, 07 Aug 2015 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2015/number-javajo-tiyotutodakejian-suo-ru-men/</guid>
      <description>&lt;p&gt;javajoで使用したスライド&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;javajoで使用したスライド&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第11回Elasticsearch勉強会を開催しました。#elasticsearchjp</title>
      <link>https://blog.johtani.info/blog/2015/07/31/11th-elasticsearch-jp/</link>
      <pubDate>Fri, 31 Jul 2015 14:41:53 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/07/31/11th-elasticsearch-jp/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://elasticsearch.doorkeeper.jp/events/28321&#34;&gt;第11回Elasticsearch勉強会&lt;/a&gt;を開催しました。
スタッフの皆さん、スピーカーの皆さん、会場提供していただいた&lt;a href=&#34;http://recruit-tech.co.jp&#34;&gt;リクルートテクノロジーズさん&lt;/a&gt;、そして、Shayありがとうございました！
次回もよろしくお願いします！参加していただき盛り上げていただいた参加者の皆さんもありがとうございました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://elasticsearch.doorkeeper.jp/events/28321&#34;&gt;第11回Elasticsearch勉強会&lt;/a&gt;を開催しました。
スタッフの皆さん、スピーカーの皆さん、会場提供していただいた&lt;a href=&#34;http://recruit-tech.co.jp&#34;&gt;リクルートテクノロジーズさん&lt;/a&gt;、そして、Shayありがとうございました！
次回もよろしくお願いします！参加していただき盛り上げていただいた参加者の皆さんもありがとうございました。&lt;/p&gt;
&lt;p&gt;今回は、CTOのShayが来日していたので、英語でいろいろと喋ってもらいました。
4月同様、&lt;a href=&#34;http://samuraism.com&#34;&gt;サムライズム&lt;/a&gt;の&lt;a href=&#34;https://twitter.com/yusuke&#34;&gt;@yusuke&lt;/a&gt;さんに
テキスト翻訳していただき、大変助かりました。
今回はQAベースのトークだったのでちょっときつかったですね、申し訳ない。。。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h3 id=&#34;チェックイン数など&#34;&gt;チェックイン数など&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;チェックインした人：141名&lt;/li&gt;
&lt;li&gt;キャンセルしなかった人：51名&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;でした。
今回はあらかじめ220名（全員が来たらキャパオーバー）としていたので、キャンセル待ちの人は
当日の午後にはいなくなっていた状態です。まぁ、こんなもんかな。結構入りましたね。ありがたいです。&lt;/p&gt;
&lt;h2 id=&#34;lt&#34;&gt;LT&lt;/h2&gt;
&lt;p&gt;今回は、少し趣向を変えて、4社の方達にLTをしていただきました。
Shayが来日しているのもあり、事前に英語でスライドを作っていただけると助かりますとお願いさせていただきました。
英語でスライドを作っていただいていたので、伝わりやすくて助かりました、スピーカーの方々ありがとうございました！&lt;br&gt;
（海外のユーザにもリンクを紹介しやすいので、英語でスライド作ってもらえるといろいろと知ってもらえるのかも。）&lt;/p&gt;
&lt;h3 id=&#34;elasticsearch-and-recruit-technologies-co-ltd--株式会社リクルートテクノロジーズ守谷-純之介さん&#34;&gt;Elasticsearch and Recruit Technologies Co., Ltd. / 株式会社リクルートテクノロジーズ　守谷 純之介さん&lt;/h3&gt;
&lt;p&gt;スライド：未定&lt;/p&gt;
&lt;p&gt;N-Gramと形態素のハイブリッドの話などをしていただきました。
@ITで連載もされてますね。ありがとうございます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.atmarkit.co.jp/ait/articles/1507/08/news009.html&#34;&gt;リクルート全社検索基盤のアーキテクチャ、採用技術、開発体制はどうなっているのか (1/2)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.atmarkit.co.jp/ait/articles/1507/29/news010.html&#34;&gt;ElasticsearchとKuromojiを使った形態素解析とN-Gramによる検索の適合率と再現率の向上 (1/3)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Shayからは、&lt;a href=&#34;https://www.elastic.co/products/hadoop&#34;&gt;elasticsearch-hadoop&lt;/a&gt;があるから検討してねと質問（お願い？）がありましたw。&lt;/p&gt;
&lt;h3 id=&#34;elasticsearch-as-a-dmp--株式会社インティメートマージャー松田和樹さんmats116&#34;&gt;Elasticsearch as a DMP / 株式会社インティメート・マージャー　松田和樹さん　@mats116&lt;/h3&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/im_docs/elasticsearch-as-a-dmp&#34;&gt;Elasticsearch as a DMP&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;いくつかのデータソースからAEROSPIKE経由でelasticsearchにデータを登録しているようです。
Data Management Platformのエンジンの一部として、elasticsearchを利用しているようです。&lt;/p&gt;
&lt;p&gt;Shayからの質問：「どの機能を使って関心のある単語を抽出していますか？」&lt;br&gt;
回答：「&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-significantterms-aggregation.html&#34;&gt;Significant Term Aggregation&lt;/a&gt;」です。&lt;br&gt;
Shay：「おぉ、チェックしてみますw」。&lt;/p&gt;
&lt;h3 id=&#34;real-time-social-big-data-analytics-using-elasticsearch--株式会社ホットリンク宮田洋毅さんkakka_jp&#34;&gt;Real-time social big data analytics using elasticsearch / 株式会社ホットリンク宮田洋毅さん　@kakka_jp&lt;/h3&gt;
&lt;p&gt;スライド：未定&lt;/p&gt;
&lt;p&gt;ソーシャルメディアのデータを解析するのにelasticsearchにデータを入れて解析。
時間軸での解析やテキストマイニングなんかをしているみたいでした。
いろいろと独自のプラグインを作ってるようです。（興味あるなぁ）&lt;/p&gt;
&lt;p&gt;Shayからの質問：「ノード数は？」「30ノードで30シャード」&lt;/p&gt;
&lt;h3 id=&#34;elasticsearch-in-hatena-bookmark--株式会社はてなidskozawa&#34;&gt;Elasticsearch in Hatena Bookmark / 株式会社はてな　id:skozawa&lt;/h3&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/shunsukekozawa5/elasticsearch-in-hatena-bookmark&#34;&gt;Elasticsearch in Hatena Bookmark&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;はてなブックマークの検索の歴史（MySQL -&amp;gt; Sedue -&amp;gt; Solr -&amp;gt; Elasticsearch）&lt;/li&gt;
&lt;li&gt;はてなブックマークの検索（ユーザが利用）と社内利用と、ログ解析で利用してる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Shayからの質問：「昨年会いましたよね？今はクラスタのサイズはどのくらいのサイズですか？」「メインクラスタは9データノード」&lt;/p&gt;
&lt;h2 id=&#34;open-qa-with-shay&#34;&gt;Open QA with Shay&lt;/h2&gt;
&lt;p&gt;思い出せるものだけ。。。（あとで追記します）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Elasticsearch 2.0の話
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/blog/out-of-this-world-aggregations&#34;&gt;Pipeline Aggregation&lt;/a&gt;とか。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Spark Streaming対応してる？
&lt;ul&gt;
&lt;li&gt;まだ検討中&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;elasticsearch-hadoopってどんなもの？HDFSにインデックス作ったりするの？
&lt;ul&gt;
&lt;li&gt;いえ、Hadoopの入出力先としてelasticsearchが使える感じ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;個人的にAWSのCloudSearchとAWSでElasticsearchはどっちがいい？
&lt;ul&gt;
&lt;li&gt;時系列データはCloudSearchだと難しいだろうし、AWS上なら&lt;a href=&#34;http://found.no&#34;&gt;found.no&lt;/a&gt;があるよ！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PostgreSQLみたいに信頼性の高いデータストアを目指してる（まだ、プライマリデータストアには使わないで）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;その他感想などのブログ&#34;&gt;その他、感想などのブログ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://tech.im-dmp.net/archives/4941&#34;&gt;Elasticsearch勉強会でLTしてきました | Intimate Merger Engineer Blog &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://togetter.com/li/853331&#34;&gt;『第11回elasticsearch勉強会』のまとめ #elasticsearchjp&lt;/a&gt;
* &lt;a href=&#34;http://suzuki.tdiary.net/20150728.html#p01&#34;&gt;[Elasticsearch] 第11回 Elasticsearch 勉強会へ参加してきた - 雑文発散(2015-07-28)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://kakakakakku.hatenablog.com/entry/2015/07/27/224203&#34;&gt;第11回 Elasticsearch 勉強会に参加したら英語力に危機感を覚えて最高だった&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;
&lt;p&gt;今回はShayが来日したので特別バージョンでした。
もっと英語を翻訳するサポートしないとですね、反省してます。。。ぜんぜん流暢じゃないしw&lt;/p&gt;
&lt;p&gt;次回は9月に開催予定ですが、12月にまたShayが再度来日する予定です。
丸1日のイベントを検討中で、Shay以外にも開発者が来日すると思います。
どんな話が聞きたい、どんな人と話をしたいなどあれば、コメントいただければ（対応できるかは。。。）&lt;/p&gt;
&lt;p&gt;勉強会のスピーカーは随時募集中ですので、コメント、メール、ツイートなど、コンタクトしていただければと思います。 よろしくお願いいたします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch 1.7.1 および 1.6.2リリース（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2015/07/29/elasticsearch-1-7-1-and-1-6-2-released-ja/</link>
      <pubDate>Wed, 29 Jul 2015 21:35:53 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/07/29/elasticsearch-1-7-1-and-1-6-2-released-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-1-7-1-and-1-6-2-released&#34;&gt;Elasticsearch 1.7.1 and 1.6.2 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日（7/29）、&lt;strong&gt;Lucene 4.10.4&lt;/strong&gt;ベースの&lt;strong&gt;Elasticsearch 1.7.1&lt;/strong&gt;および&lt;strong&gt;Elasticsearch 1.6.2&lt;/strong&gt; のバグフィックス版をリリースしました。
これらのリリースは稀ですが、データの欠損が発生する重要なバグのフィックスを含んでいます。
&lt;strong&gt;すべてのユーザにアップグレードを推奨します。&lt;/strong&gt;&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-1-7-1-and-1-6-2-released&#34;&gt;Elasticsearch 1.7.1 and 1.6.2 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日（7/29）、&lt;strong&gt;Lucene 4.10.4&lt;/strong&gt;ベースの&lt;strong&gt;Elasticsearch 1.7.1&lt;/strong&gt;および&lt;strong&gt;Elasticsearch 1.6.2&lt;/strong&gt; のバグフィックス版をリリースしました。
これらのリリースは稀ですが、データの欠損が発生する重要なバグのフィックスを含んでいます。
&lt;strong&gt;すべてのユーザにアップグレードを推奨します。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ダウンロードおよびすべての変更については次のリンクをごらんください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最新安定版：&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-1-7-1&#34;&gt;Elasticsearch 1.7.1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;1.6系バグフィックス：&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-1-6-2&#34;&gt;Elasticsearch 1.6.2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- more --&gt;
&lt;p&gt;問題のバグ(&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/12487&#34;&gt;#12487&lt;/a&gt;)は、
同時に複数のノードが故障またはリスタートをした場合の非常にまれな状況で、
シャードのすべてのコピーがクラスタから削除されてしまう状況を発生させます。
このバグは1.5.0から含まれています。&lt;/p&gt;
&lt;p&gt;このリリースはまた、IPv4アドレスのCIDRマスクのバグのフィックス、
Shieldユーザがmore-like-this APIを利用できないバグのフィックスなど、
いくつかの変更も含んでいます（詳細は&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-1-7-1&#34;&gt;更新リスト&lt;/a&gt;をごらんください）。&lt;/p&gt;
&lt;p&gt;ぜひ、&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-1-7-1&#34;&gt;Elasticsearch 1.7.1&lt;/a&gt;をダウンロードして、試してみてください。
そして、感想をTwitter(&lt;a href=&#34;https://twitter.com/elastic&#34;&gt;@elastic&lt;/a&gt;)などで教えて下さい。
また、問題がありましたら、&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues&#34;&gt;GitHub issues page&lt;/a&gt;で報告をお願いします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch 1.7.0 および 1.6.1リリース（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2015/07/22/elasticsearch-1-7-0-and-1-6-1-released-ja/</link>
      <pubDate>Wed, 22 Jul 2015 15:33:37 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/07/22/elasticsearch-1-7-0-and-1-6-1-released-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-1-7-0-and-1-6-1-released&#34;&gt;Elasticsearch 1.7.0 and 1.6.1 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日（7/16）、&lt;strong&gt;Lucene 4.10.4&lt;/strong&gt;ベースの&lt;strong&gt;Elasticsearch 1.7.0&lt;/strong&gt;および&lt;strong&gt;Elasticsearch 1.6.1&lt;/strong&gt; のバグフィックス版をリリースしました。
これらのリリースはセキュリティフィックスを含んでおり、&lt;strong&gt;すべてのユーザにアップグレードを推奨します。&lt;/strong&gt;&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-1-7-0-and-1-6-1-released&#34;&gt;Elasticsearch 1.7.0 and 1.6.1 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日（7/16）、&lt;strong&gt;Lucene 4.10.4&lt;/strong&gt;ベースの&lt;strong&gt;Elasticsearch 1.7.0&lt;/strong&gt;および&lt;strong&gt;Elasticsearch 1.6.1&lt;/strong&gt; のバグフィックス版をリリースしました。
これらのリリースはセキュリティフィックスを含んでおり、&lt;strong&gt;すべてのユーザにアップグレードを推奨します。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ダウンロードおよびすべての変更については次のリンクをごらんください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最新安定版：&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-1-7-0&#34;&gt;Elasticsearch 1.7.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;1.6系バグフィックス：&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-1-6-1&#34;&gt;Elasticsearch 1.6.1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- more --&gt;
&lt;p&gt;1.7.0が1.x系の最後のリリースとなります。
今後の新機能については、Elasticsearch 2.0以降で取り込まれる予定です。&lt;/p&gt;
&lt;p&gt;Elasticsearch 1.7.0は小さなリリースですが、2つの重要なセキュリティフィックスと
クラスタの安定化とリカバリに関する2つの重要な機能を含んでいます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#security&#34;&gt;セキュリティフィックス&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#delayed&#34;&gt;シャードアロケーションを遅らせる&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#prioritization&#34;&gt;インデックスリカバリの優先度&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;セキュリティフィックス&#34;&gt;&lt;a name=&#34;security&#34;&gt;セキュリティフィックス&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Elasticsearch 1.6.1 と 1.7.0 は次の2つのセキュリティフィックスを含んでいます。&lt;/p&gt;
&lt;h3 id=&#34;リモートコード実行の脆弱性&#34;&gt;リモートコード実行の脆弱性&lt;/h3&gt;
&lt;p&gt;Elasticsearch 1.6.1より前のバージョンには、transport protocol（ノードとJavaクライアント間での通信に利用）により、
リモートでコードが実行される脆弱性があります。
これは、&lt;a href=&#34;http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-3253&#34;&gt;CVE-2015-3253&lt;/a&gt;でのGroovyに関係しています。&lt;/p&gt;
&lt;p&gt;Groovyのダイナミックスクリプティングがオフでも脆弱性があります。
アップグレードをしないユーザは、transport protocol のポート（デフォルトで9300）信頼したエージェントからのみの
アクセスに限定することで、脆弱性から保護できます。&lt;/p&gt;
&lt;p&gt;この問題を&lt;a href=&#34;https://www.elastic.co/community/security&#34;&gt;CVE-2015-5377&lt;/a&gt;としました。&lt;/p&gt;
&lt;h3 id=&#34;ディレクトリ探索の脆弱性&#34;&gt;ディレクトリ探索の脆弱性&lt;/h3&gt;
&lt;p&gt;Elasticsearch 1.0.0から1.6.0までのバージョンで、ElasticsearchのJVMプロセスによって読み込みが可能なファイルを
取得することができるディレクトリ探索攻撃の脆弱性があります。
アップグレードをしないユーザは、信頼できない場所からの&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html&#34;&gt;Snapshot-Restore API&lt;/a&gt;の呼び出しを防ぐためにファイアウォール、リバースプロキシやShieldを使用することができます。&lt;/p&gt;
&lt;p&gt;この問題を&lt;a href=&#34;https://www.elastic.co/community/security&#34;&gt;CVE-2015-5531&lt;/a&gt;としました。&lt;/p&gt;
&lt;h2 id=&#34;シャードアロケーションを遅らせる&#34;&gt;&lt;a name=&#34;delayed&#34;&gt;シャードアロケーションを遅らせる&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Elasticsearch 1.6.0で&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-1-6-0-released#synced-flush&#34;&gt;Synced Flushing&lt;/a&gt;が導入されました。
これは、ノードのリスタート時に、更新が止まっているシャードのリカバリを劇的にスピードアップします。
しかし、この変更は、シャードの配置を無効にしている環境でのみうまく実行されます。
ノードが一時的にクラスタから外れている場合や予期せぬリブートの場合には役に立ちません。&lt;/p&gt;
&lt;p&gt;このシナリオとは次のようなものです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ノードの想定外のシャットダウン&lt;/li&gt;
&lt;li&gt;マスタがたのノードにシャードを再配置&lt;/li&gt;
&lt;li&gt;各シャードが新しい場所にネットワーク越しにコピー&lt;/li&gt;
&lt;li&gt;その間に、外れていたノードが再度クラスタにジョイン&lt;/li&gt;
&lt;li&gt;マスタは新しいノードにシャードを再配置。新しいノードに存在する既存のシャードが全く再利用されない可能性がある&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ノードレベルとクラスタレベルの両方の並列的なリカバリを抑制しても、
この&amp;quot;シャードシャッフル&amp;quot;がクラスタに対して負荷をかける可能性があります。
これは、外れたノードが再度ジョインするのを単に待つことにより防げるかもしれません。&lt;/p&gt;
&lt;h3 id=&#34;待ちましょう&#34;&gt;待ちましょう！&lt;/h3&gt;
&lt;p&gt;Elasticsearch 1.7.0は&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/1.7/delayed-allocation.html&#34;&gt;&lt;code&gt;index.unassigned.node_left.delayed_timeout&lt;/code&gt;&lt;/a&gt;設定を追加しました。デフォルトでは1分です。
これは、ノードがクラスタから外れたとき、ほかのノードにこれらのノードを再配置するまでマスタが1分待つということです。
ノードがこの1分の間に復帰した場合、マスタはローカルにあるシャードを再度配置します。&lt;/p&gt;
&lt;h3 id=&#34;なぜ1分&#34;&gt;なぜ1分？&lt;/h3&gt;
&lt;p&gt;ノードがシャットダウンし、リスタートし、復帰するために十分な時間が1分だからです。
しかし、ノードが復帰しない場合にはまだ再配置が発生することを意味します。
デフォルト値を決定するのは難しいです。
この設定をどのくらいに減らすか、増やすかを決める必要があるかもしれません。&lt;/p&gt;
&lt;p&gt;このデフォルト値は、&lt;code&gt;config/elasticsearch.yml&lt;/code&gt;ファイルに設定できますが、&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-update-settings.html&#34;&gt;インデックス設定の更新API&lt;/a&gt;を使って設定することも可能です。&lt;/p&gt;
&lt;p&gt;このデフォルトに関する知見をぜひフィードバックしてください。&lt;/p&gt;
&lt;h2 id=&#34;インデックスリカバリの優先度&#34;&gt;&lt;a name=&#34;prioritization&#34;&gt;インデックスリカバリの優先度&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;1.7.0の2つ目の重要な機構はフルクラスタリスタートのような後に、
どの順番でインデックスをリカバリするかという優先度をつけることができるという機能です。&lt;/p&gt;
&lt;p&gt;電源故障による、ロギング用のクラスタのダウンを想像してください。
クラスタが普及した場合、500個のインデックスをリカバリするような場合、499個のインデックスのデータは古く、
500番目のインデックスが重要です。
もっとも最近作成されたインデックスがリカバリされるまで、インデキシングを待つというようなことはできません。&lt;/p&gt;
&lt;p&gt;これまでは、インデックスはランダムな順序でリカバリされ、重要なインデックスがリカバリされるまで待つしかありませんでした。
1.7.0では、インデックスは優先度の順番でリカバリされます。
この優先度は次のプロパティで指定できます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;index.priority&lt;/code&gt;設定（大きな値が優先度が高い）&lt;/li&gt;
&lt;li&gt;インデックス作成日（新しいものが優先度が高い）&lt;/li&gt;
&lt;li&gt;インデックス名&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;既存のクラスタについて特に変更せずとも、最も最近作成されたインデックスが古いものよりも復旧されます。
古いインデックスの優先度を上げるためには、&lt;code&gt;index.priority&lt;/code&gt;設定に0よりも大きな値を設定します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;PUT important_index/_settings
{
  &amp;#34;index.priority&amp;#34;: 5
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;この設定は、存在するインデックスに対して更新できます。リカバリ中にもです。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ぜひ、&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-1-7-0&#34;&gt;Elasticsearch 1.7.0&lt;/a&gt;をダウンロードして、試してみてください。
そして、感想をTwitter(&lt;a href=&#34;https://twitter.com/elastic&#34;&gt;@elastic&lt;/a&gt;)などで教えて下さい。
また、問題がありましたら、&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues&#34;&gt;GitHub issues page&lt;/a&gt;で報告をお願いします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>大阪と京都でElasticsearch勉強会を開催しました。 #elasticsearchjp</title>
      <link>https://blog.johtani.info/blog/2015/07/16/kansai-1st-elasticsearch-jp/</link>
      <pubDate>Thu, 16 Jul 2015 10:40:57 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/07/16/kansai-1st-elasticsearch-jp/</guid>
      <description>&lt;p&gt;東京以外での勉強会の第2弾として、関西で勉強会を開催してきました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://elasticsearch.doorkeeper.jp/events/27555&#34;&gt;Elasticsearch勉強会 in 大阪&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://elasticsearch.doorkeeper.jp/events/27553&#34;&gt;Elasticsearch勉強会 in 京都&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;会場提供をしていただいた、Yahoo!大阪、はてなのみなさん、ご協力ありがとうございました！&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;東京以外での勉強会の第2弾として、関西で勉強会を開催してきました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://elasticsearch.doorkeeper.jp/events/27555&#34;&gt;Elasticsearch勉強会 in 大阪&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://elasticsearch.doorkeeper.jp/events/27553&#34;&gt;Elasticsearch勉強会 in 京都&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;会場提供をしていただいた、Yahoo!大阪、はてなのみなさん、ご協力ありがとうございました！&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20150715/osaka.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20150715/osaka.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;!-- more --&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20150715/kamogawa.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20150715/kamogawa.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;ここからはいつものメモです。
ちなみに、大阪の勉強会に、&lt;a href=&#34;https://twitter.com/takuya_a&#34;&gt;@takuya_a&lt;/a&gt;さんと&lt;a href=&#34;https://twitter.com/5kozawa&#34;&gt;@5kozawa&lt;/a&gt;さんの両名にお越しいただき話をしていただきました。
なので、勉強会の内容はほぼ同一になります。&lt;/p&gt;
&lt;h2 id=&#34;introduction-elastic-johtani&#34;&gt;Introduction Elastic @johtani&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://speakerdeck.com/johtani/introduction-elastic-1&#34;&gt;Introduction Elasticsearch&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;初めての関西での勉強会ということで、ElasticsearchのOSSおよび商用プラグインの紹介をしてきました。
もちろん、Kibanaのデモもちょっとだけ。スプラトゥーンに関するデータをKibanaでちょっとだけ。
突貫でデータをかき集めたのでもう少し改良しないとですが。&lt;/p&gt;
&lt;h2 id=&#34;elasticsearch-での類似文書検索と-more-like-this-api-詳解--株式会社はてなidtakuya-a&#34;&gt;Elasticsearch での類似文書検索と More Like This API 詳解 / 株式会社はてな　id:takuya-a&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://speakerdeck.com/takuyaa/elasticsearch-defalselei-si-wen-shu-jian-suo-to-more-like-this-query-api-xiang-jie&#34;&gt;Elasticsearch での類似文書検索と More Like This Query API 詳解&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Elasticsearchの&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-mlt-query.html&#34;&gt;More Like This&lt;/a&gt;のソースコードリーディングみたいな感じで、
内部でどうやって処理されているかの説明を詳しくしてもらいました。&lt;/p&gt;
&lt;p&gt;前のはてなエンジニアセミナーで話をされていた検索精度の件に絡んだ内容になっているかと。
（大阪で発表してもらった時より京都での発表が分かりやすくなってました。1日で改善されたのすごい！）
MoreLikeThisだとチューニングつらいので、自分で作るために&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-termvectors.html&#34;&gt;TermVectorAPI&lt;/a&gt;でやってみたという流れかと。&lt;/p&gt;
&lt;p&gt;以下は発表後に出てきた質問のいくつかです。&lt;/p&gt;
&lt;p&gt;Q:MoreLikeThisに対してTermVectorで柔軟にできる？
A:TermVectorのAPIで統計情報が取れるので、それを使うことでさらなるデータの更新ができる。&lt;/p&gt;
&lt;p&gt;Q:TFとかの統計情報が必要なら、すべてインデックスをしたあとじゃないとちゃんとした値はとれないのでは？
A:TermVectorで取得したものをどうやって使うか&lt;/p&gt;
&lt;p&gt;Q:TermVectorAPi&amp;hellip;聞こえなかった
A:。。。&lt;/p&gt;
&lt;h2 id=&#34;elasticsearchを用いたはてなブックマークのトピック生成--株式会社はてなidskozawa&#34;&gt;Elasticsearchを用いたはてなブックマークのトピック生成 / 株式会社はてな　id:skozawa&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/shunsukekozawa5/elasticsearch-in&#34;&gt;Elasticsearchを用いたはてなブックマークのトピック生成&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-significantterms-aggregation.html&#34;&gt;Significant Terms Aggregation&lt;/a&gt;を活用してる話。
トピックページの生成のために、Significant Terms Aggregationをどうやって利用しているかなどのお話でした。&lt;/p&gt;
&lt;p&gt;トピックの集合の重複だったり、精度の判定方法とかいろいろ詳しく説明していただきました。&lt;/p&gt;
&lt;p&gt;Q:2011年と12年で11年の方が多いのは？
A:ブックマークの件数に比例&lt;/p&gt;
&lt;p&gt;Q:Significant terms aggsのsizeはいくつをつかってますか？
A:20を指定してます。&lt;/p&gt;
&lt;p&gt;Q:Yahooとかニュースをストップワードとしてますが、Yahoo自体のニュースに関してはどーしてるんですか？
A:本文とタイトルから別々に作っていて、タイトルからは弾かれますが、本文から作った時に出てきます。&lt;/p&gt;
&lt;h2 id=&#34;はてなブックマークにおける-elasticsearch-の運用まわりの話--株式会社はてなidhagihala&#34;&gt;はてなブックマークにおける Elasticsearch の運用まわりの話 / 株式会社はてな　id:hagihala&lt;/h2&gt;
&lt;p&gt;スライド：未定（おそらく公開される）&lt;/p&gt;
&lt;p&gt;体調が回復しきっていない中の発表ありがとうございました。
大幅に修正された資料が出てくるかなと。（ツイートできない数値がちらほらあったので）&lt;/p&gt;
&lt;p&gt;Elasticsearchのクラスタの構成、どういった点で困ってたのでどういう調べ方をしたのか、どういった対処をしたのか。
どのあたりが次の課題かなどの話もありました。&lt;/p&gt;
&lt;h2 id=&#34;感想反省点など&#34;&gt;感想・反省点など&lt;/h2&gt;
&lt;p&gt;大阪、京都ともに30名弱の方の参加をしていただきました。ありがとうございました。
反省点としては、ハッシュタグを告知し忘れてました。。。&lt;/p&gt;
&lt;p&gt;勉強会はやはり、東京が異常に活発で、大阪や京都はまだそれほどでもないのかなぁとも。
大阪はエンジニアの人や会社も多い気がするんですが。私の告知の仕方もあるかもなぁと。
次回があれば、大阪での事例も聞きたいので、スピーカーをもっと探さないとなと。&lt;/p&gt;
&lt;h2 id=&#34;関連ブログなど&#34;&gt;関連ブログなど&lt;/h2&gt;
&lt;p&gt;見つけたら、リンク追加していきます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://skozawa.hatenablog.com/entry/2015/07/17/194709&#34;&gt;Elasticsearch勉強会 in 大阪/京都で発表しました&lt;/a&gt;
* &lt;a href=&#34;http://stop-the-world.hatenablog.com/entry/2015/07/22/014047&#34;&gt;「Elasticsearch での類似文書検索と More Like This Query API 詳解」というタイトルで発表しました&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;その他余談&#34;&gt;その他（余談）&lt;/h2&gt;
&lt;p&gt;大阪のYahoo!さんは立地条件（梅田のすぐそば）がよく、&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:300&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20150715/yahoo_osaka.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20150715/yahoo_osaka.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;夜景も綺麗でした。大阪城とかも見えてました。（夜景じゃないけど。。。）&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:600&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20150715/view_from_yahoo.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20150715/view_from_yahoo.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;京都は祇園祭の真っ最中。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:300&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20150715/naginata2.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20150715/naginata2.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;水曜日はお休みをいただいて、観光してました。ちょっと日焼けが。。。
おかげで、リフレッシュできました。三十三間堂とか良かった:)&lt;/p&gt;
&lt;p&gt;あまり、関西に縁がない（大阪15年ぶり、京都10年ぶり）ので、
もっとユーザが増えて勉強会の機運が高まると嬉しいなと。:)&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Introduction Elastic</title>
      <link>https://blog.johtani.info/presentation/2015/introduction-elastic-1/</link>
      <pubDate>Thu, 16 Jul 2015 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2015/introduction-elastic-1/</guid>
      <description>&lt;p&gt;Elasticsearch勉強会 in 大阪/京都 での発表資料&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Elasticsearch勉強会 in 大阪/京都 での発表資料&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Mappingのすばらしいリファクタリング（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2015/07/08/great-mapping-refactoring-ja/</link>
      <pubDate>Wed, 08 Jul 2015 18:11:31 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/07/08/great-mapping-refactoring-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/great-mapping-refactoring&#34;&gt;The Great Mapping Refactoring&lt;/a&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Elasticsearchのユーザの悩みの最も大きなものの一つは、
タイプとフィールドのマッピングに関する多義性です。
この多義性は、インデックス時の例外やクエリ時の例外、
正しくない結果、リクエストからリクエストへ変化する結果、
また、インデックスの故障やデータのロスを結果として引き起こします。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/great-mapping-refactoring&#34;&gt;The Great Mapping Refactoring&lt;/a&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Elasticsearchのユーザの悩みの最も大きなものの一つは、
タイプとフィールドのマッピングに関する多義性です。
この多義性は、インデックス時の例外やクエリ時の例外、
正しくない結果、リクエストからリクエストへ変化する結果、
また、インデックスの故障やデータのロスを結果として引き起こします。&lt;/p&gt;
&lt;p&gt;Elasticsearchをより強固で予測可能な振る舞いをするようにする作業において、
フィールドやタイプのマッピングをより厳格でより信頼性を高くするかといったことに
多くの変更を費やしました。
多くのケースで、Elasticsearch v2.0で新しいインデックスを作るときにのみ、
新しいルールを強制し、これまでのインデックスに関しては後方互換性を保つようにします。&lt;/p&gt;
&lt;p&gt;しかし、幾つかのケースでは、先ほど説明したようなフィールドマッピングの
コンフリクトなどが存在するため、それらを利用できないです。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;コンフリクトしたフィールドのマッピングをもつインデックスはElasticsearch v2.0にはアップグレードできません。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;もし、これらのインデックスのデータが必要ない場合は、インデックスを消せばいいです。
そうでない場合はマッピングを正しくして再度インデックスする必要があるでしょう。&lt;/p&gt;
&lt;p&gt;マッピングを正しく変更することは、私たちが簡単に決めることではありません。
ここからは、現在ある問題点と、私たちがどのように実装して解決したかについて説明します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#conflicting-field-mappings&#34;&gt;フィールドマッピングのコンフリクト&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#ambiguous-field-lookup&#34;&gt;あいまいなフィールドのルックアップ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#type-meta-fields&#34;&gt;タイプのメタフィールド&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#analyzer-settings&#34;&gt;アナライザ設定&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#index_name-and-path&#34;&gt;&lt;code&gt;index_name&lt;/code&gt;と&lt;code&gt;path&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#mapping-update&#34;&gt;同期的なマッピングの更新&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#delete-mapping&#34;&gt;マッピングの削除&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#prepare-2_0&#34;&gt;2.0のための準備&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;フィールドマッピングのコンフリクト&#34;&gt;&lt;a name=&#34;conflicting-field-mappings&#34;&gt;フィールドマッピングのコンフリクト&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;これまで、わたしたちはドキュメントのタイプは「データベースのテーブルのようなもの」と説明していました。
タイプの目的を説明する簡単な方法だったからです。
しかし、残念なことにこれは、真実ではありません。
「同じ」インデックスの「異なるタイプ」にある同じ名前のフィールドは、
内部的に、Luceneのフィールド名が同じものになります。&lt;/p&gt;
&lt;p&gt;もし&lt;code&gt;error&lt;/code&gt;フィールドとして、ドキュメントタイプが&lt;code&gt;apache&lt;/code&gt;のものには数値（integer）を、
ドキュメントタイプが&lt;code&gt;nginx&lt;/code&gt;のものには文字列（string）を割り当てた場合、
Elasticsearchは同じLuceneのフィールドに数値と文字列のデータをもつことになります。
このフィールドに対して、検索やaggregationを行う場合、おかしな結果を受け取るか、例外が帰ってくるか、
インデックスが破損することになります。&lt;/p&gt;
&lt;p&gt;この問題を解決するために、まず、ドキュメントタイプの名前をフィールドの名前の前に追加することを考えました。
各フィールドは完全に別のものとなります。
このアプローチの利点はドキュメントタイプが実際のテーブルのようになることです。&lt;/p&gt;
&lt;p&gt;しかし、この方法には多くの欠点があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;フィールドは常に、他のタイプとは異なるものであると区別するためもしくは、複数のタイプに同じフィールドのクエリのためにワイルドカードをつけた場合、
ドキュメントタイプを前につける必要があります。&lt;/li&gt;
&lt;li&gt;複数のドキュメントタイプに対して同じフィールド名で検索する場合、クエリを個別に発行しなければならなく遅くなります。&lt;/li&gt;
&lt;li&gt;多くの検索で、既存の多くのクエリを壊してしまうために、単純な&lt;code&gt;match&lt;/code&gt;や&lt;code&gt;term&lt;/code&gt;クエリの代わりに、multi-fieldクエリを使う必要があります。&lt;/li&gt;
&lt;li&gt;圧縮の効率の悪さから、ヒープ利用量、ディスク使用量、I/Oなどが、増加します。&lt;/li&gt;
&lt;li&gt;複数のドキュメントタイプに対するaggregationは、global ordinalの利点を利用できなくなるために、遅くなり、メモリの使用量も増えます。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;解決方法&#34;&gt;解決方法&lt;/h3&gt;
&lt;p&gt;最終的に、同じインデックスの同じ名前を持つ全てのフィールドは、同じマッピングを持つ必要があるというルールを採用することに決めました。
ただ、&lt;code&gt;copy_to&lt;/code&gt;や&lt;code&gt;enabled&lt;/code&gt;のようなパラメータはタイプごとに指定することができるようになっています。
これにより、データの破損、クエリ時の例外そして、おかしな結果が発生する問題を防ぎます。
クエリとaggregationは現在でも高速なままで、圧縮率を最大化し、ヒープ使用量やディスク使用率の低減させます。&lt;/p&gt;
&lt;p&gt;この解決方法の欠点は、個別のテーブルとしてタイプを扱いたいユーザが彼らの考え方を変える必要があるということです。
これは、思ったよりも問題ではありません。
実際には、多くのフィールド名はデータの明確なタイプを表現しています。
&lt;code&gt;created_date&lt;/code&gt;は常に、日付ですし、&lt;code&gt;number_of_hits&lt;/code&gt;フィールドはいつも数値です。
フィールドマッピングがコンフリクトしているユーザはデータを失ったり、おかしなデータを受け取ったり、データを欠損させています。
ベストプラクティスにユーザが従っているかどうかによらず、インデックス時に正しい振る舞いを強制することが現在の違いです。&lt;/p&gt;
&lt;p&gt;ユーザの多くがコンフリクトしていないフィールドマッピングをもっていれば、
コンフリクトが起きた場合、技術がこれらのシチュエーションを扱うことが可能になると思いませんか？
そこにはいくつかの解決方法があります。&lt;/p&gt;
&lt;h4 id=&#34;タイプの代わりにインデックスを別々に&#34;&gt;タイプの代わりにインデックスを別々に&lt;/h4&gt;
&lt;p&gt;最も簡単な解決方法です。インデックスを別々のインデックスとし、実際のデータベーステーブルのようにします。
インデックスをまたいだ検索はタイプをまたいだ検索のように動作しますし、
ソートやaggregationも同じデータタイプへのクエリのように動作します。これまでと同じ制限です。&lt;/p&gt;
&lt;h4 id=&#34;コンフリクトしたフィールドの名前の変更&#34;&gt;コンフリクトしたフィールドの名前の変更&lt;/h4&gt;
&lt;p&gt;コンフリクトがごくわずかな場合、（Logstashやアプリケーションで使っているものも一緒に）よりわかりやすいフィールド名に変更することで解決できます。
例えば、2つの&lt;code&gt;error&lt;/code&gt;フィールドがあった場合に、&lt;code&gt;error_code&lt;/code&gt;と&lt;code&gt;error_message&lt;/code&gt;に変更します。&lt;/p&gt;
&lt;h4 id=&#34;copy_toもしくはmulti-fieldsを利用&#34;&gt;&lt;code&gt;copy_to&lt;/code&gt;もしくはmulti-fieldsを利用&lt;/h4&gt;
&lt;p&gt;異なるドキュメントタイプのフィールドは別々の&lt;code&gt;copy_to&lt;/code&gt;を設定できます。
元の&lt;code&gt;error&lt;/code&gt;フィールドは&lt;code&gt;index&lt;/code&gt;の設定に&lt;code&gt;no&lt;/code&gt;が設定してあり、全てのドキュメントタイプで無効化されていますが、
特定のタイプだけ、&lt;code&gt;error&lt;/code&gt;フィールドの値を数値の&lt;code&gt;error_code&lt;/code&gt;フィールドにコピーすることができます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;PUT my_index/_mapping/mapping_one
{
  &amp;#34;properties&amp;#34;: {
    &amp;#34;error&amp;#34;: {
      &amp;#34;type&amp;#34;: &amp;#34;string&amp;#34;,
      &amp;#34;index&amp;#34;: &amp;#34;no&amp;#34;,
      &amp;#34;copy_to&amp;#34;: &amp;#34;error_code&amp;#34;
    },
    &amp;#34;error_code&amp;#34;: {
      &amp;#34;type&amp;#34;: &amp;#34;integer&amp;#34;
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;他のタイプでは文字列の&lt;code&gt;error_message&lt;/code&gt;にコピーします。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;PUT my_index/_mapping/mapping_two
{
  &amp;#34;properties&amp;#34;: {
    &amp;#34;error&amp;#34;: {
      &amp;#34;type&amp;#34;: &amp;#34;string&amp;#34;,
      &amp;#34;index&amp;#34;: &amp;#34;no&amp;#34;,
      &amp;#34;copy_to&amp;#34;: &amp;#34;error_message&amp;#34;
    },
    &amp;#34;error_message&amp;#34;: {
      &amp;#34;type&amp;#34;: &amp;#34;string&amp;#34;
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;同様の解決方法として&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/master/mapping-core-types.html#multi-fields&#34;&gt;multi-field&lt;/a&gt;も使えます。&lt;/p&gt;
&lt;h4 id=&#34;各データタイプに対してネストしたフィールドに&#34;&gt;各データタイプに対してネストしたフィールドに&lt;/h4&gt;
&lt;p&gt;ときどき、Elasticsearchに送ったドキュメントやドキュメントがもっているフィールドを制御できない場合があります。
部分的なコンフリクトに加え、闇雲に、ユーザが送ってきたフィールドを受け入れると、マッピングが肥大化します。
タイムスタンプやIPアドレスをフィールド名に使うようなドキュメントがあると考えてください。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-nested-type.html&#34;&gt;&lt;code&gt;nested&lt;/code&gt; フィールド&lt;/a&gt;にすることで、&lt;code&gt;str_val&lt;/code&gt;、&lt;code&gt;int_val&lt;/code&gt;、&lt;code&gt;date_val&lt;/code&gt;というような各データタイプを利用できます。&lt;/p&gt;
&lt;p&gt;このアプローチによって、次のドキュメントは&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{
  &amp;#34;message&amp;#34;: &amp;#34;some string&amp;#34;,
  &amp;#34;count&amp;#34;:   1,
  &amp;#34;date&amp;#34;:    &amp;#34;2015-06-01&amp;#34;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;アプリケーションによって、次のようにフォーマットしなおす必要があります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{
  &amp;#34;data&amp;#34;: [
    {&amp;#34;key&amp;#34;: &amp;#34;message&amp;#34;, &amp;#34;str_val&amp;#34;:  &amp;#34;some_string&amp;#34; },
    {&amp;#34;key&amp;#34;: &amp;#34;count&amp;#34;,   &amp;#34;int_val&amp;#34;:  1             },
    {&amp;#34;key&amp;#34;: &amp;#34;date&amp;#34;,    &amp;#34;date_val&amp;#34;: &amp;#34;2015-06-01&amp;#34;  }
  ]
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;この解決方法は、アプリケーションサイドでより多くの作業が必要ですが、コンフリクトの問題とマッピングの肥大化の問題を同時に解決します。&lt;/p&gt;
&lt;h2 id=&#34;あいまいなフィールドのルックアップ&#34;&gt;&lt;a name=&#34;#ambiguous-field-lookup&#34;&gt;あいまいなフィールドのルックアップ&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;現在、フィールドの指定には&amp;quot;short name&amp;quot;、フルパス、ドキュメントタイプを前につけたフルパスが利用できます。
これらのオプションがあいまいさをもたらしています。
サンプルとして次のマッピングをご覧ください。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{
  &amp;#34;mappings&amp;#34;: {
    &amp;#34;user&amp;#34;: {
      &amp;#34;properties&amp;#34;: {
        &amp;#34;title&amp;#34;: {
          &amp;#34;type&amp;#34;: &amp;#34;string&amp;#34;
        }
      }
    },
    &amp;#34;blog&amp;#34;: {
      &amp;#34;properties&amp;#34;: {
        &amp;#34;title&amp;#34;: {
          &amp;#34;type&amp;#34;: &amp;#34;string&amp;#34;
        },
        &amp;#34;user&amp;#34;: {
          &amp;#34;type&amp;#34;: &amp;#34;object&amp;#34;,
          &amp;#34;fields&amp;#34;: {
            &amp;#34;title&amp;#34;: {
              &amp;#34;type&amp;#34;: &amp;#34;string&amp;#34;
            }
          }
        }
      }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;title&lt;/code&gt;は&lt;code&gt;user.title&lt;/code&gt;、&lt;code&gt;blog.title&lt;/code&gt;、&lt;code&gt;blog.user.title&lt;/code&gt;のどれでしょう？&lt;/li&gt;
&lt;li&gt;&lt;code&gt;user.title&lt;/code&gt;は&lt;code&gt;user.title&lt;/code&gt;または&lt;code&gt;blog.user.title&lt;/code&gt;のどちらでしょう？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;答えは「場合によります。」です。Elasticsearchが最初に見つけたものになります。
フィールドはリクエストごとに変わるため、各ノードでマッピングがどのようにシリアライズされたかに依存します。&lt;/p&gt;
&lt;p&gt;2.0では、フィールドを指定する時に、ドキュメントタイプを除いたフルパス名を使用するべきでしょう。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;user.title&lt;/code&gt;は、&lt;code&gt;blog&lt;/code&gt;タイプの&lt;code&gt;user.title&lt;/code&gt;を意味します。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;title&lt;/code&gt;は、&lt;code&gt;user&lt;/code&gt;と&lt;code&gt;blog&lt;/code&gt;タイプの&lt;code&gt;title&lt;/code&gt;フィールドを意味します。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;*title&lt;/code&gt;は&lt;code&gt;user.title&lt;/code&gt;と&lt;code&gt;title&lt;/code&gt;フィールドの両方にマッチします。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;user&lt;/code&gt;タイプの&lt;code&gt;title&lt;/code&gt;フィールドと&lt;code&gt;blog&lt;/code&gt;タイプの&lt;code&gt;title&lt;/code&gt;の違いはどのように指定するのでしょう？&lt;/p&gt;
&lt;p&gt;指定できません。&lt;a href=&#34;#conflicting-field-mappings&#34;&gt;フィールドマッピングのコンフリクト&lt;/a&gt;で説明した変更により、
&lt;code&gt;title&lt;/code&gt;フィールドは両方のタイプで同じフィールドになります。
本質的に&lt;code&gt;title&lt;/code&gt;と呼ばれる1つのフィールドになります。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;user.&lt;/code&gt;や&lt;code&gt;blog.&lt;/code&gt;のようなタイプのプレフィックスはタイプを指定することによるフィルタリングで効果があります。
クエリの&lt;code&gt;blog.title&lt;/code&gt;フィールドは&lt;code&gt;blog&lt;/code&gt;タイプのドキュメントだけを検索し、&lt;code&gt;user&lt;/code&gt;タイプのドキュメントを検索しません。
このシンタックスは誤解を招きやすいです。なぜなら、いつでも動作するわけではないからです。
aggregationやsuggestionはすべてのタイプに関する結果を含みます。
この利用のため、上記の例のあいまいさがあるので、タイプのプレフィックスはサポートしません。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;重要&lt;/strong&gt; short nameやタイププレフィックスを利用したpercolatorは更新する必要があります。&lt;/p&gt;
&lt;h2 id=&#34;タイプのメタフィールド&#34;&gt;&lt;a name=&#34;type-meta-fields&#34;&gt;タイプのメタフィールド&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;すべてのタイプはメタフィールドを持っています。&lt;code&gt;_id&lt;/code&gt;、&lt;code&gt;_index&lt;/code&gt;、&lt;code&gt;_routing&lt;/code&gt;、&lt;code&gt;_parent&lt;/code&gt;、&lt;code&gt;_timestamp&lt;/code&gt;などです。
これらのほとんどは&lt;code&gt;index&lt;/code&gt;、&lt;code&gt;store&lt;/code&gt;、&lt;code&gt;path&lt;/code&gt;のような幾つかの設定をサポートしています。
これらの設定について次のようにシンプルにしました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;_id&lt;/code&gt;と&lt;code&gt;_type&lt;/code&gt;は変更不可&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_index&lt;/code&gt;は、ドキュメントのもつインデックスを保存するために&lt;code&gt;enabled&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_routing&lt;/code&gt;は&lt;code&gt;required&lt;/code&gt;のみを指定&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_size&lt;/code&gt;は&lt;code&gt;enabled&lt;/code&gt;のみ&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_timestamp&lt;/code&gt;はデフォルトで保存される&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_boost&lt;/code&gt;と&lt;code&gt;_analyzer&lt;/code&gt;は廃止。古いインデックスのものは無視される&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ドキュメントのフィールドから&lt;code&gt;_id&lt;/code&gt;と&lt;code&gt;_routing&lt;/code&gt;と&lt;code&gt;_timestamp&lt;/code&gt;の値を抽出することができました。
この機能は廃止されます。これは、ドキュメントのパースとコンフリクトを起こすためです。
代わりに、これらの値はURLもしくはquery stringで指定可能です。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;_boost&lt;/code&gt;と&lt;code&gt;_analyzer&lt;/code&gt;フィールドは例外で、すでにあるメタフィールドの設定は古いインデックスのものが採用されます。&lt;/p&gt;
&lt;h2 id=&#34;アナライザ設定&#34;&gt;&lt;a name=&#34;analyzer-settings&#34;&gt;アナライザ設定&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;これまで、indexとsearchのアナライザがインデックス、タイプ、フィールド、ドキュメント（&lt;code&gt;_analyzer&lt;/code&gt;フィールドで）の
それぞれのレベルで指定可能でした。
同じフィールドに対して異なるanalysis chainの組み合わせができることにより、おかしな関連度を引き起こしていました。
フィールドマッピングのコンフリクトを解消することに加え、アナライザの設定も簡略化します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Analyzedな文字列フィールドは、&lt;code&gt;analyzer&lt;/code&gt;設定と&lt;code&gt;search_analyzer&lt;/code&gt;設定（&lt;code&gt;analyzer&lt;/code&gt;設定の値をデフォルトとする）を指定できます。&lt;code&gt;index_analyzer&lt;/code&gt;設定は&lt;code&gt;analyzer&lt;/code&gt;となります。&lt;/li&gt;
&lt;li&gt;複数のタイプで同じ名前のフィールドがある場合、フィールドはすべて、同じアナライザの設定を持たなければなりません。&lt;/li&gt;
&lt;li&gt;タイプレベルのデフォルト設定の&lt;code&gt;analyzer&lt;/code&gt;、&lt;code&gt;index_analyzer&lt;/code&gt;、&lt;code&gt;search_analyzer&lt;/code&gt;設定は廃止されます。&lt;/li&gt;
&lt;li&gt;デフォルトアナライザはインデックスごとにインデックスの&lt;code&gt;analysis&lt;/code&gt;設定で設定します。これらは&lt;code&gt;default&lt;/code&gt;もしくは&lt;code&gt;default_search&lt;/code&gt;という名前で設定します。&lt;/li&gt;
&lt;li&gt;ドキュメントごとの&lt;code&gt;_analyzer&lt;/code&gt;フィールドはサポートしません。既存のインデックスのものは無視されます。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;index_nameとpath&#34;&gt;&lt;a name=&#34;index_name-and-path&#34;&gt;&lt;code&gt;index_name&lt;/code&gt;と&lt;code&gt;path&lt;/code&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;index_name&lt;/code&gt;と&lt;code&gt;path&lt;/code&gt;設定は（Elasticsearch v1.0.0から利用できる）&lt;code&gt;copy_to&lt;/code&gt;によって置き換わりました。
既存のインデックスについてはこれらは機能しますが、新しいインデックスでは指定できません。&lt;/p&gt;
&lt;h2 id=&#34;同期的なマッピングの更新&#34;&gt;&lt;a name=&#34;mapping-update&#34;&gt;同期的なマッピングの更新&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;現在、これまで存在していないフィールドを含むドキュメントをインデキシングするとき、
フィールドはローカルのマッピングに追加され、それから、マスターに変更（新しいマッピングをすべてのシャードに適用する更新）が送信されていました。
同時に2つのシャードに同じフィールドを追加することができます。
また、そのとき、異なる2つのマッピングがある可能性があります。
1つは&lt;code&gt;double&lt;/code&gt;でもう1つは&lt;code&gt;long&lt;/code&gt;だったり、&lt;code&gt;string&lt;/code&gt;と&lt;code&gt;date&lt;/code&gt;だったりと。&lt;/p&gt;
&lt;p&gt;このような場合、マスターに最初に届いたマッピングが採用されます。
しかし、「負けた」マッピングをもつシャードでは、すでに異なるデータのタイプを利用しているため、
これを利用し続けます。
そのご、ノードをリスタートしたときに、シャードが別のノードに移動し、マスターにあるマッピングを適用します。
このとき、インデックスが破損したりデータを失ったりします。&lt;/p&gt;
&lt;p&gt;これを防ぐために、シャードはインデキシングを続ける前に、新しいマッピングがマスターによって採用されるかどうかを待つようになりました。
これはすべてのマッピングが安全に更新されます。
新しいフィールドをもっているドキュメントをインデキシングすると、前よりも処理が遅くなるでしょう。
受け入れられることを待つ必要があるためです。
しかし、クラスタの状態の更新処理のスピードが次の2つの新しい機能によって大きく改善されています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;クラスタ状態の差分&lt;/strong&gt;：可能であれば、クラスタの状態の変更はクラスタ状態全体の変更ではなく、部分的なものとする。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;シャードへのリクエストの非同期化&lt;/strong&gt;：シャードアロケーション処理中に、マスタノードは、
割り当てられていないシャードのコピーの日付が最新のものを持っているかを見つけるために、リクエストをデータノードに対して送信します。
ここで、クラスタ状態を変更する呼び出しがブロッキングで行われていました。v1.6.0から、このリクエストはバックグラウンドで非同期で実行されます。
これにより、マッピング更新のようなペンディングタスクをより早く処理できるようになります。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;マッピングの削除&#34;&gt;&lt;a name=&#34;delete-mapping&#34;&gt;マッピングの削除&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;（そのタイプのドキュメントがある場合）タイプマッピングを削除できないようにします。
マッピングを削除した後に、削除されたフィールドの情報は、Luceneレベルでは存在し続け、
もし、後から同じ名前のフィールドが追加されたときにインデックスの破損を引き起こします。
そのようなマッピングは残しておくか、新しいインデックスに再インデックスすることができます。&lt;/p&gt;
&lt;h2 id=&#34;20のための準備&#34;&gt;&lt;a name=&#34;prepare-2_0&#34;&gt;2.0のための準備&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;マッピングがコンフリクトしているかどうかを決めることは、手動で行うには慎重に行う必要があります。
私たちは、&lt;a href=&#34;https://github.com/elastic/elasticsearch-migration&#34;&gt;Elasticsearch Migration Plugin&lt;/a&gt;を提供します。
これは、2.0で非推奨になったり廃止された機能を利用しているかどうかを見つけるために役に立つでしょう。&lt;/p&gt;
&lt;p&gt;もし、コンフリクトしたマッピングを持っている場合、
正しいマッピングを持つ新しいインデックスにデータを再インデックスするか、
必要ないなら削除します。
これらのコンフリクトを解決しない限り2.0にはアップグレードできないでしょう。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch 2.0.0.beta1リリース間近（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2015/07/07/elasticsearch-2-dot-0-0-dot-beta1-coming-soon-ja/</link>
      <pubDate>Tue, 07 Jul 2015 15:25:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/07/07/elasticsearch-2-dot-0-0-dot-beta1-coming-soon-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-2.0.0.beta1-coming-soon&#34;&gt;Elasticsearch 2.0.0.beta1 coming soon!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Elasticsearch 2.0.0.beta1のリリースの準備をしています。
これは、Lucene 5.2.1に含まれる多くの改善が利用できるようになります。
このリリースに関するいくつかの機能は次のようなものです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-2.0.0.beta1-coming-soon&#34;&gt;Elasticsearch 2.0.0.beta1 coming soon!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Elasticsearch 2.0.0.beta1のリリースの準備をしています。
これは、Lucene 5.2.1に含まれる多くの改善が利用できるようになります。
このリリースに関するいくつかの機能は次のようなものです。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h4 id=&#34;pipeline-aggregations&#34;&gt;Pipeline Aggregations&lt;/h4&gt;
&lt;p&gt;差分や移動平均、他のAggregationsの結果に対する
series arithmeticのようなaggregationが利用可能になります。
この機能は、これまでは、クライアントサイドで実行する必要がありました。
しかし、この計算をより強力な解析クエリを構築してElasticsearchで
実行することができるようになります。
クライアントのコードをより簡潔にすることができます。
これにより、予測解析や異常検知のようなことができるようになります。&lt;/p&gt;
&lt;h4 id=&#34;queryfilter-merging&#34;&gt;Query/Filter merging&lt;/h4&gt;
&lt;p&gt;Filterはなくなります。全てのフィルタは、クエリになります。
クエリコンテキストで利用されると、効率的に関連度スコアを計算し、
フィルタコンテキストで利用されると、単に、
マッチしていないドキュメントを除外する（今のフィルタのようなもの）だけです
この変更は、クエリ実行が自動的に、より効率的な順番で実行されるように
最適化されることを意味します。
例えば、フレーズやgeoクエリのような遅いクエリは
まず、近似フェーズを実行し、それから、より遅い実際のフェーズが
結果に対して行われます。
フィルタコンテキストにおいて、頻繁に利用される条件は自動的にキャッシュされます。&lt;/p&gt;
&lt;h4 id=&#34;configurable-store-compression&#34;&gt;Configurable store compression&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;index.codec&lt;/code&gt;設定により、高速化のためのLZ4圧縮（&lt;code&gt;default&lt;/code&gt;）か
インデックスサイズを小さくするためのDEFLATE（&lt;code&gt;best_compression&lt;/code&gt;）を
選択できます。これは、ロギングでとくに役に立ちます。
これにより、古いインデックスオプティマイズする前に&lt;code&gt;best_compression&lt;/code&gt;に
変更できます。&lt;/p&gt;
&lt;p&gt;これらに関するブログ記事がすぐに公開されるでしょう。&lt;/p&gt;
&lt;h3 id=&#34;performance-and-resilience&#34;&gt;Performance and resilience&lt;/h3&gt;
&lt;p&gt;以降では、新しいメジャーリリースに関して簡単に紹介します。
2.0の変更の多くは内部の機能に関するものであり、
直接ユーザに関連するわけではないからです。&lt;/p&gt;
&lt;p&gt;新しいメジャーバージョンのテーマは、パフォーマンス、安定性、
堅牢性、予測可能性、そして使い勝手の良さです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;物事が予測した通りに動作する&lt;/li&gt;
&lt;li&gt;何か問題があった場合に、Elasticsearchから役立つフィードバックがある&lt;/li&gt;
&lt;li&gt;ローレベルの設定を扱う必要はなく、Elasticsearchが良い設定を決定する&lt;/li&gt;
&lt;li&gt;これらに加え、データがより安全に&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらの目標は完全ではありません。
まだ、多くの改善があります。しかし、2.xブランチで、
すでに500コミットを超える大きな改善が実施されています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;on-diskの doc valuesをデフォルトで利用（これまではfielddata）。
ヒープ使用量を減らして、スケーラビリティを向上&lt;/li&gt;
&lt;li&gt;セグメントマージ処理中のメモリ使用量の削減&lt;/li&gt;
&lt;li&gt;normsの圧縮率の改善。ヒープスペースを利用している大きな処理のひとつだったため。&lt;/li&gt;
&lt;li&gt;全てのリクエストの後に、transaction logをfsyncすることで、デフォルトで耐久性を向上&lt;/li&gt;
&lt;li&gt;全てのファイル変更をアトミックに（部分的なファイルの書き出しはなし）&lt;/li&gt;
&lt;li&gt;マージを自動で制限&lt;/li&gt;
&lt;li&gt;フレーズクエリやスパンクエリを高速化&lt;/li&gt;
&lt;li&gt;フィルタキャッシュをより効率化するための圧縮されたビットセット&lt;/li&gt;
&lt;li&gt;クラスタ状態の差分更新&lt;/li&gt;
&lt;li&gt;構造化されたJSON形式の例外&lt;/li&gt;
&lt;li&gt;よりきめ細かいLuceneのメモリレポート&lt;/li&gt;
&lt;li&gt;デフォルトではlocalhostにのみバインド。開発のノードが他のクラスタにジョインするのを防ぐ&lt;/li&gt;
&lt;li&gt;parent/childのクエリ実行最適化のためにリライト&lt;/li&gt;
&lt;li&gt;Java Security Managerで必要最小限なパーミッションで実行&lt;/li&gt;
&lt;li&gt;全てのコアなプラグインをelasticsearchリポジトリに移行し、Elasticsearchのバージョンに同期してリリースされる予定&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;アップグレード前に&#34;&gt;アップグレード前に&lt;/h2&gt;
&lt;p&gt;メジャーバージョンのアップグレードは問題のあるものを一掃する機会を与えてくれます。
できる限り、これらの変更をアップグレードするために、簡単な方法を提供しようとしています。
しかし、Elasticsearch 2.0にアップグレードする前に、必要な処理が2つあります。&lt;/p&gt;
&lt;p&gt;1つ目は、フィールドとタイプマッピングに関することです。
mapping APIは、現在、それほど厳密ではありません。
内蔵された保護機構を提供する代わりに、ユーザがベストプラクティスを知っていると信頼していました。
2.0では、mappingはより厳密で安全ですが、いくつかの変更では、後方互換性を保っていません。
詳細については&lt;a href=&#34;https://www.elastic.co/blog/great-mapping-refactoring&#34;&gt;The Great Mapping Recatoring&lt;/a&gt;をごらんください。&lt;/p&gt;
&lt;p&gt;2つ目はElasticsearch 0.20以前のユーザに関する変更です。
これは、Lucene 3.xを使っています。
Elasticsearch 2.xはLucene 5をベースにしています。
Lucene 5はLucene 4.xによって作成されたインデックスの読み込みはサポートしていますが、
Lucene 3.xに関してはサポートしていません。&lt;/p&gt;
&lt;p&gt;Elasticsearch 0.20以前のバージョンによって生成されたインデックスを持っている場合、
Elasticsearch 2.xのクラスタをスタートすることはできません。
これらの古いインデックスを削除するか、Elaticsearch 1.6.0以上に含まれている
&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-upgrade.html&#34;&gt;upgrade API&lt;/a&gt;を使用してアップグレードする必要があります。&lt;/p&gt;
&lt;p&gt;upgrade APIの実行は2つのジョブを実行します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;古いLuceneフォーマットのセグメントを最新のフォーマットで書き換えます&lt;/li&gt;
&lt;li&gt;Elasticsearch 2.xによって読み込めるようという印をインデックスに追加します&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;全てのセグメントを最新バージョンにアップグレードするのも良い案ですが、
アップグレード前に必要な処理を最小限に抑えることも可能です。
（Lucene 3.xのセグメントだけをアップグレード）
その場合は、&lt;code&gt;only_ancient_segments&lt;/code&gt;パラメータを指定します。&lt;/p&gt;
&lt;h2 id=&#34;elasticsearch-migration-plugin&#34;&gt;Elasticsearch Migration Plugin&lt;/h2&gt;
&lt;p&gt;Elasticsearch 2.0 に移行する前に、インデックスがアップグレードが必要なのか、
ほかになにかするべきことがあるのかをチェックする助けになる
Elasticsearch Migration Pluginをリリースしました。&lt;/p&gt;
&lt;p&gt;まず、プラグインをインストールします&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./bin/plugin -i elastic/elasticsearch-migration
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;プラグインのインストール後はノードのリスタートは必要ありません。&lt;/p&gt;
&lt;p&gt;以下のリンクをブラウザで開きます。&lt;/p&gt;
&lt;p&gt;http://localhost:9200/_plugin/migration&lt;/p&gt;
&lt;p&gt;（&lt;code&gt;localhost:9200&lt;/code&gt;はインストールしたホスト名に変更してください。）&lt;/p&gt;
&lt;p&gt;Migration pluginに関してバグやご意見がある場合は、&lt;a href=&#34;http://github.com/elastic/elasticsearch-migration/issues&#34;&gt;GitHubのIssue&lt;/a&gt;にお願いします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>さらに進化したFound（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2015/07/07/we-just-made-found-more-awesome-ja/</link>
      <pubDate>Tue, 07 Jul 2015 15:20:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/07/07/we-just-made-found-more-awesome-ja/</guid>
      <description>&lt;p&gt;4ヶ月前に、&lt;a href=&#34;https://www.elastic.co/blog/welcome-found&#34;&gt;Found joined our team at Elastic&lt;/a&gt;をアナウンスしました。
Foundの素晴らしいチームと一緒に仕事をしていますが、彼らによって、より素晴らしい
hosted Elasticsearchを提供することになりました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;4ヶ月前に、&lt;a href=&#34;https://www.elastic.co/blog/welcome-found&#34;&gt;Found joined our team at Elastic&lt;/a&gt;をアナウンスしました。
Foundの素晴らしいチームと一緒に仕事をしていますが、彼らによって、より素晴らしい
hosted Elasticsearchを提供することになりました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;私たちがともに密接に働くことにより、本日（2015/7/1）、
&lt;a href=&#34;https://www.elastic.co/products/found&#34;&gt;新しい2つのFound&lt;/a&gt;を提供することになりました。
Found StandardはこれまでのFoundの機能に加え、さらに低価格を提供します。
Found Premiumは、SLAサポートと、ShieldやWatcherを将来Found上で提供します。&lt;/p&gt;
&lt;h2 id=&#34;found-standard&#34;&gt;Found Standard&lt;/h2&gt;
&lt;p&gt;Foundは素晴らしいです。専用のElasticsearchクラスタ、簡単なスケール、
ビルトインのセキュリティそして、時間単位での課金などを持っています。
私たちは、hosted Elasticsearchを探している方に、
Foundが適したソリューションであると思っていますし、
すべての方に利用できて手頃な価格であるということを確信したいと思っています。&lt;/p&gt;
&lt;p&gt;本日（2015/07/01）からFoundの価格をかなり低価格にし、
&lt;strong&gt;月額50ドル以下&lt;/strong&gt;でhosted Elasticsearchを簡単に試してもらえるようにしました。&lt;/p&gt;
&lt;p&gt;価格を下げることは正しい重要なステップですが、
Foundを利用している全ての人に、より良い経験を持っていただきたいと考えています。
低価格化と一緒に、&lt;strong&gt;free backups&lt;/strong&gt;と&lt;strong&gt;built in SSD&lt;/strong&gt;もFoundで提供を始めることになります。&lt;/p&gt;
&lt;p&gt;Foundの重要な特徴の一つが、高可用性のために、クラスタをいくつのデータセンターに持つかを
選択できることです。
データは重要です。これが正しい選択でユーザの助けになると考えています。
これにより、私たちの価格は、&lt;strong&gt;複数のデータセンターにより安価に&lt;/strong&gt;配置することができます。&lt;/p&gt;
&lt;p&gt;また、KibanaもElasticsearchのデータを可視化する素晴らしい方法だと考えています。
Kibana 4が最新バージョンですが、
これは、サーバサイドコンポーネントを持っています。
これは、サービスとしてこれを提供するために、追加の料金がかかることを意味します。
Foundチームが築いた素晴らしい基盤とKibanaチームの努力により、
hosted Elasticsearchクラスタで&lt;strong&gt;無料のKibana 4&lt;/strong&gt;を7月15日より提供することになりました。&lt;/p&gt;
&lt;h2 id=&#34;found-premium&#34;&gt;Found Premium&lt;/h2&gt;
&lt;p&gt;また、私たちは、オープンソースプロダクトに関してサブスクリプションを提供していますが、
Found Standardに対しても提供することになりました。
これが、Found Premiumです。&lt;/p&gt;
&lt;p&gt;フォーラムベースのサポートよりもSLAベースのサポートを望んでいる場合、
プロダクトを開発しているチームからのサポートを受けることができるオプションを
提供し始めました。
クリティカルなイベントを持っていたり、私たちのプロダクトに関する
問題を予測するためのベストなヘルプやガイダンス、アドバイスを探しているような場合にサポートします。&lt;/p&gt;
&lt;p&gt;さらに近い将来、サブスクリプションの一部として、&lt;a href=&#34;https://www.elastic.co/products/shield&#34;&gt;Shield&lt;/a&gt;（Elasticasearchのセキュリティプラグイン）や&lt;a href=&#34;https://www.elastic.co/products/watcher&#34;&gt;Watcher&lt;/a&gt;（アラーティングプラグイン）が利用できるようになります。&lt;/p&gt;
&lt;p&gt;私たちのチームがともに働き、多くのことを可能にし、すばらしい仕事をユーザに提供したかを
将来も楽しみです。
私は非常に誇りに思っていますし、気に入っていただけたらと思っています。
ぜひ、&lt;a href=&#34;https://www.elastic.co/webinars/getting-started-with-found&#34;&gt;7/15のWebnarに参加して&lt;/a&gt;くわしい話を聞いていただき、疑問を解消してください。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>JustTechTalk#02 形態素解析のあれやこれや@ジャストシステムに参加しました。</title>
      <link>https://blog.johtani.info/blog/2015/07/06/attend-justsystem-techtalk-no2/</link>
      <pubDate>Mon, 06 Jul 2015 10:49:01 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/07/06/attend-justsystem-techtalk-no2/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://justsystems.doorkeeper.jp/events/27174&#34;&gt;JustTechTalk#02 形態素解析のあれやこれや@ジャストシステム&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;に参加してきました。
ジャストシステムさんの形態素解析器JMATの話とKagome、Janome、Kuromoji.js、ssslaの開発者の
パネルディスカッションでした。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://justsystems.doorkeeper.jp/events/27174&#34;&gt;JustTechTalk#02 形態素解析のあれやこれや@ジャストシステム&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;に参加してきました。
ジャストシステムさんの形態素解析器JMATの話とKagome、Janome、Kuromoji.js、ssslaの開発者の
パネルディスカッションでした。&lt;/p&gt;
&lt;p&gt;ということで、いつものメモです。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;ジャストシステムの形態素解析その２機械学習編&#34;&gt;ジャストシステムの形態素解析その２（機械学習編）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JMATの話&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;前回は辞書の話&lt;/li&gt;
&lt;li&gt;今回は学習の話&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;教師あり/教師なし&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JMATは教師あり&lt;/li&gt;
&lt;li&gt;教師なしは研究段階&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ラティス構造を辞書ベースで構築して、コストの総和が最小の経路を求める&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;連接、単語生成とか。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;学習は3フェーズ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ベース、能動、部分アノテーション&lt;/li&gt;
&lt;li&gt;ベース
&lt;ul&gt;
&lt;li&gt;300万文のコーパスから1万文のみを利用（なぜ？今から説明）
&lt;ul&gt;
&lt;li&gt;64GBマシン買ってみたけど、複数実験するには追いつかない&lt;/li&gt;
&lt;li&gt;オンライン学習がメジャーでない時代に作り始めたので、つかってない&lt;/li&gt;
&lt;li&gt;CRF学習器を改善
&lt;ul&gt;
&lt;li&gt;結果として50万文くらいで精度が良くなる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;辞書チームからNGがでて、方向転換&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;方向転換した結果が3つのフェーズらしい&lt;/li&gt;
&lt;li&gt;ピタジョブに採用？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;疑問&#34;&gt;疑問&lt;/h3&gt;
&lt;p&gt;* JMATって、Webの検索の前処理とか分類とかに主に利用するのかな？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ATOKでもこのノウハウって利用してるんかな？&lt;/li&gt;
&lt;li&gt;辞書もあるらしいけど、辞書更新されると学習器のデータとかどーなるんだろ？&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;形態素解析器の実装言語talkについて&#34;&gt;形態素解析器の実装言語Talkについて&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;kuromoji.jsの@takuya_aさん&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Typed Arrayサポートが高速にできてる理由でもあるらしい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kagomeの@ikawahaさん&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Goはいろいろないらしい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Janomeの@moco_betaさん&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;sssla（茶筌のRuby clone）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;なんで作ったの？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;形態素解析の&lt;strike&gt;ライブラリ&lt;/strike&gt;「解析部分」はNLPのHelloWorldだから&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;なんで、その言語？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Python 3系は文字列とバイト配列の扱いがすごく楽！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;その言語で困った点は？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Goだと、辞書を内包するのが大変&lt;/li&gt;
&lt;li&gt;JSは苦労したところしかない（1hくらいしゃべれるぞ！）。基本的なデータ構造とかもない&lt;/li&gt;
&lt;li&gt;Pythonはパフォーマンスを考えないと&lt;/li&gt;
&lt;li&gt;Ruby（1.6だったので）もパフォーマンスが&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;その言語を開発するときに必須のものは？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Goはとくにない。エディタはどれでもOK&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://browserify.org/&#34;&gt;browserify&lt;/a&gt;が便利&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;* ほかの人たちの言語をdisってください
* JSは論外。Pythonのコードフォーマッターが揺れるのが。。。Rubyはバージョンが。。。
* Goはブラウザで動かない。Pythonもブラウザで動かない。Rubyも(ry
* ほかのは触ったことないので。。。
* Pythonは2.xか3.xか決めてくれ！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;なんで、Kuromojiベースなの？
&lt;ul&gt;
&lt;li&gt;Java読みやすいから。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MeCabとKuromojiの違いは？
&lt;ul&gt;
&lt;li&gt;未知語の処理が結構違う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;感想&#34;&gt;感想&lt;/h2&gt;
&lt;p&gt;きれいなロビーで良かったのですが、マイクがあると嬉しかったかもしれません。
前回の辞書の話も聞いてみたかったかも。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Hatena Engineer Seminar #5 @ Tokyoに参加しました。 #hatenatech</title>
      <link>https://blog.johtani.info/blog/2015/06/17/attend-hatena-engineer-seminar-5/</link>
      <pubDate>Wed, 17 Jun 2015 00:21:33 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/06/17/attend-hatena-engineer-seminar-5/</guid>
      <description>&lt;p&gt;ひさびさに、勉強会メモ。
&lt;a href=&#34;http://hatena.connpass.com/event/15973/&#34;&gt;Hatena Engineer Seminar #5 @ Tokyo&lt;/a&gt;に当選したので行ってきました。&lt;/p&gt;
&lt;p&gt;いつもは近寄らないオシャレな街をドキドキしながら行ってきました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;ということで、簡単なメモです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ひさびさに、勉強会メモ。
&lt;a href=&#34;http://hatena.connpass.com/event/15973/&#34;&gt;Hatena Engineer Seminar #5 @ Tokyo&lt;/a&gt;に当選したので行ってきました。&lt;/p&gt;
&lt;p&gt;いつもは近寄らないオシャレな街をドキドキしながら行ってきました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;ということで、簡単なメモです。&lt;/p&gt;
&lt;h2 id=&#34;はてなブックマーク全文検索の精度改善-idtakuya-a&#34;&gt;はてなブックマーク全文検索の精度改善 id:takuya-a&lt;/h2&gt;
&lt;h3 id=&#34;問題検索精度がよくない&#34;&gt;問題：検索精度がよくない&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;京都で検索 →　「ポーランドの京都」「京都大学のまるまる教授」のようなもんがヒット&lt;/li&gt;
&lt;li&gt;京都っぽいエントリが出て欲しい。
&lt;ul&gt;
&lt;li&gt;京都っぽい？？？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;問題点をブレイクダウン&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;課題&#34;&gt;課題&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;クエリ考えるの大変だよね&lt;/li&gt;
&lt;li&gt;順序が新着順なのが辛い&lt;/li&gt;
&lt;li&gt;適合率と再現率の両立&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;そして（ドラムロール）、できました！（さすが）&lt;/p&gt;
&lt;p&gt;アイデア：はてブのタグを利用する。
関連キーワードを抽出して、クエリ拡張する。&lt;/p&gt;
&lt;h3 id=&#34;関連キーワードとは&#34;&gt;関連キーワードとは？&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;タグ検索する&lt;/li&gt;
&lt;li&gt;検索にヒットしたTerm Vectorsを取得&lt;/li&gt;
&lt;li&gt;特徴語をTop25件取得&lt;/li&gt;
&lt;li&gt;もっともスコアが高いタームを特徴語とする
&lt;ul&gt;
&lt;li&gt;英語のストップワードとかが問題点となってたり。&lt;/li&gt;
&lt;li&gt;→Dynamic stop word listというのを利用して排除（IDF、RIDF、Gain）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;今後の課題&#34;&gt;今後の課題&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;再現率の向上&lt;/li&gt;
&lt;li&gt;解析用のフィールド・辞書を追加（精度向上や解析ミスなど）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;トークに出てきた機能など&#34;&gt;トークに出てきた機能など&lt;/h3&gt;
&lt;p&gt;トークに出てきたElasticsearchの機能については、こんなツイートをしてたので、参考にしてもらえれば。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; lang=&#34;ja&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;これのkuromoji_stemmerを使ってるっぽい？ &lt;a href=&#34;https://twitter.com/hashtag/hatenatech?src=hash&#34;&gt;#hatenatech&lt;/a&gt; / elastic/elasticsearch-analysis-kuromoji - &lt;a href=&#34;https://t.co/3F2sBYXLPH&#34;&gt;https://t.co/3F2sBYXLPH&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://twitter.com/johtani/status/610759870564859904&#34;&gt;2015, 6月 16&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;//platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; lang=&#34;ja&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;&lt;a href=&#34;https://twitter.com/hashtag/hatenatech?src=hash&#34;&gt;#hatenatech&lt;/a&gt; Term Vectors APIのドキュメントはこちら - &lt;a href=&#34;https://t.co/HhBmTDr46i&#34;&gt;https://t.co/HhBmTDr46i&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://twitter.com/johtani/status/610760840170450944&#34;&gt;2015, 6月 16&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;//platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; lang=&#34;ja&#34;&gt;&lt;p lang=&#34;it&#34; dir=&#34;ltr&#34;&gt;&lt;a href=&#34;https://twitter.com/hashtag/hatenatech?src=hash&#34;&gt;#hatenatech&lt;/a&gt; min_score - &lt;a href=&#34;https://t.co/Sc0exzJRC1&#34;&gt;https://t.co/Sc0exzJRC1&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://twitter.com/johtani/status/610763959944097793&#34;&gt;2015, 6月 16&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;//platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;h4 id=&#34;個人的な疑問&#34;&gt;個人的な疑問&lt;/h4&gt;
&lt;p&gt;Q：クエリにヒットするタグがそもそもなかったら？&lt;/p&gt;
&lt;h2 id=&#34;はてなブックマークに基づく関連記事レコメンドエンジンの開発-idskozawa&#34;&gt;はてなブックマークに基づく関連記事レコメンドエンジンの開発 id:skozawa&lt;/h2&gt;
&lt;h3 id=&#34;課題一部のエントリに対して関連記事が出ない&#34;&gt;課題：一部のエントリに対して関連記事が出ない&lt;/h3&gt;
&lt;p&gt;タグがない記事について関連エントリが出ない＝既存はタグを利用している
例：レシピで考える&lt;/p&gt;
&lt;h4 id=&#34;現行システム&#34;&gt;現行システム&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ユーザがつけたタグ情報を利用してMoreLikeThisで計算&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;新規システム&#34;&gt;新規システム&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;類似記事検索&lt;/li&gt;
&lt;li&gt;特徴語の抽出&lt;/li&gt;
&lt;li&gt;特徴語を分類&lt;/li&gt;
&lt;li&gt;関連記事検索&lt;/li&gt;
&lt;li&gt;関連記事をスコアリング&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;個人的な疑問-1&#34;&gt;個人的な疑問&lt;/h4&gt;
&lt;p&gt;Q：毎回計算してるのかな？記事登録とかされたタイミングでやってるのかな？
Q：Termの精度などどうなんだろ？&lt;/p&gt;
&lt;h2 id=&#34;brandsafe-はてなのアドベリフィケーションのしくみ-idtarao&#34;&gt;『BrandSafe はてな』のアドベリフィケーションのしくみ id:tarao&lt;/h2&gt;
&lt;p&gt;BrandSafeはてな：とか。
広告の配信先をフィルタリング&lt;/p&gt;
&lt;p&gt;複数の素朴なフィルタの組み合わせ→AdaBoost&lt;/p&gt;
&lt;h4 id=&#34;個人的な疑問-2&#34;&gt;個人的な疑問&lt;/h4&gt;
&lt;p&gt;Q：海外とかもいけるのかな？&lt;/p&gt;
&lt;h2 id=&#34;まとめと感想&#34;&gt;まとめと感想&lt;/h2&gt;
&lt;p&gt;ということで、簡単なメモでした。ピザごちそうさまでした！
聞いてて少し思ったのは、データ量があるサイトだからうまくいく手法だというのもあるんだろうなというところでした。
あとは、クエリを暗に改善するのとは別に、サジェスト的に表示するのにも使えたりするかも？と思ってみたり。
できるかどうかはわからないですが。。。&lt;/p&gt;
&lt;p&gt;Elasticsearchをいろいろと活用してもらってるのがわかって、楽しい勉強会でした。&lt;/p&gt;
&lt;!-- textlint-disable ja-technical-writing/ja-no-successive-word --&gt;
&lt;p&gt;もっともっといろんなところで宣伝してくださいw&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-successive-word --&gt;
&lt;p&gt;今日の勉強会を聞いて、俄然、京都・大阪でElasticsearch勉強会を開催したい気になってきました。
特に大阪に知り合いがいないので、だれか紹介してもらえると嬉しいです。
お待ちしてます。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch 1.6.0リリース（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2015/06/10/elasticsearch-1-6-0-released-ja/</link>
      <pubDate>Wed, 10 Jun 2015 13:31:02 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/06/10/elasticsearch-1-6-0-released-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-1-6-0-released&#34;&gt;Elasticsearch 1.6.0 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日（6/9）、&lt;strong&gt;Lucene 4.10.4&lt;/strong&gt;ベースの&lt;strong&gt;Elasticsearch 1.6.0&lt;/strong&gt;をリリースしました。
このリリースはElasticsearchの最新の安定バージョンとなります。
また、素晴らしい新機能がいくつか追加されています。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-1-6-0-released&#34;&gt;Elasticsearch 1.6.0 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日（6/9）、&lt;strong&gt;Lucene 4.10.4&lt;/strong&gt;ベースの&lt;strong&gt;Elasticsearch 1.6.0&lt;/strong&gt;をリリースしました。
このリリースはElasticsearchの最新の安定バージョンとなります。
また、素晴らしい新機能がいくつか追加されています。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;ul&gt;
&lt;li&gt;synced flushによるリスタートの高速化
* シャード配置は保留中のタスクをブロックしない&lt;/li&gt;
&lt;li&gt;レスポンスボディのJSONのフィルタリング&lt;/li&gt;
&lt;li&gt;共有ファイルシステムリポジトリに対するセキュリティフィックス&lt;/li&gt;
&lt;li&gt;古いインデックスのためのUpgrade API&lt;/li&gt;
&lt;li&gt;Kibanaユーザのためのハイライトの強化&lt;/li&gt;
&lt;li&gt;Windowsユーザのための&lt;code&gt;mlockall&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;より詳細なスクリプト設定&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-1-6-0&#34;&gt;すべての変更リストとダウンロード&lt;/a&gt;はこちらをごらんください。&lt;/p&gt;
&lt;h2 id=&#34;synced-flushによるリスタートの高速化&#34;&gt;synced flushによるリスタートの高速化&lt;/h2&gt;
&lt;p&gt;1.6.0より前のバージョンでは、メンテナンスやローリングアップグレード時の
ノードの再起動で、必要であるかどうかに関わらず、多くの場合、
ノードのすべてのシャードのすべてのデータを再度コピーする必要がありました。
この新しいsynced flush機能により、
sync-flushされたインデックスに対して、既存のデータを再利用し、
より早くクラスタを正常な状態にすることができるようにします。&lt;/p&gt;
&lt;p&gt;ここで、この変更以前にどのように動いていたかを説明します。
すでにあるレプリカシャードは、ノードがリスタートした後に、
プライマリから復元するときに、
最初のステップはプライマリにあるセグメントとレプリカにあるセグメントを
比較することです。そして、セグメントに違いがあった場合にコピーされます。
問題は、セグメントプライマリのセグメントのマージと
レプリカのセグメントのマージが別々に起こっており、
各シャードのセグメントが完全に異なるが、
それらが同じデータを持っているという点です。&lt;/p&gt;
&lt;p&gt;新しいsynced-flush機能では、&lt;code&gt;sync_id&lt;/code&gt;がプライマリと
レプリカシャードに、シャードのコンテンツが同一であるという判別するために、
書き込まれます。これは、リカバリがセグメントの比較のステップを
スキップできることを意味します。
リカバリのスピードを高速にします。&lt;/p&gt;
&lt;p&gt;synced flushはアイドル状態のインデックスで自動的に実行されます。
直前の5分間でデータが登録、更新削除されていないインデックスに対してです。
これは、ロギングのユースケースで特に役に立ちます。
機能のインデックスはインデキシングがストップしたあとの5分で自動的に
syncされるでしょう。&lt;/p&gt;
&lt;p&gt;ノードのリスタートやクラスタのリスタートが必要で、
自動的に発生するsyncを待てない場合は次のようなことが可能です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インデキシングを停止（実行中のリクエストが停止するのも待つ）&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-cluster.html&#34;&gt;シャードのアロケーションを停止&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-synced-flush.html&#34;&gt;synced-flush&lt;/a&gt;リクエストの発行&lt;/li&gt;
&lt;li&gt;ノードのリスタート&lt;/li&gt;
&lt;li&gt;シャードのアロケーションの再開&lt;/li&gt;
&lt;li&gt;クラスタの状態がグリーンになるまで待つ&lt;/li&gt;
&lt;li&gt;インデキシングの再開&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; &amp;ldquo;シャードのアロケーションを停止&amp;quot;のステップが必要です。
これがない場合、Elasticsearchはノードの再起動が始まると、
異なるノードにシャードの再配置を始めます。
これは、新しいノードにシャードデータの全てをコピーする必要があります。&lt;/p&gt;
&lt;p&gt;ドキュメントのインデキシング、更新、削除のあとに最初のフラッシュが
発生したときに、
シャードの&lt;code&gt;sync_id&lt;/code&gt;が自動的に無効化されます。
詳細については&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues/11336&#34;&gt;#11336&lt;/a&gt;と&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues/11179&#34;&gt;#11179&lt;/a&gt;をごらんください。&lt;/p&gt;
&lt;h2 id=&#34;シャード配置は保留中のタスクをブロックしない&#34;&gt;シャード配置は保留中のタスクをブロックしない&lt;/h2&gt;
&lt;p&gt;多数のノードやインデックスを持っているユーザは
クラスタ全体のリスタートのあとのシャードのリカバリで、
長い間、リカバリが止まって見えることに気づいたかもしれません。
これらのリカバリが止まって見える間は、クラスタ設定の更新のような軽微なアクションでさえ、
例外が発生したり、その設定が反映されるまでに長時間かかるといったことが起きていました。
この問題の兆候は保留中のタスクのキューが大きくなることです。&lt;/p&gt;
&lt;p&gt;これらの遅延の原因はシャードの配置のプロセスにあります。
配置されるべきシャードのコピーを
持っているのがどのノードかを全てのデータノードに聞きます。
多くのシャードや遅いディスクを持ったデータノードは
反応するのに時間がかかります。
特に、シャードのリカバリがすでにI/Oを利用しているような時です。
このバージョン以前のものは、シャード情報のためのリクエストを
同期的に処理していました。
クラスタ状態の更新はアロケーションプロセスを続けるために
必要な情報を待っている間、ブロックされます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues/11262&#34;&gt;#11262&lt;/a&gt;での変更は
この情報のためのリクエストを非同期にします。
クラスタ状態の更新はこのタスクによってブロックされません。
これは、保留中のタスクがより早く処理でき、
クラスタが変更に対してより早く反応できます。
処理中のshard infoリクエストの数は
&lt;code&gt;number_of_in_flight_fetch&lt;/code&gt;キーとしてcluster-health APIで取得できます。&lt;/p&gt;
&lt;p&gt;さらに、シャードがある理由で復旧に失敗すると、
クラスタは、シャードのリカバリが成功するまで、同じノードに対して
シャードをアロケーションしないようにします。&lt;/p&gt;
&lt;h2 id=&#34;レスポンスボディのjsonのフィルタリング&#34;&gt;レスポンスボディのJSONのフィルタリング&lt;/h2&gt;
&lt;p&gt;Elasticsearchは全ての情報を返します。
例えば、検索リクエストは&lt;code&gt;_index&lt;/code&gt;、&lt;code&gt;_type&lt;/code&gt;、&lt;code&gt;_id&lt;/code&gt;、
&lt;code&gt;_score&lt;/code&gt;、&lt;code&gt;_source&lt;/code&gt;を返します。
しかし、全ての情報が必要でない場合があります。
また、これらのデータを遅いネットワークで転送することは
遅延の原因となります。&lt;/p&gt;
&lt;p&gt;ユーザはこの検索メタデータを無効にするための特殊な設定を
行ったり、他のAPIのレスポンスのフォーマットを
コントロールするための設定があります。
&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues/10980&#34;&gt;#10980&lt;/a&gt;の変更で、任意のレスポンスボディのJSONに対して、
必要な要素だけを取得する機能が追加されました。
&lt;code&gt;filter_path&lt;/code&gt;パラメータを使用します。&lt;/p&gt;
&lt;p&gt;例えば、検索リクエストからは&lt;code&gt;total&lt;/code&gt;数と、各要素の&lt;code&gt;hits&lt;/code&gt;の配列を欲しい場合、
次のように指定します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;GET _search?filter_path=hits.total,hits.hits
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-nodes-info.html&#34;&gt;nodes-info API&lt;/a&gt;から各ノードの&lt;code&gt;http_address&lt;/code&gt;だけを取得したい場合は、
ノード名の部分にワイルドカード(&lt;code&gt;*&lt;/code&gt;)を使用します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;GET _nodes?filter_path=nodes.*.http_address
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;単一の&lt;code&gt;*&lt;/code&gt;がJSON階層の1つの階層に対しての
ワイルドカードとして機能します。
2つの&lt;code&gt;**&lt;/code&gt;は複数階層に対してとなります。
複数のフィルタはカンマ区切りで指定可能です。
詳細について&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#_response_filtering&#34;&gt;Response filtering&lt;/a&gt;をごらんください。&lt;/p&gt;
&lt;h2 id=&#34;共有ファイルシステムリポジトリに対するセキュリティフィックス&#34;&gt;共有ファイルシステムリポジトリに対するセキュリティフィックス&lt;/h2&gt;
&lt;p&gt;本リリースはsnapshot-restoreで使われる
&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html#_shared_file_system_repository&#34;&gt;共有ファイルシステムリポジトリ&lt;/a&gt;に関するセキュリティ強化の変更が含まれます。
現在、Elasticsearchのユーザは、Elasticsearchプロセスによって書き込み可能
任意のディレクトリに&lt;code&gt;.snapshot&lt;/code&gt;ファイルを書き込むことができます。
&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues/11284&#34;&gt;#11284&lt;/a&gt;の変更で、リポジトリのために使用できるディレクトリを
強制的に指定できるようになりました。
適切なディレクトリが&lt;code&gt;config/elasticsearch.yml&lt;/code&gt;設定ファイルの
&lt;code&gt;path.repo&lt;/code&gt;に指定される必要があります。&lt;/p&gt;
&lt;p&gt;次のように設定されたElasticsearchインスタンスはこのセキュリティ問題に対して影響を受けにくいです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;root&lt;/code&gt;ではなく&lt;code&gt;elasticsearch&lt;/code&gt;ユーザとしてElasticsearchを実行&lt;/li&gt;
&lt;li&gt;&lt;code&gt;elasticsearch&lt;/code&gt;ユーザが&lt;code&gt;data&lt;/code&gt;ディレクトリに対してのみ
書き込み権限を持っていて、共有ファイルシステムリポジトリに対しても利用できる&lt;/li&gt;
&lt;li&gt;ファイアウォールやプロキシ、Shieldを使って、snapshot APIの実行を任意のユーザから実行されるのを防いでいる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この問題を&lt;a href=&#34;https://www.elastic.co/community/security&#34;&gt;CVE-2015-4165&lt;/a&gt;としています。&lt;/p&gt;
&lt;h2 id=&#34;古いインデックスのためのupgrade-api&#34;&gt;古いインデックスのためのUpgrade API&lt;/h2&gt;
&lt;p&gt;Elasticsearch 2.0以降では、
Lucene 5ベースとなり、Lucene 3
（Elasticsearchのバージョンでは0.90以前）
によって書き出されたセグメントを含んだインデックスを読み込むことが
できなくなります。
これらの「古いインデックス」はLucene 4にアップグレードする必要があり、
2.0-compatibleとして印をつける必要があります。
そうしなければ、Elasticsearch 2.0に以降できないでしょう。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-upgrade.html&#34;&gt;upgrade API&lt;/a&gt;は
、最新のLuceneフォーマットにインデックスにある全てのセグメントを
アップグレードするためにすでに利用できます。
また、最新のフォーマットは性能向上やバグフィックスといった利点もあります。
さらに、2.0-compatibleとして古いインデックスをマークする設定も
書き込むことができます。
さらに、&lt;code&gt;upgrade_only_ancient_segments&lt;/code&gt;オプションが
Lucene 3のセグメントだけをアップグレードするために利用でき、
移行前の必要な処理を減らすことができます。&lt;/p&gt;
&lt;h2 id=&#34;kibanaユーザのためのハイライトの強化&#34;&gt;Kibanaユーザのためのハイライトの強化&lt;/h2&gt;
&lt;p&gt;KibanaユーザはElasticsearchのハイライトについて2つの点で問題を見つけていました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ワイルドカードでフィールド名を指定した場合に、ハイライトに適さないフィールドも帰ってくる（日付や数値のフィールドなど）&lt;/li&gt;
&lt;li&gt;古いインデックスが非常に大きなターム（&amp;gt; 32kB）を含んでいて、ハイライトが失敗する。
最近のバージョンでは、これらの大きなタームはインデックス時に除去される&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues/11364&#34;&gt;#11364&lt;/a&gt;の変更で
これらの問題が修正されました。
ワイルドカードを利用したフィールド名では、stringフィールドのみを返し、非常に長いタームによる例外は無視するようになります。&lt;/p&gt;
&lt;h2 id=&#34;windowsユーザのためのmlockall&#34;&gt;Windowsユーザのための&lt;code&gt;mlockall&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;速いGCはノードの安定性と性能について重要です。
小さなバイトのヒープでさえ、ディスクにスワップすることを許可してしまうと、GCに対して大きな影響が出てしまいます。
ですので、これらのコストは排除されるべきです。&lt;/p&gt;
&lt;p&gt;Linuxユーザは&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration.html#setup-configuration-memory&#34;&gt;&lt;code&gt;bootstrap.mloclall&lt;/code&gt;設定&lt;/a&gt;による恩恵を受けています。
これは、RAMにJVMのヒープを起動時にロックします。
&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues/10887&#34;&gt;#10887&lt;/a&gt;では、同様の機能をWindowsユーザにも提供します。&lt;/p&gt;
&lt;h2 id=&#34;より詳細なスクリプト設定&#34;&gt;より詳細なスクリプト設定&lt;/h2&gt;
&lt;p&gt;Scriptsはリクエストにインラインで指定できます。
&lt;code&gt;.scripts&lt;/code&gt;インデックスにインデックスもでき、&lt;code&gt;config/&lt;/code&gt;ディレクトリ配下にファイルとして保存もできます。
これまでは、インラインかインデックスされたスクリプトの両方を同時に有効無効にすることが選択できましたが、
&lt;code&gt;.scripts&lt;/code&gt;インデックスをプロキシやShieldで保護することもできました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues/10116&#34;&gt;#10116&lt;/a&gt;で追加されたより詳細なスクリプトの設定で、インラインか、インデックスされたものか、ファイル化を個別に言語ごとに設定できるようになりました。
また、例えば、search APIではスクリプトを許可するが、update APIでは許可しないといったような設定も可能です。&lt;/p&gt;
&lt;h2 id=&#34;最後に&#34;&gt;最後に&lt;/h2&gt;
&lt;p&gt;ぜひ、&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-1-6-0&#34;&gt;Elasticsearch 1.6.0&lt;/a&gt;を試してみてください。
そして、感想をTwitter(&lt;a href=&#34;https://twitter.com/elastic&#34;&gt;@elastic&lt;/a&gt;)や&lt;a href=&#34;https://discuss.elastic.co/c/elasticsearch&#34;&gt;Webフォーラム&lt;/a&gt;などで教えて下さい。
また、問題がありましたら、&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues&#34;&gt;GitHub issues page&lt;/a&gt;で報告をお願いします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第10回Elasticsearch勉強会を開催しました。#elasticsearchjp</title>
      <link>https://blog.johtani.info/blog/2015/06/02/10th-elasticsearch-jp/</link>
      <pubDate>Tue, 02 Jun 2015 15:06:36 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/06/02/10th-elasticsearch-jp/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://elasticsearch.doorkeeper.jp/events/25297&#34;&gt;第10回Elsticsearch勉強会&lt;/a&gt;を開催しました。
スタッフの皆さん、スピーカーの皆さん、開場提供していただいた&lt;a href=&#34;http://recruit-tech.co.jp&#34;&gt;リクルートテクノロジーズさん&lt;/a&gt;、ありがとうございました！
次回もよろしくお願いします！参加していただき盛り上げていただいた参加者の皆さんもありがとうございました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://elasticsearch.doorkeeper.jp/events/25297&#34;&gt;第10回Elsticsearch勉強会&lt;/a&gt;を開催しました。
スタッフの皆さん、スピーカーの皆さん、開場提供していただいた&lt;a href=&#34;http://recruit-tech.co.jp&#34;&gt;リクルートテクノロジーズさん&lt;/a&gt;、ありがとうございました！
次回もよろしくお願いします！参加していただき盛り上げていただいた参加者の皆さんもありがとうございました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;今回も新規の方が結構いたような気がしました。
最終的に、124人がアプリでチェックインした形になりました。
直前にキャンセル待ちから繰り上がると来れない人がいますよねぇ。
多少キャパシティオーバーするくらいの人数で募集するのがいいのでしょうか。
あと、カードが2枚不明で。。。心あたりある人いないでしょうか？&lt;/p&gt;
&lt;p&gt;さて、いつもの通り簡単なメモです。&lt;/p&gt;
&lt;h2 id=&#34;elasticon報告有償プラグインの紹介elastic-jun-ohtani-johtani&#34;&gt;Elastic{ON}報告＋有償プラグインの紹介　Elastic Jun Ohtani @johtani&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://speakerdeck.com/johtani/elastic-on-bao-gao-toshang-yong-puraguinfalseshao-jie&#34;&gt;elastic{ON}報告と商用プラグインの紹介&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;少し時間が経ってしまいましたが、弊社初のカンファレンス&lt;a href=&#34;http://www.elasticon.com&#34;&gt;elastic{ON}&lt;/a&gt;の紹介をしました。
約1300名の方に参加していただいたカンファレンスで、非常に盛り上がりました。
Microsoft、GitHubなど、いろいろな会社の方が話をしたり、弊社のエンジニアが濃い話をしたりと。
今回は、日本の方はいなかったですが、次回は日本からも参加してもらえると嬉しいです！&lt;/p&gt;
&lt;p&gt;あとは、5月に弊社にも日本の営業の人が入社したので、有償プラグインについて簡単ですが説明をしました。
プラグインなどに興味があるかたがいらっしゃいましたら、Twitterなどで連絡いただければと。
もちろん、弊社サイトからの問い合わせでも大丈夫です。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/elasticon&#34;&gt;カンファレンスの資料やビデオが弊社サイトで公開&lt;/a&gt;されています。
ぜひ一度見ていただければと。&lt;/p&gt;
&lt;h2 id=&#34;awsで実現するelasticsearchの大規模運用-株式会社インティメートマージャー松田和樹さんmats116&#34;&gt;AWSで実現するelasticsearchの大規模運用 株式会社インティメート・マージャー　松田和樹さん　&lt;a href=&#34;https://twitter.com/mats116&#34;&gt;@mats116&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/im_docs/elasticsearch-48873206&#34;&gt;第10回elasticsearch勉強会 公開用資料&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;パブリックDMPのサービスの裏側でElasticsearchを利用しているというお話でした。
AWS Auto Scalingに詳しくないので、勉強しないといけないんですが、
リバランスがどのくらいの頻度で発生するのかはちょっと気になります。&lt;/p&gt;
&lt;p&gt;SSDを利用したり、doc valuesを利用したりと、性能を気にしながら利用されている点、負荷試験を行って検証されていたりと、
参考になる話でした。
今回はインフラ側の話に寄っていたので、今度はアプリ側でどんな使い方をしているかといった話を聞いてみたいですね！&lt;/p&gt;
&lt;h2 id=&#34;spark-in-small-or-middle-scale-data-processing-with-elasticsearch株式会社ビズリーチ-島本多可子さん-chibochibo03&#34;&gt;Spark in small or middle scale data processing with Elasticsearch　株式会社ビズリーチ 島本　多可子さん &lt;a href=&#34;https://twitter.com/chibochibo03&#34;&gt;@chibochibo03&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/chibochibo/spark-with-elasticsearch&#34;&gt;Spark in small or middle scale data processing with Elasticsearch&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ScalaとSparkとElasticsearchで検索サービスを作っている話でした。
サービスのアーキテクチャの選別についての説明を順を追って説明していただきました。
失敗と言われていたアーキテクチャを見た時に、「あー、それは。。。」と思っていたら、
思った通りの改善案のアーキテクチャが出てきたので少しホッとしましたw&lt;/p&gt;
&lt;p&gt;JSONのクエリが辛いという話がありましたが、&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/search-validate.html&#34;&gt;validate API&lt;/a&gt;などを利用してもらって、事前にチェックをしてもらうと
少しは改善できるかもなぁと。&lt;/p&gt;
&lt;p&gt;Sparkをぼんやりとしかわかってないので、もう一度話を聴きたいなぁと思ったので、
押しかけて話を聴きたいと思います。&lt;/p&gt;
&lt;p&gt;話の中で出てきた自作のScalaのElasticsearchクライアントがHTTPのクライアントになった理由が知りたかったです。&lt;/p&gt;
&lt;h2 id=&#34;lt&#34;&gt;LT&lt;/h2&gt;
&lt;h3 id=&#34;elasticsearchのサジェスト機能を使った話株式会社アイスタイル渡邊-紘太朗さん-ktaro_&#34;&gt;Elasticsearchのサジェスト機能を使った話　株式会社アイスタイル　渡邊 紘太朗さん &lt;a href=&#34;https://twitter.com/ktaro_w&#34;&gt;@ktaro_w&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/ktaro_w/elasticsearch-48826694&#34;&gt;Elasticsearchのサジェスト機能を使った話&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ぴったり5分でしたwまだ2年目なのにこんなにうまく話をしていただけるとは。。。&lt;/p&gt;
&lt;p&gt;Gatling便利そうですね。サーバが1台しかないので、単一インデックスの方が性能が出るだろうなと。
Elasticsearchは1インデックスに対してデフォルトだと5シャードで、シャード単位でLuceneのインデックスが作成されます。
この話で行くと、18インデックスを作ると、かなりの数のファイルI/Oが発生するので、いろいろなインデックスに検索をすると
キツいだろうなと。&lt;/p&gt;
&lt;p&gt;サジェストについての日本語の資料が少ないという事だったので、ブログを書いてもらえると嬉しいですw&lt;/p&gt;
&lt;h3 id=&#34;elasticsearchで作る形態素解析サーバ株式会社エヌツーエスエム菅谷信介さん&#34;&gt;Elasticsearchで作る形態素解析サーバ　株式会社エヌツーエスエム　菅谷信介さん&lt;/h3&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/shinsuke/es-analyzeapi201506&#34;&gt;Elasticsearchで作る形態素解析サーバ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;いつも発表ありがとうございます。私以外の最多発表者じゃないかという話でした。
今回はElasticsearchを形態素解析サーバにしてしまおうという話で、ちょっと面白い話でした。
Elasticsearch以外の場所で形態素解析したい場合には手軽に使えるかもしれないですし、Elasticsearchと同じ解析結果を別の場所で欲しい場合にも便利かも。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/johtani/elasticsearch-extended-analyze&#34;&gt;extended analyze API&lt;/a&gt;の紹介までしていただいて。。。&lt;/p&gt;
&lt;p&gt;ちなみに、今は、extended analyze プラグインも指定したAttributeの情報だけ返せるようになってたり、
マルチバリューへの対応もしていたりします。
そのうち本家のanalyze APIに機能を取り込む予定です。（早くしないと）&lt;/p&gt;
&lt;h3 id=&#34;開発効率up-elasticsearch-client-tool-作ってみたナレッジワークス株式会社木戸国彦さん-9215&#34;&gt;開発効率UP! Elasticsearch Client Tool 作ってみた　ナレッジワークス株式会社　木戸国彦さん &lt;a href=&#34;https://twitter.com/9215&#34;&gt;@9215&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://speakerdeck.com/kunihikokido/kai-fa-xiao-lu-atupu-elasticsearch-client-tool-zuo-tutemita&#34;&gt;開発効率アップ!Elasticsearch Client Tool 作ってみた&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hello Elasticsearch!にはお世話になっている人が多いんじゃないかなと。
今回はSublime Textのプラグインのお話でした。（すみません、Sublime Text使ってなくて。。。）
AtomとかIntellijのプラグインもあるとうれしいなー&lt;/p&gt;
&lt;h3 id=&#34;変わり種プラグインの作り方日本ibm黒澤亮二さん&#34;&gt;変わり種プラグインの作り方　日本IBM　黒澤亮二さん&lt;/h3&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/kuron99/elasticsearch-plugin-48848087&#34;&gt;変わり種プラグインの作り方&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Elasticsearchの拡張ポイントの話と、簡単なプラグインの作り方と少しElasticsearch内部の話をしていただきました。
Foundの資料が上がってました。さすが。あそこのブログは面白い話が多いんですよね。
社内で実際に使われてる話とかも聞いてみたい！&lt;/p&gt;
&lt;h2 id=&#34;その他感想などのブログ&#34;&gt;その他、感想などのブログ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://suzuki.tdiary.net/20150602.html&#34;&gt;第10回 Elasticsearch 勉強会へ参加してきた昨日の話&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://qiita.com/t-sato/items/45ec24b8df9155d6488f&#34;&gt;第10回elasticsearch勉強会 #elasticsearch #elasticsearchjp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.shibayu36.org/entry/2015/06/02/162724&#34;&gt;第10回elasticsearch勉強会に行ってきました&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://tech.im-dmp.net/archives/3271&#34;&gt;elasticsearch勉強会に登壇してきました&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;懇親会で24Fに移動していただくということで、少し手間をかけてしまいました、すみませんでした。
今回も初参加の方がそこそこいたんじゃないかなと。
あとは、AWSサミットがあるために上京してて参加しましたという方もいらっしゃいました。
大きなカンファレンスの期間の前後に行うとこんなメリットもあるんですね、今後の参考にしたいと思います。
次回は7/27を予定しています。CTOのShayが来日予定です！&lt;/p&gt;
&lt;p&gt;あと、東京以外の勉強会も検討しつつあります。興味のある方はコメントやTwitterで反応をいただけると嬉しいです。&lt;/p&gt;
&lt;p&gt;スピーカーは随時募集中ですので、コメント、メール、ツイートなど、コンタクトしていただければと思います。
よろしくお願いいたします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>elastic{ON}報告と商用プラグインの紹介</title>
      <link>https://blog.johtani.info/presentation/2015/elastic-on-bao-gao-toshang-yong-puraguinfalseshao-jie/</link>
      <pubDate>Tue, 02 Jun 2015 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2015/elastic-on-bao-gao-toshang-yong-puraguinfalseshao-jie/</guid>
      <description>&lt;p&gt;第10回Elasticsearch勉強会の発表資料です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;第10回Elasticsearch勉強会の発表資料です。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Logstashを使ったElasticsearchの再インデックス（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2015/05/26/reindex-elasticsearch-with-logstash-ja/</link>
      <pubDate>Tue, 26 May 2015 16:08:10 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/05/26/reindex-elasticsearch-with-logstash-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://david.pilato.fr/blog/2015/05/20/reindex-elasticsearch-with-logstash/&#34;&gt;Reindex Elasticsearch With Logstash&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thanks David!&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;マッピングを変更したり、インデックスの設定を変更したり、あるサーバから他のサーバや、
あるクラスタから他のクラスタ（例えば複数のデータセンターのような場合）にデータを再インデックスしたくなることがあるでしょう。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://david.pilato.fr/blog/2015/05/20/reindex-elasticsearch-with-logstash/&#34;&gt;Reindex Elasticsearch With Logstash&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thanks David!&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;マッピングを変更したり、インデックスの設定を変更したり、あるサーバから他のサーバや、
あるクラスタから他のクラスタ（例えば複数のデータセンターのような場合）にデータを再インデックスしたくなることがあるでしょう。&lt;/p&gt;
&lt;p&gt;後者のような場合は&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html&#34;&gt;SnapshotやRestoreの機能&lt;/a&gt;を利用することもできますが、インデックスの設定を変更をしたい場合は
その他の方法が必要になります。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/blog/logstash-1-5-0-ga-released&#34;&gt;Logstash 1.5.0&lt;/a&gt;で、
&lt;a href=&#34;https://www.elastic.co/guide/en/logstash/current/plugins-inputs-elasticsearch.html&#34;&gt;elasticsearch input&lt;/a&gt;と&lt;a href=&#34;https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html&#34;&gt;elasticsearch output&lt;/a&gt;を使うことで、とても簡単に再インデックスができます。&lt;/p&gt;
&lt;p&gt;ではやってみましょう。&lt;/p&gt;
&lt;h2 id=&#34;古いクラスタ&#34;&gt;古いクラスタ&lt;/h2&gt;
&lt;p&gt;elasticsearch 1.5.2 はすでにダウンロード済みとして、&lt;code&gt;localhost:9200&lt;/code&gt;で&lt;code&gt;old&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/elasticsearch --cluster.name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;old
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;クラスタに&lt;code&gt;person&lt;/code&gt;という名前のインデックスが存在します。
これは、5シャードで、100万件のドキュメントを持っています。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;http://david.pilato.fr/blog/images/reindex-es01/sense01.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;http://david.pilato.fr/blog/images/reindex-es01/sense01.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h2 id=&#34;新しいクラスタ&#34;&gt;新しいクラスタ&lt;/h2&gt;
&lt;p&gt;次に新しいクラスタを起動します。
&lt;code&gt;localhost:9201&lt;/code&gt;で&lt;code&gt;new&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/elasticsearch --cluster.name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;new
&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -XGET &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://localhost:9201/person&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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-json&#34; data-lang=&#34;json&#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;&amp;#34;error&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;IndexMissingException[[person] missing]&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:#f92672&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;404&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;h2 id=&#34;logstashのインストール&#34;&gt;Logstashのインストール&lt;/h2&gt;
&lt;p&gt;次に、Logstash 1.5.0をダウンロードして、インストールします。&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget http://download.elastic.co/logstash/logstash/logstash-1.5.0.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tar xzf logstash-1.5.0.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd logstash-1.5.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;logstashの設定ファイル&lt;code&gt;logstash.conf&lt;/code&gt;を次のように設定します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;input {
  # We read from the &amp;#34;old&amp;#34; cluster
  elasticsearch {
    hosts =&amp;gt; [ &amp;#34;localhost&amp;#34; ]
    port =&amp;gt; &amp;#34;9200&amp;#34;
    index =&amp;gt; &amp;#34;person&amp;#34;
    size =&amp;gt; 500
    scroll =&amp;gt; &amp;#34;5m&amp;#34;
    docinfo =&amp;gt; true
  }
}

output {
  # We write to the &amp;#34;new&amp;#34; cluster
  elasticsearch {
    host =&amp;gt; &amp;#34;localhost&amp;#34;
    port =&amp;gt; &amp;#34;9201&amp;#34;
    protocol =&amp;gt; &amp;#34;http&amp;#34;
    index =&amp;gt; &amp;#34;%{[@metadata][_index]}&amp;#34;
    index_type =&amp;gt; &amp;#34;%{[@metadata][_type]}&amp;#34;
    document_id =&amp;gt; &amp;#34;%{[@metadata][_id]}&amp;#34;
  }
  # We print dots to see it in action
  stdout {
    codec =&amp;gt; &amp;#34;dots&amp;#34;
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;実行と修正&#34;&gt;実行と修正&lt;/h2&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/logstash -f logstash.conf
&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;何が起きたでしょう？&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -XGET &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://localhost:9200/person/person/AU1wqyQWZJKU8OibfxgH&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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-json&#34; data-lang=&#34;json&#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;&amp;#34;_index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;person&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:#f92672&#34;&gt;&amp;#34;_type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;person&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:#f92672&#34;&gt;&amp;#34;_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AU1wqyQWZJKU8OibfxgH&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:#f92672&#34;&gt;&amp;#34;_version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;&amp;#34;found&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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;&amp;#34;_source&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:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Tali Elyne&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:#f92672&#34;&gt;&amp;#34;dateOfBirth&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1955-05-03&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:#f92672&#34;&gt;&amp;#34;gender&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;female&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:#f92672&#34;&gt;&amp;#34;children&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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;&amp;#34;marketing&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:#f92672&#34;&gt;&amp;#34;cars&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;&amp;#34;shoes&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;&amp;#34;toys&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;&amp;#34;fashion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;&amp;#34;music&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;&amp;#34;garden&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;&amp;#34;electronic&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;&amp;#34;hifi&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;&amp;#34;food&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;846&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:#f92672&#34;&gt;&amp;#34;address&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:#f92672&#34;&gt;&amp;#34;country&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Germany&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:#f92672&#34;&gt;&amp;#34;zipcode&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;0099&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:#f92672&#34;&gt;&amp;#34;city&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Bonn&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:#f92672&#34;&gt;&amp;#34;countrycode&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;DE&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:#f92672&#34;&gt;&amp;#34;location&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:#ae81ff&#34;&gt;7.075943707068682&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:#ae81ff&#34;&gt;50.72883500730124&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&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -XGET &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://localhost:9201/person/person/AU1wqyQWZJKU8OibfxgH&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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-json&#34; data-lang=&#34;json&#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;&amp;#34;_index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;person&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:#f92672&#34;&gt;&amp;#34;_type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;person&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:#f92672&#34;&gt;&amp;#34;_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AU1wqyQWZJKU8OibfxgH&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:#f92672&#34;&gt;&amp;#34;_version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;&amp;#34;found&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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;&amp;#34;_source&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:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Tali Elyne&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:#f92672&#34;&gt;&amp;#34;dateOfBirth&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1955-05-03&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:#f92672&#34;&gt;&amp;#34;gender&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;female&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:#f92672&#34;&gt;&amp;#34;children&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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;&amp;#34;marketing&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:#f92672&#34;&gt;&amp;#34;cars&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;&amp;#34;shoes&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;&amp;#34;toys&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;&amp;#34;fashion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;&amp;#34;music&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;&amp;#34;garden&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;&amp;#34;electronic&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;&amp;#34;hifi&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;null&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;&amp;#34;food&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;846&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:#f92672&#34;&gt;&amp;#34;address&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:#f92672&#34;&gt;&amp;#34;country&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Germany&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:#f92672&#34;&gt;&amp;#34;zipcode&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;0099&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:#f92672&#34;&gt;&amp;#34;city&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Bonn&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:#f92672&#34;&gt;&amp;#34;countrycode&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;DE&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:#f92672&#34;&gt;&amp;#34;location&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:#ae81ff&#34;&gt;7.075943707068682&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:#ae81ff&#34;&gt;50.72883500730124&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:#f92672&#34;&gt;&amp;#34;@version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1&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:#f92672&#34;&gt;&amp;#34;@timestamp&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2015-05-20T09:53:44.089Z&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;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;Logstashは&lt;code&gt;@version&lt;/code&gt;と&lt;code&gt;@timestamp&lt;/code&gt;フィールドを追加してしました。
これらを除去したいので、&lt;a href=&#34;http://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html&#34;&gt;Mutate filter plugin&lt;/a&gt;の&lt;a href=&#34;http://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html#plugins-filters-mutate-remove_field&#34;&gt;&lt;code&gt;remove_field&lt;/code&gt;&lt;/a&gt;を使います。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;filter {
  mutate {
    remove_field =&amp;gt; [ &amp;#34;@timestamp&amp;#34;, &amp;#34;@version&amp;#34; ]
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;マッピングのチェックと修正&#34;&gt;マッピングのチェックと修正&lt;/h3&gt;
&lt;p&gt;実際に、logstashは&lt;code&gt;_source&lt;/code&gt;フィールドを既存のドキュメントから読み込み、
それらを新しいクラスタに直接投入しています。
しかし、logstashはマッピングについてはケアしていません。&lt;/p&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -XGET &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://localhost:9200/person/person/_mapping&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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-json&#34; data-lang=&#34;json&#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;&amp;#34;person&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:#f92672&#34;&gt;&amp;#34;mappings&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:#f92672&#34;&gt;&amp;#34;person&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:#f92672&#34;&gt;&amp;#34;properties&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:#f92672&#34;&gt;&amp;#34;address&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:#f92672&#34;&gt;&amp;#34;properties&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:#f92672&#34;&gt;&amp;#34;city&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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:#f92672&#34;&gt;&amp;#34;index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;not_analyzed&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;country&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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:#f92672&#34;&gt;&amp;#34;index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;not_analyzed&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;countrycode&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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:#f92672&#34;&gt;&amp;#34;index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;not_analyzed&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;location&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;geo_point&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;zipcode&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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;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:#f92672&#34;&gt;&amp;#34;children&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;long&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;dateOfBirth&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;date&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:#f92672&#34;&gt;&amp;#34;format&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dateOptionalTime&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;gender&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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:#f92672&#34;&gt;&amp;#34;index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;not_analyzed&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;marketing&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:#f92672&#34;&gt;&amp;#34;properties&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:#f92672&#34;&gt;&amp;#34;cars&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;long&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;electronic&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;long&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;fashion&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;long&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;food&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;long&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;garden&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;long&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;hifi&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;long&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;music&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;long&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;shoes&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;long&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;toys&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;long&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;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:#f92672&#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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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;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&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;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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -XGET &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://localhost:9201/person/person/_mapping&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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-json&#34; data-lang=&#34;json&#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;&amp;#34;person&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:#f92672&#34;&gt;&amp;#34;mappings&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:#f92672&#34;&gt;&amp;#34;person&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:#f92672&#34;&gt;&amp;#34;properties&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:#f92672&#34;&gt;&amp;#34;address&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:#f92672&#34;&gt;&amp;#34;properties&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:#f92672&#34;&gt;&amp;#34;city&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;country&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;countrycode&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;location&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;double&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;zipcode&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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;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:#f92672&#34;&gt;&amp;#34;children&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;long&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;dateOfBirth&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;date&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:#f92672&#34;&gt;&amp;#34;format&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dateOptionalTime&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;gender&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;marketing&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:#f92672&#34;&gt;&amp;#34;properties&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:#f92672&#34;&gt;&amp;#34;cars&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;long&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;electronic&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;long&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;fashion&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;long&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;food&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;long&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;garden&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;long&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;hifi&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;long&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;music&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;long&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;shoes&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;long&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;toys&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;long&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;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:#f92672&#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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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;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&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-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;location&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#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;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;geo_point&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;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-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;location&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#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;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;double&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;データをインデックスする「前」に、実際に利用したいマッピングでインデックスを作成しておくことで、
この問題に対処できます。
この時点で、オリジナルのマッピングを望んだ形に変更することができます。例えば、アナライザを変更したりです。
また、インデックスの設定を新しく定義することもできます。
デフォルトでは、Elasticsearchは5つのシャードと各シャードに対して1つのレプリカを作成します。
しかし、この時点でもう一度変更することが可能です。&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -XDELETE &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://localhost:9201/person&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -XPUT &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://localhost:9201/person&amp;#34;&lt;/span&gt; -d&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;
&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:#e6db74&#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:#e6db74&#34;&gt;  &amp;#34;settings&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:#e6db74&#34;&gt;    &amp;#34;number_of_shards&amp;#34;: 1,
&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:#e6db74&#34;&gt;    &amp;#34;number_of_replicas&amp;#34;: 0
&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:#e6db74&#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:#e6db74&#34;&gt;}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -XPUT &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://localhost:9201/person/person/_mapping&amp;#34;&lt;/span&gt; -d&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;
&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:#e6db74&#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:#e6db74&#34;&gt;  &amp;#34;person&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:#e6db74&#34;&gt;    &amp;#34;properties&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:#e6db74&#34;&gt;      &amp;#34;address&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:#e6db74&#34;&gt;        &amp;#34;properties&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:#e6db74&#34;&gt;          &amp;#34;city&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:#e6db74&#34;&gt;            &amp;#34;type&amp;#34;: &amp;#34;string&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:#e6db74&#34;&gt;            &amp;#34;index&amp;#34;: &amp;#34;not_analyzed&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:#e6db74&#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:#e6db74&#34;&gt;          &amp;#34;country&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:#e6db74&#34;&gt;            &amp;#34;type&amp;#34;: &amp;#34;string&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:#e6db74&#34;&gt;            &amp;#34;index&amp;#34;: &amp;#34;not_analyzed&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:#e6db74&#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:#e6db74&#34;&gt;          &amp;#34;countrycode&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:#e6db74&#34;&gt;            &amp;#34;type&amp;#34;: &amp;#34;string&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:#e6db74&#34;&gt;            &amp;#34;index&amp;#34;: &amp;#34;not_analyzed&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:#e6db74&#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:#e6db74&#34;&gt;          &amp;#34;location&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:#e6db74&#34;&gt;            &amp;#34;type&amp;#34;: &amp;#34;geo_point&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:#e6db74&#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:#e6db74&#34;&gt;          &amp;#34;zipcode&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:#e6db74&#34;&gt;            &amp;#34;type&amp;#34;: &amp;#34;string&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:#e6db74&#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:#e6db74&#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:#e6db74&#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:#e6db74&#34;&gt;      &amp;#34;children&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:#e6db74&#34;&gt;        &amp;#34;type&amp;#34;: &amp;#34;long&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:#e6db74&#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:#e6db74&#34;&gt;      &amp;#34;dateOfBirth&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:#e6db74&#34;&gt;        &amp;#34;type&amp;#34;: &amp;#34;date&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:#e6db74&#34;&gt;        &amp;#34;format&amp;#34;: &amp;#34;dateOptionalTime&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:#e6db74&#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:#e6db74&#34;&gt;      &amp;#34;gender&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:#e6db74&#34;&gt;        &amp;#34;type&amp;#34;: &amp;#34;string&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:#e6db74&#34;&gt;        &amp;#34;index&amp;#34;: &amp;#34;not_analyzed&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:#e6db74&#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:#e6db74&#34;&gt;      &amp;#34;marketing&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:#e6db74&#34;&gt;        &amp;#34;properties&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:#e6db74&#34;&gt;          &amp;#34;cars&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:#e6db74&#34;&gt;            &amp;#34;type&amp;#34;: &amp;#34;long&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:#e6db74&#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:#e6db74&#34;&gt;          &amp;#34;electronic&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:#e6db74&#34;&gt;            &amp;#34;type&amp;#34;: &amp;#34;long&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:#e6db74&#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:#e6db74&#34;&gt;          &amp;#34;fashion&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:#e6db74&#34;&gt;            &amp;#34;type&amp;#34;: &amp;#34;long&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:#e6db74&#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:#e6db74&#34;&gt;          &amp;#34;food&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:#e6db74&#34;&gt;            &amp;#34;type&amp;#34;: &amp;#34;long&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:#e6db74&#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:#e6db74&#34;&gt;          &amp;#34;garden&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:#e6db74&#34;&gt;            &amp;#34;type&amp;#34;: &amp;#34;long&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:#e6db74&#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:#e6db74&#34;&gt;          &amp;#34;hifi&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:#e6db74&#34;&gt;            &amp;#34;type&amp;#34;: &amp;#34;long&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:#e6db74&#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:#e6db74&#34;&gt;          &amp;#34;music&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:#e6db74&#34;&gt;            &amp;#34;type&amp;#34;: &amp;#34;long&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:#e6db74&#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:#e6db74&#34;&gt;          &amp;#34;shoes&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:#e6db74&#34;&gt;            &amp;#34;type&amp;#34;: &amp;#34;long&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:#e6db74&#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:#e6db74&#34;&gt;          &amp;#34;toys&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:#e6db74&#34;&gt;            &amp;#34;type&amp;#34;: &amp;#34;long&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:#e6db74&#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:#e6db74&#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:#e6db74&#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:#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:#e6db74&#34;&gt;        &amp;#34;type&amp;#34;: &amp;#34;string&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:#e6db74&#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:#e6db74&#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:#e6db74&#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:#e6db74&#34;&gt;}&amp;#39;&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/logstash -f logstash.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;http://david.pilato.fr/blog/images/reindex-es01/sense02.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;http://david.pilato.fr/blog/images/reindex-es01/sense02.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h2 id=&#34;インデックスやタイプ名の変更&#34;&gt;インデックスやタイプ名の変更&lt;/h2&gt;
&lt;p&gt;もちろん、インデックス名やタイプ名、IDを変更したい場合も変更が可能です！:)&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-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;elasticsearch&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:#960050;background-color:#1e0010&#34;&gt;host&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;localhost&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:#960050;background-color:#1e0010&#34;&gt;port&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;9201&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:#960050;background-color:#1e0010&#34;&gt;protocol&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http&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:#960050;background-color:#1e0010&#34;&gt;index&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;europe_people&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:#960050;background-color:#1e0010&#34;&gt;index_type&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;someone&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:#960050;background-color:#1e0010&#34;&gt;document_id&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%{[@metadata][_id]}&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;</content:encoded>
    </item>
    
    <item>
      <title>discuss.elastic.co にぜひ参加を</title>
      <link>https://blog.johtani.info/blog/2015/05/21/join-the-conversation-ja/</link>
      <pubDate>Thu, 21 May 2015 17:45:03 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/05/21/join-the-conversation-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/join-the-conversation&#34;&gt;Join the Conversation: Discuss.Elastic.Co&lt;/a&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;3つのOSSプロジェクトの開発をスケールアップし始め、
コミュニティサポートのために必要なやりとりに対してメーリングリストでは難しいということがわかってきました。
私たちは複数のメーリングリストを持っています。Elasticsearch、Logstash、そして英語以外の様々な言語のメーリングリストです。
このような状況では、あたらしい人たちはどこで質問をするのが良いのか混乱します。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/join-the-conversation&#34;&gt;Join the Conversation: Discuss.Elastic.Co&lt;/a&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;3つのOSSプロジェクトの開発をスケールアップし始め、
コミュニティサポートのために必要なやりとりに対してメーリングリストでは難しいということがわかってきました。
私たちは複数のメーリングリストを持っています。Elasticsearch、Logstash、そして英語以外の様々な言語のメーリングリストです。
このような状況では、あたらしい人たちはどこで質問をするのが良いのか混乱します。&lt;/p&gt;
&lt;p&gt;また、メーリングリストの流量が増え、「参考になる話題」を見つけるのが難しくなってきました。
様々なユーザに採用してもらい、様々なユースケースが出てくることで、様々な質問が出てきています。
汎用的なメーリングリストではノイズの中から望んだ情報を見つけるのは難しいです。
また、ユーザ全てがメーリングリスト満足しているわけではありません。&lt;/p&gt;
&lt;p&gt;Elasticは、ユーザの問題を解くことが大好きです。
コミュニティのメンバー皆さんに気に入っていただけるであろうソリューションを見つけ、フォーラムを
&lt;a href=&#34;https://discuss.elastic.co&#34;&gt;https://discuss.elastic.co&lt;/a&gt; に移すことにしました。
ぜひ参加して、この新しいツールについてのご意見を聞かせてください。&lt;/p&gt;
&lt;p&gt;メーリングリストは好きだけど、ウェブフォーラムは苦手？問題ありません。
フォーラムにユーザプロファイル（GitHub、Facebook、Twitter、Google Appsのアカウントと連携するか、emailアドレスを利用すれば簡単に作れます）を作り、
email通知の設定をすればOKです。
これで、&lt;a href=&#34;https://discuss.elastic.co/t/email-only-interaction-with-the-forums/106&#34;&gt;emailでのやりとり&lt;/a&gt;ができるようになります。&lt;/p&gt;
&lt;p&gt;利用して、議論を楽しんでください。
もちろん、改善案などにかんする&lt;a href=&#34;https://discuss.elastic.co/c/meta&#34;&gt;ご意見もお待ちしています&lt;/a&gt;！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Watcher : アラート用プラグイン、coming soon（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2015/05/12/watcher-you-know-for-alerting-coming-soon-ja/</link>
      <pubDate>Tue, 12 May 2015 00:27:56 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/05/12/watcher-you-know-for-alerting-coming-soon-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/watcher-you-know-for-alerting-coming-soon&#34;&gt;Watcher: You Know, For Alerting (Coming Soon)&lt;/a&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;HTTPで公開されている簡単なREST APIを持っており、Elasticsearchは自動化や
インテグレーションを助けるプラットフォームです。
パーコレーターAPIを使うかどうかに関係なく、Nagiosのようなインフラモニタリングシステムと直接統合したり、
クエリを実行して、アクションを起こすようなcronのジョブスクリプトなど、
ユーザはいつでもElasticsearchの上に通知やアラートのシステムを構築することができます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/watcher-you-know-for-alerting-coming-soon&#34;&gt;Watcher: You Know, For Alerting (Coming Soon)&lt;/a&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;HTTPで公開されている簡単なREST APIを持っており、Elasticsearchは自動化や
インテグレーションを助けるプラットフォームです。
パーコレーターAPIを使うかどうかに関係なく、Nagiosのようなインフラモニタリングシステムと直接統合したり、
クエリを実行して、アクションを起こすようなcronのジョブスクリプトなど、
ユーザはいつでもElasticsearchの上に通知やアラートのシステムを構築することができます。&lt;/p&gt;
&lt;p&gt;Elasticsearchのダウンロード数が増えるにつれて、そのユースケースが成熟・拡大することで、
私たちのユーザやカスタマーから、彼らの増加する多様なデータセットの変化や例外を
検知する助けとなるような、アラートや通知機能を簡単なAPIで統合したいという要望を多くもらっていました。&lt;/p&gt;
&lt;p&gt;本日、彼らのニーズを理解するために多くの時間をさき、数ヶ月の設計コーディングを経て、
Watcherのアナウンスができることに喜びを感じています。
Watcherは柔軟で強力なプロダクトです。
これは、Elasticsearchユーザが、彼らのはば広いユースケースに対して、
データの変化について通知しアクションをおこすできるようにします。
&lt;a href=&#34;https://www.elastic.co/elasticon/2015/sf/tectonic-shifts-tweets-and-tactical-data-analysis&#34;&gt;地震の検知のためにソーシャルメディアをモニタリングしたり&lt;/a&gt;、
&lt;a href=&#34;https://www.elastic.co/elasticon/2015/sf/tackling-security-logs-with-the-elk-stack&#34;&gt;インフラでの不穏な動きを見つけたり&lt;/a&gt;、&lt;a href=&#34;https://www.elastic.co/elasticon/2015/sf/unlocking-interplanetary-datasets-with-real-time-search&#34;&gt;火星のローバーを管理したり&lt;/a&gt;に関わらず、
データの変更に基づいて簡単に通知をプッシュできる機能は画期的なものです。&lt;/p&gt;
&lt;p&gt;私たちの他のプロダクト同様、WatcherはElasticsearchの公開されている拡張ポイントを使って開発されています。
これは、既存のElasticsearchクラスタにインストールでき、簡単に使い始めることができます。&lt;/p&gt;
&lt;h2 id=&#34;動作する方法watchの細部&#34;&gt;動作する方法：&amp;ldquo;Watch&amp;quot;の細部&lt;/h2&gt;
&lt;h3 id=&#34;queryの定義&#34;&gt;Queryの定義&lt;/h3&gt;
&lt;p&gt;404エラーに興味がありますか？ディスク領域不足は？
Twitter上での最新のキャンペーン行う最高のタイミングを知りたいですか？
では、知りたいことをElasticsearchのクエリ言語（Aggregationを含む）の全機能を使って
クエリとして定義しましょう。&lt;/p&gt;
&lt;h3 id=&#34;条件の設定&#34;&gt;条件の設定&lt;/h3&gt;
&lt;p&gt;いま、Watcherが何を見つけるべきかを知っています。
アラートの閾値を設定しましょう。
404エラーが平均以上の頻度で発生した場合する場合だけを気にしたいかもしれません。
より洗練された条件を作るために、スクリプティングでサポートします。&lt;/p&gt;
&lt;h3 id=&#34;スケジュールの選択&#34;&gt;スケジュールの選択&lt;/h3&gt;
&lt;p&gt;Watcherがクエリを実行し、条件をチェックする頻度を選択しましょう。
シンプルなスケジュール（毎分、毎時、日時での実行）を定義するのは簡単です。
さらに、複雑なスケジューリングのために、cronシンタックスもサポートします。&lt;/p&gt;
&lt;h3 id=&#34;アクションの定義&#34;&gt;アクションの定義&lt;/h3&gt;
&lt;p&gt;条件に合致した場合、Watcherはカスタムのemailを送ったり、
WebHook経由でPagerDutyのような外部システムにデータをプッシュしたり、
クエリの結果を取得してElasticsearchに保存したりできます。&lt;/p&gt;
&lt;h2 id=&#34;さらに詳しく&#34;&gt;さらに詳しく&lt;/h2&gt;
&lt;p&gt;もし、詳細を知りたい場合は、5月20日水曜日の&lt;a href=&#34;https://www.elastic.co/webinars/watcher-alerting-for-elasticsearch&#34;&gt;WatcherのWebinar&lt;/a&gt;に参加してください。
Uri BonessとSteve Kearnsがインストールや設定についての概要を説明しデモを行います。
また、サインアップするときに、Watcherのベータを選択することもできます。&lt;/p&gt;
&lt;p&gt;最後に、Watcherは既存のサブスクリプションのカスタマーや将来のサブスクリプションのカスタマーには
無料で利用できることをここに案内します。
私たちのカスタマーの成功や、
プロダクションやデベロップメントサポートにおける開発者に提供された知見や、
弊社プロダクトファミリーの成長に重要な投資をしています。
最新のプロダクトを追加料金を必要とせずに最新プロダクトを提供できることだけには満足していません。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch 1.5.2 および 1.4.5リリース（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2015/04/28/elasticsearch-1-5-2-and-1-4-5-released-ja/</link>
      <pubDate>Tue, 28 Apr 2015 15:14:08 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/04/28/elasticsearch-1-5-2-and-1-4-5-released-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-1-5-2-and-1-4-5-released&#34;&gt;Elasticsearch 1.5.2 Released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日（4/27）、&lt;strong&gt;Lucene 4.10.4&lt;/strong&gt;ベースの&lt;strong&gt;Elasticsearch 1.5.1&lt;/strong&gt;および&lt;strong&gt;Elasticsearch 1.4.5&lt;/strong&gt; をセキュリティバグフィックス版をリリースしました。
ダウンロードおよびすべての変更については次のリンクをごらんください。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-1-5-2-and-1-4-5-released&#34;&gt;Elasticsearch 1.5.2 Released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日（4/27）、&lt;strong&gt;Lucene 4.10.4&lt;/strong&gt;ベースの&lt;strong&gt;Elasticsearch 1.5.1&lt;/strong&gt;および&lt;strong&gt;Elasticsearch 1.4.5&lt;/strong&gt; をセキュリティバグフィックス版をリリースしました。
ダウンロードおよびすべての変更については次のリンクをごらんください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最新安定版：&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-1-5-2&#34;&gt;Elasticsearch 1.5.2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;1.4系バグフィックス：&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-1-4-5&#34;&gt;Elasticsearch 1.4.5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;本リリースはディレクトリトラバーサルの脆弱性のフィックスです。すべてのユーザにアップグレードを勧めます。&lt;/em&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;過去のリリースに関するブログは以下のリンクを参照してください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;1.5&lt;/em&gt;:&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-5-1-released/&#34;&gt;1.4.1&lt;/a&gt;,
&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-5-0-released/&#34;&gt;1.5.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;1.4&lt;/em&gt;:&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-4-released/&#34;&gt;1.4.4&lt;/a&gt;,&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-3-released/&#34;&gt;1.4.3&lt;/a&gt;,
&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-2-released/&#34;&gt;1.4.2&lt;/a&gt;,&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-1-released/&#34;&gt;1.4.1&lt;/a&gt;,
&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-0-released/&#34;&gt;1.4.0&lt;/a&gt;, &lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-0-beta-released/&#34;&gt;1.4.0.Beta1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;すべての&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-1-5-2&#34;&gt;1.5.2&lt;/a&gt;および&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-1-4-5&#34;&gt;1.4.5&lt;/a&gt;の変更についてはリンクをごらんください。以下では、セキュリティの問題について紹介します。&lt;/p&gt;
&lt;h2 id=&#34;ディレクトリトラバーサル脆弱性の発見&#34;&gt;ディレクトリトラバーサル脆弱性の発見&lt;/h2&gt;
&lt;p&gt;1.5.2および1.4.5以前の全バージョンのElasticsearchで、ディレクトリトラバーサル攻撃に対する脆弱性がみつかりました。
攻撃者はElasticsearchを実行しているサーバからファイルを取得することができます。
この脆弱性はインストールしたばかりのElasticsearchには存在しません。
この脆弱性は&amp;quot;site plugin&amp;quot;がインストールされると露呈します。
ElasticのMarvelプラグインおよびコミュニティサポートの多くのプラグイン（例：Kopf、BigDesk、Head）がsite pluginです。
Elastic Shield、Licensing、Cloud-AWS、Cloud-GCE、Cloud-Azure、analysis pluginおよびriverプラグインはsite pluginでは&lt;em&gt;ありません&lt;/em&gt;。&lt;/p&gt;
&lt;p&gt;この問題を&lt;a href=&#34;https://www.elastic.co/community/security&#34;&gt;CVE-2015-3337&lt;/a&gt;としました。&lt;/p&gt;
&lt;p&gt;バージョン1.5.2と1.4.5はこの脆弱性に対して対策済みで、私たちはすべてのユーザにアップグレードを勧めています。&lt;/p&gt;
&lt;p&gt;アップグレードを望まないユーザはいくつかの方法でこの脆弱性に対して対応可能ですが、これらの方法はsite pluginを動作させなくします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;site pluginをインストールしているノードの&lt;code&gt;elasticsearch.yml&lt;/code&gt;の&lt;code&gt;http.disable_sites&lt;/code&gt;を&lt;code&gt;true&lt;/code&gt;に設定し、Elasticsearchのノードを再起動&lt;/li&gt;
&lt;li&gt;ファイアウォールもしくはプロキシを利用して、&lt;code&gt;/_plugin&lt;/code&gt;へのHTTPリクエストをブロック&lt;/li&gt;
&lt;li&gt;すべてのsite pluginをすべてのElasticsearchノードからアンインストール&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この問題を報告していただいた、DocuSignのJohn Heasmanに感謝いたします。&lt;/p&gt;
&lt;h2 id=&#34;他の変更について&#34;&gt;他の変更について&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/10526&#34;&gt;インデックスされたスクリプトおよびテンプレート&lt;/a&gt;を上書きもしくは削除時に、キャッシュからも完全に削除する。&lt;/li&gt;
&lt;li&gt;geo-shapeの多数のフィックス（&lt;code&gt;distance_error_pct&lt;/code&gt;を利用した場合の、重要な&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/10679&#34;&gt;precisionに関するフィックス&lt;/a&gt;を含む）&lt;/li&gt;
&lt;li&gt;インデックステンプレートのデフォルトマッピングがバルクインデキシング中にも考慮するように修正&lt;/li&gt;
&lt;li&gt;Shadowレプリカが&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/10688&#34;&gt;ファイルシステムの遅延&lt;/a&gt;に対する対障害性を向上し、プライマリシャードの&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/10585&#34;&gt;よりスムーズなリロケーション&lt;/a&gt;をサポート&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://github.com/elastic/elasticsearch/issues/10602&#34;&gt;geo-contexts&lt;/a&gt;をcompletion suggesterで使用した場合のマッピングのリフレッシュループを改善&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;いくつかの重要な変更がv1.4.5にバックポートされています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://github.com/elastic/elasticsearch/issues/10463&#34;&gt;大きなシャードのリカバリを早くする&lt;/a&gt;ためのシャードリカバリ中のマージを可能に
* &lt;a href=&#34;http://github.com/elastic/elasticsearch/issues/9797&#34;&gt;truncated translogs&lt;/a&gt;の操作をグレースフルに&lt;/li&gt;
&lt;li&gt;マージが遅くなる場合に、&lt;a href=&#34;http://github.com/elastic/elasticsearch/issues/9986&#34;&gt;delete-by-queryを減速&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ぜひ、&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-1-5-2&#34;&gt;Elasticsearch 1.5.2&lt;/a&gt;をダウンロードして、試してみてください。
そして、感想をTwitter(&lt;a href=&#34;https://twitter.com/elastic&#34;&gt;@elastic&lt;/a&gt;)などで教えて下さい。
また、問題がありましたら、&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues&#34;&gt;GitHub issues page&lt;/a&gt;で報告をお願いします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第9回Elasticsearch勉強会を開催しました。#elasticsearchjp</title>
      <link>https://blog.johtani.info/blog/2015/04/17/9th-elasticsearch-jp/</link>
      <pubDate>Fri, 17 Apr 2015 14:41:54 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/04/17/9th-elasticsearch-jp/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://elasticsearch.doorkeeper.jp/events/23012&#34;&gt;第9回Elsticsearch勉強会&lt;/a&gt;を開催しました。
スタッフの皆さん、スピーカーの皆さん、開場提供していただいた&lt;a href=&#34;http://recruit-tech.co.jp&#34;&gt;リクルートテクノロジーズさん&lt;/a&gt;、ありがとうございました！
次回もよろしくお願いします！参加していただき盛り上げていただいた参加者の皆さんもありがとうございました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://elasticsearch.doorkeeper.jp/events/23012&#34;&gt;第9回Elsticsearch勉強会&lt;/a&gt;を開催しました。
スタッフの皆さん、スピーカーの皆さん、開場提供していただいた&lt;a href=&#34;http://recruit-tech.co.jp&#34;&gt;リクルートテクノロジーズさん&lt;/a&gt;、ありがとうございました！
次回もよろしくお願いします！参加していただき盛り上げていただいた参加者の皆さんもありがとうございました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;今回はトレーニングで来日していたIgorとNathanによる特別公演でした。
昨年同様、&lt;a href=&#34;http://samuraism.com&#34;&gt;サムライズム&lt;/a&gt;の&lt;a href=&#34;https://twitter.com/yusuke&#34;&gt;@yusuke&lt;/a&gt;さんに
テキスト翻訳していただき、大変助かりました。ほんとうにすごかった。。。&lt;/p&gt;
&lt;h3 id=&#34;チェックイン数など&#34;&gt;チェックイン数など&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;今回はチェックインした人：119名&lt;/li&gt;
&lt;li&gt;キャンセルしなかった人：45名&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;でした。今回はキャンセル待ちのまま当日を迎えた人もいなかったので良かったかなと。
今回から懇親会ページを別にしてみました。本編の勉強会に参加登録していた方には何度かメールを出していたので、
見つけていなかった人は以内とは思うのですが、勉強会のページと間違える人がいたらしいという話を聞きました。
Doorkeeperで1イベントで複数のチケットにそれぞれの参加者数を設定できるようになると嬉しいかもなぁ。&lt;/p&gt;
&lt;p&gt;さて、いつもの通り簡単なメモです。
本当に簡単にですが。&lt;/p&gt;
&lt;h2 id=&#34;resiliency-in-elasticsearch-and-lucene--igor-motov&#34;&gt;Resiliency in Elasticsearch and Lucene / Igor Motov&lt;/h2&gt;
&lt;p&gt;スライド：https://speakerdeck.com/elastic/resiliency-in-elasticsearch-and-lucene&lt;/p&gt;
&lt;p&gt;※上記スライドは少し古いバージョンです。公開されたら差し替える予定です。&lt;/p&gt;
&lt;p&gt;サンフランシスコで行われた&lt;a href=&#34;https://www.elastic.co/elasticon&#34;&gt;Elastic{ON}&lt;/a&gt;（弊社初のカンファレンス）で行われたセッションの
改良版といったところでしょうか。
話の中で登場した機能などのリンクをざっとアップしておきます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.elastic.co/guide/en/elasticsearch/guide/current/fielddata.html&#34;&gt;Fielddata&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.elastic.co/guide/en/elasticsearch/guide/current/doc-values.html&#34;&gt;Doc Values&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.elastic.co/guide/en/elasticsearch/resiliency/current/index.html&#34;&gt;Resiliency Status&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;kibana4-whats-new---nathan-zamecnik&#34;&gt;Kibana4: What&amp;rsquo;s New ? / Nathan Zamecnik&lt;/h2&gt;
&lt;p&gt;スライド：未定&lt;/p&gt;
&lt;p&gt;Kibana4の紹介をデモを交えてという感じでした。
こちらは、スライドよりもデモを見てもらうのが一番いいのですが。。。&lt;/p&gt;
&lt;p&gt;いくつかQAがあったので補足を。ちなみに、Issueのラベルに実装される予定のバージョンが付与されてたりします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Q：グラフをPDFでエクスポートとかできますか？
&lt;ul&gt;
&lt;li&gt;A：4.3.0で実装される予定です。関連Issueはこちら。https://github.com/elastic/kibana/issues/509&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q：巨大な数値の場合にKB、MBなどといった表示は可能ですか？
&lt;ul&gt;
&lt;li&gt;A：4.1.0で実装される予定です。関連Issueはこちら。https://github.com/elastic/kibana/issues/1543&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q：地図のズームを固定することはできますか？
&lt;ul&gt;
&lt;li&gt;A：4.1.0で実装される予定です。関連Issueはこちら。https://github.com/elastic/kibana/issues/1442&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;その他感想などのブログ&#34;&gt;その他、感想などのブログ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://suzuki.tdiary.net/20150415.html#p01&#34;&gt;[Elasticsearch] 第9回 Elasticsearch 勉強会へ参加してきた&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;今回は特別バージョンでした。かなり詳しい話だったので面白かったと思います。
Kibanaはデモを見ていただけましたし。また、海外から人を呼べるといいなぁ。&lt;/p&gt;
&lt;p&gt;次回は6月ごろをめどに計画しようかと。
スピーカーは随時募集中ですので、コメント、メール、ツイートなど、コンタクトしていただければと思います。 よろしくお願いいたします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Riverが非推奨に（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2015/04/14/deprecating-rivers-ja/</link>
      <pubDate>Tue, 14 Apr 2015 11:22:22 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/04/14/deprecating-rivers-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/deprecating_rivers&#34;&gt;Deprecating Rivers&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Riverを追加した、Elasticsearchを始めたばかりの頃には、このアイデアは革新的でした。
ユーザがElasticsearchを使って、Elasticsearchで検索できるようにするためにデータを入れることが
最初の仕事の一つです。
なので、Elasticsearchに自動的にデータを取得する直接インストールできるプラグインを
コミュニティの人たちが作成できるようにしました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/deprecating_rivers&#34;&gt;Deprecating Rivers&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Riverを追加した、Elasticsearchを始めたばかりの頃には、このアイデアは革新的でした。
ユーザがElasticsearchを使って、Elasticsearchで検索できるようにするためにデータを入れることが
最初の仕事の一つです。
なので、Elasticsearchに自動的にデータを取得する直接インストールできるプラグインを
コミュニティの人たちが作成できるようにしました。&lt;/p&gt;
&lt;p&gt;最初のいくつかのRiverの実装は良くできていて非常に有用でした。
CouchDB Riverは非常にシンプルで人気がありました。（CouchDBのAPIを変更してくれてありがとう！）
その他に人気のあるものは例えばRabbitMQでした。
それらはゆっくりとですが、Riverの問題を顕在化させ始めました。&lt;/p&gt;
&lt;p&gt;我々が発見した問題はどんなものでしょう？
それはクラスタの安定性です。
それらの性質なのですが、Riverは外部システムと連携しており、
それらの外部システムは外部のライブラリを必要とします。
それら自体はとても有用なのですが、それらによってオーバーヘッドがあります。
オーバーヘッドがその一部として組み込まれるということは、より多くのメモリ、ソケット、
ファイルデスクリプタなどを使用するということです。また、バグもです。&lt;/p&gt;
&lt;p&gt;ここ数年の私たちの努力で、Elasticsearchのresiliency（弾力性）を改善しています。
そして、Riverが自身の特性として外部システムと外部システムライブラリと一緒に動作することにより
クラスタの不安定性を引き起こしている大きな原因であるということを再三、見てきました。
数ヶ月前にFoundが参加した時に、私たちは彼らも同じ考えであることを知りました。
彼らの管理している数千のクラスタにおいて、Riverプラグインがクラスタの不安定性の多くの原因であると。&lt;/p&gt;
&lt;p&gt;私たちはなんどか、それを見ることで、より弾力性のあるシステムを構築するための助けに、
Riverを非推奨にすることに決定し、ユーザにElasticsearchに「外部から」データを入れることに
集中して欲しいとお願いします。&lt;/p&gt;
&lt;p&gt;Riversは1.5で非推奨になりました。
2.0では移行を簡単にするために基盤は保持しますが、その後のバージョンでは削除するでしょう。&lt;/p&gt;
&lt;p&gt;Elasticsearchにデータを入れる簡単な方法はまだ重要だと考えます。どんな方法があるでしょう？&lt;/p&gt;
&lt;p&gt;この一年あまりで、私たちは多くのプログラミング言語のElasticsearchの公式クライアントを提供しています。
これは、アプリケーションに組み込んで、すでにあるコードベースに簡単にデータを取得する処理を入れられます。
（このあたりおかしい）この手法はまた、Elasticsearch簡単に&amp;hellip;
一般的な例では、ORMとしてすでに使われているドメインモデルをデータベースにマッピングするアプリケーションや
ドメインモデルをElasticsearchにフッキング、インデキシングするための実装です。&lt;/p&gt;
&lt;p&gt;また、Logstashやそれに似たツールもElasticsearchにデータを登録することができます。
例えば、Elasticsearchの幾つかのRiverは、来るLogstash 1.5でLogstashのプラグイン（例えば、&lt;a href=&#34;https://github.com/logstash-plugins/logstash-input-couchdb_changes&#34;&gt;CouchDBのプラグイン&lt;/a&gt;）として実装されているものがあります。&lt;/p&gt;
&lt;p&gt;私はコミュニティと様々なRiverプラグインを作成しての作業を愛しています。
Riverを非推奨にする決定は容易ではありませんでした。
もしあなたがRiverプラグインの作者ならば何をしなければならないでしょう？&lt;/p&gt;
&lt;p&gt;Riverは比較的自身で完結しているため、コードはElasticsearchにデータを入れることが出来る
一般的なライブラリとして抽出することができます。
したがって、このライブラリは様々な場所で利用できるでしょう。
シンプルな「main class」であれば、スタンドアローンとしてそれを実行できるように書くこともできます。&lt;/p&gt;
&lt;p&gt;その他の方法としてはLogstashのinputプラグインに移行することもできます。
Logstashのinputは作成するのが非常に簡単で、1.5に関しては、
Logstashチームがプラグインの&lt;a href=&#34;https://www.elastic.co/guide/en/logstash/current/_how_to_write_a_logstash_input_plugin.html&#34;&gt;記述方法、管理方法、そしてプラグインを探す方法について記述&lt;/a&gt;しています。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch 1.5.1リリース（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2015/04/13/elasticsearch-1-5-1-released-ja/</link>
      <pubDate>Mon, 13 Apr 2015 11:34:31 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/04/13/elasticsearch-1-5-1-released-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-1-5-1-released&#34;&gt;Elasticsearch 1.5.1 Released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日（4/9）、&lt;strong&gt;Lucene 4.10.4&lt;/strong&gt;ベースの&lt;strong&gt;Elasticsearch 1.5.1&lt;/strong&gt; をリリースしました。
このリリースはElasticsearchの最新の安定バージョンとなります。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-1-5-1-released&#34;&gt;Elasticsearch 1.5.1 Released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日（4/9）、&lt;strong&gt;Lucene 4.10.4&lt;/strong&gt;ベースの&lt;strong&gt;Elasticsearch 1.5.1&lt;/strong&gt; をリリースしました。
このリリースはElasticsearchの最新の安定バージョンとなります。&lt;/p&gt;
&lt;p&gt;すべての変更については&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-1-5-1&#34;&gt;download Elasticsearch 1.5.1 here&lt;/a&gt;をごらんください。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;本リリースはシャードを新しいノードに配置するスピードを改善するためのバグフィックスを含んでいます。
シャードのリカバリーの最初のフェーズで、コピー元のノードからコピー先のノードへすべてのセグメントをコピーします。
このフェーズ中には登録、更新削除のリクエストはトランザクションログに記録され、リカバリが終了したあとに
コピー先のノードでトランザクションログが再生されます。
シャードが大きい場合、トランザクションログに多数のイベントがたまってしまいます。&lt;/p&gt;
&lt;p&gt;以前では、新しいセグメントのマージはリカバリ中のコピー先のノードでは、実行できませんでした。
大きなトランザクションログは結果として、小さな新しいセグメントを多く生成し、リカバリのスピードに非常に影響を与えます。
Issue &lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/10463&#34;&gt;#10463&lt;/a&gt;は
リカバリ中のコピー先のシャードのマージを可能にする変更です。&lt;/p&gt;
&lt;p&gt;その他の注目すべきバグフィックスは次のものになります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多くの削除によりバージョンマップがいっぱいになった場合にrefreshを実行するように変更(&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/10312&#34;&gt;#10312&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;多数のスナップショットを含んだリポジトリの管理の改善(&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/10366&#34;&gt;#10366&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;実験的な機能である&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-inner-hits.html&#34;&gt;inner hits&lt;/a&gt;のバグフィックス(&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/10388&#34;&gt;#10388&lt;/a&gt;, &lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/10353&#34;&gt;#10353&lt;/a&gt;, &lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/10309&#34;&gt;#10309&lt;/a&gt;, &lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/10235&#34;&gt;#10235&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最後に、&lt;a href=&#34;https://www.elastic.co/blog/deprecating_rivers&#34;&gt;Riverが非推奨となりました&lt;/a&gt;、まだ見ていない場合は記事をご覧ください。&lt;/p&gt;
&lt;p&gt;ぜひ、&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-1-5-1&#34;&gt;Elasticsearch 1.5.1&lt;/a&gt;をダウンロードして、試してみてください。
そして、感想をTwitter(&lt;a href=&#34;https://twitter.com/elastic&#34;&gt;@elastic&lt;/a&gt;)などで教えて下さい。
また、問題がありましたら、&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues&#34;&gt;GitHub issues page&lt;/a&gt;で報告をお願いします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Kibana4でいろんなデータを見てみよう</title>
      <link>https://blog.johtani.info/presentation/2015/kibana4deironnadetawojian-temiyou/</link>
      <pubDate>Mon, 13 Apr 2015 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2015/kibana4deironnadetawojian-temiyou/</guid>
      <description>&lt;p&gt;JJUG CCC 2015 Springでの発表資料です。&lt;/p&gt;
&lt;p&gt;Kibana4についてはデモを行ったため説明は少ないです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;JJUG CCC 2015 Springでの発表資料です。&lt;/p&gt;
&lt;p&gt;Kibana4についてはデモを行ったため説明は少ないです。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Introduction Elasticsearch and ELK - Elasticsearch勉強会 in Nagoya </title>
      <link>https://blog.johtani.info/presentation/2015/introduction-elasticsearch-and-elk-elasticsearchmian-qiang-hui-in-nagoya/</link>
      <pubDate>Mon, 06 Apr 2015 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2015/introduction-elasticsearch-and-elk-elasticsearchmian-qiang-hui-in-nagoya/</guid>
      <description>&lt;p&gt;Elasticsearch勉強会 in Nagoya で使用したスライド&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Elasticsearch勉強会 in Nagoya で使用したスライド&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch勉強会 in 名古屋を開催しました。#elasticsearch #elasticsearchjp</title>
      <link>https://blog.johtani.info/blog/2015/04/04/elasticsearch-study-session-at-nagoya/</link>
      <pubDate>Sat, 04 Apr 2015 09:47:19 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/04/04/elasticsearch-study-session-at-nagoya/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://elasticsearch.doorkeeper.jp/events/21984&#34;&gt;Elasticsearch勉強会 in 名古屋&lt;/a&gt;を開催しました。
初の東京以外での勉強会です。
企画、セッションなどお手伝いいただいた&lt;a href=&#34;https://twitter.com/smogami&#34;&gt;@smogami&lt;/a&gt;さん、&lt;a href=&#34;https://twitter.com/mzp&#34;&gt;@mzp&lt;/a&gt;さんありがとうございました！&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:500&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20150406/nagoya.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20150406/nagoya.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;!-- more --&gt;
&lt;h2 id=&#34;elasticsearchelk-stack紹介-johtani&#34;&gt;Elasticsearch/ELK stack紹介 @johtani&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://speakerdeck.com/johtani/introduction-elasticsearch-and-elk-elasticsearchmian-qiang-hui-in-nagoya&#34;&gt;Introduction Elasticsearch&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;初回（次回があるかはわかりませんが。。。）ということもあり、Elasticsearchの説明を行いました。
あと、LogstashとKibanaも。
Kibanaについては、手元の環境でいつものアクセスログのデモやなどを行いました。
また、LTの後に時間があったので、前回の勉強会で利用したチェックリストの説明なども。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://elasticsearch.doorkeeper.jp/events/21984&#34;&gt;Elasticsearch勉強会 in 名古屋&lt;/a&gt;を開催しました。
初の東京以外での勉強会です。
企画、セッションなどお手伝いいただいた&lt;a href=&#34;https://twitter.com/smogami&#34;&gt;@smogami&lt;/a&gt;さん、&lt;a href=&#34;https://twitter.com/mzp&#34;&gt;@mzp&lt;/a&gt;さんありがとうございました！&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:500&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20150406/nagoya.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20150406/nagoya.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;!-- more --&gt;
&lt;h2 id=&#34;elasticsearchelk-stack紹介-johtani&#34;&gt;Elasticsearch/ELK stack紹介 @johtani&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://speakerdeck.com/johtani/introduction-elasticsearch-and-elk-elasticsearchmian-qiang-hui-in-nagoya&#34;&gt;Introduction Elasticsearch&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;初回（次回があるかはわかりませんが。。。）ということもあり、Elasticsearchの説明を行いました。
あと、LogstashとKibanaも。
Kibanaについては、手元の環境でいつものアクセスログのデモやなどを行いました。
また、LTの後に時間があったので、前回の勉強会で利用したチェックリストの説明なども。&lt;/p&gt;
&lt;h2 id=&#34;スタンドファームにおけるelasticsearch導入事例-mzp-さん&#34;&gt;スタンドファームにおけるElasticsearch導入事例 &lt;a href=&#34;https://twitter.com/mzp&#34;&gt;@mzp&lt;/a&gt; さん&lt;/h2&gt;
&lt;p&gt;スライド：後日アップ？&lt;/p&gt;
&lt;p&gt;* 使ってるのはKibana3&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アクセスログが保存されてたけど、活用できてなかった。&lt;/li&gt;
&lt;li&gt;Fluentd、Elasticsearch、Kibanaをいれて、可視化してみた。&lt;/li&gt;
&lt;li&gt;普通にログ検索が簡単にできて嬉しい&lt;/li&gt;
&lt;li&gt;システムのレスポンスの性能値などを可視化できるようにして性能改善中&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;kibanaでログ分析を1年続けてみたら業務システムの保守と運用が捗った仮-smogami-さん&#34;&gt;Kibanaでログ分析を1年続けてみたら業務システムの保守と運用が捗った(仮) &lt;a href=&#34;https://twitter.com/smogami&#34;&gt;@smogami&lt;/a&gt; さん&lt;/h2&gt;
&lt;p&gt;スライド：「&lt;a href=&#34;https://speakerdeck.com/exoego/how-and-why-i-have-been-leveraging-kibana-for-devops&#34;&gt;Kibanaでログ分析を1年続けてみたら業務システムの保守と運用が捗った&lt;/a&gt;」&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;名古屋でJavaの勉強会を主催してみたり（最近できてないけど）&lt;/li&gt;
&lt;li&gt;導入するのになかなか大変だった（ファイアウォールだったりが）。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kibanaを使ってどんなことをしてるのか？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;既存システムなどの機能の実行回数やレスポンス時間の推移&lt;/li&gt;
&lt;li&gt;曜日ごとにもチェック&lt;/li&gt;
&lt;li&gt;どの機能がよく使われるのか？&lt;/li&gt;
&lt;li&gt;対象となっているシステムはJavaのシステム。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;QA&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Q：ログの出力は新規に追加したのか？
&lt;ul&gt;
&lt;li&gt;A : ログの出力自体はLog4Jの設定を変更しただけ。もともと、各メソッドの開始と終了にそれぞれ時間が出力される仕組みがある。&lt;br&gt;
ログの読み込み自体は自作ツールを利用。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;飛び込みlt-dabits-さん&#34;&gt;飛び込みLT &lt;a href=&#34;https://twitter.com/dabits&#34;&gt;@dabits&lt;/a&gt; さん&lt;/h2&gt;
&lt;p&gt;スライド：未定&lt;/p&gt;
&lt;p&gt;Kibanaの使い道&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;KPIツール&lt;/li&gt;
&lt;li&gt;エゴサーチツール - Twitterや2chなどのデータを解析ソーシャル分析みたいな感じ？
* ダッシュボードを用意してあげる場合もあるが、触っていろんな機能を試す人も。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;感想反省点など&#34;&gt;感想・反省点など&lt;/h2&gt;
&lt;p&gt;30名弱の方に参加していただきました。ありがとうございました。
東京の勉強会でもそうですが、半分くらいが検索、半分くらいがログ解析関連に興味がある感じでした。
飛び込みLTもしていただけましたし。会場内限定の話もいくつか。&lt;/p&gt;
&lt;h4 id=&#34;場所&#34;&gt;場所&lt;/h4&gt;
&lt;p&gt;場所が少しわかりにくかったかなと。。。建物の入り口に看板がないので、1名に看板役として立っていただきました。
ただ、設備は充実していましたし、室内も綺麗でよかったです。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:300&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20150406/seminar_room.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20150406/seminar_room.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h4 id=&#34;懇親会&#34;&gt;懇親会&lt;/h4&gt;
&lt;p&gt;11名（+私）でした。美味しい手羽先などをいただきながら、Elasticsearch以外のことでも盛り上がりましたw。
また、名古屋の観光名所なども教えてもらったりと有意義な時間でしたw。&lt;/p&gt;
&lt;p&gt;ということで、少しでもElasticsearch、Kibana、Logstashなどのユーザが増えてくれればうれしいかなと。
私抜きでも勉強会はできると思うので、今後も開いてもらえるとうれしいかぎりです。
初めての東京以外での勉強会でどんな感じの方が利用しているのか、興味があるのかといったことも知ることができました。&lt;/p&gt;
&lt;h2 id=&#34;関連ブログなど&#34;&gt;関連ブログなど&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.exoego.net/2015/04/kibana4-use-case.html&#34;&gt;Kibana4活用事例を話しました&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;その他余談&#34;&gt;その他（余談）&lt;/h2&gt;
&lt;p&gt;コンパルという喫茶店のアイスコーヒー。ちょっと新鮮な体験でした。


&lt;div class=&#34;box&#34; style=&#34;max-width:300&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20150406/ice_coffee.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20150406/ice_coffee.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;あとは、日曜日に観光場所として教えてもらった、&lt;a href=&#34;http://www.tcmit.org/&#34;&gt;トヨタ産業技術記念館&lt;/a&gt;にも行ってみました。
一人だったけど、非常に楽しめました。実演とかあって、わかりやすいし。
トヨタが自動織機の会社が始まりだってのは知らなかった。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch 1.5.0リリース（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2015/04/01/elasticsearch-1-5-0-released-ja/</link>
      <pubDate>Wed, 01 Apr 2015 12:38:16 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/04/01/elasticsearch-1-5-0-released-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-1-5-0-released&#34;&gt;Elasticsearch 1.5.0 Released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日（3/23）、&lt;strong&gt;Lucene 4.10.4&lt;/strong&gt;ベースの&lt;strong&gt;Elasticsearch 1.5.0&lt;/strong&gt; をリリースしました。
このリリースはElasticsearchの最新の安定バージョンとなります。
多くの&lt;em&gt;resiliency(復元性、弾力性) enhancement&lt;/em&gt;とバグフィックスを含んでおり、
すべてのユーザにアップグレードを推奨しています。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/elasticsearch-1-5-0-released&#34;&gt;Elasticsearch 1.5.0 Released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日（3/23）、&lt;strong&gt;Lucene 4.10.4&lt;/strong&gt;ベースの&lt;strong&gt;Elasticsearch 1.5.0&lt;/strong&gt; をリリースしました。
このリリースはElasticsearchの最新の安定バージョンとなります。
多くの&lt;em&gt;resiliency(復元性、弾力性) enhancement&lt;/em&gt;とバグフィックスを含んでおり、
すべてのユーザにアップグレードを推奨しています。&lt;/p&gt;
&lt;p&gt;すべての変更については&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-1-5-0&#34;&gt;download Elasticsearch 1.5.0 here&lt;/a&gt;をごらんください。&lt;/p&gt;
&lt;p&gt;460PRという大量の変更を含む本リリースは、Elasticsearchをよりresilient(弾力のあるもの)にするために
費やされています。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h3 id=&#34;inner-hits&#34;&gt;Inner hits&lt;/h3&gt;
&lt;p&gt;本リリースで追加された、Elasticsearchに最もリクエストされたものの一つがinner hitsです。
これは、&lt;code&gt;has_child&lt;/code&gt;もしくは&lt;code&gt;nested&lt;/code&gt;クエリにマッチした子のドキュメントを、各親ドキュメントと一緒に返すことができます。&lt;/p&gt;
&lt;p&gt;例えば、&lt;code&gt;blog&lt;/code&gt;という親ドキュメントと&lt;code&gt;comment&lt;/code&gt;という子ドキュメントを持っているとします。
この時、&amp;ldquo;full text search&amp;quot;というコメントを持ったブログ記事を検索したいとします。&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-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;GET&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/my_index/blog/_search&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:#f92672&#34;&gt;&amp;#34;query&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:#f92672&#34;&gt;&amp;#34;has_child&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;:       &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;comment&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:#f92672&#34;&gt;&amp;#34;score_mode&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;sum&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:#f92672&#34;&gt;&amp;#34;query&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:#f92672&#34;&gt;&amp;#34;match&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:#f92672&#34;&gt;&amp;#34;body&amp;#34;&lt;/span&gt;:   &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;full text search&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;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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記のリクエストは、親の&lt;code&gt;blog&lt;/code&gt;ドキュメントを返します。
しかし、どのコメントが関係しているのかはわかりません。
関連しているコメントを検索して親ごとにグルーピングするために、
少し手間のかかる2回目のクエリを実行する必要があります。&lt;/p&gt;
&lt;p&gt;Inner hitsがこれを変えてくれます。
&lt;code&gt;inner_hits&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-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;GET&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/my_index/blog/_search&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:#f92672&#34;&gt;&amp;#34;query&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:#f92672&#34;&gt;&amp;#34;has_child&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;:       &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;comment&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:#f92672&#34;&gt;&amp;#34;score_mode&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;sum&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:#f92672&#34;&gt;&amp;#34;query&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:#f92672&#34;&gt;&amp;#34;match&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:#f92672&#34;&gt;&amp;#34;body&amp;#34;&lt;/span&gt;:   &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;full text search&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;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;&amp;#34;inner_hits&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;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;検索結果の各&lt;code&gt;blog&lt;/code&gt;記事に、&lt;code&gt;inner_hits&lt;/code&gt;という項目があり、そこに検索にヒットしたコメントの
上位3件（デフォルト値）が返ってきます。&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-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#e6db74&#34;&gt;&amp;#34;hits&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#f92672&#34;&gt;&amp;#34;_index&amp;#34;&lt;/span&gt;:   &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;my_index&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:#f92672&#34;&gt;&amp;#34;_type&amp;#34;&lt;/span&gt;:    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;blog&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:#f92672&#34;&gt;&amp;#34;_id&amp;#34;&lt;/span&gt;:      &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;&amp;#34;_score&amp;#34;&lt;/span&gt;:   &lt;span style=&#34;color:#ae81ff&#34;&gt;3.68&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;&amp;#34;_source&amp;#34;&lt;/span&gt;:  { &lt;span style=&#34;color:#960050;background-color:#1e0010&#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;&amp;#34;inner_hits&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:#f92672&#34;&gt;&amp;#34;comment&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:#f92672&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;16&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;&amp;#34;hits&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;_type&amp;#34;&lt;/span&gt;:    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;comment&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:#f92672&#34;&gt;&amp;#34;_id&amp;#34;&lt;/span&gt;:      &lt;span style=&#34;color:#ae81ff&#34;&gt;5&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;&amp;#34;_score&amp;#34;&lt;/span&gt;:   &lt;span style=&#34;color:#ae81ff&#34;&gt;2.79&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;&amp;#34;_source&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:#f92672&#34;&gt;&amp;#34;body&amp;#34;&lt;/span&gt;:   &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Full text search is the bomb&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;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:#960050;background-color:#1e0010&#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:#960050;background-color:#1e0010&#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&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:#960050;background-color:#1e0010&#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;inner_hits&lt;/code&gt;部分は、第2の検索リクエストに似ています。
&lt;code&gt;size&lt;/code&gt;や&lt;code&gt;from&lt;/code&gt;パラメータを含めるくことで、挙動をカスタマイズできます。
また、検索から想像するであろう、ページネーション、ソート、ハイライト、&lt;code&gt;_source&lt;/code&gt;フィルタリングなどといった機能もサポートします。&lt;/p&gt;
&lt;p&gt;Inner hitsはparent-childおよび、&lt;code&gt;nested&lt;/code&gt;ドキュメントをサポートします。
この機能は、現時点では&lt;code&gt;experimental&lt;/code&gt;ラベルが付与されています。
このラベルは、この機能が将来変更されたり、削除されたりする可能性があるかもしれないことを意味します。
詳細については、&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/1.5/search-request-inner-hits.html&#34;&gt;Inner Hits documentation&lt;/a&gt;をごらんください。&lt;/p&gt;
&lt;h3 id=&#34;shadow-replicas&#34;&gt;Shadow replicas&lt;/h3&gt;
&lt;p&gt;Elasticsearchはそれ自身の冗長性に常に気をつけています。
それは、レプリカシャード（各プライマリシャードの冗長なコピー）を持っています。
これは、プライマリシャードを失った時に、データをロスしないようにするためのものです。
レプリカシャードはまた、検索のスループットをスケールアウトするためにも利用できます。
多くのレプリカ（ノードを伴うことで。）はスループットを増加させます。&lt;/p&gt;
&lt;p&gt;しかし、ユーザによってはElsticsearchを分散ファイルシステム上でホスティングしており、すでに、
ファイルシステムがレプリケーションと冗長性を担当しています。
ファイルシステムが同じことしているので、各シャードのコピーを複数持つことはあまり意味がありません。&lt;/p&gt;
&lt;p&gt;Shadowレプリカはノードを追加することによる検索スループットをスケールアウトすることが、
余分なストレージやインデキシングのコストを払うことなく、可能になります。
代わりに、各シャドーレプリカはプライマリシャードを持っている共有ファイルシステムにread-onlyでアクセスします。
Shadowレプリカは定期的にファイルシステムのビューをリフレッシュし、プライマリシャードのどんな変更も検知するでしょう。&lt;/p&gt;
&lt;p&gt;プライマリシャードが失敗したら、Shadowレプリカがプライマリに昇格し、
失敗したプライマリによって書き込まれたトランザクションログを読み込みリプレイできます。&lt;/p&gt;
&lt;p&gt;この機能は&lt;em&gt;experimental&lt;/em&gt;マークが付いています。詳細については&lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/1.5/indices-shadow-replicas.html&#34;&gt;Shadow Replicas documentation&lt;/a&gt;をごらんください。&lt;/p&gt;
&lt;h3 id=&#34;resiliency-improvements&#34;&gt;Resiliency improvements&lt;/h3&gt;
&lt;p&gt;Elasticsearch 1.1 から 1.3では、インデックスのすべてのファイルのチェックサムを追加し、
それらのファイルが壊れているかどうかをチェックするために利用することにフォーカスしました。
1.4では、Zen discoveryと分散モデルについて大きな改良を加えました。&lt;/p&gt;
&lt;p&gt;これらの変更にともなう、より詳細な統計情報やより詳細なロギングがElasticsearchやLuceneの以前のバージョンに存在した
未知の問題を明るみに出しました。
Elasticsearch 1.5.0では、これらの問題の多くに対処しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ElasticsearchとLuceneの以前のバージョンにあるバグがインデックスの故障を引き起こしていました。&lt;br&gt;
チェックサムコードのおかげで、これらを発見できました。現在は、Elasticsearchの起動時に自動的にLucene3.x&lt;br&gt;
(Elasticsearch 0.20.x以前)が作成したセグメントを検知して、シャードをオープンする前に、新しいフォーマットを使って、
新しいコミットポイントを書き出します。(&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/9899&#34;&gt;#9899&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1.3.xもしくは以前のバージョンからローリングアップグレードは、ローカルのシャードデータを再利用しようとせずに、&lt;br&gt;
シャード全体をコピーしようとします。1.3.2と以前のバージョンが実行されているノードからローリングアップグレードすることは
圧縮をオフにしない限りできなくなりました。(&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/9925&#34;&gt;#9925&lt;/a&gt;)&lt;br&gt;
1.3.xやそれ以前のバージョンからアップグレードする場合、ローリングアップデートする代わりにクラスタの再起動を考えたほうがいいかもしれません。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;非同期環境は予測することが難しいです。時に、最も予測していないことが起きるからです。&lt;br&gt;
シャード配置、リカバリ、削除のコードの多くが単純化され、状態変更をよりアトミックで決定的にするための変更によりリファクタリングされました。&lt;br&gt;
(&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/8720&#34;&gt;#8720&lt;/a&gt;, &lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/9799&#34;&gt;#9799&lt;/a&gt;, &lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/9784&#34;&gt;#9784&lt;/a&gt;, &lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/9801&#34;&gt;#9801&lt;/a&gt;, &lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/9083&#34;&gt;#9083&lt;/a&gt;, &lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/8579&#34;&gt;#8579&lt;/a&gt;, &lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/8436&#34;&gt;#8436&lt;/a&gt;, &lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/8092&#34;&gt;#8092&lt;/a&gt;, &lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/9902&#34;&gt;#9902&lt;/a&gt;, &lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/6644&#34;&gt;#6644&lt;/a&gt;, &lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/8350&#34;&gt;#8350&lt;/a&gt;, &lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/9770&#34;&gt;#9770&lt;/a&gt;, &lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/9616&#34;&gt;#9616&lt;/a&gt;, &lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/9439&#34;&gt;#9439&lt;/a&gt;, &lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/8350&#34;&gt;#8350&lt;/a&gt;, &lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/8494&#34;&gt;#8494&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;同様に、変更はクラスタ状態の更新が常に前進するということを確実にしました。更新の受け取り順序が順不同であったり、&lt;br&gt;
マスターだったノードからの更新を受け取った場合に混乱させていました。
(&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/9632&#34;&gt;#9632&lt;/a&gt;, &lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/9541&#34;&gt;#9541&lt;/a&gt;, &lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/9503&#34;&gt;#9503&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;チェックサムとチェックサムのバリデーションの強化(&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/8723&#34;&gt;#8723&lt;/a&gt;,&lt;br&gt;
&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/8599&#34;&gt;#8599&lt;/a&gt;, &lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/8587&#34;&gt;#8587&lt;/a&gt;, &lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/8407&#34;&gt;#8407&lt;/a&gt;, &lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/8010&#34;&gt;#8010&lt;/a&gt;, &lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/8018&#34;&gt;#8018&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;disk threshold allocation deciderを速く(&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/8803&#34;&gt;#8803&lt;/a&gt;)、賢く(&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/7785&#34;&gt;#7785&lt;/a&gt;)、自動化(&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/8270&#34;&gt;#8270&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;auto-generated IDの利用時のインデキシングのスピードアップのためのに追加された最適化を除去。&lt;br&gt;
たまにドキュメントを重複して登録するため(&lt;a href=&#34;https://github.com/elastic/elasticsearch/pull/7729&#34;&gt;#7729&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;download-now&#34;&gt;Download now&lt;/h3&gt;
&lt;p&gt;ぜひ、&lt;a href=&#34;https://www.elastic.co/downloads/past-releases/elasticsearch-1-5-0&#34;&gt;Elasticsearch 1.5.0&lt;/a&gt;をダウンロードして、試してみてください。
そして、感想をTwitter(&lt;a href=&#34;https://twitter.com/elastic&#34;&gt;@elastic&lt;/a&gt;)などで教えて下さい。
また、問題がありましたら、&lt;a href=&#34;https://github.com/elastic/elasticsearch/issues&#34;&gt;GitHub issues page&lt;/a&gt;で報告をお願いします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>#elasticon に参加中</title>
      <link>https://blog.johtani.info/blog/2015/03/11/attend-elasticon/</link>
      <pubDate>Wed, 11 Mar 2015 16:46:31 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/03/11/attend-elasticon/</guid>
      <description>&lt;p&gt;サンフランシスコからこんにちは。&lt;/p&gt;
&lt;p&gt;今、私は、弊社初のユーザカンファレンス&lt;a href=&#34;http://www.elasticon.com&#34;&gt;elastic{ON}&lt;/a&gt;に
参加するために、初のアメリカ出張中です。
初のユーザカンファレンスですが、世界各国から約1300人！の登録がありました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;サンフランシスコからこんにちは。&lt;/p&gt;
&lt;p&gt;今、私は、弊社初のユーザカンファレンス&lt;a href=&#34;http://www.elasticon.com&#34;&gt;elastic{ON}&lt;/a&gt;に
参加するために、初のアメリカ出張中です。
初のユーザカンファレンスですが、世界各国から約1300人！の登録がありました。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:500&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20150311/elasticon.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20150311/elasticon.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;!-- more --&gt;
&lt;p&gt;本日が初日（Welcome Receptionが昨晩開催されましたが）です。
初日のキーノートで重要な発表が2つありました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ブランド名の変更（&lt;a href=&#34;https://www.elastic.co/blog/elastic-you-know-for-more-than-search&#34;&gt;Elastic: For - You Know, More Than Search&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;Found.noの加入（&lt;a href=&#34;https://www.elastic.co/blog/welcome-found&#34;&gt;Welcome Found&lt;/a&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;です。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:500&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20150311/elastic_sticker.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20150311/elastic_sticker.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;昨日までは、elasticsearchでした。
本日からは、&lt;a href=&#34;https://elastic.co&#34;&gt;elastic&lt;/a&gt;になります。
ブランド名の変更と同時にサイト、ロゴなども変更されました。&lt;/p&gt;
&lt;p&gt;もう一つのビッグニュースがFoundの加入です。
found.noはElasticsearchをクラウドサービスとして提供している会社です。
彼らがジョインすることで、elasticsearchをより気軽に利用できるような環境ができてきます。&lt;/p&gt;
&lt;p&gt;Keynoteでの驚きのニュースこれらでした。
もちろん、このカンファレンスはそれだけには止まりません。&lt;/p&gt;
&lt;p&gt;NetflixやGitHub、Verison Mobile、WikimediaといったElasticsearch,ELKスタックのユーザの話や、
弊社の人たちによる今後のロードマップや私たちの考え方など多岐にわたる話を聞くことができます。&lt;/p&gt;
&lt;p&gt;このような機会を今後も提供できるような会社になれるよう、頑張っていきたいなと思っています。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:300&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20150311/heineken.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20150311/heineken.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;ちなみに、弊社のカンファレンスは私がこれまで経験したことのないカンファレンスになっています。
DJや各種ゲーム（ビリヤードとかパックマンとか）が楽しめるようなパーティが
懇親会として開催されたり、スポンサーブースでウェルカムレセプションが行われたりと、
面白い取り組みにあふれています。
次回開催されることがあれば、ぜひ日本の方達にも参加してもらえたらうれしいなと。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>ウエルカムFound</title>
      <link>https://blog.johtani.info/blog/2015/03/11/welcome-found-ja/</link>
      <pubDate>Wed, 11 Mar 2015 08:02:18 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/03/11/welcome-found-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/welcome-found&#34;&gt;Welcome Found&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Author : Shay Banon&lt;/p&gt;
&lt;p&gt;Elasticsearchの初期から、検索が多くの異なるユースケースを満たす
多目的のプラットフォームであることを熟知していました。
それを開始した初期の頃と、検索に関する会社を開始したころから、
私たちはそのことを実現することに投資していました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/welcome-found&#34;&gt;Welcome Found&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Author : Shay Banon&lt;/p&gt;
&lt;p&gt;Elasticsearchの初期から、検索が多くの異なるユースケースを満たす
多目的のプラットフォームであることを熟知していました。
それを開始した初期の頃と、検索に関する会社を開始したころから、
私たちはそのことを実現することに投資していました。&lt;/p&gt;
&lt;p&gt;私たちはただのElasticsearchでは止まりません。
過去の数年の間に、私たちは多くの人気のあるプログラミング言語のクラアイアンとを開発しました。
ユーザがデータを可視化し、探索することができるようにするために、
Kibanaを受け入れ開発してきました。
Lostashにより大量の時系列データを処理してElasticsearchに集中させることが
できるようになります。
Elasticsearch for Apache HadoopはHadooと多くのエコシステムを
ネイティブに統合できるようにします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>elastic-you-know-for-more-than-search-ja</title>
      <link>https://blog.johtani.info/blog/2015/03/11/elastic-you-know-for-more-than-search-ja/</link>
      <pubDate>Wed, 11 Mar 2015 04:24:34 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/03/11/elastic-you-know-for-more-than-search-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/elastic-you-know-for-more-than-search&#34;&gt;Elastic: For - You Know, More Than Search&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Elastic:For - You Know, More Than Search&lt;/p&gt;
&lt;p&gt;Author : Steven Schuurman, CEO&lt;/p&gt;
&lt;p&gt;Shay、Uri、Simonと私(Steven)がElasticsearchを2012に設立した時、
私たちは常に「検索のみ」以上のものをマーケットに提供するために設立したということおw
認識していました。
それが、このスケールの成功になったことを、夢にも思いませんでした。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;https://www.elastic.co/blog/elastic-you-know-for-more-than-search&#34;&gt;Elastic: For - You Know, More Than Search&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Elastic:For - You Know, More Than Search&lt;/p&gt;
&lt;p&gt;Author : Steven Schuurman, CEO&lt;/p&gt;
&lt;p&gt;Shay、Uri、Simonと私(Steven)がElasticsearchを2012に設立した時、
私たちは常に「検索のみ」以上のものをマーケットに提供するために設立したということおw
認識していました。
それが、このスケールの成功になったことを、夢にも思いませんでした。&lt;/p&gt;
&lt;p&gt;3年間、5つ以上のプロダクト、2000万ダウンロード、170名の従業員、
そして、17000以上のMeetupメンバーにより、将来が非常に明るく見えます。
私たちの最初のユーザカンファレンスであるElastic{ON}の
カスタマーとユーザーのラインナップを見たときに、私は謙虚な気持ちになります。
そこには、
「the Yale Department of Laboratory Medicine talking about how they use Elasticsearch to identify causes and potential cures for cancer」、「 the U.S. Geological Survey uses the ELK Stack to supplement their seismographic data with social media data in order to better assess and react to earthquakes」、「FICO will show how it uses Elasticsearch to calculate more accurate credit scores」、「NASA&amp;rsquo;s Jet Propulsion Lab taking the mainstage on Wednesday morning to tell us how Elasticsearch monitors metrics from the Mars Curiosity rover」というようなセッションがあります。&lt;/p&gt;
&lt;p&gt;Elasticsearchの私たち全員はどのように世界中の開発者が私たちの
プロダクトを利用しているかを毎日、「吹き飛ばしています」？。
現在、私たちは検索だけではありません。
データにこだわり、そこから見識を得ています。
ユーザに対して彼らのデータを検索してもらい、解析してもらい、
以前では見いだすことができなかった関係を見つけて欲しいと思っています。
また、データ量が増加するデータに対して簡単にスケールできるプロダクトを開発しました。
ユーザが以前ではできなかった、データから見識を見いだすことができるようなところに
我々のプロダクトを提供したと信じています。
それだけが、われわれによる価値があるとご存知だと思います。&lt;/p&gt;
&lt;p&gt;実際に、検索を超えた多くのユースケースに対応&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>セキュリティ向けプラグインShieldのリリース（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2015/02/27/you-know-for-security-shield-goes-ga-ja/</link>
      <pubDate>Fri, 27 Feb 2015 18:49:56 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/02/27/you-know-for-security-shield-goes-ga-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/you-know-for-security-shield-goes-ga/&#34;&gt;you know, for security: shield goes ga&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;1/27にShield 1.0 をリリースしました。
Elasticsearch向けの私たちのセキュリティプラグインの最初のリリースです。
11月にShieldについてアナウンスしてから、Elsaticsearchのためのセキュリティの機能は、
一般的に望まれているものから始まり、具体的な考えと実行できる計画へと変遷し、それが、いま現実となりました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/you-know-for-security-shield-goes-ga/&#34;&gt;you know, for security: shield goes ga&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;1/27にShield 1.0 をリリースしました。
Elasticsearch向けの私たちのセキュリティプラグインの最初のリリースです。
11月にShieldについてアナウンスしてから、Elsaticsearchのためのセキュリティの機能は、
一般的に望まれているものから始まり、具体的な考えと実行できる計画へと変遷し、それが、いま現実となりました。&lt;/p&gt;
&lt;p&gt;十分にセキュアな環境に、Elasticsearchクラスタをセキュアな状態でデプロイできるようにするため、
私たちは継続的にカスタマーやユーザーからのリクエストを受け取り、統合されたソリューションになるようにしてきました。&lt;/p&gt;
&lt;p&gt;私たちは、そのようなプロダクトがどうあるべきか調査することから始め、
カスタマーとユーザが必要とするセキュリティとはどんなものかを理解するために多くの時間を費やしました。
その結果がShieldです。
Shieldは、ElasticsearchクラスタをセキュアにするElasticsearchの有償プラグインです。
私たちは、ShieldをDev、Gold、Platinumサブスクリプションの一部として、追加料金なしで提供します。&lt;/p&gt;
&lt;p&gt;最初のリリースでは、基本的な機能と基盤にフォーカスしています。
Elasticsearch自身に対しても、セキュリティに対して準備してきました。
拡張性の側面だけでなく、Elasticsearchにあるデータフローについても再考してきました。
Elasticsearchクラスタをセキュアにする場合に、具体的な価値を即座に届けるだけでなく、素早く拡張できるようにも開発しました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h3 id=&#34;機能&#34;&gt;機能&lt;/h3&gt;
&lt;p&gt;Shield 1.0は次の5つにフォーカスしています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;認証(Authentication)&lt;/li&gt;
&lt;li&gt;認可(Authorization)&lt;/li&gt;
&lt;li&gt;暗号化通信とノードの認可(Encrypted Communication &amp;amp; Node Authentication)&lt;/li&gt;
&lt;li&gt;IPフィルタリング&lt;/li&gt;
&lt;li&gt;監査証跡(Audit Trail)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;認証authentication&#34;&gt;認証(Authentication)&lt;/h3&gt;
&lt;p&gt;セキュリティの大部分はアイデンティティについてです（例えば、だれがこのAPIを呼び出したのか？システムに何のサービスが接続するか？など）
サービスのライフタイムのある時点で、サブジェクト（例えばユーザー）を現在実行中のサブプロセスなどに結びつけることです。
この関係性を持つためには、サブプロセスを実行する前にユーザの身元を確認するように命じます。
ユーザの身元の確認のプロセスをAuthenticationと呼び、ElasticsearchのすべてのAPIコールでそれが実行されます。&lt;/p&gt;
&lt;p&gt;認証の手法は多くの異なるものがあります。
それぞれの手法は、ユーザが認証されたという資格（Authentication Token）を、それぞれのタイプで提供するようにユーザに要求します。
Shield 1.0ではシンプルに、必要なauthentication tokenをユーザ/パスワードペアとしています。
（これは、Shieldの認証基盤が簡単に拡張でき、将来は異なるauthentication tokenもサポートできることを意味します。）&lt;/p&gt;
&lt;p&gt;ユーザの資格を受け取ることだけでは不十分で、次に、それらをチェックする必要があります。
Shieldでは、これはレルムの責務です。
レルムは認証プロバイダ/サービスとしてみることができます。
妥当なユーザであると判断/解決されたか、
authentication tokenが適切な資格を持っていない/単に知らないユーザであるということで、拒否されたかです。
Shieldの認証メカニズムでは、複数のレルムを設定でき、さらに、あるレルムの戻り値を扱う他のレルム、というようなchainとすることもできます。
Shield 1.0は3つのレルムをサポートします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;esusers - Elasticsearchによって管理されるファイルベースのレルムです。
これは、ファイルにユーザを定義することができます。（Apacheサーバのhtpasswdファイルのようなもの）
このレルムは外部への依存はなく、Shieldをインストールすれば、デフォルトで使用できます。
このレルムは配置が簡単で、マルチテナントなElasticsearchクラスタに対して使用できます。
マルチテナントなElasticsearchクラスタとは、クラスタを複数のアプリでシェアすることをテナントと言います。
また、すべてのユーザがパスワードを忘れてしまうような&amp;quot;emergency&amp;quot;な代替レルムも対応可能です。
(誰もシステムに入れないような状況のことです)&lt;/li&gt;
&lt;li&gt;LDAP - 外部のLDAPサーバでユーザを認証するレルムです。
このレルムは組織のLDAPサーバで管理/保存されているユーザをすでに持っている組織を対象としています。&lt;/li&gt;
&lt;li&gt;Active Directory - LDAPのタイプの1つで、Active Directoryに対する設定になります。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;レルムはelasticsearch.yml設定ファイルで、次のように設定可能です。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;shield.authc
realms:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    esuser:
        type: esusers
        order: 0

    ldap:
        type: ldap
        order: 1
        url: ldaps://url/to/ldap1/server

    ldap_fallback:
        type: ldap
        order: 2
        url: ldaps://url/to/ldap2/server
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;上記のようにrealmsが一つのチェインとして参照されます。
レルムごとに、設定された順序で、それらは参照されます。&lt;/p&gt;
&lt;p&gt;NOTE : Shieldには、esusersファイルに保存されたユーザを管理するためのコマンドラインツールもあります。&lt;/p&gt;
&lt;h2 id=&#34;認可authorization&#34;&gt;認可(authorization)&lt;/h2&gt;
&lt;p&gt;認可(Authorization)は保護されたリソースにアクセスするユーザを許可するか拒否するかということです。
モダンなシステムは、ユーザのパーミッションのために、ロールベースのアクセスコントロール（RBAC）モデルを利用します。
このモデルでは、各ユーザはロールの集合に関連していて、それぞれのロールには、パーミッションの集合が定義されています。
これは、洗練された設定で、パーミッションを機能的なグループで共有させることができます。
例えば、次のようなロールを定義したとします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;employee&lt;/em&gt; - すべての従業員は部門をまたいだ会社のデータへアクセスできます（例えば、コンタクトやディレクトリ情報など）&lt;/li&gt;
&lt;li&gt;&lt;em&gt;sales&lt;/em&gt; - すべての営業職は営業データにアクセスできる（例えば、流通ルート、ルート、顧客）&lt;/li&gt;
&lt;li&gt;&lt;em&gt;finace&lt;/em&gt; - すべての財務の従業員は財務データにアクセスできる（例えば、予算、経費、伝票）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;財務部門の&lt;code&gt;Ann&lt;/code&gt;は従業員と財務のロールを持っており、会社のディレクトリと財務データにアクセスでできます。&lt;/p&gt;
&lt;p&gt;認可プロセスはユーザがリクエストに関連したユーザが必要で、このプロセスのために、認証フェーズの後に直接実行されます。&lt;/p&gt;
&lt;p&gt;Shieldは2つのタイプのリソースを定義します。クラスタとインデックスです。
これらは、すべてのAPIコールで保護されます。
さらに、それらに関連したパーミッションとロールも定義できます。
一度定義をすると、ロールはユーザもしくはLDAP/ADのグループに関係します。
ロールは&lt;strong&gt;roles.yml&lt;/strong&gt;設定ファイルで定義されます。
設定のサンプルは次のようになります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;admin:
    cluster: all
    indices:
        &amp;#39;*&amp;#39; : all

monitor:
    cluster: monitor
    indices:
        &amp;#39;*&amp;#39;: monitor

employee:
    indices:
        &amp;#39;company_directory&amp;#39; : read

sales:
    indices:
        &amp;#39;opportunities&amp;#39; : read, write
        &amp;#39;accounts&amp;#39; : read, write

finance:
    indices:
        &amp;#39;expenses&amp;#39; : read, write
        &amp;#39;purchases&amp;#39; : read, write
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;上記のサンプルで、次の5つのロールを定義しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;admin&lt;/em&gt; - 管理者のロールで、すべてのクラスターレベルの操作とすべてのインデックスに対してすべてのインデックスレベルの操作を実行可能です。
(¥*インデックスはすべてのインデックスにマッチするワイルドカード)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;monitor&lt;/em&gt; - システム/クラスタのモニタリングのためのロール。このロールのユーザはすべてのクラスタとインデックスレベルの情報の読み取りの
APIにアクセス可能だが、インデックスのデータへの読み書きや設定の更新は不能&lt;/li&gt;
&lt;li&gt;&lt;em&gt;employee&lt;/em&gt; - compnay_directoryにあるすべてのデータへの読み取りアクセスを与えられたロール。このロールはクラスタレベルへのアクセスやデータの書き込みアクセスは持っていない
(特にcompany。洗濯されたグループの人々はcompanyディレクトリの更新は可能だが、employeeは読み取りのみが可能)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;sales&lt;/em&gt; - opportunitiesとaccountsインデックスの読み書きができるロール&lt;/li&gt;
&lt;li&gt;&lt;em&gt;finance&lt;/em&gt; - expensesとpurchasesの両方に読み書きができるロール&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上記のサンプルで定義されている&lt;code&gt;all&lt;/code&gt;と&lt;code&gt;read&lt;/code&gt;と&lt;code&gt;write&lt;/code&gt;として名前がつけられた権限です。
これらは、予約語で、Elasticsearchのローレベルのアクションを複数含んだ権限です。
（&lt;code&gt;write&lt;/code&gt;は&lt;code&gt;index, delete, delete_by_query, bulk, update&lt;/code&gt;の操作を含んでいます。）
多くのケースで、これらのハイレベルの名前が付けられた権限で十分ですが、特定のロールに特定のアクションを明示的に指定することもできます。
次のようになります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;hr:
    indices:
        &amp;#39;company_directory&amp;#39; : indices:data/write/index, indices:data/write/update
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ここまで説明した認可のレルムは、各ユーザに関連するロールを識別するためのものです。
内部のesuserレルムでは、提供されるesuserコマンドラインツールを使ってロールはユーザに割り当てたり変更したりもできます。
LDAPやActive Directoryでは、LDAP/ADグループにShieldのロールを割り当てることができます。&lt;/p&gt;
&lt;p&gt;認証と認可の両方を用いることで、ユーザリクエストに対して、ユーザごとに許可/不許可をすることができます。&lt;/p&gt;
&lt;h3 id=&#34;暗号化通信&#34;&gt;暗号化通信&lt;/h3&gt;
&lt;p&gt;認可はElasticsearchのデータを機能的な観点（許可されたユーザだけが操作を可能にする）で保護しますが、
クライアントからElasticsearchクラスタへ、もしくはクラスタのノード間では暗号化されていないデータを送るためまだ危険があります。
第三者が登頂したり、オンザフライでデータを書き換えたりといった可能性やクラスタを壊すことができます。&lt;/p&gt;
&lt;p&gt;Shield 1.0はElasticsearchのすべての通信チャネルをセキュアにすることができます。
クラスタ内のノード間のチャネルやクライアントに公開されているチャネルです。
これは、SSL/TLS通信を導入して実現します。&lt;/p&gt;
&lt;p&gt;Shieldで使えるSSLはElasticsearchのtransportサービスをSSL/TLSで通信できるものに置き換えます。
これは、ノード間通信チャネルと、HTTP transport（REST APIを提供するもの）のそれぞれに設定可能です。&lt;/p&gt;
&lt;p&gt;ShieldのSSL/TLSは、スタンダードなJavaのものとkeystoreとtruststoreを基本にしたものが利用可能です。
SSL/TLSを設定すると、各ノードのキーストアに証明書をインポートする必要があります。
CAがサインした証明書を使うことも、CAが信頼したものとして許可許諾されたものを使うことが可能です。
これは、信頼されたすべてのCAとして知られているtrust storeが必要です。
新しいノードをクラスタに追加するときに、すべての必要な少なくとも一つの信頼されたCAから発行されてサインされたものが必要になります。
クラスタで個別のノードがすべてのkeystore/truststoreを更新する必要性なしに。？？&lt;/p&gt;
&lt;p&gt;通信チャネルを安全にする方法やSSL/TLS設定をどのように行うかは&lt;a href=&#34;http://www.elasticsearch.org/guide/en/shield/current/securing-nodes.html&#34;&gt;Shieldのドキュメント&lt;/a&gt;をご覧ください。&lt;/p&gt;
&lt;h3 id=&#34;ノード間認証&#34;&gt;ノード間認証&lt;/h3&gt;
&lt;p&gt;強く推奨しますが、許可されたノードだけがクラスタに接続できるようにするために、ノードの認証をSSL transportに設定することができます。
これは、&lt;code&gt;shield.transport.client.auth&lt;/code&gt;に&lt;code&gt;true&lt;/code&gt;を設定することで可能です。
設定した場合、ノード間でSSLハンドシェイクが行われ、接続されたノードが接続に来たノードのクライアント認証を要求しチェックします。
もし、チェックに失敗した場合は、SSLシェイクハンドが失敗し接続が拒否されます。&lt;/p&gt;
&lt;h3 id=&#34;sslクライアント認証&#34;&gt;SSLクライアント認証&lt;/h3&gt;
&lt;p&gt;transportレベルでノード認証が必要なようなら、次のような疑問がわくでしょう。
Elasticsearchはクラスタに接続するTransportクライアントを使うときはどのように振る舞うのか？
Transportクライアントはクラスタの他のノードと同じチャネルを使うため、コネクションを確立するときに、ノードが他のノードと異なるかどうかを見極めることはできません。&lt;/p&gt;
&lt;p&gt;この時、もっとも単純な解決は、Transportクライアントも同様に許可を与えることです。
それは、認証を解決するときに、他の問題（潜在的な悪意）を引き起こします。
Transportクライアントが他のクラスタのノードを偽装しようとすることです。これは望んでいません。&lt;/p&gt;
&lt;p&gt;幸いなことに、良い解決方法があります。
トランスポートプロファイルです。
Elasticsearch 1.4で導入されたトランスポートプロファイルは、トランスポートレイヤー（異なるホスト/ポートにバインドされる）のために複数のネットワークチャネルを設定することができます。
Shieldはこのサポートを、プロファイルごとに異なるSSL設定をできるように拡張します。
また、ノードのタイプとクライアントプロファイルタイプの間に明確な違いを設定することも可能です。
これを用いると、2つのプロファイルを設定できるようになります。
ひとつは、クライアントのためのもので、もうひとつはクラスタのノードのためのものです。
これにより、クライアントのための認証の問題が必要なくなり、Shieldはクライアントプロファイルをもった限定されたクライアントからのリクエストを保証します。&lt;/p&gt;
&lt;h3 id=&#34;ipフィルタリング&#34;&gt;IPフィルタリング&lt;/h3&gt;
&lt;p&gt;これは、厳密には、認証カテゴリではありませんが関係しています。
Shieldはそれ自身がIPフィルタリングのメカニズムを持っています。
これは、許可/不許可のIPのリストを設定することができます。
これらのフィルタリングのルールは複数のレベルで設定可能です。
transportチャネル、transportプロファイルレベル、そして、HTTPチャネルです。
次の設定は、それらの設定のサンプルです。（設定ファイルはelasticsearch.ymlになります）&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;shield:

    transport.filter:
        allow:
            - &amp;#39;127.0.0.1&amp;#39;
            - &amp;#39;2001:0db8:1234:0000:0000:8a2e:0370:73
        deny:
            - &amp;#39;10.0.0.0/8&amp;#39;
            - &amp;#39;2001:0db8:1234::/48&amp;#39;
            - &amp;#39;*.google.com&amp;#39;

    http.filter:
        allow: [ &amp;#39;10.0.0.0/8&amp;#39; ]
        deny: [ &amp;#39;127.0.0.1&amp;#39; ]

transport.profiles:
    client:
        shield.filter.deny: [ &amp;#39;_all&amp;#39; ]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;このように、IPv4とIPv6、CIDR、ホスト名、ワイルドカードが利用できます。
また、この機能はホストOSのIPテーブルに設定することで追加できるが、Shieldにそれを保持し、それらの設定を単純化し、
デプロイの全体から除去できることにも注意してください（詳細は&lt;a href=&#34;http://www.elasticsearch.org/guide/en/shield/current/ip-filtering.html&#34;&gt;ドキュメントのIPフィルタリングをご覧ください&lt;/a&gt;）。&lt;/p&gt;
&lt;h3 id=&#34;監査証跡audit-trail&#34;&gt;監査証跡（Audit Trail）&lt;/h3&gt;
&lt;p&gt;セキュアなシステムの必須機能の一つで、監査硝石により、Elasticsearchに発生した重要なイベントをトラッキングすることが可能です。
これらのイベントを保存することは、Elasticsearchクラスタの重要なアクティビティの証拠を提供でき、
不審な/悪意のある可能性のあるイベントを追跡するときの診断ツールにもなります。&lt;/p&gt;
&lt;p&gt;Shield 1.0.0で、監査証跡は監査/アクセスlogを一般的なElasticsearchのログとは個別に保存します。
それらは、構造化されているため、読んだりパースするのが容易で、イベントのタイプも分類されています。
また、情報のレベルを設定することができ、各イベントをlogレベルの設定で書き出すことができます。
以下が、イベントのリストです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;anonymous_access_denied&lt;/em&gt; - 認証トークンがないユーザからのリクエストがあった時のログ&lt;/li&gt;
&lt;li&gt;&lt;em&gt;authentication_failed&lt;/em&gt; - リクエストされたユーザの認証に失敗した時のログ&lt;/li&gt;
&lt;li&gt;&lt;em&gt;access_denied&lt;/em&gt; - 認証されたユーザが許可されていない操作を実行した時のログ&lt;/li&gt;
&lt;li&gt;&lt;em&gt;access_granted&lt;/em&gt; - 認証されたユーザが許可された操作を実行した時のログ&lt;/li&gt;
&lt;li&gt;&lt;em&gt;tampered_request&lt;/em&gt; - 不正に書き換えられたリクエストが到着したのを検知した時のログ&lt;/li&gt;
&lt;li&gt;&lt;em&gt;connection_granted&lt;/em&gt; - ノードもしくはtransportクライアントがIPフィルタのルールにパスした時のログ&lt;/li&gt;
&lt;li&gt;&lt;em&gt;connection_denied&lt;/em&gt; - ノードもしくはtransportクライアントがIPフィルタリングルールの制限により却下された時のログ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Shieldの監査証跡についてより詳しく知りたい方は、&lt;a href=&#34;http://www.elasticsearch.org/guide/en/shield/current/auditing.html&#34;&gt;ドキュメント&lt;/a&gt;をごらんください。&lt;/p&gt;
&lt;h3 id=&#34;次のバージョンでは&#34;&gt;次のバージョンでは？&lt;/h3&gt;
&lt;p&gt;ここまで紹介したように、これはまだ始まりにすぎません。
Shieldに追加される多くの機能があり、しっかりとした基盤を構築したところです。
Shieldの次のバージョンでは、以下の機能の追加にフォーカスするでしょう。（これらだけに限ったわけではありません。）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;APIによる設定、管理&lt;/li&gt;
&lt;li&gt;より拡張され、柔軟なLDAP/Active Directoryサポート&lt;/li&gt;
&lt;li&gt;レルムタイプの追加（kerberos、anonymous、certificatesなどなど）&lt;/li&gt;
&lt;li&gt;セッションベースの認証&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ShieldはElasticsearch社の2番目の（&lt;a href=&#34;http://www.elasticsearch.com/products/marvel?_ga=1.40546982.567962035.1389706748&#34;&gt;Marvel&lt;/a&gt;に続く）商用プロダクトです。
ダウンロードして開発環境で評価してください。
インストールは他のプラグインと同様の方法です（インストール方法についての詳細は&lt;a href=&#34;http://www.elasticsearch.org/guide/en/shield/current/index.html&#34;&gt;こちら&lt;/a&gt;）。
一度インストールすると、30日の試用ライセンスが始まります。
もし、さらに時間が必要な場合は、sales@elasticsearch.comまで連絡してください。&lt;/p&gt;
&lt;p&gt;私たちのすべてのプロダクトについてフィードバックをお待ちしています。
Shieldの商用利用、機能、ロードマップ、その他のセキュリティに関するトピックなど、質問がありましたら、
&lt;a href=&#34;http://www.elasticsearch.com/contact/?_ga=1.32250170.567962035.1389706748&#34;&gt;サイトからご連絡ください&lt;/a&gt;。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch Coreトレーニング開催</title>
      <link>https://blog.johtani.info/blog/2015/02/27/2nd-tokyo-training/</link>
      <pubDate>Fri, 27 Feb 2015 17:10:29 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/02/27/2nd-tokyo-training/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://purchases.elasticsearch.com/class/Tokyo/2015-04-13&#34;&gt;4月13日から3日間、ElasticsearchのCoreトレーニング&lt;/a&gt;が東京で開催されます。
Early Birdということで、3/14までに申し込みすると割引があります。
興味のある方は、見ていただければと。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;また、4/15にElasticsearch勉強会を開催します。
トレーニングに弊社のエンジニアが来日しますので、なにか話をしてもらう予定です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://purchases.elasticsearch.com/class/Tokyo/2015-04-13&#34;&gt;4月13日から3日間、ElasticsearchのCoreトレーニング&lt;/a&gt;が東京で開催されます。
Early Birdということで、3/14までに申し込みすると割引があります。
興味のある方は、見ていただければと。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;また、4/15にElasticsearch勉強会を開催します。
トレーニングに弊社のエンジニアが来日しますので、なにか話をしてもらう予定です。&lt;/p&gt;
&lt;p&gt;募集は後日、&lt;a href=&#34;https://elasticsearch.doorkeeper.jp&#34;&gt;Elasticsearch勉強会&lt;/a&gt;のDoorkeeperで行います。
興味のある方は、登録しておいていただければと。&lt;/p&gt;
&lt;p&gt;トレーニングや勉強会でお待ちしております。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Kibana 4（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2015/02/20/kibana-4-literally-ja/</link>
      <pubDate>Fri, 20 Feb 2015 14:05:52 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/02/20/kibana-4-literally-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/kibana-4-literally/&#34;&gt;kibana 4. literally.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Kibana 4は現在、文字通り、抽象的に、概念的に、精神的に、そしてとても楽しく、プロダクションレディになりました。
1週間前に準備はできていましたが、満足できるものであるという確信を得たいと思っていました。
そして、Kibana 4.0.0 GAをリリースしました。
次のものはサンプルのスクリーンショットと前日譚です。
これらに興奮してしまった方のために、2ステップのプランを用意しました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/kibana-4-literally/&#34;&gt;kibana 4. literally.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Kibana 4は現在、文字通り、抽象的に、概念的に、精神的に、そしてとても楽しく、プロダクションレディになりました。
1週間前に準備はできていましたが、満足できるものであるという確信を得たいと思っていました。
そして、Kibana 4.0.0 GAをリリースしました。
次のものはサンプルのスクリーンショットと前日譚です。
これらに興奮してしまった方のために、2ステップのプランを用意しました。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ダウンロードする：&lt;a href=&#34;http://www.elasticsearch.org/overview/kibana/installation/&#34;&gt;Kibana 4 downloads&lt;/a&gt;ページからダウンロードします。&lt;/li&gt;
&lt;li&gt;理解する：&lt;a href=&#34;http://www.elasticsearch.org/guide/en/kibana/current/index.html&#34;&gt;Kibana 4 docs&lt;/a&gt;ページを読んで理解します。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tip : もし、まだ、あなたのクラスタが&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-4-4/&#34;&gt;Elasticsearch 1.4.4&lt;/a&gt;でない場合は、アップグレードする必要があります。&lt;br&gt;
Tip2 : Kibana 4 RC1からアップグレードする場合は、configを移行する必要があります。&lt;a href=&#34;https://gist.github.com/spalger/8daf6c2b7f2954639e38&#34;&gt;こちらのgistを参照&lt;/a&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;前日譚---the-back-story&#34;&gt;前日譚 - the back story&lt;/h2&gt;
&lt;p&gt;Kibanaはすでに問題解決のためのツールになっています。
なぜ、毎晩2時に呼び出されるんでしょう？
そのコードがプロダクションに入ったのはいつですか？
その結果、何を壊しました？
私たちはそれらを解決しました。
世界的に、長い間、だれも夜中の2時に呼び出されませんでした。知ってます？。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://www.elastic.co/assets/blt5dddb0351d09a397/Screen-Shot-2015-02-17-at-1.25.15-PM-1024x692.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.elastic.co/assets/blt5dddb0351d09a397/Screen-Shot-2015-02-17-at-1.25.15-PM-1024x692.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;*しかし、ここには落とし穴があります。*答えが簡単になれば、問題が難しくなります。
楽な勝利は簡単でした。では、難しい問題（深さが3層の問題）を解きましょう。
複数の要素、複数のフィールドそして、複数のデータソースを分析する必要がある問題を解きましょう。
Kibana 4は少ない時間と労力で最も難しい問題を解決してくれます。&lt;/p&gt;
&lt;p&gt;Kibana 3で学んだことをKibana 4に取り込みました。
なぜ10億のデータを持っているのに、地図には1000個しかプロットできないのでしょう？
1つのチャートに1つのフィールドなんでしょう？
なぜ、1つのパネルに1つのチャートなんでしょう？
なぜ、1つのダッシュボードに1つのインデックスなんでしょう？
5つのシナリオを用意し、2つのフィールドにまたがったデータを比較し、
1つのダッシュボードに3つのインデックスのデータを表示してみましょう。
さぁ、やりましょう。終わったらアイスクリーム（トッピング付きの）を取りに行きましょう。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://www.elastic.co/assets/blte1c56cdf8c51674d/Screen-Shot-2015-02-17-at-1.24.14-PM-1024x624.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.elastic.co/assets/blte1c56cdf8c51674d/Screen-Shot-2015-02-17-at-1.24.14-PM-1024x624.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h2 id=&#34;the-plot&#34;&gt;the plot&lt;/h2&gt;
&lt;p&gt;アイスクリームのように、問題には多くの種類があります。
そのために、Kibanaをナポリ風アイスクリーム（3色アイス）のように分割しました。
嫌いな種類は除いて。
もし、あなたがKibanaのユーザ歴が長い場合、最初のタブの&lt;em&gt;Discover&lt;/em&gt;がホームであることが正しく感じるでしょう。
これにより、短時間で、検索し、レコードを見つけ、簡単な問題を解決できます。
簡単な問題とは、すべてを物語る1行のデータを見つけることによって解決する問題です。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://www.elastic.co/assets/blta5b9c4d326d1bab7/Screen-Shot-2015-02-17-at-1.55.18-PM1-1024x573.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.elastic.co/assets/blta5b9c4d326d1bab7/Screen-Shot-2015-02-17-at-1.55.18-PM1-1024x573.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;物事が簡単な検索で説明できるものよりも複雑になった時、チャートとグラフで魔法を作る時間です。
&lt;em&gt;Visualize&lt;/em&gt;タブを開き、Elasticsearchのaggregationの力を利用してデータを解析しましょう。
&lt;em&gt;Visualize&lt;/em&gt;は複数の次元の性質のデータを見せ、今まで尋ねたことがないような質問に対して素早く回答するチャートやテーブル、
地図を作成できます。
あなたが最初に尋ねる質問は「先週サイトが遅かったのはなぜ？」でした。
しかし、データによって明らかにされた質問は「なぜ、クリスマスに東京からの平均ファイルサイズリクエストがスパイクしたのか？」です。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://www.elastic.co/assets/blt8458a51cb72ffdc9/Screen-Shot-2015-02-18-at-11.13.37-AM-1024x617.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.elastic.co/assets/blt8458a51cb72ffdc9/Screen-Shot-2015-02-18-at-11.13.37-AM-1024x617.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;最後に、&lt;em&gt;Dashboard&lt;/em&gt;でこれらを1つにします。&lt;/p&gt;
&lt;p&gt;大きなスクリーンに配置して、こう言います。
「あなたの答えはこのリンクにあります。また、Wikiに埋め込んで、データをCSVにエクスポートしてメールしました。
アイスクリームを食べた後に、自叙伝の第1章を書きました。もっとアイスを持ってきてください。かき混ぜますから。」&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://www.elastic.co/assets/blte214158911741112/Screen-Shot-2015-02-17-at-3.30.30-PM-1024x715.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.elastic.co/assets/blte214158911741112/Screen-Shot-2015-02-17-at-3.30.30-PM-1024x715.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;それぞれのタブで見てきた詳細については、&lt;a href=&#34;http://www.elasticsearch.org/blog/kibana-4-beta-1-released/&#34;&gt;Kibana 4 Beta 1 : Released&lt;/a&gt;をごらんください。&lt;/p&gt;
&lt;h2 id=&#34;to-be-continued&#34;&gt;to be continued&amp;hellip;&lt;/h2&gt;
&lt;p&gt;居眠りをする時間はあります？いいえ、Kibana 4.1についてすでに作業中で、将来の大きなプランを持っています。
多くの労力はKibana 4の土台の安定と実用性を構築することに使われました。
また、Elasticsearchアプリケーションの将来を構築するプラットフォームを作りました。
すべてのものは拡張できるように設計されています。
例えば、可視化はより良くなるように構築されています。
オープンソースは私たちのGitHubアカウント以上のものです。
それは、新しく素晴らしいものを誰もが作ることができる構造を作ることが私たちの約束です。&lt;/p&gt;
&lt;p&gt;Kibanaでグラフなどを構築したり、Elasticsearchを利用したアプリケーションを作成するために、
私たち開発者のブログを参考にしてください。
ちょっと見てみたいですか？
Elastic{ON}15のSpencer Algerのトークをチェックしてください。&lt;/p&gt;
&lt;p&gt;あなた方なしでは、私たちはここにはいないですし、あなた方の助けがなければ何もできません。
ぜひ、GitHubでのissueや提案、貢献をお待ちしています。
もしくは、IRCでFreenodeの#kibanaに参加してください。&lt;/p&gt;
&lt;h2 id=&#34;extra-credit&#34;&gt;extra credit&lt;/h2&gt;
&lt;p&gt;Kibana 4のすべての話に興味がありますか？私たちのKibana 4ベータに関する過去のブログをチェックしてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.elasticsearch.org/blog/kibana-4-beta-1-released/&#34;&gt;Kibana 4 Beta 1: Released&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.elasticsearch.org/blog/kibana-4-beta-2-get-now/&#34;&gt;Kibana 4 Beta 2: Get it now&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.elasticsearch.org/blog/kibana-4-beta-3-now-more-filtery/&#34;&gt;Kibana 4 Beta 3: Now more filtery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.elasticsearch.org/blog/kibana-4-rc1-is-now-available/&#34;&gt;Kibana 4 RC1: Freshly baked&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最後に、Kibanaの利用に関する話をお持ちなら、ぜひ聞かせてください。
stories at elasticsearch dot comもしくは&lt;a href=&#34;http://www.twitter.com/elasticsearch&#34;&gt;@elasticsearch&lt;/a&gt;に連絡をください。
あなたの話を世界にどのようにシェアしているかごらんください。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch 1.4.4および1.3.9リリース（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2015/02/20/elasticsearch-1-4-4-and-1-3-9-released-ja/</link>
      <pubDate>Fri, 20 Feb 2015 14:05:34 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/02/20/elasticsearch-1-4-4-and-1-3-9-released-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-4-and-1-3-9-released/&#34;&gt;elasticsearch 1.4.4 and 1.3.9 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日（2/20）、&lt;strong&gt;Elasticsearch 1.4.4&lt;/strong&gt;と&lt;strong&gt;Elasticsearch 1.3.9&lt;/strong&gt;をリリースしました。
これはバグフィックスリリースとなります。
主に、Lucene expression scriptsを使う場合のRPMとDEBパッケージの
パッケージング問題のフィックスをしたものです。
&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-4-4&#34;&gt;1.4.4のダウンロードこちらのリンク&lt;/a&gt;からアクセスできます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-4-and-1-3-9-released/&#34;&gt;elasticsearch 1.4.4 and 1.3.9 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日（2/20）、&lt;strong&gt;Elasticsearch 1.4.4&lt;/strong&gt;と&lt;strong&gt;Elasticsearch 1.3.9&lt;/strong&gt;をリリースしました。
これはバグフィックスリリースとなります。
主に、Lucene expression scriptsを使う場合のRPMとDEBパッケージの
パッケージング問題のフィックスをしたものです。
&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-4-4&#34;&gt;1.4.4のダウンロードこちらのリンク&lt;/a&gt;からアクセスできます。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;fixes&#34;&gt;fixes&lt;/h2&gt;
&lt;p&gt;1.4.3のRPMおよびDEBパッケージにはAntlrとASMの&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/pull/9696&#34;&gt;依存関係の不足&lt;/a&gt;がありました。
この依存はElasticsearchでLucene expression scriptsを利用する場合に必要になります。
Groovyに関する&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-3-and-1-3-8-released/&#34;&gt;1.4.3の変更&lt;/a&gt;により、多くのユーザがLucene explression scriptsを利用することが予想されるため、すぐに、1.4.4をリリースしました。&lt;/p&gt;
&lt;p&gt;また、このリリースには、クラスタの保留タスクに関するいくつかのバグフィックスも含まれています。
さらに、date histogramで負のインターバルの場合に&lt;code&gt;OutOfMemoryError&lt;/code&gt;を引き起こすバグも
修正されています。&lt;/p&gt;
&lt;p&gt;すべての変更については&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-4-4&#34;&gt;1.4.4のリリースノート&lt;/a&gt;および&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-3-9&#34;&gt;1.3.9のリリースノート&lt;/a&gt;をごらんください。&lt;/p&gt;
&lt;h2 id=&#34;フィードバック&#34;&gt;フィードバック&lt;/h2&gt;
&lt;p&gt;私たちはフィードバックをお待ちしています。
Twitter(&lt;a href=&#34;https://twitter.com/elasticsearch&#34;&gt;@elasticsearch&lt;/a&gt;)もしくは&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues&#34;&gt;GitHub issues page&lt;/a&gt;で教えてください。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>名古屋でElasticsearch勉強会を開催します</title>
      <link>https://blog.johtani.info/blog/2015/02/18/preparing-elasticsearch-meetup-in-nagoya/</link>
      <pubDate>Wed, 18 Feb 2015 15:22:53 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/02/18/preparing-elasticsearch-meetup-in-nagoya/</guid>
      <description>&lt;p&gt;来る、4月4日の土曜日の午後に名古屋でElasticsearch勉強会を開催予定です。
「初」の東京以外の勉強会です。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Twitterでこのようなツイートを見かけまして。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;来る、4月4日の土曜日の午後に名古屋でElasticsearch勉強会を開催予定です。
「初」の東京以外の勉強会です。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Twitterでこのようなツイートを見かけまして。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; lang=&#34;ja&#34;&gt;&lt;p&gt;名古屋でElasticsearchの勉強会やりたい機運（今のところ2人）。&lt;/p&gt;&amp;mdash; mogami (@smogami) &lt;a href=&#34;https://twitter.com/smogami/status/562864387632136192&#34;&gt;2015, 2月 4&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;//platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;これは！ということで、名古屋で勉強会をやろうかと思います。30名程度の場所を借りて実施予定です。
募集はいつもの、&lt;a href=&#34;http://elasticsearch.doorkeeper.jp&#34;&gt;elasticsearch勉強会のDoorkeeper&lt;/a&gt;で行う予定です。
ページの準備まで少々待ちください。（おそらく、3月中旬くらい）
私自身はElasticsearchやELKについて話をしようと思っています。そのほかに、2,3名のスピーカーの方を予定しています。
LTなど興味がある人がいたら、連絡ください。&lt;/p&gt;
&lt;p&gt;これを機に（？）他の場所でも勉強会を開催したいと考えています。
ニーズがどのくらいありそうなのかが、まだよくわかっていませんが、関西などでニーズがあるんじゃないかと期待していたり。&lt;/p&gt;
&lt;p&gt;興味のある方は、コメント欄、Twitterなどでコンタクトしてもらえればと。
（連絡来るとうれしいなぁ。）&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第8回Elasticsearch勉強会を開催しました。#elasticsearchjp</title>
      <link>https://blog.johtani.info/blog/2015/02/16/8th-elasticsearch-jp/</link>
      <pubDate>Mon, 16 Feb 2015 15:02:23 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/02/16/8th-elasticsearch-jp/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://elasticsearch.doorkeeper.jp/events/19923&#34;&gt;第8回Elsticsearch勉強会&lt;/a&gt;を開催しました。
スタッフの皆さん、スピーカーの皆さん、開場提供していただいた&lt;a href=&#34;http://recruit-tech.co.jp&#34;&gt;リクルートテクノロジーズさん&lt;/a&gt;、ありがとうございました！
次回もよろしくお願いします！参加していただき盛り上げていただいた参加者の皆さんもありがとうございました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;http://elasticsearch.doorkeeper.jp/events/19923&#34;&gt;第8回Elsticsearch勉強会&lt;/a&gt;を開催しました。
スタッフの皆さん、スピーカーの皆さん、開場提供していただいた&lt;a href=&#34;http://recruit-tech.co.jp&#34;&gt;リクルートテクノロジーズさん&lt;/a&gt;、ありがとうございました！
次回もよろしくお願いします！参加していただき盛り上げていただいた参加者の皆さんもありがとうございました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;今回は出足が好調で、早々に180人の枠を超えるという嬉しい事態でしたが、
キャンセル待ちが残っているにもかからわらず、来られていない方が67名もいるということで、キャンセル待ちの方には申し訳なかったです。
もうすこし、キャンセルをしてもらえると嬉しいんですが。。。
今回はメールを当日に1度しか打ってないからかなぁ。&lt;/p&gt;
&lt;p&gt;さて、いつもの通り簡単なメモです。
本当に簡単にですが。&lt;/p&gt;
&lt;h2 id=&#34;elasticsearch導入チェックリスト-elasticsearch株式会社-jun-ohtani-johtani&#34;&gt;「Elasticsearch導入チェックリスト？」 Elasticsearch株式会社 Jun Ohtani @johtani&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://speakerdeck.com/johtani/elasticsearchdao-ru-tietukurisuto&#34;&gt;Elasticsearch導入チェックリスト？&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Elasticsearchを開発環境や本番に導入する前に気にかけて欲しいことについて発表しました。
元ネタは&lt;a href=&#34;http://www.elasticsearch.org/webinars/elasticsearch-pre-flight-checklist/&#34;&gt;elasticsearch pre-flight checklist&lt;/a&gt;です。
少々古いのですが、私が今回話した内容以外にもモニタリングなどについての話も盛り込まれています。
時間がある方は、見ていただければと。&lt;/p&gt;
&lt;h2 id=&#34;elasticsearch-クエリとスキーマ定義のすごい細かい話株式会社ドワンゴ-藤堂淳也-さん&#34;&gt;「Elasticsearch クエリとスキーマ定義のすごい細かい話」株式会社ドワンゴ 藤堂淳也 さん&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://speakerdeck.com/jtodo/elasticsearch-kueritosukimading-yi-falsexi-kaihua&#34;&gt;Elasticsearch クエリとスキーマ定義のすごい細かい話&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;フィールドのチェックを別途インデキシングするアプリで行っている。利用できるものだけElasticsearchに投げる&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;h2 id=&#34;elasticsearchとkibanaで実現する30億reqdayのリアルタイム分析株式会社サイバーエージェント山田直行さんsatully&#34;&gt;「ElasticsearchとKibanaで実現する、30億req/dayのリアルタイム分析」株式会社サイバーエージェント　山田直行さん　@satully&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/Satully/elasticsearch8-elasticsearchkibana-30reqday&#34;&gt;ElasticsearchとKibanaで実現する、30億req/dayのリアルタイム分析&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;会場が21時までしか抑えられていないという失態で、ドタバタしてて前半は聞けてないです。。。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;前回の発表では30日分Elasticsearchに入れていたが、今は3日分のみ保存&lt;/li&gt;
&lt;li&gt;レポートなどにはRedshift＋Tableauを利用&lt;/li&gt;
&lt;li&gt;Kibana3をメインに使っているが、Kibana4も検討予定？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;QA&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Q：なぜ、ELBを挟んでいるのか？
&lt;ul&gt;
&lt;li&gt;A：特に考えておいているわけではない。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q：インデックスの構成は？
&lt;ul&gt;
&lt;li&gt;A：1日に2つのインデックス。Bitされたもの、入札されないもの&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q：searchのnodeをやめたのは？
&lt;ul&gt;
&lt;li&gt;A：前回発表した勉強会での懇親会で話を聞いたり、他の方と話を聞いて、不要と判断したため&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;はてなのメディア面を支えるelasticsearch株式会社はてな山家雄介さんyanbe&#34;&gt;「はてなのメディア面を支えるElasticsearch」株式会社はてな　山家雄介さん　@yanbe&lt;/h2&gt;
&lt;p&gt;スライド：未定。おそらく、開発者ブログに公開されるかと。&lt;/p&gt;
&lt;p&gt;* アドテク系にもやってるらしい。BrandSafeはてな&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;はてなブックマークのデータを魅せ方を変える機能などで大活躍。&lt;a href=&#34;http://bkuma.hatena.ne.jp&#34;&gt;B!KUMA&lt;/a&gt;とか&lt;/li&gt;
&lt;li&gt;その日の話題の見出し自動生成機能。Significant Terms Aggregationsを利用。&lt;/li&gt;
&lt;li&gt;こちらの&lt;a href=&#34;http://bookmark.hatenastaff.com/entry/2015/02/05/190331&#34;&gt;「自然言語処理技術を用いたはてなブックマークの新機能「トピック」をベータリリースしました」&lt;/a&gt;エントリに関係あるのかな？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;記事の魅せ方を検索できる管理画面ではElasticsearchのクエリDSLを活用されているとのことでした。
検索専門の人でなくても検索式を簡単にくみたてられる画面を用意して、ElasticsearchのクエリDSLに変換するようにしていると。
確かに、クエリをそのまま組み立ててもらうよりも利用しやすい画面がある方がいいですよね。バックエンドはJSとPerlのライブラリとのことでした。&lt;/p&gt;
&lt;h2 id=&#34;その他感想などのブログ&#34;&gt;その他、感想などのブログ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://takudo.hatenablog.jp/entry/2015/02/14/101749&#34;&gt;2015-02-13 第8回 elasticsearch 勉強会 @ 丸の内 リクルート 41Fアカデミーホール&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://suzuki.tdiary.net/20150213.html&#34;&gt; [Elasticsearch] 第8回 elasticsearch 勉強会へ参加してきた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://qiita.com/t-sato/items/8e353ccf7d7bba46f635&#34;&gt;第8回elasticsearch勉強会 #elasticsearch #elasticsearchjp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://keyamb.hatenablog.com/entry/2015/02/16/015916&#34;&gt;第8回 Elasticsearch 勉強会に行ってきた #elasticsearch #elasticsearchjp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.yoslab.com/entry/2015/02/13/203251&#34;&gt;勉強会メモ - 第8回elasticsearch勉強会&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;今回も検索からログまでいろんな話になったので、面白かったかと。
参加された方は新しい方が多かったんじゃないかなぁと。（集計結果で見れないのかな、Doorkeeper）。&lt;/p&gt;
&lt;p&gt;今回は、みなさんに21時に41Fから33Fへ移動していただくという大失態があったので、大変申し訳なかったです。
次回（4月中旬）は、このようなことがないように気をつけますので、今後もよろしくお願いいたします。&lt;/p&gt;
&lt;p&gt;あと、東京以外の勉強会も検討しつつあります。興味のある方はコメントやTwitterで反応をいただけると嬉しいです。&lt;/p&gt;
&lt;p&gt;スピーカーは随時募集中ですので、コメント、メール、ツイートなど、コンタクトしていただければと思います。 よろしくお願いいたします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch導入チェックリスト？</title>
      <link>https://blog.johtani.info/presentation/2015/elasticsearchdao-ru-tietukurisuto/</link>
      <pubDate>Mon, 16 Feb 2015 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2015/elasticsearchdao-ru-tietukurisuto/</guid>
      <description>&lt;p&gt;第8回Elasticsearch勉強会で発表したときのスライドです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;第8回Elasticsearch勉強会で発表したときのスライドです。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Groovyスクリプトをダイナミックスクリプトなしで実行(日本語訳)</title>
      <link>https://blog.johtani.info/blog/2015/02/12/running-groovy-scripts-without-dynamic-scripting-ja/</link>
      <pubDate>Thu, 12 Feb 2015 15:13:09 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/02/12/running-groovy-scripts-without-dynamic-scripting-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/running-groovy-scripts-without-dynamic-scripting/&#34;&gt;running groovy scripts without dynamic scripting&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Elasticsearch1.3.8と1.4.3のリリースにより、デフォルトで、リクエストに含まれるGroovyスクリプトや
インデックスに保存されたスクリプトを動的に実行する機能をオフにしました。
しかし、Groovyはまだデフォルトのスクリプト言語です。
本ブログ記事では、少しだけダイナミックだが、サンドボックスではない言語のためのスクリプトを
どのように使い続けるかを説明します。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/running-groovy-scripts-without-dynamic-scripting/&#34;&gt;running groovy scripts without dynamic scripting&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Elasticsearch1.3.8と1.4.3のリリースにより、デフォルトで、リクエストに含まれるGroovyスクリプトや
インデックスに保存されたスクリプトを動的に実行する機能をオフにしました。
しかし、Groovyはまだデフォルトのスクリプト言語です。
本ブログ記事では、少しだけダイナミックだが、サンドボックスではない言語のためのスクリプトを
どのように使い続けるかを説明します。&lt;/p&gt;
&lt;p&gt;本ブログ記事は、それが何を意味し、さらに重要なのは、安全に重要なタスクを実行させるためにスクリプトを
どのように使用し続けるかを理解する助けとなるはずです。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;ダイナミックスクリプトとは&#34;&gt;ダイナミックスクリプトとは？&lt;/h2&gt;
&lt;p&gt;Elasticsearchに詳しくない方のために、Elasticsearchでは、
さまざまなリクエストの一部としてスクリプトを送信することができます。
search、aggregation、update、upsert、delete by queryなどです。
あなたのユースケースのために、通常の動作よりも拡張した動作をさせるためにスクリプトを追加できます。&lt;/p&gt;
&lt;p&gt;例えば、以下のリクエストは、ダイナミックスクリプトを含んでいます。
&lt;code&gt;field1&lt;/code&gt;と&lt;code&gt;field2 + shift&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-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;GET&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/_search&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:#f92672&#34;&gt;&amp;#34;query&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:#f92672&#34;&gt;&amp;#34;filtered&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:#f92672&#34;&gt;&amp;#34;filter&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:#f92672&#34;&gt;&amp;#34;script&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:#f92672&#34;&gt;&amp;#34;script&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;doc[&amp;#39;field1&amp;#39;].value == (doc[&amp;#39;field2&amp;#39;].value + shift)&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:#f92672&#34;&gt;&amp;#34;lang&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;groovy&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:#f92672&#34;&gt;&amp;#34;params&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:#f92672&#34;&gt;&amp;#34;shift&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;3&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&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;言語を変えることもできます。
それは、当然、シンタックスが変わったり、制限が追加（例えば、Groovyスクリプトの代わりに&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-scripting.html#_lucene_expressions_scripts&#34;&gt;Lucene　Expressions&lt;/a&gt;に変更）されることもあります。
&lt;code&gt;lang&lt;/code&gt;パラメータによって言語を指定できます。&lt;/p&gt;
&lt;h3 id=&#34;なぜそれはダイナミック&#34;&gt;なぜそれはダイナミック？&lt;/h3&gt;
&lt;p&gt;上記の例はダイナミックスクリプトです。
それは、実際のスクリプトの部分はサーバサイドで&lt;em&gt;動的に&lt;/em&gt;解釈されコンパイルされる必要があるからです。
ダイナミックスクリプトはElasticsearchのAPIによってデータノードに送信されます。
これは、&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-scripting.html#_indexed_scripts&#34;&gt;インデックスされたスクリプト(indexed script)&lt;/a&gt;も含みます。&lt;/p&gt;
&lt;p&gt;言い換えると、もし、スクリプトがデータノード全てに保存されていなければ、
それは、ダイナミックスクリプトとして扱われます。&lt;/p&gt;
&lt;h2 id=&#34;dynamic-scriptingをオフにするとどうなるか&#34;&gt;dynamic scriptingをオフにするとどうなるか？&lt;/h2&gt;
&lt;p&gt;最新のリリースでの変更により、Groovyのdynaic scriptingはデフォルトでオフになりました。
先ほどのスクリプトについても同様で、もし、先ほどのリクエストを実行すると、次のようなエラーが発生します。
(一部省略してあります。)&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-json&#34; data-lang=&#34;json&#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;&amp;#34;error&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SearchPhaseExecutionException[Failed to execute phase [query], all shards failed; shardFailures {[8FJ02MofSnqVvOQ10BXxhQ][test][0]: SearchParseException[[test][0]: from[-1],size[-1]: Parse Failure [Failed to parse source [{...}]]]; nested: ScriptException[dynamic scripting for [groovy] disabled]...&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:#f92672&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;400&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;エラーメッセージの重要な箇所は「ScriptException[dynamic scripting for [groovy] disabled]」です。&lt;/p&gt;
&lt;h2 id=&#34;スクリプティングを使い続けるには&#34;&gt;スクリプティングを使い続けるには？&lt;/h2&gt;
&lt;p&gt;Elasticsearchでスクリプトを実行するには3つの方法があります。
2つのダイナミックな方法は、リクエストごとのスクリプト（上述）かインデックスされた
スクリプト(indexed script)を使う方法です。
インデックスされたスクリプトを使うことは、Elasticsearch自身にGroovyスクリプトを保管することで
利用で、それらを要求に応じて利用することです。
（これは、実際には十分機能しますが、これではまだ、信頼できないユーザに対して彼らのスクリプトを実行できます）
RDBのように保存されたプロシージャとして同じ方法で実行させるものと同様です。
前もって、スクリプトを記述しておき、リクエストの一部として後から、名前で呼び出して実行可能です。&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-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;GET&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/_search&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:#f92672&#34;&gt;&amp;#34;query&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:#f92672&#34;&gt;&amp;#34;filtered&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:#f92672&#34;&gt;&amp;#34;filter&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:#f92672&#34;&gt;&amp;#34;script&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:#f92672&#34;&gt;&amp;#34;script_id&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;your_custom_script&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:#f92672&#34;&gt;&amp;#34;lang&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;groovy&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:#f92672&#34;&gt;&amp;#34;params&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:#f92672&#34;&gt;&amp;#34;shift&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;3&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&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あまり変わっていないことに気づくでしょう。
&lt;code&gt;script&lt;/code&gt;の部分が、前もって記述されたスクリプトの名前&lt;code&gt;script_id&lt;/code&gt;に変更されただけです。&lt;/p&gt;
&lt;p&gt;Elasticsearchにスクリプトを提供するダイナミックではない方法はインデックスに保存する代わりに、
ディスクにファイルとしてスクリプトを保存することです。
そうすることで、各スクリプトを設定として保存します。
これは、どのようなスクリプト言語に対してもダイナミックスクリプティングをオフにしたまま、
サンドボックス化されないスクリプトを使い続けることができる方法です。&lt;/p&gt;
&lt;p&gt;最初のサンプルで、Groovyスクリプトは&lt;code&gt;doc[&#39;field1&#39;].value == doc[&#39;field2&#39;].value + shift&lt;/code&gt;でした。
これを、&lt;code&gt;.groovy&lt;/code&gt;拡張子を持ったファイルとして書き出すことができます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;doc[&amp;#39;field1&amp;#39;].value == (doc[&amp;#39;field2&amp;#39;].value + shift)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;もし、このファイルに&lt;code&gt;your_custom_script.groovy&lt;/code&gt;ちう名前をつけて、
Elasticsearchのすべてのデータノードの&lt;code&gt;config/scripts&lt;/code&gt;ディレクトリに保存すると、
Elasticsearchは60秒（elasticsearch.ymlの&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-scripting.html#_automatic_script_reloading&#34;&gt;&lt;code&gt;watcher.interval&lt;/code&gt;で変更可能&lt;/a&gt;）でこのスクリプトを認識し、今後のリクエストに利用できるようにプリコンパイルするでしょう。
そのファイルはElasticsearch実行ユーザによって読み込みができる必要があります。
これをディスクに書き込んだ後、あなたの設定ディレクトリは次のようになっています。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;config/
  elasticsearch.yml
  logging.yml
  scripts/
    your_custom_script.groovy
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これは、各リクエストやインデックスされたスクリプトをスクリプトとして動的に送信しませんが、
信頼された環境にスクリプトを追加することでダイナミックスクリプトとなることを許します。&lt;/p&gt;
&lt;h2 id=&#34;ディスクに書かれたスクリプトを使用する&#34;&gt;ディスクに書かれたスクリプトを使用する&lt;/h2&gt;
&lt;p&gt;スクリプトは、ロードされたスクリプトになるまでは、利用できません。
ログファイルに次のようなログが表示されるまではです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[2015-02-11 11:14:47,066][INFO ][script                   ] [Sergei Kravinoff] compiling script file [/path/to/elasticsearch-1.4.3/config/scripts/your_custom_script.groovy]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;すべてのElasticsearchのデータノードでスクリプトが読み込まれたら、
それを利用することができます。
利用するために、&lt;code&gt;file&lt;/code&gt;（&lt;code&gt;script_id&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-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;GET&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/_search&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:#f92672&#34;&gt;&amp;#34;query&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:#f92672&#34;&gt;&amp;#34;filtered&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:#f92672&#34;&gt;&amp;#34;filter&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:#f92672&#34;&gt;&amp;#34;script&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:#f92672&#34;&gt;&amp;#34;file&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;your_custom_script&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:#f92672&#34;&gt;&amp;#34;lang&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;groovy&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:#f92672&#34;&gt;&amp;#34;params&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:#f92672&#34;&gt;&amp;#34;shift&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;3&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&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note:&lt;code&gt;lang&lt;/code&gt;は必須ではありません。Groovyがデフォルトの言語のためです。
もし、違うスクリプト言語を使いたい、もしくは、デフォルトの言語を（例えば、Lucene Expressionsへ）
変更したい場合、言語が正しいスクリプトを見つけるために提供されている必要があります。
一番良い方法は、アプリケーションが&lt;code&gt;lang&lt;/code&gt;パラメータを含んでいることを勧めます。
これは、将来、デフォルトのスクリプト言語が変更されても、問題ないからです。&lt;/p&gt;
&lt;h2 id=&#34;質問&#34;&gt;質問？&lt;/h2&gt;
&lt;p&gt;もし、質問があれば、遠慮なくTwitter(&lt;a href=&#34;https://twitter.com/elasticsearch&#34;&gt;@elasticsearch&lt;/a&gt;)で教えて下さい。
また、問題がありましたら、&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues&#34;&gt;GitHub issues page&lt;/a&gt;で報告をお願いします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch　1.4.3および1.3.8リリース（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2015/02/12/elasticsearch-1-4-3-and-1-3-8-released-ja/</link>
      <pubDate>Thu, 12 Feb 2015 12:39:53 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/02/12/elasticsearch-1-4-3-and-1-3-8-released-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-3-and-1-3-8-released/&#34;&gt;elasticsearch 1.4.3 and 1.3.8 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日、&lt;strong&gt;Lucene 4.10.3&lt;/strong&gt;をベースにした&lt;strong&gt;Elasticsearch 1.4.3&lt;/strong&gt;と、&lt;strong&gt;セキュリティ&lt;/strong&gt;とバグフィックスリリースである、&lt;strong&gt;Elasticsearch 1.3.8&lt;/strong&gt;をリリースしました。
ダウンロードおよび変更リストはそれぞれ次のリンクからアクセスできます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-3-and-1-3-8-released/&#34;&gt;elasticsearch 1.4.3 and 1.3.8 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日、&lt;strong&gt;Lucene 4.10.3&lt;/strong&gt;をベースにした&lt;strong&gt;Elasticsearch 1.4.3&lt;/strong&gt;と、&lt;strong&gt;セキュリティ&lt;/strong&gt;とバグフィックスリリースである、&lt;strong&gt;Elasticsearch 1.3.8&lt;/strong&gt;をリリースしました。
ダウンロードおよび変更リストはそれぞれ次のリンクからアクセスできます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最新ステーブルリリース：&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-4-3&#34;&gt;Elasticsearch 1.4.3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;1.3.x系バグフィックス：&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-3-8&#34;&gt;Elasticsearch 1.3.8&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;過去のリリースに関するブログ（公式）はこちら。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1.4:&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-2-released/&#34;&gt;1.4.2&lt;/a&gt;,
&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-1-released/&#34;&gt;1.4.1&lt;/a&gt;,
&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-0-released/&#34;&gt;1.4.0&lt;/a&gt;, &lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-0-beta-released/&#34;&gt;1.4.0.Beta1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;1.3:&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-2-released/&#34;&gt;1.3.7&lt;/a&gt;,
&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-1-released/&#34;&gt;1.3.6&lt;/a&gt;,
&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-0-released/&#34;&gt;1.3.5&lt;/a&gt;, &lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-3-4-released/&#34;&gt;1.3.4&lt;/a&gt;, &lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-3-3-released/&#34;&gt;1.3.3&lt;/a&gt;, &lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-3-2-released/&#34;&gt;1.3.2&lt;/a&gt;, &lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-3-1-released/&#34;&gt;1.3.1&lt;/a&gt;, &lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-3-0-released/&#34;&gt;1.3.0&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;すべての変更については&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-4-3&#34;&gt;1.4.3のリリースノート&lt;/a&gt;および&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-3-8&#34;&gt;1.3.8のリリースノート&lt;/a&gt;をごらんください。
以下では、セキュリティの問題について紹介します。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;groovy-scripting-の脆弱性&#34;&gt;groovy scripting の脆弱性&lt;/h2&gt;
&lt;p&gt;Elasticsearchのバージョン1.3.0から1.3.7および1.4.0から1.4.2で、Groovyスクリプトエンジンに脆弱性が発見されました。
脆弱性は、攻撃者がGroovyスクリプトをサンドボックスを避けて構築でき、
ElasticsearchのJava VMを実行しているユーザとしてシェルコマンドを実行できます。&lt;/p&gt;
&lt;p&gt;この問題をCVE-2015-1427として報告済みです。&lt;/p&gt;
&lt;p&gt;バージョン1.3.8と1.4.3では、デフォルトで、Groovyに対してのサンドボックスをオフにしました。
結果として、&lt;strong&gt;ダイナミックスクリプトの実行はGroovyに対してもオフとなります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;もし、脆弱性のあるバージョンで実行している場合、v1.3.8かv1.4.3にアップグレードするか、ダイナミックなGroovyスクリプトをクラスタの
すべてのノードに対して次の設定を追加することで、オフにします。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;script.groovy.sandbox.enabled: false
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これは、Groovyのサンドボックスをオフにし、リクエストの一部としてインラインで受け付けるダイナミックなGroovyスクリプトや
特殊な&lt;code&gt;.scripts&lt;/code&gt;インデックスに保存されているスクリプトを実行しません。&lt;/p&gt;
&lt;p&gt;それまでは、各データノードの&lt;code&gt;config/scripts&lt;/code&gt;ディレクトリにファイルとして保存されたGroovyスクリプトは
まだ、利用可能です。詳細の情報については&lt;a href=&#34;http://www.elasticsearch.org/blog/running-groovy-scripts-without-dynamic-scripting/&#34;&gt;Running scripts without dynamic scripting&lt;/a&gt;をごらんください。&lt;/p&gt;
&lt;h2 id=&#34;future-scripting-plans&#34;&gt;future scripting plans&lt;/h2&gt;
&lt;p&gt;安全なダイナミックスクリプティング言語としてGroovyを失うことは、Elasticsearchにとって痛手です。
update APIやsearch APIやaggregationsフレームワークの一部としてScriptを使います。
それらは、静的なAPIでは簡単に表現できない、カスタムなトリックをユーザに実行できるようにします。&lt;/p&gt;
&lt;p&gt;残念ながら、Groovyチームとこの問題を議論した後、Groovy言語もサンドボックスによってきちんと保護されている
というにはあまりにもダイナミックであるという結論に達しました。
Groovyは、デフォルトでは利用できなくなります。
利用可能なダイナミックスクリプト言語としては&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-scripting.html#_lucene_expressions_scripts&#34;&gt;Lucene Expressions言語&lt;/a&gt;のみとなります。
Expressionsははやいですが、それらは非常に限定されています。数値のフィールドでのみ実行可能で、ループをサポートしていません。&lt;/p&gt;
&lt;p&gt;より強力で（しかし安全な）ミニ言語になるようにExpressionsを拡張することを調査しています。
これは、Scriptユーザが現在持っている最も一般的なユースケースを少なくとも助けるでしょう。
この拡張は長期間のプロジェクトであり、進化には時間がかかるでしょう。&lt;/p&gt;
&lt;p&gt;ぜひ、&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-4-3&#34;&gt;Elasticsearch 1.4.3&lt;/a&gt;をダウンロードして、試してみてください。
そして、感想をTwitter(&lt;a href=&#34;https://twitter.com/elasticsearch&#34;&gt;@elasticsearch&lt;/a&gt;)などで教えて下さい。
また、問題がありましたら、&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues&#34;&gt;GitHub issues page&lt;/a&gt;で報告をお願いします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearchの紹介と特徴 CROSS 2015</title>
      <link>https://blog.johtani.info/presentation/2015/elasticsearchfalseshao-jie-tote-zheng-cross-2015/</link>
      <pubDate>Fri, 30 Jan 2015 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2015/elasticsearchfalseshao-jie-tote-zheng-cross-2015/</guid>
      <description>&lt;p&gt;CROSS 2015の全文検索エンジン群雄割拠〜あなたが使うべきはどれだ！〜で使用したスライドです。
&lt;a href=&#34;http://2015.cross-party.com/program/c4&#34;&gt;http://2015.cross-party.com/program/c4&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;CROSS 2015の全文検索エンジン群雄割拠〜あなたが使うべきはどれだ！〜で使用したスライドです。
&lt;a href=&#34;http://2015.cross-party.com/program/c4&#34;&gt;http://2015.cross-party.com/program/c4&lt;/a&gt;&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>CROSS 2015で話をしてきました #cross2015</title>
      <link>https://blog.johtani.info/blog/2015/01/29/talk-at-cross2015/</link>
      <pubDate>Thu, 29 Jan 2015 11:59:28 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/01/29/talk-at-cross2015/</guid>
      <description>&lt;p&gt;今年もCROSS参加しました。そして、話もしてきました。
今年は横浜の大さん橋でした。横浜はあんまりこないので、乗り換えでおたおたしてしまいましたが。。。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今年もCROSS参加しました。そして、話もしてきました。
今年は横浜の大さん橋でした。横浜はあんまりこないので、乗り換えでおたおたしてしまいましたが。。。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20150129/oosanbashi.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20150129/oosanbashi.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;!-- more --&gt;
&lt;p&gt;なかなかいい景色でした。（寒いけど）
「おおさんばし」って読むんですね。「だいさんばし」だと思ってた。。。&lt;/p&gt;
&lt;p&gt;以下はいつもの、自分用メモです。&lt;/p&gt;
&lt;h2 id=&#34;俺はどうしてそのデータストアを選択したのか-銀河と小宇宙を語る会&#34;&gt;俺はどうしてそのデータストアを選択したのか 〜銀河と小宇宙を語る会〜&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;http://2015.cross-party.com/program/c1&#34;&gt;http://2015.cross-party.com/program/c1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;遅れて入ったので、ちゃんと聴けてないです。&lt;/p&gt;
&lt;h4 id=&#34;最近注目しているデータストアは&#34;&gt;最近注目しているデータストアは？&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Postgresql。JSON型が気になってる。&lt;/li&gt;
&lt;li&gt;AiroSpike。データ型のあるデータストアが気になってる。&lt;/li&gt;
&lt;li&gt;MongoDB。&lt;strike&gt;JSON使いたいなら、これじゃないの？&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;AWSのAurora。&lt;strike&gt;インスタンスタイプを選ばなくていい&lt;/strike&gt;（選ばないといけないらしい）とか、勝手にスケールしてくれるし、MySQL互換。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;今こそ語るエンジニアの幸せな未来&#34;&gt;今こそ語るエンジニアの幸せな未来&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;http://2015.cross-party.com/program/x3&#34;&gt;http://2015.cross-party.com/program/x3&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「無職初日です。」&lt;/li&gt;
&lt;li&gt;Web系の人？とか質問されて、自分が何系かいつもわからなくなるなぁ。&lt;/li&gt;
&lt;li&gt;「働きがいは会社が提供するのか、個人が見つけるのか？」
&lt;ul&gt;
&lt;li&gt;個人かなぁ。会社がなにをやってるかにもよる気がするかなぁ。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;「辞めると伝えると、やりたいようにやれって言われるw」&lt;/li&gt;
&lt;li&gt;リモートできるかできないか。&lt;/li&gt;
&lt;li&gt;「働きがい」というキーワードが出てると普通は怪しい会社w&lt;/li&gt;
&lt;li&gt;今は、働きやすさを高くしないと人が雇えなくなってきている。&lt;/li&gt;
&lt;li&gt;欧米のミドルウェアだと、35歳定年説はない。→日本でもそうじゃないですか？&lt;/li&gt;
&lt;li&gt;漫然と進んでるとダメ。→そりゃそうだ。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;全文検索エンジン群雄割拠あなたが使うべきはどれだ&#34;&gt;全文検索エンジン群雄割拠〜あなたが使うべきはどれだ！〜&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;http://2015.cross-party.com/program/c4&#34;&gt;http://2015.cross-party.com/program/c4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;スライド：https://speakerdeck.com/johtani/elasticsearchfalseshao-jie-tote-zheng-cross-2015&lt;/p&gt;
&lt;p&gt;楽しんでいただけましたでしょうか？
ちょっと話が長くなってしまい、あとの方の時間が少なかった気がしますが。。。&lt;/p&gt;
&lt;p&gt;Kibanaのバックエンドとして認識されている人もいたので、検索エンジンですよというのをアピールするいい機会になったので良かったです。
もちろん、Kibanaとの組み合わせも面白いので、少しでも興味をもっていただき、触っていただけたらなぁと。&lt;/p&gt;
&lt;p&gt;話をする機会を用意していただいた、&lt;a href=&#34;https://twitter.com/yamakatu&#34;&gt;やまかつさん&lt;/a&gt;、その他のスピーカーのみなさん、ありがとうございました！。&lt;/p&gt;
&lt;p&gt;Elasticsearchに関して何か興味質問などありましたら、気軽にコンタクトしてください。Twitterとかブログコメントなどで。&lt;/p&gt;
&lt;h2 id=&#34;プレモルタイム以降&#34;&gt;プレモルタイム以降&lt;/h2&gt;
&lt;p&gt;プレモルの写真撮るの忘れてました。。。重要なのに。。。&lt;/p&gt;
&lt;p&gt;美味しくプレモルをいただきながら、何人かの方に声をかけていただき、話をすることができました。
こういう時間がとってあるのがいいですよね。
色々なところでElasticsearchを使っていただいているようで、うれしい限りです。
DMMの方とも話ができたし。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;今年はプレモルを飲みに行くだけかなぁと思っていたのですが、話をする人になってました。（おかしいなぁ）
来年もあれば、きっと参加するかなぁと。ではまた来年！&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20150129/night.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20150129/night.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;夜景きれいですね。（端っこに写ってる船は&lt;a href=&#34;http://www.asukacruise.co.jp/facility/view/&#34;&gt;飛鳥II&lt;/a&gt;でした。）&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>データ転送ミドルウェア勉強会に参加しました。#dtm_meetup</title>
      <link>https://blog.johtani.info/blog/2015/01/27/data-transfer-middleware-meetup/</link>
      <pubDate>Tue, 27 Jan 2015 19:01:01 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2015/01/27/data-transfer-middleware-meetup/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://eventdots.jp/event/312015&#34;&gt;データ転送ミドルウェア勉強会&lt;/a&gt;に参加しました。&lt;/p&gt;
&lt;p&gt;以下は、テキトー自分メモです。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;バルクデータロードツールembulkリリース--fluentdの柔軟性と堅牢性をバルクでも-トレジャーデータ-古橋貞之氏&#34;&gt;『バルクデータロードツール「Embulk」リリース 〜 fluentdの柔軟性と堅牢性をバルクでも』 トレジャーデータ 古橋貞之氏&lt;/h2&gt;
&lt;p&gt;スライド：未定&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;パラレルにデータをバルクロード、プラグインで&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;http://eventdots.jp/event/312015&#34;&gt;データ転送ミドルウェア勉強会&lt;/a&gt;に参加しました。&lt;/p&gt;
&lt;p&gt;以下は、テキトー自分メモです。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;バルクデータロードツールembulkリリース--fluentdの柔軟性と堅牢性をバルクでも-トレジャーデータ-古橋貞之氏&#34;&gt;『バルクデータロードツール「Embulk」リリース 〜 fluentdの柔軟性と堅牢性をバルクでも』 トレジャーデータ 古橋貞之氏&lt;/h2&gt;
&lt;p&gt;スライド：未定&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;パラレルにデータをバルクロード、プラグインで&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CSVデータとか、ロードするの辛いよね。パース失敗→書き換えてリトライ→パース失敗。。。さて、できたからcronで。。。また失敗&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fluentdはストリームデータを流すのはいいけど、すでにある大量データをロードするのがつらい。なので。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;名前はembarkにかけてembulk&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コアはJava、プラグインはRuby&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;デモ。実行の仕方とプラグインの実装の仕方&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;プラグインはrunメソッドとinitializeを実装。runメソッドがスレッド実装される。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ロードマップ（いくつか未実装のもの）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コントリビューションの方法。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ブログとか、プラグイン書くとか、Windowsサポートとか、とか。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;QA&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Q：JSONだとスキーマフリーだけど？&lt;/li&gt;
&lt;li&gt;A：Guessでスキーマを固定させたかった。&lt;/li&gt;
&lt;li&gt;Q：なんでJava？&lt;/li&gt;
&lt;li&gt;A：性能です。性能です。&lt;/li&gt;
&lt;li&gt;Q：executorでいろんなところで動かせるという話ですが、どういうexecutorを考えてますか？&lt;/li&gt;
&lt;li&gt;A：まずは、Hadoopでの実行。Yarnなどでタスクを投げるってもアリじゃないかと。&lt;/li&gt;
&lt;li&gt;Q：できるできないがプラグインによってありそうだけど、embulk的には許容するか？&lt;/li&gt;
&lt;li&gt;A：許容するしかないすね。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;世界で利用されるファイル転送ツールhulftセゾン情報システムズ-hulft事業部-庄司吉徳氏&#34;&gt;『世界で利用されるファイル転送ツールHULFT』セゾン情報システムズ HULFT事業部 庄司吉徳氏&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;20年近い歴史あり&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MFT＝Managed file transfer&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;FTPだけだと、整合性の保証ととかジョブとの連携とかが足りない&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;QA&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Q：クライアントとサーバのソフトに違いがないとの話でしたが、セキュアな環境でTCPポート開けないといけないとかありますが、どーやってますか？&lt;/li&gt;
&lt;li&gt;A：エンタープライズのお客様は基本的に専用線を引くのであんまりきにする人はいないです。もちろん、専用のプロキシ製品もあります。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;fluentd-2015---v1に向けて--トレジャーデータ-中川真宏氏&#34;&gt;『Fluentd 2015 - v1に向けて -』トレジャーデータ 中川真宏氏&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fluentdのロードマップとか&lt;/li&gt;
&lt;li&gt;v0.11は存在しないので、話にあげないで下さい。&lt;/li&gt;
&lt;li&gt;v0.12（current stable）、FilterとLabelが導入された&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;h2o---httpをより便利により速くディーエヌエー-奥一穂氏&#34;&gt;『H2O - HTTPを、より便利に、より速く』ディー・エヌ・エー 奥一穂氏&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>今年の振り返りと来年の抱負（2014）</title>
      <link>https://blog.johtani.info/blog/2014/12/31/looking-back-2014/</link>
      <pubDate>Wed, 31 Dec 2014 20:41:26 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/12/31/looking-back-2014/</guid>
      <description>&lt;p&gt;今年は大晦日になってしまいました。しかも、ちょっと飲んでたり。。。
第9流しながら書いてます。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;振り返り2013年に書いた抱負から&#34;&gt;振り返り(2013年に書いた抱負から)&lt;/h2&gt;
&lt;p&gt;まずは昨年書いた抱負からの振り返りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Elasticsearch勉強会の継続、Solr勉強会の&lt;strike&gt;継続＋ミックスした検索勉強会の開催&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;IDEAのさらなる活用&lt;/li&gt;
&lt;li&gt;もっと開発(プラグインとか)&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;AWSをもう少し活用&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;海外のイベントに行ってみたい&lt;/li&gt;
&lt;li&gt;読書と英語を継続&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AWS活用できてないです、、、
ミックスした勉強会は、ドタバタしててできませんでした。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今年は大晦日になってしまいました。しかも、ちょっと飲んでたり。。。
第9流しながら書いてます。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;振り返り2013年に書いた抱負から&#34;&gt;振り返り(2013年に書いた抱負から)&lt;/h2&gt;
&lt;p&gt;まずは昨年書いた抱負からの振り返りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Elasticsearch勉強会の継続、Solr勉強会の&lt;strike&gt;継続＋ミックスした検索勉強会の開催&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;IDEAのさらなる活用&lt;/li&gt;
&lt;li&gt;もっと開発(プラグインとか)&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;AWSをもう少し活用&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;海外のイベントに行ってみたい&lt;/li&gt;
&lt;li&gt;読書と英語を継続&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AWS活用できてないです、、、
ミックスした勉強会は、ドタバタしててできませんでした。&lt;/p&gt;
&lt;p&gt;IDEAはさらなる活用までいってるかは不明ですが、最近は&lt;a href=&#34;http://samuraism.com&#34;&gt;隣にとても詳しい人&lt;/a&gt;が座っているので色々と教えてもらってます。
開発については、ちょっとずつですが、PR書いたりしてます。&lt;/p&gt;
&lt;h2 id=&#34;振り返り今年あったできごと&#34;&gt;振り返り(今年あったできごと)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;初海外（&lt;a href=&#34;http://blog.johtani.info/blog/2014/03/16/post-from-berlin/&#34;&gt;ベルリン&lt;/a&gt;と&lt;a href=&#34;http://blog.johtani.info/blog/2014/07/01/join-elasticsearch/&#34;&gt;アムステルダム&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;Elasticsearchに転職&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.johtani.info/blog/2014/05/09/reading-agile-data-science/&#34;&gt;初献本?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Elasticsearch勉強会の定期開催&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.amazon.co.jp/dp/4048662023/ref=as_sl_pc_tf_lc?tag=johtani-22&amp;amp;camp=243&amp;amp;creative=1615&amp;amp;linkCode=as1&amp;amp;creativeASIN=4048662023&amp;amp;adid=0TJJ6P11DE20CX6F42NJ&amp;amp;&amp;amp;ref-refURL=http%3A%2F%2Fblog.johtani.info%2Fblog%2Farchives%2F&#34;&gt;ElasticSearch Serverの翻訳&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.amazon.co.jp/dp/B00MPDUQQI/ref=as_sl_pc_tf_lc?tag=johtani-22&amp;amp;camp=243&amp;amp;creative=1615&amp;amp;linkCode=as1&amp;amp;creativeASIN=B00MPDUQQI&amp;amp;adid=0HM28YENR7JAXB3ESSX0&amp;amp;&amp;amp;ref-refURL=http%3A%2F%2Fblog.johtani.info%2Fblog%2Farchives%2F&#34;&gt;サーバ/インフラエンジニア養成読本の執筆&lt;/a&gt;&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;p&gt;初の海外でした。なのに、夏には海外の会社に転職してみてるとか、ちょっと自分でも信じられません。
ベルリンでは、海外の勉強会にも参加できて非常に有意義でした。
ヨーロッパの街並みは、日本では経験できない雰囲気で、向こうの方には普通の街並みも自分にはとても新鮮でした。&lt;/p&gt;
&lt;p&gt;転職自体は2回目ですが、海外の会社というのは初めてです。日々、英語の勉強になりますし、いろんな刺激を受けています。
英語の勉強自体も継続中です。英語力が不足しているのは自覚してるので、少しでも英語に触れるようにDLifeで海外ドラマを録画して、通勤時間帯にみるなどを試みてます。&lt;/p&gt;
&lt;p&gt;書籍には、昨年につづき関わることができました。来年も何かしらの書籍に関われることができればなと。
（気になる人は以下のリンクから。。。）&lt;/p&gt;
&lt;iframe src=&#34;http://rcm-fe.amazon-adsystem.com/e/cm?t=johtani-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=B00MPDUQQI&amp;nou=1&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr&#34; style=&#34;width:120px;height:240px;&#34; scrolling=&#34;no&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34; frameborder=&#34;0&#34;&gt;&lt;/iframe&gt;
&lt;iframe src=&#34;http://rcm-fe.amazon-adsystem.com/e/cm?t=johtani-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=4048662023&amp;nou=1&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr&#34; style=&#34;width:120px;height:240px;&#34; scrolling=&#34;no&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34; frameborder=&#34;0&#34;&gt;&lt;/iframe&gt;
&lt;p&gt;分かりきったことですが、Elasticsearchな1年でした。
転職してあっという間の半年です。まだまだやりたいことがいっぱいあるので、来年もバランスよく頑張らないと。&lt;/p&gt;
&lt;h2 id=&#34;来年の抱負&#34;&gt;来年の抱負&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;英語の継続&lt;/li&gt;
&lt;li&gt;海外のイベントへの参加&lt;/li&gt;
&lt;li&gt;多岐にわたるイベントでのスピーカー&lt;/li&gt;
&lt;li&gt;日本の人員の倍増！？&lt;/li&gt;
&lt;li&gt;Elasticsearchに関する日本語の情報発信&lt;/li&gt;
&lt;li&gt;Elasticsearch座談会みたいなものの開催&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;英語の継続については書くまでもないですね。
海外のイベントへの参加もかなぁ。&lt;a href=&#34;http://www.elasticsearch.org/blog/its-time-elasticon15-registration-is-finally-open/&#34;&gt;3月にサンフランシスコに行く&lt;/a&gt;とは思います。
そのほかには、今度こそ&lt;a href=&#34;http://berlinbuzzwords.de&#34;&gt;Berlin Buzzwords&lt;/a&gt;に行きたいです。&lt;/p&gt;
&lt;p&gt;Elasticsearch勉強会以外のイベントでもElasticsearchを広めるべく色々なところでスピーカーをしたいなと思っています。
検索、ログ解析で少しは知名度が上がってきていますが、別の言語のコミュニティやイベントでは、まだまだ、elasticsearch自体を知らない人もいると思います。まずは知ってもらうところからかなと。&lt;/p&gt;
&lt;p&gt;日本の人員の倍増については、今年も達成してます（一人が二人になりましたw）。
来年も倍増できればうれしいなと。同じ母国語の同僚がいるのはやっぱりうれしいし、心強いですから。&lt;/p&gt;
&lt;p&gt;来年は（も）、日本語での情報をどんどん発信していきます。サイトやガイドなども
日本語にしたいなと。
あとは、これまで、勉強会でスピーカーをしていただいた人だけを集めた座談会のようなものも開催したいなと考えています。
私自身も色々と聞きたいことがありますし。
そのほかにも色々と要望をお待ちしています。Twitterやブログのコメント欄などで気軽にコンタクトしていただければと。&lt;/p&gt;
&lt;p&gt;最後は、いつものようにですが、来年も勉強会やいろんなイベントに参加する予定です。 ブログも週1程度で書く努力しないとなぁ。 こんな話を書いてくださいとかのリクエストもお待ちしています。&lt;/p&gt;
&lt;p&gt;今年はあと、数時間ですが、色々とお世話になりました。 この場を借りてお礼申し上げます。&lt;/p&gt;
&lt;p&gt;来年も、いろんな方に絡んでいくとは思いますが、よろしくお願いいたします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch 2.0系のIssueの紹介</title>
      <link>https://blog.johtani.info/blog/2014/12/25/pickup-elasticsearch-2-0-0-labels/</link>
      <pubDate>Thu, 25 Dec 2014 15:53:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/12/25/pickup-elasticsearch-2-0-0-labels/</guid>
      <description>&lt;p&gt;この記事は&lt;a href=&#34;http://qiita.com/advent-calendar/2014/elasticsearch&#34;&gt;Elasticsearch Advent Calndar 2014&lt;/a&gt;の25日目のエントリです。&lt;/p&gt;
&lt;p&gt;あっという間に最終日です。来年につなげるという意味で、Elasticsearchの2系のIssueをいくつかピックアップして紹介してみます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;この記事は&lt;a href=&#34;http://qiita.com/advent-calendar/2014/elasticsearch&#34;&gt;Elasticsearch Advent Calndar 2014&lt;/a&gt;の25日目のエントリです。&lt;/p&gt;
&lt;p&gt;あっという間に最終日です。来年につなげるという意味で、Elasticsearchの2系のIssueをいくつかピックアップして紹介してみます。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;現在、ElasticsearchのGitHubリポジトリは、大きく3つのブランチで作業しています。
&lt;code&gt;master&lt;/code&gt;、&lt;code&gt;1.x&lt;/code&gt;、&lt;code&gt;1.4&lt;/code&gt;です。&lt;code&gt;master&lt;/code&gt;と&lt;code&gt;1.x&lt;/code&gt;の大きな違いとしては、&lt;code&gt;master&lt;/code&gt;はLuceneの5.x系を採用している点です。&lt;/p&gt;
&lt;p&gt;なお、これから紹介するIssueは現在、確定していない項目も含んでいます。実際に2.0がリリースされるタイミングでは
採用されない場合もあります。&lt;/p&gt;
&lt;h2 id=&#34;upgrade-master-to-lucene-50-snapshot-8347-closed&#34;&gt;Upgrade master to lucene 5.0 snapshot #8347 (closed)&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/pull/8347&#34;&gt;https://github.com/elasticsearch/elasticsearch/pull/8347&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;先ほど書きましたが、Luceneの5に対応するためのPRです。
Lucene 5に関してはLuceneのコミッターのMikeさんの&lt;a href=&#34;http://blog.mikemccandless.com/2014/11/apache-lucene-500-is-coming.html&#34;&gt;ブログ記事&lt;/a&gt;も参考になります。&lt;/p&gt;
&lt;p&gt;Lucene 5に変更することで、BitSetに関する改善が多く含まれることになります。
メモリの利用量、圧縮などの改善が多く含まれています。
もう1点大事な点としては、Lucene 5系ではLucene 3系のインデックスを読み込むことができなくなる点です。
Luceneの下位互換の範囲は1つ前のメジャーバージョン（5.x系の場合は4.xまでが対象）となっています。&lt;/p&gt;
&lt;h2 id=&#34;filter-cache-add-a-_cache-auto-option-and-make-it-the-defaultclosed&#34;&gt;Filter cache: add a &lt;code&gt;_cache: auto&lt;/code&gt; option and make it the default.（closed）&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/pull/8573&#34;&gt;https://github.com/elasticsearch/elasticsearch/pull/8573&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Filter cacheは、&lt;code&gt;true&lt;/code&gt;もしくは&lt;code&gt;false&lt;/code&gt;の設定が利用できますが、filterの種類にも依存します。
その辺りの条件を加味しつつ、よしなにCacheをコントロールしてくれます。&lt;/p&gt;
&lt;h2 id=&#34;remove-andornot-in-favour-of-bool-filter-8960open--discuss&#34;&gt;Remove and/or/not in favour of &lt;code&gt;bool&lt;/code&gt; filter #8960（open / discuss）&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues/8960&#34;&gt;https://github.com/elasticsearch/elasticsearch/issues/8960&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;似ているが少し異なる&lt;code&gt;and&lt;/code&gt;、&lt;code&gt;or&lt;/code&gt;、&lt;code&gt;not&lt;/code&gt;フィルタと&lt;code&gt;bool&lt;/code&gt;フィルタが存在しています。
これらをわかりやすくするために、&lt;code&gt;bool&lt;/code&gt;フィルタに統一しましょうという話し合いをしています。&lt;/p&gt;
&lt;h2 id=&#34;input-validation-9059open--discuss&#34;&gt;Input validation #9059（open / discuss）&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues/9059&#34;&gt;https://github.com/elasticsearch/elasticsearch/issues/9059&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;色々な入力に関するチェックを追加しようというIssueです。
たとえば、ディレクトリ名やファイル名、URLのパスやクエリストリング、フィールドのパスやスクリプトなどです。
Validationがあると、変な設定をして頭をかかえることもなくなるかなぁと。&lt;/p&gt;
&lt;h2 id=&#34;refactor-analysis-framework-8961open&#34;&gt;Refactor analysis framework #8961（open）&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues/8961&#34;&gt;https://github.com/elasticsearch/elasticsearch/issues/8961&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;新しくAnalyzerを作った場合に、色々な場所に登録必要があったりします。インデックスレベルとノードレベルです。（Kuromojiプラグインなどが参考になります。）
また、インデックスごとにカスタムのAnalyzerを設定するので、1つのノードに同じAnalyzerを何度も設定しないといけません。
よりシンプルにするために、Analyzerをノード単位で設定しようという提案です。&lt;/p&gt;
&lt;h2 id=&#34;remove-possibility-for-conflicting-field-definitions-and-ambiguous-field-resolution-8870open&#34;&gt;Remove possibility for conflicting field definitions and ambiguous field resolution #8870（open）&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues/8870&#34;&gt;https://github.com/elasticsearch/elasticsearch/issues/8870&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;同じインデックスに、異なるtypeで、同じフィールド名があった場合、いろいろと良くないことがあったりします。
たとえば、フィールドのタイプがintegerとstringと異なる場合に、インデックスレベルで検索を行うとうまく検索できなかったりと。
この問題を解消するために、より明確にしようというIssueです。
たとえば、フィールド名を指定するためには、フルパスで記述をするだとか、フィールドマッピングに関してはインデックスレベルで内部で保持をするなど。&lt;/p&gt;
&lt;h2 id=&#34;validation-of-mappings-request-to-reject-unsupported-fields-7205closed&#34;&gt;Validation of mappings request to reject unsupported fields #7205（closed）&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues/7205&#34;&gt;https://github.com/elasticsearch/elasticsearch/issues/7205&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;1.xでも取り込まれますが、嬉しい機能なので紹介します。
これまでは、mappingsでスペルミスをした場合（たとえば、field設定で&amp;quot;indexx&amp;quot;といったミス）には、その項目は単に無視されるだけでした。
これが、v1.xでは、エラーに&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、簡単ですが、v2.0.0に向けたIssueをピックアップして紹介してみました。
上記以外にも多くの改善、提案が2.0に向けて行われています。
興味のある方は、&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues?q=is%3Aopen+is%3Aissue+label%3Av2.0.0&#34;&gt;v2.0.0&lt;/a&gt;ラベルでIssueを検索してみてはいかがでしょうか？&lt;/p&gt;
&lt;p&gt;今年もあとわずかとなりました。
今年の2月にElasticsearchの1.0がリリースされ、あっという間に1.4なりました。まだまだ改善しています。&lt;/p&gt;
&lt;p&gt;来年もElasticsearchに興味をもっていただければ嬉しいです。
&lt;a href=&#34;http://www.elasticon.com/&#34;&gt;Elasticsearch初のユーザカンファレンスのサイトもオープン&lt;/a&gt;しました。
Elasticsearchに関するいろいろな話が聞ける機会だと思います。登録をお待ちしています。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Marvel 1.3.0リリース（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2014/12/18/marvel-1-3-0-released-ja/</link>
      <pubDate>Thu, 18 Dec 2014 17:06:48 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/12/18/marvel-1-3-0-released-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/marvel-1-3-0-released/&#34;&gt;marvel 1.3.0 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;12/17に、&lt;strong&gt;Elasticsearch Marvel 1.3.0&lt;/strong&gt;をリリースしました。
Marvelの以前のリリースから、Elasticsearchでは様々なことがありました（Elasticsearch 1.4のリリースなど）。
このバージョンでは、モニタリングにクエリキャッシュや新しいcircuit breakerなどのような機能を追加してあります。
Senseのナレッジベースは最新のAPIを含むものに拡張されています。
また、&lt;a href=&#34;http://www.elasticsearch.org/overview/shield/&#34;&gt;Shield&lt;/a&gt;のリリースに向けた準備として、HTTPsのサポートも追加しました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/marvel-1-3-0-released/&#34;&gt;marvel 1.3.0 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;12/17に、&lt;strong&gt;Elasticsearch Marvel 1.3.0&lt;/strong&gt;をリリースしました。
Marvelの以前のリリースから、Elasticsearchでは様々なことがありました（Elasticsearch 1.4のリリースなど）。
このバージョンでは、モニタリングにクエリキャッシュや新しいcircuit breakerなどのような機能を追加してあります。
Senseのナレッジベースは最新のAPIを含むものに拡張されています。
また、&lt;a href=&#34;http://www.elasticsearch.org/overview/shield/&#34;&gt;Shield&lt;/a&gt;のリリースに向けた準備として、HTTPsのサポートも追加しました。&lt;/p&gt;
&lt;p&gt;アップグレードのために、Elasticsearchの全てのノードに最新版のMarvelプラグインをインストールする必要があります。
また、他のJavaプラグインと同様に、Marvelの新バージョンを有効にするために、各ノードを（1台ずつ）リスタートする必要があるでしょう。
アップグレードプロセスについての詳細は、&lt;a href=&#34;http://www.elasticsearch.org/guide/en/marvel/current/upgrade.html#upgrade&#34;&gt;Marvelドキュメント&lt;/a&gt;をごらんください。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;まとめとして、ここに本リリースに関する改善点をいかにリストアップしておきます。&lt;/p&gt;
&lt;h3 id=&#34;agent&#34;&gt;agent&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;追加：
&lt;ul&gt;
&lt;li&gt;httpsのサポート&lt;/li&gt;
&lt;li&gt;デフォルトのMarvelの設定（以前は常に9200）ではなく、ローカルノードのポートを自動的に検出&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;改善：
&lt;ul&gt;
&lt;li&gt;marvelインデックステンプレートに関するエラーチェックと耐障害性(それに対するチェックと追加時のチェック)&lt;/li&gt;
&lt;li&gt;エラーログに関するくり返しの抑制&lt;/li&gt;
&lt;li&gt;URLパラメータによるインデックス名を指定する_bulk exportコマンド。これは、&lt;code&gt;rest.action.multi.allow_explicit_index&lt;/code&gt;がfalseに設定されているときに有用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;修正：
&lt;ul&gt;
&lt;li&gt;ES 1.4.0のtribe nodeがMarvelのインストール時に初期化されない問題&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;削除：
&lt;ul&gt;
&lt;li&gt;UIで表示されないoptional shard level statsを除去&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;monitoring-ui&#34;&gt;monitoring ui&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;追加：
&lt;ul&gt;
&lt;li&gt;ES 1.4.0で導入された新しいcircuit breakerを追加&lt;/li&gt;
&lt;li&gt;circuit breakerのlimitをグラフにプロット&lt;/li&gt;
&lt;li&gt;QueryCacheのグラフを追加&lt;/li&gt;
&lt;li&gt;index throttlingのグラフの追加&lt;/li&gt;
&lt;li&gt;Index writerとバージョンのmapのメモリ使用量のグラフの追加&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;修正：
&lt;ul&gt;
&lt;li&gt;Network Transport Bytes Receivedグラフに実際の送信量を表示&lt;/li&gt;
&lt;li&gt;Node Statsダッシュボードでいくつかのスレッドプールの不足&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;sense&#34;&gt;sense&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;追加：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mappingsをインデックスでオートコンプリートするしないの設定を可能に&lt;/li&gt;
&lt;li&gt;Cluster Reroute API&lt;/li&gt;
&lt;li&gt;Search APIのQuery Cacheパラメータ&lt;/li&gt;
&lt;li&gt;Analyze API&lt;/li&gt;
&lt;li&gt;Validate Query API&lt;/li&gt;
&lt;li&gt;Put Percolator API&lt;/li&gt;
&lt;li&gt;cluster.routing.allocation.*設定&lt;/li&gt;
&lt;li&gt;Function Scoreクエリのweightパラメータ&lt;/li&gt;
&lt;li&gt;Flush API&lt;/li&gt;
&lt;li&gt;Terms Aggregationのshow_term_doc_count_errorパラメータ&lt;/li&gt;
&lt;li&gt;Update API&lt;/li&gt;
&lt;li&gt;_geo_distanceソートオプション&lt;/li&gt;
&lt;li&gt;Significant Terms aggregationを1.4.0にアップデート&lt;/li&gt;
&lt;li&gt;Mapping APIにメタデータフィールドを追加&lt;/li&gt;
&lt;li&gt;Get Index API&lt;/li&gt;
&lt;li&gt;Scripted Metric Aggregation&lt;/li&gt;
&lt;li&gt;simple_query_stringクエリ&lt;/li&gt;
&lt;li&gt;More Like Thisクエリを1.4.0にアップデート&lt;/li&gt;
&lt;li&gt;has_childクエリ/フィルタのmin_childrenとmax_childrenオプション&lt;/li&gt;
&lt;li&gt;terms aggs/significant terms aggsのヒントオプション&lt;/li&gt;
&lt;li&gt;Mappings APIのtransform&lt;/li&gt;
&lt;li&gt;インデックスされたscriptとtemplate
* Geo Bounds aggregation&lt;/li&gt;
&lt;li&gt;Top Hits aggregation&lt;/li&gt;
&lt;li&gt;Terms aggregationのcollect_modeオプション&lt;/li&gt;
&lt;li&gt;Percentiles Rank aggregation&lt;/li&gt;
&lt;li&gt;Disk Threshold Allocator設定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;修正：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;URLオートコンプリートの挙動（プロトコルとホストのような組み合わせ）&lt;/li&gt;
&lt;li&gt;nested typeマッピングのinclude_in_parentとinclude_in_rootの不足&lt;/li&gt;
&lt;li&gt;Rangeフィルタでのgt、gte、lt、lte&lt;/li&gt;
&lt;li&gt;Existsフィルタのオートコンプリート&lt;/li&gt;
&lt;li&gt;Snapshot、Restore APIのリポジトリ設定の時オートコンプリートの失敗&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;いつものように、Elasticsearch Marvelを改善するために、フィードバックをお待ちしています。
&lt;a href=&#34;https://groups.google.com/forum/?fromgroups#!forum/elasticsearch&#34;&gt;ElasticsearchユーザML&lt;/a&gt;や&lt;a href=&#34;http://www.twitter.com/elasticsearch&#34;&gt;Twitter&lt;/a&gt;に質問や意見お送りください。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch 1.4.2および1.3.7リリース（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2014/12/18/elasticsearch-1-4-2-released-ja/</link>
      <pubDate>Thu, 18 Dec 2014 14:26:14 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/12/18/elasticsearch-1-4-2-released-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-3-and-1-3-8-released/&#34;&gt;elasticsearch 1.4.3 and 1.3.8 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日、&lt;strong&gt;Lucene 4.10.3&lt;/strong&gt;をベースにした&lt;strong&gt;Elasticsearch 1.4.3&lt;/strong&gt;と、&lt;strong&gt;セキュリティ&lt;/strong&gt;フィックスとバグフィックスリリースである、&lt;strong&gt;Elasticsearch 1.3.8&lt;/strong&gt;をリリースしました。
ダウンロードおよび変更リストはそれぞれ次のリンクからアクセスできます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-3-and-1-3-8-released/&#34;&gt;elasticsearch 1.4.3 and 1.3.8 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日、&lt;strong&gt;Lucene 4.10.3&lt;/strong&gt;をベースにした&lt;strong&gt;Elasticsearch 1.4.3&lt;/strong&gt;と、&lt;strong&gt;セキュリティ&lt;/strong&gt;フィックスとバグフィックスリリースである、&lt;strong&gt;Elasticsearch 1.3.8&lt;/strong&gt;をリリースしました。
ダウンロードおよび変更リストはそれぞれ次のリンクからアクセスできます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最新ステーブルリリース：&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-4-3&#34;&gt;Elasticsearch 1.4.3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;1.3.x系バグフィックス：&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-3-8&#34;&gt;Elasticsearch 1.3.8&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;過去のリリースに関するブログ（公式）はこちら。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1.4:&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-1-released/&#34;&gt;1.4.1&lt;/a&gt;,
&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-0-released/&#34;&gt;1.4.0&lt;/a&gt;, &lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-0-beta-released/&#34;&gt;1.4.0.Beta1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;1.3:&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-1-released/&#34;&gt;1.3.6&lt;/a&gt;,
&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-0-released/&#34;&gt;1.3.5&lt;/a&gt;, &lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-3-4-released/&#34;&gt;1.3.4&lt;/a&gt;, &lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-3-3-released/&#34;&gt;1.3.3&lt;/a&gt;, &lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-3-2-released/&#34;&gt;1.3.2&lt;/a&gt;, &lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-3-1-released/&#34;&gt;1.3.1&lt;/a&gt;, &lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-3-0-released/&#34;&gt;1.3.0&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;すべての変更については&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-4-2&#34;&gt;1.4.2のリリースノート&lt;/a&gt;および&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-3-7&#34;&gt;1.3.7のリリースノート&lt;/a&gt;をごらんください。
以下では、重要な変更について紹介します。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;bug-fixes&#34;&gt;bug fixes&lt;/h2&gt;
&lt;p&gt;Elasticsearchに対して広範囲にわたってランダムなテストを行っています。以下の問題を見つけ、修正するのに役立っています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プライマリシャードを持つnodeがレプリカシャードをプライマリから復旧している間に、リスタートした場合に、プライマリ上のトランザクションログが削除されデータをロスする(&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/pull/8917&#34;&gt;#8917&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;scriptインデックスが普及した場合に、ScriptService全体がデッドロック(&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/pull/8901&#34;&gt;#8901&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Index Writerのロックを強制的に解放することによるシャードの破損(&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/pull/8892&#34;&gt;#8892&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;パフォーマンス改善&#34;&gt;パフォーマンス改善&lt;/h2&gt;
&lt;p&gt;複雑な設定をもつ大きめのクラスタをもつユーザは、小さなスケールではわからない性能ボトルネックに直面します。
彼らの報告が次の改善をもたらす助けとなりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用可能なディスク空間に基づいてシャードの配置を決定する、disk allocation deciderの速度改善とクラスタリスタート後のリカバリ速度の改善(&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/pull/8803&#34;&gt;#8803&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;以前よりも高速な共有ファイルシステムでのSnapshot生成(&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/pull/8749&#34;&gt;#8749&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;不要なクラスタ状態変更の削減とそれによるネットワークトラフィックの削減およびリカバリの速度向上(&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/pull/8933&#34;&gt;#8933&lt;/a&gt;, &lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/pull/8413&#34;&gt;#8413&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;index stats APIはシャードリカバリによるブロックしない(&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/pull/8910&#34;&gt;#8910&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;http://www.elasticsearch.org/downloads/1-4-2&#34;&gt;Elasticsearch 1.4.2&lt;/a&gt;をダウンロードして、試してみてください。
そして、感想をTwitter(&lt;a href=&#34;https://twitter.com/elasticsearch&#34;&gt;@elasticsearch&lt;/a&gt;)などで教えて下さい。
また、問題がありましたら、&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues&#34;&gt;GitHub issues page&lt;/a&gt;で報告をお願いします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>JJUG ナイトセミナーでLuceneの簡単な紹介をしてきました。#JJUG</title>
      <link>https://blog.johtani.info/blog/2014/12/17/jjug-night-seminar-dec-2014/</link>
      <pubDate>Wed, 17 Dec 2014 18:41:54 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/12/17/jjug-night-seminar-dec-2014/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://jjug.doorkeeper.jp/events/18378&#34;&gt;「【東京】JJUG ナイト・セミナー「機械学習・自然言語処理特集！」12/17（水）開催」&lt;/a&gt;でLuceneの話をしてきました。
本当にごく簡単な入門です。
Luceneをさわるきっかけにしてもらえたら嬉しいです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;http://jjug.doorkeeper.jp/events/18378&#34;&gt;「【東京】JJUG ナイト・セミナー「機械学習・自然言語処理特集！」12/17（水）開催」&lt;/a&gt;でLuceneの話をしてきました。
本当にごく簡単な入門です。
Luceneをさわるきっかけにしてもらえたら嬉しいです。&lt;/p&gt;
&lt;p&gt;そのほかにも面白い話が聞けましたので、簡単ですがメモを。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;jjugの2014年振り返り&#34;&gt;JJUGの2014年振り返り&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;だいたい、毎月ナイトセミナーかCCCを開催&lt;/li&gt;
&lt;li&gt;イベント系に、のべ3100名が参加&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;java-でカジュアルにはじめる機械学習&#34;&gt;Java でカジュアルにはじめる機械学習&lt;/h2&gt;
&lt;h3 id=&#34;小宮-篤史さんスマートニュース株式会社&#34;&gt;小宮 篤史さん(スマートニュース株式会社)&lt;/h3&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://speakerdeck.com/komiya_atsushi/number-jjug-java-dekaziyuarunihazimeruji-jie-xue-xi&#34;&gt;#JJUG - Java でカジュアルにはじめる機械学習&lt;/a&gt;&lt;br&gt;
ブログ：&lt;a href=&#34;http://blog.k11i.biz/2014/12/jjug-java.html&#34;&gt;#JJUG ナイトセミナー「機械学習・自然言語処理特集！」で Java でカジュアルに機械学習する話をしてきました&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ガチの人は寝ててください。&lt;/li&gt;
&lt;li&gt;機械学習でできること
&lt;ul&gt;
&lt;li&gt;分類・識別&lt;/li&gt;
&lt;li&gt;予測・回帰&lt;/li&gt;
&lt;li&gt;パターンマイニング・アソシエーションルール&lt;/li&gt;
&lt;li&gt;クラスタリング&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;上2つは教師あり学習/下2つは教師なし学習&lt;/li&gt;
&lt;li&gt;データとしては、日構造では扱えないので、「特徴量」を抽出して「特徴ベクトル」を作って、処理をするのが機械学習&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;p&gt;Javaで使える機械学習&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Weka：とりあえず使ってみるならこれ？&lt;/li&gt;
&lt;li&gt;MLlib：Sparkで使われてる&lt;/li&gt;
&lt;li&gt;Mahout：オワコン？&lt;/li&gt;
&lt;li&gt;SAMOA：Stormの上で利用できる&lt;/li&gt;
&lt;li&gt;Jubatus：Javaクライアントあり。&lt;/li&gt;
&lt;li&gt;h2o：Deep learningをJavaでやるなら、これ。&lt;/li&gt;
&lt;li&gt;ほかにもあったけど、スライド見ていただければ。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;機械学習をはじめるのに使えるデータセット&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;UCI Machine learning repository&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Iris（アヤメデータ）は機械学習界のHello world&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wekaを使ったサンプルコード&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;sparkmllibではじめるスケーラブルな機械学習&#34;&gt;Spark/MLlibではじめるスケーラブルな機械学習&lt;/h2&gt;
&lt;h3 id=&#34;猿田-浩輔さん株式会社エヌティティデータ&#34;&gt;猿田 浩輔さん(株式会社エヌ・ティ・ティ・データ)&lt;/h3&gt;
&lt;p&gt;スライド：（後日、リンクがあれば更新予定）&lt;/p&gt;
&lt;p&gt;* Spark+MLlibを語る上で外せない話題&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Hadoopとの違い？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;まずはHadoopの話&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;HadoopによるK-meansのデモ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hadoopの問題点に対するSparkの解決策&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Spark 1.0系からJava8で書ける&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;QA：&lt;/p&gt;
&lt;p&gt;Q： データをキャッシュできるという話でしたが、キャッシュするということは、ジョブが途中で失敗した場合は最初からやり直しになるのでしょうか？
A： キャッシュしたデータが残っている場合は、途中から再開出来ます。キャッシュしたデータを持ったマシンがこけたら、最初からやり直しです。&lt;/p&gt;
&lt;h2 id=&#34;luceneと日本語の検索&#34;&gt;Luceneと日本語の検索&lt;/h2&gt;
&lt;h3 id=&#34;自分&#34;&gt;自分&lt;/h3&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://speakerdeck.com/johtani/lucenetori-ben-yu-falsejian-suo&#34;&gt;Luceneと日本語の検索&lt;/a&gt;
サンプルのリポジトリ：&lt;a href=&#34;https://github.com/johtani/jjug-example&#34;&gt;jjug-example&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;自然言語処理にからめて何か話をしてくださいと話を受けていたのですが、自然言語処理については「形態素解析」くらいしか出てこなかったですけど。。。
Luceneがどんなものかを超概要で話をしてみました。少しでもLuceneがどんなものかをわかってもらえたら嬉しいです。&lt;/p&gt;
&lt;p&gt;もっと詳しく知りたい方は、スライドにある参考資料などを見ていただければと。&lt;/p&gt;
&lt;p&gt;Javaで書くのもいいんですが、もっと簡単に検索したい場合はElasticsearchを使うのが便利ですよ！で締めくくりたかったのですが、発表では失敗してしまいました。。。
Elasticsearchの起動からデータ登録、検索までは&lt;a href=&#34;https://speakerdeck.com/johtani/elasticsearch-and-kibana&#34;&gt;こちらのスライド&lt;/a&gt;を見ていただければ簡単さがわかると思います。&lt;/p&gt;
&lt;p&gt;また、Kuromojiを利用した時に、Tokenizerなどが出力するTokenの品詞情報を見たい場合に便利な&lt;a href=&#34;https://github.com/johtani/elasticsearch-extended-analyze&#34;&gt;Elasticsearch用プラグイン&lt;/a&gt;も作っています。
こちらも、Elasticsearchと一緒に使ってみてください。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;機械学習に関していろんなツールがあるのだなぁと。
懇親会でもちょっと話しましたが、アルゴリズムの選定とか、アルゴリズムに適したデータの作成など、前処理のノウハウとかが大変そうだなぁといつも思います。
機械学習はいつもぼやーっとしか理解してないので。。。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/channel/UCZ5gDYmqI0tOeg-fEkCD2CQ&#34;&gt;JJUGさんはYouTubeの動画&lt;/a&gt;もあるようなので、過去の面白そうなセミナーも合わせてみてみると面白いと思います。&lt;/p&gt;
&lt;p&gt;毎度のことですが、なんでも良いので、発表した後のフィードバックをいただけるとうれしいです。
今後の励みや改善につながるので。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Luceneと日本語の検索</title>
      <link>https://blog.johtani.info/presentation/2014/lucenetori-ben-yu-falsejian-suo/</link>
      <pubDate>Wed, 17 Dec 2014 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2014/lucenetori-ben-yu-falsejian-suo/</guid>
      <description>&lt;p&gt;2014年12月のJJUG ナイトセミナーで使用したスライドです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;2014年12月のJJUG ナイトセミナーで使用したスライドです。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>コーヒーブレイク</title>
      <link>https://blog.johtani.info/blog/2014/12/16/a-coffee-break/</link>
      <pubDate>Tue, 16 Dec 2014 12:01:32 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/12/16/a-coffee-break/</guid>
      <description>&lt;p&gt;たまには、他愛のないブログを。&lt;/p&gt;
&lt;p&gt;仕事しながら、コーヒーを飲んでます。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;最近は、サムライズムさんのオフィスに入り浸って仕事してます。
オフィスには、コーヒーミル付きのコーヒーメーカーがあるんです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;たまには、他愛のないブログを。&lt;/p&gt;
&lt;p&gt;仕事しながら、コーヒーを飲んでます。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;最近は、サムライズムさんのオフィスに入り浸って仕事してます。
オフィスには、コーヒーミル付きのコーヒーメーカーがあるんです。&lt;/p&gt;
&lt;p&gt;↓こんな感じ（現物は違うけど）&lt;/p&gt;
&lt;iframe src=&#34;http://rcm-fe.amazon-adsystem.com/e/cm?t=johtani-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=B00O7HUQWE&amp;nou=1&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr&#34; style=&#34;width:120px;height:240px;&#34; scrolling=&#34;no&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34; frameborder=&#34;0&#34;&gt;&lt;/iframe&gt;
&lt;p&gt;で、近所のコーヒー問屋で豆を買ってきてます。
そこのマスターに、いつもサジェストされるんです。&lt;/p&gt;
&lt;p&gt;「この豆は、日が経つにつれて、細かく挽いて飲んでください。」&lt;/p&gt;
&lt;p&gt;「この豆は、細かめに挽いて飲むのがオススメです。」&lt;/p&gt;
&lt;p&gt;などなど。
オススメされるんですが、全自動のコーヒーメーカーは残念ながらここまでやってくれません。&lt;/p&gt;
&lt;p&gt;ということで、手動のミルを買ってみました。家でも使えるし。&lt;/p&gt;
&lt;iframe src=&#34;http://rcm-fe.amazon-adsystem.com/e/cm?t=johtani-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=B0044ZA066&amp;nou=1&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr&#34; style=&#34;width:120px;height:240px;&#34; scrolling=&#34;no&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34; frameborder=&#34;0&#34;&gt;&lt;/iframe&gt;
&lt;p&gt;ちょっと考え事しながらとか、頭の切り替えに、ミルを回すのもいいかなと。
気持ち、美味しいコーヒーな気がします（気のせいかも）&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Logstashプラグインのエコシステムの変更（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2014/12/14/plugin-ecosystem-changes/</link>
      <pubDate>Sun, 14 Dec 2014 01:00:40 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/12/14/plugin-ecosystem-changes/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/plugin-ecosystem-changes/&#34;&gt;exciting logstash plugin ecosystem changes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Logstash 1.5.0 Beta 1(&lt;a href=&#34;http://www.elasticsearch.org/overview/logstash/download/&#34;&gt;お試しはこちら&lt;/a&gt;)のリリースで、
プラグインのインストール、管理、公開の方法を変更しています。
ユーザやコミュニティからフィードバックをもらいました。
その目的は、プラグインの利用や開発をより簡単にすることです。
このプロジェクトは始まったばかりです。プラグインのコミュニティを探し、
共有するためのワンストップソリューションを提供するこのアイデアを改善していく予定です。
このブログで、この決定を行った理由を説明し、新しいワークフローをと今後のロードマップを説明します。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/plugin-ecosystem-changes/&#34;&gt;exciting logstash plugin ecosystem changes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Logstash 1.5.0 Beta 1(&lt;a href=&#34;http://www.elasticsearch.org/overview/logstash/download/&#34;&gt;お試しはこちら&lt;/a&gt;)のリリースで、
プラグインのインストール、管理、公開の方法を変更しています。
ユーザやコミュニティからフィードバックをもらいました。
その目的は、プラグインの利用や開発をより簡単にすることです。
このプロジェクトは始まったばかりです。プラグインのコミュニティを探し、
共有するためのワンストップソリューションを提供するこのアイデアを改善していく予定です。
このブログで、この決定を行った理由を説明し、新しいワークフローをと今後のロードマップを説明します。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;プラグインがあります&#34;&gt;プラグインがあります！&lt;/h2&gt;
&lt;p&gt;Logstashは、プラグイン（input、filter、output、codec）が豊富にあります。
これらは、Elasticsearchにより開発されたものと、コミュニティからコントリビュートされたものです。
Logstashの主な特長の1つは、これらのプラグインの有効性と動作を拡張するプラグインを追加するのが簡単なことです。
現在、165以上のプラグインがエコシステムにあり、これらは、2つのプロジェクトに分かれています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;logstash-core&lt;/code&gt;は最もよく使われるプラグインで、Logstashにデフォルトで含まれます&lt;/li&gt;
&lt;li&gt;&lt;code&gt;logstash-contrib&lt;/code&gt;はコミュニティにより開発されたプラグインを含み、別途ダウンロードできます&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;新プラグインエコシステムの変更&#34;&gt;新プラグインエコシステムの変更&lt;/h2&gt;
&lt;p&gt;1.5.0では、全てのプラグインは、Logstashコアから分離され、rubygemsを使って個別にパッケージングされます。
rubygemsを選択したのは、依存関係のあるライブラリの配布とパッケージングがパワフルで一般的なものだからです。
さらに、&lt;a href=&#34;http://rubygems.org/&#34;&gt;rubygems.org&lt;/a&gt;プラットフォームは配布や探索に影響があります。
また、Logstashにプラグインをインストール、アップデート、削除するのが簡単な基盤も追加しました。
&lt;code&gt;contrib&lt;/code&gt;プロジェクトは徐々に終了します。全てのプラグインは個別のプロジェクトになります。&lt;/p&gt;
&lt;h2 id=&#34;プラグインエコシステム変更の理由&#34;&gt;プラグインエコシステム変更の理由&lt;/h2&gt;
&lt;p&gt;多数のプラグインをもっていると、配布と公開に関して難題が出てきます。
私たちが変更するに至った理由は次のようなものです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;現在は、プラグインの更新に伴い、Logstashの新バージョンのリリースが必要&lt;/li&gt;
&lt;li&gt;開発者は、Logstashのリリース間隔とは別に、新バージョンをリリースをしたい&lt;/li&gt;
&lt;li&gt;プラグイン開発者は、外部依存を記述できるようにしたい&lt;/li&gt;
&lt;li&gt;Logstashコアの配布パッケージのダウンロードサイズを小さくし、ユーザは必要なプラグインのみインストール&lt;/li&gt;
&lt;li&gt;&lt;code&gt;logstash-contrib&lt;/code&gt;を1つのリポジトリとして管理するのは難しい&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;詳細&#34;&gt;詳細：&lt;/h2&gt;
&lt;h3 id=&#34;ソースコードの場所&#34;&gt;ソースコードの場所&lt;/h3&gt;
&lt;p&gt;Logstashのソースコードは、今後も&lt;a href=&#34;https://github.com/elasticsearch/logstash&#34;&gt;現在のGitHubのリポジトリ&lt;/a&gt;のままです。
しかし、プラグインに関するコードやテストコードは含まなくなります。
この分離により、個別のプラグインの改善と同様にコアの改善に集中できます。
これにより、Logstashプロジェクトの全体の品質も向上します。&lt;/p&gt;
&lt;p&gt;全プラグインのソースコードは、新しいGitHub organization、&lt;a href=&#34;https://github.com/logstash-plugins&#34;&gt;logstash-plugins&lt;/a&gt;にて管理します。
各プラグインは個別のリポジトリとして、ここに配置されます。
一見すると、これはメンテナンスが難しくなるように思えます。しかし、テスト、Issue、依存関係を明確にすることができます。
私たちの目的は、テスト、ドキュメント、gemの公開の自動化であり、これを簡単にするためのツールを追加します。&lt;/p&gt;
&lt;p&gt;しかし、プラグインの開発者はプラグインのソースコードソースコードをlogstash-pluginsに置く必要はありません。
ー コミュニティで利用可能にするために、&lt;a href=&#34;http://rubygems.org/&#34;&gt;rubygems.org&lt;/a&gt;でそれを公開するだけで良いです。&lt;/p&gt;
&lt;h2 id=&#34;ワークフロー&#34;&gt;ワークフロー&lt;/h2&gt;
&lt;p&gt;ここで、新プラグインエコシステムのやりとり/ワークフローについて、いくつかの観点から説明します。&lt;/p&gt;
&lt;h3 id=&#34;logstashユーザ&#34;&gt;logstashユーザ:&lt;/h3&gt;
&lt;p&gt;ユーザは、これまでのリリース同様にLogstashのバイナリをダウンロードします。
Logstash 1.5.0は、1.4.2でパッケージされていたプラグインと同等のものが含まれています。
新しいシステムに簡単に移行できるようにです。
そして、ユーザは、最初のデプロイの後に、Logstashプラグインのをインストール、アップグレードできるようになります。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$LS_HOME/bin/plugin&lt;/code&gt;スクリプトがプラグイン操作に関連するコマンドになります。&lt;/p&gt;
&lt;h5 id=&#34;プラグインのインストール&#34;&gt;プラグインのインストール&lt;/h5&gt;
&lt;p&gt;プラグインのほとんどはgemとして&lt;a href=&#34;http://rubygems.org/&#34;&gt;rubygems.org&lt;/a&gt;にアップロードされます。
例えば、もしユーザが&lt;a href=&#34;https://github.com/logstash-plugins/logstash-output-kafka&#34;&gt;Apache Kafka outputプラグイン&lt;/a&gt;をインストールする場合、次のコマンドを実行します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bin/plugin install logstash-output-kafka
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;または、ファイルをダウンロード済みの場合は次のコマンドとなります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bin/plugin install /path/to/logstash-output-kafka-1.0.0.gem
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;プラグインの削除&#34;&gt;プラグインの削除&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bin/plugin uninstall logstash-output-kafka
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;1つまた全プラグインのアップデート&#34;&gt;1つまた全プラグインのアップデート&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bin/plugin update
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bin/plugin update logstash-output-kafka
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;プラグインのリストアップ&#34;&gt;プラグインのリストアップ&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bin/plugin list
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bin/plugin list elasticsearch ( List all plugins containing a name )
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bin/plugin list --group output ( list all outputs )
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;ドキュメント&#34;&gt;ドキュメント&lt;/h4&gt;
&lt;p&gt;プラグインが個別に管理されても、&lt;a href=&#34;http://www.elasticsearch.org/guide/en/logstash/current/index.html&#34;&gt;全プラグインのドキュメントは1カ所&lt;/a&gt;です。&lt;/p&gt;
&lt;h3 id=&#34;logstash-plugin開発者&#34;&gt;logstash plugin開発者:&lt;/h3&gt;
&lt;p&gt;プラグイン開発者と作者は、Logstashエコシステムのためにプラグインを公開することができます。
プラグインは、gemやJavaライブラリの依存関係を宣言できます。
より重要なのは、Logstashのリリース間隔に関係なく、プラグインの改善版をリリースできます。&lt;/p&gt;
&lt;p&gt;Rubygemsテクノロジはパッケージングシステム、依存関係管理、ホスティングのために選択されてきました。
Rubyのgemを公開することに慣れている開発者は、Logstashプラグインを簡単に公開することができます。
Elasticsearchはこれらの機能に関して開発者を支援するために、ツールを提供、メンテナンスします。&lt;/p&gt;
&lt;h4 id=&#34;開発およびローカルでのテスト&#34;&gt;開発およびローカルでのテスト&lt;/h4&gt;
&lt;p&gt;JRuby &lt;code&gt;1.7.16&lt;/code&gt;がプラグインを開発するための唯一の前提条件です。
プラグインにパッチを提供するのは以前と同様です。
例えば、&lt;code&gt;logstash-output-kafka&lt;/code&gt;にパッチを送るのは次のようになります。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;git clone https://github.com/logstash-plugins/logstash-output-kafka.git&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;変更&lt;/li&gt;
&lt;li&gt;プラグインをローカルでテスト
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bundle install&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bundle exec rspec&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Logstashの他のバージョンもしくはローカルでテストする場合、Gemfileを編集し、    次のように別のロケーションを加えます。&lt;code&gt;gem &amp;quot;logstash&amp;quot;, :github =&amp;gt; &amp;quot;elasticsearch/logstash&amp;quot;, :ref =&amp;gt; &amp;quot;master&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;新しいPull Requestを&lt;code&gt;logstash-output-kafka&lt;/code&gt;に対して作成&lt;/li&gt;
&lt;li&gt;コミュニティでコードレビューを受け、Elasticsearchがパッチを受け入れ&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;バージョン&#34;&gt;バージョン&lt;/h4&gt;
&lt;p&gt;バージョン情報は、それぞれのプラグインの&lt;code&gt;.gemspec&lt;/code&gt;で管理します。
例えば、Apache Kafka outputのgemspecは&lt;a href=&#34;https://github.com/logstash-plugins/logstash-output-kafka/blob/master/logstash-output-kafka.gemspec&#34;&gt;こちら&lt;/a&gt;です。
バージョニングは&lt;a href=&#34;http://semver.org/&#34;&gt;semantic versioning&lt;/a&gt;のルールに従い、
Logstashのバージョニングとは別に、プラグインの開発者によって管理されます。
Logstash 1.5.0がリリースされると、マイルストーン1のプラグインはバージョン1.0.0となり、マイルストーン2のプラグインはバージョン2.0.0となるでしょう。&lt;/p&gt;
&lt;h4 id=&#34;公開&#34;&gt;公開&lt;/h4&gt;
&lt;p&gt;開発者が変更を加えプラグインを公開したいと思った時、&lt;code&gt;.gemspec&lt;/code&gt;のバージョン番号を変更します。
全テストが成功した時、Elasticsearchはrubygems.orgにプラグインを手動で公開します。
もし、テストが失敗した場合、プラグインは公開されません。
長期的には、プラグインの公開の自動化を行いたいと思っています。
この変更は新しいため、公開の自動化を提供する前に、自動化についてより理解し、プラグインのテスト基盤を改良したいと思っています。&lt;/p&gt;
&lt;h4 id=&#34;issue&#34;&gt;Issue&lt;/h4&gt;
&lt;p&gt;Issueは、各プラグインのGitHubリポジトリに対してオープンなければなりません。
Logstashコアのリポジトリは、コアのパイプラインや共通的な機能に関連するIssueについて扱います。&lt;/p&gt;
&lt;h4 id=&#34;ドキュメント-1&#34;&gt;ドキュメント&lt;/h4&gt;
&lt;p&gt;プラグインのドキュメントはソースコード自体から生成されます。
それぞれのプラグインのドキュメントは、そのプラグインのリポジトリに含まれます。
Elasticsearchは
&lt;a href=&#34;http://www.elasticsearch.org/guide&#34;&gt;elasticsearch.org/guide&lt;/a&gt;に全てのプラグインのドキュメントを集め生成できる基盤を提供します。&lt;/p&gt;
&lt;h4 id=&#34;移行&#34;&gt;移行&lt;/h4&gt;
&lt;p&gt;全ての新しいpull requestとissueは&lt;a href=&#34;https://github.com/logstash-plugins&#34;&gt;logstash-plugin&lt;/a&gt; organisation配下にある各プラグインのリポジトリに対してオープンする必要があります。&lt;/p&gt;
&lt;h5 id=&#34;すでにあるprはどうすれば良いですか&#34;&gt;すでにあるPRはどうすれば良いですか？&lt;/h5&gt;
&lt;p&gt;気にしないでください。すでにあるpull requestは開発者によって移行する必要はありません。
LogstashチームがLogstashコアリポジトリに対してのPRを、個別の関連するプラグインのリポジトリに対してマージします。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git clone … # clone the specific plugin repo
# now apply the patch
curl -s https://github.com/elasticsearch/logstash/pull/XXXX | git am --3way
git push
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Note:このプロセスはすでにあるPRに対してgit historyを管理します&lt;/strong&gt;&lt;/p&gt;
&lt;h5 id=&#34;github-issue&#34;&gt;GitHub Issue&lt;/h5&gt;
&lt;p&gt;現在、LogstashリポジトリにオープンされているIssueは、それぞれのプラグインのリポジトリに移行します。
Logstashチームがgithub.com APIを利用してこの処理を自動的に行います。
安心してください。私たちが個別のプラグインに対する既存のIssueを移行します。&lt;/p&gt;
&lt;h2 id=&#34;今後のロードマップ&#34;&gt;今後のロードマップ&lt;/h2&gt;
&lt;p&gt;これは、最初のステップであり、これらの変更は、ユーザや開発者に対してエコシステムをよりよくするために、
しっかりとした基盤を提供します。&lt;/p&gt;
&lt;p&gt;短期的には、開発者のためにpull requestのフィードバックでテスト自動化を提供する基盤を追加していきます。
プラグインリポジトリのブートストラップや管理のためのツールも提供していきます。&lt;/p&gt;
&lt;p&gt;長期的には、すべてのLogstashプラグインを探し、公開するためのコミュニティポータルを提供したいと思っています。
このアイデアは、Puppet ForgeやAWS marketplaceのようなものです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.elasticsearch.org/blog/logstash-1-5-0-beta1-released/&#34;&gt;Logstash 1.5.0 Beta 1&lt;/a&gt;をリリースし、これは新しいエコシステムを提供します。
ぜひ、試していただき、これらの変更に関して感じたことを教えてください。
あなたのフィードバック(&lt;a href=&#34;http://twitter.com/elasticsearch&#34;&gt;Twitter&lt;/a&gt;もしくは&lt;a href=&#34;https://github.com/elasticsearch/logstash/issues/new&#34;&gt;GitHub&lt;/a&gt;)はとても貴重です！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Logstash 1.5.0 Beta1リリース(日本語訳)</title>
      <link>https://blog.johtani.info/blog/2014/12/12/logstash-1-5-0-beta1-released-ja/</link>
      <pubDate>Fri, 12 Dec 2014 17:17:26 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/12/12/logstash-1-5-0-beta1-released-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/logstash-1-5-0-beta1-released/&#34;&gt;logstash 1.5.0.beta1 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Logstash 1.5.0 Beta1をリリースしました。&lt;a href=&#34;http://www.elasticsearch.org/overview/logstash/download/&#34;&gt;こちらのページ&lt;/a&gt;からダウンロードできます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note: ベータリリースです。本番環境では使用しないでください。&lt;/strong&gt;&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/logstash-1-5-0-beta1-released/&#34;&gt;logstash 1.5.0.beta1 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Logstash 1.5.0 Beta1をリリースしました。&lt;a href=&#34;http://www.elasticsearch.org/overview/logstash/download/&#34;&gt;こちらのページ&lt;/a&gt;からダウンロードできます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note: ベータリリースです。本番環境では使用しないでください。&lt;/strong&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;150の主な変更点は&#34;&gt;1.5.0の主な変更点は？&lt;/h2&gt;
&lt;p&gt;1.5.0の主なテーマはプラグイン管理、パフォーマンス改善、&lt;a href=&#34;http://kafka.apache.org/&#34;&gt;Apache Kafka&lt;/a&gt;インテグレーションです。Logstashの主な特徴の1つは
プラグインを利用できることであり、パイプラインの動作を拡張するためにプラグインを追加するのが簡単なことです。
このリリースで、プラグインの開発、管理、公開がより簡単になります。
また、Logstashの速度をより良くしたため、より多くのデータを短時間に処理することができます。
興味ありませんか？では、詳細を見ていきましょう。&lt;/p&gt;
&lt;h2 id=&#34;plugin-ecosystemの変更&#34;&gt;plugin ecosystemの変更&lt;/h2&gt;
&lt;p&gt;Logstashは165ものプラグイン(inputs、filters、outputs、codecs)を持っており、
これらはElasticsearchとコミュニティからのコントリビュートで開発されています。
多くのプラグインを管理することは、使いやすさと素早さの間のトレードオフがあります。
Logstashの全てのプラグインをまとめることは使いやすさがある一方、プラグインの更新を取り込むために
Logstashの新しいリリースを待ってもらうことになります。
Logstashからプラグインを分離して個別に配布する場合、更新は簡単になりますが、使いやすさ（特に新しいユーザに）に影響が出ます。&lt;/p&gt;
&lt;p&gt;私たちは、プロジェクトを前進させるために、これらのバランスをとることを考えました。
これまで、全ての利用可能なプラグインは’core’と&amp;rsquo;contrib&amp;rsquo;の2つに分割していました。
&amp;lsquo;core&amp;rsquo;にあるよく使われるプラグインは、Logstashに含めていました。
コミュニティによりコントリビュートされたプラグインは&amp;rsquo;contrib&amp;rsquo;パッケージとして分離して配布していました。
1.5.0のリリースで、ユーザに対してより良いプラグイン管理をできるように変更しました。
全てのプラグインは、それ自身によるパッケージに移行しました。
パッケージングフレームワークとしてrubygemsを使い、&lt;a href=&#34;http://rubygems.org/&#34;&gt;rubygem.org&lt;/a&gt;経由でこれらのプラグインを配布、公開します。
また、Logstashにプラグインのインストール、更新、削除を簡単にするための構造も追加しました。&lt;/p&gt;
&lt;p&gt;例えば、S3 output pluginをインストールするには、以下のコマンドを実行します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$LS_HOME/bin/plugin install logstash-output-s3
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;それだけです！Logstashがgemと依存するgemをrubygems.orgからダウンロードし、インストールします。
あなたは、S3にデータを送ることができるようになります。&lt;/p&gt;
&lt;p&gt;ダウンロード可能なLogstashリリースはプラグインをまだ多く含んでいますが、
いつでも、個別にプラグインをアップグレードし、インストールすることができます。
プラグインエコシステムの変更に関する詳細のブログ記事をお待ち下さい。&lt;/p&gt;
&lt;h2 id=&#34;パフォーマンス改善&#34;&gt;パフォーマンス改善&lt;/h2&gt;
&lt;p&gt;Logstash 1.5.0はより高速になっています。パフォーマンスが改善された2カ所について説明します。&lt;/p&gt;
&lt;h3 id=&#34;grok-filter&#34;&gt;grok filter&lt;/h3&gt;
&lt;p&gt;Grok filterはLogstashで、構造化データを抽出するためにパターンを記述するのに使われます。
本リリースで、人気のある幾つかのパターンのgrok filterのスループットを100%に改善しました。
言い換えると、grok filterを使うときに、Logstashを通してより多くのデータを処理することができます。&lt;/p&gt;
&lt;p&gt;私たちのベンチマークテストで、1.5.0と1.4.2のスループットの比較をしました。
利用したデータは690万件のApache Webアクセスlogで、&lt;code&gt;COMBINEDAPACHELOG&lt;/code&gt;のgrok patternです。
1.5.0で、スループットは34,000 event per sec(eps)から50,000 epsに増加しました。
両方のテストを8コアのマシンでLogstashで8つのワーカーを実行しました。
これらのテストで、一つのgrok filterを実行し、
&lt;code&gt;stdin&lt;/code&gt;と&lt;code&gt;stdout&lt;/code&gt;を使ったパイプラインでイベントのスループットを計測しました。
全体的なパフォーマンスは、様々なハードウェアやLogstashのコンフィグによって変化することに注意してください。&lt;/p&gt;
&lt;h3 id=&#34;json-serialization--deserialization&#34;&gt;json serialization / deserialization&lt;/h3&gt;
&lt;p&gt;JSONのシリアライズ/でシリアライズを&lt;a href=&#34;https://github.com/guyboertje/jrjackson&#34;&gt;JrJackson&lt;/a&gt;ライブラリを利用して実装しました。
これにより、100%以上のスループットの改善がありました。
先ほど説明したパフォーマンステストにおいて、1.3KBのサイズの500,00 JSONイベントを送信し、
16,000 epsから30,000 epsにスループットが改善しました。
45,000サイズのイベントで、850 epsから3500 epsにスループットが増加しました。
すばらしいです。&lt;/p&gt;
&lt;h2 id=&#34;apache-kafka-integration&#34;&gt;apache kafka integration&lt;/h2&gt;
&lt;p&gt;いまでは、Apache Kafkaが大規模スケールデータ処理システムでよく利用されます。
Logstashの配備のスケーリングにおいて、Kafkaもまた、shippingインスタンスとindexingインスタンス間の
データを保存するための中間メッセージバッファとして使うことができます。&lt;/p&gt;
&lt;p&gt;1.5.0で、Logstash Kafkaのinputとoutputのプラグインのビルトインサポートを追加しました。
これは、&lt;a href=&#34;https://github.com/joekiller/logstash-kafka&#34;&gt;Joseph Lawson&lt;/a&gt;によって最初に開発されました。
私たちは、これらのプラグインにインテグレーションテストとドキュメントを追加することにより改良し、
新しいKafkaの機能を開発し続けます。
また、&lt;a href=&#34;http://avro.apache.org/&#34;&gt;Apache Avro&lt;/a&gt; codecを追加することで、Kafkaに保存されたイベントを
簡単に取得でき、ELKスタックを使ってそれらを解析できるようにしました。&lt;/p&gt;
&lt;p&gt;Kafka inputを追加するのは次のコマンドです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$LS_HOME/bin/plugin install logstash-input-kafka
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Kafka outputは次のコマンドです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$LS_HOME/bin/plugin install logstash-output-kafka
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;セキュリティに関する改善&#34;&gt;セキュリティに関する改善&lt;/h2&gt;
&lt;p&gt;認証と経路暗号化のサポートを追加し、Elasticsearchのoutput、input、filterのセキュリティを改良しました。
例えば、HTTPプロトコルでSSL/TLSにより暗号化を有効にでき、
HTTPベーシック認証をユーザ名とパスワードをリクエストに与えることで設定できます。
これらの機能は、時期にリリースされる&lt;a href=&#34;http://www.elasticsearch.org/overview/shield/&#34;&gt;Elasticsearch Shield&lt;/a&gt;セキュリティプロダクトとLogstashを統合できます。&lt;/p&gt;
&lt;h2 id=&#34;ドキュメント&#34;&gt;ドキュメント&lt;/h2&gt;
&lt;p&gt;これまで、Logstashのドキュメントは&lt;a href=&#34;http://logstash.net/&#34;&gt;logstash.net&lt;/a&gt;に置いてあり、
他のELKスタックと一緒に動かす時に、情報を探すのが厄介でした。
1.5.0および、今後のバージョンのドキュメントはelasticsearch.orgの&lt;a href=&#34;http://www.elasticsearch.org/guide/en/logstash/current/index.html&#34;&gt;Logstash Guide&lt;/a&gt;に移行します。
この移行で&lt;a href=&#34;http://elasticsearch.org/guide&#34;&gt;elasticsearch.org/guide&lt;/a&gt;にELKスタックを利用、
学習するためにドキュメントが1つになりました。
このベータリリースのイテレーションで、私たちはプレゼンテーションとドキュメントの品質を改善することに活発に取り組んでいきます。
(過去のLogstashのドキュメントの全てはいままでの&lt;a href=&#34;http://logstash.net/docs/1.4.2/&#34;&gt;logstash.net&lt;/a&gt;で引き続き公開していく予定です。)&lt;/p&gt;
&lt;h2 id=&#34;バグフィックスと改善&#34;&gt;バグフィックスと改善&lt;/h2&gt;
&lt;p&gt;ここまでの新しい機能に加えて、Logstash 1.5.0では、多くのバグフィックスと多くの機能改善があります。
ここで、これらのいくつかを紹介します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;出力しない&amp;rsquo;metadata&amp;rsquo;をイベントに格納可能に。これは、例えば、date filterに使う中間フィールドのために必要。(&lt;a href=&#34;https://github.com/elasticsearch/logstash/issues/1834&#34;&gt;#1834&lt;/a&gt;,&lt;a href=&#34;https://logstash.jira.com/browse/LOGSTASH-1798&#34;&gt; #LOGSTASH-1798&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;HTTPを利用しているときのファイルデスクリプタリークの修正。Logstashがストールするのを防ぎ、OOMエラーからクラッシュするケースも防ぎます。(&lt;a href=&#34;https://github.com/elasticsearch/logstash/issues/1604&#34;&gt;#1604&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Twitter input:&lt;code&gt;full_tweet&lt;/code&gt;オプションの追加、Twitter rate limitingエラーのハンドリング(&lt;a href=&#34;https://github.com/elasticsearch/logstash/issues/1471&#34;&gt;#1471&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;イベントを生成するfilter(multiline、clone、split、metrics)により、
後続の条件文にこれらのイベントを正しく伝搬(&lt;a href=&#34;https://github.com/elasticsearch/logstash/issues/1431&#34;&gt;#1431&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Elasticsearch output:Logstashはデフォルトで&lt;code&gt;message.raw&lt;/code&gt;フィールドを作成しない。messageフィールドはElasticsearch
により&lt;code&gt;not_analyzed&lt;/code&gt;でマルチフィールドとして追加される。マルチフィールドはディスクスペースが2倍必要だが、利点がない。&lt;/li&gt;
&lt;li&gt;bin/logstashの複数のサブコマンドを除去(&lt;a href=&#34;https://github.com/elasticsearch/logstash/issues/1797&#34;&gt;#1797&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらの機能、改善、バグフィックスについては、Logstash 1.5.0.Beta1 の&lt;a href=&#34;https://github.com/elasticsearch/logstash/blob/master/CHANGELOG&#34;&gt;changelog&lt;/a&gt;をごらんください。&lt;/p&gt;
&lt;h2 id=&#34;試してみてください&#34;&gt;試してみてください！&lt;/h2&gt;
&lt;p&gt;ぜひ、Logstash 1.5.0 Beta 1をダウンロードして試してみてください。
そして、感想をTwitter(&lt;a href=&#34;https://twitter.com/elasticsearch&#34;&gt;@elasticsearch&lt;/a&gt;)などで教えて下さい。
また、問題がありましたら、&lt;a href=&#34;https://github.com/elasticsearch/logstash/issues&#34;&gt;GitHub issues page&lt;/a&gt;で報告をお願いします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>2014年のElasticsearch</title>
      <link>https://blog.johtani.info/blog/2014/12/01/about-elasticsearch-in-2014/</link>
      <pubDate>Mon, 01 Dec 2014 18:05:48 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/12/01/about-elasticsearch-in-2014/</guid>
      <description>&lt;p&gt;早いもので、師走です。今年もあと少しとなりました。ということで、Advent Calendarの季節が始まりました。&lt;/p&gt;
&lt;p&gt;この記事は&lt;a href=&#34;http://qiita.com/advent-calendar/2014/elasticsearch&#34;&gt;Elasticsearch Advent Calndar 2014&lt;/a&gt;の1日目のエントリです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;早いもので、師走です。今年もあと少しとなりました。ということで、Advent Calendarの季節が始まりました。&lt;/p&gt;
&lt;p&gt;この記事は&lt;a href=&#34;http://qiita.com/advent-calendar/2014/elasticsearch&#34;&gt;Elasticsearch Advent Calndar 2014&lt;/a&gt;の1日目のエントリです。&lt;/p&gt;
&lt;p&gt;1日目ということで、簡単に今年の変遷を振り返りつつ、今年導入された新機能についてピックアップしてみようかと思います。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;10リリースlucene-460&#34;&gt;1.0リリース(Lucene 4.6.0)&lt;/h2&gt;
&lt;p&gt;今年一番の目玉と思いますが、1月にRCが公開されて、1.0.0が2月にリリースされました。
（ElasticSearch Serverの翻訳が昨年末に終わってレビューをしていた段階での発表だったので個人的にはきついタイミングでした）
1.0の主な変更点はこちら。&lt;/p&gt;
&lt;h3 id=&#34;elasticsearchsが小文字に&#34;&gt;Elasticsearch（Sが小文字に）&lt;/h3&gt;
&lt;p&gt;1.0からSが小文字になりました。(&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues/4634&#34;&gt;#4634&lt;/a&gt;)
0.90以前のバージョンについては、Sが大文字になっています。
ややこしいですが、今年の3月に出版された黒い&lt;a href=&#34;http://www.amazon.co.jp/dp/4048662023/ref=as_sl_pc_tf_lc?tag=johtani-22&amp;amp;camp=243&amp;amp;creative=1615&amp;amp;linkCode=as1&amp;amp;creativeASIN=4048662023&amp;amp;adid=0YAE2J8RE36SX7N3R06Z&amp;amp;&amp;amp;ref-refURL=http%3A%2F%2Fblog.johtani.info%2F&#34;&gt;ElasticSearch Server日本語版&lt;/a&gt;は原著が0.20で日本語版にするタイミングで0.90に対応しました。
このため、こちらの書籍のタイトルはSが大文字となっています。
（なお、&lt;a href=&#34;https://www.packtpub.com/big-data-and-business-intelligence/elasticsearch-server-second-edition&#34;&gt;原著の2nd Edition&lt;/a&gt;は小文字になっています）&lt;/p&gt;
&lt;h3 id=&#34;snapshotrestoreの導入とgatewayの廃止&#34;&gt;Snapshot/Restoreの導入とGatewayの廃止&lt;/h3&gt;
&lt;p&gt;0.90以前のバージョンでは、&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/0.90/modules-gateway.html#modules-gateway&#34;&gt;gatewayというモジュール&lt;/a&gt;で、S3などにインデックスのメタデータなどを保存する機能がありました。
この機能は、0.20からlocal以外はdeprecatedとなりました。&lt;/p&gt;
&lt;p&gt;インデックスのバックアップ、リストアのために、1.0で実装されたのが&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-snapshots.html#modules-snapshots&#34;&gt;Snapshot/Restore&lt;/a&gt;です。
Snapshot/Restoreでは、インデックスごと、もしくはクラスタ全体をリモートにあるリポジトリにスナップショットを取ることが可能となりました。
初期リリースの段階では、共有ファイルシステムのみでしたが、現在は、S3やHDFSなどに保存が可能となっています。&lt;/p&gt;
&lt;h3 id=&#34;aggregation&#34;&gt;Aggregation&lt;/h3&gt;
&lt;p&gt;Facetをより強力にしたものです。Facetでは、指定したフィールドの集計のみでした。
データの解析などを行うには、独自で集計する必要がありました。
この機能をより柔軟に行えるように実装したのが&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations.html&#34;&gt;Aggregation&lt;/a&gt;です。&lt;/p&gt;
&lt;p&gt;たとえば、アクセスログを日毎に集計し、さらに日毎の集計に対して国別の集計やユーザエージェントごとの集計をさらに行うといった感じです。
Facetの場合は、日毎の検索結果に対して個別に集計するのみでしたが、Aggregationを使うことで、1週間の検索結果に対して、
日毎に国別の集計を行うといったことが可能になっっています。&lt;/p&gt;
&lt;h3 id=&#34;cat-api&#34;&gt;cat API&lt;/h3&gt;
&lt;p&gt;&amp;ldquo;=^.^=&amp;ldquo;猫が出てくるAPIです。(違う)&lt;/p&gt;
&lt;p&gt;Elasticsearchでは、クラスタの状態などが全てREST APIで取得でき、JSONで結果が帰ってきていました。
JSONはプログラムなどで処理を行う場合は便利ですが、コンソールで確認したり、管理系のツールでメールで通知する場合などは見にくいことがあります。
これを解消したのが&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/cat.html&#34;&gt;&lt;code&gt;_cat&lt;/code&gt; API&lt;/a&gt;です。（&lt;a href=&#34;http://www.elasticsearch.org/blog/introducing-cat-api/&#34;&gt;公式の紹介ブログはこちら&lt;/a&gt;）&lt;/p&gt;
&lt;h3 id=&#34;circuit-breaker&#34;&gt;Circuit Breaker&lt;/h3&gt;
&lt;p&gt;OOMが発生しそうなfielddataの読み込みを検知して、事前に防ぐ機構になります。
初期段階ではFielddataに対してのものから実装されました。&lt;/p&gt;
&lt;h2 id=&#34;11リリースlucene-461&#34;&gt;1.1リリース(Lucene 4.6.1)&lt;/h2&gt;
&lt;p&gt;3月にリリースされました。Elasticsearchはまだまだ発展しているため、リリースのサイクルが短いのが特徴です。&lt;/p&gt;
&lt;p&gt;1.x系では、&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/setup-upgrade.html#setup-upgrade&#34;&gt;Rolling Upgrade&lt;/a&gt;が導入されました。このため、クラスタ全体を停止することなく、クラスタのアップグレードが可能になりました。&lt;/p&gt;
&lt;h3 id=&#34;search-templates&#34;&gt;search templates&lt;/h3&gt;
&lt;p&gt;検索クエリをテンプレートとして登録することができる&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-template.html#search-template&#34;&gt;search templates&lt;/a&gt;です。
JSONでクエリを記述できるのは便利ですが、毎回組み立てるのは大変かもしれません。
特に、固定のクエリをプログラムから利用するような場合などです。
テンプレートとして登録しておくことで、検索時に値を埋め込むだけで検索ができるようになりました。&lt;/p&gt;
&lt;h3 id=&#34;aggregationの強化&#34;&gt;Aggregationの強化&lt;/h3&gt;
&lt;p&gt;Aggregationの種類が増えました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-cardinality-aggregation.html#search-aggregations-metrics-cardinality-aggregation&#34;&gt;cardinality&lt;/a&gt;：ユニークユーザ数の集計などが行えるaggregationです。HyperLogLog++アルゴリズムを利用した実装になっています。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-bucket-significantterms-aggregation.html&#34;&gt;significant_terms&lt;/a&gt;：単語の数による集計ではなく、コレクション全体に対する単語の頻度と、検索結果に対する単語の頻度を計算することで、重要度を計ることができます。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-percentile-aggregation.html#search-aggregations-metrics-percentile-aggregation&#34;&gt;percentiles&lt;/a&gt;：パーセンタイル値を計算できます。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;12リリースlucene-48系&#34;&gt;1.2リリース(Lucene 4.8系)&lt;/h2&gt;
&lt;h3 id=&#34;java-7必須&#34;&gt;Java 7必須&lt;/h3&gt;
&lt;p&gt;利用しているLuceneがJava 7必須となったためです。また、Java 6のEOLも切れてますし。&lt;/p&gt;
&lt;h3 id=&#34;dynamic-scriptingがデフォルトオフ&#34;&gt;dynamic scriptingがデフォルトオフ&lt;/h3&gt;
&lt;p&gt;採用していたMVELがサンドボックス化に対応していないため、危険を回避するためにオフとなりました。&lt;/p&gt;
&lt;h3 id=&#34;インデキシングとマージング&#34;&gt;インデキシングとマージング&lt;/h3&gt;
&lt;p&gt;インデキシングとマージ処理に関するさまざまな改善。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;flushのthreasholdを操作回数ではなく、サイズや時間によるものに変更&lt;/li&gt;
&lt;li&gt;デフォルトをConcurrentMergeSchedulerに変更&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;13リリースlucene-490系&#34;&gt;1.3リリース(Lucene 4.9.0系)&lt;/h2&gt;
&lt;h3 id=&#34;セキュリティ関連&#34;&gt;セキュリティ関連&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;JSONPのデフォルトオフ&lt;/li&gt;
&lt;li&gt;MVELの非推奨化（1.4で削除）＋&lt;code&gt;script.disable_dynamic&lt;/code&gt;のデフォルト値が&lt;code&gt;sandbox&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;aggregationの強化-1&#34;&gt;aggregationの強化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-top-hits-aggregation.html#search-aggregations-metrics-top-hits-aggregation&#34;&gt;top hits&lt;/a&gt;：Field Collapsing/combiningと呼ばれる機能です。たとえば、いくつかのサイトのHTMLを収集して検索機能を提供する場合に、ドメインごとに1件ずつ検索結果に出したい場合などに利用できる機能です。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;その他にも以下のaggregationが追加されています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-percentile-rank-aggregation.html&#34;&gt;percentile ranks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-geobounds-aggregation.html&#34;&gt;geo bounds&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;mappingのtransform&#34;&gt;mappingのtransform&lt;/h3&gt;
&lt;p&gt;Mappingに&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-transform.html#mapping-transform&#34;&gt;transform&lt;/a&gt;機能が追加されました。
mappingにドキュメントの値を元に、インデキシング時に変換処理を記述できます。
たとえば、特定のフィールドにある値がある場合にだけ、あるフィールドに値を入れるなどといったことが可能になります。&lt;/p&gt;
&lt;h3 id=&#34;ディスク関連&#34;&gt;ディスク関連&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;disk based shard allocation deciderが導入されました。ノードのディスクの使用率を元に、シャードを配置しても良いかといった決定を行う機構です。&lt;/li&gt;
&lt;li&gt;チェックサムによるファイルのチェック（Lucene4.9で導入されたコードへの切り替え）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;14リリースlucene-410系&#34;&gt;1.4リリース(Lucene 4.10系)&lt;/h2&gt;
&lt;p&gt;ベータ版が出されるほど、多くの改善が入っています。&lt;/p&gt;
&lt;h3 id=&#34;resiliency&#34;&gt;resiliency&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#memory-mgmt&#34;&gt;メモリ使用量の低下&lt;/a&gt;によるノードの安定性向上
&lt;ul&gt;
&lt;li&gt;DocValues、リクエストごとのcircuit breakerなど&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;discoveryアルゴリズムの改善による&lt;a href=&#34;#cluster-stability&#34;&gt;クラスタの安定性&lt;/a&gt;向上&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#checksums&#34;&gt;チェックサム&lt;/a&gt;の導入による破損したデータの検知&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;セキュリティ関連-1&#34;&gt;セキュリティ関連&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CORSをデフォルト無効&lt;/li&gt;
&lt;li&gt;Groovyがデフォルトのスクリプト言語に。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;aggregationの強化-2&#34;&gt;Aggregationの強化&lt;/h3&gt;
&lt;p&gt;以下のaggregationが追加されています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.4/search-aggregations-bucket-filters-aggregation.html#search-aggregations-bucket-filters-aggregation&#34;&gt;filter&lt;/a&gt;、&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.4/search-aggregations-bucket-children-aggregation.html#search-aggregations-bucket-children-aggregation&#34;&gt;children&lt;/a&gt;、scripted_metric&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;upgrade-api&#34;&gt;Upgrade API&lt;/h3&gt;
&lt;p&gt;インデックスを最新のバージョンのものにアップグレードするためのAPIです。
Luceneは下位互換を保ってくれているため、古いバージョンのインデックスも読み込むことが可能です。
ただ、最新バージョンで使える機能が制限されていたりということもあります。
クラスタにあるインデックスをアップグレードするのにかかる時間や必要かどうかといったことを取得できる仕組みも提供します。&lt;/p&gt;
&lt;p&gt;また、Lucene自体は、1つ前のメジャーバージョン（4.x系だと3.x系まで）までの互換性は提供していますが、
2つ前のメジャーバージョンの互換性がなくなります。
Luceneも5.x系のブランチが作成されており、5系のリリースにより、3系との互換性がなくなります。
5系のリリースに対応する場合にも、こちらのAPIが助けになるかと。&lt;/p&gt;
&lt;h3 id=&#34;141&#34;&gt;1.4.1&lt;/h3&gt;
&lt;p&gt;11/27に&lt;a href=&#34;http://blog.johtani.info/blog/2014/11/27/elasticsearch-1-4-1-released-ja/&#34;&gt;1.4.1がリリース&lt;/a&gt;されました。
シャードの配置やparent/child、nestedドキュメントの改善などが行われています。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、駆け足で、1月から11月までのElasticsearchの流れを追ってみました。
1.0で大きな機能追加、改善が行われ、その後も活発に開発が行われています。
要望などがあれば、MLで聞いてみたりやGitHubに登録するなどを行っていただければと。&lt;/p&gt;
&lt;p&gt;あと、今年から来年にかけての大きなイベントとして、
&lt;a href=&#34;http://www.elasticon.com/&#34;&gt;Elasticsearch初のユーザカンファレンスのサイトがオープン&lt;/a&gt;しました。
Elasticsearchに関するいろいろな話が聞ける機会だと思うので、興味のある方は見ていただければと。&lt;/p&gt;
&lt;p&gt;では、また次のAdvent Calendarで！（最終日の予定ですが、空きがあるのでなにか書くかも）&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch 1.4.1および1.3.6リリース（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2014/11/27/elasticsearch-1-4-1-released-ja/</link>
      <pubDate>Thu, 27 Nov 2014 11:43:32 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/11/27/elasticsearch-1-4-1-released-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-1-released/&#34;&gt;elasticsearch 1.4.1 and 1.3.6 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日、&lt;strong&gt;Lucene 4.10.2&lt;/strong&gt;をベースにした&lt;strong&gt;Elasticsearch 1.4.1&lt;/strong&gt;と、バグフィックスリリースである、&lt;strong&gt;Elasticsearch 1.3.6&lt;/strong&gt;をリリースしました。
ダウンロードおよび変更リストはそれぞれ次のリンクからアクセスできます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-1-released/&#34;&gt;elasticsearch 1.4.1 and 1.3.6 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日、&lt;strong&gt;Lucene 4.10.2&lt;/strong&gt;をベースにした&lt;strong&gt;Elasticsearch 1.4.1&lt;/strong&gt;と、バグフィックスリリースである、&lt;strong&gt;Elasticsearch 1.3.6&lt;/strong&gt;をリリースしました。
ダウンロードおよび変更リストはそれぞれ次のリンクからアクセスできます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最新ステーブルリリース：&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-4-1&#34;&gt;Elasticsearch 1.4.1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;1.3.x系バグフィックス：&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-3-6&#34;&gt;Elasticsearch 1.3.6&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;過去のリリースに関するブログ（公式）はこちら。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1.4:&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-0-released/&#34;&gt;1.4.0&lt;/a&gt;, &lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-0-beta-released/&#34;&gt;1.4.0.Beta1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;1.3:&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-0-released/&#34;&gt;1.3.5&lt;/a&gt;, &lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-3-4-released/&#34;&gt;1.3.4&lt;/a&gt;, &lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-3-3-released/&#34;&gt;1.3.3&lt;/a&gt;, &lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-3-2-released/&#34;&gt;1.3.2&lt;/a&gt;, &lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-3-1-released/&#34;&gt;1.3.1&lt;/a&gt;, &lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-3-0-released/&#34;&gt;1.3.0&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;すべての変更については&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-4-1&#34;&gt;1.4.1のリリースノート&lt;/a&gt;および&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-3-6&#34;&gt;1.3.6のリリースノート&lt;/a&gt;をごらんください。
以下では、重要な変更について紹介します。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;shard-allocation&#34;&gt;shard allocation&lt;/h2&gt;
&lt;p&gt;Elasticsearch 1.3.0で、&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/index-modules-allocation.html#disk&#34;&gt;disk based shard allocation&lt;/a&gt;が
デフォルトで有効になっています。
もし、ノードのディスクの使用量が&lt;code&gt;law&lt;/code&gt;で指定された値（85%）を超えた場合、ノードにはシャードが配置されません。
また、&lt;code&gt;high&lt;/code&gt;で指定された値（90%）を超えた場合、シャードを他のノードへ移動します。&lt;/p&gt;
&lt;p&gt;Elasticsearch 1.4.1では、disk based shard allocationに3つの改良が追加されました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ディスク使用量のチェックはシャードがクラスタに配置されるタイミングでのみ実施していた。現在は60秒ごとに使用量をチェック。(&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/pull/8270&#34;&gt;#8270&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;ディスクフルメッセージは&lt;code&gt;DEBUG&lt;/code&gt;レベルでログに出力されていました。なぜ、新しいシャードが配置されないのかを説明するのが困難でした。現在は&lt;code&gt;WARN&lt;/code&gt;レベルで30秒ごとにログに出力されます。(&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/pull/8382&#34;&gt;#8382&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;以前は、シャードをもう一つのノードへ動かすべきかどうか決めるとき、allocation deciderはノードにあるシャードのサイズを考慮するだけでした。現在は、動かされるシャードのサイズも考慮します。これにより、必要最小限のシャードの移動量となります。(&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/pull/8569&#34;&gt;#8569&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;parentchild-and-nested-documents&#34;&gt;parent/child and nested documents&lt;/h2&gt;
&lt;p&gt;Elasticsearch 1.4.0で、parent/childとnestedドキュメントに対して（新しいセグメントを開くときに）固定長ビットセットフィルタを構築しキャッシュしました。クエリ、フィルタおよびAggregationを常に速くするためにです。
多くの&lt;code&gt;nested&lt;/code&gt;フィールドを持つユーザにとっては、以前のバージョンよりもヒープの使用量が大きくなってしまいました。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;nested&lt;/code&gt; aggregationによって処理されるドキュメントの順序を変更すること(&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/pull/8454&#34;&gt;#8454&lt;/a&gt;)によって、固定長ビットセットフィルタが子のドキュメントに対して必要でなくなりました。
現在は、親のドキュメント（つまり、nested&lt;strong&gt;ではない&lt;/strong&gt;ドキュメント）を表すフィルタのみをキャッシュしています。これにより必要なキャッシュ空間のサイズを減少しました。(&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/pull/8414&#34;&gt;#8414&lt;/a&gt;、&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/pull/8440&#34;&gt;#8440&lt;/a&gt;)&lt;/p&gt;
&lt;h2 id=&#34;date-ranges&#34;&gt;date ranges&lt;/h2&gt;
&lt;p&gt;2つの日付範囲に関する問題がこのリリースで修正されました。
1つ目は、日付を丸めるかというものです。例えば、&lt;code&gt;timestamp&lt;/code&gt;フィールドに1秒の解像度の値があるとします。
&lt;code&gt;{&amp;quot;lt&amp;quot;: &amp;quot;2014/11/26||/d&amp;quot;}&lt;/code&gt;という&lt;code&gt;range&lt;/code&gt;フィルタは&lt;code&gt;2014/11/26 00:00:00&lt;/code&gt;未満のタイムスタンプのデータを結果として返しました。
しかし、&lt;code&gt;lt&lt;/code&gt;を&lt;code&gt;lte&lt;/code&gt;に変更した場合、&lt;code&gt;2014/11/27 00:00:00&lt;/code&gt;以外の値も含めたいです。&lt;/p&gt;
&lt;p&gt;以前は、&lt;code&gt;lte&lt;/code&gt;は&lt;code&gt;2014/11/27 00:00:00&lt;/code&gt;のタイムスタンプも含めてしまっていました。現在は、想定通りの動作をします。(&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/pull/8556&#34;&gt;#8556&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;2つ目のバグは日付の範囲条件に&lt;code&gt;now()&lt;/code&gt;を利用したaliasとpercolatorフィルタです。
&lt;code&gt;now()&lt;/code&gt;の値を、フィルタが作成したタイミングで決定していました。フィルタが実行されるたびに更新せずにです。
&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/pull/8534&#34;&gt;#8534&lt;/a&gt;で、&lt;code&gt;now()&lt;/code&gt;はaliasとpercolatorで想定通りの動作をします。&lt;/p&gt;
&lt;h2 id=&#34;試してみてください&#34;&gt;試してみてください。&lt;/h2&gt;
&lt;p&gt;ぜひ、&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-4-1&#34;&gt;Elasticsearch 1.4.1&lt;/a&gt;をダウンロードして、試してみてください。
そして、感想をTwitter(&lt;a href=&#34;https://twitter.com/elasticsearch&#34;&gt;@elasticsearch&lt;/a&gt;)などで教えて下さい。
また、問題がありましたら、&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues&#34;&gt;GitHub issues page&lt;/a&gt;で報告をお願いします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>インデックステンプレートとLogstash</title>
      <link>https://blog.johtani.info/blog/2014/11/25/import-apache-accesslog-using-logstash-2/</link>
      <pubDate>Tue, 25 Nov 2014 16:25:46 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/11/25/import-apache-accesslog-using-logstash-2/</guid>
      <description>&lt;p&gt;前回の「&lt;a href=&#34;http://blog.johtani.info/blog/2014/11/21/import-apache-accesslog-using-logstash/&#34;&gt;Logstashを利用したApacheアクセスログのインポート&lt;/a&gt;」の続きです。
前回の記事では、Logstashの設定ファイルについて説明しました。
今回は「Elasticsearchに設定するインデックステンプレート」について説明します。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;前回の「&lt;a href=&#34;http://blog.johtani.info/blog/2014/11/21/import-apache-accesslog-using-logstash/&#34;&gt;Logstashを利用したApacheアクセスログのインポート&lt;/a&gt;」の続きです。
前回の記事では、Logstashの設定ファイルについて説明しました。
今回は「Elasticsearchに設定するインデックステンプレート」について説明します。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;テンプレートの設定&#34;&gt;テンプレートの設定&lt;/h2&gt;
&lt;p&gt;Elasticsearchでは、登録するデータの特性に合わせてMappingを定義する方がデータを効率良く扱うことができる場合があります。
この場合、通常ですと、インデックス作成時にMappingを指定します。&lt;/p&gt;
&lt;p&gt;ただ、今回は、&lt;a href=&#34;http://blog.johtani.info/blog/2014/11/21/import-apache-accesslog-using-logstash#output-elasticsearch&#34;&gt;インデックス名に「年」を含める形&lt;/a&gt;で指定してあります。
「年」はLogstashで処理したデータによって決まります。このため、あらかじめMappingを指定してインデックスを作成するのは難しいです。&lt;/p&gt;
&lt;p&gt;このような場合に便利な機能として、「&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-templates.html#indices-templates&#34;&gt;インデックステンプレート&lt;/a&gt;」があります。&lt;/p&gt;
&lt;h3 id=&#34;インデックステンプレートとは&#34;&gt;インデックステンプレートとは&lt;/h3&gt;
&lt;p&gt;実際のテンプレートの説明に入る前に、少しだけ説明を。
インデックステンプレートとは、インデックスが作成されるタイミングで自動的に適用される設定をテンプレートとして登録できる機能のことです。
実際にテンプレートが適用されるかどうかは、インデックス名で判断されます。&lt;/p&gt;
&lt;p&gt;例えば、大して重要でもなく、データ量も少ないインデックス用のテンプレートとして、シャード数が1、レプリカ数が0、&amp;quot;_source&amp;quot;を保存しない設定のテンプレートを登録する場合、
次のようになります。&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-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;curl -XPUT localhost:9200/_template/template_1 -d &amp;#39;&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:#e6db74&#34;&gt;&amp;#34;template&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;te*&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:#e6db74&#34;&gt;&amp;#34;settings&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:#e6db74&#34;&gt;&amp;#34;number_of_shards&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#e6db74&#34;&gt;&amp;#34;number_of_replicas&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;mappings&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:#e6db74&#34;&gt;&amp;#34;type1&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:#e6db74&#34;&gt;&amp;#34;_source&amp;#34;&lt;/span&gt; : { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;enabled&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;_template&lt;/code&gt;がインデックステンプレートを登録するためのエンドポイントです。
&lt;code&gt;template_1&lt;/code&gt;がこのテンプレートのIDです。削除などについては、このIDを利用します。&lt;/p&gt;
&lt;p&gt;そして、重要なのは、&amp;quot;&lt;code&gt;template&lt;/code&gt;&amp;ldquo;の設定です。
&amp;ldquo;&lt;code&gt;template&lt;/code&gt;&amp;ldquo;には、このテンプレートが適用されるべきインデックス名を記載します。
上記サンプルでは&lt;code&gt;te*&lt;/code&gt;となっているため、&lt;code&gt;te&lt;/code&gt;で始まる名前のインデックスを作成した場合にテンプレートにある設定が適用されます。&lt;/p&gt;
&lt;h3 id=&#34;今回利用するテンプレート&#34;&gt;今回利用するテンプレート&lt;/h3&gt;
&lt;p&gt;私がJJUG CCCや第7回Elasticsearch勉強会のKibana4のデモで利用したインデックスのテンプレートは次のものになります。
&amp;ldquo;&lt;code&gt;template&lt;/code&gt;&amp;ldquo;には、&lt;a href=&#34;http://blog.johtani.info/blog/2014/11/21/import-apache-accesslog-using-logstash/#output-elasticsearch&#34;&gt;前回の記事で紹介したoutput/elasticsearchの設定&lt;/a&gt; に合致する&lt;code&gt;new_demo_access_log-*&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-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;curl -XPUT localhost:9200/_template/new_access_log_for_demo -d &amp;#39;&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:#f92672&#34;&gt;&amp;#34;template&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;new_demo_access_log-*&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:#f92672&#34;&gt;&amp;#34;settings&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:#f92672&#34;&gt;&amp;#34;number_of_shards&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2&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:#f92672&#34;&gt;&amp;#34;number_of_replicas&amp;#34;: &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;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;&amp;#34;mappings&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:#f92672&#34;&gt;&amp;#34;_default_&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:#f92672&#34;&gt;&amp;#34;dynamic_templates&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;string_template&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:#f92672&#34;&gt;&amp;#34;mapping&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:#f92672&#34;&gt;&amp;#34;index&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;not_analyzed&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;match_mapping_type&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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:#f92672&#34;&gt;&amp;#34;match&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;*&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;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:#f92672&#34;&gt;&amp;#34;properties&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:#f92672&#34;&gt;&amp;#34;path&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;multi_field&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:#f92672&#34;&gt;&amp;#34;fields&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:#f92672&#34;&gt;&amp;#34;no_analyzed&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:#f92672&#34;&gt;&amp;#34;index&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;not_analyzed&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;analyzed&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:#f92672&#34;&gt;&amp;#34;index&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;analyzed&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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;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:#f92672&#34;&gt;&amp;#34;referer&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;multi_field&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:#f92672&#34;&gt;&amp;#34;fields&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:#f92672&#34;&gt;&amp;#34;no_analyzed&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:#f92672&#34;&gt;&amp;#34;index&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;not_analyzed&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;analyzed&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:#f92672&#34;&gt;&amp;#34;index&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;analyzed&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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;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:#f92672&#34;&gt;&amp;#34;agent&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;multi_field&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:#f92672&#34;&gt;&amp;#34;fields&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:#f92672&#34;&gt;&amp;#34;no_analyzed&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:#f92672&#34;&gt;&amp;#34;index&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;not_analyzed&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;analyzed&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:#f92672&#34;&gt;&amp;#34;index&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;analyzed&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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;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:#f92672&#34;&gt;&amp;#34;geoip&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;object&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:#f92672&#34;&gt;&amp;#34;properties&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:#f92672&#34;&gt;&amp;#34;location&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:#f92672&#34;&gt;&amp;#34;geohash&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;true&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;&amp;#34;geohash_precision&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;10&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;&amp;#34;type&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;geo_point&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:#f92672&#34;&gt;&amp;#34;lat_lon&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;true&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;&amp;#34;geohash_prefix&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;true&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;response&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:#f92672&#34;&gt;&amp;#34;copy_to&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;response_int&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;bytes&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;long&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;response_int&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;integer&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;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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;settings設定&#34;&gt;settings設定&lt;/h4&gt;
&lt;p&gt;デモ用であり、手元で2台のノードを起動するということもあり、&lt;code&gt;number_of_shards&lt;/code&gt;に&lt;code&gt;2&lt;/code&gt;を、&lt;code&gt;number_of_replicas&lt;/code&gt;に&lt;code&gt;0&lt;/code&gt;を指定してあります。&lt;/p&gt;
&lt;h4 id=&#34;mappings設定&#34;&gt;mappings設定&lt;/h4&gt;
&lt;h5 id=&#34;インデックスのタイプ&#34;&gt;インデックスのタイプ&lt;/h5&gt;
&lt;p&gt;Mappingsの指定は通常、特定の&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/glossary.html#glossary-type&#34;&gt;タイプ&lt;/a&gt;を指定します。
今回のデモでは、1種類しかないのですが、タイプ名を特に意識しないために、&lt;code&gt;_default_&lt;/code&gt;を使用しました。
この場合、任意のタイプに適用されることとなります。
タイプを指定してMappingの設定を行う場合は&lt;code&gt;_default_&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-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;mappings&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:#f92672&#34;&gt;&amp;#34;_default_&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:#ae81ff&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;ダイナミックテンプレート&#34;&gt;ダイナミックテンプレート&lt;/h5&gt;
&lt;p&gt;次は&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-root-object-type.html#_dynamic_templates&#34;&gt;ダイナミックテンプレート&lt;/a&gt;です。
インデックステンプレートはインデックスの設定をテンプレート化しました。ダイナミックテンプレートはフィールドに対してテンプレートを設定できます。&lt;/p&gt;
&lt;p&gt;以下のダイナミックテンプレートでは、&lt;code&gt;string&lt;/code&gt;タイプのフィールドのデフォルト設定を変更しています。
通常、&lt;code&gt;string&lt;/code&gt;タイプのフィールドは&lt;code&gt;analyzed&lt;/code&gt;となりますが、&lt;code&gt;not_analyzed&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-yaml&#34; data-lang=&#34;yaml&#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;&amp;#34;dynamic_templates&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;string_template&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:#f92672&#34;&gt;&amp;#34;mapping&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:#f92672&#34;&gt;&amp;#34;index&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;not_analyzed&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;match_mapping_type&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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:#f92672&#34;&gt;&amp;#34;match&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;*&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;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;multi_field指定&#34;&gt;multi_field指定&lt;/h5&gt;
&lt;p&gt;検索もしたいし、Terms Aggregationでも利用したいフィールドについては、&lt;code&gt;multi_field&lt;/code&gt;を利用して、
&lt;code&gt;analyzed&lt;/code&gt;と&lt;code&gt;not_analyzed&lt;/code&gt;の2種類のフィールドを用意しています。
&lt;code&gt;multi_field&lt;/code&gt;設定を用いることで、1つのJSONのデータから、異なる形のフィールドを用意することが可能です。&lt;/p&gt;
&lt;p&gt;今回のテンプレートでは、&lt;code&gt;path&lt;/code&gt;、&lt;code&gt;referer&lt;/code&gt;、&lt;code&gt;agent&lt;/code&gt;に&lt;code&gt;multi_field&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-yaml&#34; data-lang=&#34;yaml&#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;&amp;#34;path&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;multi_field&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:#f92672&#34;&gt;&amp;#34;fields&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:#f92672&#34;&gt;&amp;#34;no_analyzed&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:#f92672&#34;&gt;&amp;#34;index&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;not_analyzed&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;analyzed&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:#f92672&#34;&gt;&amp;#34;index&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;analyzed&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;例えば、上記の設定の場合、入力のJSONは&lt;code&gt;path&lt;/code&gt;というデータのみですが、インデックス上には&lt;code&gt;path.no_analyzed&lt;/code&gt;と
&lt;code&gt;path.analyzed&lt;/code&gt;というフィールドができあがります。
実際に検索する場合は、&lt;code&gt;path.analyzed:検索したい文字列&lt;/code&gt;という形で検索をすることで、いわゆる部分一致のような検索が可能です。
また、完全一致をしたい場合は&lt;code&gt;path.no_analyzed:検索したい文字列&lt;/code&gt;という指定になります。
用途を考えると、&lt;code&gt;request&lt;/code&gt;も指定したほうが良いかもしれません。&lt;/p&gt;
&lt;h5 id=&#34;geoip&#34;&gt;geoip&lt;/h5&gt;
&lt;p&gt;&lt;a href=&#34;http://blog.johtani.info/blog/2014/11/21/import-apache-accesslog-using-logstash#filter-geoip&#34;&gt;Logstashでgeoipデータ&lt;/a&gt;を付与していました。
このgeoipのデータをKibana4で利用するために、geoデータとして登録する必要があります。&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-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;geoip&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;object&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:#f92672&#34;&gt;&amp;#34;properties&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:#f92672&#34;&gt;&amp;#34;location&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:#f92672&#34;&gt;&amp;#34;geohash&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;true&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;&amp;#34;geohash_precision&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;10&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;&amp;#34;type&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;geo_point&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:#f92672&#34;&gt;&amp;#34;lat_lon&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;true&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;&amp;#34;geohash_prefix&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;true&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記の設定がgeoデータの指定です。
&lt;code&gt;type&lt;/code&gt;に&lt;code&gt;object&lt;/code&gt;が指定してありますが、これは、geoipのデータがネストしているためです。
geoipオブジェクトのうち、緯度経度のデータは&lt;code&gt;location&lt;/code&gt;に入っているため、こちらに緯度経度関係の設定を指定します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;type&amp;quot;: &amp;quot;geo_point&amp;quot;&lt;/code&gt;：&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-geo-point-type.html#mapping-geo-point-type&#34;&gt;&lt;code&gt;geo_point&lt;/code&gt;&lt;/a&gt;タイプであることを指定&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;geohash&amp;quot;: true&lt;/code&gt;：緯度経度のデータをもとに、geohashの値もインデックス&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;geohash_precision&amp;quot;: 10&lt;/code&gt;：geohashの精度の指定&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;lat_lon&amp;quot;: true&lt;/code&gt;：緯度経度を個別の&lt;code&gt;.lat&lt;/code&gt;、&lt;code&gt;.lon&lt;/code&gt;というフィールドにもインデックス&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;geohash_prefix&amp;quot;: true&lt;/code&gt;：該当するgeohashのみでなく、その親にあたるgeohashについてもインデックスする&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;responseresponse_intbytes&#34;&gt;response、response_int、bytes&lt;/h5&gt;
&lt;p&gt;最後は、response、response_int、bytesです。&lt;/p&gt;
&lt;p&gt;responseには、HTTPステータスコードが入ります。
文字列としても扱いたいですが、integerとして、Renge Aggregationなどを行いたいので、
response_intというフィールドにも値を入れています。
&lt;code&gt;multi_field&lt;/code&gt;でも可能ですが、ここでは、&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-core-types.html#copy-to&#34;&gt;&lt;code&gt;copy_to&lt;/code&gt;&lt;/a&gt;を利用しました。
&lt;code&gt;copy_to&lt;/code&gt;を用いることで、異なるフィールドに値をコピーすることができます。&lt;/p&gt;
&lt;p&gt;bytesについては、longで扱いたいとういう理由だけです。&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-yaml&#34; data-lang=&#34;yaml&#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;&amp;#34;response&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:#f92672&#34;&gt;&amp;#34;copy_to&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;response_int&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;bytes&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;long&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;response_int&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;integer&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;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;今回はデモに利用したインデックスてプレートについて説明しました。
前回の、Logstashの設定とこのインデックステンプレートを用いることで、Kibanaで解析するデータの準備ができます。
実際の操作などについては、また次回の記事で説明しようかと思います。&lt;/p&gt;
&lt;p&gt;不明な点、誤植などありましたら、コメント欄へお願いします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Logstashを利用したApacheアクセスログのインポート</title>
      <link>https://blog.johtani.info/blog/2014/11/21/import-apache-accesslog-using-logstash/</link>
      <pubDate>Fri, 21 Nov 2014 17:30:39 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/11/21/import-apache-accesslog-using-logstash/</guid>
      <description>&lt;p&gt;JJUG CCCや第7回Elasticsearch勉強会のKibana4のデモにアクセスログを利用しました。&lt;/p&gt;
&lt;p&gt;ただ、セッションでは、どうやってElasticsearchに投入したのかという詳しい話をしていませんでした。
本記事では、データ取り込み時に利用したLogstashの設定ファイルについて説明します。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;JJUG CCCや第7回Elasticsearch勉強会のKibana4のデモにアクセスログを利用しました。&lt;/p&gt;
&lt;p&gt;ただ、セッションでは、どうやってElasticsearchに投入したのかという詳しい話をしていませんでした。
本記事では、データ取り込み時に利用したLogstashの設定ファイルについて説明します。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Logstashの設定の説明に入る前に、全体の流れを。
「ApacheアクセスログをKibana4により可視化」です。&lt;/p&gt;
&lt;h2 id=&#34;材料の準備&#34;&gt;材料の準備&lt;/h2&gt;
&lt;p&gt;「ApacheアクセスログをKibana4により可視化」に必要な材料は次の通りです。
（今回は起動するところまでいかないので、実際に必要なのは次回以降になります。）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Java 7（u55以上を1つ）&lt;/li&gt;
&lt;li&gt;Logstash 1.4.2（1つ）&lt;/li&gt;
&lt;li&gt;Elasticsearch 1.4.0（1つ）&lt;/li&gt;
&lt;li&gt;Kibana4 Beta2（1つ）&lt;/li&gt;
&lt;li&gt;Apacheのアクセスログ（適量）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Apacheのアクセスログ以外は、公式サイトからダウンロードできます。
それぞれをダウンロードして、起動できるようにしておきましょう。&lt;/p&gt;
&lt;p&gt;※1台のマシン上で行う場合は、アクセスログの量を少なめにするなどの対策をとりましょう。
※今回は、1台のマシン（Mac）上で、VMなどを利用せず、それぞれ直接起動するものとします。&lt;/p&gt;
&lt;h2 id=&#34;可視化の手順と流れ&#34;&gt;可視化の手順と流れ&lt;/h2&gt;
&lt;p&gt;可視化の流れとしては、&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Logstashでファイルを読み込み、各種処理（パースしたり、情報を追加したり、切り出したり）&lt;/li&gt;
&lt;li&gt;Elasticsearchに保存&lt;/li&gt;
&lt;li&gt;Kibanaでグラフを作ったり、検索してみたり&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;です。&lt;/p&gt;
&lt;p&gt;今回は、1のLogstashでファイルを読み込んだりする設定ファイルの説明です。&lt;/p&gt;
&lt;h3 id=&#34;logstashの設定&#34;&gt;Logstashの設定&lt;/h3&gt;
&lt;h4 id=&#34;logstashの基本&#34;&gt;Logstashの基本&lt;/h4&gt;
&lt;p&gt;まずは、Logstashの設定ですが、簡単にLogstashの説明を。
Logstashは大きく3つのパーツに分かれています。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;input：データの入力処理&lt;/li&gt;
&lt;li&gt;filter：inputで読み込んだデータに対する操作など&lt;/li&gt;
&lt;li&gt;output：データの出力処理&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;inputでデータを読み込み（複数可）、filterでデータに対して各種処理を行い、outputでデータを指定されたところに出力（複数可）します。&lt;/p&gt;
&lt;h4 id=&#34;アクセスログの読み込み設定&#34;&gt;アクセスログの読み込み設定&lt;/h4&gt;
&lt;p&gt;アクセスログの読み込み処理は大まかに次のようなものとなります。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;アクセスログを読み込む（input/file）&lt;/li&gt;
&lt;li&gt;読み取ったアクセスログを各フィールド（IPアドレス、ユーザエージェントなど）に分割（filter/grok）&lt;/li&gt;
&lt;li&gt;日付のパース（filter/date）&lt;/li&gt;
&lt;li&gt;クライアントIPアドレスにgeoipの情報を付加（filter/geoip）&lt;/li&gt;
&lt;li&gt;リクエストのパスの第1階層の抽出（filter/grok）&lt;/li&gt;
&lt;li&gt;ユーザエージェントのパース（filter/useragent）&lt;/li&gt;
&lt;li&gt;Elasticsearchへの出力（output/elasticsearch）&lt;/li&gt;
&lt;/ol&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-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;input {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  file {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    path &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/Users/johtani/demo_access_log/*/*.log&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    start_position &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;beginning&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;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;filter {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  grok {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    match &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;message&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%{COMBINEDAPACHELOG}&amp;#34;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    break_on_match &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tag_on_failure &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;_message_parse_failure&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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;  date {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    match &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;timestamp&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dd/MMM/YYYY:HH:mm:ss Z&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    locale &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; en
&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;  geoip {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    source &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;clientip&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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;  grok {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    match &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;request&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^/%{WORD:first_path}/%{GREEDYDATA}$&amp;#34;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tag_on_failure &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;_request_parse_failure&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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;  useragent {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    source &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;agent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    target &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;useragent&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;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;output {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  elasticsearch {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    host &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;localhost&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    index &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;new_demo_access_log-%{year}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    cluster &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;demo_cluster&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    protocol &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http&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;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;h5 id=&#34;1-アクセスログを読み込むinputfile&#34;&gt;1. アクセスログを読み込む（input/file）&lt;/h5&gt;
&lt;p&gt;inputの&lt;a href=&#34;http://logstash.net/docs/1.4.2/inputs/file&#34;&gt;fileモジュール(a)&lt;/a&gt;を使用してアクセスログのファイルを読み込みます。
&lt;code&gt;path&lt;/code&gt;でアクセスログのファイルのパスを指定します。
今回利用したアクセスログは&lt;code&gt;demo_access_log/2010/access20100201.log&lt;/code&gt;といった日毎のファイルに分割されていたため、
&lt;code&gt;*&lt;/code&gt;を利用してファイルのパスを指定しました。
また、今回は既存のファイルの読み込みだけのため、&lt;code&gt;start_position&lt;/code&gt;に&lt;code&gt;beginning&lt;/code&gt;を指定してあります。
デフォルトでは&lt;code&gt;end&lt;/code&gt;が指定されるため、Logstashを起動後に追記されたログから対象になってしまうためです。
その他の設定については、公式ガイドをご覧ください。&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-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;input {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  file { &lt;span style=&#34;color:#75715e&#34;&gt;# a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    path &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/Users/johtani/demo_access_log/*/*.log&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    start_position &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;beginning&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# c&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Logstashでは、ファイルをどこまで読み込んだかという情報を保持するために、&lt;a href=&#34;http://logstash.net/docs/1.4.2/inputs/file#sincedb_path&#34;&gt;sincedb&lt;/a&gt;を利用しています。
設定変更後に同じファイルを最初から読み込みたい場合などは、こちらのファイルを一旦削除するなどの対応が必要です。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&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-json&#34; data-lang=&#34;json&#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;&amp;#34;message&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;読み込んだアクセスログ&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:#f92672&#34;&gt;&amp;#34;@version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1&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:#f92672&#34;&gt;&amp;#34;@timestamp&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2014-11-21T06:16:21.644Z&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:#f92672&#34;&gt;&amp;#34;host&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;jupiter.local&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:#f92672&#34;&gt;&amp;#34;path&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/Users/johtani/demo_access_log/2010/access20100201.log&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:#960050;background-color:#1e0010&#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;message&lt;/code&gt;に読み込んだデータが入ってきます。
&lt;code&gt;@timestamp&lt;/code&gt;がLogstashが読み込んだ時刻、&lt;code&gt;host&lt;/code&gt;はLogstashが動作しているホスト名です。
&lt;code&gt;path&lt;/code&gt;はfileモジュールが読み込んだファイルのパスを設定しています。
この後の処理で、どこの項目に対して処理を行うかといったことが重要になるので、&lt;/p&gt;
&lt;h5 id=&#34;2-読み取ったアクセスログを各フィールドipアドレスユーザエージェントなどに分割filtergrok&#34;&gt;2. 読み取ったアクセスログを各フィールド（IPアドレス、ユーザエージェントなど）に分割（filter/grok）&lt;/h5&gt;
&lt;p&gt;2.〜6.の処理は、inputで読み込んだ1アクセスログに対する処理となります。&lt;/p&gt;
&lt;p&gt;ここでは、&lt;a href=&#34;http://logstash.net/docs/1.4.2/filters/grok&#34;&gt;grokフィルタ&lt;/a&gt;を使用して
Apacheのアクセスログを各フィールドに分割します。
Logastashでは、簡単に使えるようにいくつかの&lt;a href=&#34;https://github.com/elasticsearch/logstash/tree/v1.4.2/patterns&#34;&gt;パターン&lt;/a&gt;が用意されています。
Apacheのログのために、&lt;a href=&#34;https://github.com/elasticsearch/logstash/blob/v1.4.2/patterns/grok-patterns#L91&#34;&gt;&lt;code&gt;COMBINEDAPACHELOG&lt;/code&gt;&lt;/a&gt;というのが用意されています。
今回はこちらを使用しています。その他にも日付などパターンが用意されているので、試してみてください。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;message&lt;/code&gt;にアクセスログが入っているので、こちらの項目に対して&lt;code&gt;COMBINEDAPACHELOG&lt;/code&gt;のパターンを
&lt;code&gt;match&lt;/code&gt;で適用してフィールドに抜き出します。
&lt;code&gt;tag_on_failure&lt;/code&gt;は、&lt;code&gt;match&lt;/code&gt;でパースに失敗した場合に、&lt;code&gt;tag&lt;/code&gt;というフィールドに指定した文字列を出力する機能になります。
デフォルトだと&lt;code&gt;_grokparsefailure&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-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;filter {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  grok {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    match &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;message&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%{COMBINEDAPACHELOG}&amp;#34;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    break_on_match &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tag_on_failure &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;_message_parse_failure&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#f92672&#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;clientip&lt;/code&gt;、&lt;code&gt;ident&lt;/code&gt;、&lt;code&gt;auth&lt;/code&gt;、&lt;code&gt;timestamp&lt;/code&gt;、&lt;code&gt;verb&lt;/code&gt;、&lt;code&gt;request&lt;/code&gt;、&lt;code&gt;httpversion&lt;/code&gt;、&lt;code&gt;response&lt;/code&gt;、&lt;code&gt;bytes&lt;/code&gt;、&lt;code&gt;referrer&lt;/code&gt;、&lt;code&gt;agent&lt;/code&gt;がgrokフィルタにより抜き出された項目です。&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-json&#34; data-lang=&#34;json&#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;&amp;#34;message&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;アクセスログ&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:#f92672&#34;&gt;&amp;#34;@version&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1&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:#f92672&#34;&gt;&amp;#34;@timestamp&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2014-11-21T07:20:54.387Z&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:#f92672&#34;&gt;&amp;#34;host&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;jupiter.local&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:#f92672&#34;&gt;&amp;#34;path&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/Users/johtani/demo_access_log/2010/access20100201.log&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:#f92672&#34;&gt;&amp;#34;clientip&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;クライアントのIPアドレス&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:#f92672&#34;&gt;&amp;#34;ident&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-&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:#f92672&#34;&gt;&amp;#34;auth&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-&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:#f92672&#34;&gt;&amp;#34;timestamp&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;01/Feb/2010:00:00:26 +0900&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:#f92672&#34;&gt;&amp;#34;verb&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;GET&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:#f92672&#34;&gt;&amp;#34;request&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/images/favicon.ico&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:#f92672&#34;&gt;&amp;#34;httpversion&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1.1&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:#f92672&#34;&gt;&amp;#34;response&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;200&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:#f92672&#34;&gt;&amp;#34;bytes&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;318&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:#f92672&#34;&gt;&amp;#34;referrer&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\&amp;#34;-\&amp;#34;&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:#f92672&#34;&gt;&amp;#34;agent&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\&amp;#34;Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)\&amp;#34;&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;h5 id=&#34;3-日付のパースfilterdate&#34;&gt;3. 日付のパース（filter/date）&lt;/h5&gt;
&lt;p&gt;Logstashは特に指定がない場合、inputでデータを取り出した日付が&lt;code&gt;@timestamp&lt;/code&gt;となります。
そして、このフィールドが特に指定がない場合は、Elasticsearchのデータの日付となり、Kibanaで利用する日付となります。&lt;/p&gt;
&lt;p&gt;リアルタイムにアクセスログを読み込む場合は、読み込んだ日時でもほぼ問題はありませんが、過去データの場合はそうもいきません。
そこで、&lt;a href=&#34;http://logstash.net/docs/1.4.2/filters/date&#34;&gt;&lt;code&gt;dateフィルタ&lt;/code&gt;&lt;/a&gt;を使用して、&lt;code&gt;@timestamp&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-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;date {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  match &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;timestamp&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dd/MMM/YYYY:HH:mm:ss Z&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  locale &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; en
&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;timestamp&lt;/code&gt;という項目に対して&lt;code&gt;dd/MMM/YYYY:HH:mm:ss Z&lt;/code&gt;という日付パターンの場合に値を書き換える設定となります。
なお、日付の月の部分が&lt;code&gt;Feb&lt;/code&gt;となっているため、&lt;code&gt;locale&lt;/code&gt;に&lt;code&gt;en&lt;/code&gt;を指定しています。Logstashが動作するマシンの&lt;code&gt;locale&lt;/code&gt;が&lt;code&gt;ja&lt;/code&gt;などの場合にパースに失敗するためです。&lt;/p&gt;
&lt;h5 id=&#34;4-クライアントipアドレスにgeoipの情報を付加filtergeoip&#34;&gt;&lt;a name=&#34;filter-geoip&#34;&gt;4. クライアントIPアドレスにgeoipの情報を付加（filter/geoip）&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;どの国からのアクセスかなどを判別したいので、IPアドレスを元にgeoipを利用してより詳細な情報を付与します。
Logstashでもこの機能が用意されており、簡単に利用ができます。&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-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;geoip {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  source &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;clientip&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これだけです。対象とするIPアドレスのフィールドを指定しているだけです。
&lt;code&gt;geoip&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-json&#34; data-lang=&#34;json&#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:#960050;background-color:#1e0010&#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;&amp;#34;geoip&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:#f92672&#34;&gt;&amp;#34;ip&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;IPアドレス&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:#f92672&#34;&gt;&amp;#34;country_code2&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;JP&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:#f92672&#34;&gt;&amp;#34;country_code3&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;JPN&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:#f92672&#34;&gt;&amp;#34;country_name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Japan&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:#f92672&#34;&gt;&amp;#34;continent_code&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AS&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:#f92672&#34;&gt;&amp;#34;latitude&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;36&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;&amp;#34;longitude&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;138&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;&amp;#34;timezone&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Asia/Tokyo&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:#f92672&#34;&gt;&amp;#34;location&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:#ae81ff&#34;&gt;138&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:#ae81ff&#34;&gt;36&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:#960050;background-color:#1e0010&#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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;5-リクエストのパスの第1階層の抽出filtergrok&#34;&gt;5. リクエストのパスの第1階層の抽出（filter/grok）&lt;/h5&gt;
&lt;p&gt;リクエストされたURLは&lt;code&gt;request&lt;/code&gt;フィールドにありますが、個別のURLだと、大まかな集計が大変です。
もちろん、クエリで処理することもできますが、Logstashで処理するついでに、第1階層のディレクトリ名を抽出しておくことで、
検索や集計を行いやすくしておきます。&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-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grok {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  match &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;request&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^/%{WORD:first_path}/%{GREEDYDATA}$&amp;#34;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  tag_on_failure &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;_request_parse_failure&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;また、grokフィルタの登場です。
今回は、&lt;code&gt;WORD:first_path&lt;/code&gt;という記述方法で、&lt;code&gt;WORD&lt;/code&gt;パターンにマッチした文字列を&lt;code&gt;first_path&lt;/code&gt;というフィールドに展開する指定をしています。&lt;/p&gt;
&lt;p&gt;例えば、サイトのスクリプトなどが&lt;code&gt;scripts&lt;/code&gt;というディレクトリにある場合は、&lt;code&gt;first_path&lt;/code&gt;の値を利用して、
後続のフィルタでログデータを出力しないといった処理にも使えます。&lt;/p&gt;
&lt;h5 id=&#34;6-ユーザエージェントのパースfilteruseragent&#34;&gt;6. ユーザエージェントのパース（filter/useragent）&lt;/h5&gt;
&lt;p&gt;Logstashではユーザエージェントの文字列から、いくつかの情報を付与するフィルタも用意されています。
&lt;a href=&#34;http://logstash.net/docs/1.4.2/filters/useragent&#34;&gt;&lt;code&gt;useragent&lt;/code&gt;フィルタです。&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;useragent {
  source =&amp;gt; &amp;#34;agent&amp;#34;
  target =&amp;gt; &amp;#34;useragent&amp;#34;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;agent&lt;/code&gt;というフィールドにユーザエージェントの文字列があるので、このフィールドに対してフィルタを適用します。
元の文字列も取っておきたいので、&lt;code&gt;useragent&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-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;useragent&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#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;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Firefox&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:#f92672&#34;&gt;&amp;#34;os&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Windows XP&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:#f92672&#34;&gt;&amp;#34;os_name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Windows XP&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:#f92672&#34;&gt;&amp;#34;device&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Other&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:#f92672&#34;&gt;&amp;#34;major&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;17&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:#f92672&#34;&gt;&amp;#34;minor&amp;#34;&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このように、OS名やバージョン名などが抽出できます。&lt;/p&gt;
&lt;h5 id=&#34;7-elasticsearchへの出力outputelasticsearch&#34;&gt;&lt;a name=&#34;output-elasticsearch&#34;&gt;7. Elasticsearchへの出力（output/elasticsearch）&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;最後は、&lt;a href=&#34;http://logstash.net/docs/1.4.2/outputs/elasticsearch&#34;&gt;Elasticsearchへのデータの出力設定&lt;/a&gt;です。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;index&lt;/code&gt;にて、出力するindex名を指定してあります。
また、年毎のインデックス名にするために&lt;code&gt;%{year}&lt;/code&gt;を利用しています。
&lt;a href=&#34;http://logstash.net/docs/1.4.2/configuration#sprintf&#34;&gt;sprintf format&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-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;elasticsearch {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  host &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;localhost&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  index &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;new_demo_access_log-%{year}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  cluster &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;demo_cluster&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  protocol &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http&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;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、今回はアクセスログをLogstashにて読み込む時の設定について説明してきました。
次回は、実際にLogstashを起動してElasticsearchにデータを登録するところまでを説明します。&lt;/p&gt;
&lt;p&gt;JJUG CCCや勉強会のデモに用いたデータは、
Elasticsearchにデータを登録する前にテンプレートも設定してありました。こちらについても、次回説明しようと思います。&lt;/p&gt;
&lt;p&gt;不明な点、誤植などありましたら、コメント欄へお願いします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第7回Elasticsearch勉強会を開催しました。#elasticsearchjp</title>
      <link>https://blog.johtani.info/blog/2014/11/19/hold-on-7th-elasticsearch-jp/</link>
      <pubDate>Wed, 19 Nov 2014 11:19:07 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/11/19/hold-on-7th-elasticsearch-jp/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://elasticsearch.doorkeeper.jp/events/16837&#34;&gt;第7回Elsticsearch勉強会&lt;/a&gt;を開催しました。
スタッフの皆さん、スピーカーの皆さん、開場提供していただいた&lt;a href=&#34;http://recruit-tech.co.jp&#34;&gt;リクルートテクノロジーズさん&lt;/a&gt;、ありがとうございました！
次回もよろしくお願いします！参加していただき盛り上げていただいた参加者の皆さんもありがとうございました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;http://elasticsearch.doorkeeper.jp/events/16837&#34;&gt;第7回Elsticsearch勉強会&lt;/a&gt;を開催しました。
スタッフの皆さん、スピーカーの皆さん、開場提供していただいた&lt;a href=&#34;http://recruit-tech.co.jp&#34;&gt;リクルートテクノロジーズさん&lt;/a&gt;、ありがとうございました！
次回もよろしくお願いします！参加していただき盛り上げていただいた参加者の皆さんもありがとうございました。&lt;/p&gt;
&lt;p&gt;昨日も紹介しましたが、&lt;a href=&#34;http://qiita.com/advent-calendar/2014/elasticsearch&#34;&gt;Elasticsearch Advent Calendar 2014&lt;/a&gt;を用意してみました。まだ、空きがありますので、登録お待ちしております！&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;今回は出足が好調で、早々に180人の枠を超えるという嬉しい事態でした。
最終的な参加人数は130名程度で、懇親会参加者が50名弱といったところです。&lt;/p&gt;
&lt;h2 id=&#34;kibana4&#34;&gt;「Kibana4」&lt;/h2&gt;
&lt;h3 id=&#34;elasticsearch-inc-jun-ohtani-johtani&#34;&gt;Elasticsearch Inc. Jun Ohtani @johtani&lt;/h3&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://speakerdeck.com/johtani/kibana4&#34;&gt;Kibana4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ということで、Kibana4の紹介と、Kibana4のBeta2を利用したデモを行いました。
デモの開始のところで少し環境がうまく動いてなくて手間取ってしまいましたが。。。&lt;/p&gt;
&lt;p&gt;発表で1点だけ修正があります。JRubyを選択しているのがElasticsearchのライブラリを使用するためという説明をしましたが、
こちらは、Logstashに関する話でした。Kibana4は現時点では、ElasticsearchへのProxyとしての動作が主なものとなります。Rubyでも動作可能です。
bin/kibanaについてはJavaを使った起動になります。
参考：https://github.com/elasticsearch/kibana/tree/master/src/server&lt;/p&gt;
&lt;p&gt;発表でも主張しましたが、ダウンロードして、Elasticsearchを用意すれば簡単に動作させることが可能です。
ぜひ、ローカルで試して見てもらえればと思います。
今回のデモのデータを入れるのに利用したLogstashの設定などについては、ブログで記事を書こうと思います。&lt;/p&gt;
&lt;h2 id=&#34;niconicoの検索を支えるelasticsearch&#34;&gt;niconicoの検索を支えるElasticsearch&lt;/h2&gt;
&lt;h3 id=&#34;株式会社ドワンゴ-伊藤-祥-さん&#34;&gt;株式会社ドワンゴ 伊藤 祥 さん&lt;/h3&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://speakerdeck.com/shoito/niconico-elasticsearch&#34;&gt;niconicoの検索を支えるElasticsearch&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;リアルタイム検索の実現、新しい検索への対応&lt;/li&gt;
&lt;li&gt;検索のアーキテクチャとか。&lt;/li&gt;
&lt;li&gt;Capistranoでデプロイとかを管理&lt;/li&gt;
&lt;li&gt;1.4.1が出たら、クラスタを更新予定&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ということで、実際に導入した話から、現在の運用の仕方、クラスタのアップグレードなど多岐にわたる内容でおもしろかったです。
遭遇した問題点とかもあったので。
Marvel便利なのでぜひ導入を検討してもらえればw&lt;/p&gt;
&lt;h2 id=&#34;elasticsearch-at-crowdworks&#34;&gt;Elasticsearch at CrowdWorks &lt;/h2&gt;
&lt;h3 id=&#34;株式会社クラウドワークス-九岡-佑介-さん-mumoshu&#34;&gt;株式会社クラウドワークス 九岡 佑介 さん @mumoshu&lt;/h3&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/mumoshu/20141118-es&#34;&gt;Elasticsearch at CrowdWorks&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;会社の紹介&lt;/li&gt;
&lt;li&gt;仕事が検索対象&lt;/li&gt;
&lt;li&gt;検索時間が1桁減少！&lt;/li&gt;
&lt;li&gt;Graceful Degradationで失敗したら、InnoDB FTSで代替：&lt;a href=&#34;https://github.com/crowdworks/gracefully&#34;&gt;Gracefully&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.found.no&#34;&gt;found.no&lt;/a&gt;のサービスを利用&lt;/li&gt;
&lt;li&gt;elasticsearch-modelの拡張を作成してOSSとして公開：&lt;a href=&#34;https://github.com/crowdworks/elasticsearch-model-extensions&#34;&gt;elasticsearch-model-extensions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Gracefullyで切り替えとかは面白いなと思いました。
検索での利用の話でしたが、他のシーンでも使えそうですよね。
日本にFoundユーザがいるのも初めて知りました。
彼らの開発者ブログも質の良い情報が載っているので、参考になりますよね。&lt;/p&gt;
&lt;p&gt;次は、どんなMappingで運用しているのかとか、どういった工夫をしているかといった点を詳しく聞きたいなと思いました。
またお待ちしております。&lt;/p&gt;
&lt;h2 id=&#34;1分で作るelasticsearchプラグイン&#34;&gt;1分で作るElasticsearchプラグイン&lt;/h2&gt;
&lt;h3 id=&#34;株式会社エヌツーエスエム-菅谷-信介-さん&#34;&gt;株式会社エヌツーエスエム 菅谷 信介 さん&lt;/h3&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/shinsuke/plugins-ates7&#34;&gt;Elasticsearchプラグインの作り方&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;* プラグインの作り方とか。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;十数個のプラグインの紹介。プラグインはこちらで公開中。&lt;a href=&#34;https://github.com/codelibs/&#34;&gt;https://github.com/codelibs/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;実際に、業務で必要なものから作成&lt;/li&gt;
&lt;li&gt;まだまだ作りたいものがある&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;コミュニティ還元できるものはPR送ってもらえるとうれしいです。
前よりは体制も増えてるので、PRも目にとまるようになってるはずです。&lt;/p&gt;
&lt;p&gt;あとは、使ってみたいと思う方も多数いると思うので、ぜひ、OSSなので、貢献しましょう！
フィードバックがあるだけで、OSS活動やってるものにとってはやる気につながると思いますし。&lt;/p&gt;
&lt;h2 id=&#34;ltgisとして活用するelasticsearch&#34;&gt;LT：GISとして活用するElasticsearch &lt;/h2&gt;
&lt;h3 id=&#34;船戸-隆さん&#34;&gt;船戸 隆さん&lt;/h3&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://speakerdeck.com/tfunato/gistositehuo-yong-suruelasticsearch&#34;&gt;GISとして活用するElasticsearch &lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;java-jaからIngressの青（Registance）の勧誘に来られた方w&lt;/li&gt;
&lt;li&gt;APIをハックして、情報を取得し、Kibanaで可視化&lt;/li&gt;
&lt;li&gt;残念ながら、APIが変更されて見れなくなったらしい。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ingress実際にやったことはないのですが、おもしろそうでした。
発表される方の会社の採用紹介ではなく、Ingressの勧誘をされるとは想定外でしたw&lt;/p&gt;
&lt;p&gt;興味のあるデータをKibanaで可視化するのも面白い例だと思うので、活用してもらえればと思います。&lt;/p&gt;
&lt;h2 id=&#34;その他感想などのブログ&#34;&gt;その他、感想などのブログ&lt;/h2&gt;
&lt;p&gt;適当に見つけたブログを列挙してあります。これもあるよ！などあれば、教えてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.yoslab.com/entry/2014/11/18/203159&#34;&gt;勉強会メモ - 第7回elasticsearch勉強会&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://qiita.com/t-sato/items/940ccfa9e4a668b91967&#34;&gt;第7回elasticsearch勉強会 #elasticsearch #elasticsearchjp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;JJUGの時とは違い、Elasticsearch勉強会ではさすがに、企業としてのElasticsearchの知名度が高かったのはありがたいことでした。
自分の発表のために始めた勉強会でもありますが、まだまだ、発表するときは緊張しますし、分かりにくいんじゃないかなぁと思うことも多々あります。
この辺がわかりにくかった、この辺をもっと知りたいなど、フィードバックをお待ちしております。&lt;/p&gt;
&lt;p&gt;冒頭にも書きましたが、&lt;a href=&#34;http://qiita.com/advent-calendar/2014/elasticsearch&#34;&gt;Elasticsearch Advent Calendar 2014&lt;/a&gt;の登録をお待ちしております。どんなことでも歓迎なので、Elasticsearch、Kibana、Logstashなどについて書いてもらえるとうれしいです。&lt;/p&gt;
&lt;p&gt;次回ももちろん2ヶ月後くらいに行います。 スピーカー募集中ですので、コメント、メール、ツイートなど、コンタクトしていただければと思います。 よろしくお願いいたします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Kibana4</title>
      <link>https://blog.johtani.info/presentation/2014/kibana4/</link>
      <pubDate>Tue, 18 Nov 2014 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2014/kibana4/</guid>
      <description>&lt;p&gt;第7回Elasticsearch勉強会の発表資料
&lt;a href=&#34;http://elasticsearch.doorkeeper.jp/events/16837&#34;&gt;http://elasticsearch.doorkeeper.jp/events/16837&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;第7回Elasticsearch勉強会の発表資料
&lt;a href=&#34;http://elasticsearch.doorkeeper.jp/events/16837&#34;&gt;http://elasticsearch.doorkeeper.jp/events/16837&lt;/a&gt;&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>ElasticsearchとKibanaではじめる検索＆アナリティクス</title>
      <link>https://blog.johtani.info/presentation/2014/elasticsearchtokibanadehazimerujian-suo-anariteikusu/</link>
      <pubDate>Mon, 17 Nov 2014 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2014/elasticsearchtokibanadehazimerujian-suo-anariteikusu/</guid>
      <description>&lt;p&gt;JJUG CCC 2014 Fall発表資料。&lt;/p&gt;
&lt;p&gt;※ライブでもをやりながら説明した資料なので、&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;JJUG CCC 2014 Fall発表資料。&lt;/p&gt;
&lt;p&gt;※ライブでもをやりながら説明した資料なので、&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch 1.4.0および1.3.5リリース（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2014/11/06/elasticsearch-1-4-0-ja/</link>
      <pubDate>Thu, 06 Nov 2014 01:30:33 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/11/06/elasticsearch-1-4-0-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-0-released/&#34;&gt;elasticsearch-1.4.0 and 1.3.5 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日、&lt;strong&gt;Lucene 4.10.2&lt;/strong&gt;をベースにした&lt;strong&gt;Elasticsearch 1.4.0&lt;/strong&gt;と、バグフィックスリリースである、&lt;strong&gt;Elasticsearch 1.3.5&lt;/strong&gt;をリリースしました。
ダウンロードおよび変更リストはそれぞれ次のリンクからアクセスできます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-0-released/&#34;&gt;elasticsearch-1.4.0 and 1.3.5 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日、&lt;strong&gt;Lucene 4.10.2&lt;/strong&gt;をベースにした&lt;strong&gt;Elasticsearch 1.4.0&lt;/strong&gt;と、バグフィックスリリースである、&lt;strong&gt;Elasticsearch 1.3.5&lt;/strong&gt;をリリースしました。
ダウンロードおよび変更リストはそれぞれ次のリンクからアクセスできます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最新ステーブルリリース：&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-4-0&#34;&gt;Elasticsearch 1.4.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;1.3.x系バグフィックス：&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-3-5&#34;&gt;Elasticsearch 1.3.5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;1.3ブランチに関する過去のリリースについてのブログは次のとおりです：&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-3-4-released/&#34;&gt;1.3.4&lt;/a&gt;, &lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-3-3-released/&#34;&gt;1.3.3&lt;/a&gt;, &lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-3-2-released/&#34;&gt;1.3.2&lt;/a&gt;, &lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-3-1-released/&#34;&gt;1.3.1&lt;/a&gt;, &lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-3-0-released/&#34;&gt;1.3.0&lt;/a&gt;.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Beta1リリースでも言及しましたが、1.4.0の主なテーマは*resiliency(復元性、弾力性)*です。
Elasticsearchをより安定し信頼性のあるものにし、メモリ管理を改善し、ディスカバリアルゴリズムを改善し、破損したデータの検知を改善しました。
Beta1リリースからのハイライトも含んでいます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Doc values (インデックス時にディスクに保存される&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.4/fielddata-formats.html#fielddata-formats&#34;&gt;fielddata&lt;/a&gt;)がヒープ利用率を激減&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.4/index-modules-fielddata.html#request-circuit-breaker&#34;&gt;Request circuit breaker&lt;/a&gt;:
メモリを消費しすぎる検索リクエストの中断&lt;/li&gt;
&lt;li&gt;Bloom filterの&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.4/indices-update-settings.html#codec-bloom-load&#34;&gt;デフォルト無効&lt;/a&gt;、高速なインデキシングのためにもはや必要とされないため。&lt;/li&gt;
&lt;li&gt;ノードディスカバリ、シャードリカバリの数多くのバグフィックス及び改善&lt;/li&gt;
&lt;li&gt;データ破損の早期検知のためのチェックサムのさらなる利用&lt;/li&gt;
&lt;li&gt;GroovyをMVELの代わりに&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.4/modules-scripting.html#modules-scripting&#34;&gt;デフォルトスクリプト言語に&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CORSを&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.4/modules-http.html#_settings_2&#34;&gt;デフォルト無効&lt;/a&gt;に。XSS攻撃防止の為。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.4/index-modules-shard-query-cache.html#index-modules-shard-query-cache&#34;&gt;クエリキャッシュ&lt;/a&gt;、変更されていないシャードからすぐにaggregation結果を返す&lt;/li&gt;
&lt;li&gt;新しいAggregation：&lt;code&gt;filter&lt;/code&gt;(&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.4/search-aggregations-bucket-filters-aggregation.html#search-aggregations-bucket-filters-aggregation&#34;&gt;ドキュメント&lt;/a&gt;)、&lt;code&gt;children&lt;/code&gt;(&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.4/search-aggregations-bucket-children-aggregation.html#search-aggregations-bucket-children-aggregation&#34;&gt;ドキュメント&lt;/a&gt;)、&lt;code&gt;scripted_metric&lt;/code&gt;(&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.4/search-aggregations-metrics-scripted-metric-aggregation.html#search-aggregations-metrics-scripted-metric-aggregation&#34;&gt;ドキュメント&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;新しい&lt;code&gt;GET /index&lt;/code&gt;API。インデックスのsettings、mappings、warmers、aliasesを1回のリクエストで返却(&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.4/indices-get-index.html#indices-get-index&#34;&gt;ドキュメント&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;自動付与ドキュメントIDのためのFlake ID。プライマリキーの探索パフォーマンスの改善。&lt;/li&gt;
&lt;li&gt;ドキュメントに変更のない更新によるドキュメントの再インデックスの防止&lt;/li&gt;
&lt;li&gt;&lt;code&gt;function_score&lt;/code&gt;クエリの関数で&lt;code&gt;weight&lt;/code&gt;パラメータによる個別の改善を可能に。(&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.4/query-dsl-function-score-query.html#_weight&#34;&gt;ドキュメント&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;詳細については&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-0-beta-released/&#34;&gt;1.4.0.Beta1のブログ(英語)&lt;/a&gt;(&lt;a href=&#34;http://blog.johtani.info/blog/2014/10/02/elasticsearch-1-4-0-beta-released-ja/&#34;&gt;日本語訳&lt;/a&gt;)をご覧ください。&lt;/p&gt;
&lt;p&gt;Beta1以降の1.4.0の変更の全てについては、&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-4-0&#34;&gt;1.4.0 release notes&lt;/a&gt;でご覧いただけます。
以下では、2つの主な変更について紹介します。&lt;/p&gt;
&lt;h2 id=&#34;http-pipelining&#34;&gt;HTTP Pipelining&lt;/h2&gt;
&lt;p&gt;HTTP pipeliningは複数のリクエストを1回のコネクションで、関連するレスポンスを待つことなく送信することができます。
そして、レスポンスは、受け取ったリクエストと同じ順序で返却されます。
HTTP/1.1の仕様で、pipeliningのサポートが必要です。ElasticsearchはHTTP/1.1であるとしてきましたが、pipeliningはサポートしていませんでした。この問題は.NETユーザで問題を引き起こしました。&lt;/p&gt;
&lt;p&gt;現在、HTTP pipeliningは公式にサポート済みで、デフォルトで利用できます。&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/pull/8299&#34;&gt;#8299&lt;/a&gt;をご覧ください。&lt;/p&gt;
&lt;h2 id=&#34;upgrade-api&#34;&gt;Upgrade API&lt;/h2&gt;
&lt;p&gt;Luceneのすべてのリリースではバグフィックスや最適化が提供されます。しかし、多くのユーザは古いバージョンのLuceneで作成されたインデックスを持っており、より最新の改善による利点を利用できないことがあります。
新しい&lt;code&gt;upgrade&lt;/code&gt;APIは、あなたのインデックスすべてもしくは一部を最新のLuceneフォーマットに透過的にアップグレードできます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GET _upgrade&lt;/code&gt;リクエストは、インデックスのアップグレードが必要かどうかを提示し、アップグレードに必要なセグメントのサイズをリポートすることによって、どのくらいの時間が必要かの目安を提供します。
&lt;code&gt;POST _upgrade&lt;/code&gt;コマンドはバックグラウンドでインデックスを最新のLuceneフォーマットに書き換えます。&lt;/p&gt;
&lt;p&gt;より詳しい情報は&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.4/indices-upgrade.html&#34;&gt;&lt;code&gt;upgrade&lt;/code&gt;APIドキュメント&lt;/a&gt;をご覧ください。&lt;/p&gt;
&lt;h2 id=&#34;試してみてください&#34;&gt;試してみてください。&lt;/h2&gt;
&lt;p&gt;Beta1リリースを利用し、経験・体験を報告していただいたベータテスターの方々に感謝します。
1.4.0がこれまでの最高のリリースになると確信しています。
ぜひ、&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-4-0&#34;&gt;Elasticsearch 1.4.0&lt;/a&gt;をダウンロードして、試してみてください。
そして、感想をTwitter(&lt;a href=&#34;https://twitter.com/elasticsearch&#34;&gt;@elasticsearch&lt;/a&gt;)などで教えて下さい。
また、問題がありましたら、&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues&#34;&gt;GitHub issues page&lt;/a&gt;で報告をお願いします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Shield: ご存知の通り、セキュリティのためのもの(coming soon)、日本語訳</title>
      <link>https://blog.johtani.info/blog/2014/11/05/shield-know-security-coming-soon-ja/</link>
      <pubDate>Wed, 05 Nov 2014 12:30:06 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/11/05/shield-know-security-coming-soon-ja/</guid>
      <description>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.com/blog/shield-know-security-coming-soon/&#34;&gt;Shield: You Know, For Security (Coming Soon)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Elasticsearchの初期のころから、外部システムとして使うElasticsearchをセキュアにすることが望まれていました。
例えば、Elasticsearch APIはREST over HTTPとして危険にさらされており、ユーザは&lt;a href=&#34;http://www.elasticsearch.org/blog/playing-http-tricks-nginx/&#34;&gt;プロキシ&lt;/a&gt;やファイアウォールでそれをセキュアにします。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;※この記事は次のブログを翻訳したものになります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.com/blog/shield-know-security-coming-soon/&#34;&gt;Shield: You Know, For Security (Coming Soon)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Elasticsearchの初期のころから、外部システムとして使うElasticsearchをセキュアにすることが望まれていました。
例えば、Elasticsearch APIはREST over HTTPとして危険にさらされており、ユーザは&lt;a href=&#34;http://www.elasticsearch.org/blog/playing-http-tricks-nginx/&#34;&gt;プロキシ&lt;/a&gt;やファイアウォールでそれをセキュアにします。&lt;/p&gt;
&lt;p&gt;ElasticsearchとELKスタックの爆発的な選択で、私たちのカスタマーやユーザは外部システムを使って実現することなく、先進的な機能でセキュリティ・ソリューションをより統合できるものを求めました。&lt;/p&gt;
&lt;p&gt;カスタマー（彼らの非常に大切なセキュリティ要件を持つ一部の）と多くの時を過ごした後、私たちはElasticsearchでセキュリティプロダクト（Shieldと命名）に取り組み始めました。
（Marvelファンなら、とあるテーマを感じると思います。:)）&lt;/p&gt;
&lt;p&gt;ここ数ヶ月、ミートアップでカスタマーやユーザと話をするために世界中を旅して周り、Shieldについて説明し、人々はそれを聞いて興奮しました。
この理由のために、私たちはセキュリティプロダクトに取り組んでいることを公開することが意味があると思いましした。
それが何であるか説明し、年末までにリリースしようと思っています。&lt;/p&gt;
&lt;p&gt;Shieldは、&lt;a href=&#34;http://www.elasticsearch.com/products/marvel/&#34;&gt;Marvel&lt;/a&gt;と同じ精神のもと、Elasticsearchの公開されている拡張ポイントの上に作られており、プラグインとして既存のElasticsearchに簡単にインストールできます。
Elasticsearchの異なるディストリビューションは必要ありませんし、Elasticsearchがすでに公開しているオープンなAPIに依存しています。&lt;/p&gt;
&lt;p&gt;Shield自体は次の主な４つの機能を提供します。&lt;/p&gt;
&lt;h3 id=&#34;role-based-access-control&#34;&gt;Role-Based Access Control&lt;/h3&gt;
&lt;p&gt;Elasticsearchクラスタの各ユーザのためのクラスタ、インデックス、エイリアスレベルのパーミッションをセットできます。
例えば、マーケティング部門には、センシティブな財務データへのアクセスを防ぎつつ、read-onlyパーミッションでソーシャルメディアを自由に検索、解析することができるようにします。&lt;/p&gt;
&lt;h3 id=&#34;authentication-system-support&#34;&gt;Authentication System Support&lt;/h3&gt;
&lt;p&gt;LDAPベースの認証システムならびにActive DirectoryとShieldは統合できるので、あなたのユーザがさらに別のパスワードを覚える必要がありません。
また、Elasticsearchですべてのアクセスを管理したいユーザのために、ネイティブな認証システムも提供します。&lt;/p&gt;
&lt;h3 id=&#34;encrypted-communications&#34;&gt;Encrypted Communications&lt;/h3&gt;
&lt;p&gt;Node間の暗号化でデータを侵入者から守ります。証明書ベースのSSL/TLS暗号化とHTTPSを用いたセキュアクライアント通信で、Shieldは保護されたデータ通信を保持します。&lt;/p&gt;
&lt;p&gt;Shield keeps data traveling over the wire protected.&lt;/p&gt;
&lt;h3 id=&#34;audit-logging&#34;&gt;Audit Logging&lt;/h3&gt;
&lt;p&gt;コンプライアンスを確実にし、Elasticsearchの配置で起きるセキュリティに関するアクティビティの動きを監視します。
ログイン失敗や未認可の情報へのアクセスを記録します。&lt;/p&gt;
&lt;p&gt;最近では、テストであることを説明した一部のカスタマーに対して、ベータ版の提供を開始しました。
利用するユーザのために最終的なプロダクトへの価値あるフィードバックを学んでおり、興奮しております。&lt;/p&gt;
&lt;p&gt;最後に、Shieldが既存と将来の&lt;a href=&#34;http://www.elasticsearch.com/support&#34;&gt;サブスクリプションカスタマー&lt;/a&gt;に対しては無償で提供されることを発表できることを喜んでいます。&lt;/p&gt;
&lt;p&gt;私たちのカスタマーは、彼らの開発とプロダクションへの配備を通して彼らを支えることで、プロダクト自身を開発することによる大きな投資と同じくらい、私たちのデベロッパーと良い関係を築き、楽しんでいます。
さらに、Shieldを使うためのオプションを（追加費用無しで）提供することにわくわくしています。&lt;/p&gt;
&lt;p&gt;私たちはShieldを、最も大変なセキュリティ要件でさえ満足させることができる、ELKスタックがセキュアになるためのone-stop店舗のように開発します。
私たちは、カスタマーに対してこれを利用可能とすることに興奮し、同様にみなさんもそうであると望んでいます。&lt;/p&gt;
&lt;p&gt;リリース日が近づくので、&lt;a href=&#34;http://www.elasticsearch.com/products/shield/&#34;&gt;今後も楽しみにしてください&lt;/a&gt;。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>validate APIの利用</title>
      <link>https://blog.johtani.info/blog/2014/10/27/how-to-use-validate-api/</link>
      <pubDate>Mon, 27 Oct 2014 18:42:31 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/10/27/how-to-use-validate-api/</guid>
      <description>&lt;p&gt;久しぶりに翻訳ではないブログを。書こうと思いながらかけてなかったので。。。&lt;/p&gt;
&lt;p&gt;今回は&lt;a href=&#34;http://www.elasticsearch.org/guide/ep/elasticsearch/reference/current/search-validate.html&#34;&gt;validate API&lt;/a&gt;の紹介です。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;背景&#34;&gt;背景&lt;/h2&gt;
&lt;p&gt;Elasticsearchのクエリは&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl.html&#34;&gt;Query DSL&lt;/a&gt;というJSONで
クエリを定義できるものを提供しています。
これは、様々な&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-queries.html&#34;&gt;クエリ&lt;/a&gt;、&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-filters.html&#34;&gt;フィルタ&lt;/a&gt;を定義するために必要です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;久しぶりに翻訳ではないブログを。書こうと思いながらかけてなかったので。。。&lt;/p&gt;
&lt;p&gt;今回は&lt;a href=&#34;http://www.elasticsearch.org/guide/ep/elasticsearch/reference/current/search-validate.html&#34;&gt;validate API&lt;/a&gt;の紹介です。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;背景&#34;&gt;背景&lt;/h2&gt;
&lt;p&gt;Elasticsearchのクエリは&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl.html&#34;&gt;Query DSL&lt;/a&gt;というJSONで
クエリを定義できるものを提供しています。
これは、様々な&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-queries.html&#34;&gt;クエリ&lt;/a&gt;、&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-filters.html&#34;&gt;フィルタ&lt;/a&gt;を定義するために必要です。&lt;/p&gt;
&lt;p&gt;自分の望んでいる条件を記述するために、JSONのネストと格闘することも必要となります。。。
また、クエリ、フィルタには様々なパラメータが用意されています。
これらのパラメータをすべて覚えるのは無理でしょうし、タイプミスなどもありますよね。
タイプミスやカッコのミスマッチなどで格闘して1時間が経過してしまったなどもあると思います。&lt;/p&gt;
&lt;p&gt;そんな時に便利なAPIとして用意されているのが&lt;a href=&#34;http://www.elasticsearch.org/guide/ep/elasticsearch/reference/current/search-validate.html&#34;&gt;validate API&lt;/a&gt;です。&lt;/p&gt;
&lt;h2 id=&#34;利用方法&#34;&gt;利用方法&lt;/h2&gt;
&lt;p&gt;APIが用意されています。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;http://ホスト名:ポート番号/インデックス名/タイプ名/_validate/query
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;インデックス名&lt;/code&gt;や&lt;code&gt;タイプ名&lt;/code&gt;は省略可能ですが、マッピングが異なると思うので、タイプ名まで指定するほうが良いと思います。
上記のAPIに対してクエリを送信するだけです。&lt;/p&gt;
&lt;h3 id=&#34;クエリの確認&#34;&gt;クエリの確認&lt;/h3&gt;
&lt;p&gt;たとえば、&lt;a href=&#34;https://gist.github.com/johtani/08dee5fb4da62037ef9e&#34;&gt;こちらのGist&lt;/a&gt;にあるようなマッピングのインデックスに対して
検索クエリを組み立てていて、エラーが出るとします。
※このクエリは&lt;code&gt;match_all&lt;/code&gt;のところを&lt;code&gt;match_al&lt;/code&gt;と、&lt;code&gt;l&lt;/code&gt;が1文字足りないクエリになっています。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;検索クエリのリクエスト（エラーあり）&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;GET pref_aggs/_search
{
  &amp;#34;query&amp;#34;: {
    &amp;#34;match_al&amp;#34;: {}
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;実行結果のレスポンス&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{
   &amp;#34;error&amp;#34;: &amp;#34;SearchPhaseExecutionException[Failed to execute phase [query], all shards failed; shardFailures {[rwkb01chTZq2V7FD0Tlwrw][pref_aggs][0]: SearchParseException[[pref_aggs][0]: from[-1],size[-1]: Parse Failure [Failed to parse source [{\n  \&amp;#34;query\&amp;#34;: {\n    \&amp;#34;match_al\&amp;#34;: { }\n  }\n}\n]]]; nested: QueryParsingException[[pref_aggs] No query registered for [match_al]]; }{[rwkb01chTZq2V7FD0Tlwrw][pref_aggs][1]: SearchParseException[[pref_aggs][1]: from[-1],size[-1]: Parse Failure [Failed to parse source [{\n  \&amp;#34;query\&amp;#34;: {\n    \&amp;#34;match_al\&amp;#34;: { }\n  }\n}\n]]]; nested: QueryParsingException[[pref_aggs] No query registered for [match_al]]; }]&amp;#34;,
   &amp;#34;status&amp;#34;: 400
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;とこんなかんじで、エラーが帰っては来るのですが、非常に読みづらいです。&lt;/p&gt;
&lt;p&gt;そこで、&lt;code&gt;validate API&lt;/code&gt;を利用します。
リクエスト先を&lt;code&gt;/_search&lt;/code&gt;から&lt;code&gt;/_validate/query&lt;/code&gt;に変更します。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;validate API&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;GET pref_aggs/_validate/query
{
  &amp;#34;query&amp;#34;: {
    &amp;#34;match_al&amp;#34;: {}
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;validate APIのレスポンス&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{
   &amp;#34;valid&amp;#34;: false,
   &amp;#34;_shards&amp;#34;: {
      &amp;#34;total&amp;#34;: 1,
      &amp;#34;successful&amp;#34;: 1,
      &amp;#34;failed&amp;#34;: 0
   }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;すると、非常にシンプルな結果が返ってきます。
&lt;code&gt;&amp;quot;valid&amp;quot;: false&lt;/code&gt;となっているため、クエリに問題があることがわかります。&lt;/p&gt;
&lt;h3 id=&#34;エラーの詳細&#34;&gt;エラーの詳細&lt;/h3&gt;
&lt;p&gt;問題がある事自体はわかりましたが、エラーの内容も知りたいですよね？
その場合は、&lt;code&gt;explain&lt;/code&gt;というパラメータを追加します。
（正しくは&lt;code&gt;explain=true&lt;/code&gt;を追加しますが、&lt;code&gt;=true&lt;/code&gt;を省略可能です。）&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;validate API(explainあり、クエリ自体は省略)&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;GET pref_aggs/_validate/query?explain
{...}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;validate APIのレスポンス&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{
   &amp;#34;valid&amp;#34;: false,
   &amp;#34;_shards&amp;#34;: {
      &amp;#34;total&amp;#34;: 1,
      &amp;#34;successful&amp;#34;: 1,
      &amp;#34;failed&amp;#34;: 0
   },
   &amp;#34;explanations&amp;#34;: [
      {
         &amp;#34;index&amp;#34;: &amp;#34;pref_aggs&amp;#34;,
         &amp;#34;valid&amp;#34;: false,
         &amp;#34;error&amp;#34;: &amp;#34;org.elasticsearch.index.query.QueryParsingException: [pref_aggs] No query registered for [match_al]&amp;#34;
      }
   ]
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;explanations&lt;/code&gt;という項目が追加されました。
ここに&lt;code&gt;error&lt;/code&gt;という項目として、エラーの詳細が返ってきます。&lt;code&gt;_search&lt;/code&gt;の時よりも見やすいですね。
今回のエラーは、&lt;code&gt;match_all&lt;/code&gt;が正しいクエリですの、&lt;em&gt;&lt;code&gt;match_al&lt;/code&gt;というクエリは登録されていないというエラー&lt;/em&gt;でした。
では、クエリを修正して実行しましょう。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;validate API(エラー無し)&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;GET pref_aggs/_validate/query?explain
{
  &amp;#34;query&amp;#34;: {
    &amp;#34;match_all&amp;#34;: {}
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;validate APIのレスポンス&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{
   &amp;#34;valid&amp;#34;: true,
   &amp;#34;_shards&amp;#34;: {
      &amp;#34;total&amp;#34;: 1,
      &amp;#34;successful&amp;#34;: 1,
      &amp;#34;failed&amp;#34;: 0
   },
   &amp;#34;explanations&amp;#34;: [
      {
         &amp;#34;index&amp;#34;: &amp;#34;pref_aggs&amp;#34;,
         &amp;#34;valid&amp;#34;: true,
         &amp;#34;explanation&amp;#34;: &amp;#34;ConstantScore(*:*)&amp;#34;
      }
   ]
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;今度はクエリに問題はありません。&lt;code&gt;&amp;quot;valid&amp;quot;: true&lt;/code&gt;です。
そして、&lt;code&gt;explanations&lt;/code&gt;の項目には、&lt;code&gt;error&lt;/code&gt;の代わりに&lt;code&gt;explanation&lt;/code&gt;という項目が返ってきました。
これが、実際にElasticsearch内部で実行されるクエリになります。&lt;/p&gt;
&lt;h3 id=&#34;実際のクエリに利用される単語の確認&#34;&gt;実際のクエリに利用される単語の確認&lt;/h3&gt;
&lt;p&gt;この機能はこの他に、クエリの解析にも利用できます。
思ったとおりに検索にヒットしない場合があって、困ったことはないですか？
フィールドに指定されたアナライザによっては、単語を変形したりするものが存在します。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;サンプルマッピング&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;PUT /validate_sample
{
  &amp;#34;mappings&amp;#34;: {
    &amp;#34;several_analyzer&amp;#34;: {
      &amp;#34;properties&amp;#34;: {
        &amp;#34;title&amp;#34;: {&amp;#34;type&amp;#34;: &amp;#34;string&amp;#34;},
        &amp;#34;body_ja&amp;#34;: {&amp;#34;type&amp;#34;: &amp;#34;string&amp;#34;, &amp;#34;analyzer&amp;#34;: &amp;#34;kuromoji&amp;#34;},
        &amp;#34;body_en&amp;#34;: {&amp;#34;type&amp;#34;: &amp;#34;string&amp;#34;, &amp;#34;analyzer&amp;#34;: &amp;#34;english&amp;#34;}
      }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;例えば、このように&lt;code&gt;kuromoji&lt;/code&gt;、&lt;code&gt;english&lt;/code&gt;、デフォルト(&lt;code&gt;standard&lt;/code&gt;)アナライザを利用したマッピングがあるとします。
このフィールドに対して&lt;code&gt;powerful&lt;/code&gt;という単語で検索したとします。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;validate API&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;GET /validate_sample/_validate/query?explain
{
  &amp;#34;query&amp;#34;: {
    &amp;#34;multi_match&amp;#34;: {
      &amp;#34;fields&amp;#34;: [&amp;#34;body_en&amp;#34;,&amp;#34;body_ja&amp;#34;,&amp;#34;title&amp;#34;],
      &amp;#34;query&amp;#34;: &amp;#34;powerful&amp;#34;
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;この場合、レスポンスは次のとおりです。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;validate APIのレスポンス&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{
   &amp;#34;valid&amp;#34;: true,
   &amp;#34;_shards&amp;#34;: {
      &amp;#34;total&amp;#34;: 1,
      &amp;#34;successful&amp;#34;: 1,
      &amp;#34;failed&amp;#34;: 0
   },
   &amp;#34;explanations&amp;#34;: [
      {
         &amp;#34;index&amp;#34;: &amp;#34;validate_sample&amp;#34;,
         &amp;#34;valid&amp;#34;: true,
         &amp;#34;explanation&amp;#34;: &amp;#34;(title:powerful | body_en:power | body_ja:powerful)&amp;#34;
      }
   ]
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;title&lt;/code&gt;、&lt;code&gt;body_ja&lt;/code&gt;については入力された単語がそのままクエリとして利用されています。
&lt;code&gt;body_en&lt;/code&gt;については、&lt;code&gt;power&lt;/code&gt;という単語に変換されて実行されています。
これは、&lt;code&gt;english&lt;/code&gt;アナライザがステミングを行った結果がクエリとして利用されるという意味です。
また、&lt;code&gt;powerful&lt;/code&gt;を&lt;code&gt;秋葉原&lt;/code&gt;といった日本語に変更して実行すると次のようになります。
日本語は&lt;code&gt;standard&lt;/code&gt;アナライザなどでは、1文字ずつ区切られてしまうことがわかります。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;validate APIのレスポンス&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{
   &amp;#34;valid&amp;#34;: true,
   &amp;#34;_shards&amp;#34;: {
      &amp;#34;total&amp;#34;: 1,
      &amp;#34;successful&amp;#34;: 1,
      &amp;#34;failed&amp;#34;: 0
   },
   &amp;#34;explanations&amp;#34;: [
      {
         &amp;#34;index&amp;#34;: &amp;#34;validate_sample&amp;#34;,
         &amp;#34;valid&amp;#34;: true,
         &amp;#34;explanation&amp;#34;: &amp;#34;((title:秋 title:葉 title:原) | (body_en:秋 body_en:葉 body_en:原) | ((body_ja:秋葉 body_ja:秋葉原) body_ja:原))&amp;#34;
      }
   ]
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;このように、クエリの単語がどのような単語に変換されてクエリに利用されているかなども知ることが可能です。&lt;/p&gt;
&lt;p&gt;また、クエリを組み立てて、ヒットするはずが、0件となってしまうという場合にも、どのようなクエリが組み立てられているかを確認するという点で、
&lt;code&gt;validate API&lt;/code&gt;が役立ちます。
検索がヒットするが、望んだクエリになっていないのでは？という場合は&lt;code&gt;_search API&lt;/code&gt;の&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-explain.html&#34;&gt;&lt;code&gt;explain&lt;/code&gt;パラメータ&lt;/a&gt;を
利用すれば、クエリの構成がわかるのですが、検索結果が0件の場合はクエリの構成は表示されません。&lt;/p&gt;
&lt;h2 id=&#34;解決できない問題は&#34;&gt;解決できない問題は？&lt;/h2&gt;
&lt;p&gt;便利なvalidate APIですが、以下の問題に対しては残念ながら確認できません。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;query&lt;/code&gt;以外の項目のvalidate不可
&lt;ul&gt;
&lt;li&gt;たとえば、&lt;code&gt;_search API&lt;/code&gt;の&lt;code&gt;size&lt;/code&gt;などの項目についてはチェックできないです。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;存在しないフィールドの指定
&lt;ul&gt;
&lt;li&gt;上記&lt;code&gt;validate_sample&lt;/code&gt;のマッピングの例でクエリに&lt;code&gt;body_eng&lt;/code&gt;という存在しないフィールドを指定してもエラーとはなりません。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;書いたクエリがうまく動かない、JSONのタグがおかしいといった場合は、
まずはこの&lt;code&gt;validate API&lt;/code&gt;で確認してみるのがオススメです。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Sonatypeのバージョン番号で困ったので</title>
      <link>https://blog.johtani.info/blog/2014/10/15/versioning-of-sonatype/</link>
      <pubDate>Wed, 15 Oct 2014 15:26:08 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/10/15/versioning-of-sonatype/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://blog.johtani.info/blog/2014/10/02/elasticsearch-1-4-0-beta-released-ja/&#34;&gt;Elasticsearch 1.4.0.Beta1がリリース&lt;/a&gt;されました。&lt;/p&gt;
&lt;p&gt;個人で&lt;a href=&#34;https://github.com/johtani/elasticsearch-extended-analyze&#34;&gt;elasticsearch-extended-analyze&lt;/a&gt;というプラグインを開発してます。
こちらも1.4.0.Beta1に対応するべく作業をしてて、少し戸惑ったことがあったので、メモをば。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;http://blog.johtani.info/blog/2014/10/02/elasticsearch-1-4-0-beta-released-ja/&#34;&gt;Elasticsearch 1.4.0.Beta1がリリース&lt;/a&gt;されました。&lt;/p&gt;
&lt;p&gt;個人で&lt;a href=&#34;https://github.com/johtani/elasticsearch-extended-analyze&#34;&gt;elasticsearch-extended-analyze&lt;/a&gt;というプラグインを開発してます。
こちらも1.4.0.Beta1に対応するべく作業をしてて、少し戸惑ったことがあったので、メモをば。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;ここ最近はプラグインのバージョン番号をElasticsearchのバージョン番号と同じものを利用していました。
（プラグインの機能追加をサボってる？？）
その時に、&lt;code&gt;1.4.0.Beta1&lt;/code&gt;という番号を指定したのですが、意味不明なエラーに悩まされてしまいまして。&lt;/p&gt;
&lt;p&gt;プラグインのリリースでは、以下のコマンドを実行します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ mvn release:prepare
$ mvn release:perform
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;最初のコマンド（prepare）で、パッケージングを実施し、Githubにリリースタグを打ったバージョンがpushされます。
次のコマンド（perform）で、パッケージングされたzipファイルがsonatypeのサイトに公開するためにアップロードされます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;1.4.0.Beta1&lt;/code&gt;というバージョン文字列を利用した場合、prepareは問題なく実行できたのですが、
performで以下の様なエラーが返ってきました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Return code is: 401, ReasonPhrase: Unauthorized.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;バージョン番号が&lt;code&gt;1.3.0&lt;/code&gt;では特に問題はなかったのですが、、、
結局、バージョン番号を&lt;code&gt;1.4.0-beta1&lt;/code&gt;に変更すると問題なくリリースが完了しました。&lt;/p&gt;
&lt;p&gt;mike_neckさんと話をしていて、&lt;a href=&#34;http://semver.org&#34;&gt;Semantic Versioning&lt;/a&gt;に関係しているのかなぁという話にはなったのですが、
詳しく調べていません。。。&lt;/p&gt;
&lt;p&gt;そのうち調べようかなぁ。。。。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>elasticsearch 1.4.0.Beta1のリリース</title>
      <link>https://blog.johtani.info/blog/2014/10/02/elasticsearch-1-4-0-beta-released-ja/</link>
      <pubDate>Thu, 02 Oct 2014 19:14:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/10/02/elasticsearch-1-4-0-beta-released-ja/</guid>
      <description>&lt;p&gt;※この記事は次のブログを翻訳したものになります。&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-0-beta-released/&#34;&gt;elasticsearch 1.4.0.beta1 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日、&lt;em&gt;Lucene 4.10.1&lt;/em&gt;をベースにした、&lt;em&gt;Elasticsearch 1.4.0.Beta1&lt;/em&gt;をリリースしました。
&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-4-0-Beta1&#34;&gt;Elasticsearch 1.4.0.Beta1&lt;/a&gt;からダウンロードできます。
また、すべての変更点に関してもこちらをご覧ください。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;※この記事は次のブログを翻訳したものになります。&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-4-0-beta-released/&#34;&gt;elasticsearch 1.4.0.beta1 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日、&lt;em&gt;Lucene 4.10.1&lt;/em&gt;をベースにした、&lt;em&gt;Elasticsearch 1.4.0.Beta1&lt;/em&gt;をリリースしました。
&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-4-0-Beta1&#34;&gt;Elasticsearch 1.4.0.Beta1&lt;/a&gt;からダウンロードできます。
また、すべての変更点に関してもこちらをご覧ください。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;1.4.0のテーマは*resiliency(復元性、弾力性)*です。
&lt;em&gt;resiliency&lt;/em&gt;とはElasticsearchをより安定し信頼性のあるものにすることを意味します。
すべての機能が正常に機能している場合は信頼することは簡単です。
予想外のことが発生した時に難しくなります：ノードでout of memoryの発生、スローGCや重いI/O、ネットワーク障害、不安定なデータの送信によるノードのパフォーマンス低下など。&lt;/p&gt;
&lt;p&gt;本ベータリリースは、resiliencyの主な3つの改善を含んでいます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#memory-mgmt&#34;&gt;メモリ使用量の低下&lt;/a&gt;によるノードの安定性向上&lt;/li&gt;
&lt;li&gt;discoveryアルゴリズムの改善による&lt;a href=&#34;#cluster-stability&#34;&gt;クラスタの安定性&lt;/a&gt;向上&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#checksums&#34;&gt;チェックサム&lt;/a&gt;の導入による破損したデータの検知&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;分散システムは複雑です。
決して想像できないような状況をシミュレーションするために、ランダムなシナリオを作成する広範囲なテストスイートを持っています。
しかし、無数のエッジケース(特殊なケース)があることも認識しています。
1.4.0.Beta1はこれまで私たちが行ってきた改善のすべてを含んでいます。
これらの変更を実際にテストしていただき、&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues&#34;&gt;何か問題があった場合は私たちに教えてください&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id=&#34;メモリ管理&#34;&gt;&lt;a name=&#34;memory-mgmt&#34;&gt;メモリ管理&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ヒープ空間は限られたリソースです。
上限を32GBとし、利用可能なRAMの50%をヒープの上限にすることを推奨します。
この上限を超えた場合、JVMは圧縮したポインタを使用することができず、GCが非常に遅くなります。
ノードの不安定性の主な原因は遅いGCです。それは、次のようなことから発生します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メモリプレッシャー&lt;/li&gt;
&lt;li&gt;スワップ(参照：&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.4/setup-configuration.html#setup-configuration-memory&#34;&gt;memory settings&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;非常に大きなヒープ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本リリースは、メモリ管理の改善し、（結果として）ノードの安定性を改善するいくつかの変更を含んでいます。&lt;/p&gt;
&lt;h3 id=&#34;doc-values&#34;&gt;doc values&lt;/h3&gt;
&lt;p&gt;メモリの利用の最も大きなものの1つは&lt;strong&gt;fielddata&lt;/strong&gt;です
aggregation、ソート、スクリプトがフィールドの値に素早くアクセスするために、フィールドの値をメモリにロードして保持します。
ヒープは貴重なため、1ビットも無駄にしないためにメモリ内のデータは高度な圧縮と最適化を行っています。
これは、ヒープスペース以上のデータをもつまでは、非常によく動作します。
これは、多くのノードを追加することによって常に解決できる問題です。
しかし、CPUやI/Oが限界に達してしまうずっと前に、ヒープ空間の容量に到達します。&lt;/p&gt;
&lt;p&gt;最近のリリースは、&lt;strong&gt;doc values&lt;/strong&gt;によるサポートがあります。
基本的に、doc valuesはin-memory fielddataと同じ機能を提供します。
doc valuesの提供する利点は、それらが、非常に少量のヒープ空間しか使用しない点です。
doc valuesはメモリからではなく、ディスクから読み込まれます。
ディスクアクセスは遅いですが、doc valuesはカーネルのファイルシステムキャッシュの利点を得られます。
ファイルシステムキャッシュはJVMヒープとはことなり、32GBの制限による束縛がありません。
ヒープからファイルシステムキャッシュにfielddataを移行することによって、より小さなヒープを使うことができます。これは、GCがより早くなり、ノードが更に安定することを意味します。&lt;/p&gt;
&lt;p&gt;本リリースより前は、doc valuesはin-memory fielddataよりもかなり遅かったです。
本リリースに含まれる変更は、パフォーマンスをかなり向上させ、in-memory fielddataとほぼ同じくらいの速度になっています。&lt;/p&gt;
&lt;p&gt;in-memory fielddataの代わりにdoc valuesを利用するために必要なことは、次のように新しいフィールドをマッピングすることです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;PUT /my_index
{
  &amp;#34;mappings&amp;#34;: {
    &amp;#34;my_type&amp;#34;: {
      &amp;#34;properties&amp;#34;: {
        &amp;#34;timestamp&amp;#34;: {
          &amp;#34;type&amp;#34;:       &amp;#34;date&amp;#34;,
          &amp;#34;doc_values&amp;#34;: true
        }
      }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;このマッピングで、このフィールドに対するfielddataの利用は、メモリにフィールドをロードする代わりに、自動的にディスクからdoc valuesを利用します。
*注意：*現時点で、doc valuesはanalyzedな&lt;code&gt;string&lt;/code&gt;フィールドはサポートしていません。&lt;/p&gt;
&lt;h3 id=&#34;request-circuit-breaker&#34;&gt;request circuit breaker&lt;/h3&gt;
&lt;p&gt;fielddata circuit breakerはfielddataによって利用されるメモリの上限を制限するために追加され、OOMEの最も大きな原因の1つを防ぎました。
そして、&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.4/index-modules-fielddata.html#request-circuit-breaker&#34;&gt;リクエストレベルのcircuit-breaker&lt;/a&gt;を提供するために、コンセプトを拡張しました。
これは、単一のリクエストによって使用されるメモリの上限を制限します。&lt;/p&gt;
&lt;h3 id=&#34;bloom-filters&#34;&gt;bloom filters&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;http://en.wikipedia.org/wiki/Bloom_filter&#34;&gt;Bloom filters&lt;/a&gt; はインデキシング(前のバージョンのドキュメントが存在するかどうかのチェックのため)や、
IDによるドキュメントの検索(ドキュメントを含むセグメントがどれかを決定するため)に関する重要な性能最適化を提供しました。
しかし、もちろんそれらはコスト（メモリ）を必要とします。
現在の改善は、bloom filterの必要性を取り除きました。
現在では、Elasticsearchはまだ、インデックス時にそれらを構築します(実世界の経験がテストシナリオにそぐわない場合に備えて)。
しかし、デフォルトではメモリにはロードされません。
すべてが予定通りに運べば、将来のバージョンで完全にこれらは除去します。&lt;/p&gt;
&lt;h2 id=&#34;クラスタの安定性&#34;&gt;&lt;a name=&#34;cluster-stability&#34;&gt;クラスタの安定性&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;クラスタの安定性向上のために私たちができる最も大きなことは、ノードの安定性の向上です。
もし、ノードが安定しておりタイミングよく反応すれば、クラスタが不安定になる可能性が大いに減少します。
私たちは不完全な世界に住んでいます。- 物事は予想外にうまく行きません。クラスタはデータを失うことなくこのような状況から回復できる必要があります。&lt;/p&gt;
&lt;p&gt;私たちは、&lt;code&gt;improve_zen&lt;/code&gt;ブランチ上で、Elasticsearchの障害からの復旧するための能力の向上に数ヶ月費やしてきました。
まず、複雑なネットワークレベルの障害を繰り返すためのテストを追加しました。
次に、各テストのための修正を追加しました。
そこには、より多くの行うことが存在します。しかし、私たちは、&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues/2488&#34;&gt;issue #2488&lt;/a&gt;(&amp;ldquo;分割が交差している場合、minimum_master_nodesはsplit-brainを防げない&amp;rdquo;)に含まれる、ユーザが経験してきた大部分の問題を私たちは解決しました。&lt;/p&gt;
&lt;p&gt;私たちはクラスタのresiliencyを非常に真剣に取り組んでいます。
私たちは、Elasticsearchが何ができるか、その上で何が弱点であるかを理解してほしいと思っています。
これを考慮して、私たちは&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/resiliency/current/index.html&#34;&gt;Resiliency Status Document&lt;/a&gt;を作成しました。
このドキュメントは、私たち(または私たちユーザ)が遭遇したresiliencyの問題の、何が修正済みで、何が修正されないまま残っているかを記録します。
このドキュメントを慎重に読み、あなたのデータを保護するために適切な方法を選択してください。&lt;/p&gt;
&lt;h2 id=&#34;データ破損の検知&#34;&gt;&lt;a name=&#34;checksums&#34;&gt;データ破損の検知&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ネットワークをまたいだシャードリカバリのチェックサムは、圧縮ライブラリのバグを発見する助けとなりました。
それは、バージョン1.3.2で修正済みです。
それ以来、私たちはElasticsearchのいたるところにチェックサムとチェックサムの確認を追加しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;マージ中に、あるセグメント内すべてのチェックサムの確認(&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues/7360&#34;&gt;#7360&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;インデックス再オープン時に、あるセグメント内の最も小さなファイルの完全な確認と、より大きなファイルの軽量な打ち切りチェック(&lt;a href=&#34;https://issues.apache.org/jira/browse/LUCENE-5842&#34;&gt;LUCENE-5842&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;トランザクションログからイベントを再生するとき、各イベントはチェックサムを確認される(&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues/6554&#34;&gt;#6554&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;シャードのリカバリ中もしくは、スナップショットからのリストア中にElasticsearchはローカルファイルとリモートのコピーが同一であるか確認する必要がある。ファイルの長さとチェックサムのみを使うのは不十分であることが確認された。このため、現在はセグメントのすべてのファイルの同一性を確認(&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues/7159&#34;&gt;#7159&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;http://www.elasticsearch.org/downloads/1-4-0-Beta1&#34;&gt;Elasticsearch 1.4.0.Beta1のchangelog&lt;/a&gt;に本リリースの多くの機能、改善、バグフィックスについて読むことができます。
ここでは、特筆すべきいくつかの変更について述べます。&lt;/p&gt;
&lt;h3 id=&#34;groovyによるmvelの置き換え&#34;&gt;groovyによるmvelの置き換え&lt;/h3&gt;
&lt;p&gt;Groovyは現在、デフォルトのscripting languageです。
以前のデフォルトはMVELで、古くなってきており、サンドボックス内で実行できないという事実は、セキュリティ問題でした。
Groovyはサンドボックスであり(それは、ボックスの外へは許可が必要)、メンテナンスされており、速いです！
詳しくは&lt;a href=&#34;http://www.elasticsearch.org/blog/scripting/&#34;&gt;scriptingについてのブログ記事&lt;/a&gt;をご覧ください。&lt;/p&gt;
&lt;h3 id=&#34;デフォルトでcorsはオフ&#34;&gt;デフォルトでcorsはオフ&lt;/h3&gt;
&lt;p&gt;Elasticsearchのデフォルト設定はクロスサイトスクリプティングに対して脆弱でした。
私たちはデフォルトで&lt;a href=&#34;http://en.wikipedia.org/wiki/Cross-origin_resource_sharing&#34;&gt;CORS&lt;/a&gt;をオフにすることで修正しました。
Elasticsearchにインストールされたサイトプラグインはこれまで同様に機能します。
しかし、CORSを再度オンにすることがない限り、外部のウェブサイトがリモートのクラスタにアクセスすることはできません。
ウェブサイトがあなたのクラスタにアクセス可能に制御できるように、さらに&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.4/modules-http.html#_settings_2&#34;&gt;CORS settings&lt;/a&gt;を追加しました。
詳しくは&lt;a href=&#34;http://www.elasticsearch.org/community/security&#34;&gt;security page&lt;/a&gt;をご覧ください。&lt;/p&gt;
&lt;h3 id=&#34;クエリキャッシュ&#34;&gt;クエリキャッシュ&lt;/h3&gt;
&lt;p&gt;新しい試験的な&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.4/index-modules-shard-query-cache.html&#34;&gt;shardレベルのクエリキャッシュ&lt;/a&gt;は、静的なインデックスのアグリゲーションをほとんど即座に反応できます。
ウエブサイトのアクセスの日毎のページビュー数を見るダッシュボードを持っていると想像してみてください。
これらの数値は古いインデックスでは変更がありません。しかし、アグリゲーションはダッシュボードのリフレッシュのたびに再計算されます。
新しいクエリキャッシュを利用すると、シャードのデータが変更されない限り、アグリゲーションの結果はキャッシュから直接返却されます。
キャッシュから古い結果を決して取得することはありません。それは、常に、キャッシュされていないリクエストと同じ結果を返します。&lt;/p&gt;
&lt;h3 id=&#34;新しいaggregations&#34;&gt;新しいaggregations&lt;/h3&gt;
&lt;p&gt;3つの新しいaggregationsがあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.4/search-aggregations-bucket-filters-aggregation.html&#34;&gt;&lt;code&gt;filters&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;これは&lt;code&gt;filter&lt;/code&gt; aggregationの拡張です。複数のバケットを定義し、バケット毎に異なるフィルタを利用できます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.4/search-aggregations-bucket-children-aggregation.html&#34;&gt;&lt;code&gt;children&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nested&lt;/code&gt;アグリゲーションの親子版。&lt;code&gt;children&lt;/code&gt; aggは親のドキュメントに属する子のドキュメントを集計できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.4/search-aggregations-metrics-scripted-metric-aggregation.html&#34;&gt;&lt;code&gt;scripted_metric&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;このaggregationは、データによって計算されたメトリックを完全にコントロールできます。これは、初期化フェーズ、ドキュメント収集フェーズ、shardレベル結合フェーズ、global reduceフェーズを提供します。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;get-index-api&#34;&gt;get /index api&lt;/h3&gt;
&lt;p&gt;以前、ある1つのインデックスのaliases、mappings、settings、warmersを取得出来ました。しかし、それらを個別にです。
&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.4/indices-get-index.html&#34;&gt;&lt;code&gt;get-index&lt;/code&gt; API&lt;/a&gt; はこれらのすべてもしくは一部を、複数もしくはひとつのインデックスに対して一緒に取得できます。
これは、既存のインデックスと同一もしくはほぼ同一であるインデックスを作成したいときに非常に役に立ちます。&lt;/p&gt;
&lt;h3 id=&#34;登録と更新&#34;&gt;登録と更新&lt;/h3&gt;
&lt;p&gt;ドキュメントの登録と更新にいくつかの改善があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;現在、ドキュメントIDの自動生成のために&lt;a href=&#34;http://boundary.com/blog/2012/01/12/flake-a-decentralized-k-ordered-unique-id-generator-in-erlang&#34;&gt;Flake ID&lt;/a&gt;を使用しています。これは、プライマリキー探索時に素晴らしい性能向上を提供します。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;detect_noop&lt;/code&gt;に&lt;code&gt;true&lt;/code&gt;を設定すると、ドキュメントに変更を与えない更新が軽量になります。この設定を有効にすると、&lt;code&gt;_source&lt;/code&gt;フィールドのコンテンツを変更する更新リクエストだけ、ドキュメントの新しいバージョンを書き込みます。&lt;/li&gt;
&lt;li&gt;更新はスクリプトから完全に操作できます。以前は、スクリプトはドキュメントがすでに存在しているときだけ実行可能で、それ以外は、&lt;code&gt;upsert&lt;/code&gt;ドキュメントで登録しました。&lt;code&gt;script_upsert&lt;/code&gt;パラメータでスクリプトから直接ドキュメントの作成が操作できます。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;function-score&#34;&gt;function score&lt;/h3&gt;
&lt;p&gt;すでに非常に便利な&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.4/query-dsl-function-score-query.html&#34;&gt;&lt;code&gt;function_score&lt;/code&gt;クエリ&lt;/a&gt;が、新しく&lt;code&gt;weight&lt;/code&gt;パラメータをサポートします。
これは、それぞれの指定された関数の影響をチューニングするのに使われます。
これは、人気度よりも更新日時により重みをかけたり、地理情報よりも価格により重みをかけるといったことを可能にします。
また、&lt;code&gt;random_score&lt;/code&gt;機能はセグメントマージによる影響を受けません。これにより、より一貫した順序が提供されます。&lt;/p&gt;
&lt;h2 id=&#34;試してみてください&#34;&gt;試してみてください。&lt;/h2&gt;
&lt;p&gt;ぜひ、&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-4-0-Beta1&#34;&gt;Elasticsearch 1.4.0.Beta1&lt;/a&gt;をダウンロードして、試してみてください。
そして、感想をTwitter(&lt;a href=&#34;https://twitter.com/elasticsearch&#34;&gt;@elasticsearch&lt;/a&gt;)などで教えて下さい。
また、問題がありましたら、&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues&#34;&gt;GitHub issues page&lt;/a&gt;で報告をお願いします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第6回Elasticsearch勉強会を開催しました。#elasticsearchjp</title>
      <link>https://blog.johtani.info/blog/2014/09/17/hold-on-6th-elasticsearch-jp/</link>
      <pubDate>Wed, 17 Sep 2014 13:22:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/09/17/hold-on-6th-elasticsearch-jp/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://elasticsearch.doorkeeper.jp/events/13917&#34;&gt;第6回Elsticsearch勉強会&lt;/a&gt;を開催しました。
スタッフの皆さん、スピーカーの皆さん、開場提供していただいた&lt;a href=&#34;http://recruit-tech.co.jp&#34;&gt;リクルートテクノロジーズさん&lt;/a&gt;、ありがとうございました！
次回もよろしくお願いします！参加していただき盛り上げていただいた参加者の皆さんもありがとうございました。
今回は、スタッフが私を含めて3，4名ということで、ドタバタしてしまってスミマセンでした。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;http://elasticsearch.doorkeeper.jp/events/13917&#34;&gt;第6回Elsticsearch勉強会&lt;/a&gt;を開催しました。
スタッフの皆さん、スピーカーの皆さん、開場提供していただいた&lt;a href=&#34;http://recruit-tech.co.jp&#34;&gt;リクルートテクノロジーズさん&lt;/a&gt;、ありがとうございました！
次回もよろしくお願いします！参加していただき盛り上げていただいた参加者の皆さんもありがとうございました。
今回は、スタッフが私を含めて3，4名ということで、ドタバタしてしまってスミマセンでした。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;今回はキャンセルが多く、最終的には90人弱の参加となりましたが、今回も多数の方にお集まりいただきありがとうございました。
同じ日に他の勉強会もあった影響でしょうか？&lt;/p&gt;
&lt;h2 id=&#34;aggregationあれこれelasticsearch-inc-jun-ohtani-johtani&#34;&gt;「Aggregationあれこれ」Elasticsearch Inc. Jun Ohtani @johtani&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://speakerdeck.com/johtani/aggregationarekore&#34;&gt;Aggregationあれこれ&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ちょっと長かったですかね。。。&lt;/li&gt;
&lt;li&gt;Aggregationの概要、内部動作、種類などを簡単に紹介してみました。&lt;/li&gt;
&lt;li&gt;個々のAggregationもいろいろなオプションなどがあるので、色々と試してみていただければと思います。&lt;/li&gt;
&lt;li&gt;アニメーション入りのスライドになってましたが、UpしてあるスライドはPDF版になります。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;秒間3万の広告配信ログをelasticsearchでリアルタイム集計してきた戦いの記録-株式会社サイバーエージェント山田直行さんsatully&#34;&gt;「秒間3万の広告配信ログをElasticSearchでリアルタイム集計してきた戦いの記録」 株式会社サイバーエージェント　山田直行さん　@satully&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/Satully/elasticsearch-study6threaltime20140916&#34;&gt;秒間3万の広告配信ログをElasticSearchでリアルタイム集計してきた戦いの記録&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ディスプレイ広告配信DSPの話&lt;/li&gt;
&lt;li&gt;システム: Fluentd、S3、Elasticsearch、Redis、MySQL&lt;/li&gt;
&lt;li&gt;7月に秒間3万〜4万のリクエストをさばいている。&lt;/li&gt;
&lt;li&gt;なぜElasticsearchを選んだのか、今の構成など&lt;/li&gt;
&lt;li&gt;実際に苦労された点なども交えて話していただき面白かったです。&lt;/li&gt;
&lt;li&gt;7月時点のお話ということで、現時点ではまた違う構成っぽかったので、また話を聞きたいなぁ。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;elasticsearch-日本語スキーマレス環境構築とついでに多言語対応ナレッジワークス株式会社木戸国彦さん-9215&#34;&gt;「Elasticsearch 日本語スキーマレス環境構築と、ついでに多言語対応」ナレッジワークス株式会社　木戸国彦さん @9215&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://speakerdeck.com/kunihikokido/elasticsearch-ri-ben-yu-sukimaresuhuan-jing-gou-zhu-to-tuideniduo-yan-yu-dui-ying&#34;&gt;Elasticsearch 日本語スキーマレス環境構築と、ついでに多言語対応&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dynamic TemplateやIndex Templateの説明&lt;/li&gt;
&lt;li&gt;日本語や多言語化するときのMappingのサンプルになりそうなものがゴロゴロ紹介されてました。&lt;/li&gt;
&lt;li&gt;いくつかの例があって、後で見直したいなと。&lt;/li&gt;
&lt;li&gt;途中で出てきた、fielddata（インデックスに入っている単語区切りのデータ）を見るのに使ってたクエリは&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-fielddata-fields.html&#34;&gt;field data fields&lt;/a&gt;だったかな。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;elasticsearchソースコードを読みはじめてみたfurandon_pig-さん&#34;&gt;「elasticsearchソースコードを読みはじめてみた」@furandon_pig さん&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/furandon_pig/elasticsearch-39175134&#34;&gt;elasticsearchソースコードを読みはじめてみた&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;リクエストを受けて検索してる部分から読むといいって言われたらしいが、起動スクリプトから読み始めてみた。&lt;/li&gt;
&lt;li&gt;時間かかりそうｗ&lt;/li&gt;
&lt;li&gt;ただ、人がどんな感じでソースを読んだり理解してるかがわかりやすかったので面白かったです。&lt;/li&gt;
&lt;li&gt;定期的に続きを聞いてみたいです。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;lt&#34;&gt;LT&lt;/h2&gt;
&lt;h3 id=&#34;reroute-apiを使用してシャード配置を制御する-株式会社富士通ソフトウェアテクノロジーズ-滝田聖己さん-pisatoshi&#34;&gt;「reroute APIを使用してシャード配置を制御する」 株式会社富士通ソフトウェアテクノロジーズ 滝田聖己さん @pisatoshi&lt;/h3&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://speakerdeck.com/pisatoshi/elasticsearch-rerouteapiwoshi-tutasiyadopei-zhi-falsezhi-yu&#34;&gt;reroute APIを使用してシャード配置を制御する&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;シャードの再配置が自動で行われるので、それをオフにしないと、せっかく移動しても無駄になることがというあるあるネタ&lt;/li&gt;
&lt;li&gt;Bonsaiロゴを作成するLT&lt;/li&gt;
&lt;li&gt;実際にいくら掛かったのかが知りたかった。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;検索のダウンタイム0でバックアップからindexをリストアする方法株式会社ドワンゴモバイル-西田和史さん&#34;&gt;「検索のダウンタイム0でバックアップからIndexをリストアする方法」株式会社ドワンゴモバイル 西田和史さん&lt;/h3&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/kbigwheel/0index-39143333&#34;&gt;検索のダウンタイム0でバックアップからIndexをリストアする方法&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;擬似無停止のやりかた。&lt;/li&gt;
&lt;li&gt;aliasを活用して、かつ、Restoreで再構築するという方法。&lt;/li&gt;
&lt;li&gt;aliasまで一緒にリストアされるので注意が必要っていうのは、実際にやってみたからわかることという感じですね。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;その他感想などのブログ&#34;&gt;その他、感想などのブログ&lt;/h2&gt;
&lt;p&gt;適当に見つけたブログを列挙してあります。これもあるよ！などあれば、教えてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://s-wool.blog.jp/archives/1009404632.html&#34;&gt;第6回elasticsearch勉強会に行ってきましたのでそのメモ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://arika.hateblo.jp/entry/2014/09/17/100921&#34;&gt;elasticsearch 勉強会 第6回&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;
&lt;p&gt;今回も、ためになる話がいっぱい聞けたかなと。
個人的な印象としては、いつものメンバーよりも新しい方が多かった印象です。
また、ほとんどの方が、Elasticsearchをご存知でした。
そこそこ知名度は上がってきているようで嬉しい限りです。（東京以外での知名度なども知りたいかなと。）&lt;/p&gt;
&lt;p&gt;あと、懇親会の部屋の案内が遅くなってしまってスミマセンでした。
さすがにスタッフ3名はきつかったです。。。&lt;/p&gt;
&lt;p&gt;19時半開始にしてみましたが、懇親会の時間がやはり短めになってしまうなぁという印象でした。&lt;/p&gt;
&lt;p&gt;次回ももちろん2ヶ月後くらいに行います。
スピーカー募集中ですので、コメント、メール、ツイートなど、コンタクトしていただければと思います。
よろしくお願いいたします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Aggregationあれこれ</title>
      <link>https://blog.johtani.info/presentation/2014/aggregationarekore/</link>
      <pubDate>Wed, 17 Sep 2014 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2014/aggregationarekore/</guid>
      <description>&lt;p&gt;第6回elasticsearch勉強会発表スライド。&lt;/p&gt;
&lt;p&gt;#elasticsearchjp #elasticsearch&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;第6回elasticsearch勉強会発表スライド。&lt;/p&gt;
&lt;p&gt;#elasticsearchjp #elasticsearch&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>elasticsearch.もうちょっと入門という話をしてきました #gihyo_efk</title>
      <link>https://blog.johtani.info/blog/2014/09/16/book-publication-event/</link>
      <pubDate>Tue, 16 Sep 2014 13:21:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/09/16/book-publication-event/</guid>
      <description>&lt;p&gt;先日2014年9月9日(火)に&lt;a href=&#34;http://eventdots.jp/event/137658&#34;&gt;『サーバ/インフラエンジニア養成読本 ログ収集〜可視化編』　出版記念！執筆者が語る大講演会！&lt;/a&gt;で、
&lt;a href=&#34;https://speakerdeck.com/johtani/elasticsearchmoutiyotutoru-men&#34;&gt;「elasticsearch.もうちょっと入門」&lt;/a&gt;というタイトルで発表してきました。
会場のGMOのみなさま、Treasure Data、技術評論社のみなさま、どうもありがとうございました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;先日2014年9月9日(火)に&lt;a href=&#34;http://eventdots.jp/event/137658&#34;&gt;『サーバ/インフラエンジニア養成読本 ログ収集〜可視化編』　出版記念！執筆者が語る大講演会！&lt;/a&gt;で、
&lt;a href=&#34;https://speakerdeck.com/johtani/elasticsearchmoutiyotutoru-men&#34;&gt;「elasticsearch.もうちょっと入門」&lt;/a&gt;というタイトルで発表してきました。
会場のGMOのみなさま、Treasure Data、技術評論社のみなさま、どうもありがとうございました。&lt;/p&gt;
&lt;p&gt;書籍に興味のある方は、右のリンクから購入してもらえるとうれしいです。Kindle版も用意されています。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;提供のTDの方に目をつぶってもらいながらLogstashについての発表となってしまいましたが、楽しんでいただけたかなぁと。
書籍では主にKibana3をメインにしたElasticsearchの使い方だったので、それ以外の機能ということで、Aggregationについて説明してみました。&lt;/p&gt;
&lt;p&gt;そのあとは、おそらく初めてですが、パネルディスカッションにも参加しました。
&lt;a href=&#34;https://twitter.com/naoya_ito&#34;&gt;@naoya_ito&lt;/a&gt;さんをモデレーターに、rebuild.fm風に進めていただき、話しやすかったかなと。
（少なくとも私は楽しめました！）
ただ、私だけバックグラウンドが少し異なることもあり、話をうまく繋げられなかったかもと気にしていたりもしますが。。。&lt;/p&gt;
&lt;p&gt;パネルディスカッションでもありましたが、エンジニアが「趣味」で入れて試してみるのにはもってこいのツール群だと思います。
ちょっと入れてみて、可視化をしてみるといろいろと発見があると思います。
何かを発見するためにもまず試してみるのが何事も重要かなと最近思ってるのもあるので、気軽に試してみてもらえればと。&lt;/p&gt;
&lt;p&gt;不明点などあれば、著者陣に気軽に聞いていただけると良いかと思います（いいですよね、みなさんｗ）。
Fluentd（もちろん、Logstashも）、Elasticsearch、Kibanaを利用して、データについて試行錯誤してもらって、
システムやビジネスに必要なものを探索して見てください。&lt;/p&gt;
&lt;h3 id=&#34;参考&#34;&gt;参考&lt;/h3&gt;
&lt;p&gt;他の方々のブログをメモとして。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://suzuken.hatenablog.jp/entry/2014/09/11/210059&#34;&gt;サービス改善とログデータ解析について発表してきました&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.harukasan.jp/entry/2014/09/12/144217&#34;&gt;Kibanaではじめるダッシュボードについて発表してきました #gihyo_efk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://y-ken.hatenablog.com/entry/fluentd-system-design-pattern&#34;&gt;Fluentdのお勧めシステム構成パターンについて発表しました&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearchのインデキシングに関するパフォーマンス検討</title>
      <link>https://blog.johtani.info/blog/2014/09/09/performance-considerations-for-elasticsearch-indexing/</link>
      <pubDate>Tue, 09 Sep 2014 17:11:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/09/09/performance-considerations-for-elasticsearch-indexing/</guid>
      <description>&lt;p&gt;Elasticsearchのインデキシングに関するパフォーマンス検討&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/performance-considerations-elasticsearch-indexing/&#34;&gt;performance considerations for elasticsearch indexing&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Elasticsearchユーザは様々な楽しいユースケースを持っています。小さなログを追加することから、Webスケールの大きなドキュメントの集合をインデキシングするようなことまでです。また、インデキシングのスループットを最大化することが重要で一般的な目標となります。
「典型的な」アプリケーションに対して良いデフォルト値を設定するようにしていますが、次のちょっとした簡単なベストプラクティスによってインデキシングのパフォーマンスをすぐに改善することができます。それらについて記述します。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Elasticsearchのインデキシングに関するパフォーマンス検討&lt;/p&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/performance-considerations-elasticsearch-indexing/&#34;&gt;performance considerations for elasticsearch indexing&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Elasticsearchユーザは様々な楽しいユースケースを持っています。小さなログを追加することから、Webスケールの大きなドキュメントの集合をインデキシングするようなことまでです。また、インデキシングのスループットを最大化することが重要で一般的な目標となります。
「典型的な」アプリケーションに対して良いデフォルト値を設定するようにしていますが、次のちょっとした簡単なベストプラクティスによってインデキシングのパフォーマンスをすぐに改善することができます。それらについて記述します。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;第一に、制御できないならば、巨大なJavaヒープを使用しない：必要なサイズ（マシンの持つRAMの半分以下）のheapだけを設定しましょう。Elasticsearchの利用方法のために必要な全体量を設定します。これは、OSにIOキャッシュを制御するためのRAMを残すことを意味します。OSが&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/setup-configuration.html&#34;&gt;javaプロセスをスワップアウト&lt;/a&gt;していないことも確認しましょう。&lt;/p&gt;
&lt;p&gt;最新バージョン（&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-3-2/&#34;&gt;現時点では1.3.2&lt;/a&gt;）のElasticsearchにアップグレードしましょう：多数のインデキシングに関連する問題点が最新リリースで修正されています。&lt;/p&gt;
&lt;p&gt;詳細に入る前に警告：ここで述べるすべての情報は現時点での最新（&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-3-2/&#34;&gt;1.3.2&lt;/a&gt;）の情報です。しかし、Elasticsearchの更新は日々行われています。この情報をあなたが見た時点では最新ではなく、正確ではなくなっているかもしれません。自信がない場合は&lt;a href=&#34;http://www.elasticsearch.org/community&#34;&gt;ユーザメーリングリスト&lt;/a&gt;で質問してください。&lt;/p&gt;
&lt;p&gt;クラスタのインデキシングスループットをチューニングする場合、&lt;a href=&#34;http://www.elasticsearch.org/overview/marvel&#34;&gt;Marvel&lt;/a&gt;は非常に有用なツールです：ここで述べている各設定を継続的に試し、変更の影響がクラスタの挙動をどのように変更されたかを簡単に可視化することが可能です。&lt;/p&gt;
&lt;h2 id=&#34;クライアントサイド&#34;&gt;クライアントサイド&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-bulk.html&#34;&gt;bulk API&lt;/a&gt;を常に使いましょう。1リクエストで複数のドキュメントをインデキシングでき、各バルクリクエストで送るのに良いドキュメント数を試しましょう。最適なサイズは多くの要因に依存しますが、最適サイズからずれるならば多すぎるよりも少なすぎる方が良いでしょう。クライアントサイドのスレッドで並列にbulkリクエストを使うか、個別の非同期リクエストを使ってください。&lt;/p&gt;
&lt;p&gt;インデキシングが遅いと結論付ける前に、クラスタのハードウェアの性能を引き出せているかを確認して下さい：すべてのノードでCPUやIOが溢れていないかを確認するために&lt;code&gt;iostat&lt;/code&gt;や&lt;code&gt;top&lt;/code&gt;、&lt;code&gt;ps&lt;/code&gt;といったツールを使いましょう。もし、溢れていなければ、より多くの並列なリクエストが必要です。しかし、javaクライアントからの&lt;code&gt;EsRejectedExecutionException&lt;/code&gt;や、RESTリクエストのHTTPレスポンスとして&lt;code&gt;TOO_MANY_REQUESTS (429)&lt;/code&gt;が返ってきた場合は並列リクエストを多く送りすぎています。もし&lt;a href=&#34;http://www.elasticsearch.org/overview/marvel&#34;&gt;Marvel&lt;/a&gt;を利用しているなら、&lt;a href=&#34;http://www.elasticsearch.org/guide/en/marvel/current/#_node_amp_index_statistics&#34;&gt;Node Statistics Dashboard&lt;/a&gt;の&lt;code&gt;THREAD POOLS - BULK&lt;/code&gt;にリジェクトされた数が表示されます。bulkスレッドプールサイズ（デフォルト値はコア数）を増やすのは得策ではありません。インデキシングスループットを減少させるでしょう。クライアントサイドの並列度を下げるか、ノードを増やすのが良い選択です。&lt;/p&gt;
&lt;p&gt;ここでは、1シャードに対してインデキシングスループットを最大化する設定に注目します。1つのLuceneインデックスのドキュメントの容量を測定するために、単一ノード（単一シャード、レプリカなし）で最初にテストをして最適化し、クラスタ全体にスケールする前にチューニングを繰り返します。これはまた、インデキシングスループットの要件を見つけるために、クラスタ全体にどのくらいのノードが必要かをラフに見積もるためのベースラインを与えてくれます。&lt;/p&gt;
&lt;p&gt;単一シャードが十分機能したら、Elasticsearchのスケーラビリティの最大の利点や、クラスタでの複数ノードによるレプリカ数やシャード数の増加の利点が得られます。&lt;/p&gt;
&lt;p&gt;結論を導き出す前に、ある程度の時間（60分）くらいクラスタ全体の性能を計測しましょう。このテストは、巨大なマージ、GCサイクル、シャードの移動、OSのIOキャッシュ、予期しないスワップの可能性などのイベントのライフサイクルをカバーできます。&lt;/p&gt;
&lt;h2 id=&#34;ストレージデバイス&#34;&gt;ストレージデバイス&lt;/h2&gt;
&lt;p&gt;当然ながらインデックスを保存するストレージデバイスはインデキシングの性能に多大な影響を及ぼします：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SSDを利用する：これらは最も速いHDDよりも速いです。ランダムアクセスのための消費電力が低いだけでなく、シーケンシャルIOアクセスも高いです。また、同時に発生するインデキシング、マージや検索のための並列的なIOも高速です。&lt;/li&gt;
&lt;li&gt;インデックスをリモートマウントされたファイルシステム（例：&lt;a href=&#34;http://en.wikipedia.org/wiki/Network_File_System&#34;&gt;NFS&lt;/a&gt;や&lt;a href=&#34;http://en.wikipedia.org/wiki/Server_Message_Block&#34;&gt;SMB/CIFS&lt;/a&gt;）上に配置しない：代わりにローカルストレージを使う&lt;/li&gt;
&lt;li&gt;仮想化されたストレージ（Amazonの&lt;a href=&#34;http://aws.amazon.com/ebs/&#34;&gt;Elastic Block Storage&lt;/a&gt;など）に注意：仮想化されたストレージはElasticsearchで十分に動作します。また、十分早く簡単に用意できることから魅力的です。しかし、残念なことに、ローカルストレージと比較すると本質的に遅いです。最近の非公式なテストでは、&lt;a href=&#34;http://aws.amazon.com/ebs/details/#PIOPS&#34;&gt;最高の性能を持つプロビジョニングされたIOPSのSSDオプションのEBS&lt;/a&gt;でさえ、ローカルインスタンスにあるSSDよりも遅いです。ローカルインスタンスにあるSSDは物理マシン上のすべての仮想マシンから共有されてアクセスされます。もし他の仮想マシンが急にIOが集中した場合に不可解なスローダウンとなることがあることを覚えておいてください。&lt;/li&gt;
&lt;li&gt;複数のSSDを&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/setup-dir-layout.html&#34;&gt;複数の&lt;code&gt;path.data&lt;/code&gt;ディレクトリ&lt;/a&gt;にインデックスをストライピング（&lt;a href=&#34;http://en.wikipedia.org/wiki/RAID_0#RAID_0&#34;&gt;RAID0&lt;/a&gt;のように）：2つは同様で、ファイルブロックレベルでストライピングする代わりに、個別にインデックスファイルレベルでElasticsearchの&amp;quot;stripes&amp;quot;となります。これらのアプローチは、いづれかのSSDの故障によりインデックスが壊れるという、1シャードが故障する(IO性能を高速化することとトレードオフ)というリスクを増加させることに注意してください。これは、一般的に行うのに良いトレードオフです：単一シャードで最大のパフォーマンスを最適化し、異なるノード間でレプリカを追加すると、ノードの故障への冗長化ができます。また、&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-snapshots.html&#34;&gt;snapshotやrestore&lt;/a&gt;を使って保険のためにインデックスのバックアップを取ることもできます。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;セグメントとマージ&#34;&gt;セグメントとマージ&lt;/h2&gt;
&lt;p&gt;新しくインデキシングされたドキュメントは最初にLuceneの&lt;code&gt;IndexWriter&lt;/code&gt;によってRAMに保存されます。RAMバッファがいっぱいになった時もしくは、Elasticsearchがflushもしくはrefreshを実行した時など定期的にこれらのドキュメントはディスクに新しいセグメントとして書き込まれます。最後に、セグメントが多くなった時に、&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/index-modules-merge.html&#34;&gt;Merge PolicyとSucheduler&lt;/a&gt;によってそれらがマージされます。このプロセスは連続的に生じます：マージされたセグメントはより大きなセグメントとなり、小さなマージが幾つか実行され、また、大きなセグメントにマージされます。これらがどのように動作するかを&lt;a href=&#34;http://blog.mikemccandless.com/2011/02/visualizing-lucenes-segment-merges.html&#34;&gt;わかりやすく可視化したブログはこちら&lt;/a&gt;です。&lt;/p&gt;
&lt;p&gt;マージ、特に大きなマージは非常に時間がかかります。これは、通常は問題ありません。そのようなマージはレアで全体のインデックスのコストと比べればささいなものです。しかし、マージすることがインデキシングについていけない場合、インデックスに非常に多くのセグメントがあるような深刻な問題を防ぐために、Elasticsearchはやってくるインデキシングリクエストを単一スレッド(1.2以降)に制限します。&lt;/p&gt;
&lt;p&gt;もし、INFOレベルのログメッセージに&lt;code&gt;now throttling indexing&lt;/code&gt;と表示されていたり、&lt;a href=&#34;http://www.elasticsearch.org/guide/en/marvel/current&#34;&gt;Marvel&lt;/a&gt;でのセグメント数が増加しているを見た場合、マージが遅れているとわかります。Marvelは&lt;a href=&#34;http://www.elasticsearch.org/guide/en/marvel/current/#_node_amp_index_statistics&#34;&gt;Index Statistics dashboard&lt;/a&gt;の&lt;code&gt;MANAGEMENT EXTENDED&lt;/code&gt;の部分にセグメント数をプロットしており、それは、非常にゆっくりと指数対数的に増加しており、大きなマージが終了したところがのこぎりの歯のような形で見て取れます。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;http://www.elasticsearch.org/content/uploads/2014/09/segmentCounts.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;http://www.elasticsearch.org/content/uploads/2014/09/segmentCounts.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
    &lt;figcaption align=&#34;center&#34;&gt;&lt;h4&gt;セグメント数&lt;/h4&gt;
    &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;なぜマージが遅れるのでしょう？デフォルトでElasticsearchはすべてのマージの書き込みのバイト数をわずか20MB/secに制限しています。スピニングディスク（HDD）に対して、これはマージによって典型的なドライブのIOキャパシティを飽和させず、並列に検索を十分に実行させることを保証します。しかし、もし、インデキシング中に検索をしない場合や、検索性能がインデキシングのスループットよりも重要でない場合、インデックスの保存にSSDを使用している場合などは、&lt;code&gt;index.store.throttle.type&lt;/code&gt;に&lt;code&gt;none&lt;/code&gt;を設定して、マージの速度制限を無効化するべきです（詳細は&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/index-modules-store.html&#34;&gt;こちら&lt;/a&gt;をご覧ください）。なおバージョン1.2以前には&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues/6018&#34;&gt;期待以上のマージIO制限の発生&lt;/a&gt;といったバグが存在します。アップグレードを！&lt;/p&gt;
&lt;p&gt;もし、不幸にもスピニングディスク（それはSSDと同等の並列なIOを扱えません）をまだ使っている場合、&lt;code&gt;index.merge.scheduler.max_thread_count&lt;/code&gt;に&lt;code&gt;1&lt;/code&gt;を設定しなければなりません。そうでない場合は、（SSDを支持する）デフォルト値が多くのマージを同時に実行させるでしょう。&lt;/p&gt;
&lt;p&gt;活発に更新が行われているインデックスで&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-optimize.html&#34;&gt;&lt;code&gt;optimize&lt;/code&gt;&lt;/a&gt;を実行しないでください。それは、非常にコストの高い操作(すべてのセグメントをマージ)です。しかし、もし、インデックスにドキュメントを追加が終わった直後はオプティマイズのタイミングとしては良いタイミングです。それは、検索時のリソースを減らすからです。例えば、時間ベースのインデックスを持っており、新しいインデックスに日々のログを追加している場合、過去の日付のインデックスをオプティマイズするのは良い考えです。特に、ノードが多くの日付のインデックスを持っている場合です。&lt;/p&gt;
&lt;p&gt;更にチューニングするための設定：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;実際に必要のないフィールドをオフにする。例えば&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-all-field.html&#34;&gt;&lt;code&gt;_all&lt;/code&gt;フィールドをオフ&lt;/a&gt;。また、保持したいフィールドでは、&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-core-types.html&#34;&gt;&lt;code&gt;indexed&lt;/code&gt;か&lt;code&gt;stored&lt;/code&gt;かを検討する&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;もし、&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-source-field.html&#34;&gt;&lt;code&gt;_source&lt;/code&gt;フィールドをオフ&lt;/a&gt;にしたくなるかもしれないが、インデキシングコストは小さい(保存するだけで、インデキシングしない)、また、それは、将来の更新や、前のインデックスを再インデキシングするために非常に価値があり、それはディスク使用率の懸念事項がない限り、オフにする価値はあまりない。それは、ディスクが比較的安価であるので価値がない。&lt;/li&gt;
&lt;li&gt;もし、インデックスされたドキュメントの検索までの遅延を許容できるなら、&lt;code&gt;index.refresh_interval&lt;/code&gt;を&lt;code&gt;30s&lt;/code&gt;に増やすか、&lt;code&gt;-1&lt;/code&gt;を設定して、オフにする。これは、巨大なセグメントをフラッシュし、マージのプレッシャーを減らすことができる。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-3-2/&#34;&gt;Elasticsearch 1.3.2&lt;/a&gt;(稀に、フラッシュ時に過度のRAMを使用するという&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues/6443&#34;&gt;問題&lt;/a&gt;を&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues/6379&#34;&gt;修正した&lt;/a&gt;)にアップグレードすることで、&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/index-modules-translog.html&#34;&gt;&lt;code&gt;index.translog.flush_threshold_size&lt;/code&gt;&lt;/a&gt;をデフォルト(200mb)から1gbに増加し、インデックスファイルのfsyncの頻度を減らす。
Marvelに&lt;a href=&#34;http://www.elasticsearch.org/guide/en/marvel/current/#_node_amp_index_statistics&#34;&gt;&lt;code&gt;Index Statistics dashboard&lt;/code&gt;&lt;/a&gt;の&lt;code&gt;MANAGEMENT&lt;/code&gt;にフラッシュの頻度がプロットされている。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;インデックスバッファサイズ&#34;&gt;インデックスバッファサイズ&lt;/h2&gt;
&lt;p&gt;巨大なインデックスを構築中はレプリカ数を0にし、あとから、レプリカを有効にする。レプリカが0ということは、データを失った(ステータスがred)時に冗長性がないので、ノードの故障に注意すること。もし、&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-optimize.html&#34;&gt;&lt;code&gt;optimize&lt;/code&gt;&lt;/a&gt;(ドキュメントの追加をすることがないので)を計画するなら、インデキシングが終わったあとで、レプリカを作成する前に実行するのが良いでしょう。レプリカはオプティマイズされたセグメントをコピーするだけになります。詳細は&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-update-settings.html&#34;&gt;インデックス設定更新&lt;/a&gt;を参照。&lt;/p&gt;
&lt;p&gt;もし、ノードがヘビーなインデキシングを行っているだけなら、アクティブなシャードのインデキシングバッファに多くてい512MBを&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-indices.html&#34;&gt;indices.memory.index_buffer_size&lt;/a&gt;に与えてください。(超えてもインデキシングのパフォーマンスは一般的には改善されません。)Elasticsearchはその設定(Javaヒープのパーセンテージもしくはバイト数)を受けて、min_index_buffer_sizeとmax_index_buffer_sizeの値を前提にノードのアクティブシャードに均等に割り当てます；大きな値はLuceneが最初のセグメントをより大きくし、将来的なマージのプレッシャーを減らすことを意味します。&lt;/p&gt;
&lt;p&gt;デフォルトは10%で、それで十分です；例えば、もし、5つのアクティブなシャードがノードにあり、ヒープが25GBの場合、各シャードは25GBの10%の1/5=512MB（すでに最大値）を持っています。ヘビーなインデキシングのあと、この設定をデフォルトに下げましょう。検索時のデータ構造のために十分なRAMを確保するために。この設定はまだ動的な設定変更はできません。&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues/7045&#34;&gt;Issueがここに&lt;/a&gt;あります。&lt;/p&gt;
&lt;p&gt;インデックスバッファによって現在利用されているバイト数は1.3.0の&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-stats.html&#34;&gt;indices stats API&lt;/a&gt;に追加されています。&lt;code&gt;indices.segments.index_writer_memory&lt;/code&gt;の値を見ることができます。これはMarvelではまだプロットされていませんが、将来のバージョンで追加される予定です。しかし、自分でグラフに追加することもできます。(Marvelはデータは収集しています)&lt;/p&gt;
&lt;p&gt;1.4.0では、&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues/7440&#34;&gt;&lt;code&gt;indices.segments.index_writer_max_memory&lt;/code&gt;&lt;/a&gt;として、&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-stats.html&#34;&gt;indices stats API&lt;/a&gt;にアクティブシャードにどのくらいのRAMバッファが割り当てられているかも表示されます。これらの値はインデックスのシャード事の値として見ることができ、&lt;code&gt;http://host:9200/&amp;lt;indexName&amp;gt;/_stats?level=shards&lt;/code&gt;を使ってみることができます；これは、全シャードに対する合計と、各シャードごとのstatsを返すでしょう。&lt;/p&gt;
&lt;h2 id=&#34;オートidの利用もしくは良いidの利用&#34;&gt;オートIDの利用もしくは良いIDの利用&lt;/h2&gt;
&lt;p&gt;もし、ドキュメントの&lt;code&gt;ID&lt;/code&gt;がなんでも良い場合、&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-index_.html#_automatic_id_generation%22&#34;&gt;Elasticsearchで採番すること&lt;/a&gt;ができます：これは、(1.2以降)ドキュメントIDをバージョンを探さずに保存できるように&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/pull/5917&#34;&gt;最適化&lt;/a&gt;され、Elasticsearchの&lt;a href=&#34;http://benchmarks.elasticsearch.org/&#34;&gt;日毎のベンチマーク&lt;/a&gt;で異なるパフォーマンスを見ることができます。(&lt;code&gt;Fast&lt;/code&gt;と&lt;code&gt;FastUpdate&lt;/code&gt;のグラフを比較)&lt;/p&gt;
&lt;p&gt;もし、IDを自身が持っていて、自分の支配下で&lt;a href=&#34;http://blog.mikemccandless.com/2014/05/choosing-fast-unique-identifier-uuid.html&#34;&gt;Luceneに対して素早く選ぼうとしている&lt;/a&gt;なら、1.3.2にアップグレードしましょう、IDのルックアップが&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues/6212&#34;&gt;さらにオプティマイズ&lt;/a&gt;されています。Javaの&lt;a href=&#34;http://docs.oracle.com/javase/7/docs/api/java/util/UUID.html&#34;&gt;UUID.randomUUID()&lt;/a&gt;はやめましょう。それは、セグメントに対してどのようにIDを割り当てるかという予測やパターン性がないため、最悪のケースで&lt;a href=&#34;http://blog.mikemccandless.com/2014/05/choosing-fast-unique-identifier-uuid.html&#34;&gt;セグメントごとのシーク&lt;/a&gt;が発生します。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://boundary.com/blog/2012/01/12/flake-a-decentralized-k-ordered-unique-id-generator-in-erlang/&#34;&gt;Flake IDs&lt;/a&gt;を利用した時の&lt;a href=&#34;http://www.elasticsearch.org/overview/marvel&#34;&gt;Marvel&lt;/a&gt;によるインデックス性能の違い：&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;http://www.elasticsearch.org/content/uploads/2014/09/flakeIDsPerf.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;http://www.elasticsearch.org/content/uploads/2014/09/flakeIDsPerf.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
    &lt;figcaption align=&#34;center&#34;&gt;&lt;h4&gt;flakeIDsPerf&lt;/h4&gt;
    &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;ランダムUUIDを利用した場合：&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;http://www.elasticsearch.org/content/uploads/2014/09/uuidsPerf.png&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;http://www.elasticsearch.org/content/uploads/2014/09/uuidsPerf.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
    &lt;figcaption align=&#34;center&#34;&gt;&lt;h4&gt;uuidsPerf&lt;/h4&gt;
    &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;次の1.4.0では、ElasticsearchのID自動採番を&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues/5941&#34;&gt;UUIDからFlake IDに変更&lt;/a&gt;します。&lt;/p&gt;
&lt;p&gt;もし、Luceneのローレベル操作がインデックスに対してなにをやっているかについて興味があるなら、&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues/5891&#34;&gt;&lt;code&gt;lucene.iw&lt;/code&gt;をTRACEログレベルで出力できるように&lt;/a&gt;してみましょう(1.2から利用可能)。これは、多くの出力がありますが、Luceneの&lt;code&gt;IndexWriter&lt;/code&gt;レベルで何が起きているかを理解するのに非常に役に立ちます。出力は非常にローレベルです：&lt;a href=&#34;http://www.elasticsearch.org/guide/en/marvel/current&#34;&gt;Marvel&lt;/a&gt;がインデックスに何が起きているかをよりリアルタイムにグラフを描画してくれます。&lt;/p&gt;
&lt;h2 id=&#34;スケールアウト&#34;&gt;スケールアウト&lt;/h2&gt;
&lt;p&gt;我々は、単一シャード(Luceneインデックス)性能のチューニングに注目してきました。しかし、一旦それに満足できたならば、Elasticsearchはクラスタ全体にわたってインデキシングや検索を簡単にスケールアウトすることに長けています。シャード数(デフォルトでは5)を増やすのは可能です。それは、マシン全体に対して並列度、巨大なインデックスのサイズ、検索時のレイテンシの低下など得ることができます。また、レプリカを1位上にすることは、ハードウェア故障に対する冗長性を持つことを意味します。&lt;/p&gt;
&lt;p&gt;最後に、このドキュメントを見ても問題解決しない場合は&lt;a href=&#34;http://www.elasticsearch.org/community&#34;&gt;コミュニティに参加&lt;/a&gt;しましょう。例えば、&lt;a href=&#34;https://groups.google.com/forum/?fromgroups#!forum/elasticsearch&#34;&gt;ElasticsearchのユーザML&lt;/a&gt;に投稿するなど。おそらく、修正すべきエキサイティングなバグがあるでしょう。(パッチも常に歓迎です！)&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>elasticsearchもうちょっと入門</title>
      <link>https://blog.johtani.info/presentation/2014/elasticsearchmoutiyotutoru-men/</link>
      <pubDate>Tue, 09 Sep 2014 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2014/elasticsearchmoutiyotutoru-men/</guid>
      <description>&lt;p&gt;「サーバ/インフラエンジニア養成読本 ログ収集〜可視化編」（
&lt;a href=&#34;http://gihyo.jp/book/2014/978-4-7741-6983-5?ard=1410281447&#34;&gt;http://gihyo.jp/book/2014/978-4-7741-6983-5?ard=1410281447&lt;/a&gt;）
の出版記念イベント（http://eventdots.jp/event/137658）で使用したスライド。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;「サーバ/インフラエンジニア養成読本 ログ収集〜可視化編」（
&lt;a href=&#34;http://gihyo.jp/book/2014/978-4-7741-6983-5?ard=1410281447&#34;&gt;http://gihyo.jp/book/2014/978-4-7741-6983-5?ard=1410281447&lt;/a&gt;）
の出版記念イベント（http://eventdots.jp/event/137658）で使用したスライド。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch &amp; Kibana</title>
      <link>https://blog.johtani.info/presentation/2014/elasticsearch-and-kibana/</link>
      <pubDate>Thu, 04 Sep 2014 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2014/elasticsearch-and-kibana/</guid>
      <description>&lt;p&gt;Introduction Elasticsearch and Kibana.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Introduction Elasticsearch and Kibana.&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>サーバ/インフラエンジニア養成読本 ログ収集~可視化編 を手伝いました</title>
      <link>https://blog.johtani.info/blog/2014/08/04/release-magazine-book-of-log-aggs-and-viz/</link>
      <pubDate>Mon, 04 Aug 2014 21:54:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/08/04/release-magazine-book-of-log-aggs-and-viz/</guid>
      <description>&lt;p&gt;懲りずにまた、執筆してみました。みなさん「買って」から感想をいただけるとうれしいです！&lt;/p&gt;
&lt;iframe src=&#34;http://rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;nou=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=johtani-22&amp;o=9&amp;p=8&amp;l=as1&amp;m=amazon&amp;f=ifr&amp;ref=tf_til&amp;asins=4774169838&#34; style=&#34;width:120px;height:240px;&#34; scrolling=&#34;no&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34; frameborder=&#34;0&#34;&gt;&lt;/iframe&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;本書について&#34;&gt;本書について&lt;/h2&gt;
&lt;p&gt;共著者の方々のブログが詳しいので、そちらを読んでもらいつつ。
実際にログを収集して解析されている方々と一緒に書かせていただくことで色々と勉強させていただいています。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;懲りずにまた、執筆してみました。みなさん「買って」から感想をいただけるとうれしいです！&lt;/p&gt;
&lt;iframe src=&#34;http://rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;nou=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=johtani-22&amp;o=9&amp;p=8&amp;l=as1&amp;m=amazon&amp;f=ifr&amp;ref=tf_til&amp;asins=4774169838&#34; style=&#34;width:120px;height:240px;&#34; scrolling=&#34;no&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34; frameborder=&#34;0&#34;&gt;&lt;/iframe&gt;
&lt;!-- more --&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;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://twitter.com/suzu_v&#34;&gt;@suzu_v&lt;/a&gt;さん：&lt;a href=&#34;http://suzuken.hatenablog.jp/entry/2014/07/18/084555&#34;&gt;サーバ/インフラエンジニア養成読本 ログ収集~可視化編 を書きました&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://twitter.com/yoshi_ken&#34;&gt;@yoshi_ken&lt;/a&gt;さん：&lt;a href=&#34;http://y-ken.hatenablog.com/entry/published-elasticsearch-fluentd-kibana-book&#34;&gt;ログ収集や可視化で話題のFluentd、Elasticsearch、Kibanaを徹底解説したムック本が発売となります&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://twitter.com/harukasan&#34;&gt;@harukasan&lt;/a&gt;さん：&lt;a href=&#34;http://blog.harukasan.jp/entry/2014/07/18/180351&#34;&gt;書きました: サーバ/インフラエンジニア養成読本 ログ収集~可視化編&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;どの辺を書いたの&#34;&gt;どの辺を書いたの？&lt;/h3&gt;
&lt;p&gt;「特集３：Elasticsearch入門」（なんか、入門ばっかりだなぁ）を書かせていただきました。
データストア入門ということで、ほんとうに簡単な他のデータストアを説明し、Elasticsearchってどんなものかを単語の説明をしつつ紹介してみました。&lt;/p&gt;
&lt;p&gt;Elasticsearch自体は多くの機能を持っており、それ単体で分厚い書籍がかけるので、ログ検索に関係ありそうな部分をピックアップしてみました。
あとは、運用時に気をつける点や便利なツール（Curatorなど）の紹介をしています。&lt;/p&gt;
&lt;p&gt;また、Hadoopと合わせて利用してみたい、すでにHadoopにあるデータも活用してみたいという話もありそうだということで、&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch-hadoop&#34;&gt;elasticsearch-hadoop&lt;/a&gt;についても簡単ですが紹介してあります。&lt;/p&gt;
&lt;h2 id=&#34;その他感想&#34;&gt;その他感想&lt;/h2&gt;
&lt;p&gt;個人的に、忙しい時期&lt;a href=&#34;http://blog.johtani.info/blog/2014/07/01/join-elasticsearch/&#34;&gt;（参考記事）&lt;/a&gt;だったので、あんまり力になれてないので大変申し訳なく思っています。。。
ただ、素晴らしい出来（カラーでKibanaの解説が日本語で読めたり、Fluentdの逆引きのリストがあったり、ログを貯めて可視化する意義を説明してあったり）です。&lt;/p&gt;
&lt;p&gt;ぜひ、読んだ感想をいただければと！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>プロキシ環境でのpluginコマンドの実行</title>
      <link>https://blog.johtani.info/blog/2014/08/01/plugin-using-under-proxy-env/</link>
      <pubDate>Fri, 01 Aug 2014 15:24:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/08/01/plugin-using-under-proxy-env/</guid>
      <description>&lt;p&gt;Proxy環境で働いている方も結構いると思います。
Twitter上で、Elasticsearchのpluginコマンドでプラグインがインストールできなくて困っている方がいたので、
調べてみたのでメモしておきます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Proxy環境で働いている方も結構いると思います。
Twitter上で、Elasticsearchのpluginコマンドでプラグインがインストールできなくて困っている方がいたので、
調べてみたのでメモしておきます。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;プラグインコマンド&#34;&gt;プラグインコマンド&lt;/h2&gt;
&lt;p&gt;Elasticsearchでは、プラグインという形でいくつかの便利な機能が公開されています。
&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch-analysis-kuromoji&#34;&gt;形態素解析ライブラリのKuromoji&lt;/a&gt;を使うためのプラグインや、&lt;a href=&#34;https://github.com/lmenezes/elasticsearch-kopf&#34;&gt;クラスタの管理がGUIで可能なkopf&lt;/a&gt;プラグインなどがあります。
公式、サードパーティいろいろです。&lt;/p&gt;
&lt;p&gt;これらのプラグインをElasticsearchにインストールする場合、以下のコマンドを実行すれば
自動的にダウンロードして&lt;code&gt;plugins&lt;/code&gt;ディレクトリにインストールしてくれます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./bin/plugin -i elasticsearch/elasticsearch-analysis-kuromoji/2.3.0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ここで、&lt;code&gt;elasticsearch/elasticsearch-analysis-kuromoji/2.3.0&lt;/code&gt;がプラグインのパスになります（例では、&lt;code&gt;提供元/プラグイン名/プラグインバージョン&lt;/code&gt;となっています。）。&lt;/p&gt;
&lt;p&gt;この&lt;code&gt;plugin&lt;/code&gt;コマンドがダウンロード元にアクセスに行くのですが、プロキシ環境だとプロキシの設定が必要になります。&lt;/p&gt;
&lt;h2 id=&#34;プロキシの指定maclinuxとwindowsでの違い&#34;&gt;プロキシの指定（Mac/LinuxとWindowsでの違い）&lt;/h2&gt;
&lt;h3 id=&#34;maclinuxshコマンド&#34;&gt;Mac/Linux(shコマンド)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;http://blog.johtani.info/blog/2013/09/03/ja-wikipedia-with-kuromoji/&#34;&gt;以前の記事&lt;/a&gt;でプロキシのポート番号などの指定方法を
以下のように説明していました。
（※昔の記事のため、kuromojiプラグインのバージョンが古いです）&lt;/p&gt;
&lt;p&gt;ElasticsearchのpluginコマンドはJavaで実装されています。（org.elasticsearch.common.http.client.HttpDownloadHelper）
プラグインのダウンロードには、java.net.URL.openConnection()から取得URLConnectionを使用しています。&lt;/p&gt;
&lt;p&gt;ですので、pluginのインストールを行う際に、Proxy環境にある場合は以下のようにコマンドを実行します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./bin/plugin -DproxyPort=ポート番号 -DproxyHost=ホスト名 -i elasticsearch/elasticsearch-analysis-kuromoji/1.5.0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;LinuxやMacの環境であれば、こちらのコマンドでプロキシの指定が可能です。
ただし、Windows環境ではうまくいきません。&lt;/p&gt;
&lt;p&gt;Elasticsearchは、環境の違いにより、ダウンロードするファイルが異なります。
Windows環境の方は、zipファイルをダウンロードしてもらうようになっています。
elasticsearchコマンドおよびpluginコマンドがbat形式で提供されているのがzipファイルとなるからです。&lt;/p&gt;
&lt;h3 id=&#34;windowsbatコマンド&#34;&gt;Windows(batコマンド)&lt;/h3&gt;
&lt;p&gt;Windows環境では次のように指定します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;set JAVA_OPTS=&amp;#34;-DproxyHost=ホスト名 -DproxyPort=ポート番号&amp;#34;
bin\plugin -i elasticsearch/elasticsearch-analysis-kuromoji/2.3.0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;コマンドの実装方法が少し異なるために、このようになっています。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;プロキシ環境で利用される場合は、プラグインコマンドは上記のように実行していただければと。&lt;/p&gt;
&lt;p&gt;公式ガイドには、これらの情報を追記するPRを送る予定です。
また、WindowsのコマンドでもMac/Linuxと同様にできたほうがいい気がするので、Issueをあげようと思います。&lt;/p&gt;
&lt;p&gt;不明点などあれば、コメントいただければと。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch 1.3.1 リリース（日本語訳）</title>
      <link>https://blog.johtani.info/blog/2014/07/29/elasticsearch-1-3-1-release/</link>
      <pubDate>Tue, 29 Jul 2014 12:22:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/07/29/elasticsearch-1-3-1-release/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-3-1-released/&#34;&gt;原文：Elasticsearch 1.3.1 Released&lt;/a&gt;を日本語に翻訳したものです。&lt;/p&gt;
&lt;p&gt;バグフィックス版のElasticsearch 1.3.1をリリースしました。
ダウンロードおよび変更履歴は&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-3-1/&#34;&gt;Elasticsearch 1.3.1&lt;/a&gt;からお願いいたします。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-1-3-1-released/&#34;&gt;原文：Elasticsearch 1.3.1 Released&lt;/a&gt;を日本語に翻訳したものです。&lt;/p&gt;
&lt;p&gt;バグフィックス版のElasticsearch 1.3.1をリリースしました。
ダウンロードおよび変更履歴は&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-3-1/&#34;&gt;Elasticsearch 1.3.1&lt;/a&gt;からお願いいたします。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;このリリースはインデックスリカバリ時の後方互換性バグ（&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/pull/7055&#34;&gt;#7055&lt;/a&gt;）への対応です。
このバグは&lt;strong&gt;データの欠損は起こりません。&lt;/strong&gt; Elasticsearch 1.3.1へアップグレードすることで問題を回避できます。
このバグは、以下のElasticsearchのバージョンで作成されたセグメントを含むインデックスを1.3.0へアップグレードしようとすると発生します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Elasticsearch 0.90.7&lt;/li&gt;
&lt;li&gt;Elasticsearch 0.90.2&lt;/li&gt;
&lt;li&gt;Elasticsearch 0.90.0以前のバージョン&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このバグは、これらの古いインデックスをレプリカからリカバリできなくします。
これらのバージョンのセグメントを持つインデックスが、レプリカは可能ですが、
ステータスがYellowのままGreenに決してなりません。
ログには次のようなExceptionが発生します。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;IllegalArgumentException[No enum constant org.apache.lucene.util.Version.x.x.x]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Luceneの特定のバージョンではLuceneのマイナーバージョンを含んでおらず、誤ったバージョン番号がセグメントに記録されました。
&lt;a href=&#34;https://issues.apache.org/jira/browse/LUCENE-5850&#34;&gt;LUCENE-5850&lt;/a&gt;のチケットがこの問題に対処するためにオープンされています。
この問題は我々の後方互換テストで見つかるべき問題ですが、Luceneで不足しているため発見されませんでした。
テストスイートは今後の可能性のために改良されます。&lt;/p&gt;
&lt;p&gt;このリリースはその他に、Aggregationのマイナーバグフィックスも含まれています。
詳細は&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-3-1/&#34;&gt;リリースノート&lt;/a&gt;をご覧ください&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.elasticsearch.org/downloads/1-3-1/&#34;&gt;Elasticsearch 1.3.1&lt;/a&gt;をダウンロードし、試してください。
もし問題を見つけた場合は&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues&#34;&gt;GitHubのIssues&lt;/a&gt;へご報告をお願いいたします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Curator 1.2および1.1について</title>
      <link>https://blog.johtani.info/blog/2014/07/28/curator-2-0-and-1-1/</link>
      <pubDate>Mon, 28 Jul 2014 14:19:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/07/28/curator-2-0-and-1-1/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.elasticsearch.org/blog/curator-1-2-0-released/&#34;&gt;Curatorの1.2.0がリリース&lt;/a&gt;されました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://blog.johtani.info/blog/2014/01/24/curator-tending-your-time-series-indices-in-japanese/&#34;&gt;前回のCuratorの記事&lt;/a&gt;が古くなってしまった（1.1.0からコマンドのI/Fが変更された）ので
1.1.0および1.2.0に関する記事を翻訳しておきます。&lt;/p&gt;
&lt;p&gt;ちなみに、&lt;a href=&#34;https://github.com/elasticsearch/curator/&#34;&gt;Curator&lt;/a&gt;とは、Elasticsearchに時系列のインデックス（例：LogstashやFluentdでログを保存）を保存している場合にそれらのインデックスを管理（削除したり、クローズしたり）するための便利なツールです。
Curatorの概要については、&lt;a href=&#34;https://github.com/elasticsearch/curator/&#34;&gt;GitHubリポジトリ&lt;/a&gt;か&lt;a href=&#34;http://blog.johtani.info/blog/2014/01/24/curator-tending-your-time-series-indices-in-japanese/&#34;&gt;前回の記事&lt;/a&gt;をご覧ください。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h1 id=&#34;curator-110リリース-20140613公開&#34;&gt;Curator 1.1.0リリース (2014/06/13公開)&lt;a name=&#34;curator_v110&#34;/&gt;&lt;/h1&gt;
&lt;p&gt;元記事：&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-curator-version-1-1-0-released/&#34;&gt;elasticsearch curator - version 1.1.0 released&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;http://www.elasticsearch.org/blog/curator-1-2-0-released/&#34;&gt;Curatorの1.2.0がリリース&lt;/a&gt;されました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://blog.johtani.info/blog/2014/01/24/curator-tending-your-time-series-indices-in-japanese/&#34;&gt;前回のCuratorの記事&lt;/a&gt;が古くなってしまった（1.1.0からコマンドのI/Fが変更された）ので
1.1.0および1.2.0に関する記事を翻訳しておきます。&lt;/p&gt;
&lt;p&gt;ちなみに、&lt;a href=&#34;https://github.com/elasticsearch/curator/&#34;&gt;Curator&lt;/a&gt;とは、Elasticsearchに時系列のインデックス（例：LogstashやFluentdでログを保存）を保存している場合にそれらのインデックスを管理（削除したり、クローズしたり）するための便利なツールです。
Curatorの概要については、&lt;a href=&#34;https://github.com/elasticsearch/curator/&#34;&gt;GitHubリポジトリ&lt;/a&gt;か&lt;a href=&#34;http://blog.johtani.info/blog/2014/01/24/curator-tending-your-time-series-indices-in-japanese/&#34;&gt;前回の記事&lt;/a&gt;をご覧ください。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h1 id=&#34;curator-110リリース-20140613公開&#34;&gt;Curator 1.1.0リリース (2014/06/13公開)&lt;a name=&#34;curator_v110&#34;/&gt;&lt;/h1&gt;
&lt;p&gt;元記事：&lt;a href=&#34;http://www.elasticsearch.org/blog/elasticsearch-curator-version-1-1-0-released/&#34;&gt;elasticsearch curator - version 1.1.0 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Elasticsearch 1.0.0がリリースされ、新しい機能、Snapshot &amp;amp; Restoreが利用できるようになりました。
Snapshotはある時点でのインデックスの写真を撮るように、バックアップを作成することができます。
1.0.0が発表されてすぐに、この機能に関するリクエストが寄せられるようになりました。
「Curatorにスナップショットを追加して！」もしくは「いつCuratorでスナップショットが使えるようになる？」といった感じです。
これがあなたの要望なら、それはついに叶えられました。しかも他の追加機能も一緒にです。&lt;/p&gt;
&lt;h2 id=&#34;新機能&#34;&gt;新機能&lt;/h2&gt;
&lt;p&gt;Curatorの新機能は以下のとおりです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;新CLI構造&lt;/li&gt;
&lt;li&gt;スナップショット(Snapshot)&lt;/li&gt;
&lt;li&gt;エイリアス(Aliases)&lt;/li&gt;
&lt;li&gt;パターンによる除外インデックス指定&lt;/li&gt;
&lt;li&gt;配置ルーティング(Allocation Routing)&lt;/li&gt;
&lt;li&gt;インデックスとスナップショットの表示&lt;/li&gt;
&lt;li&gt;リポジトリ管理(個別のスクリプトによる)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/elasticsearch/curator/wiki&#34;&gt;ドキュメントWiki&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;新コマンドライン構造&#34;&gt;新コマンドライン構造&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：コマンドライン構造の変更とは、Curator 1.1.0以前のcron記述が動作しないことを意味します。Curator 1.1.0にアップグレードする場合はコマンドも修正が必要となるので注意してください。&lt;/p&gt;
&lt;p&gt;シンプルにするために、&lt;em&gt;commands&lt;/em&gt;という概念を追加しました。
また、ヘルプの出力もわかりやすくなっています。
前のバージョンと同じタスクをCuratorは実行できますが、異なるフォーマットを用いるようになりました。&lt;/p&gt;
&lt;p&gt;旧コマンド：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curator -d 30
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;新コマンド：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curator delete --older-than 30
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;コマンドは、フラグとは異なりハイフンを前に付けないことに注意してください。
また、似たような名前のフラグがあることに気をつけてください。
例えば、&lt;code&gt;--older-than&lt;/code&gt;フラグは多くのコマンドに利用できます。
指定される値は各ケースにおいて同一です。「指定された数よりも古いインデックス」となります。&lt;/p&gt;
&lt;p&gt;新しいコマンドのリストは次のとおりです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;alias&lt;/li&gt;
&lt;li&gt;allocation&lt;/li&gt;
&lt;li&gt;bloom&lt;/li&gt;
&lt;li&gt;close&lt;/li&gt;
&lt;li&gt;delete&lt;/li&gt;
&lt;li&gt;optimize&lt;/li&gt;
&lt;li&gt;show&lt;/li&gt;
&lt;li&gt;snapshot&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;コマンドのヘルプは次のコマンドで表示されます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curator [COMMAND] --help
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;コマンドに関係あるフラグがすべて表示されます。&lt;/p&gt;
&lt;h3 id=&#34;スナップショットsnapshots&#34;&gt;スナップショット(snapshots)&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;snapshot&lt;/code&gt;コマンドで、存在しているリポジトリにインデックスのスナップショットを保存することができます。&lt;/p&gt;
&lt;p&gt;Curatorはインデックス毎に1つのスナップショットを作成し、インデックスから名前をつけます。
例えば、インデックスの名前が&lt;code&gt;logstash-2014.06.10&lt;/code&gt;の場合、スナップショットの名前は&lt;code&gt;logstash-2014.06.10&lt;/code&gt;となります。
指定した条件を元に、シーケンシャルに、1つずつインデックスのスナップショットを作成していきます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curator snapshot --older-than 20 --repository REPOSITORY_NAME
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;このコマンドは、20日以上古いインデックスすべてのスナップショットを作成し、&lt;code&gt;REPOSITORY_NAME&lt;/code&gt;で指定されたリポジトリに保存します。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;es_repo_mgr&lt;/code&gt;と呼ばれるリポジトリ作成を支援するスクリプトがCuratorには含まれています。
ファイルシステムおよびS3タイプのリポジトリ両方の作成を支援します。&lt;/p&gt;
&lt;p&gt;さらに、古いインデックスのスナップショットを取ることができることに加えて、Curatorは最新のインデックスをアップロードする方法も提供します。
これは、&lt;a href=&#34;http://www.elasticsearch.org/overview/marvel/&#34;&gt;Elasticsearch Marvel&lt;/a&gt;のインデックスをアップロードするときに便利です。
トラブルシューティングを目的として、パフォーマンスデータを他の人に見せる場合などです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curator snapshot --most-recent 3 --prefix .marvel- --repository REPOSITORY_NAME
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;このコマンドでは、最新の3つのMarvelインデックスのスナップショットを指定されたリポジトリに保存できます。&lt;/p&gt;
&lt;h3 id=&#34;エイリアスaliases&#34;&gt;エイリアス(aliases)&lt;/h3&gt;
&lt;p&gt;Curatorはすでに存在するエイリアスにインデックスを追加することも、削除することもできるようになりました。
ただし、エイリアスがすでに存在している必要があります。エイリアスの作成はできません。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;last_week&lt;/code&gt;という前の一週間のインデックスのエイリアスを保持していること想像してください。
この場合、次の2つのコマンドを利用することで、エイリアスを管理できます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curator alias --alias-older-than 7 --alias last_week
curator alias --unalias-older-than 14 --alias last_week
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;新しく作られたインデックスが&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-templates.html#indices-templates&#34;&gt;インデックステンプレート&lt;/a&gt;によって
自動的にエイリアスの一部となるようにElasticsearchに設定しておくと、さらに便利です。
この場合、新しいインデックスが自動的に&lt;code&gt;this_week&lt;/code&gt;というエイリアスの一部になるようにしてあれば、以下のコマンドのみとなります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curator alias --unalias-older-than 7 --alias this_week
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;this_week&lt;/code&gt;と&lt;code&gt;last_week&lt;/code&gt;のエイリアスのアップデートを保持できます。&lt;/p&gt;
&lt;h3 id=&#34;パターンによる除外exclude-pattern&#34;&gt;パターンによる除外(exclude pattern)&lt;/h3&gt;
&lt;p&gt;時には、指定したインデックスを操作から除外したくなる場合もあるでしょう。
ここまでは、プレフィックスや日付によって選択されたインデックスのみを対象にしてきました。
そこで、&lt;code&gt;--exclude-pattern&lt;/code&gt;オプションです。これは、指定したインデックスを除いて処理を行うことができます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;logstash-2014.06.11&lt;/code&gt;というインデックスを決して削除したくないとします。
この場合、次のコマンドのようになります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curator delete --older-than 15 --exclude-pattern 2014.06.11
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Curatorはデフォルトで&lt;code&gt;logstash-&lt;/code&gt;というプレフィックスにマッチしますが、&lt;code&gt;2014.06.11&lt;/code&gt;というインデックスは対象外となります。&lt;/p&gt;
&lt;h3 id=&#34;配置ルーティングallocation-routing&#34;&gt;配置ルーティング(allocation routing)&lt;/h3&gt;
&lt;p&gt;Elasticsearchはノードにタグを付けることができます。
これらのタグはインデックスやシャードをクラスタのどこに配置するかをコントロールするために役立ちます。
一般的なユースケースだと、高性能なSSDドライブを持ったノードをインデキシングのために、ハードディスクを持った性能の低いマシンは検索頻度が低い古いインデックスを配置するといった場合です。
この場合、HDDノードには、&lt;code&gt;elasticsearch.yml&lt;/code&gt;に&lt;code&gt;node.tag: hdd&lt;/code&gt;、SSDノードには&lt;code&gt;node.tag: ssd&lt;/code&gt;と設定されているべきです。
Curatorはこの時、インデックスをタグに基づいてオフピークの時間帯に再配置させることができます。&lt;/p&gt;
&lt;p&gt;コマンド：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curator allocation --older-than 2 --rule tag=hdd
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;index.routing.allocation.require.tag=hdd&lt;/code&gt;という設定が２日よりも古いインデックスに適用されます。
これは、インデックスのシャードが&lt;code&gt;node.tag: hdd&lt;/code&gt;というノードに再配置される必要があると、Elasticsearchに伝えます。&lt;/p&gt;
&lt;h3 id=&#34;インデックスとスナップショットの表示show-indices-and-snapshots&#34;&gt;インデックスとスナップショットの表示(show indices and snapshots)&lt;/h3&gt;
&lt;p&gt;これは、単にあなたの持っているインデックスやスナップショットがどんなものかを表示します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curator show --show-indices
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これは、デフォルトプレフィックスの&lt;code&gt;logstash-&lt;/code&gt;にマッチするすべてのインデックスを表示します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curator show --show-snapshots --repository REPOSITORY_NAME
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これは、指定されたリポジトリにある、デフォルトプレフィックスの&lt;code&gt;logstash-&lt;/code&gt;にマッチするすべてのスナップショットを表示します。&lt;/p&gt;
&lt;h3 id=&#34;リポジトリ管理repository-management&#34;&gt;リポジトリ管理(repository management)&lt;/h3&gt;
&lt;p&gt;前に説明したとおり、&lt;code&gt;es_repo_mgr&lt;/code&gt;と呼ばれるヘルパースクリプトをCuratorは含んでいます。
現時点では、&lt;code&gt;fs&lt;/code&gt;と&lt;code&gt;s3&lt;/code&gt;タイプをサポートしています。
リポジトリを作る前に利用したいタイプのドキュメントを読むようにしてください。
例えば、&lt;code&gt;fs&lt;/code&gt;タイプのリポジトリを各ノードで使う場合は、同じ共有ファイルシステムに、同じパスでアクセスできなければなりません。
パスの指定は&lt;code&gt;--location&lt;/code&gt;です。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;fs&lt;/code&gt;タイプリポジトリの作成&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;es_repo_mgr create_fs --location &amp;#39;/tmp/REPOSITORY_LOCATION&amp;#39; --repository REPOSITORY_NAME
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;削除&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;es_repo_mgr delete --repository REPOSITORY_NAME
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;ドキュメントwiki&#34;&gt;ドキュメントWiki&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/elasticsearch/curator/wiki&#34;&gt;Curatorのドキュメント&lt;/a&gt;が更新され、オンラインにWiki形式でだれでも更新できるようになっています。
コマンドやフラグのより詳細の情報はこちらで見つけることができます。また、もし、興味があれば、ドキュメントを追加することもできます。&lt;/p&gt;
&lt;h2 id=&#34;インストールと更新&#34;&gt;インストールと更新&lt;/h2&gt;
&lt;p&gt;Curator 1.1.0は&lt;a href=&#34;https://pypi.python.org/pypi?%3Aaction=pkg_edit&amp;amp;name=elasticsearch-curator&#34;&gt;PyPi&lt;/a&gt;リポジトリにあります。
インストールは以下のとおりです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pip install elasticsearch-curator
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;バージョン1.0.0からアップグレードする場合は以下のとおりです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pip uninstall elasticsearch-curator
pip install elasticsearch-curator
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;バージョン1.0.0よりも古いバージョンからのアップグレードは以下のとおりです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pip uninstall elasticsearch-curator
pip uninstall elasticsearch
pip install elasticsearch-curator
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;pip uninstall elasticsearch&lt;/code&gt;で、古いパイションモジュールを削除します。
適切なバージョンが依存関係により再インストールされます。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Curatorの新機能は素晴らしいです！このリリースは大きな改善です。
もし、トラブルや足りないものを見つけた場合は&lt;a href=&#34;http://github.com/elasticsearch/curator/issues&#34;&gt;GitHub Issue&lt;/a&gt;に報告してください。
また、Curatorが便利だと思ったら、私たちに伝えてください。&lt;code&gt;#elasticsearch&lt;/code&gt;タグを付けてツイートしてください！&lt;/p&gt;
&lt;p&gt;Curatorはまだ、始まったばかりです。Curator 2.0のロードマップを作業中です。ここまで読んでいただきありがとうございます。
Happy Curating!&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id=&#34;curator-120リリース20140724&#34;&gt;Curator 1.2.0リリース(2014/07/24)&lt;/h1&gt;
&lt;p&gt;元記事：&lt;a href=&#34;http://www.elasticsearch.org/blog/curator-1-2-0-released/&#34;&gt;curator 1.2.0 released&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;#curator_v110&#34;&gt;Curator v1.1.0&lt;/a&gt;のリリースから、数週間が経ちました。
私たちは、Curator 1.2.0をリリースしました。&lt;/p&gt;
&lt;h2 id=&#34;新機能new-features&#34;&gt;新機能(new features)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ユーザ指定の日付パターン：長い間リクエストされていた機能&lt;/li&gt;
&lt;li&gt;ウィークリーインデックスのサポート：これも長い間リクエストされていた機能&lt;/li&gt;
&lt;li&gt;複数の&lt;a href=&#34;https://github.com/elasticsearch/curator/wiki/Logformat&#34;&gt;ログフォーマット&lt;/a&gt;オプション：Logstashフォーマットが利用可能&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらの変更は&lt;a href=&#34;https://github.com/elasticsearch/curator/wiki&#34;&gt;Curatorドキュメント&lt;/a&gt;にも記載されています。&lt;/p&gt;
&lt;h2 id=&#34;更新updates&#34;&gt;更新(updates)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ログ出力の整理：デフォルトのログ出力を整理しました。デバッグログはすべて表示されます。&lt;/li&gt;
&lt;li&gt;ドライランのログ出力の詳細化：テスト実行時に何が起きたかをわかりやすくしました。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;日付パターンと--timestringdate-patterns-and-timestring&#34;&gt;日付パターンと&lt;code&gt;--timestring&lt;/code&gt;(date patterns and &amp;ndash;timestring)&lt;/h2&gt;
&lt;p&gt;前のリリースで、セパレータ文字を利用して、インデックス名のエレメントを分離することで、日付を計算しました。
この設計の決定は、プログラムが管理するために設計されたLogstashのインデックスを使うのには簡単でした。
しかし、Curatorは時系列インデックス管理に成長しています。これは、異なる命名規則のインデックスを意味しています。&lt;/p&gt;
&lt;p&gt;また、インターバルによって、日付の計算が必要になる場合もあります。
&lt;code&gt;--time-unit&lt;/code&gt;オプションが残っており、&lt;code&gt;weeks&lt;/code&gt;という単位を指定することもできます。
デフォルトの&lt;code&gt;--timestring&lt;/code&gt;オプションは、以前のコマンドと同様の動作をしなければなりません。次のようになります。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Time Unit&lt;/th&gt;
          &lt;th&gt;Timestring&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;days&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;%Y.%m.%d&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;hours&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;%Y.%m.%d.%H&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;weeks&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;%Y.%W&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;これが意味するものは、もし、単位に&lt;code&gt;hours&lt;/code&gt;をした場合、&lt;code&gt;--timestring&lt;/code&gt;を指定しなかった場合は&lt;code&gt;%Y.%m.%d.%H&lt;/code&gt;となります。
これは、&lt;a href=&#34;https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior&#34;&gt;Pythonのstrftimeフォーマット&lt;/a&gt;で&amp;quot;年.月.日.時&amp;quot;を意味します。
同様に、&lt;code&gt;weeks&lt;/code&gt;を単位に指定した場合、Curatorはデフォルトの&lt;code&gt;--timestring&lt;/code&gt;は&lt;code&gt;%Y.%W&lt;/code&gt;となります。&lt;/p&gt;
&lt;p&gt;この機能は、日付の間にセパレーター文字のないインデックスでも機能します。
例えば、&lt;code&gt;production-20140724&lt;/code&gt;のような日時インデックスがある場合、2日よりも古いインデックスに対する&lt;a href=&#34;https://github.com/elasticsearch/curator/wiki/Disable-Bloom-Filter-Cache&#34;&gt;ブルームフィルタっキャッシュのオフ&lt;/a&gt;のコマンドは次のようになります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curator bloom --prefix production- --older-than 2 --timestring %Y%m%d
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;この例で、デフォルトの単位は&lt;code&gt;days&lt;/code&gt;であることに注意してください。&lt;code&gt;hourly-2014072414&lt;/code&gt;のような時間インデックスの場合は次のようになります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curator bloom --prefix hourly- --older-than 2 --time-unit hours --timestring %Y%m%d%H
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;--separatorの置き換え&#34;&gt;&lt;code&gt;--separator&lt;/code&gt;の置き換え&lt;/h2&gt;
&lt;p&gt;もし、Curatorの前のバージョンでカスタムセパレータ文字を利用していた場合、次のように変更すべきです。
前のコマンドで&lt;code&gt;cerberus-2014-07-24&lt;/code&gt;のようなインデックスがある場合、コマンドを&lt;code&gt;--separator -&lt;/code&gt;の用に置き換える必要があります。
新しいコマンドは次のとおりです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curator delete --prefix cerberus- --older-than 30 --timestring %Y-%m-%d
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;年(&lt;code&gt;％Y&lt;/code&gt;)と月(&lt;code&gt;%m&lt;/code&gt;)と日(&amp;rsquo;%d&amp;rsquo;)の間にセパレータ文字を置くだけです。&lt;/p&gt;
&lt;p&gt;これは、また、Curatorで以前は不可能であったことをできるようにもします。
異なるセパレータ文字の混在です。
&lt;code&gt;logs-2014.07.24-14&lt;/code&gt;というようなインデックスを処理するときに&lt;code&gt;--timestring&lt;/code&gt;は&lt;code&gt;%Y.%m.%d-%H&lt;/code&gt;のようになります.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--timestring&lt;/code&gt;の詳細は&lt;a href=&#34;https://github.com/elasticsearch/curator/wiki/Timestring&#34;&gt;Curatorのドキュメント&lt;/a&gt;をご覧ください。&lt;/p&gt;
&lt;h2 id=&#34;フィードバック&#34;&gt;フィードバック&lt;/h2&gt;
&lt;p&gt;これらの新しい機能はユーザのコメントやリクエストから来ています。もし、機能のリクエストやバグを発見したら、&lt;a href=&#34;https://github.com/elasticsearch/curator/issues&#34;&gt;こちら&lt;/a&gt;まで連絡してください。&lt;/p&gt;
&lt;p&gt;また、Twitterでもお待ちしています。私たちのTwitter IDは&lt;code&gt;@elasticsearch&lt;/code&gt;です。&lt;/p&gt;
&lt;p&gt;Happy Curating!&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第5回Elasticsearch勉強会を開催しました。#elasticsearchjp</title>
      <link>https://blog.johtani.info/blog/2014/07/19/hold-on-5th-elasticsearch-jp/</link>
      <pubDate>Sat, 19 Jul 2014 21:52:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/07/19/hold-on-5th-elasticsearch-jp/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://elasticsearch.doorkeeper.jp/events/12028&#34;&gt;第5回Elasticsearch勉強会&lt;/a&gt;を開催しました。
遅くなってしまいましたが、まとめてみました。&lt;/p&gt;
&lt;p&gt;今回は、Elasticsearchに入って初の勉強会でした。タイミングが良いことに、Honza、Igor、Shayの3名がトレーニングのために
来日していたため、特別回ということにして、話をしてもらいました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;http://elasticsearch.doorkeeper.jp/events/12028&#34;&gt;第5回Elasticsearch勉強会&lt;/a&gt;を開催しました。
遅くなってしまいましたが、まとめてみました。&lt;/p&gt;
&lt;p&gt;今回は、Elasticsearchに入って初の勉強会でした。タイミングが良いことに、Honza、Igor、Shayの3名がトレーニングのために
来日していたため、特別回ということにして、話をしてもらいました。&lt;/p&gt;
&lt;p&gt;そして、&lt;a href=&#34;http://samuraism.com/&#34;&gt;サムライズム&lt;/a&gt;の&lt;a href=&#34;https://twitter.com/yusuke&#34;&gt;@yusuke&lt;/a&gt;さんにテキスト翻訳してもらいました。
早くて正確なタイピング＋翻訳、本当にありがとうございました。&lt;/p&gt;
&lt;p&gt;開場提供していただいた&lt;a href=&#34;http://recruit-tech.co.jp&#34;&gt;リクルートテクノロジーズさん&lt;/a&gt;、ありがとうございました！
次回もよろしくお願いします！
参加していただき盛り上げていただいた参加者の皆さんもありがとうございました。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; lang=&#34;ja&#34;&gt;&lt;p&gt;amazing turnout to the elasticsearch at Tokyo &lt;a href=&#34;https://twitter.com/hashtag/elasticsearchjp?src=hash&#34;&gt;#elasticsearchjp&lt;/a&gt; &lt;a href=&#34;http://t.co/Aa88eVf5dF&#34;&gt;pic.twitter.com/Aa88eVf5dF&lt;/a&gt;&lt;/p&gt;&amp;mdash; Shay Banon (@kimchy) &lt;a href=&#34;https://twitter.com/kimchy/statuses/488686274375843841&#34;&gt;2014, 7月 14&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;//platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;!-- more --&gt;
&lt;p&gt;動画があとで、アップされる予定です。お楽しみに。&lt;/p&gt;
&lt;h2 id=&#34;honzas-talk&#34;&gt;Honza&amp;rsquo;s talk&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;djangoの開発者！であり、ElasticsearchのPythonクライアント、Curatorの開発者&lt;/li&gt;
&lt;li&gt;Python Clientを利用しながら、ライブコーディングのような形で説明する方法が新鮮&lt;/li&gt;
&lt;li&gt;Aggregationの便利さについての説明&lt;/li&gt;
&lt;li&gt;Python Clientがクエリを組み立てるのにすごく便利そうだった&lt;/li&gt;
&lt;li&gt;Pythonユーザが結構いたので助かりましたｗ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;igors-talk&#34;&gt;Igor&amp;rsquo;s talk&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://speakerdeck.com/imotov/elasticsearch-data&#34;&gt;elasticsearch data/&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Snapshot/Restoreの開発などを行っている開発者&lt;/li&gt;
&lt;li&gt;Elasticsearchのデータ、ディレクトリ構造に関するお話&lt;/li&gt;
&lt;li&gt;シャードの話から、ディレクトリ構造、メタデータに関する説明&lt;/li&gt;
&lt;li&gt;transaction logの挙動の説明&lt;/li&gt;
&lt;li&gt;検索のフェーズの説明&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Igorは、実は私がElasticsearch社の人とコンタクトがとれた最初の人だと思います。
第1回Elasticsearch勉強会が開催する当日に帰国されるという不運だったのですが、1年越しでトークしてもらえました！&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; lang=&#34;ja&#34;&gt;&lt;p&gt;&lt;a href=&#34;https://twitter.com/johtani&#34;&gt;@johtani&lt;/a&gt; I am so bummed! I am leaving Tokyo Thursday morning.&lt;/p&gt;&amp;mdash; Igor Motov (@imotov) &lt;a href=&#34;https://twitter.com/imotov/statuses/372340973121986560&#34;&gt;2013, 8月 27&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;//platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;h2 id=&#34;qa&#34;&gt;QA&lt;/h2&gt;
&lt;p&gt;ShayをメインにいくつかのQAをしてもらいました。
NetflixなどのMeetupの動画で見てたのですが、こんな形で日本でも実現できるとは。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Q: なんで、ファイルデスクリプタの設定を大きくするの？
&lt;ul&gt;
&lt;li&gt;A: Luceneのインデックスは複数のセグメントから構成されている。メモリに作られたあと、ファイルにfsyncされる。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q: KibanaでAggregation使いたいんだけど？
&lt;ul&gt;
&lt;li&gt;A: Kibana 4で対応するよ！異なるフィールドの値を1つのグラフにすることも出来るよ！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q: なんでElasticsearch作ったの？
&lt;ul&gt;
&lt;li&gt;A: 暇だったからｗ奥さんのレシピ検索を作ってみようと思って作り始めて、Luceneを触って感動して。。。検索すげー、Compassってのを触ってこれもすごいと思いつつ、もっとLucene活用できるんじゃないかということでElasticsearch作ったんだ。奥さんのレシピ検索？まだ完成してないよｗ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q: 2000くらいスナップショット撮ったらパフォーマンスが悪くなっててなんで？
&lt;ul&gt;
&lt;li&gt;A: 差分でスナップショットを作るんだけど、差分の計算に昔のスナップショットを見るので、定期的に新しくしたほうがいい。もし、気になることがあったらIssue上げたりMLに投げてくれるとうれしい。&lt;br&gt;
（あとでちょっと聞いたけど、古いスナップショットを消すのも有効っぽい。差分でスナップショットを作るけど、昔のを消した場合は、新しいスナップショットが利用しているファイルは残る仕組みになっているから。）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q: Relevancyのチューニングってどうすればいい？ドキュメントが少なくない？
&lt;ul&gt;
&lt;li&gt;A: ドキュメンテーションは頑張ってるので、応援してねｗあとは、&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/index.html&#34;&gt;definitive guide&lt;/a&gt;も参考になるよ。スコアはfunction_scoreクエリがすごいのでいろいろ使ってね。MVELをGroovyに帰る予定。性能もだけど、サンドボックス的な意味もあります。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q: 次のVisionは？現時点は検索だけど。（最後の質問がとてもナイスで、助かりましたｗ私がしたほうがいい気がするｗｗ）
&lt;ul&gt;
&lt;li&gt;A: 今後はアナリティクスのプラットフォームに向かってる。Aggregationとかね。メモリ効率よくしたりしてるよ。あとは、Field-collapsionも実装中だよ。あと、マシンラーニングとかもね。データを探索するための機能を色々作ってくよ。障害性にも。チェックサム機能をLuceneに入れて、ESにも入れていく予定。Zenの機能も改善している。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;今週は、トレーニングがあったり、いろいろな打ち合わせがあったりと、テンパってたので至らない点が多かったかもしれないですが。。。
楽しんでいただけと思います。
数日、Shay、Honza、Igorと行動を共にして、本当に情熱のあるチームでユーザのことを気にかけているなと感じることができました。
少しでもその片鱗を勉強会で感じてもらえたんじゃないかと。特に、QAでのShayによる情熱が伝わったんじゃないかと。&lt;/p&gt;
&lt;p&gt;懇親会でも数人の方から、日本語のサポートを望んでいるという声も頂きました。
興味のある方は私までコンタクトいただければと。&lt;/p&gt;
&lt;p&gt;あと、@yusukeさんのテキスト翻訳が素晴らしくて、参加してもらった方たちも絶賛してました。
次回も英語スピーカーの場合に助けてもらえると嬉しいです（私もそこまで出来るように頑張ります）&lt;/p&gt;
&lt;h2 id=&#34;その他のブログ&#34;&gt;その他のブログ&lt;/h2&gt;
&lt;p&gt;ブログ記事ありがとうございます！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://arika.hateblo.jp/entry/2014/07/15/011241&#34;&gt;第5回elasticsearch勉強会にいってきました - はやさがたりない。&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.yoslab.com/entry/2014/07/15/073000&#34;&gt;感想戦：aggrigation から見える検索エンジンの次 - 第5回 Elasticsearch勉強会 - よしだのブログ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://uchimanajet7.hatenablog.com/entry/2014/07/15/114632&#34;&gt;「第5回elasticsearch勉強会 #elasticsearch #elasticsearchjp」（2014年07月14日）の参加メモ - uchimanajet7のメモ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Introduction Elasticsearch / Full Text Search at TMU</title>
      <link>https://blog.johtani.info/presentation/2014/full-text-search-at-tmu/</link>
      <pubDate>Thu, 17 Jul 2014 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2014/full-text-search-at-tmu/</guid>
      <description></description>
      <content:encoded></content:encoded>
    </item>
    
    <item>
      <title>転職しました</title>
      <link>https://blog.johtani.info/blog/2014/07/01/join-elasticsearch/</link>
      <pubDate>Tue, 01 Jul 2014 11:30:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/07/01/join-elasticsearch/</guid>
      <description>&lt;p&gt;ということで、転職しました。
どーしてもやりたいことが出てきたので、無理を言って転職することにしてみました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;&lt;a href=&#34;http://samuraism.com&#34;&gt;サムライズム&lt;/a&gt;ではなく、&lt;a href=&#34;http://www.elasticsearch.com&#34;&gt;Elasticsearch&lt;/a&gt;にジョインします。（というか、しました。）&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; lang=&#34;ja&#34;&gt;&lt;p&gt;初出社 &lt;a href=&#34;https://twitter.com/hashtag/%E3%82%B5%E3%83%A0%E3%83%A9%E3%82%A4%E3%82%BA%E3%83%A0?src=hash&#34;&gt;#サムライズム&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://twitter.com/johtani/statuses/483793778541465600&#34;&gt;2014, 7月 1&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;//platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;冗談でツイートしたのですが、その前に英語アカウントのツイートがRTされてしまっていまいちでした。。。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ということで、転職しました。
どーしてもやりたいことが出てきたので、無理を言って転職することにしてみました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;&lt;a href=&#34;http://samuraism.com&#34;&gt;サムライズム&lt;/a&gt;ではなく、&lt;a href=&#34;http://www.elasticsearch.com&#34;&gt;Elasticsearch&lt;/a&gt;にジョインします。（というか、しました。）&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; lang=&#34;ja&#34;&gt;&lt;p&gt;初出社 &lt;a href=&#34;https://twitter.com/hashtag/%E3%82%B5%E3%83%A0%E3%83%A9%E3%82%A4%E3%82%BA%E3%83%A0?src=hash&#34;&gt;#サムライズム&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://twitter.com/johtani/statuses/483793778541465600&#34;&gt;2014, 7月 1&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;//platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;冗談でツイートしたのですが、その前に英語アカウントのツイートがRTされてしまっていまいちでした。。。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20140701/schiphol.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20140701/schiphol.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
    &lt;figcaption align=&#34;center&#34;&gt;&lt;h4&gt;スキポール空港&lt;/h4&gt;
    &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;先週、アムステルダムに行っていたのも退職前に休みをいただき、Elasticsearchの全社会議に参加していたためです。
とてもエキサイティングな経験（英語漬けとか）ができ、もっと精進しないとなという気持ちにもなり、ますます頑張らないとなと。&lt;/p&gt;
&lt;p&gt;ということで、今後は日本中にElasticsearchやLogstash、Kibanaを広めるべく、いろいろな場所で話をしたいと思います。
興味のある方は、声をかけていただければと。&lt;/p&gt;
&lt;p&gt;あと、東京で&lt;a href=&#34;http://purchases.elasticsearch.com/class/elasticsearch/core-elasticsearch/tokyo/2014-05-20&#34;&gt;ElasticsearchのCoreトレーニング&lt;/a&gt;が行われます。
通常は2日間ですが、通訳の方が付く関係で3日間の開催となっています。
開発者2名がトレーナーとして来日します。開発者に質問をできる良い機会ですので、興味のある方は参加してみてはいかがでしょうか。
&lt;strong&gt;また、CTOのShay Banonも来日する予定です。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;トレーナー2名とShayは&lt;a href=&#34;http://elasticsearch.doorkeeper.jp/events/12028&#34;&gt;7/14の勉強会&lt;/a&gt;でも話をしてくれます。
こちらも興味のある方は参加してみてください。（参加登録はこの後、すぐに開始します。）&lt;/p&gt;
&lt;p&gt;まだまだ、勉強しなければいけないことだらけですが、ElasticsearchのいろいろなプロダクトやOSSについて広めていきたいと思いますので、よろしくお願いいたします。&lt;/p&gt;
&lt;h2 id=&#34;おまけ&#34;&gt;おまけ&lt;/h2&gt;
&lt;p&gt;ということで、一度やってみたかったのでリンクを貼ってみます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/registry/wishlist/29EMX20UN9P16&#34;&gt;ほしい物リストはこちら&lt;/a&gt;&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>退職しました</title>
      <link>https://blog.johtani.info/blog/2014/06/30/resignation/</link>
      <pubDate>Mon, 30 Jun 2014 23:19:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/06/30/resignation/</guid>
      <description>&lt;p&gt;退職しました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;色々と書きたいんですが、時差ボケで頭痛いので、このくらいです。
余裕出たら書くかも。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/registry/wishlist/29EMX20UN9P16&#34;&gt;ほしい物リストはこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;新天地についてはまた明日。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;退職しました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;色々と書きたいんですが、時差ボケで頭痛いので、このくらいです。
余裕出たら書くかも。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/registry/wishlist/29EMX20UN9P16&#34;&gt;ほしい物リストはこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;新天地についてはまた明日。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch server 2nd editionのファーストインプレッション</title>
      <link>https://blog.johtani.info/blog/2014/06/16/first-impression-elasticsearch-server-2nd-edition/</link>
      <pubDate>Mon, 16 Jun 2014 17:47:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/06/16/first-impression-elasticsearch-server-2nd-edition/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://bit.ly/1kbu5Xd&#34;&gt;Elasticsearch server 2nd edition&lt;/a&gt;が発売されています。&lt;/p&gt;
&lt;p&gt;私が翻訳したのは前のバージョンですが。。。
まずは、目次を元にどのくらい変わってるかを見てみました。
（全部まだ読んでなくて。。。）&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;http://bit.ly/1kbu5Xd&#34;&gt;Elasticsearch server 2nd edition&lt;/a&gt;が発売されています。&lt;/p&gt;
&lt;p&gt;私が翻訳したのは前のバージョンですが。。。
まずは、目次を元にどのくらい変わってるかを見てみました。
（全部まだ読んでなくて。。。）&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;1章-getting-started-with-the-elasticsearch-cluster&#34;&gt;1章 Getting Started with the Elasticsearch Cluster&lt;/h2&gt;
&lt;p&gt;冒頭に、全文検索とは、転置インデックスとはどんなものか、
Luceneの簡単なアーキテクチャの仕組みについて説明が追加されています。
検索の仕組みを知らない人が読んでもわかりやすくなっています。&lt;/p&gt;
&lt;p&gt;インストール方法なども少し追記されています。
バージョニングと簡単なデータ登録と検索方法についてもここで触れられています。
検索結果の構造の説明もちょっとあります。
まず簡単に触ってみるというところまでが1章でまとめられた感じです。&lt;/p&gt;
&lt;h2 id=&#34;2章-indexing-your-data&#34;&gt;2章 Indexing Your Data&lt;/h2&gt;
&lt;p&gt;新しく、切りだされた形です。
前のバージョンでは1章で説明されていた、Mapping周りが切りだされています。
シャードやレプリカの説明もこちらです。&lt;/p&gt;
&lt;p&gt;IPアドレスタイプ（IPv4のみ）と&lt;code&gt;token_count&lt;/code&gt;タイプの説明も追加されてます。
similarityやpostingsフォーマットなどは新しく追記されています。
また、メタフィールドと呼ばれる&lt;code&gt;_type&lt;/code&gt;などはこちらに移動しているようです。
マージ処理などの説明も追記されています。このあたりは、&lt;a href=&#34;http://www.packtpub.com/mastering-elasticsearch-querying-and-data-handling/book&#34;&gt;Mastering ElasticSearch&lt;/a&gt;に
記載されているものが移植された感じでしょうか。&lt;/p&gt;
&lt;h2 id=&#34;3章-searching-your-data&#34;&gt;3章 Searching Your Data&lt;/h2&gt;
&lt;p&gt;前のバージョンでは2章だった章です。
クエリについては1.0で追加された&lt;code&gt;simple_query_string&lt;/code&gt;などが追記されています。
&lt;code&gt;constant_score&lt;/code&gt;や&lt;code&gt;dismax&lt;/code&gt;などもです。&lt;/p&gt;
&lt;p&gt;また、前のバージョンの3章で説明されていたハイライトや8章で触れられていた&lt;code&gt;validate API&lt;/code&gt;についても
移動しています。&lt;/p&gt;
&lt;h2 id=&#34;4章-extending-your-index-structure&#34;&gt;4章 Extending Your Index Structure&lt;/h2&gt;
&lt;p&gt;前のバージョンの3章で触れられていた、データの構造に関する部分がこの章になります。
親子や配列、ネスト等のデータのインデックスや検索の方法です。&lt;/p&gt;
&lt;h2 id=&#34;5章-make-your-search-better&#34;&gt;5章 Make Your Search Better&lt;/h2&gt;
&lt;p&gt;スクリプティングや言語判定などの仕組みが記載されています。
また、ブーストについても同様です。Synonymについてもここです。
スパンクエリについては省略されたのかな？&lt;/p&gt;
&lt;h2 id=&#34;6章-beyond-full-text-searching&#34;&gt;6章 Beyond Full-text Searching&lt;/h2&gt;
&lt;p&gt;1.0の目玉機能の一つであるAggregationの説明から始まります。
その後、ファセットやPercolatorについてです。メモリに関する注意点もありそうです。
また、Geoについての説明がこちらに移動されていました。
&lt;code&gt;scroll API&lt;/code&gt;についてもこちらで説明されています。&lt;/p&gt;
&lt;h2 id=&#34;7章-elasticsearch-cluster-in-detail&#34;&gt;7章 Elasticsearch Cluster in Detail&lt;/h2&gt;
&lt;p&gt;前の7章で記載されていたElasticsearchの分散の仕組み（Node Discovery）についての記載があります。
また、1.0で追加された&lt;code&gt;circuit breaker&lt;/code&gt;やスレッドプール、インデックスのリフレッシュレートなど、&lt;a href=&#34;http://www.packtpub.com/elasticsearch-server-second-edition/book&#34;&gt;Mastering ElasticSearch&lt;/a&gt;の
内容も追記されている気がします。&lt;/p&gt;
&lt;p&gt;インデックスやマッピングのテンプレート機能についてもここで説明があるみたいです。&lt;/p&gt;
&lt;h2 id=&#34;8章-administrating-your-cluster&#34;&gt;8章 Administrating Your Cluster&lt;/h2&gt;
&lt;p&gt;1.0で追加された&lt;code&gt;snapshot/restore&lt;/code&gt;の説明から始まります。
あとは、前のバージョンの7章で説明されていたクラスタ管理用のAPIについての説明です。
いくつか（例えば&lt;code&gt;cat API&lt;/code&gt;）、1.0で追加されています。&lt;/p&gt;
&lt;p&gt;また、シャードのリバランスの話も追加されているようです。
エイリアスやプラグインの話はこちらに移動してるみたいです。&lt;/p&gt;
&lt;h2 id=&#34;感想&#34;&gt;感想&lt;/h2&gt;
&lt;p&gt;ということで、とりあえず、駆け足で目次ベースで違いを見てみました。
&lt;a href=&#34;http://www.packtpub.com/elasticsearch-server-second-edition/book&#34;&gt;Mastering ElasticSearch&lt;/a&gt;での
知見がフィードバックされ、しかも1.0（すでに1.3が出そうな勢いですが。。。）にバージョンアップされた内容になっています。
冒頭がわかりやすくなっているので、検索をやったことのない方にもおすすめな書籍になった気がします。
英語が苦にならなければ、おすすめの一冊だと思います。&lt;/p&gt;
&lt;p&gt;来月から読み進めるつもりなので、また、面白い内容があったら感想を書いていこうと思います。
（また翻訳できるといいかもなー）&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>可視化ツール現状確認会に参加してきました。#可視化</title>
      <link>https://blog.johtani.info/blog/2014/06/04/attending-visualize-study/</link>
      <pubDate>Wed, 04 Jun 2014 21:15:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/06/04/attending-visualize-study/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.zusaar.com/event/7437003&#34;&gt;可視化ツール現状確認会&lt;/a&gt;に参加して、&lt;strike&gt;カジュアルウォーターじゃなくて&lt;/strike&gt;可視化ツールの現状を確認してきました。&lt;/p&gt;
&lt;p&gt;ということで、いつものメモです。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;mackerel-と-graphite-について-y_uuk1さん&#34;&gt;Mackerel と Graphite について （y_uuk1さん）&lt;/h2&gt;
&lt;h3 id=&#34;graphite&#34;&gt;Graphite&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;時系列&lt;/li&gt;
&lt;li&gt;工夫すればスケーラブル&lt;/li&gt;
&lt;li&gt;SensuやCollectdと組み合わせたり&lt;/li&gt;
&lt;li&gt;GrafanaとGrapheneでGUI&lt;/li&gt;
&lt;li&gt;Mackerel素敵だよと。&lt;/li&gt;
&lt;li&gt;架空のわかりやすいグラフが見れた&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;kibana--grafana--influga-hakoberaさん&#34;&gt;Kibana &amp;amp; Grafana &amp;amp; Influga （hakoberaさん）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Kibana&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;http://www.zusaar.com/event/7437003&#34;&gt;可視化ツール現状確認会&lt;/a&gt;に参加して、&lt;strike&gt;カジュアルウォーターじゃなくて&lt;/strike&gt;可視化ツールの現状を確認してきました。&lt;/p&gt;
&lt;p&gt;ということで、いつものメモです。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;mackerel-と-graphite-について-y_uuk1さん&#34;&gt;Mackerel と Graphite について （y_uuk1さん）&lt;/h2&gt;
&lt;h3 id=&#34;graphite&#34;&gt;Graphite&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;時系列&lt;/li&gt;
&lt;li&gt;工夫すればスケーラブル&lt;/li&gt;
&lt;li&gt;SensuやCollectdと組み合わせたり&lt;/li&gt;
&lt;li&gt;GrafanaとGrapheneでGUI&lt;/li&gt;
&lt;li&gt;Mackerel素敵だよと。&lt;/li&gt;
&lt;li&gt;架空のわかりやすいグラフが見れた&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;kibana--grafana--influga-hakoberaさん&#34;&gt;Kibana &amp;amp; Grafana &amp;amp; Influga （hakoberaさん）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Kibana&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;かっこいい。&lt;/li&gt;
&lt;li&gt;JVM大変。&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Grafana&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Graphiteがカッコ悪いのでKibanaをフォーク&lt;/li&gt;
&lt;li&gt;なぜか、ESが必要。&lt;/li&gt;
&lt;li&gt;InfluxDBに浮気しそう&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Influga&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;@haoberaさん作&lt;/li&gt;
&lt;li&gt;InfluxDB Queryサポート&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;迷ったら、Kibana入れとけ。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DistinctがKibana出できないけど、それ以外はある程度行けるらしい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;aggregationがサポートされたら、できると思う。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kibana以外は、バックエンドがタイムシリーズなので、縛りがある&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;可視化ツール紹介仮-showyouさん&#34;&gt;可視化ツール紹介（仮） （showyouさん）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;誰がチャートを作るの？&lt;/li&gt;
&lt;li&gt;誰が見るの？&lt;/li&gt;
&lt;li&gt;一覧化されてて、あとで眺めたい&lt;/li&gt;
&lt;li&gt;IPython Notebookのデモ&lt;/li&gt;
&lt;li&gt;R shiny Serverのデモ&lt;/li&gt;
&lt;li&gt;Pentaho CE+Saikuのデモはネットワークがダメだったので割愛&lt;/li&gt;
&lt;li&gt;分析側の視点を見せたかったので。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;可視化とは何だったのか-harukasanさん&#34;&gt;可視化とは何だったのか （harukasanさん）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;インフラ&lt;/li&gt;
&lt;li&gt;モニタリング、アナライズ、可視化どれ？&lt;/li&gt;
&lt;li&gt;可視化は目的ではないよねと。&lt;/li&gt;
&lt;li&gt;熱く、ユーザとサービスプロバイダ間の距離のお話。
&lt;ul&gt;
&lt;li&gt;ログ&lt;/li&gt;
&lt;li&gt;生ファイルで残すのが重要&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;トータルで必要とか考えないといけないことがわかって面白かったｗ&lt;/p&gt;
&lt;h2 id=&#34;あなたの知らないrrdtool-shoichimasuharaさん&#34;&gt;あなたの知らないrrdtool （shoichimasuharaさん）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;すげー！&lt;/li&gt;
&lt;li&gt;いろいろできるらしい（ノートPCの前にいなかったｗ）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;d3jsとジオマッピング-takaki_さん&#34;&gt;D3.jsとジオマッピング （Takaki_さん）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;時空間推進課！すげー！&lt;/li&gt;
&lt;li&gt;ジオデータのおはなし。&lt;/li&gt;
&lt;li&gt;TopoJSONとかGeoJSONとか&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;zipkinについて-synkさん&#34;&gt;Zipkinについて （synkさん）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ものすごい数のJVMがThriftで殴りあってるらしい。&lt;/li&gt;
&lt;li&gt;ZipkinはTwitterが作ったもの&lt;/li&gt;
&lt;li&gt;Brave、HTraceというのが、PureJava用のZipkinトレーシングプラグイン&lt;/li&gt;
&lt;li&gt;見積もりする必要がないくらいでかいHBaseがあるので、そこにためてる。&lt;/li&gt;
&lt;li&gt;まとめ
&lt;ul&gt;
&lt;li&gt;LINEはエンジニアを大募集中&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;graphiteについて-mickey19821-さん&#34;&gt;Graphiteについて (mickey19821 さん)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ドリコムさんのGraphiteのおはなし&lt;/li&gt;
&lt;li&gt;Metricsの収集はCollectd&lt;/li&gt;
&lt;li&gt;Graphite-webがスケールできなくて困ってるらしい。&lt;/li&gt;
&lt;li&gt;Graphiteで可視化ツラいｗ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;RRDTool最高&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;あと、クックパッドの技術力がすごいという発表なんかもありました。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>最新インフラエンジニア技術勉強に参加しました。</title>
      <link>https://blog.johtani.info/blog/2014/05/23/attending-drecom-infra-study/</link>
      <pubDate>Fri, 23 May 2014 19:18:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/05/23/attending-drecom-infra-study/</guid>
      <description>&lt;p&gt;今月2回目の目黒で、初のドリコムさんです。
「&lt;a href=&#34;http://drecom-study.doorkeeper.jp/events/11137&#34;&gt;最新インフラエンジニア技術勉強～Fluentd, Elasticsearch,Chefの実践実例～&lt;/a&gt;」に参加してきました。
もちろん、Elasticsearchってキーワードがあったからです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今月2回目の目黒で、初のドリコムさんです。
「&lt;a href=&#34;http://drecom-study.doorkeeper.jp/events/11137&#34;&gt;最新インフラエンジニア技術勉強～Fluentd, Elasticsearch,Chefの実践実例～&lt;/a&gt;」に参加してきました。
もちろん、Elasticsearchってキーワードがあったからです。&lt;/p&gt;
&lt;p&gt;ざっくりメモです。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;ドリコムのinfrastructure-as-codeひらしーさん&#34;&gt;ドリコムのInfrastructure as Code/ひらしーさん&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;CM：jojoss、トレクル、など&lt;/li&gt;
&lt;li&gt;サーバ300台、クラウド○○台。月30〜50台の割合で増加中。&lt;/li&gt;
&lt;li&gt;少人数でいかに回すか。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;chef&#34;&gt;Chef&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Rubyが書ける人が多いから。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;serverspec&#34;&gt;serverspec&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;テストだよと。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;すみません、色々と聞き逃しました。。。&lt;/p&gt;
&lt;h2 id=&#34;winning-the-metrics-battlemickeyさん&#34;&gt;Winning the metrics battle/mickeyさん&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Graphiteとかを触っている。&lt;/li&gt;
&lt;li&gt;1300台超えたら、色々大変だった。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;失敗談&#34;&gt;失敗談&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Cactiを利用して、色々と運用が大変だった。DCが別なのでProxyとか。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;成功例現行システム&#34;&gt;成功例？現行システム？&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;最大値、平均値、最小値などをプロット&lt;/li&gt;
&lt;li&gt;collectdを収集、送信に採用して、独自で開発？&lt;/li&gt;
&lt;li&gt;受信して保存するのに、Graphite（carbon-relay、carbon-cache、DRBD、graphite-web）ってなってる。&lt;/li&gt;
&lt;li&gt;1300台程度のサーバから、5分間隔で、問題ない。&lt;/li&gt;
&lt;li&gt;Graphite良いツールだよ。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Q：過去データはどのくらい？
A：5分間隔で1年分。&lt;/p&gt;
&lt;p&gt;Q：移動平均とかを使ったグラフとか時間かかりませんか？100台だと
A：100台でもほとんど時間はかからない。&lt;/p&gt;
&lt;h2 id=&#34;fluentd-プラグイン開発講座外山-寛さん&#34;&gt;Fluentd プラグイン開発講座/外山 寛さん&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fluentdプラグインを作ることができると威力倍増&lt;/li&gt;
&lt;li&gt;Elasticsearchの勉強会の話までしてくれました！&lt;/li&gt;
&lt;li&gt;勉強会スペース貸出しています。&lt;/li&gt;
&lt;li&gt;未公開だけど、sedueのプラグインもあるらしい。&lt;/li&gt;
&lt;li&gt;CHUNKとBUFFERとか覚えときましょう&lt;/li&gt;
&lt;li&gt;プラグインの作り方的なのがなかった気がしたので、今回の発表です。&lt;/li&gt;
&lt;li&gt;gem作らなくてもディレクトリにおけば使えるよと。&lt;/li&gt;
&lt;li&gt;td-agent使ってる人が大多数だよね。（fluentdを素で使ってる人は会場にはいなかった）&lt;/li&gt;
&lt;li&gt;エンジニア募集中&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Q：エラー処理どうしてますか？
A：今は、スルーしています&lt;/p&gt;
&lt;p&gt;Q：単体テストの書き方は？
A：人によってバラバラみたいですね。&lt;/p&gt;
&lt;h2 id=&#34;mysqlと組み合わせて始める全文検索エンジンelasticsearchyoshi_ken&#34;&gt;MySQLと組み合わせて始める全文検索エンジン「elasticsearch」/yoshi_ken&lt;/h2&gt;
&lt;p&gt;スライド：http://www.slideshare.net/y-ken/introduce-elasticsearch-mysql-importer&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Elasticsearch歴は1年位です。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MySQLを使っていて、モダンな検索がほしいですよね？ね？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;サジェスト、ファセット、位置情報、ネスト検索などなど。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GoogleトレンドだとSolrに迫る勢いと。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;実データを用いて、手軽にElasticsearchと連携。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;BinaryLogではなく、SQLの結果を同意する方式。yamabiko&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;今日は、新しいものを公開します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/y-ken/elasticsearch_mysql_importer&#34;&gt;bulk import file generator as well as nested document from MySQL for elasticsearch bulk api&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://purchases.elasticsearch.com/class/elasticsearch/core-elasticsearch/tokyo/2014-05-20&#34;&gt;東京トレーニング&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Elasticsearch本については、右にあるリンクをクリックしてくれるとうれしいなぁ。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>「よくわかるAmazon #CloudSearch 」に行ってきました！</title>
      <link>https://blog.johtani.info/blog/2014/05/15/amazon-cloud-seaarch-study-session/</link>
      <pubDate>Thu, 15 May 2014 17:50:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/05/15/amazon-cloud-seaarch-study-session/</guid>
      <description>&lt;p&gt;どうやら、中身がSolrベース？Luceneベース？になったらしいということで、
今日は&lt;a href=&#34;http://kokucheese.com/event/index/168838/&#34;&gt;「AWSプロダクトシリーズ｜よくわかるAmazon CloudSearch」&lt;/a&gt;に行ってきました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;※ElasticSearchではありません！&lt;/strong&gt;&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;どうやら、中身がSolrベース？Luceneベース？になったらしいということで、
今日は&lt;a href=&#34;http://kokucheese.com/event/index/168838/&#34;&gt;「AWSプロダクトシリーズ｜よくわかるAmazon CloudSearch」&lt;/a&gt;に行ってきました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;※ElasticSearchではありません！&lt;/strong&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;ということで、いつものメモ。&lt;/p&gt;
&lt;h2 id=&#34;cloudsearch-overview&#34;&gt;CloudSearch Overview&lt;/h2&gt;
&lt;h3 id=&#34;amazon-web-services-inc-pravin-muthukumarproduct-manager--vivek-sriram-business-development&#34;&gt;Amazon Web Services, Inc. Pravin Muthukumar(Product Manager) / Vivek Sriram (Business Development)&lt;/h3&gt;
&lt;h4 id=&#34;introduction-to-search&#34;&gt;Introduction to Search&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;検索の紹介。アイアンマンのDVD？のページにいろんな項目（フィールド）があるよねと。（もちろん、Amazonのページ）&lt;/li&gt;
&lt;li&gt;ファセット、Geo、テキスト処理（Analysis処理）、Postings listとか。などなど&lt;/li&gt;
&lt;li&gt;ランキングも&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;amazon-cloudsearch&#34;&gt;Amazon CloudSearch&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;独自実装orRDB拡張もある。&lt;/li&gt;
&lt;li&gt;OSSもあるよね。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Legacy&lt;/strong&gt; Enterprise SearchとしてFASTとかもある。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;building-with-cloudsearch&#34;&gt;Building with CloudSearch&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;他のサービス同様、コンソールとかあるし、色々できるし、すぐ起動できるよと。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;自動で、データが増えたら、パーティションが増えると。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;日本語の形態素解析があるらしい。何を使ってるのかな？&lt;/li&gt;
&lt;li&gt;ICUのノーマライズとかもやってくれるらしい。これかな？http://lucene.apache.org/core/4_8_0/analyzers-icu/index.html&lt;/li&gt;
&lt;li&gt;ユーザが辞書を指定できるのかな？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;備えてる機能の説明&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ファセット&lt;/li&gt;
&lt;li&gt;SimpleQuery&lt;/li&gt;
&lt;li&gt;Autocomplete&lt;/li&gt;
&lt;li&gt;Highlight&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;などなど&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multi-AZにも対応&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;qa&#34;&gt;QA&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Q：NGramありますか？
&lt;ul&gt;
&lt;li&gt;A：今はないです。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q：ユーザ辞書対応してますか？
&lt;ul&gt;
&lt;li&gt;A：今はないです。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q：lang-detectあるか？
&lt;ul&gt;
&lt;li&gt;A：今はないので、自分で判定して、適切なフィールドに入れてね。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;expectation-for-cloudsearch&#34;&gt;Expectation for CloudSearch&lt;/h2&gt;
&lt;h3 id=&#34;apache-solr-contributor大須賀稔氏&#34;&gt;Apache Solr contributor　大須賀　稔氏&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Solr本の宣伝ありがとうございます！（右のアイコンから買ってもらえると更に嬉しいですｗ）&lt;/li&gt;
&lt;li&gt;Kinesisとかとの組み合わせとか、自然言語処理とか、いろいろとあるAWSのコンポーネントと組み合わせる例が欲しいと。&lt;/li&gt;
&lt;li&gt;すばらしい、最後はManifoldCFがらみに持っていくとは。ACLがらみのクローリングとかあるといいじゃないでしょうかと。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;impression-of-using-cloudsearch&#34;&gt;Impression of using CloudSearch&lt;/h2&gt;
&lt;h3 id=&#34;吉田匠氏yoshi0309httpblogyoslabcom&#34;&gt;吉田　匠氏　(@yoshi0309　http://blog.yoslab.com/)&lt;/h3&gt;
&lt;p&gt;スライド：https://speakerdeck.com/yoshi0309/impression-of-using-cloudsearch&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;お見かけしたことある気がするなぁ。&lt;/li&gt;
&lt;li&gt;全部置き換えできる！わけではなさそう。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;いいところ&#34;&gt;いいところ。&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;UIがいいし、セットアップが簡単&lt;/li&gt;
&lt;li&gt;auto scaleがうれしい&lt;/li&gt;
&lt;li&gt;マルチドメイン、マルチスキーマがいい&lt;/li&gt;
&lt;li&gt;Luceneのdismaxサポートがいい。（edismaxじゃないのかな？）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;dismaxって書いてあるな。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://docs.aws.amazon.com/cloudsearch/latest/developerguide/search-api.html&#34;&gt;http://docs.aws.amazon.com/cloudsearch/latest/developerguide/search-api.html&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;フィードの仕方に気をつけて！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;バッチサイズで課金されるので、1件ずつじゃなくて、複数件送ったほうがいい。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;いきなりスケールアウトできるわけじゃない？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ウォームアップ機能がない。インスタンス上限がデフォルト50件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;VPC対応してほしい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インターネット経由になってしまう&lt;/li&gt;
&lt;li&gt;フィードのスピードが&lt;/li&gt;
&lt;li&gt;セキュリティグループ機能が使えない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;cloudsearch-usecase---snapdish&#34;&gt;CloudSearch UseCase - SnapDish&lt;/h2&gt;
&lt;h3 id=&#34;vuzz-inc清田史和氏&#34;&gt;Vuzz Inc.　清田　史和氏&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;独自辞書をもって、Tokenizeは独自でやって、空白区切りでデータ登録している。&lt;/li&gt;
&lt;li&gt;インデックス更新はSQSを使ってる。&lt;/li&gt;
&lt;li&gt;古いAPIを使ってるらしい。&lt;/li&gt;
&lt;li&gt;移行が結構大変らしい。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;感想&#34;&gt;感想&lt;/h2&gt;
&lt;p&gt;使ったことないんですが、きめ細かい検索したい場合はちょっとテクニックが要るかもと思いました。
AWS初心者なんで、なんとも言えないんですが。。。&lt;/p&gt;
&lt;p&gt;といあえず、テキスト処理（アナライズ処理）で、単語がどうやって区切られるのかってのがわからないのはキツイんじゃなかろうかと。
ただ、簡単に起動できて、オートスケールできるのは素晴らしいと思います。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>外の世界を知るということ</title>
      <link>https://blog.johtani.info/blog/2014/05/14/spiritual-entry1/</link>
      <pubDate>Wed, 14 May 2014 01:44:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/05/14/spiritual-entry1/</guid>
      <description>&lt;p&gt;酔っ払ってなんとなく書きたくなったスピリチュアルなブログなので、流していただければと。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;最近、勉強会やTwitterで知り合いになって話をする人が増えたりで、
その方たちに色々と教えてもらうことが多いなぁと感じてます。
また、知り合いに恵まれてきたなぁとも。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;酔っ払ってなんとなく書きたくなったスピリチュアルなブログなので、流していただければと。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;最近、勉強会やTwitterで知り合いになって話をする人が増えたりで、
その方たちに色々と教えてもらうことが多いなぁと感じてます。
また、知り合いに恵まれてきたなぁとも。&lt;/p&gt;
&lt;p&gt;そもそも私が勉強会に参加し始めたきっかけはSolr勉強会（第1回から参加してて、気づいたら主催者になってた）で、
そのころは、Solr初心者で色々とやってる人、知ってる人がいて無料で話が聞けるのすごいと興奮したのを覚えてます。
（もちろん、ぼっちでしたが）&lt;/p&gt;
&lt;p&gt;Solr勉強会が定期的に開かれて、それに参加しているうちに少しずつ知り合いもできて、
面白そうな勉強会（Hadoopとか）が他にもあるんだ、参加してみようかって思うようになってと。&lt;/p&gt;
&lt;p&gt;そこにプラスで、関口さんと知りあえてSolr本を書く話が出てきて、本を書いてみたら、
今度は勉強会で話してみませんかとなって。&lt;/p&gt;
&lt;p&gt;スピーカーやると、顔を覚えてもらえるようで、また知り合いが増えてと。&lt;/p&gt;
&lt;p&gt;人のつながりって大事だし、自分が発信することで教えてもらえることもあるしと。
前にも書いた気がするけど、Solr勉強会（当時の主催の方）や関口さんやElasticsearch勉強会のスタッフの方や
スピーカーやってくれた方、会場提供を心よくしてくれてるVOYAGE GROUP、リクルートテクノロジーズさん、という具合にどんどん頭が上がらなくなってきてるなぁと。&lt;/p&gt;
&lt;p&gt;ということで、外の世界を知ると色々とつながりが出来て面白いですよという、個人的な感想でした。
ま、自分が思ってるだけで、違う意見もいっぱいあると思うけど。&lt;/p&gt;
&lt;p&gt;あー、なんか、酔って勢いで書いてしまった。。。
脈略のない文章なきがするけど、エイヤで公開しちゃおう。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>アジャイルデータサイエンスが届きました</title>
      <link>https://blog.johtani.info/blog/2014/05/09/reading-agile-data-science/</link>
      <pubDate>Fri, 09 May 2014 00:45:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/05/09/reading-agile-data-science/</guid>
      <description>&lt;p&gt;「アジャイルデータサイエンス」の見本をいただいてしまいました。&lt;/p&gt;
&lt;iframe src=&#34;http://rcm-fe.amazon-adsystem.com/e/cm?t=johtani-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=4873116716&amp;nou=1&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr&#34; style=&#34;width:120px;height:240px;&#34; scrolling=&#34;no&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34; frameborder=&#34;0&#34;&gt;&lt;/iframe&gt;
&lt;p&gt;なので、感想文でも書いてみようかと。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;どんな本&#34;&gt;どんな本？&lt;/h2&gt;
&lt;p&gt;想像以上に薄かったです、物理的に。
なのに、とても幅広い範囲をカバーしています。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;「アジャイルデータサイエンス」の見本をいただいてしまいました。&lt;/p&gt;
&lt;iframe src=&#34;http://rcm-fe.amazon-adsystem.com/e/cm?t=johtani-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=4873116716&amp;nou=1&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr&#34; style=&#34;width:120px;height:240px;&#34; scrolling=&#34;no&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34; frameborder=&#34;0&#34;&gt;&lt;/iframe&gt;
&lt;p&gt;なので、感想文でも書いてみようかと。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;どんな本&#34;&gt;どんな本？&lt;/h2&gt;
&lt;p&gt;想像以上に薄かったです、物理的に。
なのに、とても幅広い範囲をカバーしています。&lt;/p&gt;
&lt;p&gt;データの分析にどんな人が関わっているのか、アジャイルにデータを分析する目的から始まり、
データから何かを見つけるための手順、考え方などをさらっとですが、
システムに取り込む流れから取り込んだあとに改良するという流れまで紹介してくれます。
流れはこんな感じ。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;イベント：ログとかのイベントの発生&lt;/li&gt;
&lt;li&gt;コレクタ：イベントの収集&lt;/li&gt;
&lt;li&gt;バルクストレージ：イベントの一時保存&lt;/li&gt;
&lt;li&gt;バッチ処理：ストレージにあるデータに対して処理&lt;/li&gt;
&lt;li&gt;分散ストア：処理結果をWebアプリなどで表示するために保存&lt;/li&gt;
&lt;li&gt;Webアプリ：処理結果をユーザに提供&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Webアプリでデータを見えるようにして、そこから更にフィードバックを受けることで、データの分析などを進めていくという流れです。&lt;/p&gt;
&lt;p&gt;私はデータサイエンス系の人ではないのでこの流れで作業をされているかはわからないのですが、
検索のシステムについてもこの流れに似ているなと感じました。&lt;/p&gt;
&lt;p&gt;検索システムでも、検索したいデータを収集して、加工（検索したい項目の洗い出しやファセットにする項目の選定とか）して、
インデックスを生成するといった処理が必要になるからです。&lt;/p&gt;
&lt;p&gt;この本では、Python、Hadoop（Pig）、MongoDB、ElasticSearch（バージョンが0.90だから）、d3.jsなどが出てきます。
また、日本語版の付録では、Fluentd、Kibana+Elasticsearchといった組み合わせの紹介もあります。&lt;/p&gt;
&lt;p&gt;コードも書かれていますが、すみません、そこまでちゃんと読んでません。。。&lt;/p&gt;
&lt;p&gt;後半では、データを活用して行くためには順序があるという話が書かれています。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;レコード：レコード1件のアトミックな処理と表示&lt;/li&gt;
&lt;li&gt;グラフ：レコードを元に集計したりグラフ作ったり&lt;/li&gt;
&lt;li&gt;レポート：関係性やトレンドを抽出し、インタラクティブに探求&lt;/li&gt;
&lt;li&gt;予測：構造を利用して、推論やレコメンドとか&lt;/li&gt;
&lt;li&gt;行動：上記の結果を元にユーザに行動を促す&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;前のステップがおろそかだと次のステップがうまくいかないという話です。
後半はこの流れに沿って、先ほどのシステムの流れを変更していく方法が展開されます。&lt;/p&gt;
&lt;h2 id=&#34;注意点&#34;&gt;注意点&lt;/h2&gt;
&lt;p&gt;ちょっとだけ気になる点があったので。&lt;/p&gt;
&lt;p&gt;Elasticsearch周りについては少し注意が必要かと。（Pigとかは詳しくないので不明です。）
紹介されているElasticsearchのバージョンが0.90と少し古いのと、
Hadoopとの統合（Pigで処理したデータをElasticsearchに出力）に利用されているWondordogというツールも最近更新がされていないみたいです。
おそらく、1.0系では動かないのではないかと。&lt;/p&gt;
&lt;p&gt;1.0系の場合は、Elasticsearchが提供している&lt;a href=&#34;http://www.elasticsearch.org/overview/hadoop&#34;&gt;elasticsearch-hadoop&lt;/a&gt;を利用するのが良いと思います。&lt;/p&gt;
&lt;p&gt;付録については1.0系で記載されているので問題ないかと。ただし、Elasticsearchは更新が早いので、公式サイトで最新情報を入手するのが良いと思います。&lt;/p&gt;
&lt;h2 id=&#34;感想&#34;&gt;感想&lt;/h2&gt;
&lt;p&gt;データを解析するシステムってどんなことやってるの？という全体像を
俯瞰するのに良い本なのではないかと思います。
また、データの解析を活かすために、必要な順序と疎かにできない点もあって面白かったです。&lt;/p&gt;
&lt;p&gt;紹介されているツール類については、OSSのトレンドや開発速度が早いので、参考程度にとどめておいて、
自分たちで使いやすいものを探してきて検討するのがいいと思います。&lt;/p&gt;
&lt;p&gt;付録がとても豪華です。FluentdやKibanaがわかりやすく解説されてます。&lt;/p&gt;
&lt;p&gt;あと、薄いのでさらっと読めます。ｗ&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Aggregations - ファセットよりも柔軟な集計</title>
      <link>https://blog.johtani.info/blog/2014/05/07/aggregation-example/</link>
      <pubDate>Wed, 07 May 2014 18:57:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/05/07/aggregation-example/</guid>
      <description>&lt;p&gt;こんなツイートを見つけたので、Aggregationのサンプルでも書こうかなと。（前から書こうと思ってたんですが。。。）&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; lang=&#34;ja&#34;&gt;&lt;p&gt;&lt;a href=&#34;https://twitter.com/elasticsearch&#34;&gt;@elasticsearch&lt;/a&gt; Hi, Would you please tell me the way to do &amp;quot;Pivot Faceting&amp;quot; like Solr-4.0 in elasticsearch-1.1.1 or prior version? Thank you.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;こんなツイートを見つけたので、Aggregationのサンプルでも書こうかなと。（前から書こうと思ってたんですが。。。）&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; lang=&#34;ja&#34;&gt;&lt;p&gt;&lt;a href=&#34;https://twitter.com/elasticsearch&#34;&gt;@elasticsearch&lt;/a&gt; Hi, Would you please tell me the way to do &amp;quot;Pivot Faceting&amp;quot; like Solr-4.0 in elasticsearch-1.1.1 or prior version? Thank you.&lt;/p&gt;&amp;mdash; Y.Kentaro (@yoshi_ken) &lt;a href=&#34;https://twitter.com/yoshi_ken/statuses/462073860062322688&#34;&gt;2014, 5月 2&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;//platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;ちなみに、Aggregationは1.0.0から導入された機能なので、ElasticSearch Server日本語版には掲載されていない機能になります。（ごめんなさい）&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations.html&#34;&gt;公式ガイドのAggregationsのページ&lt;/a&gt;はこちらになりますが、実例があったほうがいいかなと。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://twitter.com/yoshi_ken&#34;&gt;@yoshi_ken&lt;/a&gt; さんから実例のサンプルの指定もいただいたので、ブログを書くのが非常に楽です。ありがとうございます。&lt;/p&gt;
&lt;h2 id=&#34;問題&#34;&gt;問題&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://gist.github.com/y-ken/40d99c3a137247ba8eac&#34;&gt;元ネタ（gist）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;次のような不動産系のデータがあるとします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;id&lt;/li&gt;
&lt;li&gt;物件名&lt;/li&gt;
&lt;li&gt;都道府県（東京、神奈川、&amp;hellip;..）&lt;/li&gt;
&lt;li&gt;物件種別（賃貸、売買、&amp;hellip;..）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この時、都道府県別に、物件種別ごとの件数を取得したいという趣旨です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;東京
&lt;ul&gt;
&lt;li&gt;賃貸: xxx件&lt;/li&gt;
&lt;li&gt;売買: yyy件&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;神奈川
&lt;ul&gt;
&lt;li&gt;賃貸: xxx件&lt;/li&gt;
&lt;li&gt;売買: yyy件 &amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これを、Elasticsearchでどうやって取得するかという問題です。&lt;/p&gt;
&lt;h2 id=&#34;インデックスとデータの登録&#34;&gt;インデックスとデータの登録&lt;/h2&gt;
&lt;p&gt;まずは、インデックスを作ります。
あくまでもサンプルなので、全部not_analyzedにしてますが、そのへんは適宜変更してください。&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-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;create&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;index&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:#960050;background-color:#1e0010&#34;&gt;PUT&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/pref_aggs&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:#f92672&#34;&gt;&amp;#34;settings&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:#f92672&#34;&gt;&amp;#34;number_of_shards&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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:#f92672&#34;&gt;&amp;#34;mappings&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:#f92672&#34;&gt;&amp;#34;japan&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:#f92672&#34;&gt;&amp;#34;_id&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:#f92672&#34;&gt;&amp;#34;path&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;id&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;properties&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:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: {&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;not_analyzed&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:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: {&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;not_analyzed&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:#f92672&#34;&gt;&amp;#34;pref&amp;#34;&lt;/span&gt;: {&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;not_analyzed&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: {&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;not_analyzed&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;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;_id&lt;/code&gt;を使用して、データ登録時に&lt;code&gt;id&lt;/code&gt;フィールドにある文字列をそのままIDとして登録できるように指定してあります。&lt;/p&gt;
&lt;p&gt;登録するデータは次のようなものを適当に100件程度作ってりました。&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-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;id0&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name0&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;pref&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;01_北海道&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;売買&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:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;id1&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name1&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;pref&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;09_栃木県&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;売買&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:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;id2&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name2&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;pref&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;38_愛媛県&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;賃貸&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:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;id3&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name3&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;pref&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;40_福岡県&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;賃貸&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:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;id4&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name4&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;pref&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;35_山口県&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;売買&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:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;id5&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name5&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;pref&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;12_千葉県&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;賃貸&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:#960050;background-color:#1e0010&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;データの登録には、前に紹介した方法「&lt;a href=&#34;http://blog.johtani.info/blog/2014/04/24/usage-stream2es/&#34;&gt;stream2esと複数データの登録&lt;/a&gt;」を用いました。&lt;/p&gt;
&lt;h2 id=&#34;ファセット&#34;&gt;ファセット&lt;/h2&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-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;GET&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/pref_aggs/japan/_search&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:#f92672&#34;&gt;&amp;#34;size&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;&amp;#34;query&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:#f92672&#34;&gt;&amp;#34;match_all&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;facets&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:#f92672&#34;&gt;&amp;#34;type_賃貸&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:#f92672&#34;&gt;&amp;#34;terms&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:#f92672&#34;&gt;&amp;#34;order&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;term&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:#f92672&#34;&gt;&amp;#34;field&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;pref&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:#f92672&#34;&gt;&amp;#34;size&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;50&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;&amp;#34;facet_filter&amp;#34;&lt;/span&gt;: {&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;term&amp;#34;&lt;/span&gt;: {&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;賃貸&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type_売買&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:#f92672&#34;&gt;&amp;#34;terms&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:#f92672&#34;&gt;&amp;#34;order&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;term&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:#f92672&#34;&gt;&amp;#34;field&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;pref&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:#f92672&#34;&gt;&amp;#34;size&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;50&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;&amp;#34;facet_filter&amp;#34;&lt;/span&gt;: {&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;term&amp;#34;&lt;/span&gt;: {&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;売買&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;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;facet_filter&lt;/code&gt;を使用して、&lt;code&gt;type&lt;/code&gt;フィールドによる個別の絞込を行っています。
あとは、&lt;code&gt;pref&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-json&#34; data-lang=&#34;json&#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;&amp;#34;took&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;6&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;&amp;#34;timed_out&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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;&amp;#34;_shards&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:#f92672&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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;&amp;#34;successful&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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;&amp;#34;failed&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#f92672&#34;&gt;&amp;#34;hits&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:#f92672&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;100&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;&amp;#34;max_score&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;&amp;#34;hits&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;facets&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:#f92672&#34;&gt;&amp;#34;type_賃貸&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:#f92672&#34;&gt;&amp;#34;_type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;terms&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:#f92672&#34;&gt;&amp;#34;missing&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;&amp;#34;total&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;52&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;&amp;#34;other&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;&amp;#34;terms&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;term&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;00_北海道&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:#f92672&#34;&gt;&amp;#34;count&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#f92672&#34;&gt;&amp;#34;term&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;01_青森県&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:#f92672&#34;&gt;&amp;#34;count&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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:#f92672&#34;&gt;&amp;#34;term&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;03_宮城県&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:#f92672&#34;&gt;&amp;#34;count&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;3&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:#960050;background-color:#1e0010&#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:#960050;background-color:#1e0010&#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:#e6db74&#34;&gt;&amp;#34;type_売買&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#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;&amp;#34;_type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;terms&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:#f92672&#34;&gt;&amp;#34;missing&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;&amp;#34;total&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;48&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;&amp;#34;other&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;&amp;#34;terms&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;term&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;00_北海道&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:#f92672&#34;&gt;&amp;#34;count&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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:#f92672&#34;&gt;&amp;#34;term&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;02_岩手県&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:#f92672&#34;&gt;&amp;#34;count&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#f92672&#34;&gt;&amp;#34;term&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;04_秋田県&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:#f92672&#34;&gt;&amp;#34;count&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#960050;background-color:#1e0010&#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:#960050;background-color:#1e0010&#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;facet_filter&lt;/code&gt;する回数を少なくするため、
ファセットは都道府県のフィールドを指定したためです。
アプリで頑張って入れ替えてください。。。&lt;/p&gt;
&lt;p&gt;この場合、&amp;rsquo;type&amp;rsquo;の個数がわかっているので、頑張ってこのような記述ができました。
ただ、&lt;code&gt;type&lt;/code&gt;が増えた時にアプリの修正とかが必要になりますよね。&lt;/p&gt;
&lt;h2 id=&#34;aggregations&#34;&gt;Aggregations&lt;/h2&gt;
&lt;p&gt;ということで、Aggregationsの出番です。
ファセットよりも柔軟に、検索結果に対していろいろな集計が行える機能になります。
一見に如かずということで、クエリを紹介します。&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-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;GET&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/pref_aggs/japan/_search&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:#f92672&#34;&gt;&amp;#34;size&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;&amp;#34;query&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:#f92672&#34;&gt;&amp;#34;match_all&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;aggs&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:#f92672&#34;&gt;&amp;#34;pref&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:#f92672&#34;&gt;&amp;#34;terms&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:#f92672&#34;&gt;&amp;#34;order&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:#f92672&#34;&gt;&amp;#34;_term&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;asc&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;field&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;pref&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:#f92672&#34;&gt;&amp;#34;size&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;50&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:#f92672&#34;&gt;&amp;#34;aggs&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:#f92672&#34;&gt;&amp;#34;type&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:#f92672&#34;&gt;&amp;#34;terms&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:#f92672&#34;&gt;&amp;#34;field&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;type&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:#f92672&#34;&gt;&amp;#34;size&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;10&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&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ファセットよりもシンプルですし、&lt;code&gt;賃貸&lt;/code&gt;といったような値を指定していません。
&lt;code&gt;aggs&lt;/code&gt;というのが&lt;code&gt;aggregations&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-json&#34; data-lang=&#34;json&#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;&amp;#34;took&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;4&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;&amp;#34;timed_out&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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;&amp;#34;_shards&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:#f92672&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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;&amp;#34;successful&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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;&amp;#34;failed&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#f92672&#34;&gt;&amp;#34;hits&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:#f92672&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;100&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;&amp;#34;max_score&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;&amp;#34;hits&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;aggregations&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:#f92672&#34;&gt;&amp;#34;pref&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:#f92672&#34;&gt;&amp;#34;buckets&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;key&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;00_北海道&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:#f92672&#34;&gt;&amp;#34;doc_count&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;3&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;&amp;#34;type&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:#f92672&#34;&gt;&amp;#34;buckets&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;key&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;売買&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:#f92672&#34;&gt;&amp;#34;doc_count&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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:#f92672&#34;&gt;&amp;#34;key&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;賃貸&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:#f92672&#34;&gt;&amp;#34;doc_count&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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&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:#f92672&#34;&gt;&amp;#34;key&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;01_青森県&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:#f92672&#34;&gt;&amp;#34;doc_count&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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;&amp;#34;type&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:#f92672&#34;&gt;&amp;#34;buckets&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;key&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;賃貸&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:#f92672&#34;&gt;&amp;#34;doc_count&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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&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:#960050;background-color:#1e0010&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Aggregationsの結果は、望んでいた通りの出力になっています。&lt;/p&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-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;aggs&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#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;&amp;#34;pref&amp;#34;&lt;/span&gt;: { &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#1&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;&amp;#34;terms&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:#f92672&#34;&gt;&amp;#34;order&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:#f92672&#34;&gt;&amp;#34;_term&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;asc&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;field&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;pref&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:#f92672&#34;&gt;&amp;#34;size&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;50&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:#f92672&#34;&gt;&amp;#34;aggs&amp;#34;&lt;/span&gt;: {  &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#2&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;&amp;#34;type&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:#f92672&#34;&gt;&amp;#34;terms&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:#f92672&#34;&gt;&amp;#34;field&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;type&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:#f92672&#34;&gt;&amp;#34;size&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;10&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&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最初の#1の&lt;code&gt;pref&lt;/code&gt;は出力を扱いやすくするためにつけているラベルになります。好きな名前をつけることが可能です。
次の&lt;code&gt;terms&lt;/code&gt;がAggregationのタイプ（どのような集計をして欲しいか）になります。
今回は、&lt;code&gt;pref&lt;/code&gt;フィールドにある単語(term)毎に、集計をしたいので、&lt;code&gt;terms&lt;/code&gt;を指定します。
その他にどんなタイプがあるかは、&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations.html&#34;&gt;公式ガイド&lt;/a&gt;をご覧ください。&lt;/p&gt;
&lt;p&gt;次に、さらに&lt;code&gt;type&lt;/code&gt;フィールドで集計したいので、#2の部分で後続のAggregationを指定しています。
都道府県同様、&lt;code&gt;type&lt;/code&gt;フィールドにある単語毎に集計するために、&lt;code&gt;terms&lt;/code&gt;を指定します。&lt;/p&gt;
&lt;p&gt;これで、先ほどのような結果が出力できます。
ちなみに、さらに&lt;code&gt;type&lt;/code&gt;の中に他の種別で集計したいという場合は、さらに&lt;code&gt;aggs&lt;/code&gt;を追加していけばOKです。&lt;/p&gt;
&lt;p&gt;Aggregationは非常に柔軟な集計を可能にする機能です。ただし、検索結果に対して集計処理を行っているため、
メモリやCPUなどのリソースを消費するので注意が必要です。&lt;/p&gt;
&lt;p&gt;Aggregationの説明については、&lt;a href=&#34;https://www.found.no/foundation/elasticsearch-aggregations/&#34;&gt;こちらのFound.noのブログ（英語）&lt;/a&gt;がわかりやすかったので参考にしてみてください。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;非常に簡単ですが、Aggregationsについて紹介しました。
その他にもAggregationsでできることがあるので、後日別のサンプルを用意して説明しようかと思います。&lt;/p&gt;
&lt;p&gt;100件のデータやここまでの操作については、&lt;a href=&#34;https://gist.github.com/johtani/08dee5fb4da62037ef9e&#34;&gt;gist&lt;/a&gt;にあるので、興味がある方はご覧いただければと。
stream2esの操作以外は、&lt;a href=&#34;http://blog.johtani.info/blog/2014/01/29/simple-introduction-and-first-impression-es-marvel/&#34;&gt;Marvelに付属のsense&lt;/a&gt;を利用しています。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>elasticsearch-kopfの紹介（aliases画面）</title>
      <link>https://blog.johtani.info/blog/2014/05/04/intro-elasticsearch-kopf-alias-percolator/</link>
      <pubDate>Sun, 04 May 2014 01:01:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/05/04/intro-elasticsearch-kopf-alias-percolator/</guid>
      <description>&lt;p&gt;今日はelasticsearch-kopfのAnalysis画面の紹介です。&lt;/p&gt;
&lt;p&gt;（簡単なところから。。。その３）&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;ちょっとあいだが開いてしまいましたが、再開です。
メニューの&lt;code&gt;aliases&lt;/code&gt;を選択すると、次のような画面が表示されます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今日はelasticsearch-kopfのAnalysis画面の紹介です。&lt;/p&gt;
&lt;p&gt;（簡単なところから。。。その３）&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;ちょっとあいだが開いてしまいましたが、再開です。
メニューの&lt;code&gt;aliases&lt;/code&gt;を選択すると、次のような画面が表示されます。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20140504/kopf-aliases.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20140504/kopf-aliases.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
    &lt;figcaption align=&#34;center&#34;&gt;&lt;h4&gt;Aliases画面&lt;/h4&gt;
    &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Elasticsearchの&lt;code&gt;alias&lt;/code&gt;を画面で確認できます。&lt;/p&gt;
&lt;p&gt;エイリアスは、インデックスに別名をつけることができるElasticsearchの機能です。
１エイリアス＝１インデックスでも良いですが、１エイリアスに対して複数のエイリアスを付与することもできます。
この機能を利用することで、次のようなことが可能となります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インデックスの切り替えをアプリ側に意識させずに実施（アプリはエイリアス名に対して検索すればOKなので）&lt;/li&gt;
&lt;li&gt;直近１週間のログを検索するためのエイリアスの作成（複数のインデックスを１つのエイリアスに割り当て可能）&lt;/li&gt;
&lt;li&gt;特定のルーティングによる検索（特定のデータに対する検索だけに絞るためにfilterを指定する）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;エイリアスについて詳しく知りたい方は&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-aliases.html&#34;&gt;公式ガイド&lt;/a&gt;をご覧いただくのが良いかと。&lt;/p&gt;
&lt;p&gt;画面は非常にわかりやすい作りになっているので、特に説明必要ないんですよね。。。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>stream2esと複数データの登録</title>
      <link>https://blog.johtani.info/blog/2014/04/24/usage-stream2es/</link>
      <pubDate>Thu, 24 Apr 2014 21:11:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/04/24/usage-stream2es/</guid>
      <description>&lt;p&gt;kopfの記事の続きも書く必要があるんだけど、こんなツイートを見つけてしまったので。。。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; lang=&#34;ja&#34;&gt;&lt;p&gt;ElasticsearchのBulk APIの仕様、JSONファイルをいい感じに加工して置かなければならないしハマりどころ多い。 &lt;a href=&#34;http://t.co/hmfycqZlqk&#34;&gt;http://t.co/hmfycqZlqk&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;kopfの記事の続きも書く必要があるんだけど、こんなツイートを見つけてしまったので。。。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; lang=&#34;ja&#34;&gt;&lt;p&gt;ElasticsearchのBulk APIの仕様、JSONファイルをいい感じに加工して置かなければならないしハマりどころ多い。 &lt;a href=&#34;http://t.co/hmfycqZlqk&#34;&gt;http://t.co/hmfycqZlqk&lt;/a&gt;&lt;/p&gt;&amp;mdash; Kenta Suzuki (@suzu_v) &lt;a href=&#34;https://twitter.com/suzu_v/statuses/459216999592124416&#34;&gt;2014, 4月 24&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;//platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;前に思いついたけど、放ったらかしにしてた疑問が再浮上してきたので、せっかくだから調べてみようかなと。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;複数JSONデータがある場合にもっと楽にデータを入れる方法ないかなぁと思って、これかな？というのがあったのですが、
そのまま手を動かさずに放置してたので、一念発起してブログ書いてます。&lt;/p&gt;
&lt;h2 id=&#34;bulk-apiって&#34;&gt;Bulk APIって？&lt;/h2&gt;
&lt;p&gt;ElasticsearchはURLにアクセスしてデータを登録できます。
基本的には次のように1件毎の登録になります。&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-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;$&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;curl&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;-XPUT&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;http:&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//localhost:9200/bookshop/books/1 -d
&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:#960050;background-color:#1e0010&#34;&gt;&amp;#39;&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:#f92672&#34;&gt;&amp;#34;book_id&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;&amp;#34;title&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ElasticSearch Server Japanese Edition&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:#f92672&#34;&gt;&amp;#34;price&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;3024&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;&amp;#34;publisher&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;KADOKAWA&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:#960050;background-color:#1e0010&#34;&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これでもいいのですが、大量のデータを登録するときは、Elasticsearch側での効率が悪いです。
そこで、Elasticsearchは大量データを登録するために&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-bulk.html#docs-bulk&#34;&gt;Bulk API&lt;/a&gt;というものを用意しています。&lt;/p&gt;
&lt;p&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-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{ &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;index&amp;#34;&lt;/span&gt; : { &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;_index&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;bookshop&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;books&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;_id&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1&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:#f92672&#34;&gt;&amp;#34;book_id&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ElasticSearch Server Japanese Edition&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;price&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;3024&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;publisher&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;KADOKAWA&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:#f92672&#34;&gt;&amp;#34;index&amp;#34;&lt;/span&gt; : { &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;_index&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;bookshop&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;books&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;_id&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2&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:#f92672&#34;&gt;&amp;#34;book_id&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Introduction of Apache Solr&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;price&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;3888&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;publisher&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gihyo&amp;#34;&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;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;コマンド
データ
コマンド
データ
...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これで効率よくデータが登録できるのですが、このようなJSONデータを別途作って上げる必要が出てきます。
結局、複数のJSONがあるのに、特殊なJSONを生成しないといけないということでプログラム書いて実行することになります。
これだと、Elasticsearchへのアクセスをプログラムで書くのとあまり大差がないかもしれません。&lt;/p&gt;
&lt;h2 id=&#34;stream2es&#34;&gt;stream2es&lt;/h2&gt;
&lt;p&gt;もっとお手軽に複数のJSONを登録できないかな？と目をつけていたのが、&lt;a href=&#34;https://github.com/elasticsearch/stream2es&#34;&gt;stream2es&lt;/a&gt;です。&lt;/p&gt;
&lt;h3 id=&#34;どんなもの&#34;&gt;どんなもの？&lt;/h3&gt;
&lt;p&gt;Clojureで作られた、Elasticsearchにデータを流し込むためのツールです。
Java 7がインストールされていれば、ダウンロードしてくれば動作せることができます。&lt;/p&gt;
&lt;h3 id=&#34;インストール&#34;&gt;インストール&lt;/h3&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ curl -O download.elasticsearch.org/stream2es/stream2es; chmod +x stream2es
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行したディレクトリにコマンドがコピーされます。
あとは、コマンドを実行すればOKです。&lt;/p&gt;
&lt;h3 id=&#34;実行&#34;&gt;実行&lt;/h3&gt;
&lt;p&gt;データは次のような形式で&lt;code&gt;sample.json&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-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{ &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;book_id&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ElasticSearch Server Japanese Edition&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;price&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;3024&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;publisher&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;KADOKAWA&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:#f92672&#34;&gt;&amp;#34;book_id&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Introduction of Apache Solr&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;price&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;3888&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;publisher&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gihyo&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;Bulk API&lt;/code&gt;で利用したJSONよりも、スッキリしていますね。
1行1ドキュメント1JSONです。&lt;/p&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ./stream2es stdin --target http://localhost:9200/bookshop/books &amp;lt; sample.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ファイルをstream2esに流し込んで、stream2esが1行ずつパースして、Elasticsearchに投げ込んでくれます。&lt;/p&gt;
&lt;p&gt;登録されたデータは次のようになります。
IDは自動で付与されています。&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-json&#34; data-lang=&#34;json&#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;&amp;#34;_index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;bookstore&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:#f92672&#34;&gt;&amp;#34;_type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;books&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:#f92672&#34;&gt;&amp;#34;_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;0Hvy4IJCRkKrvGb4Dgam_w&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:#f92672&#34;&gt;&amp;#34;_version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;&amp;#34;found&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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;&amp;#34;_source&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:#f92672&#34;&gt;&amp;#34;book_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;&amp;#34;title&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ElasticSearch Server Japanese Edition&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:#f92672&#34;&gt;&amp;#34;price&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;3024&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;&amp;#34;publisher&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;KADOKAWA&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#f92672&#34;&gt;&amp;#34;_index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;bookstore&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:#f92672&#34;&gt;&amp;#34;_type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;books&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:#f92672&#34;&gt;&amp;#34;_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;b9M6TooFQzGYyJeix_t_WA&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:#f92672&#34;&gt;&amp;#34;_version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;&amp;#34;found&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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;&amp;#34;_source&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:#f92672&#34;&gt;&amp;#34;book_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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;&amp;#34;title&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Introduction of Apache Solr&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:#f92672&#34;&gt;&amp;#34;price&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;3888&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;&amp;#34;publisher&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gihyo&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;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;book_id&lt;/code&gt;があるんだし、&lt;code&gt;_id&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ curl -XDELETE http://localhost:9200/bookshop
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ curl -XPUT http://localhost:9200/bookshop -d &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;
&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:#e6db74&#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:#e6db74&#34;&gt;  &amp;#34;mappings&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:#e6db74&#34;&gt;    &amp;#34;books&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:#e6db74&#34;&gt;      &amp;#34;_id&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:#e6db74&#34;&gt;        &amp;#34;path&amp;#34;: &amp;#34;book_id&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:#e6db74&#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:#e6db74&#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:#e6db74&#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:#e6db74&#34;&gt;}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あとは、登録すれば&lt;code&gt;book_id&lt;/code&gt;が&lt;code&gt;_id&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-json&#34; data-lang=&#34;json&#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;&amp;#34;_index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;bookshop&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:#f92672&#34;&gt;&amp;#34;_type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;books&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:#f92672&#34;&gt;&amp;#34;_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1&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:#f92672&#34;&gt;&amp;#34;_version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;&amp;#34;found&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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;&amp;#34;_source&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:#f92672&#34;&gt;&amp;#34;book_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;&amp;#34;title&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ElasticSearch Server Japanese Edition&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:#f92672&#34;&gt;&amp;#34;price&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;3024&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;&amp;#34;publisher&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;KADOKAWA&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;span style=&#34;color:#960050;background-color:#1e0010&#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:#f92672&#34;&gt;&amp;#34;_index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;bookshop&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:#f92672&#34;&gt;&amp;#34;_type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;books&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:#f92672&#34;&gt;&amp;#34;_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2&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:#f92672&#34;&gt;&amp;#34;_version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;&amp;#34;found&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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;&amp;#34;_source&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:#f92672&#34;&gt;&amp;#34;book_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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;&amp;#34;title&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Introduction of Apache Solr&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:#f92672&#34;&gt;&amp;#34;price&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;3888&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;&amp;#34;publisher&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gihyo&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;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;ディレクトリに複数のJSONファイルが有った場合は、次のようなコマンドでOK&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ cat sample_data/*.json |./stream2es stdin --target http://localhost:9200/bookshop/books
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;まぁ、&lt;code&gt;cat&lt;/code&gt;して流してるだけですが。。。&lt;/p&gt;
&lt;h3 id=&#34;ダメだったケース&#34;&gt;ダメだったケース&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JSONが複数行になっているようなデータだとエラーが出てしまいました。&lt;br&gt;
（&lt;code&gt;jq&lt;/code&gt;コマンドで1行に整形したりできるかなぁ？）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;また、1行に2つのJSONが書いてある場合は、1つ目のJSONをパースしたら、そこでおしまいみたいで、その後に記述されたデータは登録されませんでした。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;インデックスがない場合&#34;&gt;インデックスがない場合&lt;/h3&gt;
&lt;p&gt;stream2esで登録するインデックスがElasticsearchに存在しない場合、stream2esがインデックスを作成してくれるのですが、
この時、シャード数などはstream2es内部に記述があるので注意が必要です。
以下がその設定です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;index.number_of_shards : 2&lt;/li&gt;
&lt;li&gt;index.number_of_replicas : 0&lt;/li&gt;
&lt;li&gt;index.refresh_interval : 5s&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;課題&#34;&gt;課題？&lt;/h2&gt;
&lt;p&gt;内部的にはおそらく、&lt;code&gt;Bulk&lt;/code&gt;でデータを登録していると思うのですが、まだよくわかっていません。
Clojureが読めないので、せっかくだから、Clojureの勉強も兼ねてちょっとソースを読んでみようかなと思います。
それほど量があるわけでもないので。&lt;/p&gt;
&lt;p&gt;あとは、その他にWikipediaのデータやTwitterのデータ登録、
ElasticsearchからデータをScrollで読み出しつつ、別のElasticsearchに流しこむといったこともできそうなので、そちらも試してみようかと。
他にもオプションがいくつかありそうです。&lt;/p&gt;
&lt;p&gt;今回は2件ほどでしたが、大量データを流し込んだ時にどうなるか（stream2esが悲鳴を上げるのか、Elasticsearchで詰まることがあったらどうなるか）なども
気になるので、なんか適当なデータで試してみるのもいいかなぁと。
（ということで、だれか、いろいろ試してみてもらえると楽できるなぁ。）&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第4回Elasticsearch勉強会を開催しました。#elasticsearchjp</title>
      <link>https://blog.johtani.info/blog/2014/04/21/hold-on-4th-elasticsearch-jp/</link>
      <pubDate>Mon, 21 Apr 2014 19:44:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/04/21/hold-on-4th-elasticsearch-jp/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://elasticsearch.doorkeeper.jp/events/8865&#34;&gt;第4回Elsticsearch勉強会&lt;/a&gt;を開催しました。
今回から、遅刻厳禁にしてみました。
それほど困った人もいないと思うので、次回からも遅刻厳禁で。&lt;/p&gt;
&lt;p&gt;ということで、今回も多数の方にお集まりいただきありがとうございました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;http://elasticsearch.doorkeeper.jp/events/8865&#34;&gt;第4回Elsticsearch勉強会&lt;/a&gt;を開催しました。
今回から、遅刻厳禁にしてみました。
それほど困った人もいないと思うので、次回からも遅刻厳禁で。&lt;/p&gt;
&lt;p&gt;ということで、今回も多数の方にお集まりいただきありがとうございました。&lt;/p&gt;
&lt;p&gt;スタッフの皆さん、スピーカーの皆さん、プレゼント用に書籍を用意してくれたKADOKAWAさん、開場提供していただいた&lt;a href=&#34;http://recruit-tech.co.jp&#34;&gt;リクルートテクノロジーズさん&lt;/a&gt;、ありがとうございました！
次回もよろしくお願いします！
参加していただき盛り上げていただいた参加者の皆さんもありがとうございました。&lt;/p&gt;
&lt;p&gt;さて、ブログですが司会業とかやってたので、あんまり書けてないけど。。。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;134番までチケットがはけていたので＋スタッフで140〜150名くらいの参加者だったのではないかと思います。
懇親会まで残っていただいた方々も片付けなどありがとうございました。&lt;/p&gt;
&lt;p&gt;さて、感想とか補足です。&lt;/p&gt;
&lt;h2 id=&#34;アナライズ処理の仕組みとクエリdsl株式会社シーマーク大谷純johtani&#34;&gt;「アナライズ処理の仕組みとクエリDSL」株式会社シーマーク　大谷　純　@johtani&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://blog.johtani.info/images/entries/20140421/Introduction_analysis_and_query_dsl_for_print.pdf&#34;&gt;アナライズ処理の仕組みとクエリDSL&lt;/a&gt;※スライドはPDFです。&lt;/p&gt;
&lt;p&gt;プラグイン：&lt;a href=&#34;https://github.com/johtani/elasticsearch-extended-analyze&#34;&gt;elasticsearch-extended-analyze&lt;/a&gt;&lt;br&gt;
プラグインの紹介記事：&lt;a href=&#34;http://blog.johtani.info/blog/2013/10/25/developing-es-extended-analyze-plugin/&#34;&gt;http://blog.johtani.info/blog/2013/10/25/developing-es-extended-analyze-plugin/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Marvel：&lt;a href=&#34;http://www.elasticsearch.com/marvel/&#34;&gt;http://www.elasticsearch.com/marvel/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;日本語版メーリングリスト：&lt;a href=&#34;https://groups.google.com/forum/#!forum/elasticsearch-jp&#34;&gt;https://groups.google.com/forum/#!forum/elasticsearch-jp&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;なんか、宣伝（本＋プラグイン）ばっかりですみません。
「プラグインの紹介記事」に簡単な使い方が書いてあります。が、情報が古いので、Elasticsearchのバージョンに合わせたバージョンを使ってください。&lt;/p&gt;
&lt;p&gt;まだまだ発表に慣れてないので、頑張ろ。&lt;/p&gt;
&lt;p&gt;アンケート取ってみましたが、ログ検索と全文検索と半々くらいで興味がある人がいるみたいでした。
あと、有料トレーニングは人気ないっすね。。。&lt;/p&gt;
&lt;h2 id=&#34;elasticsearch-hadoopを使ってごにょごにょしてみる-株式会社マーズフラッグ-rd部やまかつ-さんyamakatu&#34;&gt;「elasticsearch-hadoopを使ってごにょごにょしてみる」 株式会社マーズフラッグ R&amp;amp;D部　やまかつ さん　@yamakatu&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/yamakatu/elasticsearchhadoop&#34;&gt;elasticsearch-hadoopを使ってごにょごにょしてみる&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;elasticsearch-hadoop：&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch-hadoop&#34;&gt;https://github.com/elasticsearch/elasticsearch-hadoop&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;QAとして、Elasticsearchにプライマリデータを保存するのは的な話が出てました。
ESにのみデータを入れるのは個人的には考えたことないかなぁ。
どうしても、ElasticsearchのWriteが遅いんじゃないかという懸念事項を持ってる人がいるなぁと。（実際ツラいという話もちらほら）&lt;/p&gt;
&lt;p&gt;お腹痛い中の発表ありがとうございました。。。
次回はMapRの方に紹介してもらえそう（交渉中）なので楽しみです。やまかつさんの続きも聞きたいなぁ。&lt;/p&gt;
&lt;h2 id=&#34;couchbaseとelasticsearchが手を結んだら株式会社アットウェア-佐竹雅央さん-madgaoh-河村康爾さん-ijokarumawak&#34;&gt;「CouchbaseとElasticsearchが手を結んだら」株式会社アットウェア 佐竹雅央さん @madgaoh 河村康爾さん @ijokarumawak&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/masahirosatake/elasticsearch-couchbaseelasticsearch&#34;&gt;CouchbaseとElasticsearchが手を結んだら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;CouchbaseのElasticsearchに関するページ：&lt;a href=&#34;http://docs.couchbase.com/couchbase-elastic-search/&#34;&gt;http://docs.couchbase.com/couchbase-elastic-search/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Couchbaseに入れたら、自動的にElasticsearchにもデータを入れてくれる。
デモがあるの、いいっすね。&lt;/p&gt;
&lt;p&gt;最新版はmasterを落としてきてビルドしないとダメらしい。確かに、上のページには0.90.5って書かれてる。
ここでも、やはり、Elasticsearchが詰まった時にどうするの？みたいな話が出てました。
CouchbaseのXDCRだと、後ろが詰まってる時によしなに？データを流すのを制御してくれるってのがあるみたいですが、
Elasticsearchだと悲鳴を上げているのがわかりにくいと。&lt;/p&gt;
&lt;p&gt;あと、Elasticsearchがインデキシングでキューを取りこぼしているのがログからわかりにくいってのも出てました。
（なにか、分かる方法があるかとかも調べてみようかなぁ。）&lt;/p&gt;
&lt;p&gt;&lt;em&gt;自分の宿題：Transportプラグインって何かについて調べてブログに書くこと。&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;elasticsearch-at-wantedlyタイトルあってるか不安wantedly-inc-内田誠悟さん-spesnova&#34;&gt;「Elasticsearch at Wantedly」（タイトルあってるか不安）　Wantedly, Inc 内田誠悟さん @spesnova&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://speakerdeck.com/spesnova/elasticsearch-at-wantedly-inc&#34;&gt;Elasticsearch at Wantedly&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;参考文献：&lt;a href=&#34;http://code46.hatenablog.com/entry/2014/01/21/115620&#34;&gt;Elasticsearchチュートリアル&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;参考文献：&lt;a href=&#34;https://speakerdeck.com/dadoonet/elasticsearch-workshop&#34;&gt;Elasticsearch Workshop&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;参考文献：&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch-rails&#34;&gt;elasticsearch-rails&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Wantedlyでどうやって使ってるのか。
あと、オートコンプリートでも使ってます。（この話は次回聞けるといいなぁｗ）&lt;/p&gt;
&lt;p&gt;データ数は少ないので、参考にまだならないかも。&lt;/p&gt;
&lt;p&gt;公式のサイト見難いですよねと。
ペンギン先生のブログが素晴らしかった！
マッピングすごいｗ&lt;/p&gt;
&lt;p&gt;最後は、苦労して作ってもらったautocompleteの資料は放ったらかしにして、質疑応答してもらいました。
辞書とか、検索漏れとかの話は今後の課題っぽかったですね。&lt;/p&gt;
&lt;p&gt;「Elasticsearchのみに決めてました！」ってセリフがカッコ良かったｗ&lt;/p&gt;
&lt;p&gt;アクセスコントロール周りのノウハウもブログで共有してくれそうなので楽しみにしています！&lt;/p&gt;
&lt;p&gt;あと、「tireがretire」の話が出てましたが（この発表だっけ？）参考文献にあげてある、elasticsearch-railsが今は本流なんじゃないかなぁ？&lt;/p&gt;
&lt;h2 id=&#34;lt&#34;&gt;LT&lt;/h2&gt;
&lt;p&gt;###「ElasticsearchのScripting」株式会社富士通ソフトウェアテクノロジーズ 滝田聖己さん @pisatoshi&lt;/p&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://speakerdeck.com/pisatoshi/elasticsearchdescripting&#34;&gt;ElasticsearchのScripting&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;参考文献：&lt;a href=&#34;https://github.com/imotov/elasticsearch-native-script-example&#34;&gt;elasticsearch-native-script-example&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;色々とScriptがあるという話を説明してもらい感謝です。
もちろん、ElasticSearchServerにも書いてあるので、そちらも参考にしてください！&lt;/p&gt;
&lt;h3 id=&#34;elasticsearch-向け多言語解析プラグインベイシステクノロジー株式会社-江口天さん&#34;&gt;「Elasticsearch 向け多言語解析プラグイン」ベイシス・テクノロジー株式会社 江口天さん&lt;/h3&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/basistech/4-21-elasticsearch-meetup&#34;&gt;Elasticsearch 向け多言語解析プラグイン&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;参考文献：&lt;a href=&#34;http://www.basistech.jp/elasticsearch/&#34;&gt;Elasticsearchで使えるRosette基本言語解析モジュール&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;参考文献：&lt;a href=&#34;http://blog.johtani.info/blog/2013/09/23/intro-elasticsearch-inquisitor/&#34;&gt;Elasticsearch-inquisitorプラグインの紹介&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ベイシステクノロジさんが提供しているRosetteをElasticsearchで活用できるモジュールみたいです。
いまなら、無料で体験できるみたいなので、どんなものか触ってみると面白いかもしれません。&lt;/p&gt;
&lt;p&gt;あと、デモで使用されていたプラグインについて、私が昔に書いた記事があるので、興味のある方は参考にしていただければと。
このプラグインはクエリがどのように内部でLuceneのクエリになっているか、どのフィールドでどうトークンが生成されるか？
といったものが見ることができるプラグインになっています。&lt;/p&gt;
&lt;h2 id=&#34;関連ブログ&#34;&gt;関連ブログ&lt;/h2&gt;
&lt;p&gt;適当に見つけたブログを列挙してあります。これもあるよ！などあれば、教えてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://blog.yoslab.com/entry/2014/04/21/200601&#34;&gt;勉強会メモ - 第4回elasticsearch勉強会 2014/04/21&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://togetter.com/li/657879&#34;&gt;togetter 第4回elasticsearch勉強会 #elasticsearchjp&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://dev.classmethod.jp/server-side/4th-elasticsearchjp/&#34;&gt;参加レポート:第4回elasticsearch勉強会 #elasticsearchjp&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://qiita.com/maaru/items/0f82600dbc305715b23d&#34;&gt;第4回elasticsearch勉強会に参加しました&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;しつこいくらい宣伝してしまいましたが、「ElasticSearch Server日本語版」よろしくお願いします！&lt;/p&gt;
&lt;iframe src=&#34;http://rcm-fe.amazon-adsystem.com/e/cm?t=johtani-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=4048662023&amp;nou=1&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr&#34; style=&#34;width:120px;height:240px;&#34; scrolling=&#34;no&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34; frameborder=&#34;0&#34;&gt;&lt;/iframe&gt;
&lt;p&gt;今回も楽しい話が聞けました。メモがちょっと少ないんですが。。。&lt;/p&gt;
&lt;p&gt;次回は6末を目処に、MapRの方などと調整して開催しようと思います。
聞きたい話とか、発表したい方とかあれば、連絡くださいー！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>elasticsearch-kopfの紹介（analysis画面）</title>
      <link>https://blog.johtani.info/blog/2014/04/09/intro-elasticsearch-kopf-analysis/</link>
      <pubDate>Wed, 09 Apr 2014 11:41:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/04/09/intro-elasticsearch-kopf-analysis/</guid>
      <description>&lt;p&gt;今日はelasticsearch-kopfのAnalysis画面の紹介です。&lt;/p&gt;
&lt;p&gt;（簡単なところから。。。その２）&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;メニューの&lt;code&gt;analysis&lt;/code&gt;を選択すると、次のような画面が表示されます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今日はelasticsearch-kopfのAnalysis画面の紹介です。&lt;/p&gt;
&lt;p&gt;（簡単なところから。。。その２）&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;メニューの&lt;code&gt;analysis&lt;/code&gt;を選択すると、次のような画面が表示されます。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20140409/kopf-analysis.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20140409/kopf-analysis.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
    &lt;figcaption align=&#34;center&#34;&gt;&lt;h4&gt;Analysis画面&lt;/h4&gt;
    &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Elasticsearchの&lt;code&gt;_analyze&lt;/code&gt; APIを画面で確認できます。
画面で動作の確認ができるのは嬉しいですよね。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;入力文字列：入力となるドキュメントに含まれる文字列や検索キーワードを入力&lt;/li&gt;
&lt;li&gt;フィールドの指定：対象とするインデックス名、タイプ名、フィールド名を選択&lt;/li&gt;
&lt;li&gt;analyze：ボタンを押す&lt;/li&gt;
&lt;li&gt;トークナイズされた結果：入力文字列がどのようなトークンに分割されるか
&lt;ul&gt;
&lt;li&gt;start、end：入力文字列中の文字列の位置&lt;/li&gt;
&lt;li&gt;pos：トークンの位置&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;という形でElasticsearchが指定されたフィールドで入力文字をどのようにトークナイズしたかを確認することができます。&lt;/p&gt;
&lt;p&gt;Elasticsearchは内部でこのトークナイズされた単語を元に転置インデックスを作成し、検索に利用します。
ですので、特定のデータが検索に上手くヒットしないときに、この画面でデータの文字列をトークナイズしてみるといった用途に使えます。&lt;/p&gt;
&lt;p&gt;フィールドの設定がどのようにして入力文字列をトークンにしているかといった点については、今度のElasticsearch勉強会で話す予定です。&lt;/p&gt;
&lt;p&gt;フィールドの設定を利用する以外に、アナライザを指定してどのようにトークナイズされるかを見ることもできます。
「ANALYZE BYANALYZER」をクリックすると利用できます。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20140409/kopf-analysis-analyzer.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20140409/kopf-analysis-analyzer.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
    &lt;figcaption align=&#34;center&#34;&gt;&lt;h4&gt;ANALYZE BY ANALYZER&lt;/h4&gt;
    &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;トークナイズしたい文字列を入力し、インデックス名と、インデックスに設定されているアナライザ名を選択してanalyzeボタンを押すと
結果が表示されます。
（例では、kuromojiアナライザを利用して出力になっています。また、出力結果のposの表示位置がFIELD TYPEの時と違うのが少し気になりました。）&lt;/p&gt;
&lt;p&gt;ただ、残念ながら、インデックスのマッピングで指定したアナライザしか利用できないみたいなので、
どのアナライザがどんな挙動かを調べたい場合は、以前紹介した&lt;a href=&#34;http://blog.johtani.info/blog/2013/09/23/intro-elasticsearch-inquisitor/&#34;&gt;elasticsearch-inquisitor&lt;/a&gt;を
利用したほうが良さそうです。&lt;/p&gt;
&lt;p&gt;ということで、今日はanalysis画面の説明でした。&lt;/p&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>
    
    <item>
      <title>elasticsearch-kopfの紹介（rest画面）</title>
      <link>https://blog.johtani.info/blog/2014/04/07/intro-elasticsearch-kopf-rest/</link>
      <pubDate>Mon, 07 Apr 2014 11:24:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/04/07/intro-elasticsearch-kopf-rest/</guid>
      <description>&lt;p&gt;今日はelasticsearch-kopfのREST画面の紹介です。&lt;/p&gt;
&lt;p&gt;（簡単なところから。。。）&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;メニューの&lt;code&gt;rest&lt;/code&gt;を選択すると、次のような画面が表示されます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今日はelasticsearch-kopfのREST画面の紹介です。&lt;/p&gt;
&lt;p&gt;（簡単なところから。。。）&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;メニューの&lt;code&gt;rest&lt;/code&gt;を選択すると、次のような画面が表示されます。&lt;/p&gt;
&lt;p&gt;Elasticsearch自体が、さまざまな操作をRESTでできる仕組みになっています。
検索にも利用しますが、それ以外の設定などにつてもリクエストを送ればOKです。&lt;/p&gt;
&lt;p&gt;ですので、リクエストや設定を自分で組み立てて送ることができる画面が用意されているととても便利です。
（もちろん、curlコマンドでもいいのですが、画面があると便利ですよね）&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20140407/kopf-rest.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20140407/kopf-rest.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
    &lt;figcaption align=&#34;center&#34;&gt;&lt;h4&gt;REST画面&lt;/h4&gt;
    &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h2 id=&#34;history&#34;&gt;History&lt;/h2&gt;
&lt;p&gt;履歴表示画面です。
これまで、kopfのrest画面を利用して送信したリクエストが一覧で表示されます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;History&lt;/code&gt;という文字をクリックすることで、表示/非表示の切り替えが可能です。（最初は非表示）
マウスオーバーすると、リクエストボディがポップアップで表示されます。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20140407/kopf-history.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20140407/kopf-history.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
    &lt;figcaption align=&#34;center&#34;&gt;&lt;h4&gt;History&lt;/h4&gt;
    &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;履歴にあるURLはクリック可能で、クリックすると実行されます。
履歴は&lt;code&gt;localStorage&lt;/code&gt;に保存されるみたいです。（ブラウザの仕様？あんまり詳しくないので。。。）
たぶん、30件が上限かと（ソースで確認しただけ）&lt;/p&gt;
&lt;h2 id=&#34;url&#34;&gt;URL&lt;/h2&gt;
&lt;p&gt;rest画面でリクエストを送信する先のURLを指定します。
メソッドは右側のSELECTで選択可能です。&lt;/p&gt;
&lt;p&gt;リクエストパラメータも指定が可能です。&lt;/p&gt;
&lt;h2 id=&#34;リクエストボディ&#34;&gt;リクエストボディ&lt;/h2&gt;
&lt;p&gt;検索や設定のJSONを記述するところです。
一応、JSON的にエラーがある場合は行数の左側にバツ印が出てきておかしなところもわかるようになっています。&lt;/p&gt;
&lt;p&gt;インデントなどは行ってくれますが、senseみたいな補完などはないので、少し辛いところです。&lt;/p&gt;
&lt;h2 id=&#34;レスポンス&#34;&gt;レスポンス&lt;/h2&gt;
&lt;p&gt;送信したリクエストに対するレスポンスが返ってきます。
インデントされた状態で表示されるので読みやすいかと。
また、入れ子になっているJSONについては、閉じたり開いたりすることも可能です。
（開始のカッコの右側に&lt;code&gt;-&lt;/code&gt;が表示されていて、クリックすると閉じることができます。閉じると&lt;code&gt;+&lt;/code&gt;に変わります）&lt;/p&gt;
&lt;p&gt;簡単ですが、rest画面の説明でした。
KOPFを使っていて、ちょっとしたクエリを送ったりするのには便利だと思います。&lt;/p&gt;
&lt;p&gt;複雑な検索クエリなどについては、やはりsenseを使うのが良いかと思いますが。。。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>elasticsearch-kopfの紹介（概要）</title>
      <link>https://blog.johtani.info/blog/2014/04/05/intro-elasticsearch-kopf-1/</link>
      <pubDate>Sat, 05 Apr 2014 23:18:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/04/05/intro-elasticsearch-kopf-1/</guid>
      <description>&lt;p&gt;なんだか、ドタバタしてて久しぶりの更新です。
ベルリンの旅行記みたいなのも書きたいのですが、まずはこちらかと。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/lmenezes/elasticsearch-kopf&#34;&gt;elasticsearch-kopf&lt;/a&gt;プラグインの紹介です。&lt;/p&gt;
&lt;p&gt;今回は概要の説明だけになります。機能が結構多いので。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;なんだか、ドタバタしてて久しぶりの更新です。
ベルリンの旅行記みたいなのも書きたいのですが、まずはこちらかと。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/lmenezes/elasticsearch-kopf&#34;&gt;elasticsearch-kopf&lt;/a&gt;プラグインの紹介です。&lt;/p&gt;
&lt;p&gt;今回は概要の説明だけになります。機能が結構多いので。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;elasticsearch-kopfとは&#34;&gt;elasticsearch-kopfとは？&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;_site&lt;/code&gt;プラグインの一つで、クラスタ管理用のプラグインになります。
&lt;code&gt;head&lt;/code&gt;プラグインや&lt;code&gt;HQ&lt;/code&gt;プラグインと同様です。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20140405/kopf.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20140405/kopf.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
    &lt;figcaption align=&#34;center&#34;&gt;&lt;h4&gt;プラグインの画面&lt;/h4&gt;
    &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;このようにシンプルな画面で、スッキリとしています。
緑を基調にした画面構成はElasticsearchの緑色を意識してるんでしょうか？&lt;/p&gt;
&lt;p&gt;上記の画像に簡単なコメントを入れてあります。&lt;/p&gt;
&lt;h3 id=&#34;メニュー&#34;&gt;メニュー&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;KOPF：KOPF自体の設定（接続先とリフレッシュインターバルの変更）&lt;/li&gt;
&lt;li&gt;cluster：クラスタ管理、情報（デフォルト表示画面）&lt;/li&gt;
&lt;li&gt;rest：RESTリクエスト送信、結果表示画面&lt;/li&gt;
&lt;li&gt;aliases：エイリアス管理&lt;/li&gt;
&lt;li&gt;analysis：&lt;code&gt;analysis API&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;percolator：パーコレータ管理&lt;/li&gt;
&lt;li&gt;warmup：ウォームアップクエリ管理&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上記のようなメニューです。各メニューについては、今後のブログで少しずつ紹介しようかと。
このメニューの色が、クラスタの状態も表しています。ステータスがYELLOWなら黄色、REDなら赤色に変わります。&lt;/p&gt;
&lt;h3 id=&#34;インデックス&#34;&gt;インデックス&lt;/h3&gt;
&lt;p&gt;インデックスは列として表示されます。先ほどの画像では、2つのインデックスが表示されている状態です。
インデックス毎に、シャードも表示されます。これは、各ノードがどのシャードを保持しているかという情報です。
色の濃いシャードがプライマリでしょう。
インデックス名やシャードの箱はクリックできるようになっていて、それぞれの情報がJSONで表示されます。
その他にもドキュメント数、サイズなども表示されます。
インデックスの各種操作（closeやdeleteなど）もここからメニューが表示されます。（これも次回詳しく）&lt;/p&gt;
&lt;h3 id=&#34;ノード&#34;&gt;ノード&lt;/h3&gt;
&lt;p&gt;ノードの情報が行として表示されます。ノードが増えると下に追加されていきます。
&lt;code&gt;node1&lt;/code&gt;というのが、ノード名です。（ヒーローの名前とかが出てくるやつです。）&lt;/p&gt;
&lt;p&gt;その他に、IPアドレス、ポート番号、負荷、ヒープサイズなども表示されています。
電源ボタンはノードのシャットダウンを行うためのボタンです。（確認用のダイアログが表示される）&lt;/p&gt;
&lt;h3 id=&#34;その他&#34;&gt;その他&lt;/h3&gt;
&lt;p&gt;その他に、クラスタの概要として、ノード数、インデックス数、シャード数、ドキュメント数なども表示されます。
インデックスの作成などは、アイコンから操作が可能です。
大規模なクラスタを管理している場合、検索ボックスを利用することで、インデックス名やノード名による絞込もできるようになっています。&lt;/p&gt;
&lt;h2 id=&#34;感想&#34;&gt;感想&lt;/h2&gt;
&lt;p&gt;シンプルな構成の画面で、個人的には&lt;code&gt;head&lt;/code&gt;よりも好きな画面です。
&lt;code&gt;HQ&lt;/code&gt;よりもシャードの分散具合がわかりやすいので、今後はこのプラグインを利用していこうと考えています。&lt;/p&gt;
&lt;p&gt;まずは、簡単な紹介です。今後、各画面についてもう少し説明をブログに書いていこうかと考えています。
待てない方は、触ってみてもらうのが良いかと。
もちろん、続きを書いてもらってもいいですよ！！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>ElasticSearch Server日本語版（電子版も）が発売されました</title>
      <link>https://blog.johtani.info/blog/2014/03/25/release-elasticsearch-server-ja-ebook/</link>
      <pubDate>Tue, 25 Mar 2014 13:43:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/03/25/release-elasticsearch-server-ja-ebook/</guid>
      <description>&lt;p&gt;先日、「&lt;a href=&#34;http://blog.johtani.info/blog/2014/03/03/release-elasticsearch-server-japanese-edition/&#34;&gt;ElasticSearch Serverを翻訳しました&lt;/a&gt;」という記事を書きました。&lt;/p&gt;
&lt;p&gt;この中で電子版も出ますよと書いていましたが、電子版も発売されたので、再告知も兼ねてブログを書いています。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;先日、「&lt;a href=&#34;http://blog.johtani.info/blog/2014/03/03/release-elasticsearch-server-japanese-edition/&#34;&gt;ElasticSearch Serverを翻訳しました&lt;/a&gt;」という記事を書きました。&lt;/p&gt;
&lt;p&gt;この中で電子版も出ますよと書いていましたが、電子版も発売されたので、再告知も兼ねてブログを書いています。&lt;/p&gt;
&lt;p&gt;なお、最近よく「ElasticsearchのSは小文字」とツイートしていますが、本書は原著のタイトルが「ElasticSearch Server」となっているため、Sは大文字になっています。原著が出版された時期にはまだSが小文字に統一されていなかったためです。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:300&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20140325/ess.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20140325/ess.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;!-- more --&gt;
&lt;p&gt;紙の書籍はすでに書店に並んでいたり、Amazonでも発送されているようです。&lt;/p&gt;
&lt;p&gt;私自身が電子書籍が場所を取らなくて好きというのもあり、電子版も出版していただけるようにお願いしていました。&lt;/p&gt;
&lt;p&gt;電子版についてはAmazonでKindle版、達人出版会からEPUBとPDFが購入可能です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://tatsu-zine.com/books/elasticsearch-server&#34;&gt;達人出版会のElasitcSearch Serverのページ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.amazon.co.jp/gp/product/B00J4KDYZU/ref=as_li_ss_tl?ie=UTF8&amp;camp=247&amp;creative=7399&amp;creativeASIN=B00J4KDYZU&amp;linkCode=as2&amp;tag=johtani-22&#34;&gt;AmazonのKindle版ページ&lt;/a&gt;&lt;img src=&#34;http://ir-jp.amazon-adsystem.com/e/ir?t=johtani-22&amp;l=as2&amp;o=9&amp;a=B00J4KDYZU&#34; width=&#34;1&#34; height=&#34;1&#34; border=&#34;0&#34; alt=&#34;&#34; style=&#34;border:none !important; margin:0px !important;&#34; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こちらのリンク（Amazonはアフィリンク）を参考にしていただければと。&lt;/p&gt;
&lt;p&gt;書籍の写真入りツイートしたら、原著者の方からレスを頂きました。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; lang=&#34;ja&#34;&gt;&lt;p&gt;&lt;a href=&#34;https://twitter.com/johtani&#34;&gt;@johtani&lt;/a&gt; Thanks for the great work out there :)&lt;/p&gt;&amp;mdash; Rafał Kuć (@kucrafal) &lt;a href=&#34;https://twitter.com/kucrafal/statuses/447668482587779072&#34;&gt;2014, 3月 23&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;//platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;また、原著者のサイトでも紹介してもらいました（結構うれしい）。
私が窓口をやっていた関係で、私の名前しか入っていませんが。。。
編集者と翻訳者の方々のお陰で良い本が出版できたと思っています。&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; lang=&#34;ja&#34;&gt;&lt;p&gt;Thanks for sharing! / ElasticSearch Server book in Japanese | ElasticSearch Server Book Blog &lt;a href=&#34;http://t.co/fhCP1vVBd3&#34;&gt;http://t.co/fhCP1vVBd3&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun Ohtani (@johtani) &lt;a href=&#34;https://twitter.com/johtani/statuses/448098766457815040&#34;&gt;2014, 3月 24&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;//platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;ということで、Elasticsearchの導入の手助けになればと。
感想（賛否問わず）など、あればコメント、ツイート、ブログなど書いていただければうれしいです。
（その際に、連絡してもらえるとさらにうれしいです）&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>GOTO Night elasticsearchに参加しました</title>
      <link>https://blog.johtani.info/blog/2014/03/18/attend-goto-night-elasticsearch/</link>
      <pubDate>Tue, 18 Mar 2014 23:11:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/03/18/attend-goto-night-elasticsearch/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://secure.trifork.com/berlin-2014/freeevent/index.jsp?eventOID=6151&#34;&gt;GOTO Night elasticsearch&lt;/a&gt;に参加しました。
初の海外の勉強会です（海外自体が初だし）。&lt;/p&gt;
&lt;p&gt;ベルリンにあるWoogaという会社で開催された勉強会です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://secure.trifork.com/berlin-2014/freeevent/index.jsp?eventOID=6151&#34;&gt;GOTO Night elasticsearch&lt;/a&gt;に参加しました。
初の海外の勉強会です（海外自体が初だし）。&lt;/p&gt;
&lt;p&gt;ベルリンにあるWoogaという会社で開催された勉強会です。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:300&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20140318/goto_night_elasticsearch.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20140318/goto_night_elasticsearch.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;!-- more  --&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; lang=&#34;ja&#34;&gt;&lt;p&gt;Full house at the &lt;a href=&#34;https://twitter.com/search?q=%23gotonight&amp;amp;src=hash&#34;&gt;#gotonight&lt;/a&gt; about &lt;a href=&#34;https://twitter.com/elasticsearch&#34;&gt;@elasticsearch&lt;/a&gt; in the auditorium of &lt;a href=&#34;https://twitter.com/wooga&#34;&gt;@wooga&lt;/a&gt; &lt;a href=&#34;http://t.co/r2Vx2aMcEn&#34;&gt;pic.twitter.com/r2Vx2aMcEn&lt;/a&gt;&lt;/p&gt;&amp;mdash; GOTO Berlin (@GOTOber) &lt;a href=&#34;https://twitter.com/GOTOber/statuses/445987339924684801&#34;&gt;2014, 3月 18&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;//platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;会場はこんな感じで、とってもおしゃれです。（なんか、写ってますね、最前列にｗ）
ベルリンの古い建物をリノベーションしたオフィスみたいで、そこにこういったひな壇を用意して発表するスペースにしているみたいです。&lt;/p&gt;
&lt;p&gt;内容としては、Elasticsearch1.0の新機能の話として、&lt;code&gt;snapshot/restore&lt;/code&gt;、&lt;code&gt;cat&lt;/code&gt;、&lt;code&gt;aggregation&lt;/code&gt;などの話題でした。簡単にどういったものかの説明です。&lt;/p&gt;
&lt;p&gt;一人目の発表が終わったら、ブレイクタイムとして上のフロアに用意されている軽食＋ドリンクで軽く交流の時間が用意されていました。
ベーグルなどのサンドイッチとハイネケンやクラブマテ？と呼ばれるチープなレッドブルとかが飲めました。&lt;/p&gt;
&lt;p&gt;ちょっと食べて談笑したあとに、次はLogstashとKibanaのお話でした。Logstashってどんなもの？という話がメインで、Kibanaは簡単な紹介という感じでしょうか。最後に、ライブデモがありました。
Kibanaを使ったライブデモはインパクトがあるなというのが感想です。
フィールド名の補完をしてくれたりと便利な機能が操作をしているところでわかるので。&lt;/p&gt;
&lt;p&gt;Youtubeなどでも見てても思っていた感想ですが、こちらの勉強会は質問が結構出てきます。
今日参加した勉強会も質疑応答が結構されてました。&lt;/p&gt;
&lt;p&gt;elasticsearchの方たちと少しだけ話しをできたので、かなり興奮気味でブログを書いています（ミーハー）。&lt;/p&gt;
&lt;p&gt;ただ、やっぱり英語のヒアリングがまだまだだなぁとも実感出来ました。
場数踏むしかないと思うので少しずつ耳にしてなれるしかないかなぁと。
はぁ、ちゃんと高校とか大学の頃に単語を覚えとくんだったと軽く後悔。&lt;/p&gt;
&lt;p&gt;こんなツイートもしてもらって、興奮気味です。明日早起きしないといけないので寝ないといけないのにｗ&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; lang=&#34;ja&#34;&gt;&lt;p&gt;Meeting &lt;a href=&#34;https://twitter.com/johtani&#34;&gt;@johtani&lt;/a&gt; finally in &lt;a href=&#34;https://twitter.com/search?q=%23berlin&amp;amp;src=hash&#34;&gt;#berlin&lt;/a&gt; watching &lt;a href=&#34;https://twitter.com/spinscale&#34;&gt;@spinscale&lt;/a&gt; talking about &lt;a href=&#34;https://twitter.com/search?q=%23elasticsearch&amp;amp;src=hash&#34;&gt;#elasticsearch&lt;/a&gt;&lt;/p&gt;&amp;mdash; Simon Willnauer (@s1m0nw) &lt;a href=&#34;https://twitter.com/s1m0nw/statuses/446001849750269952&#34;&gt;2014, 3月 18&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;//platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Berlinからおはようございます</title>
      <link>https://blog.johtani.info/blog/2014/03/16/post-from-berlin/</link>
      <pubDate>Sun, 16 Mar 2014 05:51:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/03/16/post-from-berlin/</guid>
      <description>&lt;p&gt;Berlinからおはようございます。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:300&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20140316/traffic_sign_in_Berlin.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20140316/traffic_sign_in_Berlin.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;ということで、人生で初めての海外に来ています。&lt;/p&gt;
&lt;!-- more  --&gt;
&lt;p&gt;人生初の海外なのに、一人で乗り換えがあるようなBerlinに来ています。
今年はチャレンジの年になりそう。初めてづくしですが、楽しみたいなと。
会社に感謝です。ESのトレーニングを受けに来たのがメインなのです。
ついでに、Berlinでの&lt;a href=&#34;http://gotocon.com/berlin-2014/freeevent/index.jsp?eventOID=6151&#34;&gt;勉強会&lt;/a&gt;にも参加してみようかなと。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Berlinからおはようございます。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:300&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20140316/traffic_sign_in_Berlin.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20140316/traffic_sign_in_Berlin.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;ということで、人生で初めての海外に来ています。&lt;/p&gt;
&lt;!-- more  --&gt;
&lt;p&gt;人生初の海外なのに、一人で乗り換えがあるようなBerlinに来ています。
今年はチャレンジの年になりそう。初めてづくしですが、楽しみたいなと。
会社に感謝です。ESのトレーニングを受けに来たのがメインなのです。
ついでに、Berlinでの&lt;a href=&#34;http://gotocon.com/berlin-2014/freeevent/index.jsp?eventOID=6151&#34;&gt;勉強会&lt;/a&gt;にも参加してみようかなと。&lt;/p&gt;
&lt;p&gt;幸いにも時差ボケはなさそうなので、色々と見て回ろうと思います。
ただ、日曜日はお店が軒並みしまってそう。。。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>いつも入れているElasticsearchのプラグイン</title>
      <link>https://blog.johtani.info/blog/2014/03/11/es-plugin-installed-to-my-env/</link>
      <pubDate>Tue, 11 Mar 2014 14:23:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/03/11/es-plugin-installed-to-my-env/</guid>
      <description>&lt;blockquote class=&#34;twitter-tweet&#34; lang=&#34;ja&#34;&gt;&lt;p&gt;elasticsearchに、このへん入れるときっと幸せになれるはず・たぶん。&amp;#10;elasticsearch/elasticsearch-analysis-kuromoji/1.6.0&amp;#10;oyrusso/elasticsearch-HQ&amp;#10;mobz/elasticsearch-head&lt;/p&gt;&amp;mdash; toshi_miura (@toshi_miura) &lt;a href=&#34;https://twitter.com/toshi_miura/statuses/441230280041304066&#34;&gt;2014, 3月 5&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;//platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;こんなツイートを見かけたので、普段入れてるプラグインを簡単に紹介してみようかと。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;ローカルの環境に普段入れているプラグインの紹介です。
ちゃんとクラスタを管理しているというよりは、最新版の動作などを確認するための環境になります。なので、ちょっと視点が異なるかもしれませんが参考になればと。&lt;/p&gt;</description>
      <content:encoded>&lt;blockquote class=&#34;twitter-tweet&#34; lang=&#34;ja&#34;&gt;&lt;p&gt;elasticsearchに、このへん入れるときっと幸せになれるはず・たぶん。&amp;#10;elasticsearch/elasticsearch-analysis-kuromoji/1.6.0&amp;#10;oyrusso/elasticsearch-HQ&amp;#10;mobz/elasticsearch-head&lt;/p&gt;&amp;mdash; toshi_miura (@toshi_miura) &lt;a href=&#34;https://twitter.com/toshi_miura/statuses/441230280041304066&#34;&gt;2014, 3月 5&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;//platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;こんなツイートを見かけたので、普段入れてるプラグインを簡単に紹介してみようかと。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;ローカルの環境に普段入れているプラグインの紹介です。
ちゃんとクラスタを管理しているというよりは、最新版の動作などを確認するための環境になります。なので、ちょっと視点が異なるかもしれませんが参考になればと。&lt;/p&gt;
&lt;h2 id=&#34;elasticsearch-analysis-kuromoji&#34;&gt;elasticsearch-analysis-kuromoji&lt;/h2&gt;
&lt;p&gt;URL : &lt;a href=&#34;https://github.com/elasticsearch/elasticsearch-analysis-kuromoji&#34;&gt;elasticsearch-analysis-kuromoji&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Kuromojiという日本語形態素解析のTokenizerなどを使えるようにするためのプラグインです。
今度、発売される&lt;a href=&#34;http://www.amazon.co.jp/dp/4048662023?tag=johtani-22&amp;amp;camp=243&amp;amp;creative=1615&amp;amp;linkCode=as1&amp;amp;creativeASIN=4048662023&amp;amp;adid=072DC31D3GTPZCBQ6TYW&amp;amp;&amp;amp;ref-refURL=http%3A%2F%2Fblog.johtani.info%2Fblog%2F2014%2F03%2F03%2Frelease-elasticsearch-server-japanese-edition%2F&#34;&gt;「ElasticSearch Server」日本語版&lt;/a&gt;には付録として、利用方法を執筆しました。参考にしていただければと。
READMEにもサンプルは掲載されてるので、こちらを参考にするのもありですが。&lt;/p&gt;
&lt;h2 id=&#34;elasticsearch-extended-analyze&#34;&gt;elasticsearch-extended-analyze&lt;/h2&gt;
&lt;p&gt;URL : &lt;a href=&#34;https://github.com/johtani/elasticsearch-extended-analyze&#34;&gt;elasticsearch-extended-analyze&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;私が開発しているプラグインです。
Elasticsearchには&lt;code&gt;analyze&lt;/code&gt;というAPIが用意されています。
文章を渡すと指定した&lt;code&gt;analyzer&lt;/code&gt;などでどのような単語に区切られるかがわかるAPIです。&lt;/p&gt;
&lt;p&gt;ただ、&lt;code&gt;analyzer&lt;/code&gt;の内部では&lt;code&gt;char filter&lt;/code&gt;、&lt;code&gt;tokenizer&lt;/code&gt;、&lt;code&gt;token filter&lt;/code&gt;という個別のパーツがそれぞれ入力された文字列に対して処理を実施します。
この過程が&lt;code&gt;analyze&lt;/code&gt; APIではわかりません。
それをわかるようにしてみたのが&lt;code&gt;elasticsearch-extended-analyze&lt;/code&gt;プラグインになります。&lt;/p&gt;
&lt;p&gt;詳細については&lt;a href=&#34;http://blog.johtani.info/blog/2013/10/25/developing-es-extended-analyze-plugin/&#34;&gt;過去の記事&lt;/a&gt;を見ていただければと。
画面があると便利だよなぁと思いつつ、作ってない。。。&lt;/p&gt;
&lt;h2 id=&#34;polyfractalelasticsearch-inquisitor&#34;&gt;polyfractal/elasticsearch-inquisitor&lt;/h2&gt;
&lt;p&gt;URL : &lt;a href=&#34;https://github.com/polyfractal/elasticsearch-inquisitor&#34;&gt;elasticsearch-inquisitor&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;クエリのデバッグとかに便利なプラグイン。&lt;/p&gt;
&lt;p&gt;こちらも詳細は&lt;a href=&#34;http://blog.johtani.info/blog/2013/09/23/intro-elasticsearch-inquisitor/&#34;&gt;過去の記事&lt;/a&gt;を見ていただければと。&lt;/p&gt;
&lt;h2 id=&#34;mobzelasticsearch-head&#34;&gt;mobz/elasticsearch-head&lt;/h2&gt;
&lt;p&gt;URL : &lt;a href=&#34;http://mobz.github.io/elasticsearch-head/&#34;&gt;elasticsearch-head&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;クラスタ管理に便利なプラグインです。クラスタに存在するノードに対してインデックスのデータ（シャード）がどこに配置されているかなどが一目瞭然になる便利なプラグインです。
プライマリシャードやレプリカなどもわかります。
インデックスの削除もできるし、クエリを投げることもできるし、全部入りな感じのプラグインです。&lt;/p&gt;
&lt;p&gt;私個人は、シャードの配置を見るのに主に利用しています。クエリを投げたりインデックスを消したりするのには殆ど使っていません。&lt;/p&gt;
&lt;h2 id=&#34;royrussoelasticsearch-hq&#34;&gt;royrusso/elasticsearch-HQ&lt;/h2&gt;
&lt;p&gt;URL : &lt;a href=&#34;https://github.com/royrusso/elasticsearch-HQ&#34;&gt;elasticsearch-HQ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;これも管理系のプラグインです。こっちのほうが個人的にスッキリしていて好きなプラグインです。
インデックスの管理やノードの停止などはこちらを主に使用しています。
あくまでもローカルの簡易クラスタを管理する目的というのもあります。&lt;/p&gt;
&lt;h2 id=&#34;polyfractalelasticsearch-segmentspy&#34;&gt;polyfractal/elasticsearch-segmentspy&lt;/h2&gt;
&lt;p&gt;URL : &lt;a href=&#34;https://github.com/polyfractal/elasticsearch-segmentspy&#34;&gt;elasticsearch-segmentspy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;こちらはモニタリングでしょうか。
ElasticSearch Serverで紹介されていたのが主な理由で、入れてますがあんまり見てないかも。
インデックスのSegment単位の情報が見ることが可能です。
あと、ちょっと更新されてない感じがしますね。&lt;/p&gt;
&lt;h2 id=&#34;elasticsearchmarvel&#34;&gt;elasticsearch/marvel&lt;/h2&gt;
&lt;p&gt;Elasticsearch社から提供されている、モニタリングなどに使えるプラグインです。
開発環境では無償提供という感じです。
渡しの場合、モニタリング目的ではなく、senseと呼ばれるクエリの補完をしてくれるツールの目的のために使用しています。
モニタリング部分を停止する方法とかないかなぁ。&lt;/p&gt;
&lt;p&gt;詳細については&lt;a href=&#34;http://blog.johtani.info/blog/2014/01/29/simple-introduction-and-first-impression-es-marvel/&#34;&gt;過去の記事&lt;/a&gt;を参考にしていただければと。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ？&lt;/h2&gt;
&lt;p&gt;ということで、簡単にローカルに入っているプラグインの紹介でした。
他にもいっぱいあるので、おすすめがあれば、教えてもらえると助かります。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>ElasticSearch Serverを翻訳しました</title>
      <link>https://blog.johtani.info/blog/2014/03/03/release-elasticsearch-server-japanese-edition/</link>
      <pubDate>Mon, 03 Mar 2014 17:55:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/03/03/release-elasticsearch-server-japanese-edition/</guid>
      <description>&lt;p&gt;第3回Elasticsearch勉強会で、軽く触れていましたが、&lt;a href=&#34;http://www.amazon.co.jp/dp/4048662023?tag=johtani-22&amp;amp;camp=243&amp;amp;creative=1615&amp;amp;linkCode=as1&amp;amp;creativeASIN=4048662023&amp;amp;adid=1X58V7098G3T1N2ZTW61&amp;amp;&amp;amp;ref-refURL=http%3A%2F%2Fblog.johtani.info%2F&#34;&gt;ElasticSearch Server日本語版&lt;/a&gt;が発売されます。
ツイートなどもちらほらとして頂いているみたいで嬉しい限りです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;第3回Elasticsearch勉強会で、軽く触れていましたが、&lt;a href=&#34;http://www.amazon.co.jp/dp/4048662023?tag=johtani-22&amp;amp;camp=243&amp;amp;creative=1615&amp;amp;linkCode=as1&amp;amp;creativeASIN=4048662023&amp;amp;adid=1X58V7098G3T1N2ZTW61&amp;amp;&amp;amp;ref-refURL=http%3A%2F%2Fblog.johtani.info%2F&#34;&gt;ElasticSearch Server日本語版&lt;/a&gt;が発売されます。
ツイートなどもちらほらとして頂いているみたいで嬉しい限りです。&lt;/p&gt;
&lt;p&gt;本書は、私自身、初の翻訳本となります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;なお、ElasticSearchはAWSのサービスではなく、全文検索・解析サーバのOSSです&lt;/strong&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;内容概要&#34;&gt;内容、概要&lt;/h2&gt;
&lt;p&gt;PacktPublishingから発売されている&lt;a href=&#34;http://www.packtpub.com/elasticsearch-server-for-fast-scalable-flexible-search-solution/book&#34;&gt;ElasticSearch Server&lt;/a&gt;の日本語版となります。
以下の点が、原著とは異なる点になっています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;0.90.xに対応（原著は0.20）&lt;/li&gt;
&lt;li&gt;Kibana、Kuromojiに関して追記&lt;/li&gt;
&lt;li&gt;もちろん日本語&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;残念ながら、つい最近、Elasticsearchについては1.0がリリースされました。
1.0で追加された機能（SnapshotやRestore、Aggregatorなど）については触れていませんが、Elasticsearchの機能を網羅的にカバーした良書となっています。
どんな機能があるのか、どんなプラグインがあるのか、どういったことに使えるのかなど、幅広くまとめられた本になっていますので、
Elasticsearchに興味がある方はぜひ読んでいただければと思います。&lt;/p&gt;
&lt;p&gt;また、現段階では予定ですが電子版の出版も予定されています。電子版が気になる方は、少しお待ちいただければと。&lt;/p&gt;
&lt;h4 id=&#34;elasticsearchelasticsearch&#34;&gt;ElasticSearch？Elasticsearch？&lt;/h4&gt;
&lt;p&gt;1.0.0がリリースされた現在は、Elasticsearch（SearchのSは小文字）が正式な名称となっています。
ただ、原著が発売された当初（2013年2月時点）では、まだSは小文字と大文字が混在した状況でした（コミットログなどを見るとわかります。）
このため、日本語版でもElasticSearchという表記に統一してあります。&lt;/p&gt;
&lt;h2 id=&#34;翻訳に関して&#34;&gt;翻訳に関して&lt;/h2&gt;
&lt;p&gt;初の翻訳書ということもあり、大変でした。英語に精通しているわけではないので（むしろ苦手）。。。
他の翻訳者の方々には大変助けていただきましたし、勉強になりました。
また、監修社である&lt;a href=&#34;http://recruit-tech.co.jp&#34;&gt;リクルートテクノロジーズ&lt;/a&gt;にも色々とサポートしていただき、感謝の限りです。
（Elasticsearch勉強会の開場提供にも協力して頂いています。）&lt;/p&gt;
&lt;p&gt;わかりにくい日本語となっている部分などありましたら、ご指摘いただければ今後の参考にさせていただきます。
英語やElasticsearchについて、学ぶという目的もあって、本書の翻訳を買って出たのが本音です。&lt;/p&gt;
&lt;h3 id=&#34;翻訳作業について&#34;&gt;翻訳作業について&lt;/h3&gt;
&lt;p&gt;Githubのリポジトリを編集の方に用意してもらい、翻訳原稿を管理、校正していきました。
Github自体をあまり触っていなかったので、作業をしながらGithubも覚えられ一石二鳥でした。
Issueやプルリクエストによる校正、チェックも便利ですね。
他の原稿を書くようなことがあれば、またこの経験を活かしていきたいなと。
（翻訳の進め方や原稿のチェックなどについてはまた後日何か書こうかと。）&lt;/p&gt;
&lt;h3 id=&#34;原著について&#34;&gt;原著について&lt;/h3&gt;
&lt;p&gt;原著のサイトが用意されています。
&lt;a href=&#34;http://elasticsearchserverbook.com/elasticsearch-server-errata/&#34;&gt;http://elasticsearchserverbook.com/elasticsearch-server-errata/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;原著を翻訳するにあたって見つけた、誤植などを報告し、掲載して頂いています。
原著をお持ちの場合はこちらも参考にしていただければと思います。&lt;/p&gt;
&lt;h3 id=&#34;ご購入はこちらから&#34;&gt;ご購入はこちらから&lt;/h3&gt;
&lt;p&gt;ということで、簡単ですが書籍の紹介（というより宣伝！？）でした。
Elasticsearchに関する何かしらの助けになる書籍であれば嬉しい限りです。&lt;/p&gt;
&lt;p&gt;「ElasticSearch Server日本語版」をよろしくお願いします。
（もちろん、購入は下のリンクからですよね！）&lt;/p&gt;
&lt;iframe src=&#34;http://rcm-fe.amazon-adsystem.com/e/cm?t=johtani-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=4048662023&amp;nou=1&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr&#34; style=&#34;width:120px;height:240px;&#34; scrolling=&#34;no&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34; frameborder=&#34;0&#34;&gt;&lt;/iframe&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Nested Objectのフィールドの奇妙な動作</title>
      <link>https://blog.johtani.info/blog/2014/02/24/strange-behavior-of-field-in-nested-obj/</link>
      <pubDate>Mon, 24 Feb 2014 17:52:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/02/24/strange-behavior-of-field-in-nested-obj/</guid>
      <description>&lt;p&gt;今年初の「突撃！隣のElasticsearch」ということで、Wantedlyさんにおじゃましました。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:300&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20140224/wantedly.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20140224/wantedly.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;※写真を自分でも撮ったのですが、画像が壊れてたので、一緒に行ったペンギン先生の写真を拝借しました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今年初の「突撃！隣のElasticsearch」ということで、Wantedlyさんにおじゃましました。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:300&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20140224/wantedly.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20140224/wantedly.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;※写真を自分でも撮ったのですが、画像が壊れてたので、一緒に行ったペンギン先生の写真を拝借しました。&lt;/p&gt;
&lt;p&gt;第3回のElasticsearch勉強会を開催中にES使ってるってツイートを見つけたので、アタックかけて遊びに行きました。
交渉に快諾いただきありがとうございました！&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;WantedlyさんがどのようにElasticsearchを使用されているかは&lt;strike&gt;&lt;strong&gt;きっと、ブログを書いてくれる&lt;/strong&gt;と思うので期待しておくとして、&lt;/strike&gt;書いてくれました！！ &lt;a href=&#34;http://engineer.wantedly.com/2014/02/25/elasticsearch-at-wantedly-1.html&#34;&gt;「実践！Elasticsearch」&lt;/a&gt;
そこで、&lt;code&gt;nested&lt;/code&gt;でハイライトがなんかうまくいかないって話があったので、ちょっと調べてみました。
&lt;em&gt;（※まだ、調査中です）&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;前提条件&#34;&gt;前提条件&lt;/h2&gt;
&lt;p&gt;再現する手順はgistにあります。（Senseに貼り付ければ動作します。ただし、elasticsearch-analysis-kuromojiが必要です。）https://gist.github.com/johtani/9184287&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;なお、このマッピングやデータはWantedlyさんとは全く関係ありません。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;nested&lt;/code&gt;フィールド内部のデータに対して、検索しハイライトしようとするとうまく動作しないという状況です。
マッピングは以下のとおり。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  &amp;#34;books&amp;#34; : {
    &amp;#34;properties&amp;#34;: {
      &amp;#34;book&amp;#34; : {
        &amp;#34;type&amp;#34;: &amp;#34;nested&amp;#34;,
        &amp;#34;properties&amp;#34;: {
          &amp;#34;title&amp;#34; : { &amp;#34;type&amp;#34;: &amp;#34;string&amp;#34;, &amp;#34;analyzer&amp;#34;: &amp;#34;kuromoji&amp;#34;, &amp;#34;store&amp;#34;: &amp;#34;no&amp;#34;},
          &amp;#34;contents&amp;#34; : {&amp;#34;type&amp;#34;: &amp;#34;string&amp;#34;, &amp;#34;analyzer&amp;#34;: &amp;#34;kuromoji&amp;#34;, &amp;#34;store&amp;#34;: &amp;#34;yes&amp;#34;}
        }
      }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;このマッピングの特徴は以下のとおり。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;_source&lt;/code&gt;は保存される（デフォルト値）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;book&lt;/code&gt;が&lt;code&gt;nested&lt;/code&gt;なオブジェクト&lt;/li&gt;
&lt;li&gt;&lt;code&gt;title&lt;/code&gt;は&lt;code&gt;store : no&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;contents&lt;/code&gt;は&lt;code&gt;store : yes&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;動作の挙動をわかりやすくするため、&lt;code&gt;title&lt;/code&gt;と&lt;code&gt;contents&lt;/code&gt;の&lt;code&gt;store&lt;/code&gt;属性に違いを持たせてあります。&lt;/p&gt;
&lt;h2 id=&#34;問題点&#34;&gt;問題点&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;nested&lt;/code&gt;クエリを使って、検索した時にハイライトが返ってきません。
次のクエリを実行するとわかります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
GET /bookstore/books/_search
{
  &amp;#34;_source&amp;#34; : [&amp;#34;book.title&amp;#34;,&amp;#34;book.contents&amp;#34;],
  &amp;#34;fields&amp;#34;: [
    &amp;#34;book.title&amp;#34;,
    &amp;#34;book.contents&amp;#34;
  ], 
  &amp;#34;query&amp;#34;: {
    &amp;#34;nested&amp;#34;: {
      &amp;#34;path&amp;#34;: &amp;#34;book&amp;#34;,
      &amp;#34;query&amp;#34;: {
        &amp;#34;query_string&amp;#34; : {
          &amp;#34;query&amp;#34; : &amp;#34;Solr&amp;#34;,
          &amp;#34;fields&amp;#34; : [&amp;#34;book.title&amp;#34;, &amp;#34;book.contents&amp;#34;]
        }
      }
    }
  },
  &amp;#34;highlight&amp;#34;: {
    &amp;#34;pre_tags&amp;#34;: [&amp;#34;&amp;lt;b&amp;gt;&amp;#34;], 
    &amp;#34;post_tags&amp;#34;: [&amp;#34;&amp;lt;/b&amp;gt;&amp;#34;],
    &amp;#34;fields&amp;#34;: {
      &amp;#34;*&amp;#34;: {}
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;結果はこちら。
ハイライトがありません。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{
   &amp;#34;took&amp;#34;: 3,
   &amp;#34;timed_out&amp;#34;: false,
   &amp;#34;_shards&amp;#34;: {
      &amp;#34;total&amp;#34;: 5,
      &amp;#34;successful&amp;#34;: 5,
      &amp;#34;failed&amp;#34;: 0
   },
   &amp;#34;hits&amp;#34;: {
      &amp;#34;total&amp;#34;: 1,
      &amp;#34;max_score&amp;#34;: 0.5,
      &amp;#34;hits&amp;#34;: [
         {
            &amp;#34;_index&amp;#34;: &amp;#34;bookstore&amp;#34;,
            &amp;#34;_type&amp;#34;: &amp;#34;books&amp;#34;,
            &amp;#34;_id&amp;#34;: &amp;#34;1&amp;#34;,
            &amp;#34;_score&amp;#34;: 0.5,
            &amp;#34;_source&amp;#34;: {
               &amp;#34;book&amp;#34;: {
                  &amp;#34;title&amp;#34;: &amp;#34;Apache Solr入門&amp;#34;,
                  &amp;#34;contents&amp;#34;: &amp;#34;Apache Solrについて日本語で書かれた唯一の書籍です。SolrはLuceneをコアにした検索サーバです。&amp;#34;
               }
            }
         }
      ]
   }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;次に、ハイライトが帰ってくるパターン。
&lt;code&gt;nested&lt;/code&gt;クエリではなく、&lt;code&gt;_all&lt;/code&gt;を対象としたクエリを投げます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{
  &amp;#34;_source&amp;#34; : [&amp;#34;book.title&amp;#34;,&amp;#34;book.contents&amp;#34;],
  &amp;#34;fields&amp;#34;: [
    &amp;#34;book.title&amp;#34;,
    &amp;#34;book.contents&amp;#34;
  ], 
  &amp;#34;query&amp;#34;: {
    &amp;#34;query_string&amp;#34; : {
      &amp;#34;query&amp;#34; : &amp;#34;Solr&amp;#34;,
      &amp;#34;fields&amp;#34;: [
        &amp;#34;_all&amp;#34;
      ]
    }
  },
  &amp;#34;highlight&amp;#34;: {
    &amp;#34;pre_tags&amp;#34;: [&amp;#34;&amp;lt;b&amp;gt;&amp;#34;], 
    &amp;#34;post_tags&amp;#34;: [&amp;#34;&amp;lt;/b&amp;gt;&amp;#34;], 
    &amp;#34;fields&amp;#34;: {
      &amp;#34;book.title&amp;#34; : {},
      &amp;#34;book.contents&amp;#34;: {}
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;この場合の結果は次の通り。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{
   &amp;#34;took&amp;#34;: 2,
   &amp;#34;timed_out&amp;#34;: false,
   &amp;#34;_shards&amp;#34;: {
      &amp;#34;total&amp;#34;: 5,
      &amp;#34;successful&amp;#34;: 5,
      &amp;#34;failed&amp;#34;: 0
   },
   &amp;#34;hits&amp;#34;: {
      &amp;#34;total&amp;#34;: 1,
      &amp;#34;max_score&amp;#34;: 0.27063292,
      &amp;#34;hits&amp;#34;: [
         {
            &amp;#34;_index&amp;#34;: &amp;#34;bookstore&amp;#34;,
            &amp;#34;_type&amp;#34;: &amp;#34;books&amp;#34;,
            &amp;#34;_id&amp;#34;: &amp;#34;1&amp;#34;,
            &amp;#34;_score&amp;#34;: 0.27063292,
            &amp;#34;_source&amp;#34;: {
               &amp;#34;book&amp;#34;: {
                  &amp;#34;title&amp;#34;: &amp;#34;Apache Solr入門&amp;#34;,
                  &amp;#34;contents&amp;#34;: &amp;#34;Apache Solrについて日本語で書かれた唯一の書籍です。SolrはLuceneをコアにした検索サーバです。&amp;#34;
               }
            },
            &amp;#34;highlight&amp;#34;: {
               &amp;#34;book.title&amp;#34;: [
                  &amp;#34;Apache &amp;lt;b&amp;gt;Solr&amp;lt;/b&amp;gt;入門&amp;#34;
               ]
            }
         }
      ]
   }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ハイライトが返ってきています。&lt;/p&gt;
&lt;h2 id=&#34;考察原因は未特定&#34;&gt;考察（原因は未特定）&lt;/h2&gt;
&lt;p&gt;残念ながら、まだ調査してません。
まずは、現象が理解できたというだけです。
問題点が実は２つありそうです。&lt;/p&gt;
&lt;h3 id=&#34;問題点１nestedクエリの場合にハイライトされない&#34;&gt;問題点１：&lt;code&gt;nested&lt;/code&gt;クエリの場合に、ハイライトされない。&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;nested&lt;/code&gt;クエリではハイライトが動作していないようです。
想像ですが、検索に利用されたクエリで指定されているフィールドをハイライタ（ハイライトを実行するモジュール）が認識できてないのではないかと。
なぜ認識できていないのかという点を調査する必要がありそうです。&lt;/p&gt;
&lt;h4 id=&#34;考察試してみたパターン&#34;&gt;考察（試してみたパターン）&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;nested&lt;/code&gt;ではないクエリで、ハイライトが動作しているのですが、&lt;code&gt;      &amp;quot;book.title&amp;quot; : {&amp;quot;require_field_match&amp;quot; : true},&lt;/code&gt;にした場合は、ハイライトが返ってこないです。
このオプションは、検索対象のフィールドでマッチした文字列だけがハイライトされるオプションになります。
したがって、&lt;code&gt;book.title&lt;/code&gt;フィールドに対する検索で&lt;code&gt;Solr&lt;/code&gt;という文字を検索していないことになります。
&lt;code&gt;_all&lt;/code&gt;に対するクエリであるためです。
このため、例えば、&lt;code&gt;title&lt;/code&gt;だけを検索対象にしたのに、&lt;code&gt;contents&lt;/code&gt;に&lt;code&gt;Solr&lt;/code&gt;という文字が入っていてもハイライトされてしまうという状況が発生します。&lt;/p&gt;
&lt;h3 id=&#34;問題点２-store--yesのデータがハイライトできない&#34;&gt;問題点２ &lt;code&gt;store : yes&lt;/code&gt;のデータがハイライトできない。&lt;/h3&gt;
&lt;p&gt;GithubにIssueをあげました。https://github.com/elasticsearch/elasticsearch/issues/5245 （2014/02/25追記）&lt;/p&gt;
&lt;p&gt;&lt;code&gt;nested&lt;/code&gt;オブジェクトにあるデータのうち、&lt;code&gt;store : no&lt;/code&gt;のものだけがハイライト結果として返ってきました。&lt;/p&gt;
&lt;h4 id=&#34;考察&#34;&gt;考察&lt;/h4&gt;
&lt;p&gt;なぜ、&lt;code&gt;store : yes&lt;/code&gt;のデータがハイライトされないかを調べるために、&lt;code&gt;fields&lt;/code&gt;パラメータをリクエストに追加してみました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{
  &amp;#34;_source&amp;#34; : [&amp;#34;book.title&amp;#34;,&amp;#34;book.contents&amp;#34;],
  &amp;#34;fields&amp;#34;: [
    &amp;#34;book.title&amp;#34;,
    &amp;#34;book.contents&amp;#34;
  ], 
...
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;すると、&lt;code&gt;fields&lt;/code&gt;の戻り値は次のとおりです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;...
            &amp;#34;fields&amp;#34;: {
               &amp;#34;book.title&amp;#34;: [
                  &amp;#34;Apache Solr入門&amp;#34;
               ]
            },
...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;このことから、&lt;code&gt;store : no&lt;/code&gt;のデータの場合、&lt;code&gt;_source&lt;/code&gt;から値を取得して返却しているというのがわかります。
ハイライトがされない原因も、&lt;code&gt;fields&lt;/code&gt;で値が取れていないのも同じ原因であると思われます。
なぜなら、ハイライトは、保存された文字列を内部で取り出し利用して、ハイライトタグを埋め込むという動作をするためです。&lt;/p&gt;
&lt;h2 id=&#34;参考&#34;&gt;参考？&lt;/h2&gt;
&lt;p&gt;これらの問題点についてですが、次のIssueが関係あるかもしれません。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues/3022&#34;&gt;Return matching nested inner objects per hit #3022&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;今後&#34;&gt;今後？&lt;/h2&gt;
&lt;p&gt;残念ながら、現時点では、問題点がどんなものかというのを理解しただけとなります。
デバッグしたりソースを追っかけたりして何が問題なのかを調べて行ってみようかなぁと。&lt;/p&gt;
&lt;p&gt;なにか、気づいたことなどあればコメントしてもらえると助かります。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第3回elasticsearch勉強会を開催しました！ #elasticsearchjp</title>
      <link>https://blog.johtani.info/blog/2014/02/08/hold-3rd-elasticsaerch-meetup-in-tokyo/</link>
      <pubDate>Sat, 08 Feb 2014 00:42:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/02/08/hold-3rd-elasticsaerch-meetup-in-tokyo/</guid>
      <description>&lt;p&gt;今回はたまたま日本にいたElasticsearchの人をスペシャルゲストに呼べたので、大満足ですｗ
英語の通訳とかちゃんと勉強しないとなぁ。。。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今回はたまたま日本にいたElasticsearchの人をスペシャルゲストに呼べたので、大満足ですｗ
英語の通訳とかちゃんと勉強しないとなぁ。。。&lt;/p&gt;
&lt;p&gt;とりあえず、てきとーなメモですが、残しておきます。
参加者数は130人＋スタッフ＋リクルートテクノロジーズ社内の人。という感じでした。アンケート集計はもう少々おまちを。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;スライドがそろったら、また、更新すると思いますが、第一報という感じで公開しておきます。
懇親会にも50名も参加していただけて、非常に楽しかったです。
話ができてない方が多数いるかもしれませんが、次回以降、声をかけていただければと。
（物覚え悪いんで、あれですが。。。）
盛り上がってきてて楽しいなぁ。
スタッフの人達の練度も上がってきてるので、すごく楽ができてます。&lt;/p&gt;
&lt;p&gt;至らない点とかあれば、こちらにコメントしてもらったりしていただければと。&lt;/p&gt;
&lt;h2 id=&#34;geohashing-with-elasticsearch&#34;&gt;Geohashing with Elasticsearch&lt;/h2&gt;
&lt;h3 id=&#34;florian-schilling-elasticsearch-inc&#34;&gt;Florian Schilling, Elasticsearch Inc,&lt;/h3&gt;
&lt;p&gt;スライド：https://speakerdeck.com/chilling/tokyo-es-study-session-iii-geohashes&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自己紹介
&lt;ul&gt;
&lt;li&gt;Geoのスタッフ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Elsticsearchの概要
&lt;ul&gt;
&lt;li&gt;転置イデックスやREST APIなどの説明
マイクの調子が良くなくて申し訳なかったっす。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;平賀さん、通訳ありがとう！
Solr本もよろしくお願いします！！&lt;/p&gt;
&lt;h2 id=&#34;awsで構築するsharding&#34;&gt;AWSで構築するsharding&lt;/h2&gt;
&lt;h3 id=&#34;株式会社イプロス外山寛さんtoyama0919&#34;&gt;株式会社イプロス　外山　寛さん　@toyama0919&lt;/h3&gt;
&lt;p&gt;スライド：http://toyama0919.bitbucket.org/elasticsearch.html&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS対応の話&lt;/li&gt;
&lt;li&gt;ルーティングが重要だよ。（宣伝ありがとうございますｗ）&lt;/li&gt;
&lt;li&gt;type指定しないとルーティングできない。（内部でtypeも使ってハッシュ値取ってたかなぁ？）&lt;/li&gt;
&lt;li&gt;苦労話とかいくつか。&lt;/li&gt;
&lt;li&gt;tireはre-tire&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;実サービスでのelasticsearch設定使用例仮&#34;&gt;実サービスでのElasticsearch設定・使用例（仮）&lt;/h2&gt;
&lt;h3 id=&#34;株式会社じげん多田-雅斗さんtady_jp&#34;&gt;株式会社じげん　多田 雅斗さん　@tady_jp&lt;/h3&gt;
&lt;p&gt;スライド：https://speakerdeck.com/tadyjp/tesutoqu-dong-jian-suo-falsesusume-at-tady-jp&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;検索とは的な話がわかりやすい。&lt;/li&gt;
&lt;li&gt;全文検索のお話。ログ検索じゃないよと。&lt;/li&gt;
&lt;li&gt;書籍ないですよねー（ふふふ）&lt;/li&gt;
&lt;li&gt;specで検索条件記述しといて、ってのいいですよね。絶対必要だと思う&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mapping変更した時にテストやり直す方法とかどうしてますか？
特にフレームワークは使ってないです。&lt;/p&gt;
&lt;h2 id=&#34;mysqlユーザ視点での小さく始めるelasticsearch&#34;&gt;MySQLユーザ視点での、小さく始めるElasticsearch&lt;/h2&gt;
&lt;h3 id=&#34;株式会社リブセンス-吉田-健太郎さん-yoshi_ken&#34;&gt;株式会社リブセンス 吉田 健太郎さん @yoshi_ken&lt;/h3&gt;
&lt;p&gt;スライド：http://www.slideshare.net/y-ken/introducing-elasticsearch-for-mysql-users&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;やっぱりkuromoji便利だよね&lt;/li&gt;
&lt;li&gt;MySQLとかと連携したい。&lt;/li&gt;
&lt;li&gt;river-pluginもいまいち安定しない&lt;/li&gt;
&lt;li&gt;なので、&lt;a href=&#34;https://github.com/y-ken/yamabiko&#34;&gt;Yamabiko&lt;/a&gt;作ってみました。&lt;/li&gt;
&lt;li&gt;Geo検索とKuromojiの話をしてくれました。（作者とか開発者がいるってのを狙ってたのかすごいなぁ。）&lt;/li&gt;
&lt;li&gt;Mappingとかはちゃんと指定したほうがいろいろいいですよ。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;nodejsdynamodbelasticsearchで全社基盤を作った話&#34;&gt;nodeJS+DynamoDB＋Elasticsearchで全社基盤を作った話&lt;/h2&gt;
&lt;h3 id=&#34;株式会社リクルートテクノロジーズ-相野谷-直樹さん-naokiainoya&#34;&gt;株式会社リクルートテクノロジーズ 相野谷 直樹さん @naokiainoya&lt;/h3&gt;
&lt;p&gt;スライド：http://www.slideshare.net/recruitcojp/elasticsearchnodejsdynamodb-7&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ちょっと変わった使い方のElasticsearchで面白いです。&lt;/li&gt;
&lt;li&gt;Scroll/Scanについては、Solrでもない機能なので、そういう意味でもElasticsearchなのかもしれないですね。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;参加していただいた方々のブログ&#34;&gt;参加していただいた方々のブログ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;第3回elasticsearch勉強会 [2014/02/07(Fri.)]に参加してきました - ほわいとぼーど&lt;br&gt;
&lt;a href=&#34;http://a3no.hatenablog.com/entry/2014/02/09/022405&#34;&gt;http://a3no.hatenablog.com/entry/2014/02/09/022405&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;第 3 回 elasticsearch 勉強会に行ってきた - ようへいの日々精進&lt;br&gt;
&lt;a href=&#34;http://inokara.hateblo.jp/entry/2014/02/07/233057&#34;&gt;http://inokara.hateblo.jp/entry/2014/02/07/233057&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://www.smokeymonkey.net/2014/02/3elasticsearch.html&#34;&gt;http://www.smokeymonkey.net/2014/02/3elasticsearch.html&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;第3回elasticsearch勉強会でトークしました #elasticsearchjp&lt;br&gt;
&lt;a href=&#34;http://y-ken.hatenablog.com/entry/elasticsearch-meetup-vol3&#34;&gt;http://y-ken.hatenablog.com/entry/elasticsearch-meetup-vol3&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;第3回elasticsearch勉強会にいってきました #elasticsearchjp&lt;br&gt;
&lt;a href=&#34;http://blog.livedoor.jp/ashibuya0128/archives/52058766.html&#34;&gt;http://blog.livedoor.jp/ashibuya0128/archives/52058766.html&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>すずけんさんのメモを元にVagrantでElasticsearchクラスタを起動してみた</title>
      <link>https://blog.johtani.info/blog/2014/02/06/es-cluster-start-using-vagrant-and-puppet/</link>
      <pubDate>Thu, 06 Feb 2014 23:09:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/02/06/es-cluster-start-using-vagrant-and-puppet/</guid>
      <description>&lt;p&gt;すずけんさんがVagrant+puppet使って、VM起動してElasticsearchのクラスタを組んでる記事を書いているのを見て、試してみたくなりました。
ということで、VagrantとかPuppetなに？くらいの私ですが、クラスタを起動するところまで行ったので、その時のメモを残しておきます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;すずけんさんがVagrant+puppet使って、VM起動してElasticsearchのクラスタを組んでる記事を書いているのを見て、試してみたくなりました。
ということで、VagrantとかPuppetなに？くらいの私ですが、クラスタを起動するところまで行ったので、その時のメモを残しておきます。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;元記事とか参考&#34;&gt;元記事とか参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://suzuken.hatenablog.jp/entry/2014/02/04/215959&#34;&gt;Vagrant環境にpuppet moduleを利用してさくっとelasticsearchをインストールする&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://suzuken.hatenablog.jp/entry/2014/02/05/232543&#34;&gt;Vagrant環境にpuppetを利用してさくっとelasticsearchのclusterを作成する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/elasticsearch/puppet-elasticsearch&#34;&gt;puppet-elasticsearch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;なんとなくの理解&#34;&gt;なんとなくの理解&lt;/h2&gt;
&lt;p&gt;VagrantやPuppetについては、何度か勉強会で話を聞いてはいたのですが、
想像していたレベルだったので良い機会でした。
今のところの認識はこんな感じです。&lt;/p&gt;
&lt;h3 id=&#34;vagrant&#34;&gt;Vagrant&lt;/h3&gt;
&lt;p&gt;VMを起動したり、VM周りの設定をあれこれできるツール。
VMのネットワーク設定や、インスタンス名？などを指定できる。&lt;/p&gt;
&lt;h3 id=&#34;puppet&#34;&gt;Puppet&lt;/h3&gt;
&lt;p&gt;起動後のVM（VMとは限らないか。）のゲストOS側の設定周りやアプリのインストールなどを
実行できるツール。&lt;/p&gt;
&lt;h2 id=&#34;詰まった箇所&#34;&gt;詰まった箇所&lt;/h2&gt;
&lt;p&gt;すずけんさんのブログを元に作業をしましたが、自分がVagrantやPuppetに疎いため、以下の部分で躓いたので、備忘録のために残しておきました。&lt;/p&gt;
&lt;h3 id=&#34;その１puppetのファイルの場所&#34;&gt;その１：Puppetのファイルの場所&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;search01.vm.local&lt;/code&gt;のVMを設定（というか、elasticsearchのインストール？）するときに、&lt;code&gt;manifests/search.app&lt;/code&gt;と&lt;code&gt;roles/search/manifests/init.pp&lt;/code&gt;ファイルが必要で作成します。&lt;/p&gt;
&lt;p&gt;このファイルの配置場所は&lt;code&gt;/vagrant&lt;/code&gt;配下に作成する必要がありました。
&lt;code&gt;ssh search01.vm.local&lt;/code&gt;でVMにログインした場合は&lt;code&gt;/home/vagrant&lt;/code&gt;にログインしており、この場所でファイルを作ってもPuppetがエラーを吐いたためです。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;と思ったのですが&lt;/strong&gt;、あれ？これひょっとしてVagrantfileがあるところにディレクトリとファイル作ると勝手にVMにコピーしてくれるんですか？destroyして、upしたら、ファイルが勝手にコピーされてる。ひょっとして、&lt;code&gt;/vagrant&lt;/code&gt;ってディレクトリはVagrantfileがあるディレクトリを共有してたりするのかな？そのうち、Vagrantについても調べてみようかな。&lt;/p&gt;
&lt;h3 id=&#34;その２ネットワーク周り&#34;&gt;その２：ネットワーク周り&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curl http://192.168.10.114:9200/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;をホストOSから実行してみましたがうまく行きませんでした。。。
ネットワーク周りの設定だと思うんですが。
少なくとも「sshによるログイン」「ping」コマンドの応答は返ってきてます。&lt;/p&gt;
&lt;p&gt;また、VM内でcurlコマンドを実行したらレスポンスが返ってきました。&lt;/p&gt;
&lt;p&gt;なんで？ってツイートしたら各所から「iptables」という単語が飛んできて、
service止めたら大正解でした。まぁ、そうですよね。基本ですよね。。。&lt;/p&gt;
&lt;p&gt;ということで、Puppetがよくわかっていませんが、ググって変更してみました。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;manifests/search.app&lt;/code&gt;に以下を追加&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;include iptables
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;roles/iptables/manifests/init.pp&lt;/code&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;class iptables {
  service { &amp;#39;iptables&amp;#39;:
    enable =&amp;gt; false,
    ensure =&amp;gt; stopped,
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;iptablesを停止するmanifests？です（良くないことなんですが、よくわかってない）。&lt;/p&gt;
&lt;p&gt;ということで、ローカルで1個のVM起動して、elasticsearchにアクセスできることは確認できました。&lt;/p&gt;
&lt;p&gt;と、書いてるそばから、元記事が修正されてしまいましたｗ&lt;/p&gt;
&lt;h2 id=&#34;クラスタ編変更点&#34;&gt;クラスタ編（変更点）&lt;/h2&gt;
&lt;p&gt;クラスタを組むときに、追加でプラグインを入れたので&lt;code&gt;roles/search/manifests/init.pp&lt;/code&gt;は次のようにしました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;class search {
  class { &amp;#39;elasticsearch&amp;#39;:
    package_url =&amp;gt; &amp;#39;https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.0.0.RC2.noarch.rpm&amp;#39;,
    java_install =&amp;gt; true,
    config =&amp;gt; {
      &amp;#39;cluster&amp;#39; =&amp;gt; {
        &amp;#39;name&amp;#39; =&amp;gt; &amp;#39;test-es-cluster&amp;#39;
      },
      &amp;#39;network.host&amp;#39; =&amp;gt; &amp;#39;_eth1:ipv4_&amp;#39;,,
      &amp;#39;marvel.agent.exporter.es.hosts&amp;#39; =&amp;gt; [&amp;#39;192.168.10.114:9200&amp;#39;,&amp;#39;192.168.10.115:9200&amp;#39;]
    }
  }

  elasticsearch::plugin{&amp;#39;elasticsearch/marvel/latest&amp;#39;:
    module_dir =&amp;gt; &amp;#39;marvel&amp;#39;
  }

  elasticsearch::plugin{&amp;#39;mobz/elasticsearch-head&amp;#39;:
    module_dir =&amp;gt; &amp;#39;head&amp;#39;
  }

  elasticsearch::plugin{&amp;#39;royrusso/elasticsearch-HQ&amp;#39;:
    module_dir =&amp;gt; &amp;#39;HQ&amp;#39;
  }

  elasticsearch::plugin{&amp;#39;elasticsearch/elasticsearch-analysis-kuromoji/2.0.0.RC1&amp;#39;:
    module_dir =&amp;gt; &amp;#39;analysis-kuromoji&amp;#39;
  }

  elasticsearch::plugin{&amp;#39;info.johtani/elasticsearch-extended-analyze/1.0.0.RC1&amp;#39;:
    module_dir =&amp;gt; &amp;#39;extended-analyze&amp;#39;
  }

  elasticsearch::plugin{&amp;#39;polyfractal/elasticsearch-inquisitor&amp;#39;:
    module_dir =&amp;gt; &amp;#39;inquisitor&amp;#39;
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;とりあえず、今日はクラスタ組んでMarvelやプラグインの動作確認でおしまいです。&lt;/p&gt;
&lt;h2 id=&#34;疑問点&#34;&gt;疑問点&lt;/h2&gt;
&lt;p&gt;いくつか疑問点が。試してみてもないんでなんとも言えませんが。気が向いたら、調べて追記するかも。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;:private_network&lt;/code&gt;はVirtualBox内で完結する（Macから外には影響しない）ネットワークが構築される？たぶん、VagrantというよりはVM、仮想化周りの知識なんだろうけど&lt;/li&gt;
&lt;li&gt;どこから再開可能？elasticsearch.ymlの設定を書き換えた場合に、最後のコマンドだけ実行するとちゃんとやりなしてくれたりするのかな？&lt;/li&gt;
&lt;li&gt;VMのディスク増やすのもVagrantでできるんかな？まぁ、できると思うけど。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:forwarded_port&lt;/code&gt;のauto_correctとかわかってない。&lt;/li&gt;
&lt;li&gt;JVMをSunのJVMでかつ、7u25に変更したいのだがどうしたものか？(現時点での推奨バージョン)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;感想&#34;&gt;感想&lt;/h2&gt;
&lt;p&gt;Vagrantって便利ですね。あれ？って思ったら、destroyして、やり直すのがすごく簡単です。
元記事があるので、なんとなくですが、構成とかどうすればいいかがわかるのは本当に助かりました。
これで、あれこれと検証する環境が簡単に構築できることがわかったので、色々と楽できるかも。ありがとうございます、すずけんさん！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第13回Solr勉強会を開催しました</title>
      <link>https://blog.johtani.info/blog/2014/01/29/hold-to-japan-solr-meetup/</link>
      <pubDate>Wed, 29 Jan 2014 18:46:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/01/29/hold-to-japan-solr-meetup/</guid>
      <description>&lt;p&gt;改訂新版Solr入門出版記念ということで、&lt;a href=&#34;http://solr.doorkeeper.jp/events/7260&#34;&gt;第13回Solr勉強会 #SolrJP 新Solr本出版記念&lt;/a&gt;を開催しました。&lt;/p&gt;
&lt;p&gt;出版記念なので、技術評論社様より、プレゼント用にSolr本を用意していただきました！ありがとうございます！！
書籍をゲット出来た方は、ツイートしたりブログ書いたり書評書いたりして、宣伝してください！！！&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;改訂新版Solr入門出版記念ということで、&lt;a href=&#34;http://solr.doorkeeper.jp/events/7260&#34;&gt;第13回Solr勉強会 #SolrJP 新Solr本出版記念&lt;/a&gt;を開催しました。&lt;/p&gt;
&lt;p&gt;出版記念なので、技術評論社様より、プレゼント用にSolr本を用意していただきました！ありがとうございます！！
書籍をゲット出来た方は、ツイートしたりブログ書いたり書評書いたりして、宣伝してください！！！&lt;/p&gt;
&lt;p&gt;今回は、私は手を抜いて他の人に喋ってもらいました！&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;今回は、著者陣（関口さんは特別ゲスト）でスピーカーを固めてみました。
以下は、いつもの簡単なメモです。
スライドが集まったらまた更新していきます。&lt;/p&gt;
&lt;h2 id=&#34;1-はじめての検索エンジンsolr-株式会社nttデータccs鈴木-教嗣さん&#34;&gt;1. 「はじめての検索エンジン＆Solr」 株式会社NTTデータCCS　鈴木 教嗣さん&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/suzu2525/solr-13&#34;&gt;はじめての検索エンジン＆Solr 第13回Solr勉強会&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;鈴木さんの発表初めて聞きましたｗ。
趣味が多いなぁ。
ちょこちょこと、宣伝を入れてるのが流石ですｗ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;入門らしい概要&lt;/li&gt;
&lt;li&gt;クエリの概要とかも。&lt;/li&gt;
&lt;li&gt;スコア計算とか&lt;/li&gt;
&lt;li&gt;導入するとうれしいところとか&lt;/li&gt;
&lt;li&gt;Solr盛り上げましょう！&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;2-solr-searchcomponent-再訪-株式会社ロンウイット関口-宏司さん&#34;&gt;2. 「Solr SearchComponent 再訪」 株式会社ロンウイット　関口 宏司さん&lt;/h2&gt;
&lt;p&gt;スライド：公開待ち&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ベン図で検索の評価指標の説明&lt;/li&gt;
&lt;li&gt;理論的なお話&lt;/li&gt;
&lt;li&gt;Solrのサーチコンポーネントを使って何ができるか。ベン図で。&lt;/li&gt;
&lt;li&gt;サーチコンポーネント以外にも
&lt;ul&gt;
&lt;li&gt;NGramTokenizerも&lt;/li&gt;
&lt;li&gt;SynonymFilterも&lt;/li&gt;
&lt;li&gt;パーソナライズ検索&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;いきなり話をふられたのでちょっとびっくりしましたｗ&lt;/p&gt;
&lt;h2 id=&#34;3-自動補完autocompleteともしかしてdid-you-mean-株式会社-ロンウイット大須賀-稔さん&#34;&gt;3. 「自動補完(Autocomplete)ともしかして？(Did You Mean?)」 株式会社 ロンウイット　大須賀 稔さん&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/mosuka/solr-autocomplete-and-did-you-mean&#34;&gt;Solr AutoComplete and Did You Mean?&lt;/a&gt;&lt;br&gt;
デモ：https://github.com/mosuka/solr-suggester-demo-ui&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;職歴が相変わらずおもしろい&lt;/li&gt;
&lt;li&gt;編集距離のお話&lt;/li&gt;
&lt;li&gt;素晴らしいCM！&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;候補のランキングを変更できる？
SpellcheckComponentのパラメータで指定できるものなら楽ですが。。。&lt;/p&gt;
&lt;h2 id=&#34;4-lucene-revolution-2013-dublin振り返り-楽天株式会社平賀-一昭さん&#34;&gt;4. 「Lucene Revolution 2013 Dublin振り返り」 楽天株式会社　平賀 一昭さん&lt;/h2&gt;
&lt;p&gt;スライド：公開待ち&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ダブリンどこ？（間違ってベルリンって言っちゃいましたｗ）&lt;/li&gt;
&lt;li&gt;スタジアムで開催。グランドにも入れるのかなぁ？&lt;/li&gt;
&lt;li&gt;まずはTwitter
&lt;ul&gt;
&lt;li&gt;Luceneの改良版&lt;/li&gt;
&lt;li&gt;ちょっと特殊。１４０文字とか&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;青いRさんのライバル。Careerbuilder
&lt;ul&gt;
&lt;li&gt;元FASTユーザ&lt;/li&gt;
&lt;li&gt;企業向けに検索キーワードとかの解析画面を用意&lt;/li&gt;
&lt;li&gt;検索精度の改良の話とか&lt;/li&gt;
&lt;li&gt;転職で引っ越す意思があるかとか。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;最後はLinkedIn
&lt;ul&gt;
&lt;li&gt;Luceneのユーザ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;
&lt;p&gt;ということで、スピーカーの方々のスライドにもありましたが、
&lt;a href=&#34;http://www.amazon.co.jp/dp/4774161632?tag=johtani-22&amp;amp;camp=243&amp;amp;creative=1615&amp;amp;linkCode=as1&amp;amp;creativeASIN=4774161632&amp;amp;adid=11S5FJFPHF9685VRE24M&amp;amp;&amp;amp;ref-refURL=http%3A%2F%2Fblog.johtani.info%2F&#34;&gt;改訂新版Apache Solr入門&lt;/a&gt;は良い本なので、購入していただけると嬉しいです。&lt;/p&gt;
&lt;p&gt;感想、コメントなど、いつでもお待ちしています！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch Marvelの紹介と第一印象</title>
      <link>https://blog.johtani.info/blog/2014/01/29/simple-introduction-and-first-impression-es-marvel/</link>
      <pubDate>Wed, 29 Jan 2014 17:14:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/01/29/simple-introduction-and-first-impression-es-marvel/</guid>
      <description>&lt;p&gt;昨晩、Elasticsearchから初のプロダクトとなるMarvelがリリースされました。ということで、さっそく触ってみて、簡単な紹介と感想を書いてみました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;昨晩、Elasticsearchから初のプロダクトとなるMarvelがリリースされました。ということで、さっそく触ってみて、簡単な紹介と感想を書いてみました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;marvelって&#34;&gt;Marvelって？&lt;/h2&gt;
&lt;p&gt;Elasticsearch社が初のプロダクトとしてリリースした、Elasticsearchクラスタモニタリングツールです。
次のような特徴があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;plugin形式で提供&lt;/li&gt;
&lt;li&gt;GUIがKibana
&lt;ul&gt;
&lt;li&gt;メトリックスはElasticsearchに保存&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SenseがChrome以外でも使える&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;プロダクション環境で利用する場合は有料ですが、開発用途では無料で利用できます。
現時点(2014/01/29)では、&lt;code&gt;0.90.9&lt;/code&gt;以上のバージョン(1.0.0.RC1含む)で利用が可能です。&lt;/p&gt;
&lt;h2 id=&#34;なにができるの&#34;&gt;なにができるの？&lt;/h2&gt;
&lt;p&gt;Elasticsearchクラスタに関するメトリックスを保存、可視化できるプロダクトです。
ドキュメント数やJVMの状況、クラスタの状態など、いろいろなメトリックスが保存されます。&lt;/p&gt;
&lt;p&gt;保存先は、別のElasticsearchクラスタにすることも可能です。
お試しでインストールして見る場合は、同一クラスタにサービスに利用するインデックスとMarvel用のメトリックス保存先インデックスを入れても良いです。&lt;/p&gt;
&lt;p&gt;ただ、プロダクション環境では、Marvel用インデックスはあくまでもモニタリングに使用するため、サービスのクラスタへの影響を最小にしたくなります。&lt;/p&gt;
&lt;p&gt;このような場合、Marvelのプラグインの設定を変更することで、メトリックス送信用のエージェントとして動作させることができます。&lt;/p&gt;
&lt;p&gt;詳しくは、Marvelのドキュメントにある&lt;a href=&#34;http://www.elasticsearch.org/guide/en/marvel/current/#_installing_a_secondary_monitoring_cluster&#34;&gt;installing a secondary monitoring cluster&lt;/a&gt;を御覧ください。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;del&gt;1/29 16時時点で、上記ドキュメントのエージェントの送信先の設定に関する部分に誤記がありました。&lt;/del&gt;
&lt;del&gt;おそらく、&lt;a href=&#34;http://www.elasticsearch.org/guide/en/marvel/current/#_statistics_exporting&#34;&gt;configuration options&lt;/a&gt;の記述が正だと思います。&lt;/del&gt;
もう、なおってました。(1/30朝時点)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;キャプチャいろいろ&#34;&gt;キャプチャいろいろ&lt;/h2&gt;
&lt;p&gt;日本語WikipediaのデータをRiverで登録しながら各画面の動作などを見てみました。&lt;/p&gt;
&lt;h4 id=&#34;marvel-overview&#34;&gt;Marvel Overview&lt;/h4&gt;
&lt;p&gt;日本語WikipediaをRiverで登録してる途中。Loadが高くなってることなどがわかります。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20140129/Marvel_Overview_indexing_wikipedia_river.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20140129/Marvel_Overview_indexing_wikipedia_river.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h4 id=&#34;overview-クラスタの状態が変化&#34;&gt;Overview (クラスタの状態が変化)&lt;/h4&gt;
&lt;p&gt;クラスタの状態が変化したところに、タグが付くみたいです。
ここでは、ノードの一つを停止、起動しました。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20140129/tgged_event.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20140129/tgged_event.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;インデックス終了後に、クラスタを再起動してしまい、クラスタ内のシャードの再配置が実行されてしまったため、クラスタの状態がYellowになってしまうとこんな感じ。ちょっとわかりにくいです。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20140129/cluster_yellow.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20140129/cluster_yellow.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h4 id=&#34;sense&#34;&gt;Sense&lt;/h4&gt;
&lt;p&gt;Chromeプラグインとしてリリースされていたクエリ実行コンソールがMarvelのサイトプラグインとして提供されています。これがあるだけで、Elasticsearchへのクエリの実行が格段に効率良くなります。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20140129/Marvel_sense.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20140129/Marvel_sense.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h4 id=&#34;index-statistics&#34;&gt;Index Statistics&lt;/h4&gt;
&lt;p&gt;インデックスに関する情報のグラフが見れるページです。ドキュメント数の他に、容量やリクエスト数なども見れます。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20140129/Marvel_Index_Statistics.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20140129/Marvel_Index_Statistics.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;インデックス終了後のグラフはこんな感じ。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20140129/after_twice_indexing_ja_wikipedia.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20140129/after_twice_indexing_ja_wikipedia.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;インデックス終了後のOverviewはこんなかんじです。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20140129/after_indexing_ja_wikipedia.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20140129/after_indexing_ja_wikipedia.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h4 id=&#34;cluster-pulse&#34;&gt;Cluster Pulse&lt;/h4&gt;
&lt;p&gt;クラスタで発生したイベントとイベントの詳細を見ることができるページです。各種インデックスがYELLOWからGREENに変わっていっているのがmessageで分かります。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20140129/after_reboot_cluster_pulse.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20140129/after_reboot_cluster_pulse.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;すべて再配置が終わったらGREENになりました。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20140129/finish_recovering_all_indices.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20140129/finish_recovering_all_indices.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h4 id=&#34;node-statistics&#34;&gt;Node Statistics&lt;/h4&gt;
&lt;p&gt;各ノードに関する情報を見ることができる画面です。
ノードごとにグラフの色を分けることもできます。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20140129/two_node_in_nodes_stats.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20140129/two_node_in_nodes_stats.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h4 id=&#34;その他&#34;&gt;その他&lt;/h4&gt;
&lt;p&gt;Marvelプラグインにブラウザから接続できなくなるとこんなメッセージが出ました。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20140129/connect_error.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20140129/connect_error.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;参考までに、&lt;a href=&#34;https://github.com/mobz/elasticsearch-head&#34;&gt;elasticsearch-head&lt;/a&gt;の画面も。こちらのほうが、シャードの再配置中であるのがひと目で分かります。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20140129/elasticsearch-head.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20140129/elasticsearch-head.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h2 id=&#34;感想&#34;&gt;感想&lt;/h2&gt;
&lt;p&gt;綺麗です。まぁ、Kibanaが綺麗ですから。
クラスタ内で発生したイベントが時系列で保存されるため、あとからどんなことが発生したのかといった原因の追求などには非常に役に立ちそうです。&lt;/p&gt;
&lt;p&gt;ただ、インデックスの状態や状況（クラスタ再起動やノード追加時にshard再配置などが実行されている状況とか）はelasticsearch-headのほうがわかりやすかったです。
インデックス単位でのStatusがMarvelの画面ではわからないため、shard再配置が完了したかどうかなどのタイミングがわかりにくかったです。&lt;/p&gt;
&lt;p&gt;ある程度、多くのノードを利用したクラスタを利用する場合に、モニタリングツールとして利用するのは便利なのではないでしょうか？
時系列でログやイベントが保存されるので、ノードが追加されたり外れたりといった状況があとからでも追跡可能なのが便利です。&lt;/p&gt;
&lt;h2 id=&#34;疑問点&#34;&gt;疑問点&lt;/h2&gt;
&lt;p&gt;インデックスの情報などは、5s毎にMarvelのインデックスに保存されているようです。ただ、GUI上では5分毎のデータしか表示されません。
どうやって変更するんだろう？&lt;/p&gt;
&lt;p&gt;また、Marvelのクラスタへの接続が切れた時のデータはどうなるのか？という部分も気になります。Marvelのクラスタを更新している時や、ネットワークが遮断されてしまった場合のデータがどうなるのかという点です。&lt;/p&gt;
&lt;h2 id=&#34;疑問点への回答20140130追記&#34;&gt;疑問点への回答(2014/01/30追記)&lt;/h2&gt;
&lt;p&gt;疑問点に対して中の人から回答を頂いたので、追記です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Q：GUI上で5分毎のデータしか表示されないんですが？
&lt;ul&gt;
&lt;li&gt;A：ブラウザの負荷を高くしないようにするために、1つのグラフに20のプロットしてるだけです。ズームしたりすると、もっと細かなデータが見れますよ。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q：Marvelのクラスタへの接続が切れた時のデータはどうなるんだろう？
&lt;ul&gt;
&lt;li&gt;A：接続が切れた場合は、ローカルに保存されるけどデータは無視されます。接続が戻ると、戻った後のデータは記録されていきます。将来的には改善するかも。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ちなみに、昨日試してた環境が、足元Linux環境（監視対象のクラスタ）＋手元Mac環境（Marvelモニタリングデータ格納クラスタ）という環境でした。
確かに、出社してから、手元Mac環境を起動すると、データが流れてくるようになりました。
ただ、監視対象のクラスタでは、socket timeoutのログがずっと出てましたが。&lt;/p&gt;
&lt;h2 id=&#34;参考文献&#34;&gt;参考文献&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.elasticsearch.com/blog/introducing-elasticsearch-marvel-native-monitoring-deployments/&#34;&gt;リリースブログ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.elasticsearch.com/marvel&#34;&gt;プロダクトページ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.elasticsearch.org/guide/en/marvel/current/&#34;&gt;ドキュメント&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>lucene-gosen 4.6.1のリリースに関する注意点</title>
      <link>https://blog.johtani.info/blog/2014/01/28/release-lucene-gosen-4-dot-6-1/</link>
      <pubDate>Tue, 28 Jan 2014 12:34:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/01/28/release-lucene-gosen-4-dot-6-1/</guid>
      <description>&lt;p&gt;Lucene/Solr 4.6.1がリリースされそう(バイナリ配布待ち)&lt;a href=&#34;https://code.google.com/p/lucene-gosen/&#34;&gt;lucene-gosen&lt;/a&gt;の4.6.1対応版をリリースしました。&lt;/p&gt;
&lt;p&gt;ライブラリのインタフェースなどは特に変更はないのですが、ライブラリのダウンロード先が変更になっているため、注意喚起です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Lucene/Solr 4.6.1がリリースされそう(バイナリ配布待ち)&lt;a href=&#34;https://code.google.com/p/lucene-gosen/&#34;&gt;lucene-gosen&lt;/a&gt;の4.6.1対応版をリリースしました。&lt;/p&gt;
&lt;p&gt;ライブラリのインタフェースなどは特に変更はないのですが、ライブラリのダウンロード先が変更になっているため、注意喚起です。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Google Project Hostingの仕様変更により、Downloadsに新規ファイルがアップロードできなくなっています。（2014年から）&lt;/p&gt;
&lt;p&gt;このため、プロジェクトの選択肢としては以下の3点となっています。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Google Driveにファイルをアップロードしてダウンロードしてもらう&lt;/li&gt;
&lt;li&gt;他のソースコード管理サイトなどを利用する。&lt;/li&gt;
&lt;li&gt;他のダウンロードサイトを利用する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;1.と3.は場所が違うだけで、方法は一緒です。
今回は、暫定的に1.を利用してダウンロードするように対応しました。&lt;/p&gt;
&lt;p&gt;ダウンロード先はプロジェクトのページにリンクが有りますが、わかりにくいのでキャプチャを撮ってみました。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20140128/project_home.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20140128/project_home.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
    &lt;figcaption align=&#34;center&#34;&gt;&lt;h4&gt;ダウンロード先&lt;/h4&gt;
    &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;これまでの&lt;code&gt;Featured - Downloads&lt;/code&gt;とは異なり、&lt;code&gt;Links - External links&lt;/code&gt;の下に
&lt;a href=&#34;https://drive.google.com/folderview?id=0B0xz3tf1TTPnYTlSNExkTzBhWnc&amp;amp;usp=sharing&#34;&gt;Downloads lucene-gosen 4.6.1&lt;/a&gt;というリンクを用意してあります。&lt;/p&gt;
&lt;p&gt;フォルダとなっており、各種jarファイルがリストされていますので、こちらからダウンロードをお願いします。
今後は、この下にダウンロードリンクを追加していく予定です。&lt;/p&gt;
&lt;p&gt;ただし、2.で述べたように「別のソースコード管理サイト」も検討中です。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Curator: 時系列インデックスの管理(日本語訳)</title>
      <link>https://blog.johtani.info/blog/2014/01/24/curator-tending-your-time-series-indices-in-japanese/</link>
      <pubDate>Fri, 24 Jan 2014 14:48:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/01/24/curator-tending-your-time-series-indices-in-japanese/</guid>
      <description>&lt;p&gt;Elasticsearchのcuratorの&lt;a href=&#34;http://www.elasticsearch.org/blog/curator-tending-your-time-series-indices/&#34;&gt;ブログ記事&lt;/a&gt;を読んで、日本語でツイートしたところ、Aaron Mildensteinさんから日本語（ローマ字）で返信を頂きました。
せっかくなので、ブログ記事を翻訳してもいいかを尋ねたところ、快くOKを頂いたので、翻訳してみました。参考になればと。（誤訳など見つけたらコメントください。）&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Elasticsearchのcuratorの&lt;a href=&#34;http://www.elasticsearch.org/blog/curator-tending-your-time-series-indices/&#34;&gt;ブログ記事&lt;/a&gt;を読んで、日本語でツイートしたところ、Aaron Mildensteinさんから日本語（ローマ字）で返信を頂きました。
せっかくなので、ブログ記事を翻訳してもいいかを尋ねたところ、快くOKを頂いたので、翻訳してみました。参考になればと。（誤訳など見つけたらコメントください。）&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; lang=&#34;ja&#34;&gt;&lt;p&gt;&lt;a href=&#34;https://twitter.com/johtani&#34;&gt;@johtani&lt;/a&gt; Kore no hou ga ii. Nihongo de no Curator RT, arigatou gozaimasu! &lt;a href=&#34;https://twitter.com/search?q=%23elasticsearch&amp;amp;src=hash&#34;&gt;#elasticsearch&lt;/a&gt; &lt;a href=&#34;https://twitter.com/search?q=%23curator&amp;amp;src=hash&#34;&gt;#curator&lt;/a&gt; &lt;a href=&#34;https://twitter.com/search?q=%23logstash&amp;amp;src=hash&#34;&gt;#logstash&lt;/a&gt;&lt;/p&gt;&amp;mdash; Aaron Mildenstein (@theuntergeek) &lt;a href=&#34;https://twitter.com/theuntergeek/statuses/426009968513277952&#34;&gt;2014, 1月 22&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;//platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;curator-時系列インデックスの管理&#34;&gt;curator: 時系列インデックスの管理&lt;/h2&gt;
&lt;p&gt;原文：&lt;a href=&#34;http://www.elasticsearch.org/blog/curator-tending-your-time-series-indices/&#34;&gt;curator: tending your time-series indices&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;背景&#34;&gt;背景&lt;/h2&gt;
&lt;p&gt;数年前、Elasticsearch、Logstash、Kibana(ELK)を管理し、ここ30日よりも古いインデックスを自動的に削除する方法を必要としていました。
APIドキュメントを読み、#logstashや#elasticsearchのIRCチャネルのコミュニティの助けを借りて、簡単なスクリプトとcronを用意するのが簡単であることを知りました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curl -XDELETE &amp;#39;localhost:9200/logstash-2014.01.01?pretty&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;もちろん、これも動作しますが、日付を生成するのがめんどくさいのでもっとエレガントな方法が欲しかったです。&lt;/p&gt;
&lt;h2 id=&#34;最初に&#34;&gt;最初に&lt;/h2&gt;
&lt;p&gt;pythonでスクリプトを書き始めました。特定の日数のインデックスを管理するだけのコマンドラインクリーナーを書いてコミュニティにシェアしました。他の人が、新しい機能を追加してくれました。私は、古いインデックスをoptimizeすることができる他のスクリプトも書きました。これは、シャードごとにnセグメント以上存在しないように各シャードのセグメントをマージすることです。これらのスクリプトで1つになるようにマージしたりエンハンスし、古いインデックスを管理する助けになるツールです。&lt;/p&gt;
&lt;h2 id=&#34;curatorの紹介&#34;&gt;curatorの紹介&lt;/h2&gt;
&lt;p&gt;Curatorで可能なインデックスオペレーション&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;削除（日付もしくは、トータル容量による制限）&lt;/li&gt;
&lt;li&gt;インデックスのクローズ(Close)&lt;/li&gt;
&lt;li&gt;bloom filter cacheの無効化&lt;/li&gt;
&lt;li&gt;Optimize(LuceneのforceMerge)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;curatorのインストール&#34;&gt;curatorのインストール&lt;/h2&gt;
&lt;p&gt;この記事を書いている時点で、Curator は0.5.1がリリースされ、0.90.10に対応しています。Curatorはまた、Elasticsearchの1.0(現在はRC1)へも対応しています。各リリースへの互換性の保証のためのテストも行っています。&lt;/p&gt;
&lt;p&gt;現時点では、gitリポジトリで配布しています。近い将来、pipによるインストール可能なパッケージにする予定です。利用することを恐れないでください。もし、pythonとpipがあなたのマシンにインストールされていれば、次のようにインストールは簡単です。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git clone https://github.com/elasticsearch/curator.git
pip install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;インストール後の確認は次のコマンドです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ./curator.py -v
curator.py 0.5.1
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;利用方法とサンプル&#34;&gt;利用方法とサンプル&lt;/h3&gt;
&lt;p&gt;サンプルを示す前に、&lt;a href=&#34;#arguments&#34;&gt;オプションを見ておくとよいでしょう&lt;/a&gt;。このリストは長いですが（この記事の最後に含まれています）、どのようなことがコントロールできるかを説明しています。デフォルトがどうなっているかに注意してください。もし、デフォルト値で良い場合は、フラグを指定する必要はありません。&lt;/p&gt;
&lt;p&gt;では、簡単なサンプルを見ながら、CuratorがELKスタックをどうやって管理するかを見て行きましょう。&lt;/p&gt;
&lt;h3 id=&#34;削除delete&#34;&gt;削除(delete)&lt;/h3&gt;
&lt;p&gt;90日以上のインデックスを保存したくないとしましょう。コマンドは次のようになります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ curator.py --host my-elasticsearch -d 90
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;-d&lt;/code&gt;で日数を指定しているだけです。簡単でしょ？&lt;/p&gt;
&lt;h4 id=&#34;容量による削除delete-by-space&#34;&gt;容量による削除(delete by space)&lt;/h4&gt;
&lt;p&gt;これは、指定したギガバイト数を超えたインデックスを場合に(最も古いものから)削除を行う特殊なケースです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ curator.py --host my-elasticsearch -C space -g 10024
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;-C&lt;/code&gt;でspaceによるcurationであること、&lt;code&gt;-g&lt;/code&gt;でギガバイト数(10024、10TB)であることを指定しているのがわかります。&lt;code&gt;-g&lt;/code&gt;は1.5や0.5という数値を指定できます。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;その他のCuratorオプションは&lt;code&gt;space&lt;/code&gt;による削除と組み合わせて使用できないことに注意してください。&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;クローズclose&#34;&gt;クローズ(close)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-open-close.html&#34;&gt;Open/Close Index API&lt;/a&gt;により、インデックスをクローズすることができます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;open/close index APIを利用すると、インデックスをクローズしたり、あとでオープンしたりすることができます。クローズされたインデックスはクラスタのオーバヘッドにほとんどならず(メタデータの管理を除く)、読み書き操作の妨げにもなりません。クローズされたインデックスは、リカバリプロセス時に、オープンされます。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;インデックスをクローズすることは、存在はするが検索できないという意味です。何が便利なのでしょう？&lt;/p&gt;
&lt;p&gt;90日のインデックスを保存する義務があるが、検索は過去30日のインデックスを対象にする以外は稀であるような場合を想像してください。このような状況で、価値のあるリソース(ヒープスペースなど)を節約するためにインデックスをクローズすることができます。これは、クラスタに検索やインデキシングのためのメモリを与えることができることを意味します。そして、もし、クローズしたインデックスのデータが必要になったら、APIを呼び出してインデックスをオープンすれば検索できます。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;このような場合、今オープンしているインデックスが再び、クローズされないように、一時的にCuratorのスケジュール実行をオフにしておくのが懸命です。&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ curator.py --host my-elasticsearch -c 30 -d 90
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;先ほど説明した例の実行方法です。これは、30日よりも古いインデックスはクローズし、90日より古いインデックスを削除します。本当に簡単でしょ？&lt;/p&gt;
&lt;h3 id=&#34;bloom-filterの無効化&#34;&gt;bloom filterの無効化&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/issues/4525&#34;&gt;これは、0.90.9以降のバージョンで利用可能な機能です。(リンク先はIssue #4525)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;心配しないでください。このスクリプトは操作を行う前に、elasticsearchが利用可能なバージョンであるかをチェックします。&lt;/p&gt;
&lt;p&gt;bloom filterとは何でしょう？なぜ、無効化したくなるのでしょう？&lt;/p&gt;
&lt;p&gt;bloom filterはインデキシング操作を高速化するためにリソースを割り当てられます。時系列データで、インデキシングしている間もこれは有用です。インデックスは2日後には、日付が変わると新しいデータはおそらくインデックスされません。そのインデックスにはもはや必要のないリソースをbloom filterはまだ持っています。Curatorはこれらのリソースを開放することができます！&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ curator.py --host my-elasticsearch -b 2 -c 30 -d 90
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これで、bloom filterのリソースは少なくとも2日(1にもできます)よりも古いインデックスについては利用せず、30日より古いインデックスはクローズし、90より古いインデックスは削除します。&lt;/p&gt;
&lt;h3 id=&#34;optimizeというよりもforcemerge&#34;&gt;optimizeというよりもforcemerge&lt;/h3&gt;
&lt;p&gt;コマンドの説明をする前に、&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-optimize.html&#34;&gt;Elasticsearch APIのoptimize&lt;/a&gt;を見ることは、生きているインデックスや&amp;quot;cold&amp;quot;インデックス(インデキシングがアクティブではないという意味)に実行する必要があるということを理解するために重要です。実際、&lt;a href=&#34;http://blog.trifork.com/2011/11/21/simon-says-optimize-is-bad-for-you/&#34;&gt;optimizeはLuceneではforceMergeと名前が変えられ&lt;/a&gt;、インデックスを改善するためにoptimizeを呼び出す必要はなくなりました。Elasticsearchのセグメントをマージすることは利点がありますが、coldインデックス全てに対してoptimizeを開始する前に、コストを理解する必要があります。&lt;/p&gt;
&lt;p&gt;forceMerge操作はインデックスにある各シャードのセグメントの数を少なくします。各セグメントはオーバヘッドがあるため、セグメントが多いということは、より多くのリソースを使うという意味です。良さそうですね？リソースが少ない？&lt;/p&gt;
&lt;p&gt;それは、可能ですが、merge操作を実行するには多くのディスクやネットワークI/Oが必要で、ディスクやクラスタの通常の書き込み操作に悪影響を及ぼします。もし、これが必要なら私のアドバイスを良く考えてください。(数％ほど)検索を速くし、リソースの使用量も減らすことができます。また、管理しているセグメント数が小さくなるということは、クラスタのリカバリを速くすることにもなります。1つのインデックスをoptimizeするためにはおそらく1時間以上の時間がかかります。「使用する前に目立たない場所で試してください」というクリーニングボトル(訳注：洗剤とか漂白剤かな？)の注意書きと同様に、ディスクI/Oが低い時にテストし、もし操作とリソースがあなたのクラスタのユースケースにあっているかを見てください。デフォルトでは、シャードごとに2つのセグメントにマージしますが、&lt;code&gt;--max_num_segments&lt;/code&gt;フラグで変更可能です。&lt;/p&gt;
&lt;p&gt;ここまでのサンプルは次のようなコマンドになります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ curator.py --host my-elasticsearch -b 2 -o 2 -c 30 -d 90
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これで、bloom filterは2日より古いインデックスでは向こうにし、2日より古いインデックスは&amp;quot;optimize&amp;quot;し、30日より古いインデックスはクローズし、90日より古いインデックスは削除されます。&lt;/p&gt;
&lt;h3 id=&#34;操作の順序&#34;&gt;操作の順序&lt;/h3&gt;
&lt;p&gt;スクリプトは操作が衝突するのを防ぐために次の順序で実行されます。なぜ、クローズされたインデックスはoptimizeしないのでしょう？なぜ、削除予定のインデックスはクローズされないのでしょう？&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Delete (by space or time)&lt;/li&gt;
&lt;li&gt;Close&lt;/li&gt;
&lt;li&gt;Disable bloom filters&lt;/li&gt;
&lt;li&gt;Optimize&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;使用の検討&#34;&gt;使用の検討&lt;/h3&gt;
&lt;p&gt;最後の例で、3つの操作を1つのコマンドで実行していますが、それらが連続ですべて実行されるのを望んでいないかもしれません。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ curator.py --host my-elasticsearch -b 2 -o 2 -c 30 -d 90
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これは、次の操作と同様です。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ curator.py --host my-elasticsearch -d 90
$ curator.py --host my-elasticsearch -c 30
$ curator.py --host my-elasticsearch -b 2
$ curator.py --host my-elasticsearch -o 2
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これらのコマンドを異なる時間に実行したり、異なるその他のオプション(特に、optimize実行で&lt;code&gt;--timeout 3600&lt;/code&gt;を追加したり)を指定して実行するのは簡単です。&lt;/p&gt;
&lt;p&gt;また、デフォルトの&lt;code&gt;logstash-&lt;/code&gt;とは異なるプレフィックスのインデックスを持っているかもしれません。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ curator.py --host my-elasticsearch --prefix logstash- -d 30
$ curator.py --host my-elasticsearch --prefix othername- -d 30
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;最後に&#34;&gt;最後に&lt;/h2&gt;
&lt;p&gt;Curatorは時系列インデックスの保存ポリシーを管理するのに役立ちます。豊富な設定オプションがインデックスを管理することを簡単にします。クラスタに存在するノードの数に関係なく。&lt;a href=&#34;https://github.com/elasticsearch/curator&#34;&gt;https://github.com/elasticsearch/curator&lt;/a&gt;へのフィードバックやコントリビューションをお待ちしています！&lt;/p&gt;
&lt;h4 id=&#34;参考全引数とオプション&#34;&gt;&lt;a name=&#34;arguments&#34;&gt;参考(全引数とオプション)&lt;/h4&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ curator.py -h
usage: curator.py [-h] [-v] [--host HOST] [--port PORT] [-t TIMEOUT]
                  [-p PREFIX] [-s SEPARATOR] [-C CURATION_STYLE]
                  [-T TIME_UNIT] [-d DELETE_OLDER] [-c CLOSE_OLDER]
                  [-b BLOOM_OLDER] [-g DISK_SPACE]
                  [--max_num_segments MAX_NUM_SEGMENTS] [-o OPTIMIZE] [-n]
                  [-D] [-l LOG_FILE]

Curator for Elasticsearch indices. Can delete (by space or time), close,
disable bloom filters and optimize (forceMerge) your indices.

optional arguments:
  -h, --help            show this help message and exit
  -v, --version         show program version number and exit
  --host HOST           Elasticsearch host. Default: localhost
  --port PORT           Elasticsearch port. Default: 9200
  -t TIMEOUT, --timeout TIMEOUT
                        Elasticsearch timeout. Default: 30
  -p PREFIX, --prefix PREFIX
                        Prefix for the indices. Indices that do not have this
                        prefix are skipped. Default: logstash-
  -s SEPARATOR, --separator SEPARATOR
                        Time unit separator. Default: .
  -C CURATION_STYLE, --curation-style CURATION_STYLE
                        Curate indices by [time, space] Default: time
  -T TIME_UNIT, --time-unit TIME_UNIT
                        Unit of time to reckon by: [days, hours] Default: days
  -d DELETE_OLDER, --delete DELETE_OLDER
                        Delete indices older than n TIME_UNITs.
  -c CLOSE_OLDER, --close CLOSE_OLDER
                        Close indices older than n TIME_UNITs.
  -b BLOOM_OLDER, --bloom BLOOM_OLDER
                        Disable bloom filter for indices older than n
                        TIME_UNITs.
  -g DISK_SPACE, --disk-space DISK_SPACE
                        Delete indices beyond n GIGABYTES.
  --max_num_segments MAX_NUM_SEGMENTS
                        Maximum number of segments, post-optimize. Default: 2
  -o OPTIMIZE, --optimize OPTIMIZE
                        Optimize (Lucene forceMerge) indices older than n
                        TIME_UNITs. Must increase timeout to stay connected
                        throughout optimize operation, recommend no less than
                        3600.
  -n, --dry-run         If true, does not perform any changes to the
                        Elasticsearch indices.
  -D, --debug           Debug mode
  -l LOG_FILE, --logfile LOG_FILE
                        log file
&lt;/code&gt;&lt;/pre&gt;</content:encoded>
    </item>
    
    <item>
      <title>Extended-Analyze 1.0.0RC1をリリースしました</title>
      <link>https://blog.johtani.info/blog/2014/01/22/release-extended-plugin-for-1-0-0rc1/</link>
      <pubDate>Wed, 22 Jan 2014 00:16:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2014/01/22/release-extended-plugin-for-1-0-0rc1/</guid>
      <description>&lt;p&gt;あけましておめでとうございます。今年もSolrやElasticsearchについて色々と頑張っていく所存です。
とまぁ、お決まりの挨拶はおいておいてと。(もう、新年も22日ですが。。。)&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;あけましておめでとうございます。今年もSolrやElasticsearchについて色々と頑張っていく所存です。
とまぁ、お決まりの挨拶はおいておいてと。(もう、新年も22日ですが。。。)&lt;/p&gt;
&lt;p&gt;Elasticsearchの1.0.0RC1がリリースされました。
ということで、私が作っている&lt;a href=&#34;https://github.com/johtani/elasticsearch-extended-analyze&#34;&gt;Extended-Analyzeプラグイン&lt;/a&gt;も1.0.0RC1向けに修正してリリースしました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;100rc1向けに修正したこと&#34;&gt;1.0.0RC1向けに修正したこと&lt;/h2&gt;
&lt;p&gt;コミットログを見てもらえば、いいのですが、ロジック自体は変更しなくても良かったです。&lt;/p&gt;
&lt;p&gt;ただ、正式に、Elasticsearchのつづりが決定したようで、クラス名が「ElasticSearchほげほげ」から、「Elasticsearchほげほげ」と、SearchのSが小文字になりっています。
この影響で、例外クラスなどの名称を幾つか変更しました。
また、バージョン番号を1.0.0RC1とし、0.x系をElasticsearchの0.90系向けのバージョンにしていく予定です。&lt;/p&gt;
&lt;p&gt;今後は、UIを追加したいと思っているので、Elasticsearchのバージョン番号とはずれてくるとは思いますが。。。&lt;/p&gt;
&lt;h2 id=&#34;elasticsearch-100rc1を利用してみて&#34;&gt;Elasticsearch 1.0.0RC1を利用してみて&lt;/h2&gt;
&lt;p&gt;1点だけですが。
これまでは、&lt;code&gt;-f&lt;/code&gt;オプションを指定すると、デーモンではない動作で起動できていました。（デフォルトがデーモン起動）&lt;/p&gt;
&lt;p&gt;これが、1.0.0から（0.90の最新もかな？詳しく見ていない）デフォルトの挙動が変更され、デーモン起動ではなくなりました。
代わりに、&lt;code&gt;-d&lt;/code&gt;オプションを指定することで、デーモン起動ができるようになりました。&lt;/p&gt;
&lt;p&gt;これで、手元でうっかりデーモン起動することがなくなって、ひと安心です。（他の人は困るかもしれないけど）&lt;/p&gt;
&lt;h2 id=&#34;ということで&#34;&gt;ということで&lt;/h2&gt;
&lt;p&gt;1.0.0RC1が出たので、少しずつ1.0系で追加されたAPIや機能について、ブログで紹介していけたらと思います。&lt;/p&gt;
&lt;p&gt;こんなこと調べてよ？、これわかんないんだけど？などありましたら、コメントいただければと。
気が向いたら記事を書くので。&lt;/p&gt;
&lt;p&gt;あと、&lt;a href=&#34;https://github.com/johtani/elasticsearch-extended-analyze&#34;&gt;Extended-Analyzeプラグイン&lt;/a&gt;の感想などもお待ちしています！&lt;/p&gt;
&lt;p&gt;今年もよろしくお願いします！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>今年の振り返りと来年の抱負（2013）</title>
      <link>https://blog.johtani.info/blog/2013/12/30/looking-back-2013/</link>
      <pubDate>Mon, 30 Dec 2013 21:20:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/12/30/looking-back-2013/</guid>
      <description>&lt;p&gt;昨年は、&lt;a href=&#34;http://johtani.jugem.jp/?eid=115&#34;&gt;大晦日に書いてました&lt;/a&gt;。
ちょっと進歩したかも。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;振り返り2012年に書いた抱負から&#34;&gt;振り返り(2012年に書いた抱負から)&lt;/h2&gt;
&lt;p&gt;ということで、まずは昨年書いた抱負からの振り返りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IntelliJ IDEAをメインに使う&lt;/li&gt;
&lt;li&gt;JIRAを継続して活用&lt;/li&gt;
&lt;li&gt;ブログの継続&lt;/li&gt;
&lt;li&gt;elasticsearch&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;Luceneのソースコードリーディング&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;何かOSSのソースを読む&lt;/li&gt;
&lt;li&gt;Macでもっと開発&lt;/li&gt;
&lt;li&gt;読書と英語を継続&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;お。思ったよりもできてるかも。
IntelliJ IDEAについては、メインになりました。Eclipseを開くことはまずないです。
Macがメインの開発マシンにもなってきてるので。(開発してないんじゃないかという話も。。。)&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;昨年は、&lt;a href=&#34;http://johtani.jugem.jp/?eid=115&#34;&gt;大晦日に書いてました&lt;/a&gt;。
ちょっと進歩したかも。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;振り返り2012年に書いた抱負から&#34;&gt;振り返り(2012年に書いた抱負から)&lt;/h2&gt;
&lt;p&gt;ということで、まずは昨年書いた抱負からの振り返りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IntelliJ IDEAをメインに使う&lt;/li&gt;
&lt;li&gt;JIRAを継続して活用&lt;/li&gt;
&lt;li&gt;ブログの継続&lt;/li&gt;
&lt;li&gt;elasticsearch&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;Luceneのソースコードリーディング&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;何かOSSのソースを読む&lt;/li&gt;
&lt;li&gt;Macでもっと開発&lt;/li&gt;
&lt;li&gt;読書と英語を継続&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;お。思ったよりもできてるかも。
IntelliJ IDEAについては、メインになりました。Eclipseを開くことはまずないです。
Macがメインの開発マシンにもなってきてるので。(開発してないんじゃないかという話も。。。)&lt;/p&gt;
&lt;p&gt;JIRAは一応、継続しているという感じです。&lt;/p&gt;
&lt;p&gt;唯一Luceneのソースコードリーディングができてないですね。。。
言い訳をすると、明示的にソースコードリーディングをしているわけではないですが、Luceneのソース自体は時々見ています。
SolrやElasticsearchを調べるとそのままLuceneにたどり着くことがあるので。&lt;/p&gt;
&lt;p&gt;ポモドーロのタスク管理用に使っていますが、時々忘れていたり。あと、振り返りがまだちゃんとできてないので、そこをやらないとかなぁと。
読書と英語は今後も継続です。もっと習慣づけないと。&lt;/p&gt;
&lt;h2 id=&#34;振り返り今年あった出来事など&#34;&gt;振り返り(今年あった出来事など)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;CROSSでモデレータやりました&lt;/li&gt;
&lt;li&gt;Xperia Zに機種変&lt;/li&gt;
&lt;li&gt;メニエール病&lt;/li&gt;
&lt;li&gt;リクルートテクノロジーズさんのお手伝い&lt;/li&gt;
&lt;li&gt;Lucene In Action輪読やってる&lt;/li&gt;
&lt;li&gt;MIR輪読も継続&lt;/li&gt;
&lt;li&gt;Solr勉強会を不定期開催&lt;/li&gt;
&lt;li&gt;Elasticsearch勉強会を始めた&lt;/li&gt;
&lt;li&gt;Solr本の改訂版を執筆&lt;/li&gt;
&lt;li&gt;AWSちょっと触った&lt;/li&gt;
&lt;li&gt;Elasticsearchプラグイン作ってみた&lt;/li&gt;
&lt;li&gt;Githubの活用&lt;/li&gt;
&lt;li&gt;Octopressでブログ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こんなかんじです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://2013.cross-party.com/programs/?p=366&#34;&gt;CROSSでは、モデレータ&lt;/a&gt;をやらせていただきました。すこしは検索を面白いと思ってもらえたかなと思います。
来年の&lt;a href=&#34;http://www.cross-party.com&#34;&gt;CROSS 2014&lt;/a&gt;ではスタッフとして盛り上げていく予定ですので、スタッフに興味ある方は声をかけてください！
面白い話がいっぱい聞けますし、おいしい物も飲み食いできるかも！？&lt;/p&gt;
&lt;p&gt;Xperia Zは良い買い物でした。ただ、すでに2回電源部分が故障してますが。。。
それ以外は非常に快適です。&lt;/p&gt;
&lt;p&gt;2月末から3月は少し休んでました。難聴→めまい→メニエール病という流れで、ちょっとしんどかったです。
ほぼ回復しましたが、原因は不明みたいなので、長く付き合ってくのかなぁと。&lt;/p&gt;
&lt;p&gt;4月からリクルートテクノロジーズさんの仕事を手伝っています(Solr本の著者紹介にも書いてます)。
色々と面白いことをしている&lt;a href=&#34;http://atl.recruit-tech.co.jp&#34;&gt;ATLという部署&lt;/a&gt;で面白い人達と仕事させて頂いてます。
来年もよろしくお願いします！(もっと価値を出さないとなぁ。。。)&lt;/p&gt;
&lt;p&gt;その一環で、Lucene In Actionの輪読を社内でやっていたりも。バージョンが3.x系で書かれているので、
ちょっと大変ですが、4だとどう違うかなどの話を交えつつ少しずつ読んでいます。&lt;/p&gt;
&lt;p&gt;輪読会といえば、MIR(Modern Information Retirieval)の輪読も続いています。
私は深いところまでわからないのですが、色々と詳しい方たちとボチボチ読んでます。教えてもらってばかりですが、来年も頑張りますよと。&lt;/p&gt;
&lt;p&gt;Solr勉強会も、引き継いでぼちぼちやっています。来年は&lt;a href=&#34;http://solr.doorkeeper.jp/events/7260&#34;&gt;1/29に開催&lt;/a&gt;します。Solrの入門的な話をしてもらうので、
ぜひ、触ったことがない方や興味がある人に参加していただきたいと。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://elasticsearch.doorkeeper.jp&#34;&gt;Elasticsearch勉強会&lt;/a&gt;も主催し始めました。興味ある人がいるだろうとは思ったのですが、想像以上でびっくりしてます。
自分が理解を深め、発表するためにも、2ヶ月程度のスパンで来年も開催する予定です。
スピーカーに興味のある方は、&lt;a href=&#34;https://groups.google.com/forum/#!forum/elasticsearch-jp&#34;&gt;elasticsearch-jpのML&lt;/a&gt;や私にコンタクトしてください。&lt;/p&gt;
&lt;p&gt;Solr入門のSolr4対応版も執筆しました。今回は全体のコーディネートもやらせていただきました。
Solr活用のお役に立てていただければと。まだ購入してない方はぜひ、以下のリンクから！(&lt;a href=&#34;https://gihyo.jp/dp/ebook/2013/978-4-7741-6240-9&#34;&gt;PDF版もあります。&lt;/a&gt;)
質問などあれば、ブログにコメントをいただくか、ツイートしていただくか、技術評論社のサポートページに問い合わせていただければと思います。&lt;/p&gt;
&lt;iframe src=&#34;http://rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;nou=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=johtani-22&amp;o=9&amp;p=8&amp;l=as1&amp;m=amazon&amp;f=ifr&amp;ref=qf_sp_asin_til&amp;asins=4774161632&#34; style=&#34;width:120px;height:240px;&#34; scrolling=&#34;no&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34; frameborder=&#34;0&#34;&gt;&lt;/iframe&gt;
&lt;p&gt;AWSをちょっとだけ触りました。
S3にバックアップ取ってるだけですが。。。来年はもう少し。。。
JIRA（さくらVPSに立ててる）のバックアップなどをやってます。&lt;/p&gt;
&lt;p&gt;あとは、Elasticsearchの勉強会も始めたこともあり、Elasticsearchを色々と触っています。
&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch-analysis-kuromoji&#34;&gt;elasticsearch-analysis-kuromojiプラグインのREADME&lt;/a&gt;を記述してコントリビュートしてみたり、
&lt;a href=&#34;https://github.com/johtani/elasticsearch-extended-analyze&#34;&gt;elasticsearch-extended-analysisプラグイン&lt;/a&gt;を作ってみたり。&lt;/p&gt;
&lt;p&gt;勉強会のスピーカー探しも兼ねて、いろんなところに、「突撃!隣のElasticsearch」と称してElasticsearchの話を聞きに行きたいと思っていますので、使ってるよ！とか使いたいんだけど、どうすればいい？みたいな話があれば、声をかけてください。Twitterでツイート見たら勝手に、アタックすることもあるかもですが、その時はよろしくお願いします。&lt;/p&gt;
&lt;p&gt;来年はSolrやElaticsearchにもっと貢献できればと。&lt;/p&gt;
&lt;p&gt;Github(git)もようやくまともに触り始めました。
某データの管理やプラグインの開発などでやっと触り始めました。
まだ、チーム開発ってほどではないので、チームで開発するときのやり方なども少しずつ勉強していこうかと。
プルリクとかも少しずつやってみたりしてます。&lt;/p&gt;
&lt;p&gt;あとは、Octopressでブログ始めました。その前はjugemだったのですが、なんとなく。
Markdownに慣れるためというのもありOctopressにしてみました。
(Solr本の原稿もMarkdownで書いてました)
昔のブログもこっちにコピーするプログラムも書いてみようかな。&lt;/p&gt;
&lt;h2 id=&#34;来年の抱負&#34;&gt;来年の抱負&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Elasticsearch勉強会、Solr勉強会の継続＋ミックスした検索勉強会の開催&lt;/li&gt;
&lt;li&gt;IDEAのさらなる活用&lt;/li&gt;
&lt;li&gt;もっと開発(プラグインとか)&lt;/li&gt;
&lt;li&gt;AWSをもう少し活用&lt;/li&gt;
&lt;li&gt;海外のイベントに行ってみたい&lt;/li&gt;
&lt;li&gt;読書と英語を継続&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;勉強会の開催は今後も継続していく予定です。会場を毎回提供して頂いているVOYAGE GROUPさん、リクルートテクノロジーズさんには、
今後もお手数をお掛けしますが、よろしくお願い致します。勉強会の開催を通じて、色々な人のノウハウがうまく共有できて、
もっと本質的な作業（サービスの改善とか）に注力できる環境ができると面白いなぁと思ってるので。&lt;/p&gt;
&lt;p&gt;あと、Elasticsearch、Solrと別々の勉強会になっていますが、検索エンジン勉強会という形でそれぞれのメリット・デメリットを
共有できる勉強会も面白いかもと思っているので、春とかに開催したいなぁと考えてもいます。（まだ考えているだけで何もネタがないですが）&lt;/p&gt;
&lt;p&gt;IDEAは、年貢(13のサブスクリプション)を収めたので、もっと活用しないとという意味で。プラグインの開発、gitやsvnのクライアントとしては
活躍していますが、もっと開発に活用していかないとなぁと。まだ、10%くらいしか活用できてない気がするので。&lt;/p&gt;
&lt;p&gt;もっと開発しないとなと。毎年言ってますが。今年は書籍に注力したのもあり、ソースを読んだり英語を読んだりが多くなってました。
偉そうにしてるためか、開発する機会が減ってきているので、細かなことでもいいので、すこしずつコードを書いていこうかと。
（もっと自分で問題点を見出してそれを補完するようなコードなりプラグインなり書けばいいんだろうな。）&lt;/p&gt;
&lt;p&gt;開発と合わせて、AWSをもう少し触りたいなと。これも数年言っていますができてないです。。。
ネタ探すのが下手なのかなぁ。&lt;/p&gt;
&lt;p&gt;海外イベントにも行ってみたいです。まだ、海外行ったことないんですが。。。
Lucene Revolutionとか。その訓練も兼ねて英語でメール書いたり、プラグインのREADME書いたりしてみてます。&lt;/p&gt;
&lt;p&gt;最後は、毎年恒例ですが、読書と英語です。
Packtのキャンペーンで買ってしまった英語の本とか貯まっているので、読まないと。
nasneが便利で通勤時間にドラマ見てるからなぁ。ま、必要なときにボチボチと読んでいく予定です。&lt;/p&gt;
&lt;p&gt;最後は、いつものようにですが、来年も勉強会やいろんなイベントに参加する予定です。
ブログも週1程度で書く努力しないとなぁ。
こんな話を書いてくださいとかのリクエストもお待ちしています。&lt;/p&gt;
&lt;p&gt;今年もまだ、大晦日が残っていますが、色々とお世話になりました。
この場を借りてお礼申し上げます。&lt;/p&gt;
&lt;p&gt;来年も、いろんな方に絡んでいくとは思いますが、よろしくお願いいたします。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Elasticsearch 0.90.8がリリースされました＆注意点（2013/12/20追記）</title>
      <link>https://blog.johtani.info/blog/2013/12/20/release-elasticsearch-0-90-8/</link>
      <pubDate>Fri, 20 Dec 2013 16:24:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/12/20/release-elasticsearch-0-90-8/</guid>
      <description>&lt;p&gt;昨夜、Elasticsearchの0.90.8がリリースされました。&lt;/p&gt;
&lt;p&gt;リリースされた内容などについては、本家のブログ「&lt;a href=&#34;http://www.elasticsearch.org/blog/0-90-8-released/&#34;&gt;0.90.8 released&lt;/a&gt;」をご覧いただくこととして。
1点注意したほうが良い点があります。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;昨夜、Elasticsearchの0.90.8がリリースされました。&lt;/p&gt;
&lt;p&gt;リリースされた内容などについては、本家のブログ「&lt;a href=&#34;http://www.elasticsearch.org/blog/0-90-8-released/&#34;&gt;0.90.8 released&lt;/a&gt;」をご覧いただくこととして。
1点注意したほうが良い点があります。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch-analysis-kuromoji&#34;&gt;elasticsearch-analysis-kuromoji&lt;/a&gt;を利用している場合は、0.90.8に対応したバージョンがリリースされるのを待つ必要があります。&lt;/p&gt;
&lt;p&gt;elasticsearch 0.90.8はLuceneのバージョンが4.6.0に変更されています。
Lucene 4.6.0では、TokenStreamというTokenizerのI/Fに変更があり、Tokenizerの実装を変更する必要があります。&lt;/p&gt;
&lt;p&gt;現時点（2013年12月19日現在）のelasticsearch-analysis-kuromojiの1.6.0にはlucene-analyzers-kuromoji-4.5.1.jarが含まれており、この部分でI/Fが異なるためエラーが発生してしまいます。
プラグインをインストールする時点ではエラーは発生せず、実際にKuromojiのTokenizerやAnalyzerを利用するタイミングでエラーが出ます。
以下、0.90.8にanalysis-kuromojiの1.6.0をインストールした状態で&lt;code&gt;_analyze&lt;/code&gt;を実行した時のエラー。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curl -XPOST &amp;#39;localhost:9200/_analyze?tokenizer=kuromoji_tokenizer&amp;amp;filters=kuromoji_baseform&amp;amp;pretty&amp;#39; -d &amp;#39;寿司が美味しかった&amp;#39;
{
  &amp;#34;error&amp;#34; : &amp;#34;IllegalStateException[TokenStream contract violation: reset()/close() call missing, reset() called multiple times, or subclass does not call super.reset(). Please see Javadocs of TokenStream class for more information about the correct consuming workflow.]&amp;#34;,
  &amp;#34;status&amp;#34; : 500
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ということで、1.7.0がリリースされるのを待つか、自分で&lt;code&gt;mvn package&lt;/code&gt;してビルドする必要があります。
他にも独自でTokenizerなどを造られている方は注意が必要かと。&lt;/p&gt;
&lt;p&gt;たぶん、すぐにリリースされるんじゃないかなぁと。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2013/12/20追記&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;とりあえず、masterブランチが0.90.8に変更されたみたいです。(と書いてるそばから、1.7.0がリリースされました)
ということで、0.90.8では1.7.0を使うとエラーが出ないです。
（あと、踊り字対応のcharfilterも追加されたみたいです）&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Solrへのプラグインの配置方法について</title>
      <link>https://blog.johtani.info/blog/2013/12/19/add-jar-file-to-solr/</link>
      <pubDate>Thu, 19 Dec 2013 19:09:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/12/19/add-jar-file-to-solr/</guid>
      <description>&lt;p&gt;Solr本が出てから、質問を受けてブログ書くと言いながら書いてなかったことを思い出しました。。。&lt;/p&gt;
&lt;p&gt;プラグインの配置方法についてこんな質問を受けてたので、それっぽいエントリを書いておきます。（想像と違ってたらツッコミ入れてください）&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Solr本が出てから、質問を受けてブログ書くと言いながら書いてなかったことを思い出しました。。。&lt;/p&gt;
&lt;p&gt;プラグインの配置方法についてこんな質問を受けてたので、それっぽいエントリを書いておきます。（想像と違ってたらツッコミ入れてください）&lt;/p&gt;
&lt;!-- more --&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; lang=&#34;ja&#34;&gt;&lt;p&gt;&lt;a href=&#34;https://twitter.com/johtani&#34;&gt;@johtani&lt;/a&gt; 追加でプラグインの配置方法とかあると便利かなと思いました&lt;/p&gt;&amp;mdash; Tsubosaka (@tsubosaka) &lt;a href=&#34;https://twitter.com/tsubosaka/statuses/407395766471110656&#34;&gt;2013, 12月 2&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;//platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;改定前のSolr本では、日本語の形態素解析器をjarファイルとして追加する方法が書かれていました。
ただ、改定後のSolr本では、KuromojiがLuceneで実装されているためサンプルとしてjarファイルを追加するような方法の記載が明確にはありません。&lt;/p&gt;
&lt;p&gt;19ページのcollection1の説明ですこしだけ、libディレクトリについて触れています。&lt;/p&gt;
&lt;p&gt;独自のTokenizer（lucene-gosenなど）はjar形式でSolrに追加し、schema.xmlなどに利用するFactoryを指定してから利用します。&lt;/p&gt;
&lt;p&gt;このとき、追加のjarファイルを配置する先がlibディレクトリです。&lt;/p&gt;
&lt;p&gt;libディレクトリは2つの種類のスコープのディレクトリが存在します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Solr全体で利用可能なlibディレクトリ&lt;/li&gt;
&lt;li&gt;コア単位で利用可能なlibディレクトリ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;solr全体で利用するlibディレクトリ&#34;&gt;Solr全体で利用するlibディレクトリ&lt;/h2&gt;
&lt;p&gt;これは、起動しているSolrにある全てのコアで利用するようなjarファイルを配置するディレクトリになります。
場所は&lt;code&gt;$SOLR_HOME/lib&lt;/code&gt;です。ここにjarファイルを配置することで、この&lt;code&gt;$SOLR_HOME&lt;/code&gt;を利用するすべてのコアで同じjarファイルを利用することができるようになります。&lt;/p&gt;
&lt;p&gt;ですので、例えば、lucene-gosenはすべてのコアで利用するという場合にはここに配置すれば、1つのjarファイルを配置するだけで済むことになります。&lt;/p&gt;
&lt;h2 id=&#34;コア単位で利用するlibディレクトリ&#34;&gt;コア単位で利用するlibディレクトリ&lt;/h2&gt;
&lt;p&gt;これは、コアごとにlibディレクトリを用意する場合です。
19ページにも記載されていますが、&lt;code&gt;$SOLR_HOME/コアディレクトリ名/lib&lt;/code&gt;となります。&lt;/p&gt;
&lt;p&gt;特定のコアのみで利用するライブラリについてはこちらに配置する形になります。
他のコアで利用してほしくないjarファイルなどを配置するのに利用すればよいかと。&lt;/p&gt;
&lt;p&gt;簡単ですが、補足記事でした。
UIMAやlangidの利用方法などもあるとうれしですかね？
そのうち気が向けば書くかもしれません。（他の人に書いてもらうのもありかも。）&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>elasticsearch-extended-analyzeプラグインをMavenとSonatypeにリリース</title>
      <link>https://blog.johtani.info/blog/2013/12/17/release-es-extended-analyze-plugin-to-maven-and-sonatype/</link>
      <pubDate>Tue, 17 Dec 2013 12:11:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/12/17/release-es-extended-analyze-plugin-to-maven-and-sonatype/</guid>
      <description>&lt;p&gt;ども。
プラグインのインストールに長いURL入れるの辛いですよね？ね？&lt;/p&gt;
&lt;p&gt;ということで、MavenでリリースしてMaven Repositoryからダウンロードできるようにしてみました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ども。
プラグインのインストールに長いURL入れるの辛いですよね？ね？&lt;/p&gt;
&lt;p&gt;ということで、MavenでリリースしてMaven Repositoryからダウンロードできるようにしてみました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;流れとしては&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sonatypeにリリースできるように申請する&lt;/li&gt;
&lt;li&gt;Sonatypeにリリースする&lt;/li&gt;
&lt;li&gt;SonatypeからMavenにSyncしてもらう&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;という流れです。&lt;/p&gt;
&lt;p&gt;Sonatypeにリリースするための方法はイケメンの人(@yusuke)がブログに簡単ですが残してくれてました。
あと、こちらの@vvakameさんのブログも参考にしながら作業しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://samuraism.jp/diary/2012/05/03/1336047480000.html&#34;&gt;【最新版】Maven Central Repository へのライブラリ登録方法 #maven&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/vvakame/20120507#1336411831&#34;&gt;JsonPullParser が Maven Central Repository に入るようです&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;pom.xmlについては、プラグインのpom.xmlを参考にしてもらえればと。
1.の作業が終わったら、リリースを実行します。&lt;/p&gt;
&lt;p&gt;この時、&lt;code&gt;&amp;lt;scm&amp;gt;&lt;/code&gt;タグにgithubの情報が記載されているため（？）、githubにタグを打つ作業もmavenコマンドがやってくれるみたいです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mvn release:prepare
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;を実行すると、リリースするバージョンやタグ名などを聞いてくれます。
それらに答えると、pom.xmlにバージョンを指定してcommit&amp;amp;pushしてくれ、タグも打ってくれます。（なんて便利）&lt;/p&gt;
&lt;p&gt;その後、&lt;code&gt;release:perform&lt;/code&gt;にてSonatypeへのリリースが完了します。
あとは、Sonatypeの画面で作業したら、Mavenのリポジトリにそのうち同期してくれます。&lt;/p&gt;
&lt;p&gt;ということで、次のコマンドを実行すればプラグインがインストールできるようになりました。0.6.0と0.7.0の違いは実装には差異はありません。リリース方法が変更されただけということになります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bin/plugin -i info.johtani/elasticsearch-extended-analyze/0.7.0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これで少しは活用してもらえるようになるかなぁ？
（どのくらいの人が使ってくれてるのかは不明。。。）&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>改訂版Solr入門のPDF版も発売</title>
      <link>https://blog.johtani.info/blog/2013/12/09/release-introduction-solr-ebook/</link>
      <pubDate>Mon, 09 Dec 2013 11:08:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/12/09/release-introduction-solr-ebook/</guid>
      <description>&lt;p&gt;少し遅くなってしまいましたが、12/05に電子書籍も発売されました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;技術評論社の電子書籍サイトから購入可能です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://gihyo.jp/dp/ebook/2013/978-4-7741-6240-9&#34;&gt;書籍のページへのリンク&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PDF版となっております。
購入の際は、技術評論社の電子書籍サイトに会員登録後購入可能となります。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;少し遅くなってしまいましたが、12/05に電子書籍も発売されました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;技術評論社の電子書籍サイトから購入可能です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://gihyo.jp/dp/ebook/2013/978-4-7741-6240-9&#34;&gt;書籍のページへのリンク&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PDF版となっております。
購入の際は、技術評論社の電子書籍サイトに会員登録後購入可能となります。&lt;/p&gt;
&lt;p&gt;個人的には電子書籍が便利なので、こちらを普段活用しようと思っています。&lt;/p&gt;
&lt;p&gt;もちろん、紙の書籍も発売中です！購入の際は右の書影をクリックしていただければと！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>改訂版Solr入門を執筆しました</title>
      <link>https://blog.johtani.info/blog/2013/11/26/introduction-to-solr-new-edition/</link>
      <pubDate>Tue, 26 Nov 2013 12:27:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/11/26/introduction-to-solr-new-edition/</guid>
      <description>&lt;p&gt;勉強会で宣伝もしましたが、改めて。&lt;/p&gt;
&lt;p&gt;Solr入門の改訂版を執筆しました。
考えてみれば、もう3年も前なんですね、&lt;a href=&#34;http://gihyo.jp/book/2010/978-4-7741-4175-6&#34;&gt;Solr入門&lt;/a&gt;は。
Solr勉強会などでも何度も新しいのは出ないのですか？と聞かれていましたが、やっと出ました。（お待たせしました。）&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;勉強会で宣伝もしましたが、改めて。&lt;/p&gt;
&lt;p&gt;Solr入門の改訂版を執筆しました。
考えてみれば、もう3年も前なんですね、&lt;a href=&#34;http://gihyo.jp/book/2010/978-4-7741-4175-6&#34;&gt;Solr入門&lt;/a&gt;は。
Solr勉強会などでも何度も新しいのは出ないのですか？と聞かれていましたが、やっと出ました。（お待たせしました。）&lt;/p&gt;
&lt;p&gt;時が立つのは早いものです。前回のSolr入門はバージョン1.4にて執筆していましたが、今回は4.4をベースにし、4.5.1への対応を行っています。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20131126/intro_solr.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20131126/intro_solr.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;月曜日には手元に見本が届き、今週金曜日に発売予定です！&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;SolrCloud、SoftCommit、Spatial、Joinなど、多彩な機能についても記載してあります。
また、&lt;a href=&#34;http://manifoldcf.apache.org/ja_JP/index.html&#34;&gt;ManifoldCF&lt;/a&gt;というSolrにデータを登録するのに
利用できるコネクタフレームワークについても書いてあります。&lt;/p&gt;
&lt;p&gt;より多彩になったSolrの機能を活用するための一助となれればと思います。
（電子版も出る予定です。詳細についてはもう少々お待ちください）&lt;/p&gt;
&lt;p&gt;また、出版を記念して少し時期が先になりますが、Solr勉強会を開催しようと思います。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;日時：2014年01月29日&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://solr.doorkeeper.jp/events/7260&#34;&gt;第13回Solr勉強会 #SolrJP 新Solr本出版記念&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回はせっかくのSolr入門の書籍の出版記念ということで入門的な話をしてもらう予定です。
Solr初心者の方、Solrに興味のある方などに来ていただきたいと思っています。
（プレゼントも用意できるかも！？）&lt;/p&gt;
&lt;p&gt;ということで、「改訂版Apache Solr入門」をよろしくお願いします。
（もちろん、購入は下のリンクからですよね！）&lt;/p&gt;
&lt;iframe src=&#34;http://rcm-fe.amazon-adsystem.com/e/cm?t=johtani-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=4774161632&amp;nou=1&amp;ref=tf_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr&#34; style=&#34;width:120px;height:240px;&#34; scrolling=&#34;no&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34; frameborder=&#34;0&#34;&gt;&lt;/iframe&gt;
</content:encoded>
    </item>
    
    <item>
      <title>elasticsearch-extended-analyzeを公開？</title>
      <link>https://blog.johtani.info/blog/2013/11/14/release-elasticsearch-extended-analyze-0-dot-5/</link>
      <pubDate>Thu, 14 Nov 2013 17:55:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/11/14/release-elasticsearch-extended-analyze-0-dot-5/</guid>
      <description>&lt;p&gt;どーも。以前の記事で開発中としていたプラグインですが、とりあえず、pluginコマンドでインストール出来る形にしてみました。&lt;/p&gt;
&lt;p&gt;インストールなどについては、&lt;a href=&#34;https://github.com/johtani/elasticsearch-extended-analyze&#34;&gt;READMEに記載した&lt;/a&gt;のでそちらを参照してもらうことにして、試行錯誤した話をメモとして残しておきます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;どーも。以前の記事で開発中としていたプラグインですが、とりあえず、pluginコマンドでインストール出来る形にしてみました。&lt;/p&gt;
&lt;p&gt;インストールなどについては、&lt;a href=&#34;https://github.com/johtani/elasticsearch-extended-analyze&#34;&gt;READMEに記載した&lt;/a&gt;のでそちらを参照してもらうことにして、試行錯誤した話をメモとして残しておきます。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;プラグインの開発はしいてたのですが、やっぱりpluginコマンドでインストール出来ないと使ってもらえないよなということで、勉強会も終わったのでちょっと調べてました。&lt;/p&gt;
&lt;h2 id=&#34;プラグインコマンド&#34;&gt;プラグインコマンド&lt;/h2&gt;
&lt;p&gt;コマンドが用意されてますが、実態はJavaで実装されてて、通常はこんなかんじでプラグインをインストールします。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./bin/plugin -i elasticsearch/elasticsearch-analysis-kuromoji/1.6.0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;この「&lt;code&gt;elasticsearch/elasticsearch-analysis-kuromoji/1.6.0&lt;/code&gt;」という文字列ですが、「&lt;code&gt;ユーザ名/リポジトリ名/バージョン&lt;/code&gt;」という意味になります。&lt;/p&gt;
&lt;p&gt;で、ダウンロードするURLは以下のものの中から選ばれます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;elasticsearch.orgのダウンロード用サイト&lt;/li&gt;
&lt;li&gt;search.maven.org&lt;/li&gt;
&lt;li&gt;oss.sonatype.org&lt;/li&gt;
&lt;li&gt;Githubのarchive&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらのサイトに先ほどのユーザ名、リポジトリ名、バージョンを利用したURLを組み立てて、ダウンロードしてくれるという仕組みになっています。&lt;/p&gt;
&lt;p&gt;elasticsearch.orgについては、本家の人しかアップロードできないと思うので、なし。&lt;br&gt;
maven、sonatypeについては、Mavenのリポジトリにリリースする必要があるんじゃないかなと。
で、昔&lt;strike&gt;調べて&lt;/strike&gt;ググって途中で挫折したんですが、挫折してます。手順が結構手間で。。。
（参考記事：&lt;a href=&#34;http://samuraism.jp/diary/2012/05/03/1336047480000.html&#34;&gt;【最新版】Maven Central Repository へのライブラリ登録方法 #maven&lt;/a&gt;）&lt;/p&gt;
&lt;p&gt;ということで、Githubにアップしたらなんとかなるんじゃん？ということで色々と調査して試してみました。（結果はイマイチなんですが。。。）&lt;/p&gt;
&lt;h2 id=&#34;その１mvn-releaseprepare&#34;&gt;その１：mvn release:prepare&lt;/h2&gt;
&lt;p&gt;せっかくGithubだし、せっかくMavenなんだしなんか、pom.xmlに便利な設定したらコマンド一発でリリースできるんじゃない？という甘い気持ちで&lt;strike&gt;調査した&lt;/strike&gt;ググったらそれっぽい記事が見つかりました。
「&lt;a href=&#34;http://www.kanasansoft.com/weblab/2009/11/integration_between_maven_and_github.html&#34;&gt;MavenとGitHubの連携&lt;/a&gt;」って記事です。&lt;br&gt;
で、pom.xmlの設定にも他のプラグインを真似してコピペしたものに&lt;code&gt;&amp;lt;scm&amp;gt;&lt;/code&gt;ってタグがあったなぁと。このコマンドでついでにGithubにアップロードできるんじゃないの？ということで、試してみました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mvn release:prepare
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;このコマンドを叩くと、記事にあるとおりにいくつか質問をされます。
タグについては、&lt;code&gt;プロジェクト名-バージョン番号&lt;/code&gt;という文字列がデフォルトだと指定されているので、&lt;code&gt;v0.5&lt;/code&gt;と変更して実施してみると、Githubのreleaseにv0.5ってのができてるじゃないですか。&lt;br&gt;
※&lt;code&gt;plugin&lt;/code&gt;コマンドはGithubを見に行く時に次のファイルをダウンロードしに行きます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;https://github.com/ユーザ名/リポジトリ名/archive/vバージョン名.zip
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;やった！と思い、早速pluginコマンドを実行してみましたが、エラーが出ました。。。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Trying https://github.com/johtani/elasticsearch-extended-analyze/archive/v0.5.zip...
Downloading ...DONE
Installed johtani/elasticsearch-extended-analyze/0.5 into /Users/johtani/projects/tmp/ess_env/second_node/elasticsearch-0.90.7/plugins/extended-analyze
Usage:
    -u, --url     [plugin location]   : Set exact URL to download the plugin from
...省略...

Message:
   Error while installing plugin, reason: IllegalArgumentException: Plugin installation assumed to be site plugin, but contains source code, aborting installation.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;あらら、なんで？と。&lt;br&gt;
で、実際にgithubにアップされてたzipファイルをダウンロードしてみたら、githubのリポジトリにあるディレクトリ構成がそのまま入ってるじゃないですか。。。
そうですか、そうですよね。prepareだし、タグ打ってzipにかためてくれるだけなんですねと。。。&lt;/p&gt;
&lt;p&gt;おそらく、siteプラグイン&lt;em&gt;だけ&lt;/em&gt;の場合はこの方法でpluginコマンド叩けばOKなんでしょうが、私がダウンロードしてもらいたいのは.jarファイルが入ったzipファイルなんです。&lt;/p&gt;
&lt;p&gt;ということで、断念しました。（タグ消したりをgitコマンドで叩いて綺麗にし直すとか虚しい作業をしてました）&lt;/p&gt;
&lt;h2 id=&#34;その２githubcomのwebでリリース&#34;&gt;その２：github.comのWebでリリース&lt;/h2&gt;
&lt;p&gt;おとなしく、Sonatypeのサイトにアップロードする方向でがんばればいいんですが、とりあえず使えるようにするのが先だと思い、
github.comのページでアップロードしてしまおうと。&lt;/p&gt;
&lt;p&gt;「release」というタブをクリックすると、画面からアップロードできるようになります。&lt;br&gt;
zipファイルを作ってアップロードしました。（zipファイル自体は&lt;code&gt;mvn package&lt;/code&gt;コマンドを実行したら&lt;code&gt;target/release&lt;/code&gt;というディレクトリに作成されてる）&lt;/p&gt;
&lt;p&gt;これで行けるだろということで、またpluginコマンドを実行すると&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Trying https://github.com/johtani/elasticsearch-extended-analyze/archive/v0.5.zip...
Downloading ...DONE
Installed johtani/elasticsearch-extended-analyze/0.5 into /Users/johtani/projects/tmp/ess_env/second_node/elasticsearch-0.90.7/plugins/extended-analyze
Usage:
    -u, --url     [plugin location]   : Set exact URL to download the plugin from
...省略...

Message:
   Error while installing plugin, reason: IllegalArgumentException: Plugin installation assumed to be site plugin, but contains source code, aborting installation.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;あれ？同じエラー？なんで？jar入りのzipファイルアップロードしたのに？？？&lt;/p&gt;
&lt;p&gt;と。で、&lt;code&gt;https://github.com/johtani/elasticsearch-extended-analyze/releases&lt;/code&gt;にreleaseのページができてたので見てみると、あら。
アップロードしたファイルについては次のようなURLになってるじゃないですか。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;https://github.com/johtani/elasticsearch-extended-analyze/releases/download/v0.5/v0.5.zip
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;で、よく見ると「Source code(zip)」というボタンもあるぞ？このリンクは？&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;https://github.com/johtani/elasticsearch-extended-analyze/archive/v0.5.zip
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;。。。あぁ。そうですか。そういうことですか。理解してない私が悪いんですねと。&lt;/p&gt;
&lt;h2 id=&#34;結論&#34;&gt;結論？&lt;/h2&gt;
&lt;p&gt;ということで、とりあえず、releaseにjar入りファイルはアップロードできた（手動で）ので
&lt;code&gt;-u&lt;/code&gt;オプションで直接URL指定すればインストールできるだろ！と諦めました。
いい勉強になりました。。。&lt;/p&gt;
&lt;p&gt;README見ていただくとインストール方法が分かりますが、長いです。。。&lt;/p&gt;
&lt;p&gt;時間をとって本腰入れてSonatypeにMavenコマンドでアップロードできるようにしようかな。。。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第2回elasticsearch勉強会を開催しました！ #elasticsearchjp</title>
      <link>https://blog.johtani.info/blog/2013/11/12/elasticsearch-japan-user-meetup-no2/</link>
      <pubDate>Tue, 12 Nov 2013 18:16:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/11/12/elasticsearch-japan-user-meetup-no2/</guid>
      <description>&lt;p&gt;第2回を開催しました！
すごい、140人くらいの参加登録者（参加者は１００人ちょっと！）がいて、びっくりです。
ステキな会場を提供していただいた、&lt;a href=&#34;http://recruit-tech.co.jp/recruitment/&#34;&gt;リクルートテクノロジーズ&lt;/a&gt;さん、運営していただいた方々、スピーカーの皆さん、参加者の皆さん本当にありがとうございました。
今回も素敵な看板ありがとうございます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;第2回を開催しました！
すごい、140人くらいの参加登録者（参加者は１００人ちょっと！）がいて、びっくりです。
ステキな会場を提供していただいた、&lt;a href=&#34;http://recruit-tech.co.jp/recruitment/&#34;&gt;リクルートテクノロジーズ&lt;/a&gt;さん、運営していただいた方々、スピーカーの皆さん、参加者の皆さん本当にありがとうございました。
今回も素敵な看板ありがとうございます。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:300&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20131112/es_signboard.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20131112/es_signboard.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;今回もしっかり楽しめたので、次回も頑張ります！&lt;/p&gt;
&lt;p&gt;今回は、&lt;a href=&#34;https://groups.google.com/forum/#!forum/elasticsearch-jp&#34;&gt;elasticsearch-jp&lt;/a&gt;MLの紹介とかをできたのでよかったかなぁと。
ぜひ、活用してください！どんな質問でもいいので。&lt;/p&gt;
&lt;p&gt;あと、スライドに入ってた例の本もよろしくです。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;ということで、懇親会も盛り上がったし楽しかったです。
今後も場の提供＋自分の勉強のトリガーとして、開催していくので、ご協力お願いします！
聞きたい話など、MLや@ツイートしていただければと。&lt;/p&gt;
&lt;h2 id=&#34;elasticsearchのrouting機能株式会社シーマーク大谷純johtani&#34;&gt;elasticsearchのRouting機能：株式会社シーマーク　大谷　純　（@johtani）&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://blog.johtani.info/images/entries/20131112/About_es_routing.pdf&#34;&gt;Routing機能&lt;/a&gt;※スライドはPDFです。&lt;/p&gt;
&lt;p&gt;ド緊張で、大した発表ではなかったですが。。。
どちらかと言うとSolr本の紹介だったかもなぁ。スミマセン。&lt;/p&gt;
&lt;p&gt;※スライドが一部文字が消えてるので、作りなおすかも。&lt;/p&gt;
&lt;h2 id=&#34;elasticsearchを使ったbaas基盤の開発仮株式会社富士通ソフトウェアテクノロジーズ-滝田聖己さんpisatoshi&#34;&gt;ElasticSearchを使ったBaaS基盤の開発(仮)：株式会社富士通ソフトウェアテクノロジーズ 滝田聖己さん（@pisatoshi）&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://speakerdeck.com/pisatoshi/elasticsearch-trial-and-error&#34;&gt;https://speakerdeck.com/pisatoshi/elasticsearch-trial-and-error&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本日はお越しいただきありがとうございました！しかも静岡から！今後もよろしくお願い致します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;EnchantMoonでシステム構成ｗ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;0.17.0から利用されていると。（スゴイ）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;プライマリのデータストア！ただし、登録元データはMySQLにもある。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;階層も深く、大きめのドキュメント。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;レプリカ１、インデックスのバックアップも取ってないと。。。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ルーティングの機能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DynamicMappingの問題点&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;マッピング定義が肥大、型がコンフリクト。。。苦労しっぱなし&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;データ登録は１台にして、１台で一気に登録してから再配置&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;実際に運用とかされてるので、いろんなノウハウがまだまだありそう！&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;kibana入門水戸祐介さんy_310&#34;&gt;Kibana入門：水戸祐介さん（@y_310）&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://speakerdeck.com/y310/kibanaru-men&#34;&gt;https://speakerdeck.com/y310/kibanaru-men&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;（やっぱりru-menになってるｗ）&lt;/p&gt;
&lt;p&gt;実は、押しかけて話してもらうように説得したのでした。今後もよろしくです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;COOKPADの方によるKibanaのお話。&lt;/li&gt;
&lt;li&gt;Kibanaの利点とかなんで？とか。&lt;/li&gt;
&lt;li&gt;画面構成の説明から&lt;/li&gt;
&lt;li&gt;ダッシュボードは必ず保存して！リロードしたら悲しい思いをしてしまうので。&lt;/li&gt;
&lt;li&gt;sparkline便利そうだなぁ。ほんとに、データサイエンティスト系のツールを目指してるのかな&lt;/li&gt;
&lt;li&gt;一通り、ダッシュボードに配置できるパネルの説明してもらえたのですごく参考になりました！&lt;/li&gt;
&lt;li&gt;Tips周りが役に立ちそう。not_analyzedは重要ですよね。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;lt&#34;&gt;LT&lt;/h2&gt;
&lt;h3 id=&#34;データ集計用ダッシュボードブラウザとしても使えるelasticsearchkibana-v3を利用する際の運用ノウハウ紹介株式会社リブセンス-ykentaro-さん-yoshi_ken-さん&#34;&gt;「データ集計用ダッシュボードブラウザとしても使えるElasticSearch＋Kibana v3を利用する際の運用ノウハウ紹介」：株式会社リブセンス Y.Kentaro さん (@yoshi_ken) さん&lt;/h3&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/y-ken/elasticsearch-kibnana-fluentd-management-tips&#34;&gt;http://www.slideshare.net/y-ken/elasticsearch-kibnana-fluentd-management-tips&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kibanaの紹介とかFluentdの紹介。&lt;/li&gt;
&lt;li&gt;Tips満載すばらしい。&lt;/li&gt;
&lt;li&gt;JDBC riverは0.90.6ではうまく動かないので、気をつけてと。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;fluentd-as-a-kibanarepeatedly-さん&#34;&gt;「Fluentd as a Kibana」：@repeatedly さん&lt;/h3&gt;
&lt;p&gt;スライド(gist)？：&lt;a href=&#34;https://gist.github.com/repeatedly/7427856&#34;&gt;https://gist.github.com/repeatedly/7427856&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Kibanaがfluentdの中で動くと！？&lt;/p&gt;
&lt;h3 id=&#34;authプラグインでアクセスコントロール株式会社エヌツーエスエム-菅谷信介さん-shinsuke_sugaya&#34;&gt;「Authプラグインでアクセスコントロール」：株式会社エヌツーエスエム 菅谷信介さん (@shinsuke_sugaya)&lt;/h3&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/shinsuke/es-auth-plugin&#34;&gt;http://www.slideshare.net/shinsuke/es-auth-plugin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;API毎？インデックスごと？にアクセス制御ができるプラグイン&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Cloudera World Tokyo 2013に参加しました！ #cwt2013 </title>
      <link>https://blog.johtani.info/blog/2013/11/07/cloudera-world-tokyo-2013/</link>
      <pubDate>Thu, 07 Nov 2013 10:11:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/11/07/cloudera-world-tokyo-2013/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.cloudera.co.jp/jpevents/cwt2013/index.html&#34;&gt;Cloudera World Tokyo 2013&lt;/a&gt;に参加してきました。&lt;/p&gt;
&lt;p&gt;午前中はあいにくの雨でしたが、それでも結構な人数が最初の基調講演から参加されてました。
私が参加したセッションは大盛況な感じでした。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;http://www.cloudera.co.jp/jpevents/cwt2013/index.html&#34;&gt;Cloudera World Tokyo 2013&lt;/a&gt;に参加してきました。&lt;/p&gt;
&lt;p&gt;午前中はあいにくの雨でしたが、それでも結構な人数が最初の基調講演から参加されてました。
私が参加したセッションは大盛況な感じでした。&lt;/p&gt;
&lt;p&gt;おみやげとしてカステラも頂いちゃいました！&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:300&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20131107/kasutera.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20131107/kasutera.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;また、色々なセッションに現れたこんなメッセージ画像も見つけました！&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p&gt;昨日の写真データの整理をしていたら、こんなものが・・・ &lt;a href=&#34;https://twitter.com/shiumachi&#34;&gt;@shiumachi&lt;/a&gt; さんよ・・・ &lt;a href=&#34;https://twitter.com/search?q=%23cwt2013&amp;amp;src=hash&#34;&gt;#cwt2013&lt;/a&gt; &lt;a href=&#34;http://t.co/S0JsxSYXIx&#34;&gt;pic.twitter.com/S0JsxSYXIx&lt;/a&gt;&lt;/p&gt;&amp;mdash; Kenichiro HAMANO (@hamaken) &lt;a href=&#34;https://twitter.com/hamaken/statuses/398613935399510016&#34;&gt;November 8, 2013&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;//platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;!-- more --&gt;
&lt;p&gt;やっぱり、スーツの人が多いなという印象。&lt;/p&gt;
&lt;p&gt;名刺を毎回回収されるのはちょっとつらかったです。なにか、いい方法ないですかねぇ。&lt;/p&gt;
&lt;p&gt;以下はいつもの個人メモです。&lt;/p&gt;
&lt;h2 id=&#34;ビッグデータプラットフォームとして進化するhadoop&#34;&gt;「ビッグデータプラットフォームとして進化するHadoop」&lt;/h2&gt;
&lt;h4 id=&#34;cloudera株式会社代表取締役ジュセッペ小林氏&#34;&gt;Cloudera株式会社　代表取締役　ジュセッペ小林氏&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Costcoなどの写真を元にビッグデータを可視化&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;bigdataとhadoopの関係&#34;&gt;BigDataとHadoopの関係&lt;/h3&gt;
&lt;p&gt;検索、SQL、機会学習、数理処理、データ管理などにもHadoopの活用されつつある。
セキュリティ、データ管理、クラスタ上でのツールの実行なども増えてきてる。&lt;/p&gt;
&lt;p&gt;「今日ビッグデータは明日のスモールデータ」&lt;/p&gt;
&lt;h4 id=&#34;アーキテクチャとしてのビッグデータ&#34;&gt;アーキテクチャとしてのビッグデータ&lt;/h4&gt;
&lt;p&gt;多種多様なデータを一箇所に集約し、生データを直接活用できる。
OSSとしての責任も。&lt;/p&gt;
&lt;h3 id=&#34;データサイエンス&#34;&gt;データサイエンス&lt;/h3&gt;
&lt;p&gt;Opsだけでないデータ解析にも活用&lt;/p&gt;
&lt;h2 id=&#34;clouderaのビッグデータプラットフォーム戦略仮&#34;&gt;「Clouderaのビッグデータプラットフォーム戦略」（仮）&lt;/h2&gt;
&lt;h4 id=&#34;講師cloudera-inc-cto-dramr-awadallah&#34;&gt;講師：Cloudera, Inc. CTO Dr.Amr Awadallah&lt;/h4&gt;
&lt;p&gt;レガシーな情報アーキテクチャ→スケールできない、可視化の限界、硬直したスキーマなどなど。&lt;/p&gt;
&lt;p&gt;エンタープライズデータハブとしてのHadoopとか。&lt;/p&gt;
&lt;h2 id=&#34;ビッグデータの歴史と将来展望&#34;&gt;ビッグデータの歴史と将来展望&lt;/h2&gt;
&lt;h4 id=&#34;講師国立情報学研究所アーキテクチャ科学研究系教授佐藤一郎氏&#34;&gt;講師：国立情報学研究所　アーキテクチャ科学研究系　教授　佐藤一郎氏&lt;/h4&gt;
&lt;h3 id=&#34;ビッグデータの歴史的経緯とか&#34;&gt;ビッグデータの歴史的経緯とか&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;最初の事例はアメリカの1880年国勢調査。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;「ビッグデータがコンピュータを生み出した」。コンピュータがビッグデータを生み出したんじゃない。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;少量データにもHadoopを&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;バッチ処理のリアルタイム化とか（一晩から10分へ）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;原点は検索データのインデクシング&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hadoopを使うのが目的じゃないんだから、構築には手を掛けないのがいいよね。&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;分散システム研究者から見たhadoop&#34;&gt;分散システム研究者から見たHadoop&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;分散システムの難しさを、処理範囲を限定することで巧みに回避&lt;/li&gt;
&lt;li&gt;データの近くで処理&lt;/li&gt;
&lt;li&gt;研究レベルではリアルタイム化や逐次処理化が活発&lt;/li&gt;
&lt;li&gt;全工程で逐次・リアルタイムが必要とは限らない&lt;/li&gt;
&lt;li&gt;聞いてばかりじゃなくて、動かしてみましょう。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;データサイエンス超並列分散処理を活用した新たなビジネス価値の創出&#34;&gt;データサイエンス：超並列分散処理を活用した新たなビジネス価値の創出&lt;/h2&gt;
&lt;h4 id=&#34;講師アクセンチュア株式会社工藤卓哉氏&#34;&gt;講師：アクセンチュア株式会社　工藤卓哉氏&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;「日経BPのビッグデータ総覧2013」に記事書いてる。&lt;/li&gt;
&lt;li&gt;多様化するデータ（社外のデータも）をどうやってうまく活用していくか。&lt;/li&gt;
&lt;li&gt;データが教えてくれたこと→まず、データありき、まずデータためましょう。それから解析とかすればいいのでは？というはなし？&lt;/li&gt;
&lt;li&gt;競合他社さんはNGだけど、ブースでデモ？実機？が見れますと。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;hadoopデータプラットフォーム&#34;&gt;Hadoopデータプラットフォーム&lt;/h2&gt;
&lt;h4 id=&#34;cloudera株式会社嶋内翔氏&#34;&gt;Cloudera株式会社　嶋内　翔氏&lt;/h4&gt;
&lt;h3 id=&#34;まずは宣伝&#34;&gt;まずは宣伝&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cloudera Implaraのフリーブックの日本語版&lt;/li&gt;
&lt;li&gt;Hadoop Operationの書籍でるよ&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;プラットフォームを構成するもの&#34;&gt;プラットフォームを構成するもの&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Flume&lt;/li&gt;
&lt;li&gt;Sqoop&lt;/li&gt;
&lt;li&gt;HBase&lt;/li&gt;
&lt;li&gt;Hive&lt;/li&gt;
&lt;li&gt;Impala&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;データ登録してbiアナリストのお仕事にどうやって役立てる&#34;&gt;データ登録してBIアナリストのお仕事にどうやって役立てる？&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;外部テーブル：Hiveからはテーブルのように見える仕組み。元ファイルは消えない&lt;/li&gt;
&lt;li&gt;SerDe（さーでぃー）：データをHiveレコードに変換する仕組み&lt;/li&gt;
&lt;li&gt;生データを少し加工しましょう
&lt;ul&gt;
&lt;li&gt;圧縮したりファイル結合したりはしときましょう。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Hadoop活用のポイント
&lt;ul&gt;
&lt;li&gt;富豪的プログラミング。リソースケチるな。&lt;/li&gt;
&lt;li&gt;ローカルでできることはローカル。むりにHadoopでやんなくてもいいですよねと。バランス重要&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;スケジューリング実行などはOozie使うと便利。（日次集計とか）&lt;/li&gt;
&lt;li&gt;Cloudera Searchで元データにインデックス貼れるぞと。検索しながら分析ができる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;クラスタ管理とか&#34;&gt;クラスタ管理とか&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cloudera manager便利ですよ&lt;/li&gt;
&lt;li&gt;ストレージリソースの管理。
&lt;ul&gt;
&lt;li&gt;声掛け、管理者が容量チェック、Cloudera Managerのレポート&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;少数精鋭でHadoop使おう＝手が回らなくなる。&lt;/li&gt;
&lt;li&gt;みんなで使おう＝Kerberos認証とか管理をちゃんと考えないと。けど、文化が根付けば強力。Sentry、Cloudera Navigatorとか。&lt;/li&gt;
&lt;li&gt;Hadoopシステムの全体構成図。データの流れと各製品のつながり。&lt;/li&gt;
&lt;li&gt;We are hiring!ということで、興味のある方は@shiumachiさんにコンタクトをとりましょうとのこと。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;sqlで実現するバッチ処理とストリーム処理&#34;&gt;SQLで実現するバッチ処理とストリーム処理&lt;/h2&gt;
&lt;h4 id=&#34;line株式会社田籠-聡氏&#34;&gt;LINE株式会社　田籠 聡氏&lt;/h4&gt;
&lt;p&gt;資料：&lt;a href=&#34;http://www.slideshare.net/tagomoris/batch-and-stream-processing-with-sql&#34;&gt;Batch and Stream processing with SQL&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;LINEのキャラがちらほら出てきた。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SQL好きですか？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ログの量とか。2.1TB/Day&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;バッチ処理とストリーム&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;速い集計のためにHadoopが重要&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;エラー系のログとかはストリームで処理したい&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アーキテクチャ説明&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;データ解析する人って色々。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;管理者&lt;/li&gt;
&lt;li&gt;プログラマ&lt;/li&gt;
&lt;li&gt;サービスディレクタ&lt;/li&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;li&gt;
&lt;p&gt;顔あげたらHiveアイコンだらけだったｗ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Shibとか。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;なんでHiveに限るの？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hiveに着目したバージョンアップだけを考えれば良くなる。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;スケジュールクエリが増えてきて、つらい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TimeWindowを固定して集計処理をすることで、回避できる。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;norikra&#34;&gt;Norikra!!&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;スキーマレス&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OSS。Esperベース。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;インストールが楽&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;クエリの動作のお話。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://norikra.github.io&#34;&gt;http://norikra.github.io&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We Are Hiring!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;hadoop-コミュニティと-yarn-の現状&#34;&gt;Hadoop コミュニティと YARN の現状&lt;/h2&gt;
&lt;h4 id=&#34;日本電信電話株式会社小沢-健史氏&#34;&gt;日本電信電話株式会社　小沢 健史氏&lt;/h4&gt;
&lt;h3 id=&#34;なんでhadoop&#34;&gt;なんでHadoop？&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;PostgreSQLでやってたけど、大きなデータにはHadoopを使おうという感じになってきた。&lt;/li&gt;
&lt;li&gt;なんで使い分けるの？
&lt;ul&gt;
&lt;li&gt;スキーマ後付け&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;NTTDocomoのモバイル位置情報の統計処理とか？&lt;/li&gt;
&lt;li&gt;技術的な話をするので、HiveTに着替えます！ｗ&lt;/li&gt;
&lt;li&gt;YARNのなにが嬉しいの？
&lt;ul&gt;
&lt;li&gt;ImpalaとMapReduceが同時に動くような環境の時に、リソースをうまく管理できないのがV1&lt;/li&gt;
&lt;li&gt;そこでYARN&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Apache Mesosとだいたい一緒。&lt;/li&gt;
&lt;li&gt;Apache MesosとYARNの比較&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Riak Meetup #3 #riakjp に参加しました。</title>
      <link>https://blog.johtani.info/blog/2013/11/06/riak-meetup-tokyo-no3/</link>
      <pubDate>Wed, 06 Nov 2013 23:01:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/11/06/riak-meetup-tokyo-no3/</guid>
      <description>&lt;p&gt;またまた、&lt;a href=&#34;http://connpass.com/event/3600/&#34;&gt;Riak Meetup Tokyo #3&lt;/a&gt;に参加してきました。Riak2.0のYokozunaの話があると聞いたので。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:300&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20131107/bakusoku.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20131107/bakusoku.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;ということで、いつものように個人メモです。&lt;/p&gt;
&lt;!--  more --&gt;
&lt;p&gt;今日は自重して、懇親会はアルコールなしにしました。思いがけずfluentd＋elasticsearch+kibanaという組み合わせの話も聞けて大満足です。
Yokozunaのデモが見れなかったのがちょっと残念だったかなぁ。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;またまた、&lt;a href=&#34;http://connpass.com/event/3600/&#34;&gt;Riak Meetup Tokyo #3&lt;/a&gt;に参加してきました。Riak2.0のYokozunaの話があると聞いたので。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:300&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20131107/bakusoku.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20131107/bakusoku.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;ということで、いつものように個人メモです。&lt;/p&gt;
&lt;!--  more --&gt;
&lt;p&gt;今日は自重して、懇親会はアルコールなしにしました。思いがけずfluentd＋elasticsearch+kibanaという組み合わせの話も聞けて大満足です。
Yokozunaのデモが見れなかったのがちょっと残念だったかなぁ。&lt;/p&gt;
&lt;p&gt;少しだけSolr本の宣伝もしてきちゃいました。&lt;/p&gt;
&lt;h2 id=&#34;古城さんmixi-riakcsとmixi-プライベートクラウド環境&#34;&gt;古城さん@Mixi 「RiakCSとmixi プライベートクラウド環境」&lt;/h2&gt;
&lt;h3 id=&#34;プライベートクラウドとは&#34;&gt;プライベートクラウドとは？&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;計算リソースが安い（ストレージは微妙）&lt;/li&gt;
&lt;li&gt;開発者が好きに使える環境＋運用側のチケットに追われる毎日からの開放&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;riak-csの概要&#34;&gt;Riak CSの概要&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;S3互換の分散ファイルストレージ&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;検証とか&#34;&gt;検証とか&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;検証時はRiak CS 1.3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;5ノードで2Mファイルを40万個&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;削除は遅延で削除される&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PUT性能とか。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Riak CSの死活監視にはRiakのstatsとか&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;クラスタ&#34;&gt;クラスタ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;クラスタは3つ。ログ、サービス（画像） 、バックアップ保存用&lt;/li&gt;
&lt;li&gt;ログの収集にfluentd、解析に&lt;strong&gt;elasticsearch&lt;/strong&gt;や&lt;strong&gt;kibana&lt;/strong&gt;を使っているらしい。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;篠原basho-riak-20-分散データ型セキュリティそしてより容易な運用へ&#34;&gt;篠原＠Basho 「Riak 2.0: 分散データ型、セキュリティ、そしてより容易な運用へ」&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;riak 2.0 pre5をリリース&lt;/li&gt;
&lt;li&gt;アプリ向け機能強化、運用の容易性&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;設計ポリシーとか1xとか&#34;&gt;設計ポリシーとか、1.xとか&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;運用、高可用性、水平拡張性&lt;/li&gt;
&lt;li&gt;Capabilityネゴシエーションとか&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;20の機能強化&#34;&gt;2.0の機能強化&lt;/h3&gt;
&lt;h4 id=&#34;バケットタイプ&#34;&gt;バケットタイプ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;キーの名前空間としてバケットがあったけど、同種のバケットをまとめて管理とかしたくなった。&lt;/li&gt;
&lt;li&gt;データ型の導入（CRDT）&lt;/li&gt;
&lt;li&gt;Setデータ型&lt;/li&gt;
&lt;li&gt;セキュリティとか&lt;/li&gt;
&lt;li&gt;強い整合性&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;鈴木basho-yokozuna-riak-20の新しい全文検索機能&#34;&gt;鈴木@Basho 「Yokozuna: Riak 2.0の新しい全文検索機能」&lt;/h2&gt;
&lt;h3 id=&#34;yokozunaやsolrの概要&#34;&gt;YokozunaやSolrの概要&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;1ノードにRiakとSolrが1プロセスずつ&lt;/li&gt;
&lt;li&gt;SolrプロセスはRiakが管理してくれる&lt;/li&gt;
&lt;li&gt;SolrCloudは使ってません。&lt;/li&gt;
&lt;li&gt;Riakのノードに届いたデータをSolrに裏で書き込んでくれる。&lt;/li&gt;
&lt;li&gt;検索時にはRiakのノードが分散検索をしてくれる&lt;/li&gt;
&lt;li&gt;X-Riak-Metaもインデクシングしてくれる。jsonやxmlの各要素をSolrのフィールドとして認識してくれる。&lt;/li&gt;
&lt;li&gt;Extractor&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Solrは4.4で、JVMは1.7をユーザが入れるらしい。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>elasticsearch-extended-analyzeの改良</title>
      <link>https://blog.johtani.info/blog/2013/11/04/improve-output-extended-analyze/</link>
      <pubDate>Mon, 04 Nov 2013 22:12:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/11/04/improve-output-extended-analyze/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2013/10/25/developing-es-extended-analyze-plugin/&#34;&gt;開発中です&lt;/a&gt;と書きました、&lt;a href=&#34;https://github.com/johtani/elasticsearch-extended-analyze&#34;&gt;elasticsearch-extended-analyze&lt;/a&gt;ですが、改良しました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;改良と変更は以下のとおりです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ソースのパッケージを&lt;code&gt;org.elasticsearch&lt;/code&gt;から&lt;code&gt;info.johtani&lt;/code&gt;に。MLで気になったので質問したら、変えたほうがいいよとのこと。ダウンロード化については、もう少々お待ちを。&lt;/li&gt;
&lt;li&gt;出力形式を変更。可能な限りCharFilter、Tokenizer、TokenFilterそれぞれが出力する内容を返すようにしました。
&lt;ul&gt;
&lt;li&gt;ただし、既存のAnalyzer（JapaneseAnalyzerクラスとか）に関しては、現時点では出力しません。CharFilterなどを取得するI/Fが見えないためです。（改良できるかの調査は未着手）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;現時点でできてないのは以下の項目&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2013/10/25/developing-es-extended-analyze-plugin/&#34;&gt;開発中です&lt;/a&gt;と書きました、&lt;a href=&#34;https://github.com/johtani/elasticsearch-extended-analyze&#34;&gt;elasticsearch-extended-analyze&lt;/a&gt;ですが、改良しました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;改良と変更は以下のとおりです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ソースのパッケージを&lt;code&gt;org.elasticsearch&lt;/code&gt;から&lt;code&gt;info.johtani&lt;/code&gt;に。MLで気になったので質問したら、変えたほうがいいよとのこと。ダウンロード化については、もう少々お待ちを。&lt;/li&gt;
&lt;li&gt;出力形式を変更。可能な限りCharFilter、Tokenizer、TokenFilterそれぞれが出力する内容を返すようにしました。
&lt;ul&gt;
&lt;li&gt;ただし、既存のAnalyzer（JapaneseAnalyzerクラスとか）に関しては、現時点では出力しません。CharFilterなどを取得するI/Fが見えないためです。（改良できるかの調査は未着手）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;現時点でできてないのは以下の項目&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pluginコマンドでインストール&lt;/li&gt;
&lt;li&gt;出力したいAttributeの指定&lt;/li&gt;
&lt;li&gt;TokenizeChainで変更されたTokenの追跡（現状はどのTokenがStopFilterで消されたかなどが不明）&lt;/li&gt;
&lt;li&gt;画面の用意（簡単に確認できる画面）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ということで、README.mdに出力サンプルは貼り付けてるので、興味のある方は試してみてください。
不明点などあれば、コメントかIssueかツイートでも。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>elasticsearch-extended-analyzeプラグインを開発中</title>
      <link>https://blog.johtani.info/blog/2013/10/25/developing-es-extended-analyze-plugin/</link>
      <pubDate>Fri, 25 Oct 2013 19:06:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/10/25/developing-es-extended-analyze-plugin/</guid>
      <description>&lt;p&gt;お久しぶりです。
気づいたらまた、結構ブログを書いてなかったです。。。&lt;/p&gt;
&lt;p&gt;今回は、今開発しているElasticsearchのプラグインに関するお話です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;お久しぶりです。
気づいたらまた、結構ブログを書いてなかったです。。。&lt;/p&gt;
&lt;p&gt;今回は、今開発しているElasticsearchのプラグインに関するお話です。&lt;/p&gt;
&lt;p&gt;いやぁ、名前決めるの難しいですね。これで英語的に合ってるか不安ですが、&lt;a href=&#34;https://github.com/johtani/elasticsearch-extended-analyze&#34;&gt;elasticsearch-extended-analyze&lt;/a&gt;というプラグインを作っています。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;どんなもの&#34;&gt;どんなもの？&lt;/h2&gt;
&lt;p&gt;Solrの管理画面のanalysisに相当する機能が欲しくて作り始めました。&lt;/p&gt;
&lt;p&gt;Elasticsearchには&lt;a href=&#34;http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-analyze.html&#34;&gt;analyze API&lt;/a&gt;というAPI（名前あってるのかなぁ?）が存在します。&lt;br&gt;
これは、文字列を投げると、指定したアナライザやトークナイザでどのようなトークンに分割されるかを調べることができるAPIです。&lt;/p&gt;
&lt;p&gt;例えば、&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch-analysis-kuromoji&#34;&gt;elasticsearch-analysis-kuromoji&lt;/a&gt;をインストールしたElasticsearchに対して、以下のcurlコマンドを実行します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curl -XPOST &amp;#39;localhost:9200/_analyze?tokenizer=kuromoji_tokenizer&amp;amp;filters=kuromoji_baseform&amp;amp;pretty&amp;#39; -d &amp;#39;寿司が美味しい&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&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-json&#34; data-lang=&#34;json&#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;&amp;#34;tokens&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:#f92672&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;寿司&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:#f92672&#34;&gt;&amp;#34;start_offset&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;&amp;#34;end_offset&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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;&amp;#34;type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;word&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:#f92672&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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:#f92672&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;が&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:#f92672&#34;&gt;&amp;#34;start_offset&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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;&amp;#34;end_offset&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;3&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;&amp;#34;type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;word&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:#f92672&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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:#f92672&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;美味しい&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:#f92672&#34;&gt;&amp;#34;start_offset&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;3&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;&amp;#34;end_offset&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;7&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;&amp;#34;type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;word&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:#f92672&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;3&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;トークナイズの結果がわかるのは嬉しいのですが、どんな品詞なのかといったKuromoji固有のTokenの属性情報がなくなってしまいます。&lt;/p&gt;
&lt;p&gt;Solrでは、こんな画面が用意されていて、品詞情報とかが出力されます。あとは、各TokenFilterでどのトークンがなくなっているかなどもわかるようになっています。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20131025/solr_admin_analysis.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20131025/solr_admin_analysis.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;これって結構役立つと思うんですよ。
ということで、Pluginも作ってみたかったので、いい機会だから作ってみようかと。&lt;/p&gt;
&lt;h2 id=&#34;出力サンプル&#34;&gt;出力サンプル&lt;/h2&gt;
&lt;p&gt;まずは、その他のAttribute（品詞とか）を表示するところを実装してみました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curl -XPOST &amp;#39;localhost:9200/_extended_analyze?tokenizer=kuromoji_tokenizer&amp;amp;filters=kuromoji_baseform&amp;amp;pretty&amp;#39; -d &amp;#39;寿司が美味しい&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;先ほどとほぼ一緒のcurlコマンドを実行します。違う点は**「_analyze」&lt;strong&gt;が&lt;/strong&gt;「_extended_analyze」**となっている点です。&lt;br&gt;
で、実行結果はこんな感じです。（長いですがそのまま載せてます。続きの文章がしたにあります。）&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{
  &amp;#34;tokens&amp;#34; : [ {
    &amp;#34;token&amp;#34; : &amp;#34;寿司&amp;#34;,
    &amp;#34;start_offset&amp;#34; : 0,
    &amp;#34;end_offset&amp;#34; : 2,
    &amp;#34;type&amp;#34; : &amp;#34;word&amp;#34;,
    &amp;#34;position&amp;#34; : 1,
    &amp;#34;extended_attributes&amp;#34; : [ {
      &amp;#34;org.apache.lucene.analysis.tokenattributes.TermToBytesRefAttribute#bytes&amp;#34; : &amp;#34;[e5 af bf e5 8f b8]&amp;#34;
    }, {
      &amp;#34;org.apache.lucene.analysis.tokenattributes.PositionLengthAttribute#positionLength&amp;#34; : 1
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.BaseFormAttribute#baseForm&amp;#34; : null
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.PartOfSpeechAttribute#partOfSpeech&amp;#34; : &amp;#34;名詞-一般&amp;#34;
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.PartOfSpeechAttribute#partOfSpeech (en)&amp;#34; : &amp;#34;noun-common&amp;#34;
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.ReadingAttribute#reading&amp;#34; : &amp;#34;スシ&amp;#34;
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.ReadingAttribute#reading (en)&amp;#34; : &amp;#34;sushi&amp;#34;
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.ReadingAttribute#pronunciation&amp;#34; : &amp;#34;スシ&amp;#34;
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.ReadingAttribute#pronunciation (en)&amp;#34; : &amp;#34;sushi&amp;#34;
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.InflectionAttribute#inflectionType&amp;#34; : null
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.InflectionAttribute#inflectionType (en)&amp;#34; : null
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.InflectionAttribute#inflectionForm&amp;#34; : null
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.InflectionAttribute#inflectionForm (en)&amp;#34; : null
    }, {
      &amp;#34;org.apache.lucene.analysis.tokenattributes.KeywordAttribute#keyword&amp;#34; : false
    } ]
  }, {
    &amp;#34;token&amp;#34; : &amp;#34;が&amp;#34;,
    &amp;#34;start_offset&amp;#34; : 2,
    &amp;#34;end_offset&amp;#34; : 3,
    &amp;#34;type&amp;#34; : &amp;#34;word&amp;#34;,
    &amp;#34;position&amp;#34; : 2,
    &amp;#34;extended_attributes&amp;#34; : [ {
      &amp;#34;org.apache.lucene.analysis.tokenattributes.TermToBytesRefAttribute#bytes&amp;#34; : &amp;#34;[e3 81 8c]&amp;#34;
    }, {
      &amp;#34;org.apache.lucene.analysis.tokenattributes.PositionLengthAttribute#positionLength&amp;#34; : 1
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.BaseFormAttribute#baseForm&amp;#34; : null
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.PartOfSpeechAttribute#partOfSpeech&amp;#34; : &amp;#34;助詞-格助詞-一般&amp;#34;
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.PartOfSpeechAttribute#partOfSpeech (en)&amp;#34; : &amp;#34;particle-case-misc&amp;#34;
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.ReadingAttribute#reading&amp;#34; : &amp;#34;ガ&amp;#34;
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.ReadingAttribute#reading (en)&amp;#34; : &amp;#34;ga&amp;#34;
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.ReadingAttribute#pronunciation&amp;#34; : &amp;#34;ガ&amp;#34;
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.ReadingAttribute#pronunciation (en)&amp;#34; : &amp;#34;ga&amp;#34;
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.InflectionAttribute#inflectionType&amp;#34; : null
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.InflectionAttribute#inflectionType (en)&amp;#34; : null
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.InflectionAttribute#inflectionForm&amp;#34; : null
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.InflectionAttribute#inflectionForm (en)&amp;#34; : null
    }, {
      &amp;#34;org.apache.lucene.analysis.tokenattributes.KeywordAttribute#keyword&amp;#34; : false
    } ]
  }, {
    &amp;#34;token&amp;#34; : &amp;#34;美味しい&amp;#34;,
    &amp;#34;start_offset&amp;#34; : 3,
    &amp;#34;end_offset&amp;#34; : 7,
    &amp;#34;type&amp;#34; : &amp;#34;word&amp;#34;,
    &amp;#34;position&amp;#34; : 3,
    &amp;#34;extended_attributes&amp;#34; : [ {
      &amp;#34;org.apache.lucene.analysis.tokenattributes.TermToBytesRefAttribute#bytes&amp;#34; : &amp;#34;[e7 be 8e e5 91 b3 e3 81 97 e3 81 84]&amp;#34;
    }, {
      &amp;#34;org.apache.lucene.analysis.tokenattributes.PositionLengthAttribute#positionLength&amp;#34; : 1
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.BaseFormAttribute#baseForm&amp;#34; : null
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.PartOfSpeechAttribute#partOfSpeech&amp;#34; : &amp;#34;形容詞-自立&amp;#34;
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.PartOfSpeechAttribute#partOfSpeech (en)&amp;#34; : &amp;#34;adjective-main&amp;#34;
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.ReadingAttribute#reading&amp;#34; : &amp;#34;オイシイ&amp;#34;
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.ReadingAttribute#reading (en)&amp;#34; : &amp;#34;oishii&amp;#34;
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.ReadingAttribute#pronunciation&amp;#34; : &amp;#34;オイシイ&amp;#34;
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.ReadingAttribute#pronunciation (en)&amp;#34; : &amp;#34;oishii&amp;#34;
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.InflectionAttribute#inflectionType&amp;#34; : &amp;#34;形容詞・イ段&amp;#34;
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.InflectionAttribute#inflectionType (en)&amp;#34; : &amp;#34;adj-group-i&amp;#34;
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.InflectionAttribute#inflectionForm&amp;#34; : &amp;#34;基本形&amp;#34;
    }, {
      &amp;#34;org.apache.lucene.analysis.ja.tokenattributes.InflectionAttribute#inflectionForm (en)&amp;#34; : &amp;#34;base&amp;#34;
    }, {
      &amp;#34;org.apache.lucene.analysis.tokenattributes.KeywordAttribute#keyword&amp;#34; : false
    } ]
  } ]
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;先ほどの結果に**「extended_attributes」**という配列のオブジェクトが追加された形になっています。
ちょっと長くなってしまいましたが。。。&lt;/p&gt;
&lt;p&gt;Solrの処理を真似して作ったので大したことはやってないんですが、少しは便利になるかもなぁと。&lt;/p&gt;
&lt;p&gt;現時点では、最終的な結果しか取得できないですが、今後は次のような機能を作っていこうかと思っています。
できるかどうかは、やってみてって感じですが。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pluginコマンドでインストール
&lt;ul&gt;
&lt;li&gt;pom.xmlはありますが、まだMavenとかに登録はされていません。ですので、&lt;code&gt;mvn package&lt;/code&gt;してからjarファイルをpluginsフォルダに配置しないといけません。pluginコマンドでインストールできるともっと使ってもらえるはず？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;出力したいAttributeの指定
&lt;ul&gt;
&lt;li&gt;リクエストパラメータで、出力したいAttribute名を指定するとか。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;出力形式の変更
&lt;ul&gt;
&lt;li&gt;今は、Solrの真似をしていますが、せっかくJSONだったりするので、もう少し検討しようかと（同じAttributeの異なる値も1オブジェクトとして出力されてる）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TokenizeChainの出力
&lt;ul&gt;
&lt;li&gt;Solr同様、CharFilter、Tokenizer、TokenFilterが動作して、最終的なTokenがインデックスに登録されます。ですので、各処理の直後のTokenがどうなっているかもわかったほうが嬉しいと思うので、それらも取得できるようにしたいなぁと&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;画面の用意
&lt;ul&gt;
&lt;li&gt;せっかくプラグインなんだし、画面で見れると嬉しいかなと。これは当分先になっちゃうと思いますが、Webページで確認できるような画面を作ると確認しやすくなるかなぁと。上記対応が終わってから取替かかると思いますが。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;とりあえず、思いつくのはこんなかんじです。&lt;/p&gt;
&lt;p&gt;Elasticsearchの_analyze APIを真似しただけのコードだし、テストも実装もまだまだですが、とりあえず公開してみました。&lt;/p&gt;
&lt;p&gt;要望などあれば、コメント、Issue、ツイート（もちろん、テストコードなども！）なんでも受け付けてますので、お気軽に。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第12回Solr勉強会を主催しました。#SolrJP</title>
      <link>https://blog.johtani.info/blog/2013/10/10/solr-meetup-memo/</link>
      <pubDate>Thu, 10 Oct 2013 11:35:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/10/10/solr-meetup-memo/</guid>
      <description>&lt;p&gt;不定期開催ですが&lt;a href=&#34;http://atnd.org/events/43532/&#34;&gt;第12回Solr勉強会&lt;/a&gt;を主催しました。&lt;/p&gt;
&lt;p&gt;今回は、前回ほどの過熱ぶりでは無かったですが、70人ほどの参加者の方がいらっしゃったかと。
ありがとうございます！&lt;/p&gt;
&lt;p&gt;今回は聞きたかったYokozunaの話をしてもらいました。あと、リベンジManifoldCF。
&lt;em&gt;一部、追記しました。Bashoさんからツッコミがあったので。あと、4.5.1の話とか。&lt;/em&gt;&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;不定期開催ですが&lt;a href=&#34;http://atnd.org/events/43532/&#34;&gt;第12回Solr勉強会&lt;/a&gt;を主催しました。&lt;/p&gt;
&lt;p&gt;今回は、前回ほどの過熱ぶりでは無かったですが、70人ほどの参加者の方がいらっしゃったかと。
ありがとうございます！&lt;/p&gt;
&lt;p&gt;今回は聞きたかったYokozunaの話をしてもらいました。あと、リベンジManifoldCF。
&lt;em&gt;一部、追記しました。Bashoさんからツッコミがあったので。あと、4.5.1の話とか。&lt;/em&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;manifoldcfのとsolrの組み合わせ仮株式会社-ロンウイット大須賀稔さん&#34;&gt;ManifoldCFのとSolrの組み合わせ（仮）株式会社 ロンウイット　大須賀　稔さん&lt;/h2&gt;
&lt;p&gt;前回お休みだったのでリベンジですw。&lt;/p&gt;
&lt;p&gt;英語だ。。。やっぱ英語がいいですか、スライド。。。&lt;br&gt;
ManifoldCFの概要から。
最新版は1.3です。色々サポートしてるなぁ。&lt;/p&gt;
&lt;p&gt;デモもありました。（やっぱりちゃんと動かないので、鬼門みたいですが）&lt;/p&gt;
&lt;h4 id=&#34;デモ&#34;&gt;デモ&lt;/h4&gt;
&lt;p&gt;ManifoldCFのGUIで操作しながら。
いまいちちゃんと動かなかった。。。&lt;/p&gt;
&lt;h4 id=&#34;qa&#34;&gt;QA&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Q:Zipはうまく動かなかった&lt;/li&gt;
&lt;li&gt;A:Solr側で処理してくれてる。&lt;/li&gt;
&lt;li&gt;Q:Notes対応するの？&lt;/li&gt;
&lt;li&gt;A:いまのところない。&lt;/li&gt;
&lt;li&gt;Q:ExcelとかPDFはTika？&lt;/li&gt;
&lt;li&gt;A:Tika次第です。&lt;/li&gt;
&lt;li&gt;Q:認証周りどこから取ってくるの？&lt;/li&gt;
&lt;li&gt;A:クローラ側にはなくて、SharePointとかの権限をみてる。&lt;/li&gt;
&lt;li&gt;Q:Web系の認証は？&lt;/li&gt;
&lt;li&gt;A:まだないのでは。。。（調査します）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;あー、デモの続き忘れてましたね。。。&lt;/p&gt;
&lt;h2 id=&#34;solrを組み込んだriak-20の全文検索機能--yokozuna--bashoジャパン株式会社鈴木一弘さん&#34;&gt;Solrを組み込んだRiak 2.0の全文検索機能 -Yokozuna- Bashoジャパン株式会社　鈴木　一弘さん&lt;/h2&gt;
&lt;p&gt;Riak色々使われてるよ！アングリーバードとか、Y!とか。
Riakで提供されている1機能としてのYokozuna。単独製品ではないですよと。&lt;/p&gt;
&lt;p&gt;Riakの説明。スケールするよ、いつでもRead/Writeできるよ、運用にフォーカスしてるよと。
マスターレスですよ。
Riak2.0のリリースは2013年末。Yokozunaもかな？&lt;/p&gt;
&lt;p&gt;ダイナミックフィールド使ってるので、Yokozunaをonにするだけで簡単に使えるよ。&lt;/p&gt;
&lt;p&gt;RiakがSolrのプロセスを管理。&lt;/p&gt;
&lt;p&gt;インデックスの不整合の検知とかってどうやってるのかなぁ？
インデックス比較用のハッシュツリーをノード間でコピーしつつ検査してる。（Active Anti-Entropy）&lt;/p&gt;
&lt;p&gt;(デモには魔物がいるようだ。。。)&lt;/p&gt;
&lt;h4 id=&#34;qa-1&#34;&gt;QA&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Q:JSONの属性を元にしてフィールドにインデックス可能か？&lt;/li&gt;
&lt;li&gt;A:可能です。IIJさんの発表で話が出ます。&lt;/li&gt;
&lt;li&gt;Q:ProtocolBufferでSolrにアクセス可能？&lt;/li&gt;
&lt;li&gt;A:&lt;strike&gt;そのうちできそうです。&lt;/strike&gt;リリース時にはできるようになっています。&lt;/li&gt;
&lt;li&gt;Q:コアのスワップは？スキーマの変更は？&lt;/li&gt;
&lt;li&gt;A:事前に設定するのは可能。&lt;/li&gt;
&lt;li&gt;Q:RiakのデータとSolrでデータがずれるってのはあるの？&lt;/li&gt;
&lt;li&gt;A:可能性はありますが、&lt;strike&gt;極力ずれ&lt;/strike&gt;AAEで修復。&lt;/li&gt;
&lt;li&gt;Q:復旧中のインデックスにアクセスが行かないようにする仕組みなどはある？&lt;/li&gt;
&lt;li&gt;A:今はないです。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;yokozuna-ベンチマークしました株式会社インターネットイニシアティブ曽我部崇さん田中-義久さん&#34;&gt;Yokozuna ベンチマークしました　株式会社インターネットイニシアティブ　曽我部　崇さん、田中 義久さん&lt;/h2&gt;
&lt;p&gt;いいとこ取りで楽だなぁと。いうことで、試してみてます。
デモが動いてる。&lt;/p&gt;
&lt;p&gt;extractorでXMLやJSONをパースできる。
ベンチマーク結果。&lt;/p&gt;
&lt;p&gt;Riak Meetup Tokyo #2の時のQAも入ってるので助かります。素晴らしい。&lt;/p&gt;
&lt;h4 id=&#34;qa-2&#34;&gt;QA&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Q:スナップショットは両方取れるの？&lt;/li&gt;
&lt;li&gt;A:Riakは取れますが、インデックスは今は無理です。&lt;/li&gt;
&lt;li&gt;フォロー:0.8はYokozunaにボトルネックがあったので、0.9以降だともっと性能が出るはずですとのこと。また次回とかに発表してもらうのもありですかねぇ。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;solr-45の新機能など-johtani&#34;&gt;Solr 4.5の新機能など @johtani&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/images/entries/20131009/Solr4_5_Changes.pdf&#34;&gt;発表資料のPDF&lt;/a&gt;です。&lt;/p&gt;
&lt;p&gt;ツイート見てて誤解を招いたなと思ったのですが、7u40は4.5限定ではなく、すべてのバージョンと考えてください。
チケットを見ると分かりますが、影響バージョンの記載はありません。&lt;/p&gt;
&lt;p&gt;※あ、4.5のChangesを紹介しましたが、4.5.1が出るかも。このへんが困ってるらしいです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://issues.apache.org/jira/browse/SOLR-5306&#34;&gt;SOLR-5306: can not create collection when have over one config&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://issues.apache.org/jira/browse/SOLR-5317&#34;&gt;SOLR-5317: CoreAdmin API is not persisting data properly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://issues.apache.org/jira/browse/LUCENE-5263&#34;&gt;LUCENE-5263: Deletes may be silently lost if an IOException is hit and later not hit (e.g., disk fills up and then frees up)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;lt&#34;&gt;LT&lt;/h2&gt;
&lt;h3 id=&#34;haruyama-さん&#34;&gt;@haruyama さん&lt;/h3&gt;
&lt;p&gt;資料：&lt;a href=&#34;http://haruyama.github.io/solr_20131009/#(1)&#34;&gt;http://haruyama.github.io/solr_20131009/#(1)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;記号が捨てられるTokenizer困るので、捨てないのを作ってみました。&lt;/p&gt;
&lt;p&gt;Kuromojiの困ったこと。全角数字を分解しちゃう。→MappingCharFilterFactoryで全角から半角にしましょう。
lucene-gosenデフォで半角記号が未知語になってしまい、半角カナと混ざるので、記号を全角にしましょう。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>elasticsearch-inquisitorプラグインの紹介</title>
      <link>https://blog.johtani.info/blog/2013/09/23/intro-elasticsearch-inquisitor/</link>
      <pubDate>Mon, 23 Sep 2013 12:27:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/09/23/intro-elasticsearch-inquisitor/</guid>
      <description>&lt;p&gt;今日は、ElasticSearchのMLで見つけた&lt;a href=&#34;https://github.com/polyfractal/elasticsearch-inquisitor&#34;&gt;elasticsearch-inquisitor&lt;/a&gt;プラグインの紹介です。&lt;/p&gt;
&lt;p&gt;ElasticSearchはREST API形式で簡単にコマンドラインからいろいろな処理を実行できて便利ですが、
GUIがあったほうが楽なこともまた事実です。
今回紹介する、inquisitorプラグインもSiteプラグイン（Webブラウザでアクセスできるプラグイン）の1つです。
（ただし、ローカルにインストールしてローカルのElasticSearchにしか接続できませんが。。。）&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今日は、ElasticSearchのMLで見つけた&lt;a href=&#34;https://github.com/polyfractal/elasticsearch-inquisitor&#34;&gt;elasticsearch-inquisitor&lt;/a&gt;プラグインの紹介です。&lt;/p&gt;
&lt;p&gt;ElasticSearchはREST API形式で簡単にコマンドラインからいろいろな処理を実行できて便利ですが、
GUIがあったほうが楽なこともまた事実です。
今回紹介する、inquisitorプラグインもSiteプラグイン（Webブラウザでアクセスできるプラグイン）の1つです。
（ただし、ローカルにインストールしてローカルのElasticSearchにしか接続できませんが。。。）&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;インストール&#34;&gt;インストール&lt;/h2&gt;
&lt;p&gt;プラグインですので、以下のコマンドでインストールが出来ます。インストール後はElasticSearchの再起動が必要です。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bin/plugin -install polyfractal/elasticsearch-inquisitor
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ElasticSearch再起動後に、以下のURLにアクセスすればOKです。
※ローカルでのみ動作可能なプラグインです。（内部で呼び出しているJSにlocalhostと記載があるため）&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;http://localhost:9200/_plugin/inquisitor/#/
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;何ができるの&#34;&gt;何ができるの？&lt;/h2&gt;
&lt;p&gt;自分の書いたQueryが正しく動作するかや、Analyzerによって文章がどのように、Term（Token）に分割されるかといった挙動をWebブラウザ上で確認することができます。用意されている画面は「Queries」「Analyzers」「Tokenizers」の3種類です。&lt;/p&gt;
&lt;h3 id=&#34;queries&#34;&gt;Queries&lt;/h3&gt;
&lt;p&gt;クエリの確認、実行が可能な画面です。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130923/queries_sample.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130923/queries_sample.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;「Index」「Type」はプルダウンになっており、現在ElasticSearchに存在しているものが選択可能です。
その下のテキストエリアがクエリを入力する画面です。&lt;/p&gt;
&lt;p&gt;クエリを入力していると、入力しているクエリがValidかどうかをクエリのコンソール部分（右側上部）に表示してくれます。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130923/query_error.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130923/query_error.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;少し残念なことに、Tabを押すと、フォームのフォーカスが切り替わってしまうので、クエリを入力するのがちょっと面倒です。。。（私は通常の検索には、&lt;a href=&#34;https://chrome.google.com/webstore/detail/sense/doinijnbnggojdlcjifpdckfokbbfpbo&#34;&gt;ChromeプラグインのSense&lt;/a&gt;というものを利用してます。）&lt;/p&gt;
&lt;p&gt;クエリに問題がない場合は、「Query」ボタンを押すことで実際の検索が実行されます。
この時、画面真ん中のブルーのテーブル（内部で実行されるクエリ）の部分に、QueryがElasticSearch内部で解釈されたあとの、Luceneで実行されるレベルのクエリに変換されたクエリが表示されます。&lt;/p&gt;
&lt;p&gt;これが便利です。JSONで記述したり、色々なタイプのクエリがElasticSearchでは実行できますが、望んだ形に単語が区切られているかなどを確認することができるため、非常に便利です。&lt;/p&gt;
&lt;p&gt;ElasticSearchのQuery DSLでは&lt;a href=&#34;http://www.elasticsearch.org/guide/reference/api/search/explain/&#34;&gt;explain&lt;/a&gt;をtrueにすることで、ヒットしたドキュメントのスコア計算に用いられた単語などがわかるのですが、そもそもヒットしないクエリの場合は、explainでは単語の区切られ方などがわかりません。&lt;/p&gt;
&lt;p&gt;その場合に、このプラグインで確認すると、想定と違う単語の区切られ方やクエリの造られ方がわかるかと思います。&lt;/p&gt;
&lt;h3 id=&#34;analyzers&#34;&gt;Analyzers&lt;/h3&gt;
&lt;p&gt;Analyzerによる文章のアナライズ結果の確認が出来る画面です。
ElasticSearchやSolrにあまり詳しくない場合、どんなAnalyzerが文章をどのように単語に区切って、転置インデックスのキーワードとして利用しているかがわからないと思います。&lt;/p&gt;
&lt;p&gt;このAnalyzerが文章をどのように単語に区切っているかを確認することができるのがAnalyzers画面です。
こんなかんじの画面になります。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130923/analyzers_sample.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130923/analyzers_sample.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;一番上のテキストエリアが文章を入力する場所です。
文章を入力していくと、その下のテーブルの「Analyzed Text」の部分が変化していくのが分かります。
このグレーの単語が転置インデックスのキーワードとなります。&lt;/p&gt;
&lt;p&gt;予め用意されているAnalyzer以外に、用意されているTokenzier＋Filterの組み合わせも簡単ですが確認可能です。（Tokenizer、Filtersとあるテーブル）
ただし、ここまでのどちらも細かな設定は画面上ではできません（Filterの細かな引数の指定など）&lt;/p&gt;
&lt;p&gt;一番下の部分が、ElasticSearchに存在しているインデックスごとに定義されたAnalyzerやフィールドを元にした解析結果を表示することができる領域です。&lt;/p&gt;
&lt;p&gt;自分でマッピングを記述してフィールド定義したものの動作確認や、インデックスを適当に作ったけど、うまくヒットしない場合など、ここで、単語の区切れ方を確認することで、検索になぜヒットしないのかといった問題のヒントを得ることができると思います。&lt;/p&gt;
&lt;p&gt;Analyzerによっては、インデックス対象の文字として扱わない文字があったりしますので。
先ほどのQueries画面のLuceneに投げられる直前のクエリと、Analyzersでの単語の区切られ方を確認することで、検索がうまくヒットしていないことが判明すると思います。&lt;/p&gt;
&lt;h3 id=&#34;tokenizers&#34;&gt;Tokenizers&lt;/h3&gt;
&lt;p&gt;最後はTokenizers画面です。Analyzersとほぼ同様ですが、ちがいは、デフォルトで用意されているTokenizerの挙動の確認ができるというだけになります。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130923/tokenizers_sample.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130923/tokenizers_sample.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;簡単な確認ならここで可能かと。&lt;/p&gt;
&lt;h2 id=&#34;注意点は&#34;&gt;注意点は？&lt;/h2&gt;
&lt;p&gt;まだ開発途中のようで、つぎの部分が課題かと。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ローカルでのみ実行可能&lt;/li&gt;
&lt;li&gt;Queries画面の結果の「Explain Result」リンクが未実装&lt;/li&gt;
&lt;li&gt;Queries画面のクエリ入力が使いにくい（タブが打てないので）&lt;/li&gt;
&lt;li&gt;カスタム登録のAnalyzersはインデックスを用意しないと確認できない。（Kuromojiのプラグインを登録しただけでは確認できなかった）&lt;/li&gt;
&lt;li&gt;細かな設定のフィールドも用意しないと、Analyzers画面では利用できない&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、Inquisitor（読みがわからない）プラグインの簡単な説明でした。
検索にうまくヒットしないという理由は大体の場合、
クエリに入力した文字列が単語に区切られたものと、登録したデータが単語に区切られたものが異なるために検索にヒットしないというものです。&lt;/p&gt;
&lt;p&gt;そのクエリ、データの単語の区切られ方を確認するのに役に立つプラグインじゃないでしょうか。&lt;/p&gt;
&lt;p&gt;ちなみに、このプラグイン自体はHTML＋JSで作成されており、実際にはElasticSearchが持っているREST APIをキックしているだけになります。
ですので、Web画面なんか要らないという方は、このプラグインが実際に送信しているリクエストを参考にするとcurlコマンドでどういったリクエストを投げればいいかというのがわかると思います。&lt;/p&gt;
&lt;p&gt;私は軟弱者なので画面があったほうがいいですが。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>elasticsearch-river-wikipediaの疑問点</title>
      <link>https://blog.johtani.info/blog/2013/09/12/question-river-wikipedia/</link>
      <pubDate>Thu, 12 Sep 2013 02:38:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/09/12/question-river-wikipedia/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2013/08/23/index-wikipedia-ja-to-elasticsearch/&#34;&gt;river-wikipediaの前々回の記事&lt;/a&gt;で書きましたが、bulk_sizeに関連して登録件数がやけにきりが良いのが気になると書いていました。&lt;/p&gt;
&lt;p&gt;で、Riverの仕組みを勉强がてら、&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch-river-wikipedia&#34;&gt;elasticsearch-river-wikipedia&lt;/a&gt;のソース（1.2.0）を読んでみました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;riverの作り&#34;&gt;Riverの作り&lt;/h2&gt;
&lt;p&gt;Riverはorg.elasticsearch.river.Riverというinterfaceを実装することで作らています。
ただ、Riverがinterfaceとなっていますが、o.e.river.AbstractRiverComponentというクラスを継承して作られています。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2013/08/23/index-wikipedia-ja-to-elasticsearch/&#34;&gt;river-wikipediaの前々回の記事&lt;/a&gt;で書きましたが、bulk_sizeに関連して登録件数がやけにきりが良いのが気になると書いていました。&lt;/p&gt;
&lt;p&gt;で、Riverの仕組みを勉强がてら、&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch-river-wikipedia&#34;&gt;elasticsearch-river-wikipedia&lt;/a&gt;のソース（1.2.0）を読んでみました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;riverの作り&#34;&gt;Riverの作り&lt;/h2&gt;
&lt;p&gt;Riverはorg.elasticsearch.river.Riverというinterfaceを実装することで作らています。
ただ、Riverがinterfaceとなっていますが、o.e.river.AbstractRiverComponentというクラスを継承して作られています。&lt;/p&gt;
&lt;p&gt;AbstractRiverComponentにはRiverの名前や設定などが用意されています。
ま、ここはそれほど重要じゃないので、軽く流してと。&lt;/p&gt;
&lt;p&gt;Riverの設定関連は実装したRiverクラス（ここでは、WikipediaRiverクラス）のコンストラクタで、設定値の読み取りなどの記述を記載します。
このコンストラクタが、&lt;code&gt;_river/hogehoge/_meta&lt;/code&gt;をPUTした時のJSONを元にElasticSearchから呼ばれて、Riverのインスタンスが作成されます。（たぶん、&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/blob/master/src/main/java/org/elasticsearch/river/RiversService.java&#34;&gt;このへんがその処理&lt;/a&gt;だと思う。。。このあたりはまた今度）&lt;/p&gt;
&lt;p&gt;実際のRiverの処理はWikipediaRiverクラスのstart()メソッド内部に記述されています。&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:#a6e22e&#34;&gt;@Override&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;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;start&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;info&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;starting wikipedia stream&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:#66d9ef&#34;&gt;try&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:#960050;background-color:#1e0010&#34;&gt;①&lt;/span&gt;            client.&lt;span style=&#34;color:#a6e22e&#34;&gt;admin&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;indices&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;prepareCreate&lt;/span&gt;(indexName).&lt;span style=&#34;color:#a6e22e&#34;&gt;execute&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;actionGet&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;catch&lt;/span&gt; (Exception e) {
&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;if&lt;/span&gt; (ExceptionsHelper.&lt;span style=&#34;color:#a6e22e&#34;&gt;unwrapCause&lt;/span&gt;(e) &lt;span style=&#34;color:#66d9ef&#34;&gt;instanceof&lt;/span&gt; IndexAlreadyExistsException) {
&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;// that&amp;#39;s fine&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;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (ExceptionsHelper.&lt;span style=&#34;color:#a6e22e&#34;&gt;unwrapCause&lt;/span&gt;(e) &lt;span style=&#34;color:#66d9ef&#34;&gt;instanceof&lt;/span&gt; ClusterBlockException) {
&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;// ok, not recovered yet..., lets start indexing and hope we recover by the first bulk&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;// TODO: a smarter logic can be to register for cluster event listener here, and only start sampling when the block is removed...&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;else&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;warn&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;failed to create index [{}], disabling river...&amp;#34;&lt;/span&gt;, e, indexName);
&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;return&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:#960050;background-color:#1e0010&#34;&gt;②&lt;/span&gt;        currentRequest &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; client.&lt;span style=&#34;color:#a6e22e&#34;&gt;prepareBulk&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:#960050;background-color:#1e0010&#34;&gt;③&lt;/span&gt;        WikiXMLParser parser &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; WikiXMLParserFactory.&lt;span style=&#34;color:#a6e22e&#34;&gt;getSAXParser&lt;/span&gt;(url);
&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;try&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:#960050;background-color:#1e0010&#34;&gt;④&lt;/span&gt;            parser.&lt;span style=&#34;color:#a6e22e&#34;&gt;setPageCallback&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; PageCallback());
&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;catch&lt;/span&gt; (Exception e) {
&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;error&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;failed to create parser&amp;#34;&lt;/span&gt;, e);
&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;return&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:#960050;background-color:#1e0010&#34;&gt;⑤&lt;/span&gt;        thread &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; EsExecutors.&lt;span style=&#34;color:#a6e22e&#34;&gt;daemonThreadFactory&lt;/span&gt;(settings.&lt;span style=&#34;color:#a6e22e&#34;&gt;globalSettings&lt;/span&gt;(), &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;wikipedia_slurper&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;newThread&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Parser(parser));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        thread.&lt;span style=&#34;color:#a6e22e&#34;&gt;start&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;ol&gt;
&lt;li&gt;インデックスの作成&lt;/li&gt;
&lt;li&gt;バルクアップデート用クライアントの設定&lt;/li&gt;
&lt;li&gt;WikiXMLのパーサの初期化&lt;/li&gt;
&lt;li&gt;ページごとにキックされるコールバック処理の登録&lt;/li&gt;
&lt;li&gt;デーモンスレッドの起動と起動&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;といった処理の流れになっています。&lt;/p&gt;
&lt;p&gt;で、このスレッドの起動後は、4.で用意したparser.parse()処理がグルグル回ります。&lt;/p&gt;
&lt;p&gt;1ページがパースされるたびに、&lt;code&gt;WikipediaRiver.PageCallback&lt;/code&gt;クラスの&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch-river-wikipedia/blob/master/src/main/java/org/elasticsearch/river/wikipedia/WikipediaRiver.java#L166&#34;&gt;&lt;code&gt;proess()&lt;/code&gt;メソッド&lt;/a&gt;が呼ばれます。
このメソッドの最後で、&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch-river-wikipedia/blob/master/src/main/java/org/elasticsearch/river/wikipedia/WikipediaRiver.java#L198&#34;&gt;&lt;code&gt;processBulkIfNeeded()&lt;/code&gt;メソッド&lt;/a&gt;が呼ばれています。ここで、実際にパースしたページをインデックスに登録する処理が実行されます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch-river-wikipedia/blob/master/src/main/java/org/elasticsearch/river/wikipedia/WikipediaRiver.java#L205&#34;&gt;このメソッドの1行目&lt;/a&gt;が鍵でした。
bulkSize以上の件数がバルクのリクエストに貯まった時だけ、実際にインデックスに登録する処理が実行されます。
このため、スレッドが回っている間は、bulkSize以上のデータが貯まらないと、インデックスへの登録は行われないわけです。&lt;/p&gt;
&lt;p&gt;次に、このスレッドを止めるには、前々回書いたように、_riverにPUTした、Riverの設定をDELETEするしかありません。（あとは、ElasticSearchを停止するとかでしょうか。）&lt;/p&gt;
&lt;p&gt;で、DELETEが実行される呼ばれるのが、&lt;code&gt;WikipediaRiver&lt;/code&gt;クラスの&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch-river-wikipedia/blob/master/src/main/java/org/elasticsearch/river/wikipedia/WikipediaRiver.java#L135&#34;&gt;&lt;code&gt;close()&lt;/code&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;
&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;@Override&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;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &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;info&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;closing wikipedia river&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        closed &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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;if&lt;/span&gt; (thread &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            thread.&lt;span style=&#34;color:#a6e22e&#34;&gt;interrupt&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;見ていただくと分かりますが、スレッド止めて終了です。&lt;/p&gt;
&lt;h3 id=&#34;問題点は&#34;&gt;問題点は？&lt;/h3&gt;
&lt;p&gt;ということで、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WikipediaのXMLを読み込んでもRiverは停止しない&lt;/li&gt;
&lt;li&gt;Riverの停止を行ってもスレッドが止められるだけ。&lt;/li&gt;
&lt;li&gt;bulkSize以下の件数が&lt;code&gt;currentRequest&lt;/code&gt;に残っているけど、破棄される&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;とまぁ、こんな流れになっているので、最後の端数のドキュメントがインデックスに登録されないようです。
（まだ、ちゃんと確認してないんですが、備忘録のため先に書いちゃいました。。。）&lt;/p&gt;
&lt;p&gt;じゃあ、全部うまく登録するにはどうしたもんかなぁと。
いまのところ思いついたのはこんな感じです。
他にいい案があったら教えて下さい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;案１：close()処理の中で、スレッド停止後に、&lt;code&gt;currentRequest&lt;/code&gt;に貯まっているデータをインデックスに登録しちゃう&lt;/li&gt;
&lt;li&gt;案２：bulkSize以外に、定期的（指定された時間）で登録処理を実行してしまう。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;簡単なのでとりあえず、案１を実装してみるかなぁと。
（さっさとコード書けよって話ですね。。。スミマセン）
その前にMLで質問ですかねぇ、英語で。&lt;/p&gt;
&lt;p&gt;WikipediaのRiverをざっと眺めてみた感じですが、わかりやすい作りだなぁと。
他のRiverがどうなってるかをちゃんと見てませんが、他にもbulkSize指定をするRiverの場合は、このように件数がbulkSizeに満たない状態ではデータが登録されないといったことがあるかもしれません。&lt;/p&gt;
&lt;p&gt;ElasticSearchのソースを読み始める取っ掛かりとしては面白いかと思いますので、興味ある方は読んで作ってみるといいかもしれません。（私は読んだだけですがｗ）&lt;/p&gt;
&lt;h2 id=&#34;追記20130913-2100&#34;&gt;追記（2013/09/13 21:00）&lt;/h2&gt;
&lt;p&gt;MLで質問してみました。とりあえず、案1を。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://groups.google.com/forum/#!topic/elasticsearch/hqU-LF5aTy4&#34;&gt;river-wikipedia does not index all pages&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;他のRiverでは対応してるしバグだね、Issue上げてとのことで、あげときました。
ついでにプルリクも出せばいいんでしょうが、プルリクまだやったことないヘタレです。。。&lt;/p&gt;
&lt;p&gt;あと、案2についても同じトピックで質問してます。
どうやら、BulkProcessorにその機能があるよと。
&lt;code&gt;flushinterval&lt;/code&gt;というプロパティがありそうです。どうやって設定して、どうやって動くのかとか見てないので、
調査してブログorLTかな。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.elasticsearch.org/guide/reference/api/bulk-udp/&#34;&gt;bulk udp&lt;/a&gt;にはその値を設定できそうなのがあるんだよなぁ。&lt;/p&gt;
&lt;h2 id=&#34;追記その２20130916-2350&#34;&gt;追記その２（2013/09/16 23:50）&lt;/h2&gt;
&lt;p&gt;さっそく&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch-river-wikipedia/commit/3719ac5cd3cd5f0e4e57edaa72f5d4ca0b45ca5d&#34;&gt;修正版がコミット(コミットログ)&lt;/a&gt;されてました。
結構変わってます。BulkProcessorに&lt;code&gt;flush_interval&lt;/code&gt;の設定をすれば、よしなにやってくれる仕組みがすでに実装されているようです。
&lt;code&gt;bulkSize&lt;/code&gt;についても同様に、BulkProcessorに設定すれば良いようです。
Riverの仕組みが結構スッキリしています。
もともと実装されていた、bulkSizeごとの処理も消されています。
確かに、BulkProcessorの仕組みとして実装されている方がしっくりきますね。&lt;/p&gt;
&lt;p&gt;ということで、考える暇もなくコミットされてしまいました。
こうやって質問しつつ、少しずつソースを読んでいこうかなと思ってるとこです。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>日本語Wikipediaをインデクシング（Kuromojiバージョン）</title>
      <link>https://blog.johtani.info/blog/2013/09/03/ja-wikipedia-with-kuromoji/</link>
      <pubDate>Tue, 03 Sep 2013 01:15:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/09/03/ja-wikipedia-with-kuromoji/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2013/08/23/index-wikipedia-ja-to-elasticsearch&#34;&gt;前々回紹介した、日本語Wikipediaのデータをインデックス登録する記事&lt;/a&gt;の続きです。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;今回は、Kuromojiのアナライザを利用してインデックス登録してみます。&lt;/p&gt;
&lt;h2 id=&#34;余談proxy環境でのプラグインインストール&#34;&gt;余談（Proxy環境でのプラグインインストール）&lt;/h2&gt;
&lt;p&gt;ElasticSearchのpluginコマンドはJavaで実装されています。（&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/blob/master/src/main/java/org/elasticsearch/plugins/PluginManager.java#L315&#34;&gt;org.elasticsearch.plugins.PluginManager&lt;/a&gt;）
プラグインのダウンロードには、java.net.URL.openConnection()から取得URLConnectionを使用しています。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://blog.johtani.info/blog/2013/08/23/index-wikipedia-ja-to-elasticsearch&#34;&gt;前々回紹介した、日本語Wikipediaのデータをインデックス登録する記事&lt;/a&gt;の続きです。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;今回は、Kuromojiのアナライザを利用してインデックス登録してみます。&lt;/p&gt;
&lt;h2 id=&#34;余談proxy環境でのプラグインインストール&#34;&gt;余談（Proxy環境でのプラグインインストール）&lt;/h2&gt;
&lt;p&gt;ElasticSearchのpluginコマンドはJavaで実装されています。（&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch/blob/master/src/main/java/org/elasticsearch/plugins/PluginManager.java#L315&#34;&gt;org.elasticsearch.plugins.PluginManager&lt;/a&gt;）
プラグインのダウンロードには、java.net.URL.openConnection()から取得URLConnectionを使用しています。&lt;/p&gt;
&lt;p&gt;ですので、pluginのインストールを行う際に、Proxy環境にある場合は以下のようにコマンドを実行します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./bin/plugin -DproxyPort=ポート番号 -DproxyHost=ホスト名 -i elasticsearch/elasticsearch-analysis-kuromoji/1.5.0
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;elasticsearch-analysis-kuromojiのインストール&#34;&gt;elasticsearch-analysis-kuromojiのインストール&lt;/h2&gt;
&lt;p&gt;WikipediaのデータをKuromojiを使って、形態素解析ベースの転置インデックスを作成していきます。
まずは、Kuromojiを利用するために、&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch-analysis-kuromoji&#34;&gt;Analysisプラグイン&lt;/a&gt;のインストールです。
ElasticSearchのバージョンに対応したプラグインのバージョンがあります。（プラグインのページに対応したバージョンの記載あり）
今回はElasticSearchの0.90.3を利用しているため、1.5.0をインストールします。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./bin/plugin -i elasticsearch/elasticsearch-analysis-kuromoji/1.5.0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;インストール後は再起動しておきます。
なお、Kuromojiを利用して、Wikipediaのデータを登録するばあい、デフォルトの設定では、ヒープが足りなくなるおそれがあります。
ElasticSearchの起動時に以下のオプションを指定して、最大ヒープサイズを2Gとしておきます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;export ES_HEAP_SIZE=2g;./bin/elasticsearch
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;indexの作成デフォルトでkuromojiのanalyzerを利用する&#34;&gt;Indexの作成（デフォルトでKuromojiのAnalyzerを利用する）&lt;/h2&gt;
&lt;p&gt;Wikipediaのデータを登録する際に、Kuromojiのアナライザを利用したいのが今回の趣旨でした。
一番ラクな方法として、Wikipediaデータのインデックスの設定として、デフォルトのアナライザをKuromojiにしてしまいます。
（きちんと設計する場合は、必要に応じてフィールドごとに指定しましょう）&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curl -XPUT &amp;#39;localhost:9200/ja-wikipedia-kuromoji&amp;#39; -d &amp;#39;{
    &amp;#34;settings&amp;#34;: {
        &amp;#34;analysis&amp;#34;: {
            &amp;#34;analyzer&amp;#34;: {
                &amp;#34;default&amp;#34; : {
                    &amp;#34;type&amp;#34; : &amp;#34;kuromoji&amp;#34;
                }
            }
        }
    }
}&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これでkuromojiのアナライザがデフォルトで利用される形となります。
あとは、Riverを起動して登録するだけです。&lt;/p&gt;
&lt;h2 id=&#34;riverの実行&#34;&gt;Riverの実行&lt;/h2&gt;
&lt;p&gt;前回と一緒です。
インデックス名（&lt;strong&gt;_river/&amp;lt;インデックス名&amp;gt;/_meta&lt;/strong&gt;）だけは、先ほど作成した「&lt;code&gt;ja-wikipedia-kuromoji&lt;/code&gt;」に変更してください。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curl -XPUT localhost:9200/_river/ja-wikipedia-kuromoji/_meta -d &amp;#39;
{
    &amp;#34;type&amp;#34; : &amp;#34;wikipedia&amp;#34;,
    &amp;#34;wikipedia&amp;#34; : {
        &amp;#34;url&amp;#34; : &amp;#34;file:/home/johtani/src/jawiki-latest-pages-articles.xml&amp;#34;
    },
    &amp;#34;index&amp;#34; : {
        &amp;#34;bulk_size&amp;#34; : 10000
    }
}&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;あとは、インデックスされるのを待つだけです。&lt;/p&gt;
&lt;h2 id=&#34;データ量とか&#34;&gt;データ量とか&lt;/h2&gt;
&lt;p&gt;5.8gbになりました。Kuromojiを利用したため、形態素解析により単語にきちんとトークないずされた結果でしょう。
Uni-gramだと、転置インデックスのボキャブラリも単語に対してヒットするドキュメント数も大きくなるため、
インデックスサイズも大きくなっているのかと。&lt;/p&gt;
&lt;p&gt;検索クエリのサンプルなどはまた後日。（夜遅いので。。。）&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第1回ElasticSearch勉強会を開催しました！ #elasticsearchjp</title>
      <link>https://blog.johtani.info/blog/2013/08/30/hold-first-elasticsearch-meetup-in-japan/</link>
      <pubDate>Fri, 30 Aug 2013 02:42:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/08/30/hold-first-elasticsearch-meetup-in-japan/</guid>
      <description>&lt;p&gt;ElasticSearch勉強会 第1回を主催しました。
昨年のpyfesでなんちゃって資料で喋って、1年たちました。&lt;/p&gt;
&lt;p&gt;ElasticSearchの書籍（英語）も出てきて、今年はElasticSearchが面白くなりそうだし、使ってる人たちから話も聞きたいなぁということで、主催しました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ElasticSearch勉強会 第1回を主催しました。
昨年のpyfesでなんちゃって資料で喋って、1年たちました。&lt;/p&gt;
&lt;p&gt;ElasticSearchの書籍（英語）も出てきて、今年はElasticSearchが面白くなりそうだし、使ってる人たちから話も聞きたいなぁということで、主催しました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;思った以上に興味のある方がいらっしゃったようで、100人応募のところ、チケットがすぐ完売してしまうほど。。。
しかも、当日もほぼ満員ということで、大変な盛況ぶりでした。&lt;/p&gt;
&lt;p&gt;スピーカーの皆様、参加された皆様、会場を提供していただいた&lt;a href=&#34;http://recruit-tech.co.jp&#34;&gt;リクルートテクノロジーズ&lt;/a&gt;さん、ありがとうございました！（たぶん、90人くらいいらっしゃってたかと。）&lt;/p&gt;
&lt;p&gt;こんなステキな案内板も用意してもらいました。スタッフのみなさんありがとうございます！


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:300&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130830/es_signboard.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130830/es_signboard.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://togetter.com/li/556140&#34;&gt;トゥギャっても頂きました&lt;/a&gt;。まとめていただいてありがとうございます！&lt;/p&gt;
&lt;p&gt;自分の発表や個々の発表に関する感想は以下のメモに。&lt;/p&gt;
&lt;h2 id=&#34;elasticsearch入門-johtani&#34;&gt;ElasticSearch入門 @johtani&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;https://blog.johtani.info/images/entries/20130830/IntroductionES20130829.pdf&#34;&gt;ElasticSearch入門&lt;/a&gt;※スライドはPDFです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;緊張しまくりでわかりにくかったですかね。。。&lt;/li&gt;
&lt;li&gt;とりあえず、AWSのサービスじゃないってのだけでも覚えて帰っていただければ満足です。&lt;/li&gt;
&lt;li&gt;途中で見せた&lt;a href=&#34;https://chrome.google.com/webstore/detail/sense/doinijnbnggojdlcjifpdckfokbbfpbo&#34;&gt;ChromeプラグインのSense&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;わからなかった点や質問、ご意見などは、当ブログのコメント、私宛の＠ツイート、なんでもいいので、反応ください。なんでもいいので反応があると、今後の励みになりますので！&lt;/li&gt;
&lt;li&gt;ということで、発表でも言いましたが、わからないことがアレば、&lt;a href=&#34;http://twitter.com/johtani&#34;&gt;@johtani&lt;/a&gt;まで投げてもらえれば、「知らない」「ブログのネタにします」「ソレはこんなかんじですかねぇ？（テキトー）」みたいに答えると思います。&lt;/li&gt;
&lt;li&gt;Elasticsearch in Actionは帰宅中に、4章追加されたよというメールが届きました。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;宿題&#34;&gt;宿題&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;クラスタへのノードの追加の処理方法とか、シャーディングの実装とか。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;elasticsearchプラグイン入門--mocksolrpluginでsolrと入れ替えてみよう-菅谷さん&#34;&gt;elasticsearchプラグイン入門 ～ mocksolrpluginでSolrと入れ替えてみよう 菅谷さん&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/shinsuke/es-study1&#34;&gt;elasticsearchプラグイン入門&lt;/a&gt;　slideshare&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プラグイン構成とか（公式でまとまってるの見つけられないので助かります。）&lt;/li&gt;
&lt;li&gt;作る上でのポイントうれしいです。
&lt;ul&gt;
&lt;li&gt;パッケージ名変えられるとか、つらい。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Solr APIプラグインについて（Solrの振りしてくれる便利なヤツ）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;感想&#34;&gt;感想&lt;/h3&gt;
&lt;p&gt;まだ、プラグインを書いたことがないのですが、ちゃんとプラグインはどういう構成で書くんですよというまとまった資料って本家のサイトにもない気がしています。
なので、スライドが公開されたらすごく役に立つかと。
そのまえに、何かプラグイン書いてみます。。。&lt;/p&gt;
&lt;h2 id=&#34;debugging-and-testing-es-systems-chris-birchallさん&#34;&gt;Debugging and testing ES systems Chris Birchallさん&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/cb372/debugging-and-testing-es-systems&#34;&gt;Debugging and testing ES systems&lt;/a&gt;　slideshare&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;テストの方法とか便利なお話（最後のほうしか聞いてなかったですが。。。。）&lt;/li&gt;
&lt;li&gt;クエリのデバッグは色々とやらないと、なんでヒットしないのってよくあるので。とくに形態素解析を利用した検索の場合、短い文章（クエリ）と長い文章（ドキュメント）で切れ目が変わってうまくヒットしないとかありますよね。&lt;/li&gt;
&lt;li&gt;最後に少しだけ話しましたが、n-gramとKuromojiを組み合わせてOR検索とかすると良い場合があります。
&lt;ul&gt;
&lt;li&gt;インデックスが大きくなったり、OR検索なので遅くなったりというデメリットもありますが。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;感想-1&#34;&gt;感想&lt;/h3&gt;
&lt;p&gt;実際に使われているノウハウを元に話をしていただいたので助かりました。
最初に席を外してたのですが、戻ってきて日本語で普通に発表されててほんとにびっくりしましたｗ
テスト用プラグインがあるのとかは知らなかったです。
あと、使われてたIDEが&lt;a href=&#34;http://samuraism.com/products/jetbrains/intellij-idea&#34;&gt;IntelliJ IDEA&lt;/a&gt;でしたね！私も使ってます！&lt;/p&gt;
&lt;h2 id=&#34;ニコニコ動画データセット-25億件を検索可能にしてみよう-penguinana_&#34;&gt;ニコニコ動画データセット 25億件を検索可能にしてみよう @PENGUINANA_&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/penguinana/ss-25714442&#34;&gt;ニコニコ動画を検索可能にしてみよう&lt;/a&gt;　slideshare&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;kibana@cookpadのお話&lt;/li&gt;
&lt;li&gt;どういう挙動するかをやってみればいいじゃんってことで、やってみるのカッコイイ！&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://goo.gl/FYtO5T&#34;&gt;http://goo.gl/FYtO5T&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;bigdeskとか。プラグインいろいろ。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;感想-2&#34;&gt;感想&lt;/h3&gt;
&lt;p&gt;さすがです、ペンギン先生。大きなデータセットつかって、構築した環境に関する数値も書かれてる資料ができて素晴らしすぎです。
思った以上にサクサク動いてて、4hでインデクシングできるのもすごいなぁと。
私も見習ってこのくらいがサクッとできるようになりたい。。。
あと、発表後にムチャぶりしましたが、次回はぜひ検索側の性能とかも話してもらえたらと。&lt;/p&gt;
&lt;h2 id=&#34;反省点&#34;&gt;反省点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;イベントアテンドだと、キャンセル待ちができない＋どのくらいの方が興味をもっているのかわからない。&lt;/li&gt;
&lt;li&gt;イベントページの主催者は複数指定できる方がいい。（土壇場の登録の人が管理できない。私が司会やってたから）&lt;/li&gt;
&lt;li&gt;マイクが聞こえにくかった（音量調節とかちゃんと調べないと）&lt;/li&gt;
&lt;li&gt;懇親会は立食のほうがやはり動きやすい。&lt;/li&gt;
&lt;li&gt;懇親会が1時間ちょっとしかできなかった&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;雑感&#34;&gt;雑感&lt;/h2&gt;
&lt;p&gt;ということで、ES勉強会、主催の私が一番楽しめました。ありがとうございます。
（あと、気前よく調べて答えますと言ってしまいました。。。まぁ、いいトリガーになるので、ウェルカムですが）&lt;/p&gt;
&lt;p&gt;やっぱりKibanaについて興味を持ってる人も多いのかなぁという感触がしたので、次回はぜひKibana3の話をしてもらえるように頑張ります。
あと、&lt;a href=&#34;http://mobz.github.io/elasticsearch-head/&#34;&gt;elasticsearch-head&lt;/a&gt;を使われてるんだなぁと。私は&lt;a href=&#34;http://www.elastichq.org/gettingstarted.html&#34;&gt;elasticsearch-HQ&lt;/a&gt;を入れて使ってみてます。大きなクラスタ管理まではまだやってないので。&lt;/p&gt;
&lt;p&gt;あとは、やはりいろんな人に助けられてるなぁと実感しつつ、今後も開催するので助けてください！ということで。
（もちろん、Solr勉強会もがんばりますよー）&lt;/p&gt;
&lt;h2 id=&#34;関連ブログ&#34;&gt;関連ブログ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://repeatedly.github.io/ja/2013/08/elasticsearch-meetup-1st/&#34;&gt;ElasticSearch勉強会 第1回 - Go ahead!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mt.orz.at/archives/2013/09/elasticsearch-e.html&#34;&gt;タムタムの日記 - ElasticSearch勉強会 の参加メモ #elasticsearchjp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://samuraism.jp/diary/2013/09/03/1378216200000.html&#34;&gt;第1回ElasticSearch勉強会に行ってきた！ #elasticsearchjp - #侍ズム&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://seratch.hatenablog.jp/entry/2013/09/03/234712&#34;&gt;第1回 ElasticSearch 勉強会に参加 #elasticsearchjp - seratch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;他にもブログを書かれた方がいらっしゃいましたたら、リンクしたいので連絡いただければ。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>ElasticSearchにプラグインで日本語Wikipediaデータを入れてみました</title>
      <link>https://blog.johtani.info/blog/2013/08/23/index-wikipedia-ja-to-elasticsearch/</link>
      <pubDate>Fri, 23 Aug 2013 12:02:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/08/23/index-wikipedia-ja-to-elasticsearch/</guid>
      <description>&lt;p&gt;久々のブログはElasticSearchネタです。勉強会開催する予定だったりすので、もう少し触っておきたいなと。
お手軽に検索するデータとして、よくWikipediaのデータを使っています。
ElasticSearchには&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch-river-wikipedia&#34;&gt;elasticsearch-river-wikipedia&lt;/a&gt;という便利なプラグインがあり、Wikipediaのデータを簡単に検索可能な状態にできます。このRiverを利用して日本語のWikipediaのデータを入れたので、メモを取っておきます。
まずは、river-wikipediaで日本語のデータをインデクシングしてみるまでの説明です。
日本語特有の設定（Kuromojiを利用したインデクシング）などはまた後日。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;久々のブログはElasticSearchネタです。勉強会開催する予定だったりすので、もう少し触っておきたいなと。
お手軽に検索するデータとして、よくWikipediaのデータを使っています。
ElasticSearchには&lt;a href=&#34;https://github.com/elasticsearch/elasticsearch-river-wikipedia&#34;&gt;elasticsearch-river-wikipedia&lt;/a&gt;という便利なプラグインがあり、Wikipediaのデータを簡単に検索可能な状態にできます。このRiverを利用して日本語のWikipediaのデータを入れたので、メモを取っておきます。
まずは、river-wikipediaで日本語のデータをインデクシングしてみるまでの説明です。
日本語特有の設定（Kuromojiを利用したインデクシング）などはまた後日。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;プラグインのインストール&#34;&gt;プラグインのインストール&lt;/h2&gt;
&lt;p&gt;対象とするElasticSearchは現時点で最新版の0.90.3とします。
最新版でRiver動かないなぁとつぶやいた影響かどうかはわかりませんが、2013/08/19に最新版のElasticSearchで動作するプラグインが公開されました。&lt;/p&gt;
&lt;p&gt;まずはインストールです。
HPにも書いてありますが、以下のコマンドを実行すればインストールされます。&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-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ./bin/plugin -install elasticsearch/elasticsearch-river-wikipedia/1.2.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-&amp;gt; Installing elasticsearch/elasticsearch-river-wikipedia/1.2.0...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Trying http://download.elasticsearch.org/elasticsearch/elasticsearch-river-wikipedia/elasticsearch-river-wikipedia-1.2.0.zip...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Downloading ..........DONE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Installed river-wikipedia into /opt/elasticsearch/plugins/river-wikipedia
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ElasticSearchが起動している場合はプラグインをインストール後、認識させるためにElasticSearchを再起動します。&lt;/p&gt;
&lt;h2 id=&#34;日本語wikipediaのインデクシング&#34;&gt;日本語Wikipediaのインデクシング&lt;/h2&gt;
&lt;p&gt;通常は英語のWikipediaがインデクシングされますが、対象となるファイルを変更することで日本語のWikipediaもインデクシング可能です。
手元に日本語Wikipediaのダンプファイルがあるものとします。（&lt;a href=&#34;http://ja.wikipedia.org/wiki/Wikipedia:%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89&#34;&gt;ダウンロードはWikipediaデータベースダウンロード&lt;/a&gt;のページにあるpages-articles.xml.bz2のファイルです）&lt;/p&gt;
&lt;p&gt;ファイルを指定してインデクシングするには、つぎのcurlコマンドを実行します。
コマンドを実行するとすぐにインデクシングが始まりますので注意が必要です。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curl -XPUT localhost:9200/_river/ja-wikipedia/_meta -d &amp;#39;
{
    &amp;#34;type&amp;#34; : &amp;#34;wikipedia&amp;#34;,
    &amp;#34;wikipedia&amp;#34; : {
        &amp;#34;url&amp;#34; : &amp;#34;file:/home/johtani/src/jawiki-latest-pages-articles.xml&amp;#34;
    },
    &amp;#34;index&amp;#34; : {
        &amp;#34;bulk_size&amp;#34; : 1000
    }
}&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ここでURLに含まれる「ja-wikipedia」がインデックス名になります。
また、JSONの&amp;quot;url&amp;quot;にはファイルの場所を指定するため、&lt;code&gt;file:&lt;/code&gt;で開始するパスを指定します。
例では、bz2を解凍したファイルを指定していますが、bz2のままのファイルでもOKです。&lt;/p&gt;
&lt;p&gt;上記コマンドを実行すると、&lt;code&gt;_river&lt;/code&gt;というインデックスにつぎのようなエントリが増えています。
(&lt;code&gt;curl -XGET &#39;localhost:9200/_river/ja-wikipedia/_search?pretty&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-json&#34; data-lang=&#34;json&#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;&amp;#34;took&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;5&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;&amp;#34;timed_out&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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;&amp;#34;_shards&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:#f92672&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;&amp;#34;successful&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;&amp;#34;failed&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#f92672&#34;&gt;&amp;#34;hits&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:#f92672&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&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;&amp;#34;max_score&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;&amp;#34;hits&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;_index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;_river&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:#f92672&#34;&gt;&amp;#34;_type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ja-wikipedia&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:#f92672&#34;&gt;&amp;#34;_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;_status&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:#f92672&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;&amp;#34;_source&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:#f92672&#34;&gt;&amp;#34;ok&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&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;&amp;#34;node&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:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gdyvwpiAR52lqUCcRhVwsg&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:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Blitzschlag, Baron Von&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:#f92672&#34;&gt;&amp;#34;transport_address&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;inet[/192.168.100.7:9300]&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;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:#f92672&#34;&gt;&amp;#34;_index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;_river&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:#f92672&#34;&gt;&amp;#34;_type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ja-wikipedia&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:#f92672&#34;&gt;&amp;#34;_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;_meta&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:#f92672&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;&amp;#34;_source&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;wikipedia&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:#f92672&#34;&gt;&amp;#34;wikipedia&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:#f92672&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;file:/home/johtani/src/jawiki-latest-pages-articles.xml&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;index&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:#f92672&#34;&gt;&amp;#34;bulk_size&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;100&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&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;&amp;quot;_id&amp;quot;: &amp;quot;_meta&amp;quot;&lt;/code&gt;というエントリがさきほど登録したWikipediaのRiverに関する設定です。
&lt;code&gt;&amp;quot;_id&amp;quot;: &amp;quot;_status&amp;quot;&lt;/code&gt;というエントリが起動したRiverの状態になります。&lt;/p&gt;
&lt;h2 id=&#34;riverの停止&#34;&gt;Riverの停止&lt;/h2&gt;
&lt;p&gt;日本語Wikipediaは結構サイズが大きく、手元のAirでインデクシングするのに30分程度かかりました。（bz2圧縮されていないファイルで、何もしていない状態）&lt;/p&gt;
&lt;p&gt;途中でRiverを停止したくなった場合は、以下のcurlコマンドを実行します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ curl -XDELETE &amp;#39;localhost:9200/_river/ja-wikipedia&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;先ほど設定した&lt;code&gt;_river/ja-wikipedia&lt;/code&gt;の情報を削除すると、エントリが削除されたのを検知してRiverが停止します。ログにはつぎのようなメッセージが表示されます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[2013-08-26 18:26:50,130][INFO ][cluster.metadata         ] [Blitzschlag, Baron Von] [[_river]] remove_mapping [ja-wikipedia]
[2013-08-26 18:26:50,130][INFO ][river.wikipedia          ] [Blitzschlag, Baron Von] [wikipedia][ja-wikipedia] closing wikipedia river
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Riverを停止してもそれまでインデクシングされたデータは検索できます。
データはちょっとだけで良いという場合は、先ほどの&lt;code&gt;_river&lt;/code&gt;のデータを削除してください。
（◯件だけ登録したいとかできるかは調べてないです。）&lt;/p&gt;
&lt;h2 id=&#34;サイズとかマッピングとか&#34;&gt;サイズとかマッピングとか&lt;/h2&gt;
&lt;h3 id=&#34;サイズ&#34;&gt;サイズ&lt;/h3&gt;
&lt;p&gt;インデックス前のXMLのサイズが5.7Gのとき、ElasticSearchのインデックスサイズ（Optimize後）は7.2Gとなりました。すこし古いファイルを利用しているため、最新版とはサイズが異なるかもしれません。&lt;/p&gt;
&lt;p&gt;あと、データ数が、1540000件とやけにきりがいいのがちょっと気になっています。。。
bulkのサイズを10000で指定してインデックスしたので、切れてるのかなぁと。&lt;/p&gt;
&lt;p&gt;ということは、データが欠落しているような気がするのでRiverの作りの問題なのか、ElasticSearchの問題なのかはちょっと調べてみないとわからないなと。&lt;/p&gt;
&lt;h3 id=&#34;マッピング&#34;&gt;マッピング&lt;/h3&gt;
&lt;p&gt;出来上がったインデックスのマッピング（Solrでいうスキーマみたいなもの）は次のようになっています。&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-json&#34; data-lang=&#34;json&#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;&amp;#34;ja-wikipedia&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:#f92672&#34;&gt;&amp;#34;page&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:#f92672&#34;&gt;&amp;#34;properties&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:#f92672&#34;&gt;&amp;#34;category&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;disambiguation&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;boolean&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;link&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;redirect&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;boolean&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;special&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;boolean&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;stub&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;boolean&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;text&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;title&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:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&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;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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Wikipediaの各種データが上記のフィールドに入っています。
また、マッピングタイプはデフォルトで「page」というタイプになっています。&lt;/p&gt;
&lt;h2 id=&#34;検索&#34;&gt;検索&lt;/h2&gt;
&lt;p&gt;先ほどのマッピングを元に検索すればOKです。例えばつぎのような感じです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curl -XPOST &amp;#39;localhost:9200/ja-wikipedia/_search?pretty&amp;#39; -d &amp;#39;
{
    &amp;#34;size&amp;#34; : 3,
    &amp;#34;script_fields&amp;#34;: {
       &amp;#34;title_only&amp;#34;: {
          &amp;#34;script&amp;#34;: &amp;#34;_source.title&amp;#34;
       }
    }, 
    &amp;#34;query&amp;#34; : {
        &amp;#34;query_string&amp;#34;: {
            &amp;#34;default_field&amp;#34;: &amp;#34;title&amp;#34;,
            &amp;#34;query&amp;#34; : &amp;#34;千葉&amp;#34;
        }
    }
}&amp;#39;
&lt;/code&gt;&lt;/pre&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-json&#34; data-lang=&#34;json&#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;&amp;#34;took&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;51&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;&amp;#34;timed_out&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&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;&amp;#34;_shards&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:#f92672&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;5&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;&amp;#34;successful&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;5&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;&amp;#34;failed&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#f92672&#34;&gt;&amp;#34;hits&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:#f92672&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;8616&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;&amp;#34;max_score&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;5.8075247&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;&amp;#34;hits&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;_index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ja-wikipedia&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:#f92672&#34;&gt;&amp;#34;_type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;page&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:#f92672&#34;&gt;&amp;#34;_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;3582&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:#f92672&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;5.8075247&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;&amp;#34;fields&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:#f92672&#34;&gt;&amp;#34;title_only&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;千葉&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;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:#f92672&#34;&gt;&amp;#34;_index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ja-wikipedia&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:#f92672&#34;&gt;&amp;#34;_type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;page&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:#f92672&#34;&gt;&amp;#34;_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2352241&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:#f92672&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;4.94406&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;&amp;#34;fields&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:#f92672&#34;&gt;&amp;#34;title_only&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;千葉千枝子&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;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:#f92672&#34;&gt;&amp;#34;_index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ja-wikipedia&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:#f92672&#34;&gt;&amp;#34;_type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;page&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:#f92672&#34;&gt;&amp;#34;_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;14020&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:#f92672&#34;&gt;&amp;#34;_score&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;4.8754807&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;&amp;#34;fields&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:#f92672&#34;&gt;&amp;#34;title_only&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;千葉千恵巳&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;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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;結果を見やすくするため、タイトルだけを「title_only」という表示にしています。
ただ、この検索だと、一見「千葉」できちんとヒットしているように見えますが、ElasticSearchのフィールドの定義はstring型になっています。なので、実は「千」や「葉」だけのデータもヒットしています。
マルチバイト文字は1文字ずつインデックスされてしまい、query_stringというクエリでは、フレーズ検索などができていないためです。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;プラグインいれて、XMLファイルがあれば、検索できるデータが出来上がるので、
暇があったら、お試しで触ってみるデータを簡単に入れてみてはどうでしょうか。&lt;/p&gt;
&lt;p&gt;ただ、いくつか気になる点も。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;日本語が検索しにくい（string型のフィールドなのでuni-gramっぽくなっている）&lt;/li&gt;
&lt;li&gt;bulk_sizeの影響で端数が登録できてない（バグ？どうなの？）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ということで、ちょっと使いにくいかもなぁということで、つぎはKuromojiを利用してインデックスしてみてみようかなと。次回のエントリで書く予定です。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>ElasticSearch入門</title>
      <link>https://blog.johtani.info/presentation/2013/elasticsearchru-men/</link>
      <pubDate>Mon, 19 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2013/elasticsearchru-men/</guid>
      <description>&lt;p&gt;ElasticSearch&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ElasticSearch&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>MorphlinesのloadSolrをちょっとだけ調べてみた</title>
      <link>https://blog.johtani.info/blog/2013/08/02/morphlines-loadsolr/</link>
      <pubDate>Fri, 02 Aug 2013 18:02:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/08/02/morphlines-loadsolr/</guid>
      <description>&lt;p&gt;宿題その2？かな。Solr勉強会でCloudera Searchのスキーマ周りってどうなってるの？という質問が出てて、
なんか調べることになってたので、関係しそうなMorphlinesの&lt;a href=&#34;https://github.com/cloudera/cdk/blob/master/cdk-morphlines/cdk-morphlines-solr-core/src/main/java/com/cloudera/cdk/morphline/solr/LoadSolrBuilder.java&#34;&gt;LoadSolr&lt;/a&gt;コマンドを調べてみました。
こいつが、Solrへの書き込みを実行するコマンドみたいだったので。&lt;br&gt;
（※Cloudera Searchのスキーマの設定方法とかは調べてないです。）&lt;br&gt;
（※めんどくさかったので、パッケージ名すっ飛ばしてクラス名書いてます。githubへのリンクを代わりに貼ってます。）&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;宿題その2？かな。Solr勉強会でCloudera Searchのスキーマ周りってどうなってるの？という質問が出てて、
なんか調べることになってたので、関係しそうなMorphlinesの&lt;a href=&#34;https://github.com/cloudera/cdk/blob/master/cdk-morphlines/cdk-morphlines-solr-core/src/main/java/com/cloudera/cdk/morphline/solr/LoadSolrBuilder.java&#34;&gt;LoadSolr&lt;/a&gt;コマンドを調べてみました。
こいつが、Solrへの書き込みを実行するコマンドみたいだったので。&lt;br&gt;
（※Cloudera Searchのスキーマの設定方法とかは調べてないです。）&lt;br&gt;
（※めんどくさかったので、パッケージ名すっ飛ばしてクラス名書いてます。githubへのリンクを代わりに貼ってます。）&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;recordsolrのドキュメント&#34;&gt;Record＝Solrのドキュメント&lt;/h2&gt;
&lt;p&gt;convert()メソッドにて、MorphlinesのRecord（コマンドの処理するデータの１単位）に格納されているKey-ValueデータをSolrInputDocumentクラスのフィールドとして格納しています。
Recordにもフィールドという概念があり、Recordのフィールド＝Solrのフィールドという事みたいです。&lt;/p&gt;
&lt;p&gt;ということで、Solrのフィールドは事前に定義しておき、Morphlinesの処理内部でSolrのフィールド名に値を詰めていく感じでしょうか。
別途、&lt;a href=&#34;https://github.com/cloudera/cdk/blob/master/cdk-morphlines/cdk-morphlines-solr-core/src/main/java/com/cloudera/cdk/morphline/solr/SanitizeUnknownSolrFieldsBuilder.java&#34;&gt;sanitizeUnknownSolrFilds&lt;/a&gt;というコマンドが用意されていて、Solrのスキーマにないものはこのコマンドを使って、無視するフィールド名に変えたり、雑多なデータを入れるためのフィールド名にするといった処理ができるようです。このコマンド内部で、Solrのスキーマ設定を元に、Solrのフィールドに合致する物があるかをチェックして処理しています。&lt;/p&gt;
&lt;h2 id=&#34;solrへの登録処理は&#34;&gt;Solrへの登録処理は？&lt;/h2&gt;
&lt;p&gt;Solrへの登録処理自体はLoadSolrクラス内部でDocumentLoaderというクラスのload()メソッドを呼び出しているだけでした。ということで、&lt;a href=&#34;https://github.com/cloudera/cdk/blob/master/cdk-morphlines/cdk-morphlines-solr-core/src/main/java/com/cloudera/cdk/morphline/solr/DocumentLoader.java&#34;&gt;DocumentBuilder&lt;/a&gt;クラスを少し調査。&lt;/p&gt;
&lt;h3 id=&#34;documentloader&#34;&gt;DocumentLoader&lt;/h3&gt;
&lt;p&gt;IFでした。。。実クラスは次の条件&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;SolrMorphlineContextにDocumentLoaderがあればそちらを採用（他の種類はなにがあるんだろ？）&lt;/li&gt;
&lt;li&gt;なければ、&lt;a href=&#34;https://github.com/cloudera/cdk/blob/b6f98cff4a027af04f97fdec9abf729785d74cf5/cdk-morphlines/cdk-morphlines-solr-core/src/main/java/com/cloudera/cdk/morphline/solr/SolrServerDocumentLoader.java&#34;&gt;SolrServerDocumentLoader&lt;/a&gt;をnewしたものを利用&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;2.の場合がおそらくMapReduceではないパターンのloadSolrだと思われます。SolrServerDocumentBuilderはSolrJのAPIを利用して、Solrへデータ登録していく普通のアプリです。（対象とするSolrは外部に起動しているもののはず＝FlumeのSolrSinkではこちらを採用かな？）&lt;br&gt;
Solrへの接続情報とか設定ファイルとかSolrCloud用のZooKeeperとかは&lt;a href=&#34;https://github.com/cloudera/cdk/blob/master/cdk-morphlines/cdk-morphlines-solr-core/src/main/java/com/cloudera/cdk/morphline/solr/SolrLocator.java&#34;&gt;SolrLocatorクラス&lt;/a&gt;に設定される内容が利用されます。&lt;/p&gt;
&lt;p&gt;1.のパターンは、どうやら、&lt;a href=&#34;https://github.com/cloudera/search/blob/master/search-mr/src/main/java/org/apache/solr/hadoop/morphline/MorphlineMapper.java&#34;&gt;Cloudera SearchのMapReduceIndexerToolのクラス&lt;/a&gt;にあるMyDocumentLoaderかなぁと。
こちらは、MapReduceを利用する場合に、利用されてるっぽいです（ちゃんと見てないけど）
内部処理は、HadoopのContext.writeメソッドにでSolrInputDocument（＝MorphlinesのRecord）を書きだして、ReducerでSolrOutputFormatでインデックス作成の流れかなと。たぶん、&lt;a href=&#34;https://github.com/cloudera/search/blob/master/search-mr/src/main/java/org/apache/solr/hadoop/morphline/MorphlineMapRunner.java&#34;&gt;MorphlineMapRunner&lt;/a&gt;あたりを読みこめば解読できるかと。
ちなみに、こちらは、2.とは異なり、SolrLocatorの設定は無視されそう。&lt;/p&gt;
&lt;h2 id=&#34;感想妄想&#34;&gt;感想＋妄想？&lt;/h2&gt;
&lt;p&gt;ということで、Morphlinesのデータ流れを考える上で、現時点ではSolrのスキーマを頭の片隅に置きつつ、
Recordの中にあるデータをゴニョゴニョしてデータを形成していくって感じになりそうです。
うまく処理できなかったものとかのカウントとかもとれたりするのかなぁ？とか、また色々と気になるところが出てきますが、一旦ここまでで。。。（だれか、続きを調べて書いてみてくれてもいいんですよ！コマンドもいっぱいあるし！）&lt;/p&gt;
&lt;p&gt;とまぁ、こんなかんじでMorphlinesをちょっとだけ読みました。
よくよく考えたら、こんなの作ったことあるなぁと（こんなに汎用的じゃないけど）。
みんな同じ事考えるんですねぇ。
コマンドパターン？みたいな感じで、I/F決めてSolrとか別のシステムとかにデータ入れる処理を順番に記述できる的なバッチ処理良くかいてます（書いてましたのほうが正解かなぁ）。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Xperia Zが故障したので交換したのでメモ</title>
      <link>https://blog.johtani.info/blog/2013/08/01/replace-xperia-z/</link>
      <pubDate>Thu, 01 Aug 2013 22:38:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/08/01/replace-xperia-z/</guid>
      <description>&lt;p&gt;今朝起きたら、Xperia Zが故障してしまいました。
電源ボタンを押してもスリープにならないんです。しかも、スリープからの復帰もできない。。。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;ということで、ドコモショップに行って来ました。対応も良かったです。
やっぱり、ボタンがおかしく再起動してもNGでした。
ということで、トントン拍子で交換品に変更してもらえました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今朝起きたら、Xperia Zが故障してしまいました。
電源ボタンを押してもスリープにならないんです。しかも、スリープからの復帰もできない。。。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;ということで、ドコモショップに行って来ました。対応も良かったです。
やっぱり、ボタンがおかしく再起動してもNGでした。
ということで、トントン拍子で交換品に変更してもらえました。&lt;/p&gt;
&lt;p&gt;2、3回繰り返し言われましたが、データなくなりますよ＆交換品なので、復旧はご自分でとのこと。
ドコモショップ行く前に「Sony Bridge for Mac」というSony製のアプリでバックアップ取ってたし問題ないですと回答して、交換してもらいました。
最後に使ってないオプションとか要らないのでやめたほうが安くなりますよなどの提案もいただき満足でした。
さらに、前の機種に貼ってたフィルムもきちんと張り替えてもらえたし。時間はちょっとかかったけど。&lt;/p&gt;
&lt;p&gt;で、先ほど帰宅して、朝とっておいたバックアップから復旧しようとしたら。&lt;/p&gt;
&lt;p&gt;**「そんなバックアップありません」**みたいなメッセージが表示されて復旧出来ません。。。&lt;/p&gt;
&lt;p&gt;え？なにそれ？と思い、とりあえず現時点のデータをバックアップ取ってみるかと。
バックアップ取ったあとに、再度復旧しようとしたらちゃんとリストがでてくるじゃないですか。&lt;br&gt;
なんだこれ？ということで、ファイル探しです。。。&lt;/p&gt;
&lt;p&gt;「Sony Bridge for Mac」バックアップファイルは次の場所に保存されるみたいです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/Users/ユーザ名/Library/Application Support/Sony Ericsson Bridge for Mac/Backups/製品番号みたいな文字列/日付
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;この最後のディレクトリが製品番号？ごとのディレクトリっぽく、２つありました。
どうせ初期化された状態だしということで、古い日付フォルダを新しい製品番号のフォルダにコピーしたら復元は可能でした。
壁紙の設定は再起動したら復活しましたが、復活してないものも。。。
復活してないのは以下のものです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インストールしてたアプリ&lt;/li&gt;
&lt;li&gt;ホーム画面の配置&lt;/li&gt;
&lt;li&gt;アカウント色々（Google Playとか）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ということで、スマホでインストールするのもだるくなってきたので、PCで黙々とGoogle Playのサイトからインストールしてますが、これもだるいですね。。。&lt;/p&gt;
&lt;p&gt;必要なアプリインストールし直したら、またSonyのアプリで復旧してみて、設定が復活するのを祈って。。。&lt;/p&gt;
&lt;h4 id=&#34;続き&#34;&gt;続き&lt;/h4&gt;
&lt;p&gt;インストールしなおして、ホーム画面での配置をがんばりました。
Google Playのサイトから既存アプリをインストールするときに、ブラウザバックで戻ってたのですが、
一覧から別タブにインストールしたいアプリのページを開きまくってから、インストールボタン押すのが楽でした（半分くらい終わった所で気づいた。。。）&lt;/p&gt;
&lt;p&gt;一通りインストールしたあとに、ホーム画面の配置をやり直して、「Sony Bridge for Mac」もう一回復元。
twiccaやブクログなど、個別にアカウントとか設定を管理しているアプリについては復活しました。&lt;/p&gt;
&lt;p&gt;けど、Androidがアカウントを管理するもの（例：Facebookなど）については、残念ながら、一部のものはアカウントを再登録しないといけませんでした。&lt;/p&gt;
&lt;p&gt;写真や音楽についてはもともとSDカードに入れていたのもあったので、まぁ、被害は少なかったかなぁと。&lt;/p&gt;
&lt;p&gt;ただ、iPadやiPhoneの用に簡単にバックアップ（アプリの情報、配置まで）ができて復元できると助かるなぁと思いました。（今度はホーム画面のキャプチャ撮ってから修理に出すかなぁ。。。）&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Morphlines入門？</title>
      <link>https://blog.johtani.info/blog/2013/07/31/introduction-morphlines/</link>
      <pubDate>Wed, 31 Jul 2013 19:12:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/07/31/introduction-morphlines/</guid>
      <description>&lt;p&gt;Morphlinesについてちょっとだけ、さらに調べました。&lt;/p&gt;
&lt;h2 id=&#34;誤解&#34;&gt;誤解&lt;/h2&gt;
&lt;p&gt;Solr勉強会でなんとなく私の認識を話しましたが、ちょっと誤解してたみたいです。スミマセン。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Morphlinesについてちょっとだけ、さらに調べました。&lt;/p&gt;
&lt;h2 id=&#34;誤解&#34;&gt;誤解&lt;/h2&gt;
&lt;p&gt;Solr勉強会でなんとなく私の認識を話しましたが、ちょっと誤解してたみたいです。スミマセン。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h3 id=&#34;誤解morphlineというプラットフォームミドルウェアがありそうなイメージ&#34;&gt;誤解：Morphlineというプラットフォーム/ミドルウェアがありそうなイメージ&lt;/h3&gt;
&lt;p&gt;まぁ、書いてあるのでちゃんと読めって話ですが、Morphlineはあくまでライブラリだということでした。
私はなんとなくManifoldCFのようなミドルウェアorプラットフォームが存在して、
そこにFlumeのSinkとかMapReduceによるIndexerが動作するのかと思ってました。&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:300&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130731/wrong_image.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130731/wrong_image.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;まぁ、これが間違いでした。正解のイメージはこっちですね。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:300&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130731/correct_image.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130731/correct_image.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;各プラットフォーム（FlumeとかHadoopとか）に組み込んむライブラリで、
それぞれ組み込んだ先でMorphlineの設定を記述することで、パイプライン処理ができるっぽいです。&lt;/p&gt;
&lt;p&gt;Flumeについては、MorphlineSolrSinkというクラスでMorphlineの設定ファイルを読み込み、いろいろ処理出来ます。&lt;/p&gt;
&lt;p&gt;Map/ReduceだとCloudera Searchに含まれてる&lt;a href=&#34;https://github.com/cloudera/search&#34;&gt;MapReduceIndexerTool&lt;/a&gt;がMorphlineの設定を読み込んでコマンド実行してくれるみたいです。
MapReduceIndexerToolはまだちゃんと読んでないのですが、MapperとしてMorphlineのコマンドが実行されるのかなぁ？という感じです。
（結構入り組んでるので、ちゃんと読まないとわからない。。。）&lt;/p&gt;
&lt;p&gt;ということで、Morphlineというプラットフォームがあって、一元的にFlumeやMap/Reduceに対するコマンドをパイプライン化するという話でありませんでした。&lt;/p&gt;
&lt;p&gt;※ちなみに、上の画像ですが、愛用しているNUBoardを使って書いてます。
考えをまとめるのにすごく役立つ一品です。持ち運び可能なノート型ホワイトボードです。&lt;/p&gt;
&lt;iframe src=&#34;http://rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS1=1&amp;nou=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=johtani-22&amp;o=9&amp;p=8&amp;l=as1&amp;m=amazon&amp;f=ifr&amp;ref=qf_sp_asin_til&amp;asins=B00A08IVT4&#34; style=&#34;width:120px;height:240px;&#34; scrolling=&#34;no&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34; frameborder=&#34;0&#34;&gt;&lt;/iframe&gt;
&lt;h3 id=&#34;疑問点&#34;&gt;疑問点&lt;/h3&gt;
&lt;p&gt;ただ、読んでてまだ不明な点があります。まぁ、ぼちぼち調べるかなぁと。。。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Solrのschemaはどーなってんの？&lt;/li&gt;
&lt;li&gt;MorphlineにSolrへロードするコマンド（loadSolr）があるけど、FlumeのMorphlineSolrSinkってのもSolrに書き込みそうだけど？&lt;/li&gt;
&lt;li&gt;Map/ReduceでSolrに書き込むもMorphlineのコマンドとの違いは？（前にソースを見たときはSOLR-1301がベースになっていて、SolrOutputFormatってクラスがEmbeddedSolrServer起動してインデクシングしてた）&lt;/li&gt;
&lt;li&gt;GoLiveってなんだろ？（MapReduceIndexerToolに入ってて、M/Rでインデックス作ったあとにSolrのクラスタに配布＋マージするやつっぽい）&lt;/li&gt;
&lt;li&gt;どんなコマンドがあるの？（&lt;a href=&#34;http://cloudera.github.io/cdk/docs/0.4.1/cdk-morphlines/morphlinesReferenceGuide.html&#34;&gt;Cloudera Morphlines Ref Guide&lt;/a&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下は、参考資料と参考資料にあるSlideshareの資料を一部訳したものになります。&lt;/p&gt;
&lt;h3 id=&#34;参考資料&#34;&gt;参考資料&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.slideshare.net/cloudera/using-morphlines-for-onthefly-etl&#34;&gt;Using Morphlines for On-the-Fly ETL(slideshare)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/cloudera/cdk/tree/master/cdk-morphlines&#34;&gt;cloudera/cdk/cdk-morphlines(github)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;メモ&#34;&gt;メモ&lt;/h2&gt;
&lt;h3 id=&#34;現在のコマンドライブラリスライド-18-19ページ&#34;&gt;現在のコマンドライブラリ（スライド 18-19ページ）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Solrへのインテグレートとロード&lt;/li&gt;
&lt;li&gt;フレキシブルなログファイル解析&lt;/li&gt;
&lt;li&gt;1行、複数行、CSVファイル&lt;/li&gt;
&lt;li&gt;正規表現ベースのパターンマッチと展開&lt;/li&gt;
&lt;li&gt;Avro、JSON、XML、HTMLのインテグレーション&lt;/li&gt;
&lt;li&gt;Hadoop シーケンスファイルのインテグレーション&lt;/li&gt;
&lt;li&gt;SolrCellとApache Tikaパーサすべてのインテグレーション&lt;/li&gt;
&lt;li&gt;Tikaを利用したバイナリデータからMIMEタイプの自動判別&lt;/li&gt;
&lt;li&gt;動的Javaコードのスクリプティングサポート&lt;/li&gt;
&lt;li&gt;フィールドの割り当て処理、比較処理&lt;/li&gt;
&lt;li&gt;リストやセット書式のフィールド処理&lt;/li&gt;
&lt;li&gt;if-then-else条件分岐&lt;/li&gt;
&lt;li&gt;簡易ルールエンジン（tryRules）&lt;/li&gt;
&lt;li&gt;文字列とタイムスタンプの変換&lt;/li&gt;
&lt;li&gt;slf4jロギング&lt;/li&gt;
&lt;li&gt;Yammerメトリックとカウンター&lt;/li&gt;
&lt;li&gt;ネストされたファイルフォーマットコンテナの解凍&lt;/li&gt;
&lt;li&gt;などなど&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;プラグインコマンドスライド20ページ&#34;&gt;プラグインコマンド（スライド　20ページ）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;簡単に新しいI/Oや変換コマンドが追加可能&lt;/li&gt;
&lt;li&gt;サードパーティや既存機能のインテグレード&lt;/li&gt;
&lt;li&gt;CommandインタフェースかAbstractCommandのサブクラスを実装&lt;/li&gt;
&lt;li&gt;Javaクラスパスに新規作成したものを追加&lt;/li&gt;
&lt;li&gt;登録処理などは必要ない&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;新しいプラグインコマンドとして考えられるもの22ページ&#34;&gt;新しいプラグインコマンドとして考えられるもの（22ページ）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;RDBやKVSやローカルファイルなどの外部データソースをレコードにjoin&lt;/li&gt;
&lt;li&gt;DNS名前解決とか短縮URLの展開とか&lt;/li&gt;
&lt;li&gt;ソーシャル・ネットワークからリンクされたメタデータのフェッチ（？？）&lt;/li&gt;
&lt;li&gt;レコードの感情分析とアノテーション？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;31ページの図がわかりやすいかも&lt;/p&gt;
&lt;p&gt;以上。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第11回Solr勉強会を主催しました。#SolrJP</title>
      <link>https://blog.johtani.info/blog/2013/07/29/study-of-solr/</link>
      <pubDate>Mon, 29 Jul 2013 23:15:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/07/29/study-of-solr/</guid>
      <description>&lt;p&gt;不定期開催ですが&lt;a href=&#34;http://atnd.org/events/41368/&#34;&gt;第11回Solr勉強会&lt;/a&gt;を主催しました。&lt;/p&gt;
&lt;p&gt;今回も大入り90人くらい？の参加者の皆さんがいらっしゃいました。ありがたいことです！（20時時点で最終的に補欠17人でした。）&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;不定期開催ですが&lt;a href=&#34;http://atnd.org/events/41368/&#34;&gt;第11回Solr勉強会&lt;/a&gt;を主催しました。&lt;/p&gt;
&lt;p&gt;今回も大入り90人くらい？の参加者の皆さんがいらっしゃいました。ありがたいことです！（20時時点で最終的に補欠17人でした。）&lt;/p&gt;
&lt;p&gt;&lt;strike&gt;とりあえず、第一報です。このあと懇親会なので。&lt;/strike&gt;&lt;/p&gt;
&lt;p&gt;ということで、帰りの電車でいくつか感想を（忘れちゃうから）。&lt;/p&gt;
&lt;!--  more --&gt;
&lt;p&gt;小林さんの苦労話は細かいですが、結構はまりがちな点を共有していただいたので良かったかなぁと。
Solrのexampleの設定とか、ManifoldCFとかちょっとずつ罠があったりするので、あるあるネタはありがたいと思いますｗ&lt;/p&gt;
&lt;p&gt;Cloudera Searchについては、安定の嶋内さんの喋りに圧巻でした。検索だけの視点とは異なる観点についての
話は私には足りないしてんだったりするので参考になります。
なんか、気づいたらMorphlineやスキーマ周りを調べてブログ書くことになっちゃったけど。。。
一つ質問しそこねたのがあって、Cloudera社は基本的に公開したOSSについてのトレーニングも立ち上げているイメージです。Cloudera Searchについてもトレーニングが立ち上がるのかなぁと密かに期待をしてみたり（予算の関係上参加できるかは不明ですが。。。）&lt;/p&gt;
&lt;p&gt;牧野さんの話は画像系について、私は詳しくないので、また関口さんのalikeと比較とかしてもらえると面白いかなぁと。とりあえず、青いロボットがちゃんと検索できるようになるといいですねｗｗ&lt;/p&gt;
&lt;p&gt;秀野さんの空間検索は緯度経度以外のPOLYGONなどを利用した検索で、実は私も知らない機能でしたｗ&lt;br&gt;
なとなくは知ってたんですが、そこまでちゃんと検索できるとは！地図以外にも活用できるような気がします（想像つかないんだけど。。。）&lt;/p&gt;
&lt;p&gt;最後は私の発表で、簡単な資料ですみませんでした。しかも発表よりも宣伝が。。。（ブログの宣伝だったりとか。。。）
最後に宣伝した「&lt;a href=&#34;http://www.ipsj.or.jp/dp/cfp/copy_of_copy_of_dp0502s.html&#34;&gt;「ビッグデータ活用を支えるOSS」特集への論文投稿のご案内&lt;/a&gt;」もご検討ください！&lt;/p&gt;
&lt;p&gt;懇親会も楽しかったです。また思いついたら開催しますー&lt;br&gt;
最後に、今回の発表者の皆様、会場提供していただいたVOYAGE GROUPの皆様ありがとうございました！&lt;/p&gt;
&lt;p&gt;以下はいつものメモです。&lt;/p&gt;
&lt;h2 id=&#34;manifoldcfのとsolrの組み合わせ仮株式会社-ロンウイット大須賀さん&#34;&gt;ManifoldCFのとSolrの組み合わせ（仮）株式会社 ロンウイット　大須賀さん&lt;/h2&gt;
&lt;p&gt;残念ながら、発熱のため発表は次回に持ち越しに。&lt;/p&gt;
&lt;p&gt;##社内ファイル及びWEBコンテンツの検索システム構築時に苦労したこと ソフトバンクBB㈱　小林さん&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ManifoldCF＋Solrを使って社内ファイルの検索システム構築&lt;/li&gt;
&lt;li&gt;約1000万ドキュメント&lt;/li&gt;
&lt;li&gt;さまざまなDCにドキュメントがある&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;クロールジョブのハング&#34;&gt;クロールジョブのハング。。。&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ログをDEBUGにしたら。。。ログファイル150GB。。。&lt;/li&gt;
&lt;li&gt;一定時間ごとにAgentをリスタートするバッチを。。。（力技）&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;mcfエラーによるジョブの停止&#34;&gt;MCFエラーによるジョブの停止&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;CONNECTORS-590&lt;/li&gt;
&lt;li&gt;エラーが発生して止まったジョブを起動するバッチをcronで。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;自作リアルタイムインデクシングの問題&#34;&gt;自作リアルタイムインデクシングの問題&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;MCF使わないでSlaveにインデックス&lt;/li&gt;
&lt;li&gt;openSearcher=falseだとautoCommitが実行されてもSearcherを再起動しないので検索にでてこない&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;リプリケーションのnw負荷&#34;&gt;リプリケーションのNW負荷&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;別DCからのレプリケーションが複数が一度に実施される→ネットワーク負荷が。。。&lt;/li&gt;
&lt;li&gt;cronで別々にレプリすることでNW負荷を分散できてるかな。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;cloudera-search-入門仮-cloudera-株式会社嶋内さん&#34;&gt;Cloudera Search 入門(仮) Cloudera 株式会社　嶋内さん&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;マサカリ画像がｗ&lt;/li&gt;
&lt;li&gt;SolrのコミッターMark Millerさんもジョインしてる&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;clouderaとhadoop入門とか&#34;&gt;ClouderaとHadoop入門とか。&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;いろいろあるよ、エコシステム&lt;/li&gt;
&lt;li&gt;4つの分類。
&lt;ul&gt;
&lt;li&gt;データの取り込み&lt;/li&gt;
&lt;li&gt;データの保存&lt;/li&gt;
&lt;li&gt;データの活用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;search&#34;&gt;Search&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;検索エンジンなら数十億人が使い方を知ってる（Clouderaのチャールズ・ゼドルースキ）&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;cloudera-search&#34;&gt;Cloudera Search&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Hadoopのためのインタラクティブな検索&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CDHとSolrの統合&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OSS！&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;利点とか。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データ解析にも使えるよね、検索&lt;/li&gt;
&lt;li&gt;非構造化データの検索にもいいよね&lt;/li&gt;
&lt;li&gt;単一プラットフォームによるコスパ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;cloudera-searchの事例&#34;&gt;Cloudera Searchの事例&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;バイオテクノロジー企業で画像検索とか&lt;/li&gt;
&lt;li&gt;医療系企業でいろんなログイベントの管理とか&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;cloudera-searchのアーキテクチャ&#34;&gt;Cloudera Searchのアーキテクチャ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Flumeでストリーミングで登録&lt;/li&gt;
&lt;li&gt;HBaseデータの登録&lt;/li&gt;
&lt;li&gt;M/Rでバッチ登録&lt;/li&gt;
&lt;li&gt;HueのWebインタフェース&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Morphlines、HBaseはLinyプロジェクトのもの&lt;/p&gt;
&lt;p&gt;Solr使うならCDH！！&lt;/p&gt;
&lt;h4 id=&#34;qa&#34;&gt;QA&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Q：デモで使われたTwitterの検索のデータ料とかは？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A：デモ環境ですので小さい。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Q：スキーマってどうするの？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A：スキーマは。。。私が書こうかなぁ、ブログ。。。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;コンピュータビジョン株式会社-curious-vehicle牧野さん&#34;&gt;コンピュータビジョン　株式会社 Curious Vehicle　牧野さん&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;色々やってます&lt;/li&gt;
&lt;li&gt;コンピュータビジョンの説明（某ネコ型ロボットのいろんな画像がｗ）&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;画像検索の流れ&#34;&gt;画像検索の流れ&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;特徴情報の抽出&lt;/li&gt;
&lt;li&gt;特徴情報のクラスタリングによるword化&lt;/li&gt;
&lt;li&gt;Solrによる画像情報の検索&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id=&#34;1-特徴情報の抽出&#34;&gt;1. 特徴情報の抽出&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;SIFT特徴点解析&lt;/li&gt;
&lt;li&gt;グレースケールしてからSIFT&lt;/li&gt;
&lt;li&gt;注意！SIFTは商用ライセンスが必要です&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;2-特徴情報のクラスタリングによるword化&#34;&gt;2. 特徴情報のクラスタリングによるword化&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;K-meansでクラスタリング&lt;/li&gt;
&lt;li&gt;クラスタ情報をヒストグラム化してSolrへ&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;3-solrによる画像情報の検索&#34;&gt;3. Solrによる画像情報の検索&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;物体認識ベンチマークセット（ケンタッキー大）を使って。&lt;/li&gt;
&lt;li&gt;やっぱり良し悪しある。データセットに特化したチューニングしてます。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;つぎのステップ&#34;&gt;つぎのステップ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;文字認識とか顔認識&lt;/li&gt;
&lt;li&gt;つぎはドラえもんじゃねぇ、検索とかも。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;ガウシアンによる画像ぼかしの例&#34;&gt;ガウシアンによる画像ぼかしの例&lt;/h5&gt;
&lt;h4 id=&#34;qa-1&#34;&gt;QA&lt;/h4&gt;
&lt;p&gt;マイク回しててメモ取れず。。。&lt;/p&gt;
&lt;h2 id=&#34;国土交通省のデータをsolrで検索株式会社ネクスト秀野さん&#34;&gt;国土交通省のデータをSolrで検索　株式会社ネクスト　秀野さん&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://speakerdeck.com/ryo0301/guo-jiao-sheng-falsedetawosolrdejian-suo&#34;&gt;スライドはこちら&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;評価の関係で。。。&lt;/li&gt;
&lt;li&gt;Spatial検索の話&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;デモの想定機能&#34;&gt;デモの想定機能&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;地図上の小学校を起点に物件検索&lt;/li&gt;
&lt;li&gt;地図上をクリックしたところを中心に検索&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;デモ環境&#34;&gt;デモ環境&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Solr4.3.0、PostGIS 2.0.3、東京都のデータ&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;事前知識&#34;&gt;事前知識&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ジオメトリーデータ（点、線、面がある）&lt;/li&gt;
&lt;li&gt;WKB/WKT、Intersects（しらなかった。こんなのもあるのか）&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;環境&#34;&gt;環境&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;EC2上にPostGIS＋Solrで構築&lt;/li&gt;
&lt;li&gt;WKT形式でDIHでインポートできるらしい。&lt;/li&gt;
&lt;li&gt;Solr＋S3をJSでGoogleMapへ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;solr-44新機能をちょっと紹介johtani&#34;&gt;Solr 4.4新機能をちょっと紹介　@johtani&lt;/h2&gt;
&lt;p&gt;紹介というよりも宣伝。。。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>『プログラミング Hive』 『Hadoop 第3版』刊行記念セミナーに参加しました！ #oreilly0724</title>
      <link>https://blog.johtani.info/blog/2013/07/25/hadoop-hive-publication-party/</link>
      <pubDate>Thu, 25 Jul 2013 02:11:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/07/25/hadoop-hive-publication-party/</guid>
      <description>&lt;p&gt;Hadoopとか離れちゃってるし、Hive触ったこと無いにもかかわらず参加しました！&lt;br&gt;
（たまたま近くにいるからって理由なのは内緒で）&lt;br&gt;
玉川さんの四方山話を聞くのが主目的で参加しました。（ちょっと翻訳が気になってるので）&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Hadoopとか離れちゃってるし、Hive触ったこと無いにもかかわらず参加しました！&lt;br&gt;
（たまたま近くにいるからって理由なのは内緒で）&lt;br&gt;
玉川さんの四方山話を聞くのが主目的で参加しました。（ちょっと翻訳が気になってるので）&lt;/p&gt;
&lt;p&gt;イベントページは&lt;a href=&#34;http://connpass.com/event/2944/&#34;&gt;こちら&lt;/a&gt;&lt;br&gt;
刊行記念イベントにも関わらず、想像以上の人の入りでびっくりしました。Hadoop、Hive界隈はまだまだ人気なんだなぁと。&lt;br&gt;
プレゼントじゃんけん大会もあったのですが、早々に負けてしまったのが悔やまれます。。。
Team Geek欲しかったなぁ。もちろん、懇親会まで参加しました。&lt;/p&gt;
&lt;p&gt;以下、いつものメモです。&lt;/p&gt;
&lt;!--  more --&gt;
&lt;h2 id=&#34;hiveの正しい使い方cloudera-嶋内さん&#34;&gt;Hiveの正しい使い方（Cloudera 嶋内さん）&lt;/h2&gt;
&lt;p&gt;残念ながら、マサカリは持ってなかったです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スライドの各所に本の章番号が書いてあるのがうれしい。&lt;/li&gt;
&lt;li&gt;Hiveロゴが回ってたのでスライドの時に集中できなかったｗ&lt;/li&gt;
&lt;li&gt;Impalaの話も出てきた。
&lt;ul&gt;
&lt;li&gt;速いけど、色々足りない。Hiveの置き換えじゃないよと。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;hiveとimpalaのおいしいとこ取りセラン須田さん&#34;&gt;HiveとImpalaのおいしいとこ取り（セラン　須田さん）&lt;/h2&gt;
&lt;p&gt;スライド：&lt;a href=&#34;http://www.slideshare.net/sudabon/20130724-oreilly-org&#34;&gt;http://www.slideshare.net/sudabon/20130724-oreilly-org&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;オンプレだとCDH便利だよと教えてもらう&lt;/li&gt;
&lt;li&gt;いくつかSlideshareにImpalaの性能評価の資料を上げてある（必要になったら検索で。。。）&lt;/li&gt;
&lt;li&gt;リリースされたその日に性能評価やってレポート書くとかすごすぎ！&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;翻訳の四方山話玉川さん&#34;&gt;翻訳の四方山話（玉川さん）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;翻訳＝写経です&lt;/li&gt;
&lt;li&gt;締め切り駆動勉強法ｗ&lt;/li&gt;
&lt;li&gt;4page/day&lt;/li&gt;
&lt;li&gt;自分から電突してオライリーさんに翻訳させてくださいと。&lt;/li&gt;
&lt;li&gt;他の方の本が読めない（チェックしちゃうのでｗ）&lt;/li&gt;
&lt;li&gt;動機があるから読めるってのはあるだろうなぁ。&lt;/li&gt;
&lt;li&gt;選び方：わくわくするもの、仕事に活きるもの&lt;/li&gt;
&lt;li&gt;今年もあと2冊やる予定（Hadoop Operations、Vagrantを翻訳中）&lt;/li&gt;
&lt;li&gt;来年の候補（Chefとか）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;高可用性hdfsのご紹介cloudera-小林さん&#34;&gt;高可用性HDFSのご紹介（Cloudera 小林さん）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;スライドにどの版で書いてあったかがわかりやすく書いてある。&lt;/li&gt;
&lt;li&gt;3段階の開発フェーズを経てる&lt;/li&gt;
&lt;li&gt;QJMのお話&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;cloudera-universityとhadoop認定試験cloudera-川崎さん&#34;&gt;Cloudera UniversityとHadoop認定試験（Cloudera 川崎さん）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Clouderaデータアナリスト向けトレーニング（3日間、10月日本語で開催予定）
&lt;ul&gt;
&lt;li&gt;Hive、Pig、Impalaなど&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Data Science入門コースも準備中&lt;/li&gt;
&lt;li&gt;出版記念！
&lt;ul&gt;
&lt;li&gt;8月管理者向け先着20 or 30名にHadoop第3版贈呈予定&lt;/li&gt;
&lt;li&gt;先着20名にプログラミングHive贈呈予定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Yokozunaの気になる点というかなんというか</title>
      <link>https://blog.johtani.info/blog/2013/07/11/yokozuna-check-point/</link>
      <pubDate>Thu, 11 Jul 2013 01:43:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/07/11/yokozuna-check-point/</guid>
      <description>&lt;p&gt;Yokozunaの気になる点というか、自分だったらこのへん調べるだろうなって観点を上げてみます。
別に調べるわけじゃないので、完全に自己満足なメモですけど。&lt;br&gt;
ちなみに、分散システムとかRiakの仕組みは詳しくないので、ズレてる点がいっぱいあるかも。&lt;br&gt;
というか、分散システムでテストというか、検討する点とかってまとまってる資料とかあるのかなぁ？&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Yokozunaの気になる点というか、自分だったらこのへん調べるだろうなって観点を上げてみます。
別に調べるわけじゃないので、完全に自己満足なメモですけど。&lt;br&gt;
ちなみに、分散システムとかRiakの仕組みは詳しくないので、ズレてる点がいっぱいあるかも。&lt;br&gt;
というか、分散システムでテストというか、検討する点とかってまとまってる資料とかあるのかなぁ？&lt;/p&gt;
&lt;!-- more --&gt;
&lt;ul&gt;
&lt;li&gt;スキーマ変更時の挙動
&lt;ul&gt;
&lt;li&gt;フィールド型変更とか、フィールド追加とか&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;既存RiakクラスタにYokozunaの機能を追加する方法と制限
&lt;ul&gt;
&lt;li&gt;タイムラグとかも&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Riak＋Yokozunaクラスタに対してノード追加時に発生するオーバーヘッド（ネットワークとかディスクIOとか）&lt;/li&gt;
&lt;li&gt;性能検証のためのシナリオ（どっちが先に悲鳴をあげるかとか）
&lt;ul&gt;
&lt;li&gt;Riakメインで、Yokozunaはおまけ程度に検索するというシナリオ&lt;/li&gt;
&lt;li&gt;Yokozunaメインで使うシナリオ&lt;/li&gt;
&lt;li&gt;更新が多い場合のシナリオ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Riakのみ、Riak＋Yokozunaの各種統計情報（CPU、メモリ、ディスクサイズ、ネットワークIO）&lt;/li&gt;
&lt;li&gt;運用系（監視とか）の手法とか機能？とか&lt;/li&gt;
&lt;li&gt;バージョンアップなどの対応方法&lt;/li&gt;
&lt;li&gt;Solrがコケた時とかの対処&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;とりあえず、こんな感じかなぁ。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Riak Meetup Tokyo #2に参加しました。#riakjp</title>
      <link>https://blog.johtani.info/blog/2013/07/10/riak-meetup-tokyo-no2/</link>
      <pubDate>Wed, 10 Jul 2013 18:57:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/07/10/riak-meetup-tokyo-no2/</guid>
      <description>&lt;p&gt;先日、Bashoさんにおじゃましたのもあり、&lt;a href=&#34;http://connpass.com/event/2656/&#34;&gt;Riak Meetup Tokyo #2&lt;/a&gt;に参加しました。&lt;br&gt;
Yokozunaの話も聞けるということで。
懇親会も参加しました。Vさん＆リピさんと話し込んじゃってあんまり他の人と話せなかったけど。。。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;先日、Bashoさんにおじゃましたのもあり、&lt;a href=&#34;http://connpass.com/event/2656/&#34;&gt;Riak Meetup Tokyo #2&lt;/a&gt;に参加しました。&lt;br&gt;
Yokozunaの話も聞けるということで。
懇親会も参加しました。Vさん＆リピさんと話し込んじゃってあんまり他の人と話せなかったけど。。。&lt;/p&gt;
&lt;p&gt;以下はいつものメモです。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;freakout-久森さん-riak環境をプロダクションで構築運用してみた仮&#34;&gt;FreakOut 久森さん 「Riak環境をプロダクションで構築＆運用してみた（仮）」&lt;/h2&gt;
&lt;h3 id=&#34;freakoutとrtb&#34;&gt;FreakOutとRTB&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ディスプレイ広告の新しい配信の枠の話&lt;/li&gt;
&lt;li&gt;この人には何出すの？いくらで？みたいな感じ&lt;/li&gt;
&lt;li&gt;純広告：表示保証、期間保証など&lt;/li&gt;
&lt;li&gt;RTB：1回の広告表示ごとに買い付け&lt;/li&gt;
&lt;li&gt;DSP（デマンド・サイト・プラットフォーム）&lt;/li&gt;
&lt;li&gt;広告表示は大体0.1秒で表示しないといけない。この間に色々やってる。
&lt;ul&gt;
&lt;li&gt;50ms or die.で戦ってます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;RTBはCPUバウンド
&lt;ul&gt;
&lt;li&gt;多コアを安く並べたい&lt;/li&gt;
&lt;li&gt;Tokyoなんとかとか使ってた。
&lt;ul&gt;
&lt;li&gt;スケーラビリティがキツイ（クライアント側でアルゴリズム分散してる）&lt;/li&gt;
&lt;li&gt;データ解析もしたいけど、検索ができない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;RTBに適したRiakがうまくハマるのではと。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;構成とか&#34;&gt;構成とか&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;アプリはPerlなので、PerlでRiakクライアントが必要。Memcached互換とかあると嬉しい。&lt;/li&gt;
&lt;li&gt;ProtobufサポートもPurePerlしかなかった。&lt;/li&gt;
&lt;li&gt;ないなら、作ろうと。&lt;a href=&#34;https://github.com/myfinder?tab=repositories&#34;&gt;githubに上がってます。このへんかな？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;監視はcloudforecastとかでやってる。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;課題&#34;&gt;課題&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Redirectがつらい（haproxy？がつらい？）&lt;/li&gt;
&lt;li&gt;Setが詰まるとつらい（ケースがまだわからない）&lt;/li&gt;
&lt;li&gt;対策１
&lt;ul&gt;
&lt;li&gt;memcached＋Riak&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;対応２（案）
&lt;ul&gt;
&lt;li&gt;hashからpartitionに直接取りに行くとか&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;素のままRiakはちょっとつらい&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;qa&#34;&gt;QA&lt;/h4&gt;
&lt;p&gt;聞き取れたやつだけ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Q：1台いくら位ですか？
&lt;ul&gt;
&lt;li&gt;A：10万から11万くらい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q：どのくらいの性能ですか？
&lt;ul&gt;
&lt;li&gt;A：同時1000くらいをさばいてる？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q：50ms以下を出すのに、ネットワーク周りで近さとかを考えることありますか？
&lt;ul&gt;
&lt;li&gt;A：国内だと10msあればなんとかなる。それよりもアプリ側のチューニングのほうがまだ重要&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q：Cassandraとか候補に挙がらなかったんですか？
&lt;ul&gt;
&lt;li&gt;A：苦しんでる人が知人にいるので。。。あと、用途的に違うので。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q：バックエンドとしてはなにを？
&lt;ul&gt;
&lt;li&gt;A：bitcaskにしてる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q：サーバ構成、ネットワーク構成がどうなってる？
&lt;ul&gt;
&lt;li&gt;A：。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q：Redirectとは？RiakがやってるRedirect？
&lt;ul&gt;
&lt;li&gt;A：はい。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q：他に候補にあがったのは？
&lt;ul&gt;
&lt;li&gt;A：&lt;a href=&#34;http://www.aerospike.com&#34;&gt;商用のaerospike（これかな？）&lt;/a&gt;がスケールできそうだったけど、クライアントがいまいち。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;感想&#34;&gt;感想&lt;/h3&gt;
&lt;p&gt;広告業界のことをよくわかってないので、微妙にピンときてなかったりもするのですが、以下に素早く返すかって観点でどこに注力して、問題点を潰していくのかってのは面白そうだなぁと。
リクエスト処理の性能がクリアできたらつぎはスケールの観点（ノード追加時の挙動とか）で検証していくんだろうなと。次回の話も聞いてみたい感じです。&lt;/p&gt;
&lt;h2 id=&#34;iij-曽我部さん田中さん-yokozuna-日本語検索性能を評価しました&#34;&gt;IIJ 曽我部さん、田中さん 「Yokozuna 日本語検索性能を評価しました」&lt;/h2&gt;
&lt;h3 id=&#34;yokozunaって&#34;&gt;Yokozunaって？&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Riak＋Solrでいいとこ取り&lt;/li&gt;
&lt;li&gt;データの登録とかはRiakのAPIで。&lt;/li&gt;
&lt;li&gt;SolrのAPIが使える。&lt;/li&gt;
&lt;li&gt;YokozunaがSolrの分散検索の部分を隠してくれる。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;yokozunaのインストールとか&#34;&gt;Yokozunaのインストールとか。&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;SolrのAPIっぽい形で検索できるし、戻りもSolrのXMLっぽいのが出てくるよ。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;wikipediaデータってstoreの性能とか&#34;&gt;Wikipediaデータってstoreの性能とか。&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Riakのノード32台。（Xeon、メモリ24GB、HDD。。。）&lt;/li&gt;
&lt;li&gt;yz_extractor：Riakのコンテンツタイプを見てSolrにデータを入れる処理が書いてある。&lt;/li&gt;
&lt;li&gt;自分でschema.xmlを書いてYokozunaに指定することもできる。
&lt;ul&gt;
&lt;li&gt;スキーマの変更とか登録とか。
&lt;ul&gt;
&lt;li&gt;すでに指定済みスキーマを変更した場合の挙動ってどうなるの？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;デモではSolrからid取って、Riakからその他のデータを取り出していた。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;rubyでの性能評価&#34;&gt;Rubyでの性能評価&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ベンチマークプログラム側の問題が先に影響が出てしまった。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;qa-1&#34;&gt;QA&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Q：Riak単体とYokozunaつかった時でディスク容量がどのくらい増えた？
&lt;ul&gt;
&lt;li&gt;A：ちゃんと調べてないが、10%くらい増えた気がする。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q：Solr側の設定でstored=trueだけど、falseにしてもいいんじゃないの？
&lt;ul&gt;
&lt;li&gt;A：デモはfalseにしてます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q：スキーマってあとから変更できるんですかね？
&lt;ul&gt;
&lt;li&gt;A：まだ良くわかってないです。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q：ノードの追加、削除時の挙動とかも気になります。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;感想-1&#34;&gt;感想&lt;/h3&gt;
&lt;p&gt;今回はStore性能に関してでしたが、今後は検索性能やシナリオによる性能（KVSの処理メインで、時々全文検索とか、全文検索の処理も結構あるパターンとか）の測定とか、耐障害性とかの観点で調査を進めてもらってSolr勉強会で話をしてもらえると面白そうだなぁと勝手に思ってみたり。
Solr勉強会へのコンタクトお待ちしてます！ｗ&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>スキーマレスモード？（SOLR-4897）を調べて見ました。</title>
      <link>https://blog.johtani.info/blog/2013/07/04/schemaless-example/</link>
      <pubDate>Thu, 04 Jul 2013 01:12:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/07/04/schemaless-example/</guid>
      <description>&lt;p&gt;Solr 4.4に取り込まれる予定のチケットで、気になるものを見つけたのでいつものごとく調べてみました。&lt;/p&gt;
&lt;p&gt;元となるチケットは&lt;a href=&#34;https://issues.apache.org/jira/browse/SOLR-4897&#34;&gt;こちら。SOLR-4897&lt;/a&gt;。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;スキーマレス&#34;&gt;スキーマレス？&lt;/h2&gt;
&lt;p&gt;Solrはschema.xmlにデータの定義（フィールドタイプやフィールドなど）を記述して、データを登録する全文検索システムです。
これまでのSolrではこの設定ファイルを元にデータを登録するフィールド名を決定しており、
変更を行う場合はSolrのコアを再起動するなどの手順が必要でした。（※ダイナミックフィールドはすこし特殊）&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Solr 4.4に取り込まれる予定のチケットで、気になるものを見つけたのでいつものごとく調べてみました。&lt;/p&gt;
&lt;p&gt;元となるチケットは&lt;a href=&#34;https://issues.apache.org/jira/browse/SOLR-4897&#34;&gt;こちら。SOLR-4897&lt;/a&gt;。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;スキーマレス&#34;&gt;スキーマレス？&lt;/h2&gt;
&lt;p&gt;Solrはschema.xmlにデータの定義（フィールドタイプやフィールドなど）を記述して、データを登録する全文検索システムです。
これまでのSolrではこの設定ファイルを元にデータを登録するフィールド名を決定しており、
変更を行う場合はSolrのコアを再起動するなどの手順が必要でした。（※ダイナミックフィールドはすこし特殊）&lt;/p&gt;
&lt;p&gt;それだと、Solrを管理するのがめんどくさいですね？という感じで現れたのが&lt;a href=&#34;http://wiki.apache.org/solr/SchemaRESTAPI&#34;&gt;SchemaREST API&lt;/a&gt;です。（たぶん。）&lt;/p&gt;
&lt;h2 id=&#34;schema-rest-api&#34;&gt;Schema REST API&lt;/h2&gt;
&lt;p&gt;Solr 4.2から導入されたSolrのスキーマに関する情報を提供するためのREST APIです。
4.2で導入されたのはあくまでもschema.xmlの情報を取得するためのAPIでした。
たとえば、Fieldの一覧を取得するとか。&lt;/p&gt;
&lt;p&gt;4.4から、フィールドの追加（変更、削除はできない）ができるようになりました。あくまでも、フィールドの追加で、フィールドタイプなどの追加はまだできません。（できるようになるのかもわからないですが。）
フィールドの追加方法などは&lt;a href=&#34;http://wiki.apache.org/solr/SchemaRESTAPI?highlight=%28managed%29#Adding_fields_to_a_schema&#34;&gt;Wiki&lt;/a&gt;に記載がありました。&lt;/p&gt;
&lt;p&gt;ということで、簡単に試してみることに。&lt;/p&gt;
&lt;h2 id=&#34;起動方法&#34;&gt;起動方法&lt;/h2&gt;
&lt;p&gt;exampleディレクトリの下にexample-schemalessというディレクトリが新設されています。
ここに、スキーマレスモード用の設定がされているファイルが入っているので、こちらを利用します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cd $SOLR/example
java -Dsolr.solr.home=example-schemaless/solr -jar start.jar
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ログにいくつかWARNが出ますが、影響の内パス設定ミスなので無視してOKです。&lt;/p&gt;
&lt;p&gt;最初に定義されているフィールドは「id」と「_version_」のみになります。（Schema Browserなどで確認できます。あ、REST APIでもいいですね。&lt;a href=&#34;http://localhost:8983/solr/schema/fields&#34;&gt;http://localhost:8983/solr/schema/fields&lt;/a&gt;）&lt;/p&gt;
&lt;h2 id=&#34;スキーマの更新&#34;&gt;スキーマの更新&lt;/h2&gt;
&lt;p&gt;さて、フィールドを追加してみます。
PUTを利用すると1フィールドの追加が可能です。
「fugatext」というフィールド名でフィールドを追加しています。今のところJSONのみ対応みたいです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ curl -X PUT http://localhost:8983/solr/schema/fields/fugatext -H &amp;#39;Content-Type: application/json&amp;#39; -d &amp;#39;{&amp;#34;type&amp;#34;:&amp;#34;text_ja&amp;#34;,&amp;#34;stored&amp;#34;:false,&amp;#34;multiValued&amp;#34;:true}&amp;#39;
{
  &amp;#34;responseHeader&amp;#34;:{
    &amp;#34;status&amp;#34;:0,
    &amp;#34;QTime&amp;#34;:18}}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;追加できたかどうかもREST APIで取得してみます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ curl http://localhost:8983/solr/schema/fields
{
  &amp;#34;responseHeader&amp;#34;:{
    &amp;#34;status&amp;#34;:0,
    &amp;#34;QTime&amp;#34;:0},
  &amp;#34;fields&amp;#34;:[{
      &amp;#34;name&amp;#34;:&amp;#34;_version_&amp;#34;,
      &amp;#34;type&amp;#34;:&amp;#34;long&amp;#34;,
      &amp;#34;indexed&amp;#34;:true,
      &amp;#34;stored&amp;#34;:true},
    {
      &amp;#34;name&amp;#34;:&amp;#34;fugatext&amp;#34;,
      &amp;#34;type&amp;#34;:&amp;#34;text_ja&amp;#34;,
      &amp;#34;multiValued&amp;#34;:true,
      &amp;#34;stored&amp;#34;:false},
    {
      &amp;#34;name&amp;#34;:&amp;#34;id&amp;#34;,
      &amp;#34;type&amp;#34;:&amp;#34;string&amp;#34;,
      &amp;#34;multiValued&amp;#34;:false,
      &amp;#34;indexed&amp;#34;:true,
      &amp;#34;required&amp;#34;:true,
      &amp;#34;stored&amp;#34;:true,
      &amp;#34;uniqueKey&amp;#34;:true}]}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;追加できました。
ちなみに、同じフィールド名を追加しようとするとエラーが帰ってきます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ curl -X PUT http://localhost:8983/solr/schema/fields/fugatext -H &amp;#39;Content-Type: application/json&amp;#39; -d &amp;#39;{&amp;#34;type&amp;#34;:&amp;#34;text_ja&amp;#34;,&amp;#34;stored&amp;#34;:false,&amp;#34;multiValued&amp;#34;:true}&amp;#39;
{
  &amp;#34;responseHeader&amp;#34;:{
    &amp;#34;status&amp;#34;:400,
    &amp;#34;QTime&amp;#34;:1},
  &amp;#34;error&amp;#34;:{
    &amp;#34;msg&amp;#34;:&amp;#34;Field &amp;#39;fugatext&amp;#39; already exists.&amp;#34;,
    &amp;#34;code&amp;#34;:400}}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;設定の違い&#34;&gt;設定の違い&lt;/h2&gt;
&lt;p&gt;example-schemalessのsolrconfig.xmlは以下の設定が通常のexampleとは異なるようです。&lt;/p&gt;
&lt;h4 id=&#34;schemafactoryの設定&#34;&gt;schemaFactoryの設定&lt;/h4&gt;
&lt;p&gt;schemaをAPIから変更可能にする設定です。これまでの変更しない設定の場合は&lt;code&gt;ClassicIndexSchemaFactory&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-xml&#34; data-lang=&#34;xml&#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;&amp;lt;schemaFactory&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ManagedIndexSchemaFactory&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;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;&amp;lt;bool&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;mutable&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;true&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/bool&amp;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;&amp;lt;str&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;managedSchemaResourceName&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;managed-schema&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/str&amp;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;&amp;lt;/schemaFactory&amp;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;updatechainの設定&#34;&gt;update.chainの設定&lt;/h4&gt;
&lt;p&gt;更新処理（update関連のリクエストハンドラ「/update」とか）には次のような設定が追加されていました。（1006行目あたり）&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  &amp;lt;requestHandler name=&amp;#34;/update&amp;#34; class=&amp;#34;solr.UpdateRequestHandler&amp;#34;&amp;gt;
    &amp;lt;!-- See below for information on defining 
         updateRequestProcessorChains that can be used by name 
         on each Update Request
      --&amp;gt;
    &amp;lt;lst name=&amp;#34;defaults&amp;#34;&amp;gt;
      &amp;lt;str name=&amp;#34;update.chain&amp;#34;&amp;gt;add-unknown-fields-to-the-schema&amp;lt;/str&amp;gt;
    &amp;lt;/lst&amp;gt;
  &amp;lt;/requestHandler&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;「add-unknown-fields-to-the-schema」というupdate.chainが指定されています。このchainの定義自体は1669行目くらいに存在します。
（長い。。。）&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  &amp;lt;!-- Add unknown fields to the schema 
  
       An example field type guessing update processor that will
       attempt to parse string-typed field values as Booleans, Longs,
       Doubles, or Dates, and then add schema fields with the guessed
       field types.  
       
       This requires that the schema is both managed and mutable, by
       declaring schemaFactory as ManagedIndexSchemaFactory, with
       mutable specified as true. 
       
       See http://wiki.apache.org/solr/GuessingFieldTypes
    --&amp;gt;
  &amp;lt;updateRequestProcessorChain name=&amp;#34;add-unknown-fields-to-the-schema&amp;#34;&amp;gt;
    &amp;lt;processor class=&amp;#34;solr.RemoveBlankFieldUpdateProcessorFactory&amp;#34;/&amp;gt;
    &amp;lt;processor class=&amp;#34;solr.ParseBooleanFieldUpdateProcessorFactory&amp;#34;/&amp;gt;
    &amp;lt;processor class=&amp;#34;solr.ParseLongFieldUpdateProcessorFactory&amp;#34;/&amp;gt;
    &amp;lt;processor class=&amp;#34;solr.ParseDoubleFieldUpdateProcessorFactory&amp;#34;/&amp;gt;
    &amp;lt;processor class=&amp;#34;solr.ParseDateFieldUpdateProcessorFactory&amp;#34;&amp;gt;
      &amp;lt;arr name=&amp;#34;format&amp;#34;&amp;gt;
        &amp;lt;str&amp;gt;yyyy-MM-dd&amp;#39;T&amp;#39;HH:mm:ss.SSSZ&amp;lt;/str&amp;gt;
        &amp;lt;str&amp;gt;yyyy-MM-dd&amp;#39;T&amp;#39;HH:mm:ss,SSSZ&amp;lt;/str&amp;gt;
        &amp;lt;str&amp;gt;yyyy-MM-dd&amp;#39;T&amp;#39;HH:mm:ss.SSS&amp;lt;/str&amp;gt;
        &amp;lt;str&amp;gt;yyyy-MM-dd&amp;#39;T&amp;#39;HH:mm:ss,SSS&amp;lt;/str&amp;gt;
        &amp;lt;str&amp;gt;yyyy-MM-dd&amp;#39;T&amp;#39;HH:mm:ssZ&amp;lt;/str&amp;gt;
        &amp;lt;str&amp;gt;yyyy-MM-dd&amp;#39;T&amp;#39;HH:mm:ss&amp;lt;/str&amp;gt;
        &amp;lt;str&amp;gt;yyyy-MM-dd&amp;#39;T&amp;#39;HH:mmZ&amp;lt;/str&amp;gt;
        &amp;lt;str&amp;gt;yyyy-MM-dd&amp;#39;T&amp;#39;HH:mm&amp;lt;/str&amp;gt;
        &amp;lt;str&amp;gt;yyyy-MM-dd HH:mm:ss.SSSZ&amp;lt;/str&amp;gt;
        &amp;lt;str&amp;gt;yyyy-MM-dd HH:mm:ss,SSSZ&amp;lt;/str&amp;gt;
        &amp;lt;str&amp;gt;yyyy-MM-dd HH:mm:ss.SSS&amp;lt;/str&amp;gt;
        &amp;lt;str&amp;gt;yyyy-MM-dd HH:mm:ss,SSS&amp;lt;/str&amp;gt;
        &amp;lt;str&amp;gt;yyyy-MM-dd HH:mm:ssZ&amp;lt;/str&amp;gt;
        &amp;lt;str&amp;gt;yyyy-MM-dd HH:mm:ss&amp;lt;/str&amp;gt;
        &amp;lt;str&amp;gt;yyyy-MM-dd HH:mmZ&amp;lt;/str&amp;gt;
        &amp;lt;str&amp;gt;yyyy-MM-dd HH:mm&amp;lt;/str&amp;gt;
        &amp;lt;str&amp;gt;yyyy-MM-dd&amp;lt;/str&amp;gt;
      &amp;lt;/arr&amp;gt;
    &amp;lt;/processor&amp;gt;
    &amp;lt;processor class=&amp;#34;solr.AddSchemaFieldsUpdateProcessorFactory&amp;#34;&amp;gt;
      &amp;lt;str name=&amp;#34;defaultFieldType&amp;#34;&amp;gt;text_general&amp;lt;/str&amp;gt;
      &amp;lt;lst name=&amp;#34;typeMapping&amp;#34;&amp;gt;
        &amp;lt;str name=&amp;#34;valueClass&amp;#34;&amp;gt;java.lang.Boolean&amp;lt;/str&amp;gt;
        &amp;lt;str name=&amp;#34;fieldType&amp;#34;&amp;gt;booleans&amp;lt;/str&amp;gt;
      &amp;lt;/lst&amp;gt;
      &amp;lt;lst name=&amp;#34;typeMapping&amp;#34;&amp;gt;
        &amp;lt;str name=&amp;#34;valueClass&amp;#34;&amp;gt;java.util.Date&amp;lt;/str&amp;gt;
        &amp;lt;str name=&amp;#34;fieldType&amp;#34;&amp;gt;tdates&amp;lt;/str&amp;gt;
      &amp;lt;/lst&amp;gt;
      &amp;lt;lst name=&amp;#34;typeMapping&amp;#34;&amp;gt;
        &amp;lt;str name=&amp;#34;valueClass&amp;#34;&amp;gt;java.lang.Long&amp;lt;/str&amp;gt;
        &amp;lt;str name=&amp;#34;valueClass&amp;#34;&amp;gt;java.lang.Integer&amp;lt;/str&amp;gt;
        &amp;lt;str name=&amp;#34;fieldType&amp;#34;&amp;gt;tlongs&amp;lt;/str&amp;gt;
      &amp;lt;/lst&amp;gt;
      &amp;lt;lst name=&amp;#34;typeMapping&amp;#34;&amp;gt;
        &amp;lt;str name=&amp;#34;valueClass&amp;#34;&amp;gt;java.lang.Number&amp;lt;/str&amp;gt;
        &amp;lt;str name=&amp;#34;fieldType&amp;#34;&amp;gt;tdoubles&amp;lt;/str&amp;gt;
      &amp;lt;/lst&amp;gt;
    &amp;lt;/processor&amp;gt;
    &amp;lt;processor class=&amp;#34;solr.LogUpdateProcessorFactory&amp;#34;/&amp;gt;
    &amp;lt;processor class=&amp;#34;solr.RunUpdateProcessorFactory&amp;#34;/&amp;gt;
  &amp;lt;/updateRequestProcessorChain&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;使ってるUpdateProcessorはこんな感じみたいです。最後の2つはこれ用じゃないので省略。&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;プロセッサ名&lt;/th&gt;&lt;th&gt;説明&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;RemoveBlankFieldUpdateProcessorFactory&lt;/td&gt;&lt;td&gt;値がないフィールドは除去&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ParseBooleanFieldUpdateProcessorFactory&lt;/td&gt;&lt;td&gt;スキーマに定義されていないフィールドで、値がBooleanとしてパースできたら、Boolean型とする。&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ParseLongFieldUpdateProcessorFactory&lt;/td&gt;&lt;td&gt;スキーマに定義されていないフィールドで、値がLongとしてパースできたら、Long型とする。&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ParseDoubleFieldUpdateProcessorFactory&lt;/td&gt;&lt;td&gt;スキーマに定義されていないフィールドで、値がDoubleとしてパースできたら、Double型とする。&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ParseDateFieldUpdateProcessorFactory&lt;/td&gt;&lt;td&gt;スキーマに定義されていないフィールドで、値がDateとしてパースできたら、Date型とする。（パースの形式がformatで列挙されてる）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;AddSchemaFieldsUpdateProcessorFactory&lt;/td&gt;&lt;td&gt;入力されたドキュメントの中でスキーマに定義されていないフィールド（静的、動的両方）を見つけた時に、フィールドの値の型を元にフィールド型をマッピングする。&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;とここまで見てきたところで、スキーマレスという名前の意図がちょっとわかったかも。&lt;/p&gt;
&lt;h2 id=&#34;定義されてないフィールドを持ったデータを登録&#34;&gt;定義されてないフィールドを持ったデータを登録&lt;/h2&gt;
&lt;p&gt;起動時には定義されてないフィールドをもったデータを登録してみます。
boolean型で試してみることに。以下のデータを管理画面のデータ登録画面から登録します。（http://localhost:8983/solr/#/collection1/documents）
（タイトルでbooleanってわかりにくいですが）&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{&amp;#34;id&amp;#34;:&amp;#34;change.me&amp;#34;,&amp;#34;title&amp;#34;:true, &amp;#34;price&amp;#34;:1.25, &amp;#34;fuga&amp;#34;:&amp;#34;100,200&amp;#34;}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;エラーは出ません。で、またフィールド一覧を取得すると。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ curl http://localhost:8983/solr/schema/fields
{
  &amp;#34;responseHeader&amp;#34;:{
    &amp;#34;status&amp;#34;:0,
    &amp;#34;QTime&amp;#34;:1},
  &amp;#34;fields&amp;#34;:[{
      &amp;#34;name&amp;#34;:&amp;#34;_version_&amp;#34;,
      &amp;#34;type&amp;#34;:&amp;#34;long&amp;#34;,
      &amp;#34;indexed&amp;#34;:true,
      &amp;#34;stored&amp;#34;:true},
    {
      &amp;#34;name&amp;#34;:&amp;#34;fuga&amp;#34;,
      &amp;#34;type&amp;#34;:&amp;#34;tlongs&amp;#34;},
    {
      &amp;#34;name&amp;#34;:&amp;#34;fugatext&amp;#34;,
      &amp;#34;type&amp;#34;:&amp;#34;text_ja&amp;#34;,
      &amp;#34;multiValued&amp;#34;:true,
      &amp;#34;stored&amp;#34;:false},
    {
      &amp;#34;name&amp;#34;:&amp;#34;id&amp;#34;,
      &amp;#34;type&amp;#34;:&amp;#34;string&amp;#34;,
      &amp;#34;multiValued&amp;#34;:false,
      &amp;#34;indexed&amp;#34;:true,
      &amp;#34;required&amp;#34;:true,
      &amp;#34;stored&amp;#34;:true,
      &amp;#34;uniqueKey&amp;#34;:true},
    {
      &amp;#34;name&amp;#34;:&amp;#34;price&amp;#34;,
      &amp;#34;type&amp;#34;:&amp;#34;tdoubles&amp;#34;},
    {
      &amp;#34;name&amp;#34;:&amp;#34;title&amp;#34;,
      &amp;#34;type&amp;#34;:&amp;#34;booleans&amp;#34;}]}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;おー、最後にtitleが追加されてます。他にもfugaやpriceも。（日付は手を抜きました。。。）&lt;/p&gt;
&lt;h2 id=&#34;感想&#34;&gt;感想&lt;/h2&gt;
&lt;p&gt;詳細までは追いかけてないですが、こんなかんじです。
フィールド追加が可能になるのはいいんじゃないでしょうか。SolrCloudの機能との関連もあるのかもしれません。ZooKeeperへの出力も実装されてそうなので。&lt;/p&gt;
&lt;p&gt;ただ、機械的に出力されたschema.xml（exampleだとmanaged-schemaというファイル）には_「DO NOT EDIT」_との記述があるので、修正するとなにかおきてしまうかもしれないですねぇ。
現時点では、フィールドタイプの変更やフィールドの更新、削除に関してはSolrCoreの再起動などの手順が必要です。
あと、変なデータ（タイプミスとか）が登録されたりしないかってのは気になりますね。&lt;/p&gt;
&lt;p&gt;※ちなみに、別の人が気づいたんですが、ちょっとバグが有ったみたいで、代わりにチケットつくったらキリ番（&lt;a href=&#34;https://issues.apache.org/jira/browse/SOLR-5000&#34;&gt;SOLR-5000&lt;/a&gt;）
ゲットしましたｗ&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Solrの管理画面でデータ登録</title>
      <link>https://blog.johtani.info/blog/2013/06/27/upload-docs-solr-admin/</link>
      <pubDate>Thu, 27 Jun 2013 16:28:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/06/27/upload-docs-solr-admin/</guid>
      <description>&lt;p&gt;SolrのチケットをML経由で眺めてるんですが、便利そうなチケットが流れてきたのでブログを書いてみみようかと。
元になってるチケットは&lt;a href=&#34;https://issues.apache.org/jira/browse/SOLR-4921&#34;&gt;こちら&lt;/a&gt;です。昨日だか、今朝にtrunkとbranch_4xにコミットされたみたいです。試してみたい方は、branch_4xかtrunkをチェックアウトすると触ることができます。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;データ登録用の画面json&#34;&gt;データ登録用の画面（JSON）&lt;/h2&gt;
&lt;p&gt;branch_4xをチェックアウトしてexampleを起動し、Solrにアクセスします。&lt;br&gt;
管理画面に「Dcuments」という項目が追加されてます。開くとこんなかんじです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;SolrのチケットをML経由で眺めてるんですが、便利そうなチケットが流れてきたのでブログを書いてみみようかと。
元になってるチケットは&lt;a href=&#34;https://issues.apache.org/jira/browse/SOLR-4921&#34;&gt;こちら&lt;/a&gt;です。昨日だか、今朝にtrunkとbranch_4xにコミットされたみたいです。試してみたい方は、branch_4xかtrunkをチェックアウトすると触ることができます。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;データ登録用の画面json&#34;&gt;データ登録用の画面（JSON）&lt;/h2&gt;
&lt;p&gt;branch_4xをチェックアウトしてexampleを起動し、Solrにアクセスします。&lt;br&gt;
管理画面に「Dcuments」という項目が追加されてます。開くとこんなかんじです。&lt;/p&gt;
&lt;p&gt;
  &lt;img src=&#34;https://blog.johtani.info/images/entries/20130626/add_default_page.jpg&#34; alt=&#34;デフォルトのデータ登録画面&#34;&gt;

&lt;/p&gt;
&lt;p&gt;なんと、デフォルトはJSONになってます。これも時代の流れでしょうかｗ&lt;br&gt;
Solrでは、これまで設定ファイルやデータ登録もXMLがメインになっていました。（&lt;a href=&#34;http://www.amazon.co.jp/gp/product/4774141755/ref=as_li_ss_tl?ie=UTF8&amp;amp;camp=247&amp;amp;creative=7399&amp;amp;creativeASIN=4774141755&amp;amp;linkCode=as2&amp;amp;tag=johtani-22&#34;&gt;Apache Solr入門&lt;/a&gt;もXMLを基本に書いてます。このころはまだデフォルトでは対応してなかったので）&lt;/p&gt;
&lt;p&gt;登録するデータをテキストエリアに記述して、「Submit Document」をクリックすればデータは登録されます。基本的には単件登録の画面でしょうか。
（登録されたデータを確認するには「Query」画面を利用すればいいです。）
また、JSONのデータ形式は&lt;a href=&#34;http://wiki.apache.org/solr/UpdateJSON&#34;&gt;SolrのWiki&lt;/a&gt;を参照してください。&lt;/p&gt;
&lt;h3 id=&#34;csvやxmlも&#34;&gt;CSVやXMLも&lt;/h3&gt;
&lt;p&gt;この管理画面ではJSON以外の形式でもデータの登録が可能です。
「Document Type」の項目をクリックすると以下のように選択肢があられます。&lt;/p&gt;
&lt;p&gt;
  &lt;img src=&#34;https://blog.johtani.info/images/entries/20130626/select_document_type.jpg&#34; alt=&#34;Document Typeの選択&#34;&gt;

&lt;/p&gt;
&lt;p&gt;CSV、XMLについては、先ほどのJSONの画面の用に、テキストエリアが表示されます。
テキストエリアにCSV（データの形式は&lt;a href=&#34;http://wiki.apache.org/solr/UpdateCSV&#34;&gt;こちら&lt;/a&gt;）やXML（データの形式は&lt;a href=&#34;http://wiki.apache.org/solr/UpdateXmlMessages&#34;&gt;こちら&lt;/a&gt;）を入力してボタンを押せば登録できます。&lt;/p&gt;
&lt;h3 id=&#34;solr-command形式もjosnかxml&#34;&gt;Solr Command形式も（JOSNかXML）&lt;/h3&gt;
&lt;p&gt;Solr Command というのはXMLやJSONで登録、コミット、削除などを実行するための画面になります。
JSONのコマンドは&lt;a href=&#34;http://wiki.apache.org/solr/UpdateJSON#Update_Commands&#34;&gt;こちら&lt;/a&gt;、XMLのコマンドは&lt;a href=&#34;http://wiki.apache.org/solr/UpdateXmlMessages&#34;&gt;こちら&lt;/a&gt;をご覧ください。&lt;/p&gt;
&lt;p&gt;あと、便利なのがファイルアップロードです。
こんなかんじで、ファイルを選んでSubmitすればデータが登録出来ます。&lt;/p&gt;
&lt;p&gt;
  &lt;img src=&#34;https://blog.johtani.info/images/entries/20130626/file_upload.jpg&#34; alt=&#34;File Uploadの画面&#34;&gt;

&lt;/p&gt;
&lt;p&gt;ファイルのサイズが大きいとちょっと時間がかかりますが、コマンドを打つより簡単かもしれません。
post.jarツールと違って、デフォルトでコミットをしてくれるわけではないので、「Extracting Req. Handler Params」に「commit=true」をつけないと、データが登録されてない？と思ってしまうかもしれませんが。&lt;/p&gt;
&lt;h3 id=&#34;組立もできるみたいdocument-builder&#34;&gt;組立もできるみたい（Document Builder）&lt;/h3&gt;
&lt;p&gt;最後に紹介するのが「Document Builder」というタイプです。&lt;/p&gt;
&lt;p&gt;
  &lt;img src=&#34;https://blog.johtani.info/images/entries/20130626/document_builder_desc.jpg&#34; alt=&#34;Document Builderの画面説明&#34;&gt;

&lt;/p&gt;
&lt;p&gt;もっと簡易にデータを記述できるようにということで用意されているようです。
フィールドの情報はSolrに接続して利用できるフィールド？（ダイナミックはないのかな？）が表示されます。&lt;/p&gt;
&lt;p&gt;
  &lt;img src=&#34;https://blog.johtani.info/images/entries/20130626/document_builder_fields.jpg&#34; alt=&#34;Document Builderでフィールド表示&#34;&gt;

&lt;/p&gt;
&lt;p&gt;追記していくとこんなかんじになります。&lt;/p&gt;
&lt;p&gt;
  &lt;img src=&#34;https://blog.johtani.info/images/entries/20130626/document_builder_.jpg&#34; alt=&#34;出来上がったドキュメント&#34;&gt;

&lt;/p&gt;
&lt;p&gt;日本語のデータもちゃんと登録できました。
ただ、まだ、開発中なんでしょうがないかもしれませんが、以下の様な制約があるようです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;multiValuedなフィールドに値を追加できない（上書きされる）&lt;/li&gt;
&lt;li&gt;改行が入ったデータをテキストエリアにいれると「Add Field」を押しても反応しない&lt;/li&gt;
&lt;li&gt;ダイナミックフィールドは自分で書きましょう&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ただ、これまでXMLでファイルを作ってコマンドで登録したり、curlコマンドでJSON書いたりして登録していたよりはお手軽にさわれるようになるかと思います。つぎの4x系のバージョンが出たときはこちらからデータを登録してみてください。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Kibana3というのもありまして</title>
      <link>https://blog.johtani.info/blog/2013/06/19/introduction-kibana3/</link>
      <pubDate>Wed, 19 Jun 2013 23:43:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/06/19/introduction-kibana3/</guid>
      <description>&lt;p&gt;前回は3番煎じぐらいでしたが、今回は初記事かな？（だといいな）&lt;/p&gt;
&lt;p&gt;Kibanaには、&lt;a href=&#34;http://blog.johtani.info/blog/2013/06/10/fluent-es-kibana/&#34;&gt;前回の記事&lt;/a&gt;で書いたものとは別に開発中の&lt;a href=&#34;http://three.kibana.org/&#34;&gt;Kibana3&lt;/a&gt;というのが存在します。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;kibana3って&#34;&gt;Kibana3って？&lt;/h2&gt;
&lt;p&gt;Kibana2はRubyで書かれていましたが、Kibana3はHTML＋JavaScriptで構成されています。
ですので、ApacheなどのWebサーバに配置することで、利用が可能となります。
ただ、HTML＋JavaScriptのため、ブラウザ上で動作するためブラウザが動作するマシンからElasticSearch（通常だと&lt;code&gt;http://マシン名orIPアドレス:9200/&lt;/code&gt;とか）にアクセスできなければいけないという制限があります。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;前回は3番煎じぐらいでしたが、今回は初記事かな？（だといいな）&lt;/p&gt;
&lt;p&gt;Kibanaには、&lt;a href=&#34;http://blog.johtani.info/blog/2013/06/10/fluent-es-kibana/&#34;&gt;前回の記事&lt;/a&gt;で書いたものとは別に開発中の&lt;a href=&#34;http://three.kibana.org/&#34;&gt;Kibana3&lt;/a&gt;というのが存在します。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;kibana3って&#34;&gt;Kibana3って？&lt;/h2&gt;
&lt;p&gt;Kibana2はRubyで書かれていましたが、Kibana3はHTML＋JavaScriptで構成されています。
ですので、ApacheなどのWebサーバに配置することで、利用が可能となります。
ただ、HTML＋JavaScriptのため、ブラウザ上で動作するためブラウザが動作するマシンからElasticSearch（通常だと&lt;code&gt;http://マシン名orIPアドレス:9200/&lt;/code&gt;とか）にアクセスできなければいけないという制限があります。&lt;/p&gt;
&lt;p&gt;この条件さえクリア出来れば、Kibana3ではKibana2よりも様々なパネルが用意されていて、色々できそうなのでお勧めです。&lt;/p&gt;
&lt;h2 id=&#34;インストール&#34;&gt;インストール&lt;/h2&gt;
&lt;p&gt;ElasticSearchやログについては、前回の記事の環境を利用しました。
ですので、Kibana3のインストールのみです。（ApacheもCentOSのサーバに入っていたので。）&lt;/p&gt;
&lt;p&gt;ダウンロードして、Apacheの公開ディレクトリに置いただけです。（お試し環境のため、権限とかは大目に見てください。&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git clone https://github.com/elasticsearch/kibana.git kibana-javascript
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ cp -R kibana-javascript /var/www/html
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;今回はApacheとElasticSearchが同一マシン（＝同一IPアドレスでアクセス可能）で動作している＋ElasticSearchへのアクセスのポートがデフォルト（9200）のため特に設定が必要ありませんでした。&lt;/p&gt;
&lt;p&gt;ElasticSeachサーバとKibana3のApacheのサーバが別のサーバの場合やElasticSearchサーバのポートが異なる場合はkibana-javascript/config.jsファイルの編集が必要になります。
cloneしてすぐのconfig.jsは、以下のとおりです。&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:#75715e&#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;
&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;elasticsearch:  URL to your elasticsearch server. You almost certainly don&amp;#39;t
&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;                want &amp;#39;http://localhost:9200&amp;#39; here. Even if Kibana and ES are on
&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;                the same host
&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;kibana_index:   The default ES index to use for storing Kibana specific object
&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;                such as stored dashboards
&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;modules:        Panel modules to load. In the future these will be inferred
&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;                from your initial dashboard, though if you share dashboards you
&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;                will probably need to list them all here
&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;
&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;If you need to configure the default dashboard, please see dashboards/default
&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;
&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;*/&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;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;config&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Settings&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:#75715e&#34;&gt;// By default this will attempt to reach ES at the same host you have
&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;// elasticsearch installed on. You probably want to set it to the FQDN of your
&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;// elasticsearch host
&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;elasticsearch&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;window.&lt;span style=&#34;color:#a6e22e&#34;&gt;location&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;hostname&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;:9200&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:#75715e&#34;&gt;// elasticsearch: &amp;#39;http://localhost:9200&amp;#39;,
&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;kibana_index&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;     &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kibana-int&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;modules&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;          [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;histogram&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;map&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;pie&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;table&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;stringquery&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;sort&amp;#39;&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:#e6db74&#34;&gt;&amp;#39;timepicker&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;text&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;fields&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;hits&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;dashcontrol&amp;#39;&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:#e6db74&#34;&gt;&amp;#39;column&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;derivequeries&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;trends&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;bettermap&amp;#39;&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ポート番号が異なる場合は、1つ目の「elasticsearch:」で指定されている「9200」を環境に合わせて編集するだけになります。
Kibana3とElasticSearchのホストが異なる場合は、1つ目の「elasticsearch:」の行をコメントアウトし、2つ目を有効にしてから環境に合わせたURLに修正して保存すればOKです。&lt;/p&gt;
&lt;p&gt;以上で、インストールは完了します。あとは、以下のURLにアクセスするだけです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;http://hogehoge/kibana-javascript/
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;画面構成&#34;&gt;画面構成&lt;/h2&gt;
&lt;p&gt;アクセスすると次のような画面が表示されます。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130619/kibana3&amp;#43;kibana2-es-index.jpeg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130619/kibana3&amp;#43;kibana2-es-index.jpeg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
    &lt;figcaption align=&#34;center&#34;&gt;&lt;h4&gt;初期画面&lt;/h4&gt;
    &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;左上に赤い帯で、「 Oops! Could not match index pattern to any ElasticSearch indices」とエラーが表示されました。&lt;/p&gt;
&lt;p&gt;KibanaはElasticSearchに「logstatsh-年.月.日」という日付ごとのインデックスが存在することが前提となっています。
Kibanaに初めてアクセスした場合、「logstash-当日日付」で始まるインデックスを描画しようとします。
これは、私が前回利用したElasticSearchの環境に古いデータ（試したのが19日、データは10日のみ）しか入っていないために出たエラーです。&lt;/p&gt;
&lt;p&gt;日付は「Options」というエラーが出ている付近の「Absolute」というリンクをクリックすると、特定の日付をカレンダーで指定することができるようになります。データは6/10にしか入っていないので、6/10（12時くらいから20時くらいまで）のを指定します。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130619/kibana3-selected-calendar.jpeg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130619/kibana3-selected-calendar.jpeg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
    &lt;figcaption align=&#34;center&#34;&gt;&lt;h4&gt;日付指定&lt;/h4&gt;
    &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;選択すると無事データが見えるようになりました。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130619/Kibana3-sample-include-description.jpeg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130619/Kibana3-sample-include-description.jpeg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
    &lt;figcaption align=&#34;center&#34;&gt;&lt;h4&gt;データ描画&lt;/h4&gt;
    &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h3 id=&#34;ダッシュボードの構成初期&#34;&gt;ダッシュボードの構成（初期）&lt;/h3&gt;
&lt;p&gt;Kibana3では、この画面をダッシュボードというようです。
このダッシュボードは初期状態では、以下のパーツが表示されています。（子要素があとで説明するパネル名です）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Options：描画対象の日付の指定やダッシュボードの保存などを行うRow
&lt;ul&gt;
&lt;li&gt;timepickerパネル：日付の指定&lt;/li&gt;
&lt;li&gt;dashcontrolパネル：ダッシュボードの制御（保存とか）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Query：ログ検索式を入れるところ
&lt;ul&gt;
&lt;li&gt;stringqueryパネル&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Graph：ヒストグラムの描画（X軸：時間、Y軸：ログ件数）
&lt;ul&gt;
&lt;li&gt;histogramパネル&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Events：検索にヒットしたログデータの描画領域
&lt;ul&gt;
&lt;li&gt;fieldsパネル：表示するフィールドの選択（左側。チェックを入れると右側のログ表示領域のカラムが増える）&lt;/li&gt;
&lt;li&gt;tableパネル：ログデータ（右側。左側でチェックが入ったカラムだけが表示される。）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;あくまで初期表示です。各パーツの設定アイコン（歯車のマーク）をクリックすると色々と設定が可能です。
また、「Events」など名称はクリック可能となっていて、クリックすると、そのパーツが折りたたまれた状態にすることも可能です。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130619/kibana3-collaped.jpeg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130619/kibana3-collaped.jpeg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
    &lt;figcaption align=&#34;center&#34;&gt;&lt;h4&gt;折りたたんだ状態&lt;/h4&gt;
    &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h3 id=&#34;ダッシュボードの設定&#34;&gt;ダッシュボードの設定&lt;/h3&gt;
&lt;p&gt;ダッシュボードには独自のパネルを簡単に追加することができます。
ダッシュボードの構成はページの一番上にある「Logstash Search」の設定アイコンをクリックすると設定画面が開きます。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130619/kibana3-dashboad-setting.jpeg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130619/kibana3-dashboad-setting.jpeg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
    &lt;figcaption align=&#34;center&#34;&gt;&lt;h4&gt;ダッシュボード設定&lt;/h4&gt;
    &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;「New row」にタイトル名を適当にいれて「Create Row」するとあたらしくパネルを追加することができるRowが追加されます。「Rows」の「Move」にある矢印でRow自体の表示場所を上下に移動することも可能です。&lt;/p&gt;
&lt;h3 id=&#34;rowの設定&#34;&gt;Rowの設定&lt;/h3&gt;
&lt;p&gt;追加した「Hoge」にパネルを追加する場合はHogeの上にある設定アイコンをクリックすると設定画面が開きます。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130619/kibana3-row-setting.jpeg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130619/kibana3-row-setting.jpeg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
    &lt;figcaption align=&#34;center&#34;&gt;&lt;h4&gt;Rowの設定&lt;/h4&gt;
    &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;ここでKibana3で用意されているパネルの追加ができます。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130619/kibana3-panel-add.jpeg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130619/kibana3-panel-add.jpeg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
    &lt;figcaption align=&#34;center&#34;&gt;&lt;h4&gt;Panel追加ボタン&lt;/h4&gt;
    &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;パネルを選んでボタンを押せばすぐに表示されます。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130619/kibana3-sample-panels.jpeg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130619/kibana3-sample-panels.jpeg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
    &lt;figcaption align=&#34;center&#34;&gt;&lt;h4&gt;パネルの羅列&lt;/h4&gt;
    &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;こんな感じです。とりあえず、ポコポコと追加してみました。&lt;/p&gt;
&lt;p&gt;利用できるパネルの種類は以下の様なパターンです。
適当ですが、表にしてみました。&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;パネル名&lt;/th&gt;&lt;th&gt;概要&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;column&lt;/td&gt;&lt;td&gt;Rowの中にパネルを配置するコンテナを用意するためのパネル&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;dashcontrol&lt;/td&gt;&lt;td&gt;ダッシュボードの保存、保存したダッシュボードの表示などの操作ボタン&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;text&lt;/td&gt;&lt;td&gt;markdown形式などで記述が可能な文章を表示できるパネル&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;stringquery&lt;/td&gt;&lt;td&gt;検索クエリ入力用パネル&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;derivequeries&lt;/td&gt;&lt;td&gt;フィールドと検索式がわかれた形式の検索入力用パネル&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;timepicker&lt;/td&gt;&lt;td&gt;ログ表示の期間を指定するパネル&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;histogram&lt;/td&gt;&lt;td&gt;ログの件数のヒストグラム表示用パネル&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;hits&lt;/td&gt;&lt;td&gt;ヒット件数表示用パネル&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;pie&lt;/td&gt;&lt;td&gt;パイチャート表示用パネル&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;trends&lt;/td&gt;&lt;td&gt;指定された時間でデータの増減を%表示するパネル&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;sort&lt;/td&gt;&lt;td&gt;ソート条件指定用のプルダウン表示用パネル（変更したらtableの内容がソートされる）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;table&lt;/td&gt;&lt;td&gt;ログデータ表示用パネル&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;fields&lt;/td&gt;&lt;td&gt;tableパネルに表示するフィールドを選択するための補助パネル&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;bettermap&lt;/td&gt;&lt;td&gt;なんか地図が出てきたパネル&lt;br/&gt;GeoJSONデータをゴニョゴニョ（表示かな？）できるみたい&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;map&lt;/td&gt;&lt;td&gt;なんか世界地図が出てきたパネル&lt;br/&gt;２文字の国コード（jaとかか？）かU.S.の州コードのデータを元に地図に色をつけるのかな？&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;これらのパネルは個々に色々と設定が可能です。他にもdebug、map2など有りそうでしたがまだ使えないみたいです。&lt;/p&gt;
&lt;p&gt;適当に触ってて気づいた注意点です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;tableは１ダッシュボードで１つだけが良さそう。
&lt;ul&gt;
&lt;li&gt;２つあると、どちらかにしか描画されない。columnに入れるとグルーピングできたりするのかなぁ？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;stringquery、timepickerも１ダッシュボードで１つが良さそう。
&lt;ul&gt;
&lt;li&gt;これもtableと似たような理由です。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ダッシュボード保存し忘れて泣きそうになる
&lt;ul&gt;
&lt;li&gt;JSで実装されてて、自分で色々とカスタマイズできるのですが、保存するのを忘れて泣きそうになりましたｗ&lt;/li&gt;
&lt;li&gt;カスタマイズしたダッシュボードについては、ローカルに保存する以外にElasticSearchにも保存ができるみたいです。チームで共有することもできそうです。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;derivequeriesを表示するとグラフがカラフルに
&lt;ul&gt;
&lt;li&gt;derivequeriesを追加したらグラフが急にカラフルになりました。&lt;/li&gt;
&lt;li&gt;どうもderivequeriesのFieldの部分を変更すると、そのフィールドの値を元にグラフを細分化してくれるようです。色の数の上限はderivequeriesのLength属性の数値で制御出来ます。（5だと5個まで色が出る）&lt;/li&gt;
&lt;li&gt;histogramのパネルで自分でクエリを記載することも可能です。ただ、derivequeriesのフィールド変更すると書き換わっちゃいます。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130619/kibana3-multi-color-histogram-type.jpeg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130619/kibana3-multi-color-histogram-type.jpeg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
    &lt;figcaption align=&#34;center&#34;&gt;&lt;h4&gt;derivequeriesを追加したらカラフルに&lt;/h4&gt;
    &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;ヒストグラムは色々なパターンのグラフを描画できました。ラインによる描画（histo1）、総数を100%としたパーセンテージでの表示（histo2）、ライン＋点による描画（histo3）などです。&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130619/kibana3-several-histogram.jpeg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130619/kibana3-several-histogram.jpeg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
    &lt;figcaption align=&#34;center&#34;&gt;&lt;h4&gt;ヒストグラムのいくつかのパターン&lt;/h4&gt;
    &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h2 id=&#34;感想&#34;&gt;感想&lt;/h2&gt;
&lt;p&gt;ということで、適当にですが触ってみました。
Kibana2はApacheのアクセスログとかの表示しかできない感じがしましたが、Kibana3だといろいろなデータを描画できそうだなと。
logstash形式のインデックスを用意するのが前提になってるので、時系列データをグラフ描画するのに向いてるんでしょうか。
お手軽にグラフ化できるし、自分でダッシュボードをカスタマイズできるのは素敵です。
ただ、クエリとグラフの関係などはちょっと癖があるかもしれないので、色々と試してみないといけないかもしれないです。
（たとえば、特定のフィールドの値について「A、B、その他」みたいなグラフの描画とかをどうするかとか）&lt;/p&gt;
&lt;p&gt;地図の描画は試してみたいかなぁ。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Basho Japanに遊びに行きました</title>
      <link>https://blog.johtani.info/blog/2013/06/19/visited-basho/</link>
      <pubDate>Wed, 19 Jun 2013 10:03:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/06/19/visited-basho/</guid>
      <description>&lt;p&gt;ちょくちょく書こうと言いながら、前の記事が1週間以上前になってる。。。&lt;/p&gt;
&lt;p&gt;昨日は、Basho Japanに遊びに行って来ました。
（Riak触ったことないのに。。。Erlangも。。。ゴメンナサイ）&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ちょくちょく書こうと言いながら、前の記事が1週間以上前になってる。。。&lt;/p&gt;
&lt;p&gt;昨日は、Basho Japanに遊びに行って来ました。
（Riak触ったことないのに。。。Erlangも。。。ゴメンナサイ）&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;RiakにSolrを組み合わせたYokozunaというものの名前を最近耳にしていたので、どんなものなのかなぁと興味がありまして。Solrがどんな使い方をされているのかってのが気になったので、
情報交換したいなぁと思っていたところ、Vの人が調整してくれたので色々と有意義な話ができたかなぁと。
（Yokozunaについての最新のスライドは&lt;a href=&#34;https://speakerdeck.com/rzezeski/yokozuna-scaling-solr-with-riak&#34;&gt;Berlin Buzzword 2013のものがここに&lt;/a&gt;）
Twitter上で見かけたことのある方々と話ができたり面白かったです。（やっぱ英語で会話できたりスラスラと読めるの必要だよなぁと痛感したりもしました。。。）&lt;/p&gt;
&lt;p&gt;ということで、遊びに行ったのに美味しいピザやこんなおみやげまでもらってしまいました。
（ピザの写真撮るの忘れてたw）&lt;/p&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130619/riak-goods.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130619/riak-goods.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
    &lt;figcaption align=&#34;center&#34;&gt;&lt;h4&gt;Riak＆Bashoグッズ&lt;/h4&gt;
    &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;ちなみに、Yokozunaですが、Riakに登録したデータを裏で起動しているSolにデータを流しこんでくれるものになります。
Solrの機能としては分散検索（Distributed Search）と呼ばれる仕組みを利用しているようです。
YokozunaのI/Fとしては、Solrのインデックスの分散構成は隠してくれていて、かつ、Solr（っぽい？）リクエストを投げれば裏の分散構成に問い合わせた結果をSolrのレスポンスの形で返してくれます。
KVSに全文検索の機能がついてくるお得感が満載な気がしますw。&lt;/p&gt;
&lt;p&gt;Riak自身のデータの取り扱いがどんなものかをまだちゃんと理解していないので（ゴメンナサイ。&lt;a href=&#34;http://littleriakbook.com&#34;&gt;Little Riak Book&lt;/a&gt;は開いてるんですが読んでなくて。。。）またおじゃましてもう少し情報交換したいかなぁとｗ。&lt;/p&gt;
&lt;p&gt;Cloudera Searchといい、Yokozunaといい、Solrを利用したものが少しずつ増えてきて嬉しい限りです。
Solrの作りがしっかりしている？活発？、だから取り込む形が多いんですかねぇ。
Solr本を書いてから数年たちますが、やっと検索のニーズが出てきたのかもしれないなぁと思ってみたり。
（流れのつながりはあまりないですが）ElasticSearchも少しずつ人気が出てきてるし、日本語の本とかのニーズあったりするかなぁ？&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Solr入門？</title>
      <link>https://blog.johtani.info/presentation/2013/solrru-men/</link>
      <pubDate>Tue, 18 Jun 2013 00:00:00 +0000</pubDate>
      
      <guid>https://blog.johtani.info/presentation/2013/solrru-men/</guid>
      <description></description>
      <content:encoded></content:encoded>
    </item>
    
    <item>
      <title>新しいsolr.xmlとCore探索ロジック</title>
      <link>https://blog.johtani.info/blog/2013/06/11/new-solr-xml/</link>
      <pubDate>Tue, 11 Jun 2013 19:11:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/06/11/new-solr-xml/</guid>
      <description>&lt;p&gt;Lucene/Solr 4.3.1のRCのVoteが始まっていますが、そのMLできになったコトがあり、ちょっと調べたので
メモを残しておきます。&lt;/p&gt;
&lt;p&gt;マルチコアの設定ファイルであるsolr.xmlの記述方法と、コアの探索ロジックが4.4（実装的には4.3から入っている）から変更されるようです。4.x系の最新版である、branch_4xのexampleディレクトリにあるsolr.xmlも新しい記述に変更されていました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Lucene/Solr 4.3.1のRCのVoteが始まっていますが、そのMLできになったコトがあり、ちょっと調べたので
メモを残しておきます。&lt;/p&gt;
&lt;p&gt;マルチコアの設定ファイルであるsolr.xmlの記述方法と、コアの探索ロジックが4.4（実装的には4.3から入っている）から変更されるようです。4.x系の最新版である、branch_4xのexampleディレクトリにあるsolr.xmlも新しい記述に変更されていました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h3 id=&#34;参考url&#34;&gt;参考URL&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://wiki.apache.org/solr/Core%20Discovery%20%284.4%20and%20beyond%29&#34;&gt;新しいCore探索（4.4以降）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://wiki.apache.org/solr/Solr.xml%204.4%20and%20beyond&#34;&gt;新しいsolr.xml（4.4以降）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://wiki.apache.org/solr/Solr.xml%20%28supported%20through%204.x%29&#34;&gt;4.3までのsolr.xml&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ちなみに、最後のold styleと呼ばれる4.3までの記述方法はつぎの5.0ではDeprecatedになるようです。（5.0がいつ出るのかはわからないですが。）&lt;/p&gt;
&lt;h2 id=&#34;core探索ロジック&#34;&gt;Core探索ロジック&lt;/h2&gt;
&lt;p&gt;4.4から、$SOLR_HOMEディレクトリ以下の探索ロジックは次のようになるようです。
以下では、「新スタイル」（4.4以降の書式）、「旧スタイル」（4.3以下の書式）として記述します。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;solr.xmlファイルの存在チェック
&lt;ol&gt;
&lt;li&gt;solr.xmlが存在しない場合→旧スタイルとして処理→3へ（旧スタイル）&lt;/li&gt;
&lt;li&gt;solr.xmlが存在し&lt;code&gt;&amp;lt;cores&amp;gt;&lt;/code&gt;タグが存在しない場合→2へ（新スタイル）&lt;/li&gt;
&lt;li&gt;solr.xmlが存在し&lt;code&gt;&amp;lt;cores&amp;gt;&lt;/code&gt;タグが存在する場合→3へ（旧スタイル）&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;新スタイルのロジック
&lt;ol&gt;
&lt;li&gt;SOLR_HOMEディレクトリに存在するディレクトリについて以下の処理を繰り返す&lt;/li&gt;
&lt;li&gt;SOLR_HOME/ディレクトリ/core.propertiesファイルが存在する→後続処理へ。存在しなければ終了&lt;/li&gt;
&lt;li&gt;SOLR_HOME/ディレクトリ/conf/solrconfig.xmlを読み込み、コアを起動&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;旧スタイルのロジック
&lt;ol&gt;
&lt;li&gt;これまで同様、solr.xmlの&lt;code&gt;&amp;lt;core&amp;gt;&lt;/code&gt;タグの記載内容を元にコアを起動（instanceDir以下のconf/solrconfig.xmlを使って）&lt;/li&gt;
&lt;li&gt;solr.xmlが存在しない場合はSOLR_HOME/collection1/conf/solrconfig.xmlが存在するものとしてコアを起動&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;このようなロジックになります。&lt;/p&gt;
&lt;p&gt;ちなみに、以下の場合はエラーとなりSolrは起動しますがログや管理画面にエラーである表示がされます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2.3でsolrconfig.xmlが見つけられなかった場合&lt;/li&gt;
&lt;li&gt;3.1で&lt;code&gt;&amp;lt;core&amp;gt;&lt;/code&gt;タグが存在しなかった場合（この場合、ログにはエラーが出ません）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;propertiesに記述できる内容やsolr.xmlの記述内容については、Wikiを見てもらうということで。。。
CoreAdminHandlerでコアを生成したりした場合に、新スタイルの設定がどのように出力されるのかといった点が気になりますが、また今度にでも。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>apache-loggen &#43; fluentd &#43; elasticsearch &#43; kibana = ログ検索デモ</title>
      <link>https://blog.johtani.info/blog/2013/06/10/fluent-es-kibana/</link>
      <pubDate>Mon, 10 Jun 2013 23:34:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/06/10/fluent-es-kibana/</guid>
      <description>&lt;p&gt;もう何番煎じだ？ってくらい書かれてますが、コリもせず書いてみました。
Elasticsearch＋Kibanaの環境を作って、タムタムさんのログ生成ツールからApacheのダミーログを流しこんで入れてみました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;もう何番煎じだ？ってくらい書かれてますが、コリもせず書いてみました。
Elasticsearch＋Kibanaの環境を作って、タムタムさんのログ生成ツールからApacheのダミーログを流しこんで入れてみました。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;参考url&#34;&gt;参考URL&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://memocra.blogspot.jp/2013/04/kibanakibanaelasticsearchfluentd.html&#34;&gt;memorycraftさんのブログ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://kibana.org/&#34;&gt;Kibana&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://wwwelasticsearch.org&#34;&gt;Elasticsearch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://fluentd.org&#34;&gt;fluentd&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mt.orz.at/archives/2012/11/apacherubygems.html&#34;&gt;apache-loggen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;インストールと起動&#34;&gt;インストールと起動&lt;/h2&gt;
&lt;p&gt;今回はCentOSへのインストールです。
基本的にはmemorycraftさんのブログの流れのままです。&lt;/p&gt;
&lt;h3 id=&#34;elasticserchのインストールと起動&#34;&gt;elasticserchのインストールと起動&lt;/h3&gt;
&lt;p&gt;ダウンロードして、起動するだけ。
お試しということで、-fオプションにてコンソールにログ出力。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curl -OL https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.90.1.tar.gz
tar zxvf elasticsearch-0.90.1.tar.gz
cd elasticsearch-0.90.1
./bin/elasticsearch -f
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;kibanaのインストールと起動&#34;&gt;Kibanaのインストールと起動&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;git clone&lt;/code&gt;してbundleインストール&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git clone --branch=kibana-ruby https://github.com/rashidkpc/Kibana.git
cd Kibana
bundle install
ruby kibana.rb
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これで、Kibana＋ESのインストール＋起動が完了。
下地が完了。&lt;/p&gt;
&lt;h3 id=&#34;td-agentのインストールと起動&#34;&gt;td-agentのインストールと起動&lt;/h3&gt;
&lt;p&gt;ログの流し込みはlogstashなのですが、fluentdのelasticsearchプラグインにて流しこむこともできます。
td.repoとしてtd-agentのリポジトリを登録してから以下を実行します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;yum install td-agent -y
/usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-elasticsearch
vim　/etc/td-agent/td-agent.conf
/etc/init.d/td-agent start
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これで、td-agentがインストール出来ました。
次は設定です。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;source&amp;gt;
  type tail
  format apache
  path /var/log/httpd/dummy_access_log
  tag dummy.apache.access
&amp;lt;/source&amp;gt;

&amp;lt;match *.apache.*&amp;gt;
  index_name adminpack
  type_name apache
  type elasticsearch
  include_tag_key true
  tag_key @log_name
  host localhost
  port 9200
  logstash_format true
  flush_interval 10s
&amp;lt;/match&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;以上が設定です。td-agentはtd-agentというユーザで起動されるので、/var/log/httpdディレクトリにアクセスできるかだけ確認が必要です。&lt;br&gt;
いくつかの設定値について気になったので調べました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;index_name：adminpackとなってるが、elasticsearchではlogstash-xxxとなってる。
&lt;ul&gt;
&lt;li&gt;これは、logstash_formatがtrueの場合は、利用されないので、指定しなくてもいい。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;type_name：Elasticsearchのタイプ名
*　これはlogstash_formatを指定しても有効。ただし、Kibana側で画面からのtype指定は不可能。KibanaConfig.rbにて指定することは可能。&lt;/li&gt;
&lt;li&gt;logstash_format：Kibana用にlogstashフォーマットで出力するオプション
&lt;ul&gt;
&lt;li&gt;この指定があるときは、index名が「logstash-YYYY.mm.dd」となる&lt;/li&gt;
&lt;li&gt;record（ログ）に@timestampとして時刻が追加される。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;tag_key：include_tag_keyがtrueと指定されているため、record（ログ）にtag_keyで指定した文字列をキー、値としてtagの値（上記例だとdummy.apache.access）が付与されて登録される。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;apache-loggenのインストールと起動&#34;&gt;apache-loggenのインストールと起動&lt;/h2&gt;
&lt;p&gt;タムタムさんが作成されたApacheのログのダミーを生成するツールです。&lt;br&gt;
gem化されてるので、インストールは非常に簡単です。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;gem install apache-loggen
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;で、ログを出力します。出力先は先程設定したdummy_access_logです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;apache-loggen --rate=10 --progress /var/log/httpd/dummy_access_log
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;秒間10アクセスログを出力してくれます。
これで、Kibanaでログが見れるようになりました。
なんて簡単なんでしょう。。。
簡単なログの検索ができてしまいました。
他の形式のログがどうなるのかとかは、また時間があれば。。。&lt;/p&gt;
&lt;h2 id=&#34;感想とか&#34;&gt;感想とか&lt;/h2&gt;
&lt;p&gt;非常に簡単でした。素敵です。いくつかこうなるのかな？というのを試してみたのでメモを。&lt;/p&gt;
&lt;p&gt;いくつか疑問点です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;溜まったログの削除は手動？
&lt;ul&gt;
&lt;li&gt;おそらく。日付ごとにindexが出来上がっているので、削除は楽そう。「logstash-年月日」なので。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;認証とかかけれるの？
&lt;ul&gt;
&lt;li&gt;ログ検索は内部でするだろうから、まぁ、なくていいのかな。ログインすらないし。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;複数行のログとかってどーすんだろう？（JavaのExceptionとかが混ざるやつ）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本格的に触るようになれば調べるかなぁ。。。&lt;/p&gt;
&lt;p&gt;あと、ログが増えてきた時にどういった分割構成ができるだろう？って思って考えてみたのが以下になります。&lt;/p&gt;
&lt;h3 id=&#34;構成パターン&#34;&gt;構成パターン&lt;/h3&gt;
&lt;p&gt;ログを複数扱う場合は次のようなパターンがありそうかと。&lt;/p&gt;
&lt;h4 id=&#34;タグfluentdのタグで識別&#34;&gt;タグ（fluentdのタグ）で識別&lt;/h4&gt;
&lt;p&gt;「@log_name」という名前＝fluentdのタグにてログを識別することで、異なるログを検索することができそうです。
タグであれば、プラグインによってはログ出力時に制御も可能だと思うので、td-agentの設定を変更したりすることもなく対応が可能かと。
ただ、ログの種別ごとにKibanaのプロセスを別にして起動したいといった用途には向いてなさそうです。&lt;/p&gt;
&lt;h4 id=&#34;type_nameによる識別&#34;&gt;type_nameによる識別&lt;/h4&gt;
&lt;p&gt;ElasticSearchの機能であるtypeを利用したログの識別パターンです。&lt;br&gt;
fluent-plugin-elasticsearchの設定で&lt;code&gt;type_name&lt;/code&gt;を指定しました。
ここを別の名前にすることで、識別することも可能です。&lt;/p&gt;
&lt;p&gt;&lt;strike&gt;ただし、この場合はKibanaの画面から指定して検索することができません。&lt;/strike&gt;
&lt;strong&gt;&lt;em&gt;→コメント頂きました。検索条件に「_type:タイプ名」と検索することでtypeを利用した検索が可能です。&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
タグ（@log_name）でも識別できるようにするなどの工夫が必要です。
その代わり、タグ識別ではできなかったKibanaのプロセスを別にして起動することは可能になります。&lt;br&gt;
KibanaConfig.rbのTypeに値を設定することで、起動したKibanaが対象とするログを絞り込むことが可能です。
こうすることで例えば、apache用のKibanaとtomcat用のKibanaは別プロセスにして、ElasticSearchのクラスタは1つという構成も可能になります。&lt;/p&gt;
&lt;h4 id=&#34;elasticsearchサーバを別立て&#34;&gt;ElasticSearchサーバを別立て&lt;/h4&gt;
&lt;p&gt;ElasticSearchサーバをそもそも別のプロセスor別のサーバで起動し、Kibanaも別々にすればログの識別も可能です。
可能ですが、色々と管理するものが増えてめんどくさそうですね。。。&lt;/p&gt;
&lt;h4 id=&#34;インデックス名変更&#34;&gt;インデックス名変更&lt;/h4&gt;
&lt;p&gt;最後は、fluent-plugin-elasticsearchの設定で「logstash_format」をfalseにすれば、好きなindex_nameを付与できるので、
ログ種別ごとに名前を変更することで識別できます。&lt;br&gt;
ただ、logstash形式でないインデックス名の場合、日付ローテーションができなかったり、Kibana内部で検索時に日付で検索対象を絞り込んで検索することで高速化するといった処理など、使えない機能が多々出てきてしまうのであまりおすすめじゃないかと。。。&lt;/p&gt;
&lt;p&gt;ということで、流行りものは触っておこうということで、さわってブログ書いてみました。&lt;br&gt;
開発中に立てておいて、各サーバのログを流しこんでおくなどにも利用できるかもしれないです。
アラート通知などの機能が出てくるともっと便利かもしれないです。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>AWS Summit Tokyo 2013に行って来ました。(Day2) #awssummit</title>
      <link>https://blog.johtani.info/blog/2013/06/06/aws-summit-tokyo-day2/</link>
      <pubDate>Thu, 06 Jun 2013 23:00:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/06/06/aws-summit-tokyo-day2/</guid>
      <description>&lt;p&gt;昨日に引き続き、AWS Summit Tokyo 2013に行ってきました。&lt;/p&gt;
&lt;p&gt;@ryu_kobayashiさんからパシリを仰せつかるなどあり、忙しかったのですが楽しかったです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;昨日に引き続き、AWS Summit Tokyo 2013に行ってきました。&lt;/p&gt;
&lt;p&gt;@ryu_kobayashiさんからパシリを仰せつかるなどあり、忙しかったのですが楽しかったです。&lt;/p&gt;
&lt;p&gt;今日もすごい人出で、昼時の展示ブースは人だかりで、TDの方たち忙しそうでした。
後半はちょっとつかれたなぁ。
1日目よりも空調の温度が上がってたので快適でした。
飲物忘れたので、ちょっと喉がやられ気味でしたが。&lt;/p&gt;
&lt;p&gt;AWSはやっぱり勢いがあるんだなぁってのを実感しました。JAWS-UGまで残った感想です。
あとは、セルフハンズオンに参加するんだったかなぁというのもちょっとあります。あんまり触ったことないんで。&lt;/p&gt;
&lt;p&gt;以下はいつものメモです。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;amazon-redshiftが切り開くクラウドデータウェアハウス&#34;&gt;Amazon Redshiftが切り開くクラウド・データウェアハウス&lt;/h2&gt;
&lt;h4 id=&#34;自己紹介と流れとニュース&#34;&gt;自己紹介と流れとニュース&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;6/5からTokyoリージョンでも利用可能に！&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;redshiftどんなもの&#34;&gt;Redshiftどんなもの？&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Redshift＝クラウド型データウェアハウス&lt;/li&gt;
&lt;li&gt;オンプレの課題
&lt;ul&gt;
&lt;li&gt;初期投資、運用管理、費用対効果&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;EMRと同じで、分析処理向けのサービス&lt;/li&gt;
&lt;li&gt;簡単な利用例
&lt;ul&gt;
&lt;li&gt;各種データストア→S3→Redshift&lt;/li&gt;
&lt;li&gt;各種データストア→EMR→Redshift&lt;/li&gt;
&lt;li&gt;Data Pipelineでデータの流れの処理がかける。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;データロードはパラレルに実行可能&lt;/li&gt;
&lt;li&gt;バックアップは管理コンソールからボタンででも可能。&lt;/li&gt;
&lt;li&gt;クラスタのリサイズも管理コンソールからできるよ。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;nriでの評価&#34;&gt;NRIでの評価&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;2012年末の限定公開してすぐに先行評価に参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Redshiftの性能は？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;500億件からの検索処理（1週間分のデータを抜き出して処理するSQL）
&lt;ul&gt;
&lt;li&gt;8XLノード2ノードで43秒、4ノードで27.8秒、8ノードで19秒&lt;/li&gt;
&lt;li&gt;データロドも線形に性能が上がる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;1.2億件の検索処理は4ノードより8ノードのほうが性能劣化&lt;/li&gt;
&lt;li&gt;EMRとRedshiftの比較。1.5TB、500億件でのJOIN＋集計処理でRedshiftのほうが早かった。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Redshiftのチューニングポイント&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インデックスが存在得ず、Distribution Keyでノードに分散&lt;/li&gt;
&lt;li&gt;Sort Keyも重要。データロード時間はSort Keyをつけると遅くなる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ニガテなデータ形式もあるよ。EMRとかの組み合わせにすると安く済むこともあるよ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;簡単につくれるので、気をつけましょう。セキュリティとか。統制されないものが乱立してくるんで。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;そこでNRIですよ！（宣伝）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;出てきた性能に関するものだけど、「ケース１」「ケース２」とかってなってるので、その部分の詳細が書かれたレポートが公開されないとどんなのがニガテなのかとかわからなかった。&lt;/p&gt;
&lt;h4 id=&#34;事例紹介とか&#34;&gt;事例紹介とか&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;オンプレのデータをどうやってRedshiftに持ってくの？
&lt;ul&gt;
&lt;li&gt;インフォテリアのASTERIA WARP
&lt;ul&gt;
&lt;li&gt;GUIツールでデータの変換とかして、S3に持って行って、Redshiftと連携できるよと。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;無料セミナーの紹介&#34;&gt;無料セミナーの紹介&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;6/21、8/2にRedshiftの無料セミナーやりますよ。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;インターネット上のユーザーの行動の可視化を実現したawsによるビックデータ解析基盤&#34;&gt;インターネット上のユーザーの行動の可視化を実現したAWSによるビックデータ解析基盤&lt;/h2&gt;
&lt;h4 id=&#34;c-finderのサービス紹介&#34;&gt;C-Finderのサービス紹介&lt;/h4&gt;
&lt;p&gt;元オプトの方。C-Finderの紹介。
10万ユーザの行動履歴の可視化。&lt;/p&gt;
&lt;p&gt;サイトに来たけど、行動せずに他サイトに移動したとか、サイトに来る前の状態ってのがわからない。これをC-Finderで可視化。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例１：自動車業界
&lt;ul&gt;
&lt;li&gt;ライバル企業の動向を自社と比較したい。&lt;/li&gt;
&lt;li&gt;Audi、BMW、ベンツで可視化。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;例２：化粧品業界
&lt;ul&gt;
&lt;li&gt;Web上での化粧品のトレンドが見たい。&lt;/li&gt;
&lt;li&gt;@cosmeサイトのPVとかから。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ユーザって会員登録とかしてる人を追っかけてるってことなのかなぁ？
よくわかってない。。。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;レポーティングサービスしてたけど、納品まで１ヶ月かかってた。&lt;/li&gt;
&lt;li&gt;リアルタイムにみたいという要望が多かったのでASPをTISと開発&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;aspサービスの開発したよ&#34;&gt;ASPサービスの開発したよ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;AWSで。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可視化というタイトルだったんだけど、期待してた可視化の話ではなかった。。。&lt;/p&gt;
&lt;h2 id=&#34;ネット選挙クラウドオバマ大統領選挙の事例データ解析からネット募金まで&#34;&gt;ネット選挙クラウド　～オバマ大統領選挙の事例：データ解析からネット募金まで～&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ボランティアで構成ってすごいな。&lt;/li&gt;
&lt;li&gt;本番まで１年&lt;/li&gt;
&lt;li&gt;みんな髭の人だｗ&lt;/li&gt;
&lt;li&gt;GoogleとかFacebookとかの人がボランティアで開発に参加。&lt;/li&gt;
&lt;li&gt;予算は抑えながら、スケールアップダウンがすぐ出来てとか。&lt;/li&gt;
&lt;li&gt;秒間10万回のI/OのDB&lt;/li&gt;
&lt;li&gt;SQSとEC2のSoftware queueの比較。Softwareキュー選ぶと、さらにドレがいいのかってのを選ばないとい。&lt;/li&gt;
&lt;li&gt;AWSにあるサービスなら、造らなくてもいいのではとか。
&lt;ul&gt;
&lt;li&gt;CloudSearchはつかわなかったのかなぁ？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;tsunami&lt;/li&gt;
&lt;li&gt;S3に静的ページをおいて、最後のとりでにしたり。&lt;/li&gt;
&lt;li&gt;コードとか、ノウハウってどこまで公開されてるんだろ？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;同時通訳もあったんですが、英語を聞いてみようと聞いてましたが、まだまだダメですねぇ。&lt;/p&gt;
&lt;h2 id=&#34;パネルディスカッションウェブテクノロジーをエンタープライズで活かすには&#34;&gt;パネルディスカッション「ウェブテクノロジーをエンタープライズで活かすには？」&lt;/h2&gt;
&lt;h4 id=&#34;趣旨&#34;&gt;趣旨&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;B2B、B2C間でのトレンドのやり取りが加速されてるよねと。&lt;/li&gt;
&lt;li&gt;ICTはもはやコモディティ？&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;td太田さん&#34;&gt;TD太田さん&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Consumerization Of IT&lt;/li&gt;
&lt;li&gt;色々なものがSaaSになってきてる&lt;/li&gt;
&lt;li&gt;TD：Consumerization of Data Infrastructure
&lt;ul&gt;
&lt;li&gt;オンプレ＜AWS＜TD&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;三井物産黒田さん&#34;&gt;三井物産黒田さん&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;三井クラウド（プライベート＆パブリック）&lt;/li&gt;
&lt;li&gt;ユビキタス&lt;/li&gt;
&lt;li&gt;これまで使ってきたものがクラウドで動くのかとかが観点&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;電通平川さん&#34;&gt;電通平川さん&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;マーケティングダッシュボードはsalesforceでは厳しかった？&lt;/li&gt;
&lt;li&gt;ビジネスに注力したいので、柔軟で、質実剛健なICT基盤がほしい。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;ディスカッション&#34;&gt;ディスカッション&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;新しい技術に対するスタンスは？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;いかにダメな部分を潰していくか（太田さん）&lt;/li&gt;
&lt;li&gt;R&amp;amp;Dを予算化して評価して取り組んでいく。評価でダメならつぎ。（黒田さん）&lt;/li&gt;
&lt;li&gt;消費者の方たちがネットですごい勢いで活動してる。その人達へのアプローチが重要。（平川さん）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コンシューマ系技術の懸念事項は？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;セキュリティ面。レベルがある。自分の所だけじゃなく、クラウドベンダーと二人三脚が必要。丸投げはNG（黒田さん）&lt;/li&gt;
&lt;li&gt;セキュリティ面の攻撃を受けたつぎの手をどう打つかが重要。堅牢性上げると、ユーザビリティが下がる。（平川さん）&lt;/li&gt;
&lt;li&gt;法規制的に出せないとかもある。持ちきれないデータもあるよね。（太田さん）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;何を見分けてどうやって取り組むか？&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;p&gt;尖った技術＝セキュリティ面が弱い？みたいな印象があるのかなぁ？&lt;/p&gt;
&lt;h2 id=&#34;jaws-ug&#34;&gt;JAWS-UG&lt;/h2&gt;
&lt;h4 id=&#34;awsアップデート&#34;&gt;AWSアップデート&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;AmazonのCTO登場&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;game-day&#34;&gt;Game Day&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Game Day。土曜日にやるよ。&lt;/li&gt;
&lt;li&gt;障害を発生させて、それを復旧させる。&lt;/li&gt;
&lt;li&gt;最もひどい壊し方をしたらかちｗ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最後はかるくボッチでした。。。
AWSあんまり使ってないからなぁ。。。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Cloudera Searchメモ（妄想版）</title>
      <link>https://blog.johtani.info/blog/2013/06/06/cloudera-search-memo2/</link>
      <pubDate>Thu, 06 Jun 2013 12:26:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/06/06/cloudera-search-memo2/</guid>
      <description>&lt;p&gt;ざっとインストールガイドとかCloudera Searchのソース眺めて、テキトーにメモを書いてみました。
（ユーザガイドはまだ読んでないです。）&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ざっとインストールガイドとかCloudera Searchのソース眺めて、テキトーにメモを書いてみました。
（ユーザガイドはまだ読んでないです。）&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;ざっくりメモ&#34;&gt;ざっくりメモ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ストリーム処理でインデックス作るときはFlume経由でSolrに
&lt;ul&gt;
&lt;li&gt;SinkとEventの両方が用意されてる？（Flumeを良く知らないので、違いがわからない）&lt;/li&gt;
&lt;li&gt;FluemeからはリモートのSolrに対してインデックス登録するクラスがある。SolrServerDocumentLoaderがソレだと思う。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;バッチ処理でインデックス作るときはMapReduceIndexerToolsってのを使ってSolrに
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://issues.apache.org/jira/browse/SOLR-1301&#34;&gt;SOLR-1301&lt;/a&gt;がベースになっている。色々と改良されてるようだけど、コアとなってる処理はSOLR-1301。&lt;/li&gt;
&lt;li&gt;GoLiveってクラスの処理の中で、現在動作してるSolrに配布したバッチで作成されたIndexをマージする処理が書いてある。&lt;/li&gt;
&lt;li&gt;HDFSへ出力されたインデックスはリモートのSolrからアクセスするとオーバヘッドとかどーなるのかなぁ？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;検索処理自体はHueでもできるけど、基本的にSolrCloud任せ&lt;/li&gt;
&lt;li&gt;インデキシングの処理のフローについてはCloudera Mrophlinesで定義&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ということで、
2つの流れがありそう。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HDFS→Flume→Solr&lt;/li&gt;
&lt;li&gt;HDFS→MapReduce→Solr&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;で、まだ、わかってないですが、構成要素として&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hadoop（HDFS）：データソース&lt;/li&gt;
&lt;li&gt;Hadoop（MapReduce）：データ変換処理、バッチインデキシング&lt;/li&gt;
&lt;li&gt;Zookeeper：SolrCloudのクラスタ管理&lt;/li&gt;
&lt;li&gt;Solr：インデキシング、検索エンジン&lt;/li&gt;
&lt;li&gt;Flume：データをストリーミングでSolrへ&lt;/li&gt;
&lt;li&gt;Coudera Morphlines：HDFSからSolrまでのETLデータ処理を定義実行する環境&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;って感じでしょうか。
SolrCloudのクラスタとHadoopのクラスタが同一マシン上なのか、別なのかとか。組み合わせがどんなものができるのかがまだわかってないです。
ユーザガイド読んでみたらなにか出てくるかなぁ。&lt;/p&gt;
&lt;p&gt;ちなみに、Cloudera SearchのgithubリポジトリにあるソースはCloudera Morphlinesのコードがメインで、SolrのHDFS対応版のソースがあるわけでは無かったです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SolrのHdfsDirectoryってのがClouderaのリポジトリにあるSolrには追加されていて、これが、HDFSのインデックスを読み込んだりする処理が出来る仕組みっぽい。&lt;/li&gt;
&lt;li&gt;一応、SolrCloud以外（分散検索）も考慮された形になってるっぽい。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ってとこでしょうか。&lt;/p&gt;
&lt;h2 id=&#34;感想&#34;&gt;感想&lt;/h2&gt;
&lt;p&gt;読んでて思ったんですが、Cloudera Searchの肝はじつは、検索じゃなくて、Morphlinesにあるんじゃないかなぁと。今はSolrが出力先ですが、
その他のデータ変換処理とかが増えてくると、処理の流れがMorphlinesで定義できてデータ変換処理が簡便になりそうな気が。&lt;/p&gt;
&lt;h2 id=&#34;その他に気になる観点&#34;&gt;その他に気になる観点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;CDH経由でSolrCloudのクラスタの管理するのかな？&lt;/li&gt;
&lt;li&gt;SolrCloud用のクラスタとCDHのクラスタって同一マシンに載るの？別マシンにもできるの？
&lt;ul&gt;
&lt;li&gt;併存したらIOがキツそうだけど&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Hueで検索アプリとか組めるの？（そもそもHueがわかってないんだけど。。。）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ま、とりあえず、こんなとこで。
つぎは余力があれば、ユーザガイドかなぁ。
英語力。。。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>AWS Summit Tokyo 2013に行って来ました。(Day1) #awssummit</title>
      <link>https://blog.johtani.info/blog/2013/06/05/aws-summit-tokyo-day1/</link>
      <pubDate>Wed, 05 Jun 2013 18:30:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/06/05/aws-summit-tokyo-day1/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.awssummittokyo.com/timetable.html&#34;&gt;AWS Summit Tokyo 2013&lt;/a&gt;に行って来ました。&lt;/p&gt;
&lt;p&gt;@cocoatomoさんに行き掛けに出会ったので、アンデルセンの講演を一緒に聞いてました。
TDブースの@ryu_kobayashiさんに挨拶に伺ったりも。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;http://www.awssummittokyo.com/timetable.html&#34;&gt;AWS Summit Tokyo 2013&lt;/a&gt;に行って来ました。&lt;/p&gt;
&lt;p&gt;@cocoatomoさんに行き掛けに出会ったので、アンデルセンの講演を一緒に聞いてました。
TDブースの@ryu_kobayashiさんに挨拶に伺ったりも。&lt;/p&gt;
&lt;p&gt;すごい人で、セッション間の入れ替え時には会場前のスペースが大変なことになってました。もう少し余裕のある建物のほうが良かったのかもしれないですねぇ。&lt;/p&gt;
&lt;p&gt;いつものように以下はメモです。&lt;/p&gt;
&lt;!--  more --&gt;
&lt;h2 id=&#34;road-to-aws-アンデルセンサービス&#34;&gt;Road to AWS アンデルセンサービス&lt;/h2&gt;
&lt;p&gt;とてもおいしいランチボックスでした。&lt;/p&gt;
&lt;p&gt;

&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; style=&#34;max-width:300&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130605/lunch1.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130605/lunch1.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;



&lt;div class=&#34;box&#34; style=&#34;max-width:300&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130605/lunch2.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130605/lunch2.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;広島（ここ重要！）に本社のあるパン屋さん。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2003年に汎用機からOpenシステムに
&lt;ul&gt;
&lt;li&gt;内製ではなく外注に。複数のSIerにお願いしてるとデータセンタに&lt;/li&gt;
&lt;li&gt;マスタ管理と生産管理はオンプレ&lt;/li&gt;
&lt;li&gt;2004年に稼動時のネットワーク整備。店舗はISDNで、設定ミスとかを防ぐためにIIJのSMFサービスに&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PCはレンタル契約にしたので入れ替えを強制できる→レガシーシステムの対応が必要なくなる
&lt;ul&gt;
&lt;li&gt;ネットワーク広帯域化→基本システムにデータセンターに。&lt;/li&gt;
&lt;li&gt;2009年にリース満了などで、OSの変更とかミドルの変更という移行SI費用だけで結構な値段が。ものによっては会社もない。&lt;/li&gt;
&lt;li&gt;データセンターの月額手数料にして、機器変更などの費用を平準化。仮想化など。&lt;/li&gt;
&lt;li&gt;けど、サイジングにどうしても安全係数をかけてしまうことに。結構値段がかかる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;そこで、今後の方向性
&lt;ol&gt;
&lt;li&gt;SIerどっぷりのOLTP受発注基幹システムはSIerのホスティングで&lt;/li&gt;
&lt;li&gt;それ以外のシステムは外に出したい&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;バッチの計算を早くすることができるとノーチラスさんから提案された
&lt;ul&gt;
&lt;li&gt;バッチを外部化するか、性能あげるか。IOネックなどもありスペック上げるとコストになるから、外部化したい&lt;/li&gt;
&lt;li&gt;Hadoopを組むけど、オンプレじゃなくてAWSにした。ノウハウがないので、ノーチラスさんにお任せした。&lt;/li&gt;
&lt;li&gt;AWSのEMRを利用。4時間かかっていたものが40分で。&lt;/li&gt;
&lt;li&gt;EDIのサーバを6ヶ月でAWSに移行&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;S3絡みで2度の問題が。性能劣化があった。&lt;/li&gt;
&lt;li&gt;パッケージ開発環境がAWSにあるなら、AWSでも動くでしょ？（NTTイントラマートとか）&lt;/li&gt;
&lt;li&gt;SIerどっぷりの部分もAWSに持っていく？&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;アンデルセンサービスの部長さんからのawsへの要望&#34;&gt;アンデルセンサービスの部長さんからのAWSへの要望&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;メールサーバなどの基本サビスとか、コントロールパネルを充実して欲しい。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;クラウド技術を活用したリアルタイム広告logicadの入札配信ログ解析&#34;&gt;クラウド技術を活用したリアルタイム広告&amp;quot;Logicad&amp;quot;の入札・配信・ログ解析&lt;/h2&gt;
&lt;h4 id=&#34;web広告の歴史&#34;&gt;Web広告の歴史&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;最初は広告主がWebサイト単位で契約&lt;/li&gt;
&lt;li&gt;アドネットワークによる仲介&lt;/li&gt;
&lt;li&gt;聞きそびれた。。。DSP？&lt;/li&gt;
&lt;li&gt;アドネッエクスチェンジ&lt;/li&gt;
&lt;li&gt;SSP(Supply Side Platform)&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;リアルタイムビッティングrtb&#34;&gt;リアルタイムビッティング（RTB）&lt;/h4&gt;
&lt;p&gt;RTPの仕組みを説明。
AWSとオンプレでシステムを構築してる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SSP事業者との取引はオンプレ&lt;/li&gt;
&lt;li&gt;配信はAWS&lt;/li&gt;
&lt;li&gt;オンプレとAWSはAWS Direct Conectで接続
&lt;ul&gt;
&lt;li&gt;S3とHadoopの接続が安くなったり速くなったりするらしい。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;オンプレミス側&#34;&gt;オンプレミス側&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Bidリクエスト：秒間数万件。。。&lt;/li&gt;
&lt;li&gt;KVSのユーザ数は３億件。。。&lt;/li&gt;
&lt;li&gt;AEROSPIKEというSSD向けのKVSを利用してる&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;aws側&#34;&gt;AWS側&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;ログはS3に。溜まったデータは定期的にEMRで解析。DynamoDBに入れてレポート作成&lt;/li&gt;
&lt;li&gt;RabbitMQを使ってる。&lt;/li&gt;
&lt;li&gt;ELBで外部からのリクエストはバランシング&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;データセンタ間通信&#34;&gt;データセンタ間通信&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;遅延を複数コネクションを貼る方法で回避？&lt;/li&gt;
&lt;li&gt;非同期で、複数のMsgとAckをやり取りする。RabbitMQがこれに相当する機能を持ってる
&lt;ul&gt;
&lt;li&gt;QueueとConsumerで多重送信が可能。&lt;/li&gt;
&lt;li&gt;配信結果をオンプレ側に送るのにRabbitMQを使ってるのかな？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;ハイブリッド構成を支えるawsテクノロジー&#34;&gt;ハイブリッド構成を支えるAWSテクノロジー&lt;/h2&gt;
&lt;p&gt;聞くつもりだったんだけど、すごい人だったので、諦めて充電してた。&lt;/p&gt;
&lt;h2 id=&#34;awsクラウドで構築するワールドクラスの分散クラウドアーキテクチャ&#34;&gt;AWSクラウドで構築する、ワールドクラスの分散クラウドアーキテクチャ&lt;/h2&gt;
&lt;p&gt;エマージングソリューション部の部長のshot6さん。&lt;/p&gt;
&lt;h3 id=&#34;マルチazアベイラビリティゾーンモデル&#34;&gt;マルチAZ（アベイラビリティゾーン）モデル&lt;/h3&gt;
&lt;p&gt;AWS固有のコンセプト。
ELBやDynamoDBやRDS、S3とか。&lt;/p&gt;
&lt;p&gt;マルチリージョンとは違うよと。マルチリージョンは結構難しいので。
マルチリージョンがどんなに大変かをこれから説明。&lt;/p&gt;
&lt;h4 id=&#34;マルチリージョンアーキテクチャこれは別物&#34;&gt;マルチリージョンアーキテクチャ（これは別物）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;複数のリージョンを利用して作る。&lt;/li&gt;
&lt;li&gt;AWSのビルディングブロックではカバーしない範囲をカバーしないとダメとか。&lt;/li&gt;
&lt;li&gt;リージョン間の通信は基本的に非同期&lt;/li&gt;
&lt;li&gt;ディザスタリカバリ
&lt;ul&gt;
&lt;li&gt;コストバランス見てから決めるよね。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CAP定理とかもいろいろと出てくるよね。&lt;/li&gt;
&lt;li&gt;合意プロトコル。正確性、生存性（時間が制限されても大丈夫）、理論的にパフォーマンス出る？&lt;/li&gt;
&lt;li&gt;非同期レプリケーションになる（1トランザクション当たりのオーバヘッドが大きいから）けど、復旧の難しさがある。
&lt;ul&gt;
&lt;li&gt;GlusterFSとかでやってるとこもある。&lt;/li&gt;
&lt;li&gt;NetflixはCassandraをクオラム＋Geo-Replicationでマルチリージョンを構成してる。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;マルチリージョンでのデータ一貫性は維持がむずい&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;注意点&#34;&gt;注意点&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;必要になるまで分散させない。
&lt;ul&gt;
&lt;li&gt;まずは、マルチAZを考えましょう&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;物理制限を考慮する
&lt;ul&gt;
&lt;li&gt;同期型だとタイムラグあるし。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;複合障害の伝搬をどう抑えるか。
&lt;ul&gt;
&lt;li&gt;NetflixはHYSTRIXというのがいて遮断できるようにしている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;自動化が重要。ロールバックとかロールアウトとか。&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;テストをどーするの&#34;&gt;テストをどーするの？&lt;/h5&gt;
&lt;p&gt;本番環境でアクティブ/アクティブ構成でのテスト。
ちゃんとフェイルオーバするかなどを実環境でやってる。DB落としたり。。。
障害は避けられないので、受け入れて日常に取り込むべきだよねと。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Amazon.comではGameDay&lt;/li&gt;
&lt;li&gt;NetflixはChaos Monkey（OSS）&lt;/li&gt;
&lt;li&gt;Obama for America&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;リカバリーオリエンテッドコンピューティングパターン&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ボーアバグ：再現可能なソフトウェバグ&lt;/li&gt;
&lt;li&gt;ハイゼンバグ：通常ではありえないパターンで発生するバグで、調査が大変&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;ということでマルチazがいいよ&#34;&gt;ということで、マルチAZがいいよ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;同期式レプリケーションを前提にできる。&lt;/li&gt;
&lt;li&gt;アプリ開発者がアプリにフォーカスできる。分散系の難しいところはAWSが隠蔽してくれるから。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Cloudera Searchのモジュールたち</title>
      <link>https://blog.johtani.info/blog/2013/06/05/cloudera-search-modules/</link>
      <pubDate>Wed, 05 Jun 2013 15:12:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/06/05/cloudera-search-modules/</guid>
      <description>&lt;p&gt;Cloudera Searchは次のようなモジュールから構成されています。
これはCloudera Searchのモジュールで、さらにこれらがSolrとかを使ってるみたいですね。pom.xmlを見たら何を使ってるかがわかるかな。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Cloudera Searchは次のようなモジュールから構成されています。
これはCloudera Searchのモジュールで、さらにこれらがSolrとかを使ってるみたいですね。pom.xmlを見たら何を使ってるかがわかるかな。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cdk-morphlines&lt;/li&gt;
&lt;li&gt;search-contrib&lt;/li&gt;
&lt;li&gt;search-core&lt;/li&gt;
&lt;li&gt;search-flume&lt;/li&gt;
&lt;li&gt;search-mr&lt;/li&gt;
&lt;li&gt;search-solrcell&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;てきとーに、README.mdみながらメモを残してみました。ソースとかはまだ読んでないです。
ざっと眺めたけど、インデキシング処理の話がメインで、検索側がどうやって動くかってのがわからなかったなぁ。
&lt;a href=&#34;http://www.cloudera.com/content/cloudera-content/cloudera-docs/Search/latest/PDF/Cloudera-Search-User-Guide.pdf&#34;&gt;ユーザガイド（注：PDF）&lt;/a&gt;ってのがあるから、これを読んでみるか。。。&lt;/p&gt;
&lt;p&gt;各モジュールについては、以下。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;cdk-morphlinescloudera-morphlines&#34;&gt;cdk-morphlines（Cloudera Morphlines）&lt;/h2&gt;
&lt;p&gt;Cloudera Morphlinesという名前みたい。
検インデキシングアプリの構築、変更をラクにするためのフレームワーク。
ETLの処理チェインを簡単にCloudera Searchにデータを入れる設定（Extract/Transform/Load処理）がかけると。
バッチ処理、Near Real Timeのために使えるみたい。検索結果をさらに入れるとかもできるんかなぁ。？&lt;/p&gt;
&lt;p&gt;Unixパイプラインの進化版みたいなもので、一般的なレコードに対するStream処理から、Flueme、MapReduce、Pig、Hie、SqoopのようなHadoopコンポーネントも使えるみたい。&lt;/p&gt;
&lt;p&gt;Hadoop ETLアプリケーションのプロトタイピングにも使えて、リアルタイムで複雑なStreamやイベント処理やログファイル解析とかに使えるの？&lt;/p&gt;
&lt;p&gt;設定ファイルのフォーマットは&lt;a href=&#34;https://github.com/typesafehub/config/blob/master/HOCON.md&#34;&gt;HOCONフォーマット&lt;/a&gt;。AkkaやPlayで使われてる。&lt;/p&gt;
&lt;h3 id=&#34;cdk-morphlines-core&#34;&gt;cdk-morphlines-core&lt;/h3&gt;
&lt;p&gt;Cloudera Morphlinesのコンパイラ、実行環境、コマンドのライブラリを含んでる。
ログファイル解析やsingle-lineレコード、multi-lineレコード、CSVファイル、正規表現パターンマッチ、フィールドごとの比較とか条件分岐とか、文字列変換とか色々なコマンドを含んでる。&lt;/p&gt;
&lt;h3 id=&#34;cdk-morphlines-avro&#34;&gt;cdk-morphlines-avro&lt;/h3&gt;
&lt;p&gt;Avroファイルやオブジェクトの抽出、変換、読み込み処理コマンド&lt;/p&gt;
&lt;h3 id=&#34;cdk-morphlines-tika&#34;&gt;cdk-morphlines-tika&lt;/h3&gt;
&lt;p&gt;バイナリデータからMIMEタイプを検出して、解凍するコマンド。Tikaに依存&lt;/p&gt;
&lt;h4 id=&#34;雑感&#34;&gt;雑感&lt;/h4&gt;
&lt;p&gt;Cloudera Searchへのデータの流し込みを設定ファイルに記述して実行するとデータの変換処理とかが記述できるって感じかな？
Morphlinesのコマンドとして独自処理や使えそうな処理を作ることで、いろんな処理ができるって感じかなぁ。&lt;/p&gt;
&lt;h2 id=&#34;search-core&#34;&gt;search-core&lt;/h2&gt;
&lt;p&gt;Solrに対するMorphlineコマンドの上位モジュール&lt;/p&gt;
&lt;h3 id=&#34;search-solrcell&#34;&gt;search-solrcell&lt;/h3&gt;
&lt;p&gt;Tikaパーサを使ったSolrCellを使うためのMorphlineコマンド。
HTML、XML、PDF、Wordなど、Tikaがサポートしてるものがサポート対象。&lt;/p&gt;
&lt;h3 id=&#34;search-flume&#34;&gt;search-flume&lt;/h3&gt;
&lt;p&gt;Flueme Morphline Solr Sink。
Apache Flumeのイベントから検索ドキュメントを抽出、変換し、SolrにNearRealTimeで読み込むためのコマンド&lt;/p&gt;
&lt;h3 id=&#34;search-mr&#34;&gt;search-mr&lt;/h3&gt;
&lt;p&gt;HDFSに保存されたファイルに含まれる大量データをMapReduceで処理してHDFS上の検索インデックスに焼きこむモジュール。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;MapReduceIndexerTool&lt;/code&gt;は入力ファイルの集合からSolrのインデックスシャードの集合を作るためのmorphlineのタスクで、MapReduceのバッチジョブドライバー。
HDFSにインデックスを書き込む。
動作してるSolrサーバに対して出力されたデータをマージするのもサポートしてる。&lt;/p&gt;
&lt;p&gt;とりあえず、Near Real Time検索するにはFlueme使って、バッチ処理でインデックス焼くのはMapReduceIndexerToolみたいだなぁ。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Cloudera Searchってのが出たらしい（とりあえず、雑感？）</title>
      <link>https://blog.johtani.info/blog/2013/06/05/what-is-cloudera-search/</link>
      <pubDate>Wed, 05 Jun 2013 15:05:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/06/05/what-is-cloudera-search/</guid>
      <description>&lt;p&gt;AWS Summitに来ていたのですが、TLでは、Cloudera Searchが賑わってました。
ということで、軽くどんなものか読んだり調べたりしたメモを残しとこうかと。
英語力はあやしいので、おかしいとこがあったらツッコミを。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;AWS Summitに来ていたのですが、TLでは、Cloudera Searchが賑わってました。
ということで、軽くどんなものか読んだり調べたりしたメモを残しとこうかと。
英語力はあやしいので、おかしいとこがあったらツッコミを。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;cloudera-searchとは&#34;&gt;Cloudera Searchとは？&lt;/h2&gt;
&lt;p&gt;CDH4.3に対応したCDHユーザ向けの検索システム（beta版）なのかな？
CDHに統合された検索フレームワークなのかな？&lt;/p&gt;
&lt;p&gt;基本はLucene/Solr 4.3でHadoopのペタバイトデータを検索することができるようになるみたいです。&lt;/p&gt;
&lt;h2 id=&#34;どんな仕組み&#34;&gt;どんな仕組み？&lt;/h2&gt;
&lt;p&gt;次のものを利用しているようです。（GithubのREADMEから。）&lt;/p&gt;
&lt;h4 id=&#34;使ってるもの&#34;&gt;使ってるもの&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Apache Solr(4.3.0＋α？)
&lt;ul&gt;
&lt;li&gt;Apache Lucene（Solrつかってるからね）&lt;/li&gt;
&lt;li&gt;Apache SolrCloud（うーん、Solrに含まれるのに別に出してるのなんで？）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Apache Flume&lt;/li&gt;
&lt;li&gt;Apache Hadoop MapReduce &amp;amp; HDFS&lt;/li&gt;
&lt;li&gt;Apache Tika
&lt;ul&gt;
&lt;li&gt;SolrCellとしてSolrにも組み込まれてる、いろんな文書（WordとかHTMLなどなど）からメタデータと本文データとかを取り出せるライブラリラッパー。実際にはさらにpdfboxとかを使って各文書からのデータを取り出してる。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;何ができるの&#34;&gt;何ができるの？&lt;/h4&gt;
&lt;p&gt;HBaseやHDFSの用にZookeeperを使ってインデックスのシャーディングや高可用性ができる。（SolrCloudがZookeeperを使ってるからね。）
MapReduceのジョブの出力から自動的にSolrのインデックスにデータをマージできるらしい。
Cloudera Managerを使って、デプロイ、設定モニタリングなどが可能。&lt;/p&gt;
&lt;p&gt;Flumeのフィードをつかって、ストリーミングしてインデックスを作れる。FluemeがデータをSolrに流しこむのかな？
将来的にはHiveやHBaseのテーブルをインデックスすることも可能になるらしい。Impalaクエリの結果もフィードできるのか？&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://incubator.apache.org/blur/how_it_works.html&#34;&gt;Apache Blur&lt;/a&gt;ってキーワードも出てきた。HDFSのデータからLuceneのインデックス作るのかな？
NGDataのチームがSolr/HBaseの統合とかしてるみたい。&lt;/p&gt;
&lt;h3 id=&#34;参考url&#34;&gt;参考URL&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.cloudera.com/blog/2013/06/cloudera-search-the-newest-hadoop-framework-for-cdh-users-and-developers/&#34;&gt;Cloudera社のブログ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://cloudera.com/content/cloudera-content/cloudera-docs/Search/latest/PDF/Cloudera-Search-Frequently-Asked-Questions.pdf&#34;&gt;Cloudera SearchのFAQ（注：PDF）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/cloudera/search&#34;&gt;Githubのリポジトリ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
    </item>
    
    <item>
      <title>fluent-plugin-zoomdata作りました＋悩み事とか</title>
      <link>https://blog.johtani.info/blog/2013/06/03/fluent-plugin-zoomdata-0-0-1/</link>
      <pubDate>Mon, 03 Jun 2013 13:43:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/06/03/fluent-plugin-zoomdata-0-0-1/</guid>
      <description>&lt;p&gt;憧れ？のfluentを使ってみました。
&lt;a href=&#34;http://atl.recruit-tech.co.jp/blog/668/&#34;&gt;こちらの記事&lt;/a&gt;で紹介した&lt;a href=&#34;http://zoomdata.com&#34;&gt;Zoomdata&lt;/a&gt;を最近触っているのですが、お試しにfluentdでデータ流し込むプラグインを作ってみようかなぁと。（今は、Javaでの接続も書いていて、主にそっちを使っています。）
ということで、作ってみました。&lt;a href=&#34;https://github.com/johtani/fluent-plugin-zoomdata&#34;&gt;fluent-plugin-zoomdata&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;基本的にはtagomoris先生の&lt;a href=&#34;https://github.com/tagomoris/fluent-plugin-growthforecast&#34;&gt;fluent-plugin-growthforecast&lt;/a&gt;を参考（パクリ？）にさせてもらいました。
作っている最中もここわからんってツイートに反応していただき、大変助かりました。
私はベースがJavaの人間なので、手探り状態でRubyを書いています。そこおかしいんじゃないの？とかあればコメントもらえると嬉しいです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;憧れ？のfluentを使ってみました。
&lt;a href=&#34;http://atl.recruit-tech.co.jp/blog/668/&#34;&gt;こちらの記事&lt;/a&gt;で紹介した&lt;a href=&#34;http://zoomdata.com&#34;&gt;Zoomdata&lt;/a&gt;を最近触っているのですが、お試しにfluentdでデータ流し込むプラグインを作ってみようかなぁと。（今は、Javaでの接続も書いていて、主にそっちを使っています。）
ということで、作ってみました。&lt;a href=&#34;https://github.com/johtani/fluent-plugin-zoomdata&#34;&gt;fluent-plugin-zoomdata&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;基本的にはtagomoris先生の&lt;a href=&#34;https://github.com/tagomoris/fluent-plugin-growthforecast&#34;&gt;fluent-plugin-growthforecast&lt;/a&gt;を参考（パクリ？）にさせてもらいました。
作っている最中もここわからんってツイートに反応していただき、大変助かりました。
私はベースがJavaの人間なので、手探り状態でRubyを書いています。そこおかしいんじゃないの？とかあればコメントもらえると嬉しいです。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id=&#34;zoomdataのapi&#34;&gt;ZoomdataのAPI&lt;/h2&gt;
&lt;p&gt;ZoomdataのAPIはこんなかんじで、JSONをHTTPSでPOSTするものになります。&lt;/p&gt;
&lt;script src=&#34;https://gist.github.com/wlindner/4587444.js&#34;&gt;&lt;/script&gt;
&lt;p&gt;指定する必要があるものは、以下の項目です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;source：Zoomdataのデータ保存先（Zoomdataでのデータを保存する単位。）&lt;/li&gt;
&lt;li&gt;user：Zoomdataのユーザ名&lt;/li&gt;
&lt;li&gt;password：Zoomdataのユーザのパスワード&lt;/li&gt;
&lt;li&gt;JSONデータ：Zoomdataでグラフ化するデータ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;sourceはデータ保存先の名称で、この単位でZoomdataはデータを保存、描画します。fluentdのタグをこれにするとわかりやすいかなぁ？と考えていったん、実装してみています。&lt;/p&gt;
&lt;p&gt;で、作成したプログラムを使いつつ、Zoomdataの検証をしたかったので、つぎのような簡単なプログラムを作って動かしてみました。&lt;/p&gt;
&lt;h2 id=&#34;サンプルプログラムの構成&#34;&gt;サンプルプログラムの構成&lt;/h2&gt;
&lt;p&gt;基本的にJavaの人なので、クライアントはJavaで書いてます。
CLIプログラムで適当なJSONを作って、fluent-loggerを使って、fluentdに投げ込みます。&lt;/p&gt;


&lt;div class=&#34;box&#34; style=&#34;max-width:500&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/sample_pg_zoomdata.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/sample_pg_zoomdata.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;fluentdにfluent-plugin-zoomdataを設定して、localのZoomdataサーバに対してHTTPSでJSONをPostする仕組みです。(初keynote)&lt;br&gt;
利用しているライブラリなどのバージョンは次の通り&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;td-agent.x86_64：1.1.12-0&lt;/li&gt;
&lt;li&gt;fluent-logger：0.2.8&lt;/li&gt;
&lt;li&gt;Zoomdata：1.0.3&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;バグ&#34;&gt;バグ？&lt;/h2&gt;
&lt;p&gt;で、Zoomdataにいろんなデータを流し込んでみたのですが、つぎのようなエラーが出て、エラーが出力されたあとはZoomdataにデータが流れ込まなくなってしまいました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;2013-06-03 14:42:33 +0900 [warn]: emit transaction failed  error=&amp;#34;SSL_connect returned=1 errno=0 state=SSLv3 read finished A: sslv3 alert handshake failure&amp;#34;
  2013-06-03 14:42:33 +0900 [warn]: /usr/lib64/fluent/ruby/lib/ruby/1.9.1/net/http.rb:799:in `connect&amp;#39;
  2013-06-03 14:42:33 +0900 [warn]: /usr/lib64/fluent/ruby/lib/ruby/1.9.1/net/http.rb:799:in `block in connect&amp;#39;
  2013-06-03 14:42:33 +0900 [warn]: /usr/lib64/fluent/ruby/lib/ruby/1.9.1/timeout.rb:54:in `timeout&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href=&#34;https://gist.github.com/johtani/5696295&#34;&gt;全ログはこちら&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;まだきちんと問題を調査しないでブログを書いています、すみません。&lt;/p&gt;
&lt;h3 id=&#34;現象&#34;&gt;現象&lt;/h3&gt;
&lt;p&gt;ログが発生した時の症状です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クライアントプログラムは送信が続いており、エラーは出ない&lt;/li&gt;
&lt;li&gt;td-agent.logに先ほどのエラーが出力&lt;/li&gt;
&lt;li&gt;別途&lt;code&gt;type file&lt;/code&gt;にて出力しているログも停止&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;想像&#34;&gt;想像&lt;/h3&gt;
&lt;p&gt;とりあえず、ログを見た想像、所感です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;問題の箇所はfluent-plugin-zoomdataからZoomdataサーバへのデータ送信部分&lt;/li&gt;
&lt;li&gt;emit処理内部で、HTTPSでデータをPOSTする処理でエラーが起きて&lt;/li&gt;
&lt;li&gt;リトライ処理とか書いてないので、emitがコケて、その後データが送信されなくなる&lt;/li&gt;
&lt;li&gt;emitで例外をつかみそこねてるのがあるから止まってる？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;とまぁ、ちゃんと仕組みを理解しないでRubyとか書くからこうなるんですねぇ。
あとでちゃんと調べて考えて、改良してブログ書きます。&lt;/p&gt;
&lt;h2 id=&#34;悩んでいる点今後手を入れたい点&#34;&gt;悩んでいる点、今後手を入れたい点&lt;/h2&gt;
&lt;p&gt;上記バグとは別に作りの点でいくつか悩んでる点も書いてみます。&lt;/p&gt;
&lt;h3 id=&#34;bufferedoutputにしてみたい&#34;&gt;BufferedOutputにしてみたい&lt;/h3&gt;
&lt;p&gt;fluentdのバッファリングを使って、Zoomdataが落ちていても使えるようにしたいと思っているのでBufferedOutputで書くのがいいのかなぁとか。
ちょうど&lt;a href=&#34;http://www.slideshare.net/harukayon/fluentd-22317236&#34;&gt;いいスライド&lt;/a&gt;があったので、読みながらまずは中身を理解してみよう。&lt;/p&gt;
&lt;h3 id=&#34;zoomdataのsourceuserなどの扱い&#34;&gt;Zoomdataのsource、userなどの扱い&lt;/h3&gt;
&lt;p&gt;基本的には設定ファイルで切り替えるのが妥当かなぁと思っています。&lt;br&gt;
ただ、Zoomdataのsourceやuserが増えるたびにfluentdの設定を書き換えて再起動するのかなぁと。userはしょうが無いにしても、sourceは設定じゃない所で切り替えたいなぁと。&lt;/p&gt;
&lt;p&gt;で、切り替えるのにつぎの案があるかなぁと。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;タグで指定（今実装してるもの）&lt;/li&gt;
&lt;li&gt;メッセージにメタ情報とボディ構造を設ける&lt;/li&gt;
&lt;li&gt;設定をどんどん増やす（やりたくない）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;1と3はまぁ、いいかと。2.のパターンはどうなのかなぁと。
毎回のメッセージでヘッダ部分が送信されるのはなんだか無駄だなぁというのが否めないので悩ましいところです。1、2の両方対応できるように作るのもありか。&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-json&#34; data-lang=&#34;json&#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;&amp;#34;header&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:#f92672&#34;&gt;&amp;#34;source&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;source_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:#f92672&#34;&gt;&amp;#34;user&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;userid&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:#f92672&#34;&gt;&amp;#34;password&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;userid&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;body&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:#f92672&#34;&gt;&amp;#34;label&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;label1&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:#f92672&#34;&gt;&amp;#34;count&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ということで、fluent触って遊ぶの楽しいですね。Rubyの勉強にもなりそうだし。
ちょっとずつ頑張ってみようかなぁと。
まぁ、まだ私以外にニーズは無さそうなプラグインですが。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Octopressを試し中(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2013/06/03/octopress%E3%82%92%E8%A9%A6%E3%81%97%E4%B8%AD/</link>
      <pubDate>Mon, 03 Jun 2013 11:53:58 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/06/03/octopress%E3%82%92%E8%A9%A6%E3%81%97%E4%B8%AD/</guid>
      <description>&lt;p&gt;最近、Markdownで文章を書くのに慣れてきました。
ということで、ブログをMarkdownで書けないかなぁと思い、TLの人たちのブログを見たりしていると
「&lt;a href=&#34;http://octopress.org&#34;&gt;Octopress&lt;/a&gt;」というキーワードがあるじゃないですか。
ということで、Github Pages作って、Octopressを使ってブログを書いてみました。
&lt;a href=&#34;http://blog.johtani.info&#34;&gt;こちら&lt;/a&gt;です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;最近、Markdownで文章を書くのに慣れてきました。
ということで、ブログをMarkdownで書けないかなぁと思い、TLの人たちのブログを見たりしていると
「&lt;a href=&#34;http://octopress.org&#34;&gt;Octopress&lt;/a&gt;」というキーワードがあるじゃないですか。
ということで、Github Pages作って、Octopressを使ってブログを書いてみました。
&lt;a href=&#34;http://blog.johtani.info&#34;&gt;こちら&lt;/a&gt;です。&lt;/p&gt;
&lt;p&gt;独自ドメインは昨年から使っているものがあったので、ついでに独自ドメインの設定もしてみました。
ケチなので、.comなどではなく、.infoですが。。。&lt;/p&gt;
&lt;p&gt;ということで、徐々にOctopressに移行していこうと考えているところです。
こちらのブログも当面は残しておく予定です。（有料会員は解約して、広告が出る形になると思いますが。。。）&lt;/p&gt;
&lt;p&gt;Octopressでこんなの便利だよとかアレば教えてもらえると助かります。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Octopress始めました</title>
      <link>https://blog.johtani.info/blog/2013/06/01/first-octopress/</link>
      <pubDate>Sat, 01 Jun 2013 23:57:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/06/01/first-octopress/</guid>
      <description>&lt;p&gt;昨年から、ブログをどうしようかって話をしていて、そのままになっていたのですが、Octopress＋Github Pagesというのがあるらしいと聞きつけて（Twitterで見かけたのかなぁ？）ちょっとやってみました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;昨年から、ブログをどうしようかって話をしていて、そのままになっていたのですが、Octopress＋Github Pagesというのがあるらしいと聞きつけて（Twitterで見かけたのかなぁ？）ちょっとやってみました。&lt;/p&gt;
&lt;p&gt;最近は、ドキュメントをMarkdownで記述しようとして癖をつけているのもあり、
ちょうどいい練習になるかなぁと。&lt;/p&gt;
&lt;p&gt;ということで、まずは手始めのエントリーでした。
いくつか書きたいこともあるので、調べながら書いていこうかと。
まだ、イメージできてないこと&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;画像をどうやって貼るの？&lt;/li&gt;
&lt;li&gt;About meみたいなのも貼り付けたい&lt;/li&gt;
&lt;li&gt;bitbucketやTwitterのリンクとかも&lt;/li&gt;
&lt;li&gt;アフィリエイトも貼る（とりあえずSolr本を）&lt;/li&gt;
&lt;li&gt;検索とかは？&lt;/li&gt;
&lt;li&gt;デザインは？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;などなど。ちょっとずつ調べていこうかなぁと。
あ、調べたことも書いてくのもありか。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>lucene-gosen4.3.0をリリースしました。（Lucene/Solr4.3.0以上での利用が可能です）(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2013/05/06/lucene-gosen4-3-0%E3%82%92%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%97%E3%81%BE%E3%81%97%E3%81%9Flucene-solr4-3-0%E4%BB%A5%E4%B8%8A%E3%81%A7%E3%81%AE%E5%88%A9%E7%94%A8%E3%81%8C%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99/</link>
      <pubDate>Mon, 06 May 2013 23:25:24 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/05/06/lucene-gosen4-3-0%E3%82%92%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%97%E3%81%BE%E3%81%97%E3%81%9Flucene-solr4-3-0%E4%BB%A5%E4%B8%8A%E3%81%A7%E3%81%AE%E5%88%A9%E7%94%A8%E3%81%8C%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99/</guid>
      <description>&lt;p&gt;Lucene/Solr 4.3.0がリリースされた（&lt;a href=&#34;http://lucene.apache.org/core/4_3_0/changes/Changes.html&#34;&gt;LuceneのChanges&lt;/a&gt;、&lt;a href=&#34;http://lucene.apache.org/solr/4_3_0/changes/Changes.html&#34;&gt;SolrのChanges&lt;/a&gt;）ので、lucene-gosen 4.3.0をリリースしました。（&lt;a href=&#34;http://code.google.com/p/lucene-gosen/downloads/list?PHPSESSID=ab5edaac2154a82b90c0d9865454c0c9&#34;&gt;ダウンロードはこちら&lt;/a&gt;）
なお、lucene-gosen 4.3.0ですが、&lt;span style=&#34;color:#FF0000&#34;&gt;Lucene/Solr 4.2.1以下&lt;/span&gt;のバージョンのLucene/Solrでは利用&lt;span style=&#34;color:#FF0000&#34;&gt;できません。&lt;/span&gt;
注意してください。
また、lucene-gosen 4.2.1もLucene/Solr 4.3.0では動作しませんので注意が必要です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Lucene/Solr 4.3.0がリリースされた（&lt;a href=&#34;http://lucene.apache.org/core/4_3_0/changes/Changes.html&#34;&gt;LuceneのChanges&lt;/a&gt;、&lt;a href=&#34;http://lucene.apache.org/solr/4_3_0/changes/Changes.html&#34;&gt;SolrのChanges&lt;/a&gt;）ので、lucene-gosen 4.3.0をリリースしました。（&lt;a href=&#34;http://code.google.com/p/lucene-gosen/downloads/list?PHPSESSID=ab5edaac2154a82b90c0d9865454c0c9&#34;&gt;ダウンロードはこちら&lt;/a&gt;）
なお、lucene-gosen 4.3.0ですが、&lt;span style=&#34;color:#FF0000&#34;&gt;Lucene/Solr 4.2.1以下&lt;/span&gt;のバージョンのLucene/Solrでは利用&lt;span style=&#34;color:#FF0000&#34;&gt;できません。&lt;/span&gt;
注意してください。
また、lucene-gosen 4.2.1もLucene/Solr 4.3.0では動作しませんので注意が必要です。&lt;/p&gt;
&lt;p&gt;現時点（2013/05/06）では、lucene-gosen 4.3.0はLucene/Solr 4.3.0でのみ利用できます。
これは、&lt;a href=&#34;http://johtani.jugem.jp/?eid=129&#34;&gt;先日のエントリ&lt;/a&gt;にも書きましたが、LuceneにてAPIの変更が行われたためとなります。
いくつかのクラスおよびメソッドが廃止されたため、下位互換が保てない変更が入っているためです。&lt;/p&gt;
&lt;p&gt;独自のTokenizerやTokenizerFactory、TokenFilterFactory、CharFilterFactoryを作成されている方は、Lucene/Solrのバージョンアップを行う際は注意が必要です。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>ポモドーロ回してます。（ポモドーロテクニック入門読みました）(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2013/05/03/%E3%83%9D%E3%83%A2%E3%83%89%E3%83%BC%E3%83%AD%E5%9B%9E%E3%81%97%E3%81%A6%E3%81%BE%E3%81%99%E3%83%9D%E3%83%A2%E3%83%89%E3%83%BC%E3%83%AD%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%E5%85%A5%E9%96%80%E8%AA%AD%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Fri, 03 May 2013 23:42:19 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/05/03/%E3%83%9D%E3%83%A2%E3%83%89%E3%83%BC%E3%83%AD%E5%9B%9E%E3%81%97%E3%81%A6%E3%81%BE%E3%81%99%E3%83%9D%E3%83%A2%E3%83%89%E3%83%BC%E3%83%AD%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%E5%85%A5%E9%96%80%E8%AA%AD%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4048689525/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51ByQvQe1&amp;#43;L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4048689525/?tag=johtani-22&#34;&gt;
      アジャイルな時間管理術 ポモドーロテクニック入門
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

ポモドーロテクニック入門という本を読みました。
きっかけは、Twitter上で何度か「ポモドーロ」という単語を何度か見ていたためです。
最初は、なんだろう？というのが発端です。
「ポモドーロ＝トマト」なのですが、実際にはトマト型のキッチンタイマーが元になっているらしいです。
このタイマーを使った時間（タスク）管理術がポモドーロ・テクニックです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4048689525/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51ByQvQe1&amp;#43;L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4048689525/?tag=johtani-22&#34;&gt;
      アジャイルな時間管理術 ポモドーロテクニック入門
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

ポモドーロテクニック入門という本を読みました。
きっかけは、Twitter上で何度か「ポモドーロ」という単語を何度か見ていたためです。
最初は、なんだろう？というのが発端です。
「ポモドーロ＝トマト」なのですが、実際にはトマト型のキッチンタイマーが元になっているらしいです。
このタイマーを使った時間（タスク）管理術がポモドーロ・テクニックです。&lt;/p&gt;
&lt;p&gt;私は、ここ数年、複数の仕事がパラで走ることが時々ありました。
このような場合に、日によって異なる複数のタスクが存在します。
このとき、異なるタスクにスイッチするのに結構な時間を取られます。。。
また、急な割り込みが入った時も同様に、以前のタスクに戻るのになにしてたっけ？となることが多々あります。
普通に自己管理ができている方なら問題ないのでしょうが、私は結構ニガテでした。
そのようなときに、Twitter上で「ポモドーロ」という単語を見かけて、軽くググってみたところ、
タスク管理、時間管理によさそうな本だったので、その点を矯正するのも兼ねて、読んだ次第です。
また、タスクに集中できるという利点もあるそうです。&lt;/p&gt;
&lt;p&gt;本については、少し読みにくいところがありました。
ポモドーロテクニックとはどんなものかという全体像や単語に関する説明がないままに、話が進んでいくので。。。
1度読み終わったあとに実践しながらパラパラめくっているような状況です。
実際には、個々人のやり方などを考慮しながら、改善していくべきなのもあり、型を説明してないのかもしれないですが、もうすこし概観がわかる感じのほうが良かったです。&lt;/p&gt;
&lt;p&gt;で、4月初旬くらいから実践してみています。
効果が実際にあるかというと、まだわからないです。&lt;/p&gt;
&lt;p&gt;私がポモドーロテクニックに利用しているのはキッチンタイマーではなく、&lt;a href=&#34;http://code.google.com/p/pomodairo/&#34;&gt;pomodairo&lt;/a&gt;というAdobeAIR上で動くアプリになります。
ほかにも&lt;a href=&#34;http://www.pomodoroapp.com&#34;&gt;PomodoroApp&lt;/a&gt;というのもあるのですが、Free版だと登録できるタスクの上限があったので、pomodairoを選びました。（今見たら、3.0にバージョンが上がって、Limitがなくなってるかも）
AIRだと、WinでもMacでも動作するのというも決定した要因です。&lt;/p&gt;
&lt;p&gt;まだ、1ヶ月経ってませんが、私が実践してきて良かった点、できてない点、うまくいってない点はつぎのような感じです。&lt;/p&gt;
&lt;h3 id=&#34;良かった点&#34;&gt;良かった点&lt;/h3&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;目の前のタスクに集中できる。（25分スパンなので、Twitterを意識的に見なくできる。。。）&lt;/li&gt;
&lt;li&gt;適度な休憩が挟める。25分に5分の休憩が入るので、適度な没頭になる（没頭し過ぎない）&lt;/li&gt;
&lt;li&gt;自宅で作業するときにかなり有効。（5分の休憩時にTwitterやFB以外に漫画をパラパラ読んだりもできるので）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ということで、自宅で作業するときには結構いいです。
自宅ですと、pomodairoを使っていてタイマーの音を気兼ねなく出せるので、きちんとポモドーロが回せます。&lt;/p&gt;
&lt;h3 id=&#34;できてない点&#34;&gt;できてない点&lt;/h3&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;アクティビティ在庫管理。個人的にJIRAを使っていて、そこで管理しようと思っているのですが、うまくできてないです。pomodairoのアプリにもタスクを登録しているのもあり2重登録などを手間に思ってしまって。。。&lt;/li&gt;
&lt;li&gt;レコーディングと今日のTodo作成。&lt;/li&gt;
&lt;li&gt;インタラプトの記録&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;アクティビティ在庫管理ができてないのは、レコーディングがきちんと出来てないためでしょう。。。
二重管理になっている＋pomodairoで統計情報が出るが、当日分の統計情報がレコーディングできてないというのが痛いです。
また、このレコーディングが出来てないので、効果が出ているかがわからないという問題かと。。。
きりが悪かったりして、どうしても、仕事時間ギリギリまでタスクをこなしてしまい、レコーディング＋アクティビティ在庫の管理の時間が取れていません。
ここは意識してちゃんとやらないと意味がないよなぁと。今後の大きな課題です。&lt;/p&gt;
&lt;h3 id=&#34;うまくいってない点&#34;&gt;うまくいってない点&lt;/h3&gt;
&lt;hr&gt;
&lt;p&gt;できてない（やろうとしてできてない）点とは別に、どうもしっくり来ていないのがつぎのような点です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プログラミングしていると、25分のタイマーで区切りがすごく悪い時がおおい&lt;/li&gt;
&lt;li&gt;自宅以外でのタイマー音が出せない&lt;/li&gt;
&lt;li&gt;自宅以外での休憩の取り方&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;プログラミングをやっていて、乗ってきたタイミングでタイマーが鳴ってしまったり、
ちょっと頭のなかで整理していたあとの今まさに、頭のなかにある処理の流れをコードに落としている途中でタイマーがなってしまったり。
このような状況だと、休憩に入れなくて、ずるずるとコーディングを続けてしまうということが多々あります。
メモ（ソース上のコメントや手元）を残して休憩すればいいのでしょうが、どうしても今までの癖もありズルズルとやってしまい、すごく時間が経ってることが何度もあります。
ポモドーロテクニック的にはやはりNGなんでしょうが、なかなか治らない＋治したくない気もしています。
また、自宅以外の場合、基本的には自社ではなく客先に出ていることが多いのでどうしても音を出すことができません。
これもまた、切り替えができない要因になっています。
タイマーだけ携帯のアプリを使用しするという手もあるのでしょうが、この場合さらにレコーディングが出来ない状況に陥りそうで。。。
また、スマホだと電池が持たないのも問題点です。（Twitterを見るのに利用してるから電池が持たないという話もあるのですが。。。）
レコーディングに関しては、手描きのメモを使うのがいいのかなぁと。本では＋や◎などの印を付けるだけにしておけば良いとありますが、アプリのタイマーだと自動でそれができるので、悩みどころです。
最後の休憩の取り方も、ネットやTwitterを見るのもありなのですが、画面から離れる休憩を取りたいなぁと思うところもあり。。。
職場だと技術書やWEB+DBのような雑誌はあるのですが、休憩にはあまり向いていないなぁと。&lt;/p&gt;
&lt;p&gt;つらつらと書いて来ましたが、本を読んで、1ヶ月実践してきた（できてないとこも多いが）現状をメモしておきます。
こうやってるよ、こうしたら良かったよ、こうしてみれば？などありましたら、コメントいただけると助かります。&lt;/p&gt;
&lt;p&gt;来週以降はとりあえず、JIRAできちんとアクティビティ在庫管理をしながら、1日の結果をレコーディングしていくのを意識していこうと思います。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Solr4.3.0のChangesを訳してみた。(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2013/04/25/solr4-3-0%E3%81%AEchanges%E3%82%92%E8%A8%B3%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/</link>
      <pubDate>Thu, 25 Apr 2013 11:14:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/04/25/solr4-3-0%E3%81%AEchanges%E3%82%92%E8%A8%B3%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;span style=&#34;color:#FF0000&#34;&gt;まだ、Vote公開されていない、Solr 4.3（2013/04/25 11:00現在）ですが&lt;/span&gt;、&lt;/strong&gt;
ひさびさに訳してみた。詳細まで追っていないので、誤訳があるかもしれないですが。
おかしいとこあったらツッコミを。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;&lt;span style=&#34;color:#FF0000&#34;&gt;まだ、Vote公開されていない、Solr 4.3（2013/04/25 11:00現在）ですが&lt;/span&gt;、&lt;/strong&gt;
ひさびさに訳してみた。詳細まで追っていないので、誤訳があるかもしれないですが。
おかしいとこあったらツッコミを。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;○Solr 4.3.0のChanges
　・Upgrading from Solr 4.2.0
　　1.schema REST APIのcopyFields、dynamicFieldsの出力パスをCamelCaseに。他も同様。（&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4623&#34;&gt;SOLR-4623&lt;/a&gt;）
　　2.Slf4j/logging jarをSolrのwarに含めないことに。すべてのlogging jarはexample/lib/extに。（&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-3706&#34;&gt;SOLR-3706&lt;/a&gt;、&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4651&#34;&gt;SOLR-4651&lt;/a&gt;）
　　3.SolrCloudでハードコードされてたhostContextとhostPortをdeprecatedに。Solr5.0で削除する。（&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4622&#34;&gt;SOLR-4622&lt;/a&gt;）&lt;/p&gt;
&lt;p&gt;　・New Features
　　1.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4648&#34;&gt;SOLR-4648&lt;/a&gt;　PreAnalyzedUpdateProcessorFactoryでPreAnalyzedFieldの機能をほかのフィールドタイプでも使えるようにした。詳しくはJavadocとexampleを見て。
　　2.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4623&#34;&gt;SOLR-4623&lt;/a&gt;　REST APIで現在のschemaのエレメントをすべて読めるように。REST APIの返却の形式として、XMLとJSONとschema.xmlの形式を追加REST APIのパッケージを変更。
　　　クラス名も変更しschemaにフォーカスした機能も除去。今後のschema以外のREST APIのために。
　　　copyFieldsとdynamicFieldsの出力パスをすべてlowercaseのものからCamelCaseに変更。他のREST APIも同様。
　　3.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4658&#34;&gt;SOLR-4658&lt;/a&gt;　REST APIリクエストでschemaを変更できるようにするために、「managed schema」を導入。solrconfig.xmlに「&amp;lt;schemaFactory class=&amp;ldquo;ManagedSchemaFactory&amp;rdquo; mutable=&amp;ldquo;true&amp;rdquo;/&amp;gt;」を追加。REST APIリクエストでスキーマ変更が可能にするために。
　　4.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4656&#34;&gt;SOLR-4656&lt;/a&gt;　2つのハイライトパラメータ（hl.maxMultiValuedToMatch、hl.maxMultiValuedToExamine）を追加。
　　　hl.maxMultiValuedToMatchは指定された数のsnippetが見つかったらそれ以降の探索を停止する設定。multiValuedフィールドがどんなに離れてても探索する。
　　　hl.maxMultiValuedToExamineは指定された数のmultiValuedのエントリ数を調査したら探索を停止する設定。
　　　両方を指定した場合、最初のlimitに達したら停止する。ドキュメント全体をハイライトするためにコピーされるのを削減する。これらの最適化はmultiValuedフィールドに大量のエントリが存在する時に効く。。。
　　5.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4675&#34;&gt;SOLR-4675&lt;/a&gt;　PostingsSolrHighlighterでper-field/クエリ次のパラメータ指定のサポート
　　6.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-3755&#34;&gt;SOLR-3755&lt;/a&gt;　既存のshardを動的にsplitしてshardを追加するための新コレクションAPI（shard splitting）
　　7.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4530&#34;&gt;SOLR-4530&lt;/a&gt;　DIH：TikaのIdentityHtmlMapperを使う設定の提供
　　8.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4662&#34;&gt;SOLR-4662&lt;/a&gt;　solr.xmlにあるSolrCoreの定義よりもディレクトリ構造で見つける。また、solr.xmlのフォーマットを変えて、solrconfig.xmlに近くする。Solrのこのバージョンは旧スタイルの例で提供するが、新しいスタイルも試すことができる。Solr 4.4では、新しいスタイルで提供し、Solr 5.0では旧スタイルは廃止する予定。
　　　&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4347&#34;&gt;SOLR-4347&lt;/a&gt;　Adminハンドラで新しく生成されたコアがsolr.xmlに永続化される
　　　&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-1905&#34;&gt;SOLR-1905&lt;/a&gt;　Adminリクエストハンドラで生成されたコアもsolr.xmlに永続化される。また、solr.solr.datadirのようなプロパティの用にsolr.xmlに永続化される問題のfix。
　　9.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4717&#34;&gt;SOLR-4717&lt;/a&gt;/SOLR-1351　SimpleFacetで同じフィールドに異なるファセットを適用出来るlocalParamsを追加
　　10.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4671&#34;&gt;SOLR-4671&lt;/a&gt;　CSVResponseWriterのpseudoフィールドのサポート
　　11.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4358&#34;&gt;SOLR-4358&lt;/a&gt;　HttpSolrServerでuseMultiPartPostでstream名を送信できる
　・Bug Fixes
　　1.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4543&#34;&gt;SOLR-4543&lt;/a&gt;：solr.xml/solr.propertiesでshardHandlerFactoryの設定が動作しない
　　2.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4634&#34;&gt;SOLR-4634&lt;/a&gt;：Java 8&amp;quot;Nashorn&amp;quot;JavaScript実装の動作に関するscripting engineのテストのfix
　　3.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4636&#34;&gt;SOLR-4636&lt;/a&gt;：SolrIndexSearcherをオープンする時に何かの理由でreaderがオープンできない時に、ディレクトリがリリースされない
　　4.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4405&#34;&gt;SOLR-4405&lt;/a&gt;：Admin UIのadmin-extraファイルでcore-menuが表示されない
　　5.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-3956&#34;&gt;SOLR-3956&lt;/a&gt;：group.facet=trueでfacet.limitがマイナスの時の動作
　　6.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4650&#34;&gt;SOLR-4650&lt;/a&gt;：copyFieldでダイナミックフィールドや暗黙的なフィールドがsourceでマッチしない。4.2で入ったバグ
　　7.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4641&#34;&gt;SOLR-4641&lt;/a&gt;：Schemaで、illegalなフィールドパラメータで例外が発生するようにする。
　　8.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-3758&#34;&gt;SOLR-3758&lt;/a&gt;：SpellCheckComponentが分散groupingで動作しない。
　　9.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4652&#34;&gt;SOLR-4652&lt;/a&gt;：solr.xmlプラグインのresource loaderで共有ライブラリの挙動がおかしい
　　10.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4664&#34;&gt;SOLR-4664&lt;/a&gt;：ZkStateReaderがaliasを更新しても見えない
　　11.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4682&#34;&gt;SOLR-4682&lt;/a&gt;：CoreAdminRequest.mergeIndexが複数コアやindexDirが複数の場合にマージできない
　　12.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4581&#34;&gt;SOLR-4581&lt;/a&gt;：Solr4.2で数値フィールドのファセットでマイナスの値があるとソートがおかしい
　　13.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4699&#34;&gt;SOLR-4699&lt;/a&gt;：Admin Handlerでデータディレクトリの場所がファイルシステムだと思い込んでる。（RAMの場合もある）
　　14.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4695&#34;&gt;SOLR-4695&lt;/a&gt;：non-cloudセットアップでもコア管理のSPLITが使えるように
　　15.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4680&#34;&gt;SOLR-4680&lt;/a&gt;：exampleのspellcheck設定のqueryAnalyzerFieldTypeの修正
　　16.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4702&#34;&gt;SOLR-4702&lt;/a&gt;：exampleの/browseの「Did you mean?」のサジェストをFix
　　17.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4710&#34;&gt;SOLR-4710&lt;/a&gt;：Zookeeperから全ノードをアップせずにコレクションを削除できないのを修正
　　18.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4487&#34;&gt;SOLR-4487&lt;/a&gt;：HttpSolrServerからのSolrExceptionがリモートのサーバから戻るHTTPステータスコードを含んでない
　　19.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4661&#34;&gt;SOLR-4661&lt;/a&gt;：Admin UIのレプリケーションで現在のレプリカ可能なマスタのバージョンを正確に表示
　　20.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4716&#34;&gt;SOLR-4716&lt;/a&gt;,&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4584&#34;&gt;SOLR-4584&lt;/a&gt;：SolrCloudリクエストプロキシがTomcatなどJetty出ないコンテナで動作していない
　　21.&lt;a href=&#34;http://issues.apache.org/jira/browse/SOLR-4746&#34;&gt;SOLR-4746&lt;/a&gt;：Distributed groupingのトップレベルグループコマンドでSimpleOrderedMapの代わりにNamedListを使う。non-distributed groupingと出力形式が異なるため。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Lucene 4.3.0のChangesにあるChanges in backwards compatibility policyが気になったので訳してみた。(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2013/04/24/lucene-4-3-0%E3%81%AEchanges%E3%81%AB%E3%81%82%E3%82%8Bchanges-in-backwards-compatibility-policy%E3%81%8C%E6%B0%97%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%A7%E8%A8%B3%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/</link>
      <pubDate>Wed, 24 Apr 2013 16:00:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/04/24/lucene-4-3-0%E3%81%AEchanges%E3%81%AB%E3%81%82%E3%82%8Bchanges-in-backwards-compatibility-policy%E3%81%8C%E6%B0%97%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%A7%E8%A8%B3%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/</guid>
      <description>&lt;p&gt;&lt;span style=&#34;color:#FF0000&#34;&gt;現在、RC3のVoteをやっている最中（2013/04/24　16:00時点）で、まだリリースされていない、4.3.0についてです。&lt;/span&gt;
開発者MLでChangesの書き方を考えないとね、みたいなエントリーが流れてて気になっていたので、訳してみた。
lucene-gosenの実装を変更しないといけないっぽいなぁ。Lucene/Solr 4.2.1以前と4.3.0でI/Fとかが変わることになりそうです。（3.とか8.とか）
（ここで力尽きて、それより下はまだ読んでないです。。。）&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;span style=&#34;color:#FF0000&#34;&gt;現在、RC3のVoteをやっている最中（2013/04/24　16:00時点）で、まだリリースされていない、4.3.0についてです。&lt;/span&gt;
開発者MLでChangesの書き方を考えないとね、みたいなエントリーが流れてて気になっていたので、訳してみた。
lucene-gosenの実装を変更しないといけないっぽいなぁ。Lucene/Solr 4.2.1以前と4.3.0でI/Fとかが変わることになりそうです。（3.とか8.とか）
（ここで力尽きて、それより下はまだ読んでないです。。。）&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;○Changes in backwards compatibility policy
　　1.&lt;a href=&#34;http://issues.apache.org/jira/browse/LUCENE-4810&#34;&gt;LUCENE-4810&lt;/a&gt;：EdgeNGramTokenFilterが同じ入力tokenから複数のngramを生成した時にpositionを増加させていないのを修正
　　2.&lt;a href=&#34;http://issues.apache.org/jira/browse/LUCENE-4822&#34;&gt;LUCENE-4822&lt;/a&gt;：KeywordMarkerFilterがabstractクラスで、サブクラスがisKeyword()メソッドを実装する必要がある。新しく、SetKeywordTokenFilterというクラスにすでにある機能を分解した。
　　3.&lt;a href=&#34;http://issues.apache.org/jira/browse/LUCENE-4642&#34;&gt;LUCENE-4642&lt;/a&gt;：TokenizerとサブクラスのAttributeSourceのコンストラクタを削除。代わりにAttributeFactoryをもつコンストラクタを追加。
　　4.&lt;a href=&#34;http://issues.apache.org/jira/browse/LUCENE-4833&#34;&gt;LUCENE-4833&lt;/a&gt;：IndexWriterConfigがsetMergePolicy(null)の時にLogByteSizeMergePolicyを使っているのをデフォルトmerge policyをTieredMergePolicyに。また、nullが引数に渡されたらExceptionを返す。
　　5.&lt;a href=&#34;http://issues.apache.org/jira/browse/LUCENE-4849&#34;&gt;LUCENE-4849&lt;/a&gt;：ParallelTaxonomyArraysをDirectoryTaxonomyWriter/Readerのためのabstractとして作成。あと、o.a.l.facet.taxonomyに移動。
　　6.&lt;a href=&#34;http://issues.apache.org/jira/browse/LUCENE-4876&#34;&gt;LUCENE-4876&lt;/a&gt;：IndexDeletionPolicyをInterfaceではなく、abstractクラスに。IndexDeletionPolicy、MergeScheduler、InfoStreamでCloneableをimplement。
　　7.&lt;a href=&#34;http://issues.apache.org/jira/browse/LUCENE-4874&#34;&gt;LUCENE-4874&lt;/a&gt;：FilterAtomicReaderと関連するクラス（FilterTerms、FilterDocsEnumなど）でフィルタされたインスタンスをforwardしないように。メソッドが他のabstractメソッドを実装している場合に。（？）
　　8.&lt;a href=&#34;http://issues.apache.org/jira/browse/LUCENE-4642&#34;&gt;LUCENE-4642&lt;/a&gt;, &lt;a href=&#34;http://issues.apache.org/jira/browse/LUCENE-4877&#34;&gt;LUCENE-4877&lt;/a&gt;：TokenizerFactory、TokenFilterFactory、CharFilterFactoryの実装者は、少なくともMap&amp;lt;String,String&amp;gt;（SPIフレームワーク（Solrとか）によってロードされる）を引数にするコンストラクタを提供する必要がある。さらに、TokenizerFactoryはcreate(AttributeFactory,Reader)メソッドを実装する必要もある。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>エンジニアのためのスキルアップ勉強会『Tech Compass』 #tecomp ― Vol.2 「人気Webサービスの作り方教えます！」に参加しました。(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2013/04/23/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B9%E3%82%AD%E3%83%AB%E3%82%A2%E3%83%83%E3%83%97%E5%8B%89%E5%BC%B7%E4%BC%9Atech-compass--tecomp--vol-2-%E4%BA%BA%E6%B0%97web%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9%E6%95%99%E3%81%88%E3%81%BE%E3%81%99%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Tue, 23 Apr 2013 20:45:42 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/04/23/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B9%E3%82%AD%E3%83%AB%E3%82%A2%E3%83%83%E3%83%97%E5%8B%89%E5%BC%B7%E4%BC%9Atech-compass--tecomp--vol-2-%E4%BA%BA%E6%B0%97web%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9%E6%95%99%E3%81%88%E3%81%BE%E3%81%99%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;第2回目も参加しました。
とりあえずメモ。
自分には欠けてる視点の話しなので面白かった。
ちょっと寒かったなぁ。&lt;/p&gt;
&lt;hr&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
エンジニアのためのスキルアップ勉強会『Tech Compass』 #tecomp ― Vol.2 「人気Webサービスの作り方教えます！」 ―
日時：2013/04/23 19:00
場所：パレスサイドビル9F マイナビルーム

◎自己紹介
　●株式会社Zaim／閑歳孝子
　　小学校3年からFMVで草の根チャットとかにつないでた。（すげー）
　　これがいい記事ですよ。http://www.1101.com/umeda_iwata/
　　テレビとかで紹介されてるZaimやってます。
　　3つの基準　　
　　・日常的に使うもの
　　・普通の人が使うもの
　　・少なくとも自分は使うもの
　　サービスの良さの基準
　　　縦軸：影響の深さ
　　　横軸：影響する人数
　　　この面積が大きいのがいいんでは。

　●株式会社ワディット／和田裕介
　　いろいろ作ってます「カウントダウンチューブ」とか「君のラジオ」とか30～40くらい作ってます。
　　・「ボケて」ってのやってます。
　　　600万ボケ。アプリ120万DL　　　
　　僕らがつくるための５Wについて
　　・なぜ？
　　　・サービスの根本となる「哲学」をみんなで共有できるかが重要
　　　・内向けのビジョンも大事
　　・何を？
　　　・ユースケースで整理する
　　・いつ？
　　　・つくろう！すぐ作れるようにしようねって感じ
　　・誰と？
　　　・最強のチーム。意思決定がはやい。
　　自分主体でサービス設計して、作りなおすのをためらわない

◎ディスカッション
　Q：どうしてサービス作ったの？
　A：エンジニアへのあこがれから、サービスを作った（閑歳さん）
　　　ものづくりという意味では、Webサービス以外もあるけど？（馬場さん）
　　　学内のSNSのようなものを作ってて、アクセスが伸びるのが面白かった。（閑歳さん）
　　　大学でlastfmみたいなものを研究してて。。。（和田さん）
　　　社会に出てサービスを作るまでの話は？作って稼ごうって思ったのは？（馬場さん）
　　　あんまりなかった。（閑歳さん）
　　　すでに起業してた。サービス作ると実績として認められて仕事が入ってきてた。（和田さん）
　　　直接あった時に反応がもらえるのが楽しい。（和田さん）
　
　Q：どうやって、チームを組み立てたりして開発とかしてきたのか？（馬場さん）
　A：「ボケて」まとめサイトでブレイクしたけど、アクセス数が落ちてない。
　　　同年代の知人で色々とチームが組めてて楽しい（和田さん）
　　　はじめは一人でやってて、しかも構想とか。あとロゴだけ最初に作ってた。
　　　ノマド的に作業してました。（閑歳さん）

　Q：チームがバラバラですが、困らないですか？
　A：今のところ困ってないです。もっと人が増えると困るかもしれないですけど。（閑歳さん）
　　　それぞれが他に職を持ってるので特に困ってないです（和田さん）
　　　向き不向きはあるんじゃないかなぁ。10人とかになるとどうなるか不明（閑歳さん）
　　　GoogleのMLでレスが早ければ問題ないかな。（和田さん）
　　　あとは、チームが大きくならないように上手く分割してる（？）（ふたりとも）
　Q：ユーザの声の吸い上げ方、サービス改善の判断材料は？
　A：ユーザの声は聞くけど、全部取り込むものではない。
　　　細かな点はユーザの声を取り込むけど、軸はブレないようにしてる（閑歳さん）
　　　古参ユーザよりも新しいユーザを取り込むのが大事。（和田さん）
　　　nanapiのけんすうさん
　Q：品質はどうしてる？
　A：セキュリティは絶対。（閑歳さん）
　　　品質を気にするってのは難しい。品質を担保できる仕組みを作るとこまでいけるようにしたい。
　　　投稿される画像はチェックしている。（和田さん）
&lt;/code&gt;&lt;/pre&gt;</description>
      <content:encoded>&lt;p&gt;第2回目も参加しました。
とりあえずメモ。
自分には欠けてる視点の話しなので面白かった。
ちょっと寒かったなぁ。&lt;/p&gt;
&lt;hr&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
エンジニアのためのスキルアップ勉強会『Tech Compass』 #tecomp ― Vol.2 「人気Webサービスの作り方教えます！」 ―
日時：2013/04/23 19:00
場所：パレスサイドビル9F マイナビルーム

◎自己紹介
　●株式会社Zaim／閑歳孝子
　　小学校3年からFMVで草の根チャットとかにつないでた。（すげー）
　　これがいい記事ですよ。http://www.1101.com/umeda_iwata/
　　テレビとかで紹介されてるZaimやってます。
　　3つの基準　　
　　・日常的に使うもの
　　・普通の人が使うもの
　　・少なくとも自分は使うもの
　　サービスの良さの基準
　　　縦軸：影響の深さ
　　　横軸：影響する人数
　　　この面積が大きいのがいいんでは。

　●株式会社ワディット／和田裕介
　　いろいろ作ってます「カウントダウンチューブ」とか「君のラジオ」とか30～40くらい作ってます。
　　・「ボケて」ってのやってます。
　　　600万ボケ。アプリ120万DL　　　
　　僕らがつくるための５Wについて
　　・なぜ？
　　　・サービスの根本となる「哲学」をみんなで共有できるかが重要
　　　・内向けのビジョンも大事
　　・何を？
　　　・ユースケースで整理する
　　・いつ？
　　　・つくろう！すぐ作れるようにしようねって感じ
　　・誰と？
　　　・最強のチーム。意思決定がはやい。
　　自分主体でサービス設計して、作りなおすのをためらわない

◎ディスカッション
　Q：どうしてサービス作ったの？
　A：エンジニアへのあこがれから、サービスを作った（閑歳さん）
　　　ものづくりという意味では、Webサービス以外もあるけど？（馬場さん）
　　　学内のSNSのようなものを作ってて、アクセスが伸びるのが面白かった。（閑歳さん）
　　　大学でlastfmみたいなものを研究してて。。。（和田さん）
　　　社会に出てサービスを作るまでの話は？作って稼ごうって思ったのは？（馬場さん）
　　　あんまりなかった。（閑歳さん）
　　　すでに起業してた。サービス作ると実績として認められて仕事が入ってきてた。（和田さん）
　　　直接あった時に反応がもらえるのが楽しい。（和田さん）
　
　Q：どうやって、チームを組み立てたりして開発とかしてきたのか？（馬場さん）
　A：「ボケて」まとめサイトでブレイクしたけど、アクセス数が落ちてない。
　　　同年代の知人で色々とチームが組めてて楽しい（和田さん）
　　　はじめは一人でやってて、しかも構想とか。あとロゴだけ最初に作ってた。
　　　ノマド的に作業してました。（閑歳さん）

　Q：チームがバラバラですが、困らないですか？
　A：今のところ困ってないです。もっと人が増えると困るかもしれないですけど。（閑歳さん）
　　　それぞれが他に職を持ってるので特に困ってないです（和田さん）
　　　向き不向きはあるんじゃないかなぁ。10人とかになるとどうなるか不明（閑歳さん）
　　　GoogleのMLでレスが早ければ問題ないかな。（和田さん）
　　　あとは、チームが大きくならないように上手く分割してる（？）（ふたりとも）
　Q：ユーザの声の吸い上げ方、サービス改善の判断材料は？
　A：ユーザの声は聞くけど、全部取り込むものではない。
　　　細かな点はユーザの声を取り込むけど、軸はブレないようにしてる（閑歳さん）
　　　古参ユーザよりも新しいユーザを取り込むのが大事。（和田さん）
　　　nanapiのけんすうさん
　Q：品質はどうしてる？
　A：セキュリティは絶対。（閑歳さん）
　　　品質を気にするってのは難しい。品質を担保できる仕組みを作るとこまでいけるようにしたい。
　　　投稿される画像はチェックしている。（和田さん）
&lt;/code&gt;&lt;/pre&gt;</content:encoded>
    </item>
    
    <item>
      <title>JIRAのデータをS3へバックアップ(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2013/04/22/jira%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92s3%E3%81%B8%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97/</link>
      <pubDate>Mon, 22 Apr 2013 23:07:28 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/04/22/jira%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92s3%E3%81%B8%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97/</guid>
      <description>&lt;p&gt;だいぶ、ブログを書くペースが落ちてきてて、危機感を感じている今日このごろです。。。
今回は、個人的に利用しているJIRAのバックアップについて、ブログに残しておこうかと。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;だいぶ、ブログを書くペースが落ちてきてて、危機感を感じている今日このごろです。。。
今回は、個人的に利用しているJIRAのバックアップについて、ブログに残しておこうかと。&lt;/p&gt;
&lt;p&gt;さくらVPSのサーバを借りてJIRAを運用しています。
運用といっても、自分の備忘録のためというのが大半の理由です。
タスクを忘れないように管理するのと合わせて、その作業を行ったときのメモも残したいなと。&lt;/p&gt;
&lt;p&gt;バックアップといっても、同じサーバ内に保存しても意味がない＋AWSを触ると言いつつ1年以上経ってしまったので、
このへんで本腰を入れるという意味も込めてAWSのS3（ゆくゆくはGlacier）にバックアップを取る仕組みを作りました。
「作りました」というと凄そうですが、Cronとシェルだけで終わりました、なんて便利な世の中。
ということで、以下は作業の備忘録です。&lt;/p&gt;
&lt;h2 id=&#34;1awsのアカウント作成&#34;&gt;1.AWSのアカウント作成&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;アカウントを作ってください。ここは特に説明しなくてもいいかと。。。クレジットカードの登録が必要なのが注意点でしょうか。
アカウント作成後の1年間は&lt;a href=&#34;http://aws.amazon.com/jp/free/&#34;&gt;無料枠&lt;/a&gt;と呼ばれる仕組みが用意されており、いろんなことが無料で行えます。
（まだ、S3しか使ってないので、他にももっと使わないと。。。）&lt;/p&gt;
&lt;h2 id=&#34;2s3のバケット作成&#34;&gt;2.S3のバケット作成&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;AWSのアカウントが作成できたら、&lt;a href=&#34;http://aws.amazon.com/jp/s3/&#34;&gt;Amazon S3（Simple Storage Service）&lt;/a&gt;のバケットと呼ばれる、データの保存先を作成します。
作成手順はこちらの&lt;a href=&#34;http://docs.aws.amazon.com/AmazonS3/latest/gsg/GetStartedWithS3.html?r=8046&#34;&gt;公式入門ドキュメント（英語）&lt;/a&gt;をそのまま行いました。
簡単な手順はこちら&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;AWS Management Consoleと呼ばれるところから、S3のコンソールにアクセス&lt;/li&gt;
&lt;li&gt;「Create Bucket」ボタンをクリック&lt;/li&gt;
&lt;li&gt;「Bucket Name」を入力し、リージョンを選択したら「Create」ボタンをクリック&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以上でバケットが作成されました。これだけです。WebのConsoleからファイルをアップロードすることも可能です。
ただ、今回はさくらVPSから定期的にバックアップしたいのでシェルでアクセスできるようにします。&lt;/p&gt;
&lt;h2 id=&#34;3awsのアクセスキーとシークレットアクセスキーの取得&#34;&gt;3.AWSのアクセスキーとシークレットアクセスキーの取得&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;次に紹介するs3cmdというツールを利用するのに、AWSのアクセスキーとシークレットキーが必要になります。
取得方法は&lt;a href=&#34;http://www.atmarkit.co.jp/fwin2k/operation/aec2s3_1/aec2s3_1_04.html&#34;&gt;こちら&lt;/a&gt;を参考にしましたが、今は日本語のページが用意されています。
セキュリティ証明書（Security Credentials）のページで、「アクセス証明書」というタブで、「新しいアクセスキーを作成する」リンクをクリックしてください。
アクセスキーIDが新しく表示されます。このアクセスキーIDとシークレットアクセスキー（表示リンククリック後に表示される）をメモしておきます。&lt;/p&gt;
&lt;h2 id=&#34;4s3cmdのインストール&#34;&gt;4.s3cmdのインストール&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;世の中には便利なものを作ってくれる方がいるもので。
&lt;a href=&#34;http://s3tools.org/s3cmd&#34;&gt;s3cmd&lt;/a&gt;と呼ばれるS3へアクセスできるコマンドラインツールが存在します。
ということで、こちらをインストール。これまた、便利なもので&lt;a href=&#34;http://understeer.hatenablog.com/entry/2012/07/23/124402&#34;&gt;インストール手順を書いてくれれてるブログ&lt;/a&gt;もありました。（あれ、なんか、見たことある名前がURLにはいってるなぁ）
インストールはこちら。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
# yum -y --enablerepo epel install s3cmd
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;インストール後に、先ほど取得したアクセスキーIDを設定します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
$ s3cmd --configure
Access Key: xxxx
Secret Key: xxxx
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;以上で、s3cmdが使えるようになりました。&lt;/p&gt;
&lt;h2 id=&#34;5バックアップスクリプトの作成&#34;&gt;5.バックアップスクリプトの作成&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;つぎは、本題のJIRAのバックアップです。
バックアップ方法は&lt;a href=&#34;http://doc.go2group.jp/pages/viewpage.action?pageId=34865916&#34;&gt;こちら&lt;/a&gt;を参考にしました。ちょっと古いみたいですが。
おもなデータは「JIRAのXMLバックアップユーティリティ」にてバックアップするか、「データベースのバックアップツール」を利用する方法があります。
推奨は「データベースのバックアップツール」のようなので、私の場合は「pg_dump」にてJIRAのデータベースをまるごとバックアップすることにしています。
また、データベースには添付ファイルが保存されていないようなので、別途「/var/atlassian/application-data/jira/data」というディレクトリをtarコマンドで圧縮して保存すようにしました。
あとは、pg_dumpの結果と添付ファイルの保存先の圧縮したデータをまとめてディレクトリに保存して圧縮します。
さいごは、S3にアップロードすればおしまいです。
一応、ファイルが連綿と残り続けるのは嫌だなぁということで、ファイル数で世代管理することにもしました。
これまた、ググって見つけてきた&lt;a href=&#34;http://d.hatena.ne.jp/nigogonigo/20121003/1349272523&#34;&gt;サイトを参考&lt;/a&gt;にしただけですが。。。
ということで、こんなかんじのスクリプトを日時でcronに設定して動かしてます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
#!/bin/sh
TODAY=`date +%Y%m%d`
BACKUP_HOME=&amp;#34;/var/atlassian/backups&amp;#34;
S3SYNC_DIR=&amp;#34;/var/atlassian/backups/s3sync&amp;#34;
AGE=7

mkdir -p ${BACKUP_HOME}/${TODAY}/
/usr/bin/pg_dump -U postgres -Fc jiradb &amp;gt; ${BACKUP_HOME}/${TODAY}/jiradb_backup.dump
tar zcvf ${BACKUP_HOME}/${TODAY}/attachment.tgz /var/atlassian/application-data/jira/data
tar zcvf ${S3SYNC_DIR}/jira_backup_${TODAY}.tgz ${BACKUP_HOME}/${TODAY}
rm -rf ${BACKUP_HOME}/${TODAY}
NUM=`ls ${S3SYNC_DIR} | wc -l`
while [ ${NUM} -ge ${AGE} ]
do
  DEL_FILE=`ls -lt ${S3SYNC_DIR} | tail -1 | awk &amp;#39;{print $9}&amp;#39;`
  rm -r ${S3SYNC_DIR}/${DEL_FILE}
  NUM=`ls ${S3SYNC_DIR} | wc -l`
done

s3cmd sync --delete-removed ${S3SYNC_DIR}/* s3://my_jira_backup/s3sync/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;そこへんだよとかあれば、ツッコミを。
今のところ、S3へのsyncだけなので、このあとは、月1くらいでGlacierに落とすとかの仕組みも考えるかなぁ。これまた何かあるんだろうけど。
あとは、この応用で家のNASに溜まっている写真をS3経由もしくは直接Glacierにバックアップする仕組みを考える予定です。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Heroku Meetup #8 TreasureData &#43; Waza Report!! に参加しました。#herokujp(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2013/04/05/heroku-meetup--8-treasuredata--waza-report-%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-herokujp/</link>
      <pubDate>Fri, 05 Apr 2013 11:20:43 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/04/05/heroku-meetup--8-treasuredata--waza-report-%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-herokujp/</guid>
      <description>&lt;p&gt;&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4797371838/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/515q16BHGGL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4797371838/?tag=johtani-22&#34;&gt;
      HerokuではじめるRailsプログラミング入門
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

heroku気になってるのに使ってなくて、TDのアカウント作ってデータアップしてない軟弱者ですが、参加して来ました。。。
とりあえず、大事なことです。まずは、上記の書籍を買ってください（って中の人が言ってました。）
&lt;a href=&#34;http://herokujp.doorkeeper.jp/events/3405&#34;&gt;イベントページはこちら&lt;/a&gt;。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4797371838/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/515q16BHGGL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4797371838/?tag=johtani-22&#34;&gt;
      HerokuではじめるRailsプログラミング入門
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

heroku気になってるのに使ってなくて、TDのアカウント作ってデータアップしてない軟弱者ですが、参加して来ました。。。
とりあえず、大事なことです。まずは、上記の書籍を買ってください（って中の人が言ってました。）
&lt;a href=&#34;http://herokujp.doorkeeper.jp/events/3405&#34;&gt;イベントページはこちら&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;総じて、herokuの中のエンジニアの方たちがすごく情熱があって、ユーザと会話をしたがっているという感想だったようで、まだまだ、よくなりそうだなぁと。
私は、ベースがJavaなので、JavaやScala、Playで使ってる方の感想とか聞きたいかなぁ。
あと、herokuとS3の組み合わせだと思うんですが、料金とかはAmazonとheroku両方に別々に払うのかな？とかはちょっと気になりました。
AWSのアカウントも作ってS3にバックアップあげるの作ろうと思って手をつけてない軟弱者ですが。。。
今月は余裕がありそうなので、TDとか触ってみようと思います。。。&lt;/p&gt;
&lt;p&gt;懇親会ではTDのmuga-sanとお話できて、いくつか気になってた話ができたのでスッキリしました。
あと、株式会社サムライズムの名刺頂きました。写真載せろって言われたけど、また今度ｗ&lt;/p&gt;
&lt;p&gt;最後に、大事なことです。まずは、上記の書籍を買ってください（って中の人が言ってました。）&lt;/p&gt;
&lt;p&gt;以下は、いつものようなメモです。最後の方はちょっとくたばってたのでメモがおざなりになってます、すみません。&lt;/p&gt;
&lt;hr&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
日時：2013年04月04日(木) 18時30分 - 21時00分
場所：日本創生ビレッジ 事業開発支援オフィス 東京21cクラブ コラボレーションスペース


◯Ayumu Aizawa（Heroku, Inc.）
　・■
　　PostgreSQLが9.2になりました。
　・◆
　　メモリが2倍。βテスタ向けにスケールアップ。
　　JavaとかJavaとかJavaとかデプロイしてもいいよね。
　　けど、メモリ2xは価格も2x！
　・●
　　Heroku OAuthを提供。Experimentalだけど。
　　heroku-bouncer使うとOAuthが楽になる。

◯Treasure Data and heroku
　Masahiro Nakagawa（TreasureData）
　・会社紹介
　・フロントエンド部分の担当（fluentd）
　・1500億レコード！？
　・投資家の中にHerokuの方がいる。
　・ターゲットは？
　　Cloud + Big Dataが対象
　　Hadoopは立ち上げるのはいいんだけどメンテナンスコストが。
　　Hadoopの処理基板を提供
　・Hadoop生ではなく、Plazmaを使っていたりする。
　・Viki
　　herokuにtd-agent入れて、TDにデータ送って、Postgresに書き出して使ってる。
　・TDはどうやってheroku使ってるの？
　　Webコンソール。
　　　http://console.treasure-data.com
　　Webサイトは大体heroku
　　　fluentdとかも
　・herokuのaddonとしてtd-agentを提供してる。
　・STDOUTからTDにデータ送るのもできるよと。


◯Waza Report
　◯吉田雄哉さん（co-meeting）
　　・まずは、co-meetingの紹介。
　　　1文字ずつ送信してるよと
　　・Chief Talk Officerらしいｗ
　　・MongoDB使ってるって言ったら、herokuのPostgreSQLの人と話して、鼻で笑われたｗ
　　・すごく熱意のある人達がエンジニアとして働いてる
　　・ユーザの声をきちんと聞いてくれる体制ができてるミーティングだった。
　　・「クラウド」って単語を聞いてない。勉強会のレベルもすごい。

　◯山本裕介さん（株式会社サムライズム）
　　・ニッチなブログ書いてます。
　　・Java屋が見るWaza
　　　Tシャツプレゼント！
　　・OSS好きが多い。
　　　Java/Scala系の話が少なかった。Scala界隈では人気みたい

　◯岡村純一さん（株式会社シャノン）
　　・スライド1枚も作らずに喋る人とかいました。
　　　（すごい。。。）
　　・Django

　　　Playに似てて面白いかもと
　　・Ruby2.0
　　　Matzが喋ってたとか
　　・クロージングはビールが出てきてた。
　　　交流パーティみたいになってた。CROSSがそれに似てますね。日本でやってるイベント

　◯小西俊司さん（株式会社フレクト）
　　・バックエンドの性能とかを収集して見ることができるツールがあるらしい。
　　・クエリを登録しておくと監視ができるツールとか。（TDとかぶってる？）
　　・やっぱり、情熱的だし、OSS好きでオープンな感じのエンジニアが多い。


◯Heroku LT
　無慈悲なLTです。3分たったらケーブル引っこ抜きます。
　（最後はくたばっててあまり聞けてない。。。）

　◯山本 裕介（株式会社サムライズム）
　　・herokuでJava7！
　　　Java6終わってますからherokuも移行してね！
　◯竹野 淳（Grow!）
　　・BoxTo？
　　・コラボレーター募集！
　◯小西 俊司（株式会社フレクト）
　　・ExcelのテンプレートをアップロードしてGETでパラメータわたせばいいよみたいなの作ってる。
　◯大久保英樹（Job-Hub）
　　・CarrierWaveとかの注意点
&lt;/code&gt;&lt;/pre&gt;</content:encoded>
    </item>
    
    <item>
      <title>第10回Solr勉強会を主催しました。#SolrJP(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2013/03/26/%E7%AC%AC10%E5%9B%9Esolr%E5%8B%89%E5%BC%B7%E4%BC%9A%E3%82%92%E4%B8%BB%E5%82%AC%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-solrjp/</link>
      <pubDate>Tue, 26 Mar 2013 21:16:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/03/26/%E7%AC%AC10%E5%9B%9Esolr%E5%8B%89%E5%BC%B7%E4%BC%9A%E3%82%92%E4%B8%BB%E5%82%AC%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-solrjp/</guid>
      <description>&lt;p&gt;記念すべき！？&lt;a href=&#34;http://atnd.org/events/37170/&#34;&gt;第10回のSolr勉強会&lt;/a&gt;です。&lt;/p&gt;
&lt;p&gt;発表者が無事あつまり（本当にありがとうございました！）、今回も盛況な感じでほぼ満員でした。
ツイートのおかげか、キャンセル処理もちゃんと行なってもらえて助かりました。
開場直後にドタバタしてしまい、すみませんでした。。。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;記念すべき！？&lt;a href=&#34;http://atnd.org/events/37170/&#34;&gt;第10回のSolr勉強会&lt;/a&gt;です。&lt;/p&gt;
&lt;p&gt;発表者が無事あつまり（本当にありがとうございました！）、今回も盛況な感じでほぼ満員でした。
ツイートのおかげか、キャンセル処理もちゃんと行なってもらえて助かりました。
開場直後にドタバタしてしまい、すみませんでした。。。&lt;/p&gt;
&lt;p&gt;&lt;del&gt;とりあえず、第一報の記事をアップしておきます。&lt;/del&gt;
&lt;del&gt;懇親会での話とか感想はまたあとで。&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;関口さんの資料は実は、前もって見たことがある資料でした。
最初の発表にしては、少しむずかしいと思った方もいるかなぁと。
ただ、類義語の辞書は結構作るのが大変だし、探しても出てこないものなので、面白い話だったんではないかなぁと。
「ミスチル」はできないけど、「マツケン」ができるのは読みがあるからとかなんですかねぇ？って質問するの忘れてた。&lt;/p&gt;
&lt;p&gt;尾形さんの話は結構、みんな通ってきた道かもなぁと思いました。他の方も同じ経験してるんじゃないかなぁと。
ただ、一人でやるのはすごいですよね。検索って結構人数が割かれてない場合が多いのかなぁ。
あんまり使われていないというのが少し悲しい話でしたが。。。
サーバを要求すれば結構なスペックが用意してもらえるのはうらやましい限りですねぇ。
スキーマ変更については、レプリケーション機能を使うと追加などならうまくいくんじゃないでしょうか。（そんなツイートもありましたよ。togetter読み返すと出てきます。）
フィールド名を変更しないで型を変更するなどしたらおかしくなると思いますが。&lt;/p&gt;
&lt;p&gt;野口さんの話はなかなかチャレンジングでいいなぁと思いました。よく挫けずに頑張られているなぁとｗ
試行錯誤した仮定も発表してもらえると同じ轍を踏んだ人が助かると思います。
大きな企業で本格的に横断的な社内検索が出来る仕組みが出来上がっているって話はなかなかきかないかなと。
どうしても、社内検索とかお金が出なくて手を付けられないといいう悲しい話が多いので、こういう話は共有したい情シスの方がいっぱいいるんじゃないかなぁと。
ManifoldCFが結構地雷を多く含んでいるのは大変そうですね。。。
SolrにもTikaが入っていたりしますが、個人的にはTikaがやるべき処理は前処理と思っているので、Solrとは別の場所でやりたいとか考えていたりします。
ManifoldCFがその辺りまでやってくれるかまではちゃんと調べてないんですが。
Solrは検索だけに注力させることで、役割を分割できるので、性能の対処とかを行うのが楽になるんじゃないかなぁとか。
ManifoldCFで困ってる人は他にもいるようなので、ジャンジャン使って、どんどんチケット上げて貢献してもらうといいかと。
また、定期的に発表してもらうと面白そうだなぁと。&lt;/p&gt;
&lt;p&gt;弘瀬さんの話は結構興味ある方がいたんじゃないかなと。
SolrCloudは壮大だなぁと思いつつ、手を出しづらいと思ってる方が多いと思います。
実際のサービスに投入して試行錯誤された話を細かな数値も上げて発表してもらえるのは検証をやる方の助けになります。
残念ながら、私もSolrCloudは興味有りつつちゃんと追っかけてないので、途中でnodeとshardとcoreの関係がわからなくなってしまいましたので。。。
もう一度勉強して、スライドを見たいと思います。。。
分散検索（1つのインデックスが複数のcoreやshardに分割された状態）が絡んでくると、複数台の検索の性能のうち、一番遅い性能が最終的な検索性能に響いてくるので、検索リクエストの偏りとかも影響が出たりするかもしれないなぁと。&lt;/p&gt;
&lt;!-- textlint-disable ja-technical-writing/ja-no-successive-word --&gt;
&lt;p&gt;そういった意味でも試行回数を3以上で計測した結果で再度発表してもらうと面白そう！（なんか、下心見え見えですがｗ）&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-successive-word --&gt;
&lt;p&gt;前回、今回も感じたのですが、もう少し質問をしてもらえると発表された方も励みになるかなぁと思いました。
質問しにくい雰囲気になってるのでしょうか？参加者が結構いるから質問しにくく感じたりするのでしょうか？
そのあたりをもう少しうまくやれるようになにかコメントもらえると嬉しいかなぁと。
運営で気になった点などもコメントやツイートをいただけると今後の改善にも役立てますので気兼ねなく連絡いただけると助かります。
開場がドタバタしすぎとか、ハッシュタグがわからなかったとか。&lt;/p&gt;
&lt;p&gt;今回は思ったよりも懇親会に残る方が少なめでした。
コミッターの方（LuceneやManifoldCFとかlucene-gosenとか）が複数いたり、Solrを結構触ってる方がいたりと面白い話が聞けそうだったのですが。。。
Kuromojiのユーザ辞書の改良点をチケットにあげるって約束したのでやらないとなぁ。
早く帰るつもりだったのに気づいたら23時でしたwやっぱり色々と話ができるのが楽しくて。。。
駅前の機動隊とかびっくりしながら帰りました。
今回、お話ができなかった方もいらっしゃるかと思いますが、気兼ねなく、ツイートしてもらったり、声をかけていただければと。&lt;/p&gt;
&lt;p&gt;あと、常に発表していただける方は歓迎しておりますので、連絡いただけると非常に助かります！
こんな話が聞きたいなどでもいいかと思いますので、連絡いただければと。&lt;/p&gt;
&lt;p&gt;#SolrJPも&lt;a href=&#34;http://togetter.com/li/478117&#34;&gt;togetterにまとめてもらいました&lt;/a&gt;。ありがとうございます。
以下は、いつものメモになります。&lt;/p&gt;
&lt;hr&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
日時：2013/03/26 19:00 to 21:00
場所：VOYAGE GROUP 会議室

1. 株式会社 ロンウイット　関口　宏司さん
　　タイトル：Wikipediaからの類義語知識の自動獲得について
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;　&lt;a href=&#34;http://www.slideshare.net/KojiSekiguchi/wikipediasolr&#34;&gt;発表資料はこちら&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　・「辞書型コーパス」という単語は造語かもしれません。
　・なんでこんなことを？
　　→類義語辞書を自動生成したいから。
　・自賠責保険、自動車賠償責任保険を例にSynonymFilterの説明。
　・Wikipediaを入力として、類義語辞書を作成するときにLuceneのインデックスを活用してる。
　・類義語候補の見つけ方
　　いくつかヒューリスティクスな処理とかも入れてます。
　　日本語Wikipedia固有なもの。
　・実際に導出された単語も載ってる。
　　FTPなども導出で来てる。
　　丸ビルとかも。
　・導出できなかったものもあります。
　　「十六進法」が「十進法」になってる
　　「ミスチル」も無理。
　・ミスもあるけど、類義語が存在しない場合になんとなく、使う辞書としては採用できるのでは？
　　類義語検索対象のブーストを小さくするなどをすれば役に立つ

　Q：類似度にしきい値を用意したりしてますか？
　A：min.scoreという値を用意し、足切りをしている。
　Q：ベクトルを作るという話があったが、品詞でフィルタリングとかしてる？
　A：名詞に限って処理してます。名詞に限らなくてもいいかも。。。（若干聴き逃しました）
　　　重みの高いn件をベクトルの対象にしてます。

2. グリー株式会社　尾形　暢俊さん
　　タイトル：GREEにおける全文検索の歴史
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;　&lt;a href=&#34;http://www.slideshare.net/NobutoshiOgata/solr10&#34;&gt;発表資料はこちら&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　・GREEさん、検索はないがしろにされてる。。。
　　一人でつくって、一人でメンテナンスしてる。
　・GREEの検索は右上の検索ボックスが
　・2007年はSennaつかってました。
　　Tritonnに移行。2009年くらいまで。
　　やっぱり安定しない＋MySQLのバージョンアップしたいけど、追従できない
　・2012年初頭までLuceneでやってた。（結構古い）
　　フラグメントが発生してOptimizeすると、検索サーバが使えなくなる。。。
　　検索しにくるサーバが1000台いるので、Optimizeかけるときに、1000台のサーバの設定を書き換えるとかしてた。。。
　・現在まではSolrをつかってる。
　　Luceneのバージョンも古かったので100倍くらい速くなった。
　・Solr本が必須ですよ！！！
　・Lucene+Tomcatから移行。
　　移行に気をつける点として、I/FをそのままSolrに置き換えると。
　　Solr返却のXMLをカスタマイズしたり、クエリをSolr向けに書き換えたり。
　　あと、メンテナンスが楽になるように。
　　40数台のインデックスサーバがあると。
　　一人でメンテナンスしてるから、楽になる方法が重要
　・レプリケーションで、Optimizeの影響が出ないように。
　　キューをつかって、マスタに登録して、スレーブにレプリカを配布
　・スキーマが7つ
　　あんまり使われてなくてかなしい。。。
　・負荷のグラフもありました。
　・RangeQueryを結構使う。
　・作りこんだ部分
　　インデックスのMasterへ分散させる処理とか
　　クエリの変換とか人力監視処理とかNGワードとか
　　サーバ監視のための仕組み
　・今でも大変なこと
　　スキーマ変更が大変
　　スレーブをマスタに昇格とかが手動
　・今後改善したいこと
　　精度を上げたい
　　辞書を使ってみたいけど、各国語対応
　　あと、自動化とか


3. ソフトバンクBB株式会社　野口　勝義さん
　　タイトル：企業内の大規模ファイルサーバ検索事例
　・情シスの企画版？という立場のかた。
　・売上に貢献したいのでクラウドサービスとして検索をオプションとして立ち上げてみた！
　・Solr＋ManifoldCFで作ってみたよと
　・なんでSolr？
　　OSSだし、機能が充実
　・なんでManifoldCF？
　　Active Directory連携が使いたかったと。
　　社内検索ってやっぱりアクセス権がうるさいので。
　・ManifoldCFの説明はロンウイットさんの画像を使わせてもらいましたｗ
　・ファイルサーバが、70TB。。。

　・困ったこと。
　　・その１
　　　・クローラージョブの構成の最適化どうする？
　　　・マルチコアで、クローラーとファイルサーバを1対1の構成にしてみた。
　　・その２
　　　・ファイル数が増えるとまた問題が。。。
　　　・ファイルサイズが大きい→Heapが足りないエラーとか、MCFのタイムアウトとか。。。
　　　　ファイルサイズのリミットを設けてみた。
　　　　mp4とかでエラーがでるとか。既知のエラーでしたとか。
　　　　ulimitがたりないとか。
　　　　MCFの稀に出るバグとか。。。
　　　　ファイルサーバの不良ブロックとか。。。
　　・その３
　　　・クロールに時間がかかる
　　　・MySQLでスロークエリとか
　　　　MySQLよく知らないとか言われながらコミッターに対応してもらうなど。
　　　　SSDつかうとか考え中
　　　・フルクロールで1週間
　　　　差分でも1日強かかる。
　　　　ManifoldCFだけで対応できないから、ファイルの特徴を元に
　　　　→ManifoldCFを経由しないリアルタイムインデックス更新のAPIを経由してMasterじゃなくて、更新かけると。（特定のクライアントからの方法）
　　・その４
　　　・本文データをstored=falseに
　　　　けど、ハイライトできないから、どうにかしたい
　　・ユーザの要望
　　　・もしかして検索
　　　　類義語？じゃないよねぇ。テザリング、tezaringuとか
　　　　フロント側で頑張った。（Solr諦めました）
　　　・検索スコアも弄りたいとか
　　　　外部データでブーストとかもしたい。External Fieldとか使うといいのでは？とか。

4. 株式会社サイバーエージェント　弘瀬　健さん
　　タイトル：SolrCloudの導入事例
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;　&lt;a href=&#34;http://www.slideshare.net/kenhirose547/10solr-solr-cloud&#34;&gt;発表資料はこちら&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　　・Webエンジニアだったのに、検索エンジニアに！
　　・SolrCloudもサービスインしてると。
　　・SolrCloud概要
　　　4.0以降の機能とか。
　　・SolrCloudの構成要素
　　　概念的なもの。Collection、Shard
　　　物理的なもの。Node、Core
　　・ Simplogってサービスに導入済み。
　　　ZooKeeperが3台、6Shard、3nodeという形式
　　・性能
　　　平均レスポンスタイム50msec
　　　　思ったより出てないので、調べてみた。node数とかshard数を変えてみて調べてみた（まだ、模索中。）
　　・色々テストケース試したけど、試行回数が1回だけです。
　　　詳細なデータが出てるのありがたい（全部はまだ理解できてないですｗ）
　　・検証まとめ
　　　ノード当たりのcore数が少ないほうが検索、更新性能がいい
　　　1コレクション当たりのshard数が少ないほうが検索性能がいい
　　・まとめ
　　　・SolrCloudの利点
　　　　クライアントが色々意識しなくていいのがうれしい。
　　　・SolrCloudの注意点
　　　　shardの分割機能がまだないので、大変。
　　　　コレクション情報が壊れると検索更新できないとか。4.0だとバグが有った
　　　・性能的には素のSolrのほうがいいよと。
&lt;/code&gt;&lt;/pre&gt;</content:encoded>
    </item>
    
    <item>
      <title>elasticsearch-analysis-kuromojiでユーザ辞書の利用方法(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2013/03/20/elasticsearch-analysis-kuromoji%E3%81%A7%E3%83%A6%E3%83%BC%E3%82%B6%E8%BE%9E%E6%9B%B8%E3%81%AE%E5%88%A9%E7%94%A8%E6%96%B9%E6%B3%95/</link>
      <pubDate>Wed, 20 Mar 2013 16:43:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/03/20/elasticsearch-analysis-kuromoji%E3%81%A7%E3%83%A6%E3%83%BC%E3%82%B6%E8%BE%9E%E6%9B%B8%E3%81%AE%E5%88%A9%E7%94%A8%E6%96%B9%E6%B3%95/</guid>
      <description>&lt;p&gt;なんか、とても久しぶりにイベント参加メモ以外の投稿です。
elastic searchのMLを見てたら、KuromojiのAnalyzerを使うときにユーザ辞書使うのどうするの？という&lt;a href=&#34;https://groups.google.com/forum/?fromgroups=#!topic/elasticsearch/7oGNCM7QH4s&#34;&gt;投稿&lt;/a&gt;を見かけました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;なんか、とても久しぶりにイベント参加メモ以外の投稿です。
elastic searchのMLを見てたら、KuromojiのAnalyzerを使うときにユーザ辞書使うのどうするの？という&lt;a href=&#34;https://groups.google.com/forum/?fromgroups=#!topic/elasticsearch/7oGNCM7QH4s&#34;&gt;投稿&lt;/a&gt;を見かけました。&lt;/p&gt;
&lt;p&gt;Kuromojiのユーザ辞書にもちょうど興味があったり、elasticsearchもちょっとずつ触りたかったのでちょっと試してみました。（返信もしてみましたが、テキトーな英語です。。。）&lt;/p&gt;
&lt;p&gt;elasticsearch-kuromoji-pluginのインストールなどは&lt;a href=&#34;http://qiita.com/items/134b049a59fe396c9475&#34;&gt;ElasticSearch で kuromoji を使う (ES 0.90.Beta1 + kuromoji 1.2.0篇)&lt;/a&gt;を参考にしてください。
私もこちらに記述のある組み合わせ（elasticsearch-0.90.0Beta1 + elasticsearch-analysis-kuromoji/1.2.0）を利用しました。
KuromojiのAnalyzerはデフォルトで「kuromoji」として登録済みですが、こちらはユーザ辞書の指定がありません。
ということで、「kuromoji_user_dict」というユーザ辞書指定をしたtokenizerと、それと使う「my_analyzer」というanalyzerを登録したIndexを作成します。
定義する前に、「userdict_ja.txt」を用意して、elasticsearch-0.90.0Beta1/config/ディレクトリに配置しておきます。
（以下のサンプルでは、SOLE_HOME/example/solr/collection1/conf/lang/userdict_ja.txtをコピーして使いました）&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
$ curl -XPUT &amp;#39;http://localhost:9200/kuromoji_sample/&amp;#39; -d&amp;#39;
{
    &amp;#34;index&amp;#34;:{
        &amp;#34;analysis&amp;#34;:{
            &amp;#34;tokenizer&amp;#34; : {
                &amp;#34;kuromoji_user_dict&amp;#34; : {
                   &amp;#34;type&amp;#34;:&amp;#34;kuromoji_tokenizer&amp;#34;,
                   &amp;#34;user_dictionary&amp;#34;:&amp;#34;userdict_ja.txt&amp;#34;
                }
            },
            &amp;#34;analyzer&amp;#34; : {
                &amp;#34;my_analyzer&amp;#34; : {
                    &amp;#34;type&amp;#34; : &amp;#34;custom&amp;#34;,
                    &amp;#34;tokenizer&amp;#34; : &amp;#34;kuromoji_user_dict&amp;#34;
                }
            }
            
        }
    }
}
&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;「user_dictionary」というのがユーザ辞書の定義ファイルになります。
注意点としては、6行目で指定した名前「kuromoji_user_dict」を14行目の「tokenizer」に指定しないとちゃんと動かないという点でしょうか。&lt;/p&gt;
&lt;p&gt;上記で指定したAnalyzerを利用して「朝青龍」という単語を解析してみます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
$ curl -XGET &amp;#39;http://localhost:9200/kuromoji_sample/_analyze?analyzer=my_analyzer&amp;amp;pretty&amp;#39; -d &amp;#39;朝青龍&amp;#39;
{
 &amp;#34;tokens&amp;#34; : [ {
   &amp;#34;token&amp;#34; : &amp;#34;朝青龍&amp;#34;,
   &amp;#34;start_offset&amp;#34; : 0,
   &amp;#34;end_offset&amp;#34; : 3,
   &amp;#34;type&amp;#34; : &amp;#34;word&amp;#34;,
   &amp;#34;position&amp;#34; : 1
 } ]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;「朝青龍」という単語がユーザ辞書に登録されているので、1単語として出力されます。
ちなみに、デフォルトの「kuromoji」のanalyzerを指定すると以下の様な出力です。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
$ curl -XGET &amp;#39;http://localhost:9200/kuromoji_sample/_analyze?analyzer=kuromoji&amp;amp;pretty&amp;#39; -d &amp;#39;朝青龍&amp;#39;
{
 &amp;#34;tokens&amp;#34; : [ {
   &amp;#34;token&amp;#34; : &amp;#34;朝&amp;#34;,
   &amp;#34;start_offset&amp;#34; : 0,
   &amp;#34;end_offset&amp;#34; : 1,
   &amp;#34;type&amp;#34; : &amp;#34;word&amp;#34;,
   &amp;#34;position&amp;#34; : 1
 }, {
   &amp;#34;token&amp;#34; : &amp;#34;青龍&amp;#34;,
   &amp;#34;start_offset&amp;#34; : 1,
   &amp;#34;end_offset&amp;#34; : 3,
   &amp;#34;type&amp;#34; : &amp;#34;word&amp;#34;,
   &amp;#34;position&amp;#34; : 2
 } ]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;とまぁ、こんなかんじです。
ユーザ辞書を書き換えたあとは「close/open」しないと読み込めないのかなぁ？そのへんはまたあとで調べようかな。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;ちなみ、以下のページを参考にさせてもらいました。
&lt;a href=&#34;http://www.hirotakaster.com/archives/2012/11/elasticsearch-kuromoji-plugin.php&#34;&gt;elasticsearch kuromoji plugin - natural days&lt;/a&gt;
&lt;a href=&#34;http://qiita.com/items/134b049a59fe396c9475&#34;&gt;ElasticSearch で kuromoji を使う (ES 0.90.Beta1 + kuromoji 1.2.0篇)&lt;/a&gt;&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>エンジニアのためのスキルアップ勉強会『Tech Compass』＠竹橋 ― Vol1 「スマホ時代到来、この先生きのこるエンジニアとは！？」に参加しました。#tecomp(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2013/03/19/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B9%E3%82%AD%E3%83%AB%E3%82%A2%E3%83%83%E3%83%97%E5%8B%89%E5%BC%B7%E4%BC%9Atech-compass%E7%AB%B9%E6%A9%8B--vol1-%E3%82%B9%E3%83%9E%E3%83%9B%E6%99%82%E4%BB%A3%E5%88%B0%E6%9D%A5%E3%81%93%E3%81%AE%E5%85%88%E7%94%9F%E3%81%8D%E3%81%AE%E3%81%93%E3%82%8B%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E3%81%AF%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-tecomp/</link>
      <pubDate>Tue, 19 Mar 2013 20:28:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/03/19/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B9%E3%82%AD%E3%83%AB%E3%82%A2%E3%83%83%E3%83%97%E5%8B%89%E5%BC%B7%E4%BC%9Atech-compass%E7%AB%B9%E6%A9%8B--vol1-%E3%82%B9%E3%83%9E%E3%83%9B%E6%99%82%E4%BB%A3%E5%88%B0%E6%9D%A5%E3%81%93%E3%81%AE%E5%85%88%E7%94%9F%E3%81%8D%E3%81%AE%E3%81%93%E3%82%8B%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E3%81%AF%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-tecomp/</guid>
      <description>&lt;p&gt;久々にブログ＋イベント参加です。
知り合いが開催＋出演したので参加してみました。
「スマホ」ってキーワードはあまりなかったけど、面白かったです。&lt;/p&gt;
&lt;p&gt;とりあえず、メモ。
余力があれば感想追加します。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;久々にブログ＋イベント参加です。
知り合いが開催＋出演したので参加してみました。
「スマホ」ってキーワードはあまりなかったけど、面白かったです。&lt;/p&gt;
&lt;p&gt;とりあえず、メモ。
余力があれば感想追加します。&lt;/p&gt;
&lt;hr&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;

日時：2013/03/19 19:00
場所：パレスサイドビル9F マイナビルーム （東京都千代田区一ツ橋1-1-1）
URL：http://atnd.org/events/36966

登壇者：@naoya_ito @yusuke

◯@naoya_itoさんの発表
　最近、感心してること。
　・RubyMotionやってます。
　　今年5月に
　・AWSもやってるよ。
　・「継続的デリバリー」の話
　　GREEでは毎日デリバリーしてるよと。
　・Chefの話
　　DevOpsとか。
　・Obama for Americaの話
　　GitHubとか使ってた。
　身に付けるべきものは？
　　「変化に適応する力」が必要だよね。
　最近は
　　Ruby、クラウド、AWS、iOS開発とかやってる、どうしてこうなったｗ
　　先は予測してないけど、変化に適応するには5分でいいからやり続けること。

◯@yusukeさんの発表
　自己紹介が難しい
　・今やってること
　　ブログ執筆
　　刺さるツイート研究
　　ソフトウェア販売代理店
　　　思わぬ収穫。InDesign/Illustratorのスキル、ビジネスの仕方ｗ
　　　会社設立中。
　　Webサイト構築・運用
　・ハッタリが大事
　・プログラム好き
　　プログラミング以外を仕事にしてる。
　・人と違うことがしたい。市場がない場所での差別化はしない＝トレンドに逆行し過ぎない。バランス。
　・今は種まき中。

◯ディスカッション
　・2,3年後とか何やってると思いますか？
　　@naoya_itoさん
　　　ドラクエやってると思ってるかもしれませんが、サービス作るコード書いてます。
　　　将来的な見通しでやってるのか？って言われるとそうでもない。
　　　ツールとかよりは、コミュニティとかのサービスを作るほうが好き。
　　@yusuke
　　　一定の収入がありつつ、プログラミングしてたい。あわよくばサービス作ったのが当たるといいなぁ
　・そもそもフリーランスをどう捉えているか？
　　@naoya_ito
　　　いいところ。自由に自分の時間をコントロールできる。
　　　悪いところ。自分でコントロールしないといけない。
　　　自分をコントロールしないと厳しい。
　　　フリーになってわかったのは、会社は人間を働かせるための仕組みをよく考えて出来てる。
　　　フリーでいいのは、選択した結果に自分が責任を持つというのがいい。
　　@yusuke
　　　セフルマネージメントできたほうがいい。
　　　しがらみを捨てるためにフリーになるのはおすすめしない。
　・情報発信を継続してるけど、必要なことか？
　　@naoya_ito
　　　必要とは思わないけど、みんな書いたらいいと思う。
　　　検索すれば自分が助かるからｗ
　　　セルフブランディングのために重要？かなぁ。あまりそれが唯一の方法ではないと思う。
　　@yusuke
　　　発信することで、何に興味を持ってるかをわかってもらえるから、便利かな。
　　　ブログに残したほうがググって引っかかるよと。
　・技術の方向性？見つけ方？は？
　　@naoya_ito
　　　直近は、クラウド流行るしiOSはまだ伸びてるしと。
　　　そっから先はどうするの？
　　　わからないよね。じゃあ、どうするの？って変化に対応してボトムアップで見つけてくのがいいんじゃないかなぁ。
　　　人がやってないところを先にやらないと武器にならないけど、どうやって見つけるのか？
　　　プログラミングやってる時に、その先に必要なこととか、気付きがあるので、手を動かさないとだめだよねと。
　　@yusuke
　　　トレンドを追いかけつつ、知ったかぶりするのは重要
　　　ある程度ハッタリ＋手を動かす
&lt;/code&gt;&lt;/pre&gt;</content:encoded>
    </item>
    
    <item>
      <title>Xperia Z買いました(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2013/02/13/xperia-z%E8%B2%B7%E3%81%84%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Wed, 13 Feb 2013 01:53:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/02/13/xperia-z%E8%B2%B7%E3%81%84%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;技術ブログから離れていってますが。。。
Xperia Zを購入しました。&lt;/p&gt;
&lt;p&gt;前に使っていたのはXperia arcになります。
もうすぐ２年だったのですが、容量不足に悩まされていたため＋芸の肥やし（仕事の足し）という名目で
Xperia Zの購入に踏み切りました。
予約しての購入です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;技術ブログから離れていってますが。。。
Xperia Zを購入しました。&lt;/p&gt;
&lt;p&gt;前に使っていたのはXperia arcになります。
もうすぐ２年だったのですが、容量不足に悩まされていたため＋芸の肥やし（仕事の足し）という名目で
Xperia Zの購入に踏み切りました。
予約しての購入です。&lt;/p&gt;
&lt;p&gt;いくつか戸惑いなどを感じているので備忘録としてブログに残しておきます。
&lt;strong&gt;サイズが大きい&lt;/strong&gt;___
まぁ、わかっていたことですが、5インチと大きいです。
ステータスバーを表示するのがちょっときついくらいです。
私は手が大きい方なのですがそれでもキツイので、普通の人は両手じゃないと厳しいんじゃないかと。。。
一応、ステータスバーを表示するためのアプリなんかもあるようなので、その辺を検討するのもいいかなぁと（まだインストールもしてませんが。）
また、Angry Birdを演ってびっくりしたのですが、解像度が大きいため、startボタンなどが小さくて押しづらいですｗ&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;移行がめんどくさい&lt;/strong&gt;___
iPadも持っていて、ソレと比較するとひどくめんどくさかったです。
実は方法を知らないだけかもしれないんですが。。。
iPadだと、初期化したりしてもiTunesにインストールしたアプリなども覚えていてくれます。
ですので、すぐに同じ環境が出来上がります。
Xperiaに関しては、arcでインストールしてたアプリをインストール履歴を元に一つずつインストールして、
それぞれのアプリやアカウントを設定して行きました。
これが結構面倒で、まだ完全にはアプリがインストールできてないかも（他にも新しいものを入れたいなぁと思いつつ、探す手間を惜しんでます。。。おすすめアプリお待ちしてます。）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Zite、Angry Bird star warsがインストールできない&lt;/strong&gt;___
Ziteは英語の勉強も兼ねて入れていたのですが、対応していないバージョンですと言われます。
AngryBirdもいっしょですね。
starwarsじゃない奴はインストールできたのですが、肝心のやってみたいstar warsがインストールできなくて。。。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ドコモアプリがいっぱい&lt;/strong&gt;___
ドコモのアプリやプリインストールアプリがいっぱいあったので、どうしようか悩んでいます。
いくつかはアンインストールしました。HotpepperBeautyとか間違いなく使わないし
SFA-QRというよくわからないアプリも入っていたのでこれまたアンインストールしました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;通知に出さないアプリとか選択できない？&lt;/strong&gt;___
容量不足だったのも有り、TwitterクライアントにはTwiccaのみをインストールしていたのですが、今回はTwitter純正のクライアントもインストールしました。
お気に入り登録されたりといった状況も見れるので重宝するのですが、基本的にはtwiccaを使うつもりです。
ですが、通知バー（ステータスバー）に@ツイートが届いたなどといった通知は見なくてもいいと思っているんですが、なにか方法あるんでしょうか。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;dビデオが危険&lt;/strong&gt;___
いわゆる携帯ショップで機種変更したため、いくつかのサービスに登録しないといけませんでした。
で、dビデオ（月額525円で映画とか見放題）に登録したので、せっかくだからと映画をダウンロードしてみたのですが、危険です。。。&lt;/p&gt;
&lt;!-- textlint-disable ja-technical-writing/ja-no-successive-word --&gt;
&lt;p&gt;ただでさえ、本読むのが遅かったり、コーディングしてないのにビデオ見ると更に時間ががが。。。&lt;/p&gt;
&lt;!-- textlint-enable ja-technical-writing/ja-no-successive-word --&gt;
&lt;p&gt;けど、面白くて。。。危険です。（スターシップ・トゥルーパーズ見ちゃいました。。）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;クレードルがもう一つほしい&lt;/strong&gt;___
防水なので、あまりキャップを開けたくないんです。
そして、dビデオとか見てるとやっぱり電池の減りがはやいんです。（ディスプレイが大きいのもあるのかなぁ。要らないサービス切るとかしないと）
結局、出先でも充電をしないといけなくて。
ただ、純正のクレードルが2100円と結構な値段でして。。。
あと、イヤホンを指すところもキャップがあるので、Bluetoothレシーバーも気になってたりします。
こちらも結構な値段でして。。。&lt;/p&gt;
&lt;p&gt;とまぁ、新しいものを手に入れて、色々悩んでますが、楽しいですね。購入したての色々と悩む時間がｗ
おすすめアプリとかあったらコメントください&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Hadoop Conference Japan 2013 Winterに参加しました。#hcj13w(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2013/01/22/hadoop-conference-japan-2013-winter%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-hcj13w/</link>
      <pubDate>Tue, 22 Jan 2013 00:50:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/01/22/hadoop-conference-japan-2013-winter%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-hcj13w/</guid>
      <description>&lt;p&gt;金曜日に引き続き、イベントに参加して来ました。（仕事。。。これも仕事だよ。）&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://hcj2013w.eventbrite.com&#34;&gt;「Hadoop Conference Japan 2013 Winter」&lt;/a&gt;です。
普段、Hadoopを触るのも少ないのですが情報を仕入れときたいなぁということで。


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130122/20130122_44963.jpg&#34; alt=&#34;ビッグサイト&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130122/20130122_44963.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

今年はビッグサイトですよ。そろそろ無料のカンファレンスもキツイのではないでしょうか。。。
こちらの写真はセッション会場。今回もすごいです。。。


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130122/20130122_44958.jpg&#34; alt=&#34;壇上。相変わらずすごい演出&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130122/20130122_44958.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;金曜日に引き続き、イベントに参加して来ました。（仕事。。。これも仕事だよ。）&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://hcj2013w.eventbrite.com&#34;&gt;「Hadoop Conference Japan 2013 Winter」&lt;/a&gt;です。
普段、Hadoopを触るのも少ないのですが情報を仕入れときたいなぁということで。


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130122/20130122_44963.jpg&#34; alt=&#34;ビッグサイト&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130122/20130122_44963.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

今年はビッグサイトですよ。そろそろ無料のカンファレンスもキツイのではないでしょうか。。。
こちらの写真はセッション会場。今回もすごいです。。。


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130122/20130122_44958.jpg&#34; alt=&#34;壇上。相変わらずすごい演出&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130122/20130122_44958.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;簡単ですが、聞いていた感想です。
全体的に、Hadoop本体の話ではなく、エコシステムと呼ばれる周辺のプロダクトの話や実際に運用している実例が増えていました。
だいぶ普及期に来たのかなぁと。そして、自分の不勉強を実感できたなぁと。
（あと、TreasureDataに絡む話が多いなぁと言うのも印象です。そういうセッションを選んで出ていたのかもしれませんが）
懇親会まで残っていたのですが、結構、すごい方たちの顔ぶれだなぁというのを今更ながらに実感するとか。
（ハチ象Tシャツを着ているすごい集団でもありましたが。。。）&lt;/p&gt;
&lt;p&gt;以下はいつものメモになります。だいぶ金曜日のイベント後で腑抜けてるのでメモが雑ですが。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
◯ご挨拶
　Doug Cuttingさんのビデオ（あんまり聞けてない）　さすがのhamakenさんのトークの安定感。
　後援はリクルートテクノロジーズさんが大半。
　リクルートテクノロジーズの米谷さんが軽く発表

◯LINEのHBaseを利用した大規模なメッセージストレージ：NHN Japan 中村 俊介
　まずは、LINEの紹介が続く。
　New Yearのメッセージは3倍位だったけど、何とかなっったよと。
　データロスがない。
　サーバ故障からのデータリカバリも自動でやってくれる
　書き込み1ms、読み出し1-10msでできてる
　・IDC onine migration
　　クライアントベースで2つに書き込み
　　Incremental replication（新データ）、BulkMigration（旧データ）
　　元のHBaseのレプリケータは利用してない（pushだったから。スループットコントロールしたかったから）

　・NN failover
　　2012.10にNameNode障害発生
　　HA構成にしてたから問題が発生。
　　VIPはHDFSにつかうとリスキー
　　現在：
　　　少ないダウンタイムを許容する

　・Stabilizing LINE message cluster
　　※あとでHBase触るときに資料見直すくらいで。。。
　　Case1：Too many HLogs
　　Case2：Hotspot問題
　　まぁ、けど1億ユーザのインフラとして使えるってすごいよな。。。　　

◯Hadoop meets Cloud with Multi-tenancy： Treasure Data 太田 一樹
　TDもFluentdも有名だなぁ
　Hadoopのメンテナンスとか、つらいよねというのを見てきたのでTD作った
　・なぜ、BigData+Cloud？
　　Hadoopだけみてもバージョンが混在してる＋ディストリビューターも多くなってる
　　十徳ナイフみたいになってきてるけど、必要なのはナタだよね。というのを提示するためにTD立ち上げた。
　・なぜCloud？
　　・IaaSベンダーの対象としてるのはSCM。
　　　オンプレだとHWが陳腐化してくよね→HWはクラウドが主流に
　　・PaaS、SaaSの対象は時は金なり
　　　バージョンアップとか大変だよねと
　・TDのご紹介
　　唯一の解析用DBを目指して
　・哲学とアーキテクチャ
　　解析とか運用をいかに楽にしていくかというのを主体においたサービスを提供したい？
　　いかに速くレポーティングシステムを簡単に構築していくかとかの話
　　簡単なインタフェースと目的に集中することで、価値を提供
　・AWSとの違いは？
　・アーキテクチャとか技術的な話
　　データを集める処理がデータ解析に実際には重要なフェーズ
　・カラム指向でデータ保存
　　実装がどーなってるのかとか、TD内部のHadoopクラスタの運用、バージョンアップとかがどうなってるのかもきになる。（企業秘密だろうけど）

◯Amazon Elasti MapReduceとHadoopコミュニティの関わり：Amazon Web Services Peter Sirota
　・３つのV
　　Volume、Velocity、Variety
　・yelpのAuto-suggestの例
　　カスタマーのレコメンデーションにElasticMapReduce使ってるよと。
　・razorfishの広告インプレッションの解析に使ってる
　・Amazon.comでの話
　　AWS Public Datasetsの話
　　http://aws.amazon.com/jp/publicdatasets/
　　IonFluxのDNA解析の話
　・いろんな分野でのBig Data
　　事例がちらほら
　※わかりやすい英語なんだけど寝不足が。。。

◯ランチ！
　サンドイッチと豚汁とあとなんとかライス。
　TDブースにて、fluentdのTシャツもらったよ！

◯Hadoop&amp;#39;s Power to Transform Business：MapR　Ted Dunning
　・Mahaut＋Solrの単語が。8時間のレコメンデーションデータの作成が3分に？？
　・Stormにてリアルタイム処理と連携。バッチ処理はMRで。
　・バッチ処理とリアルタイム処理の間としてのDrill
　・Drillの概観とできるところの話。
　　（あとでスライドで）データ解析のために機会学習の処理とかも投げられそう。
　　Q：ImplaraとDrillの違いは？
　　　コミュニティベースかなどが違うよね（あまり聞き取れず）
　　Q：Drillの開発はどのくらいすすんでるの？
　　A：。。。
　　Q.クエリ言語としてSQLがいいの？
　　A.No。というのも、単独の言語ですべてにベストというのはないから。SQLはわかりやすくて良いが、実行が非効率な場面も。

◯Introduction to Impala～Hadoop用のSQLエンジン～：Cloudera　川崎 達夫
　・Impalaとは
　　分析に特化した低レイテンシクエリ実行基盤
　　Apacheライセンス
　　バッチ処理要ではなく、データサイエンティストが試行錯誤するときに利用するのを想定
　　パフォーマンスが良い
　　　実行エンジンはC＋＋とかで実装されてる
　　　MapReduceに依存してない
　・MapReduceの問題点
　　MR直接は難しい→Hiveとか、M/Rの実装を隠して使いやすくするものが増えてきた
　　Hiveを例に説明。MRがベースなので高レイテンシ
    ・Impalaのアーキテクチャ
       機能制限やGA版について言及されてる資料なのが良い
    ・GA以降の話もあり
        ピンチヒッターなのに落ち着いて発表とか凄すぎです。
     jdbcサポートも入ると。
     プランナーはjava実装
     Hiveとの互換性は？→完全互換を目指す。
     開発のプロセスが見えにくいのでは？開発主体がcloudera

 ◯Flumeを活用したAmebaにおける大規模ログ収集システム：CyberAgent　飯島 賢志
　立ち見。
　Flumeのコミッターの人がCAにいたんだ。

◯Log analysis system with Hadoop in livedoor 2013 Winter：NHN Japan　田籠さん@tagomorisさん
　・NHNJapanのお話
　・Webサービスのログ解析について話していく
　　400+Webサービス
　・2011年8月にLTしました。
　・1.5TB/day。。。
　・batchとstream
　　Batch集計も重要だし、Stream処理も重要なので、ハイブリッドシステム
　・システムーバービュー
　　FluentdClusterを中心にして各種ツール、保存先に転送してる。
　　これが結構重要。だけど、今日はFluentdの話ではない
　・Fluentd周りを一人でやってるのか。。。
　・処理の流れ
　　・ログの収集と、生ログ保存
　　・パース（主にHive用に）、変換、フラグ追加（分類しておくとあとで集計したいとか、保存すべきかを処理可能に）
　　・Hiveにロード
　・第1世代のはなし
　　すべてbatch処理、Scribe
　　遅延が1時間ちょっとあるため、Hiveクエリで結果が見れないとか。
　・第2世代の話
　　Fluentdのstream処理にHadoop Streamingを呼び出せるようなプラグインを書いた
　　Fluentd＋HoopServerの構成
　・第3世代
　　HoopをWebHDFS
　　Fluentdでのオンライン集計
　　GrowthForcast、HRForcast
　・第4世代（ここ1週間でやったこと）
　　CDH4でQJMベースのNameNode（Failoverは手動）
　　Hiveのスキーマを変更（これはブログに今度書くよ）
　　とりあえず、現時点で改善点が思いつかない
　・総括
　　HTTPベースでRPCベースにしたのでコンポーネント切り替えが結構楽
　　OSSで公開されてるからいいよね
　　公開することにより色々とドライブするよ！

◯いかにしてHadoopにデータを集めるか：Treasure Data　古橋 貞之
　・自己紹介
　・ビッグデータ収集の問題点
　　・壊れたデータが入ってる
　　・読み書きの時間がかかる
　　　ログはサブケースである。メインはサービスとかだから。
　・トライ＆エラー処理が時間かかる
　・データを分割するのが基本的なアイデア
　　失敗した時のリトライが楽になる。さらに、それをStream処理すれば良いよねと。
    ・flumeのお話
    ・fluentdのお話
       バッファリングは性能アップも兼ねてる
       設定のクラスタへの伝搬とかインストールはpuppetとか使おうねと。
       プラグインのインストールが楽
    ・いくつかのプラグインの紹介
    ・TDへのデータ投入のお話
    ・最後にmuddydixonさんのプラグインの宣伝がw

◯Hadoopの次に考える分散システム技術：Microsoft　萩原 正義
    ・CAP定理の克服をどうしていくか
    ・CAPのおさらい
    ・Lease
       クライアント主導、サーバ手動とか
　　（理論重視の話で最後のセッションには辛かった。。。頭が疲れててついていけませんでした）
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;p&gt;おまけ
今回頂いたノベルティなどを写真に撮ってみました。（ランチはお腹すいてて写真取らずに食べちゃいました。。。）


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130122/20130122_44962.jpg&#34; alt=&#34;ノベルティ色々&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130122/20130122_44962.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

Hiveロゴへの愛を語ってHive Tシャツをゲット。
FluentdのTシャツももらいました！
Hiveステッカーなどもゲット


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130122/20130122_44964.jpg&#34; alt=&#34;メッセージボード&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130122/20130122_44964.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

あと、メッセージボードなるものがあったので書いてみました。一応、Hadoopに絡んだことですよね！？&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>エンジニアサポートCROSS 2013に参加（＋お手伝い＋モデレータ）しました #cross2013(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2013/01/19/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88cross-2013%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%8A%E6%89%8B%E4%BC%9D%E3%81%84%E3%83%A2%E3%83%87%E3%83%AC%E3%83%BC%E3%82%BF%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F--cross2013/</link>
      <pubDate>Sat, 19 Jan 2013 22:09:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/01/19/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88cross-2013%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%8A%E6%89%8B%E4%BC%9D%E3%81%84%E3%83%A2%E3%83%87%E3%83%AC%E3%83%BC%E3%82%BF%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F--cross2013/</guid>
      <description>&lt;p&gt;1/18（金）に開催された、エンジニアサポートCROSS 2013で「&lt;a href=&#34;http://www.cross-party.com/programs/?p=366&#34;&gt;検索CROSS&lt;/a&gt;」セッションのセッションオーナー（モデレータ）をやって来ました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://twitter.com/muddydixon/&#34;&gt;@muddydixon&lt;/a&gt;さんに昨年の夏くらいに声をかけていただいたのがきっかけです。
こういったイベントの運営のお手伝い（ほとんど何もしてない）も初めてでしたし、セッションオーナー（モデレータ）も初めての経験で色々といい勉強をさせて頂きました（自分の足りない所とか、考慮すべき点がどういったところにあるとか）。本当にありがとうございます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;1/18（金）に開催された、エンジニアサポートCROSS 2013で「&lt;a href=&#34;http://www.cross-party.com/programs/?p=366&#34;&gt;検索CROSS&lt;/a&gt;」セッションのセッションオーナー（モデレータ）をやって来ました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://twitter.com/muddydixon/&#34;&gt;@muddydixon&lt;/a&gt;さんに昨年の夏くらいに声をかけていただいたのがきっかけです。
こういったイベントの運営のお手伝い（ほとんど何もしてない）も初めてでしたし、セッションオーナー（モデレータ）も初めての経験で色々といい勉強をさせて頂きました（自分の足りない所とか、考慮すべき点がどういったところにあるとか）。本当にありがとうございます。&lt;/p&gt;
&lt;p&gt;スピーカーとして登壇していただいた久保田さん、佐藤さん、安田さんほんとうにありがとうございました。
頼りないオーナーで、モヤッとした内容を提示したにもかかわらず、意図を汲み取って話の内容をふくらませていただいてすごく助かりました。
また、会場にお越しいただいたみなさん、ありがとうございました。すこしでも検索に興味をもっていただければ、セッションは成功だったと思っています。
朝一だったのと、私の認知度の低さもあったのとで残念ながら満席とはいきませんでしたが。。。&lt;/p&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://www.cross-party.com/programs/?p=369&#34;&gt;企業CROSS DeNA x グリー x Aiming： 大企業・ベンチャーが語る「スクラム」開発 (仮)&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Googleの及川さん見たさで参加しました。
スクラム自体は名前くらいは聞いたことある程度だったのですが、その程度の私でもわかりやすいディスカッションで楽しかったです。
聞いていて感じたのは、次のようなこと。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「スクラム」という開発手法の話しなんだけど目的はそこじゃなくて、どうやってうまくプロジェクトを回して（ドライブして）、目的（サービスを作るとか顧客の要望を叶えるとか）を達成するかというのが重要だなぁと。&lt;/li&gt;
&lt;li&gt;「スクラムマスター」の仕事は子育てに似てる&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;p&gt;####&lt;a href=&#34;http://www.cross-party.com/programs/?p=134&#34;&gt;データ理解を助けるビジュアライゼーション&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;昨年からビジュアライゼーションには興味だけ（実践とかできてない）は持っていたので、参加しました。
スピーカーの方々の対立軸がはっきりしていたのが面白かったかと。
聞いていて感じたのは、次のようなこと&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ビジネスの視点からのビジュアライゼーションはコスパがどうなのかというのがまだ不明&lt;/li&gt;
&lt;li&gt;可視化できたらおしまいじゃなくて、お金につながる可視化に心がけるのが重要そう&lt;/li&gt;
&lt;li&gt;可視化して楽しむのも有りだとは思うけど、それは趣味だったり芸術の話かもなぁ&lt;/li&gt;
&lt;li&gt;異なるコンテキストの人にでも誤解を与えない可視化というのが重要&lt;/li&gt;
&lt;li&gt;何をどう可視化するかというのが実は統計学知ってると必要ないこともある&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;基本的にはCAの方の内容が一番しっくり来ました。やっぱりビジネス的な視点と学術的な視点は違うのかもなぁと。&lt;/p&gt;
&lt;p&gt;####&lt;a href=&#34;http://www.cross-party.com/programs/?p=140&#34;&gt;継続的システム運用のゲンバのハナシ&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;面白かったです。のっけから燃料がテーブルにならんでるしｗ
運用とかインフラはそこまで詳しくないのですが、少しは作業したりするので気になってましたが、ぶっ飛んだ話が聞けて楽しめました。
聞いていて感じたのは、次のようなこと&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;サービス内容によっては夜中にアクセス数が低いものもある（cookpadは夜中はアクセス数が低い）&lt;/li&gt;
&lt;li&gt;アプリを修正することでインフラを楽にするという考えもある&lt;/li&gt;
&lt;li&gt;インフラエンジニアは実はリア充&lt;/li&gt;
&lt;li&gt;cookpad面白い人多いw&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このあとは、おまちかねのプレモルタイムだったので、プレモル片手（失礼だろｗ）にTech10の池本さんに挨拶してきました。（Solr本のときはお世話になりました！）
あとは、RedBull片手に知り合いの方々（Twitter上のみやいつもお世話になってる人）に挨拶をして回ってました。（プレモルも美味しかったのですが、プレモルおつまみも美味しかったです！）
また、ちょっとつかれて座るために入った「&lt;a href=&#34;http://www.cross-party.com/programs/?p=131&#34;&gt;体系的に学ぶ安全な利用規約の作り方&lt;/a&gt;」でも、面白い話を聞けました。
（利用規約をきちんと考えて変更している企業のほうが炎上をしてしまうとか無駄だしおかしいよねとか）&lt;/p&gt;
&lt;p&gt;イベント終了まで、会場にいて（いただけで大した手伝いしてないです、すみません。）その後打ち上げに向かって楽しみました。&lt;/p&gt;
&lt;p&gt;####さいごは、イベント通じて感じたことと気になったこと。（若干、意図的なものが入り込んでますが。。。）&lt;/p&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;題材にもなってる「CROSS」ですが、ここ数年特に、エンジニアとして複数の技術や考えなどを身につけないといけないなぁと&lt;/li&gt;
&lt;li&gt;有名人に会える！（ミーハーです。。。）&lt;/li&gt;
&lt;li&gt;プレモル美味しい！（いつも飲んでるビールが「え？」って思った）&lt;/li&gt;
&lt;li&gt;ケンタッキー美味しい！&lt;/li&gt;
&lt;li&gt;RedBull美味しい！&lt;/li&gt;
&lt;li&gt;いろんな技術分野に触れられる機会ができそう&lt;/li&gt;
&lt;li&gt;Wi-fiは用意してもらえると助かる。（参加者の方々が一斉にLTEとかでつなごうとするのでみんなが繋がらなくなってツイートされないとかちょっとつらいかも）&lt;/li&gt;
&lt;li&gt;各会場が覗けるようになってたのは良かった（ただ、会場の後ろの人はざわつきを感じるためスピーカーの声が聴こえないことも）&lt;/li&gt;
&lt;li&gt;スクリーンはもう少し高い位置にあると良かった（後ろに座ると下のほうが見えないことも）&lt;/li&gt;
&lt;li&gt;飲食の配布は会場内でできたほうが良かったのかも（NGなのかな？）。プレモルやRedBullは配ってくれたので良かったのだが、食べ物を取りに行くために入口付近が混雑してた気がした。&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;hr&gt;
&lt;p&gt;おまけ&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;

&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130119/20130120_42001.jpg&#34; alt=&#34;プレモル！&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130119/20130120_42001.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

プレモル！


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130119/20130120_42002.jpg&#34; alt=&#34;Amebaウォーター&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130119/20130120_42002.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

Amebaウォーター


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130119/20130120_42000.jpg&#34; alt=&#34;プレモル＋RedBull＋プレモルおつまみ&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130119/20130120_42000.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

プレモル＋プレモルおつまみ＋RedBull


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20130119/20130120_42021.jpg&#34; alt=&#34;もらったスタッフTシャツとプレモル！&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20130119/20130120_42021.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

いただいたスタッフTシャツとプレモル！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>いまさらですが、CROSS 2013で検索CROSSというセッションを担当します(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2013/01/16/%E3%81%84%E3%81%BE%E3%81%95%E3%82%89%E3%81%A7%E3%81%99%E3%81%8Ccross-2013%E3%81%A7%E6%A4%9C%E7%B4%A2cross%E3%81%A8%E3%81%84%E3%81%86%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E6%8B%85%E5%BD%93%E3%81%97%E3%81%BE%E3%81%99/</link>
      <pubDate>Wed, 16 Jan 2013 01:29:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/01/16/%E3%81%84%E3%81%BE%E3%81%95%E3%82%89%E3%81%A7%E3%81%99%E3%81%8Ccross-2013%E3%81%A7%E6%A4%9C%E7%B4%A2cross%E3%81%A8%E3%81%84%E3%81%86%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E6%8B%85%E5%BD%93%E3%81%97%E3%81%BE%E3%81%99/</guid>
      <description>&lt;p&gt;いまさら感満載ですが、今週の金曜日(1/18)に開催される&lt;a href=&#34;http://www.cross-party.com&#34;&gt;CROSS 2013&lt;/a&gt;というイベントで「&lt;a href=&#34;http://www.cross-party.com/programs/?p=366&#34;&gt;検索CROSS&lt;/a&gt;」のセッションを担当することになってます。&lt;/p&gt;
&lt;p&gt;ここ数年、検索に携わっていますが、検索は色々な技術の組み合わせ（検索用インデックス、自然言語処理、機械学習などなど）でなりったていて奥が深いなぁと感じる毎日です。
そこで、実際のサービスで検索をやられている方、検索プラットフォーム製品を開発している方、自然言語処理や検索に長けた方を招いてつぎのような話をしてもらおうかと。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;いまさら感満載ですが、今週の金曜日(1/18)に開催される&lt;a href=&#34;http://www.cross-party.com&#34;&gt;CROSS 2013&lt;/a&gt;というイベントで「&lt;a href=&#34;http://www.cross-party.com/programs/?p=366&#34;&gt;検索CROSS&lt;/a&gt;」のセッションを担当することになってます。&lt;/p&gt;
&lt;p&gt;ここ数年、検索に携わっていますが、検索は色々な技術の組み合わせ（検索用インデックス、自然言語処理、機械学習などなど）でなりったていて奥が深いなぁと感じる毎日です。
そこで、実際のサービスで検索をやられている方、検索プラットフォーム製品を開発している方、自然言語処理や検索に長けた方を招いてつぎのような話をしてもらおうかと。&lt;/p&gt;
&lt;p&gt;・現在の事例（検索とその周辺技術）
・今後の検索にクロスすると面白い技術&lt;/p&gt;
&lt;p&gt;がっつり検索をやられている方々に登壇していただきますので、検索に興味のある方はぜひ、ご参加を！
登壇者の方々については&lt;a href=&#34;http://www.cross-party.com/programs/?p=366&#34;&gt;こちら&lt;/a&gt;を御覧ください。&lt;/p&gt;
&lt;p&gt;検索CROSS以外にも楽しみなセッションが多数ありますので、参加をご検討いただければと。
あと、実はこっちがメインなのですが、夕方からのプレモルタイムも期待できるのでこちらへの参加だけでもぜひ！！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>「コード・シンプリシティ」を読みました。（Kindle paperwhiteの使い勝手の確認も兼ねて）(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2013/01/09/%E3%82%B3%E3%83%BC%E3%83%89%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AA%E3%82%B7%E3%83%86%E3%82%A3%E3%82%92%E8%AA%AD%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9Fkindle-paperwhite%E3%81%AE%E4%BD%BF%E3%81%84%E5%8B%9D%E6%89%8B%E3%81%AE%E7%A2%BA%E8%AA%8D%E3%82%82%E5%85%BC%E3%81%AD%E3%81%A6/</link>
      <pubDate>Wed, 09 Jan 2013 00:28:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2013/01/09/%E3%82%B3%E3%83%BC%E3%83%89%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AA%E3%82%B7%E3%83%86%E3%82%A3%E3%82%92%E8%AA%AD%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9Fkindle-paperwhite%E3%81%AE%E4%BD%BF%E3%81%84%E5%8B%9D%E6%89%8B%E3%81%AE%E7%A2%BA%E8%AA%8D%E3%82%82%E5%85%BC%E3%81%AD%E3%81%A6/</guid>
      <description>&lt;p&gt;年末から年始にかけて、「&lt;a href=&#34;http://booklog.jp/item/11/9784873115757&#34;&gt;コード・シンプリシティ&lt;/a&gt;」を読みました。&lt;/p&gt;
&lt;p&gt;先日の記事にも書きましたが、Kindle paperwhiteを思いかけず入手できたので、eBookを読みたいなぁと思いまして。
Kindleのお試しも兼ねて読んでみました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;年末から年始にかけて、「&lt;a href=&#34;http://booklog.jp/item/11/9784873115757&#34;&gt;コード・シンプリシティ&lt;/a&gt;」を読みました。&lt;/p&gt;
&lt;p&gt;先日の記事にも書きましたが、Kindle paperwhiteを思いかけず入手できたので、eBookを読みたいなぁと思いまして。
Kindleのお試しも兼ねて読んでみました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;まずは、本の感想。&lt;/strong&gt;
短めの書籍＋読み物なので、サクっと読めました。
題名に「コード」と書かれていますが、コードの実例が出てくる書籍ではありません。
「ソフトウェア」を以下にシンプルに保って、管理しやすくするか、機能追加、テストをやりやすくするかといった指針について書かれています。
機能追加に関して検討しないといけないバランス（先読みしすぎずと実装しすぎないとか）の話や定期的なデザインの見直しなどについても書かれています。
ソフトウェアに関しては動くこともだが、デザインが重要であること。（確かに。）
すでにあるソフトウェアについて、どのように簡潔にしていくかという話もありました。
ただ、読んでいて一番重要だと思ったのは、「悪いプログラマーと良いプログラマーの違いは理解力だ」という一文です。
何をしているかを「理解」していないと、根本的な問題点の解決もできないですし、どうすればコードが簡潔になるかといったこともわからないです。
また、やっている作業がどんなもので、何のためにやっているのか、それを行うことで今後にどのような影響があるのかといったことも理解しておく必要があるかと。
ま、ある程度考えながら作業とかしましょうってことですかね。（強引なまとめかも。。。）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;で本題です。&lt;/strong&gt;
Kindle paperwhiteとiPadの使い分けを検討するのも兼ねて本を読んでました。
iPadを持っているのもあり、Kindleはそもそも眼中になかったのですが、めっけ物でした。
やはり実際に使ってみないとわからないことありますねぇと。
paperwihteはつぎのような利点があるかと。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;読書に没頭できる。→本を読むというシンプルな目的を達成するものだけが実装されている&lt;/li&gt;
&lt;li&gt;目が疲れない→Twitterでも話に上がったのですが、液晶とは異なり字が読みやすいです&lt;/li&gt;
&lt;li&gt;軽いし小さい→電車で立っていても楽に持てるし、カバンからの出し入れも楽です（iPadに比べて）&lt;/li&gt;
&lt;li&gt;複数の端末のKindleアプリで同期できる。→あまり異なる端末では読まないですが、paperwhiteで読んだところが、iPadでも同期されるのですんなり続きが読めます&lt;/li&gt;
&lt;li&gt;電池長持ち&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ということで、本を読むのに没頭できるし目が疲れないと。
ただ、つぎの点では不満もあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PDFは読みにくい。→画面のサイズが小さいので大きめの書籍のPDF版は読みにくいです。&lt;/li&gt;
&lt;li&gt;PDFは読みにくい。→文字のサイズを変更できないのもキツイです。Kindle専用のmobi形式の書籍が読みやすいです&lt;/li&gt;
&lt;li&gt;ページめくりに一定時間がかかる→紙の書籍やiPadで書籍を読むのとは異なり、ページをめくるのに時間がかかります。e-inkの再描画の問題かと。パラパラと書籍を読みたい場合は厳しいです&lt;/li&gt;
&lt;li&gt;白黒。カラーの電子書籍は読めないですねぇ&lt;/li&gt;
&lt;li&gt;ソースコードなどもキツイ→長めのコードが書いてある本だとコードが頭に入ってこないです。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;という感想でした。
今後は基本Kindle paperwhiteを持ち歩きmobi形式の本を読むようにすると思います。
iPadは自炊本やカラーの本を読むとき、映像、ネットを見るような場合に持ち歩くことになりそうです。
私は基本的にMBAを持ち歩いているというのもあるので、paperwhiteのほうが主流になりそうです。
ネットを見るときなどは最悪、MBAを開くでしょうし。
小説とかをメインに読むのであれば断然、paperwhiteだと思います（最近読んでないなぁ）&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>今年の振り返りと来年の抱負（2012）(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/12/31/%E4%BB%8A%E5%B9%B4%E3%81%AE%E6%8C%AF%E3%82%8A%E8%BF%94%E3%82%8A%E3%81%A8%E6%9D%A5%E5%B9%B4%E3%81%AE%E6%8A%B1%E8%B2%A02012/</link>
      <pubDate>Mon, 31 Dec 2012 08:01:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/12/31/%E4%BB%8A%E5%B9%B4%E3%81%AE%E6%8C%AF%E3%82%8A%E8%BF%94%E3%82%8A%E3%81%A8%E6%9D%A5%E5%B9%B4%E3%81%AE%E6%8A%B1%E8%B2%A02012/</guid>
      <description>&lt;p&gt;書こうと思いながら、気づいたら大晦日。
よくないですね、思いついた時に書かないと。&lt;/p&gt;
&lt;p&gt;昨年も書いたので、昨年書いた抱負から振り返りをと。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;del&gt;MongoDB触ってみる&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;Scala触ってみる&lt;/li&gt;
&lt;li&gt;&lt;del&gt;なんかWebサービス作ってみる（Amazonとかで）&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;elasticsearch、IndexTankを調べてみる&lt;/li&gt;
&lt;li&gt;&lt;del&gt;NewSolrCloudDesignを読み込んで自分なりにまとめる&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;Junsaiに参加する&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;「7つの言語7つの世界」の続き&lt;/del&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;えーと。。。できてないことばかりですねｗ
MongoDBはインストールすらしてないですし、Webサービスも作ってないです。（さくらVPSは借りたんですが）
Junsaiは参加したけど何もできてないし。7つの言語もそのままですね。。。
SolrCloudDesignはまとめられてないですしね。
Scalaは少しだけ触りました。結局Javaみたいな記述をしてしまうという良くないくせが出てしまうので、
見送ってしまいましたが。。。
elasticsearchは少しだけやりました。#pyfesで話をさせて貰える機会があったので。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;書こうと思いながら、気づいたら大晦日。
よくないですね、思いついた時に書かないと。&lt;/p&gt;
&lt;p&gt;昨年も書いたので、昨年書いた抱負から振り返りをと。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;del&gt;MongoDB触ってみる&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;Scala触ってみる&lt;/li&gt;
&lt;li&gt;&lt;del&gt;なんかWebサービス作ってみる（Amazonとかで）&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;elasticsearch、IndexTankを調べてみる&lt;/li&gt;
&lt;li&gt;&lt;del&gt;NewSolrCloudDesignを読み込んで自分なりにまとめる&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;Junsaiに参加する&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;「7つの言語7つの世界」の続き&lt;/del&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;えーと。。。できてないことばかりですねｗ
MongoDBはインストールすらしてないですし、Webサービスも作ってないです。（さくらVPSは借りたんですが）
Junsaiは参加したけど何もできてないし。7つの言語もそのままですね。。。
SolrCloudDesignはまとめられてないですしね。
Scalaは少しだけ触りました。結局Javaみたいな記述をしてしまうという良くないくせが出てしまうので、
見送ってしまいましたが。。。
elasticsearchは少しだけやりました。#pyfesで話をさせて貰える機会があったので。&lt;/p&gt;
&lt;p&gt;興味がコロコロ変わってしまうのが問題点かもしれないです。少しは地に足をつけてなんかやったほうがいいのになぁ&lt;/p&gt;
&lt;p&gt;###今年の振り返り
今年はこんなかんじでしょうか。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;いろんな勉強会に出没&lt;/li&gt;
&lt;li&gt;#pyfesでelasticsearchのさわりを紹介&lt;/li&gt;
&lt;li&gt;個人的にJIRA導入&lt;/li&gt;
&lt;li&gt;MIR輪読会開始&lt;/li&gt;
&lt;li&gt;Solr勉強会の主催を引き継ぐ&lt;/li&gt;
&lt;li&gt;Kindle paperwhite当たった&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;相変わらずいろんな勉強会に出てました。最近は勉強しに行くのもありますが、人に会いに行ってるような気がします。
勉強会から帰ってきて復習したりしないとすぐ忘れちゃうんですよね。。。&lt;/p&gt;
&lt;p&gt;#pyfesではelasticsearchの入門中という話をしてきました。
人の多さに緊張しまくりでよくわかりにくい発表になってしまったのが反省点かと。。。
もっと話をする機会を増やすとなれるのでしょうか。&lt;/p&gt;
&lt;p&gt;JIRAの導入はパラで仕事をしているとタスク管理がおろそかになってくるので導入しました。
フリーのredmineを考えていたのですが、インストールが簡単なJIRAを導入しました。
有料ですが、1-10人までなら、ダウンロード版が$10ですし。いろんな時間を買ったと考えると安いかと&lt;/p&gt;
&lt;p&gt;検索に関してもまだまだ初心者に近いということでModern Information Retrievalという英語の本の輪読を主催しました。
Twitterでの呼びかけに答えてくれた方々に感謝です。
まだ、半分も行ってないですが、何周かしたいと思っています。&lt;/p&gt;
&lt;p&gt;Solr勉強会の主催者も引き継ぎました。Atnd立てるの手伝おうか？って言ったら主催者になってましたｗ
来年も開催するので、喋りたい方、こんな話を聞きたいなどTwitterやブログでコンタクトいただければと。&lt;/p&gt;
&lt;p&gt;あと、会社の忘年会で思いがけずKindle paperwhiteが当たりました！（やったー！）
iPadを持っていることもあり、完全に購入する気も無かったのですが。。。
使ってみると結構いいです。画面のギラツキがないのと、他のソフトがないのがいいです。
読書に没頭できます。通常はKindleを持ち歩くことになるかと。（没頭できるけど、読むスピードが遅い＋すぐ忘れるのが難点。。。）&lt;/p&gt;
&lt;p&gt;###来年の抱負
来年の抱負も書いておきます。
昨年の前科があるのでどこまでできるかわかりませんが。
すぐに興味が変わってしまうのもありますし&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IntelliJ IDEAをメインに使う&lt;/li&gt;
&lt;li&gt;JIRAを継続して活用&lt;/li&gt;
&lt;li&gt;ブログの継続&lt;/li&gt;
&lt;li&gt;elasticsearch&lt;/li&gt;
&lt;li&gt;Luceneのソースコードリーディング&lt;/li&gt;
&lt;li&gt;何かOSSのソースを読む&lt;/li&gt;
&lt;li&gt;Macでもっと開発&lt;/li&gt;
&lt;li&gt;読書と英語を継続&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;IDEA（アイデア）は11をインストールしてたのですが、使えていませんでした。
イメケンが主催したJetBrainsユーザー会で洗脳されて＋タイミング良い75%オフセールにやられて購入しました。
普段はEclipseを使っているのですが、これを機にチャレンジしようかと。
少し変化をしてかないとすぐ取り残されちゃうので。。。&lt;/p&gt;
&lt;p&gt;JIRAはまだタスクを登録してクローズするという初歩段階の使い方しかできてないので、少しずつ研究してフィールド追加したり、ワークフローを変更してみたりと研究したいです。&lt;/p&gt;
&lt;p&gt;ブログは、今年後半が勉強会参加ブログしかないのを反省して来年は、もう少しSolrやLucene、lucene-gosenについて書いて行きたいです。
（すくなくとも、4.0で動かす話を書かないと。。。）&lt;/p&gt;
&lt;p&gt;elasticsearchはまぁ触れる環境を維持しようという話です。
どこかで導入できればいいんでしょうが、なかなか。
（勉強会開いてみるのも面白いかな？）&lt;/p&gt;
&lt;p&gt;Luceneソースコードリーディングは誘われてるのに、ちゃんと返事をしていなかったので。
来年2月のどこかの土日を候補日にする予定です。&lt;/p&gt;
&lt;p&gt;何かOSSのソースも読もうと思ってます。
「何か」はまだ決めてないですが、人のソースを実はあまり読んでないなぁと。
Vさんと話をした時に人のソースを読むのがいいですよという話になったので。
真似をするためにもなんか読みたいなぁと。Javaになるのかなぁ。&lt;/p&gt;
&lt;p&gt;とある事情で週4はWindowsで開発してます。
Macはちょっとしか触ってないのでMacの環境が成長していないのが難点です。
できれば、Macで開発を継続できる環境を作りたいなぁと。Kobitoとか入れてるけど触ってないし。。。
IntelliJも入れたのでMacで開発したいものです。&lt;/p&gt;
&lt;p&gt;最後は毎年のことですが、本を読むスピードが買うスピードに追いついてないと。。。
英語の本もかってるんですが、これまた読むスピードが。。。
ということで、ざっくり目を通す読書をもっとやりたいなぁと。
買うのはいいのですが、必要にならないと呼んだ内容を忘れてしまうので、読んだあとに実践する機会も設けたいと思ってます（思ってるだけかもしれないですが）&lt;/p&gt;
&lt;p&gt;あと、来年もいろんな人に会うためにいろんな勉強会に出没すると思いますので、声をかけていただければと
また、不抜けているのを見かけたらカツを入れてください。（技術内容のブログ書けとか、本読んだ感想をブログにかけとか）
来年もTwitterなどで絡みまくると思いますが、よろしくです。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>JIRAのDB移行（HSQLDBからPostgreSQLへ）#augj(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/12/20/jira%E3%81%AEdb%E7%A7%BB%E8%A1%8Chsqldb%E3%81%8B%E3%82%89postgresql%E3%81%B8-augj/</link>
      <pubDate>Thu, 20 Dec 2012 20:18:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/12/20/jira%E3%81%AEdb%E7%A7%BB%E8%A1%8Chsqldb%E3%81%8B%E3%82%89postgresql%E3%81%B8-augj/</guid>
      <description>&lt;p&gt;Atlassian Advent Calendar 2012の20日目。（急遽参戦）
（某イケメンにMT（改変リツイート）されたので書いてみました）
久々に、勉強会以外のエントリです。（Solrとかlucene-gosenじゃないんだが。。。）&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Atlassian Advent Calendar 2012の20日目。（急遽参戦）
（某イケメンにMT（改変リツイート）されたので書いてみました）
久々に、勉強会以外のエントリです。（Solrとかlucene-gosenじゃないんだが。。。）&lt;/p&gt;
&lt;p&gt;私は、最近忘れっぽくなってきてしまったので、さくらVPSを借りてJIRAを立てて、タスク管理とかに使い始めました。
有料ツールなので、まずは、評価版から入れましたと。
評価版をインストールするときに、楽なのでHSQLDBを選択していました。が、
インストール時に「HSQLDBは評価版だけで使用してください。正式版ではサポートしてないです」みたいなことを言われていたので、PostgreSQLに切り替えようかと。
ちなみに、MySQLも選択肢としてはあったのですが、PostgreSQLのほうが触ってるし（つかいこなせてるわけではない）、補完機能になれてるというのもありPostgreSQLを選んでみました。&lt;/p&gt;
&lt;p&gt;作業のログとして、ブログ書いとこうと思いたったのでメモ的に残しておきます。&lt;/p&gt;
&lt;p&gt;作業の流れはこんなかんじでした。
（基本的にはサポートサイトの&lt;a href=&#34;https://confluence.atlassian.com/display/JIRA052/Switching+Databases#SwitchingDatabases-differenttype&#34;&gt;ここ&lt;/a&gt;に載ってます。サポートいいね。）
この手順通りでいいみたい。&lt;/p&gt;
&lt;p&gt;###1.  JIRAのデータのバックアップ（JIRAの管理画面からバックアップ）&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;まずは管理画面へ。ページ右上に管理へのリンクがあるのでクリック。


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20121220/20121220_2548699.jpg&#34; alt=&#34;管理画面へ&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20121220/20121220_2548699.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;開いた管理画面の右下あたりにエクスポート（バックアップ）へのリンクがあります。


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20121220/20121220_2548700.jpg&#34; alt=&#34;管理画面右下のこのへん&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20121220/20121220_2548700.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;クリックしたあとに、エクスポートのファイル指定画面が現れるので、ファイル名を指定してバックアップボタンを押します。


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20121220/20121220_2548714.jpg&#34; alt=&#34;ファイル指定画面&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20121220/20121220_2548714.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;バックアップが完了するとバックアップファイルの場所が表示されます。


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20121220/20121220_2548701.jpg&#34; alt=&#34;完了画面&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20121220/20121220_2548701.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;###2. JIRAの停止&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;バックアップが終わったのでJIRAを停止します。&lt;/p&gt;
&lt;p&gt;###3.  PostgreSQLのインストール（yum）
PostgreSQLが入ってないので、yum installします。（軟弱者なので）&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
yum install postgresql-server
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;####initdbで四苦八苦
PostgreSQLはインストールしただけでは起動できません。なので、初期化をします。
yumでインストールしたPostgreSQLだとつぎのコマンドでinitdbできるようです。（これが罠でした）&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
service postgresql initdb
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;このコマンドでinitdbすると、encodingが指定できませんでした。（私がしらないだけという話も。。。）
encodingを指定できていないと、このあと4.を実行するときにエラーが出ました。（これも回避方法あるのかも。）
ということで、結局、昔とった杵柄なやり方でinitdbコマンドで&amp;ndash;encoding=UTF8 &amp;ndash;no-localeを指定しました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
initdb --encoding=UTF8 --no-locale -D/var/lib/pgsql/data
service postgresql start
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これで初期化が完了するので、PostgreSQLを起動します。&lt;/p&gt;
&lt;p&gt;###4.  JIRA用DBとユーザの作成&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;まずは、ユーザの作成。そして、DB作成&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
createuser jirauser
createdb -E UNICODE jiradb
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;テーブルなど作成しません。あとの処理がやってくれます。&lt;/p&gt;
&lt;p&gt;###5.  JIRAにJDBCドライバを入れる（必要なかった。）&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;warじゃないJIRAをインストールした場合はすでに入ってるみたいです。
ここを見るとわかります。JIRA Installation Directoryの下のlibですかね。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
/opt/atlassian/jira/lib
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;###&lt;del&gt;6.  マニュアルでPostgreSQLの接続設定（あれ、これいらないのか。）&lt;/del&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;~~　コンソールオンリーなので、JIRAが提供してくれているツールが使えないため、手で設定。
　/var/atlassian/application-data/jira
　にあるdbconfig.xmlを修正~~
ちゃんと英語読めってことですね。。。必要なかったです。。。&lt;/p&gt;
&lt;p&gt;###7.  JIRAのdbconfig.xmlを削除&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;DB接続の設定を初期セットアップウィザードで再設定するため、dbconfig.xmlを消します。
（一応、インストールディレクトリとホームディレクトリとかバックアップしたほうがいいみたい）
場所はここ。
中身はdbcpとかのデータソースの設定に似てました。
今は、HSQLDBのJDBCドライバが記載されてました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
rm /var/atlassian/application-data/jira/dbconfig.xml
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;###8.  JIRAの起動&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;7.のファイルを消したあとにJIRAを起動します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
service jira start
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;###9.  JIRAにアクセスとDB接続設定&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;アクセスすると、インストールした時と同じDB接続の指定を行うセットアップウィザードの画面が現れます。


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20121220/20121220_2548715.jpg&#34; alt=&#34;最初のセットアップ画面&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20121220/20121220_2548715.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;今回はJIRAサーバの外にあるPostgreSQLなので、「外部」を選んで四角で囲んだ部分を入力します。
入力したら、「接続テスト」を押して接続できることを確認したら「次へ」を押します。
マシンのスペックにもよると思いますが、ここでJIRAサーバがDBに接続してテーブルのCREATEなどDBのセットアップを実行してるのでちょっと時間がかかります。&lt;/p&gt;
&lt;p&gt;###10. バックアップしたデータのインポート&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;DBのセットアップが終わったら、アプリケーションのセットアップ画面が出てきます。


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20121220/20121220_2548716.jpg&#34; alt=&#34;インポートファイル指定画面へ&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20121220/20121220_2548716.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

新規インストールではないので、「ここ」にある「既存のデータをインポート」リンクをクリックします。
すると、インポートファイルの指定画面が現れるので、1.でバックアップしたファイル名を指定してインポートします。
すると、インポート中画面が出てきます。


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20121220/20121220_2548817.jpg&#34; alt=&#34;インポート中画面&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20121220/20121220_2548817.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

で、インポートが完了すると無事JIRAにログインできますと。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;とこんなかんじです。
私の場合は、まだJIRAをインストールしてから間もないため、チケットの数が少なかったり、添付ファイルが無かったりなので、すぐにインポートが完了しました。
添付ファイルがある場合は、別途添付ファイルが保存されているディレクトリのバックアップと復旧などもあるみたいです。
最初にも書きましたが、ドキュメントのサイトに「Switching Databases」という項目があり、そのページの手順で問題なく切り替えできました。
次は、定期的にデータをバックアップするのを考えないとですかね。&lt;/p&gt;
&lt;p&gt;いやぁブログ書くのが、思いの外、手こずりました。
手こずった原因はスクリーンショットだったんですけどね。。。
safariでページ全体のスクリーンショットがとれなかったので、結局Chromeで&lt;a href=&#34;http://awesomescreenshot.com/&#34;&gt;Awesome Screenshotプラグイン&lt;/a&gt;使いました。
safariの拡張もあるんですが、ページ全体のスクリーンショットがうまく動かないみたいです。。。
ということで、備忘録でした。（次はちゃんとSolrとかの記事書かないとなー。その前に忘年ブログかな）&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第一回 JetBrainsユーザーグループ #jbugj に参加してきました(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/12/11/%E7%AC%AC%E4%B8%80%E5%9B%9E-jetbrains%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97--jbugj-%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%A6%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Tue, 11 Dec 2012 21:22:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/12/11/%E7%AC%AC%E4%B8%80%E5%9B%9E-jetbrains%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97--jbugj-%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%A6%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;イケメンが主催した「&lt;a href=&#34;http://www.zusaar.com/event/450003&#34;&gt;第一回 JetBrainsユーザーグループ #jbugj&lt;/a&gt;」に参加してきました。&lt;/p&gt;
&lt;p&gt;いろんな製品があるんだなぁと。入り口には良いイベントだったと思います。
個人的に、WebStorm、IntelliJが気になっていたので、参加しました。（あとは、イケメンがやってるイベントだからというのもあるかも）
ちなみに、MBAにしてからインストールはしていたのですが、ほぼ触っていなかったのでこれを機会にちょっと触ってみようかなぁと。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;イケメンが主催した「&lt;a href=&#34;http://www.zusaar.com/event/450003&#34;&gt;第一回 JetBrainsユーザーグループ #jbugj&lt;/a&gt;」に参加してきました。&lt;/p&gt;
&lt;p&gt;いろんな製品があるんだなぁと。入り口には良いイベントだったと思います。
個人的に、WebStorm、IntelliJが気になっていたので、参加しました。（あとは、イケメンがやってるイベントだからというのもあるかも）
ちなみに、MBAにしてからインストールはしていたのですが、ほぼ触っていなかったのでこれを機会にちょっと触ってみようかなぁと。&lt;/p&gt;
&lt;p&gt;発表は、全般的な製品紹介、ライセンスの紹介から、ライブコーディングあり、ここがいいよ！という話ありという感じでした。&lt;/p&gt;
&lt;p&gt;MTLさんのおしゃれな空間で発表を聞いたので、いつもとは少し違った感じでしたでしょうか。&lt;/p&gt;
&lt;p&gt;私自身は、発表を聞きつつ、IDEAのCEで色々やってました。
一応、Lucene/SolrのSVNからチェックアウトしたり、lucene-gosenのtrunkをチェックアウトしたり、個人のbitbucketからlucene-gosen-wikiparseとかcloneしてました。
Eclipseで作ったプロジェクトなので、cloneとかチェックアウトしたあとに、Eclipseと並行開発するとどうなるのかなぁ？というのがちょっと気になります。（普通は移行しておしまいなんだろうけど。。。）
ちなみに、lucene-gosenのプロジェクトもSVNからチェックアウトしたらすんなり使えそうでした。
こんな感じ。（lucene-gosenのプロジェクト）


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20121211/20121213_2542798.jpg&#34; alt=&#34;IntelliJ IDEAでlucene-gosenのプロジェクトを取り込んでみた&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20121211/20121213_2542798.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

とりあえず、見た目がカッコイイｗ&lt;/p&gt;
&lt;p&gt;いくつか触ったり、聞いていて気になったのはつぎのような点です。ちょっとずつ触る機会を作った時に調べてみようかなぁと&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Eclipseのワーキングセット相当の機能はどうするのか？→&lt;a href=&#34;http://d.hatena.ne.jp/masanobuimai/touch/20121024&#34;&gt;モジュールとかでやればいいらしい。&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;プラグインってどんなものがあるの？探す方法とインストールの仕方&lt;/li&gt;
&lt;li&gt;JDKの複数の切り替え方とか&lt;/li&gt;
&lt;li&gt;Eclipseでやってる人とIntelliJでやってる人の混在チームでの開発とか&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;で、いつものごとく、懇親会に参加しました。
@mike_neckさんや@sue445さんとお話できたのですが、VCSにEclipseの設定ファイルとか挙げないほうがいいですよねとか、テストが無いプロジェクトってないわーなどの話を聞いて、やっぱり自分はまだまだなんだなぁと認識できるとか面白かったです。
lucene-gosenのSVNにはEclipseの設定ファイルとかアップされてるからなぁ。ホントはAntとかMavenのターゲットでこれらの設定ファイルができるようにしとくのがいいんでしょうねぇ。
まだまだ勉強することだらけですが、コツコツ教えてもらいます&lt;/p&gt;
&lt;p&gt;ちなみに、イベント参加者にはショートカットキーが印字されたキートップシールや2ヶ月有効な評価ライセンスがあとからもらえるなどの特典もありました。
普段はEclipseなのですが、運良くライセンスが当たったら本気で乗り換えようかなぁｗ&lt;/p&gt;
&lt;p&gt;ちなみに、Eclipseでもそうですが、私自身はショートカットキーをほとんど覚えてない軟弱者ですので、メニューの場所などを覚えれば乗り換え自体はこんなんじゃないかと。
Mac自体にKeyRemap４MacBookを入れていて、Emacsっぽいショートカットを使うので、覚えられないというのもありますが。
ライセンス当たらないかなぁー&lt;/p&gt;
&lt;p&gt;以下はいつもの通り、聴きながら自分用にメモしたものになります。&lt;/p&gt;
&lt;hr&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
日時：2012/12/11（火）19:00-21:00
場所：メディアテクノロジーラボ 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;イベントサイト：&lt;a href=&#34;http://www.zusaar.com/event/450003&#34;&gt;http://www.zusaar.com/event/450003&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
◎JetBrains製品群、ライセンス形態などの紹介 - @yusuke
　・日本でヤル気あるの！？→あるある！→じゃあ、ユーザグループ立ち上げるぜー
　・あくまで情報交換の場を設けるだけ。
　・アンケート結果
　　IntelliJが1番人気
　　WebStromが2番
　・ステッカー（ちょっとかっこ悪いかも。。。）
　・2名限定でIDEAのライセンスプレゼント！
　　ブログ書いて、応募用フォームに登録してランダム抽選
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
◎IntelliJの基本(インストール～プロジェクト作成、テスト、実行までのウォークスルー) @yusuke
　・JetBRAINSはチェコの会社
　・IntelliJはなんでもできる（AppCodeは違うけど）
　・.Net系もある（書きそびれた）
　・YouTrack：課題追跡
　・TeamCity：継続インテグレーション
　・読み方は「イデア」じゃなくて「アイデア」だよ！
　・Community Editionはあんまり機能がない。
　　OSSライセンスだと、Ultimateの機能が使えるよと。
　・仙台の人が一人アドベント・カレンダーやってます。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;　　&lt;a href=&#34;http://d.hatena.ne.jp/masanobuimai/20121201&#34;&gt;http://d.hatena.ne.jp/masanobuimai/20121201&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　・ライブデモ
　　黒いインタフェースにするのどーすんだろう？
　　→Preferences→AppearancesでThemeで「Darcula」を選択すると黒くなる。
　・やべ、時間過ぎてたｗ終わり！

◎IntelliJのここが気持ちいい！→普通IntelliJでしょ？ @mike_neck
　・DQXやってます。
　・僕とeclipse
　　・新規クラス作成：3ステップかかる
　　・補完の素早さ：
　　・SprintFramework：Ultimateなら対応してるよ。
関係ないけど、TLで質問したので。
　Eclipseのワーキング・セットに相当するもの。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;　&lt;a href=&#34;http://d.hatena.ne.jp/masanobuimai/touch/20121024&#34;&gt;http://d.hatena.ne.jp/masanobuimai/touch/20121024&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
◎LT
　◯WebStormとRubyMineについて @sue445
　　・JavaScriptのIDEとして最強
　　　jsの補完が素晴らしい。（外部のJSはプロジェクトに入れないと難しい。）
　　　jsTestDriver pluginがデフォルトで入ってる！
　　・RubyMine
　　　RubyのIDE
　　　ソースを追うのが楽。
　　　erbのインポートしたものも追っかけられるの便利。
　　　viewからhelperクラスにも飛べる。
　　QA
　　　UMLとか出せるの？→出せるよ。
　　　DBクライアントもあるよ。
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
◎JetBrains発のJVM言語Kotlinの紹介 - @ngsw_taro
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;　&lt;a href=&#34;http://atnd.org/events/34627&#34;&gt;アドベントカレンダー（一人）http://atnd.org/events/34627&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　・社畜してます
　・Androidアプリとか作ってる。
　・Kotlinな活動
　　Pull Requestしてる
　・マイルストーンなど。
　　M4が3時間前に出た！
　・どんな言語？
　　静的型付け、オブジェクト指向、関数型プログラミング的、JSへコンパイル可
　　産業利用目的（初めて聞いたかも、この言葉ｗ）
　・Java大変だよね。
　　互換性問題とか
　・ライブコーディング
　　大変そうだｗKUnitってのもあるらしい。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;　（ゴメンナサイ、IDEA触ってて、流してました。。。Eclipseで作ってたプロジェクトをBitbucketから落としてきて四苦八苦してた）
　（参考にしたサイト（ググった）：&lt;a href=&#34;http://d.hatena.ne.jp/waman/20100506/1273166533&#34;&gt;http://d.hatena.ne.jp/waman/20100506/1273166533&lt;/a&gt;）&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
◎AppCodeについて
　・IDEAには含まれないので、別途ラインセンス購入が必要。
　・XcodeとAppCodeの違いをライブコーディングで説明。
　・XCodeよりも補完が良くできてるっぽい。
　GUIはXCodeで作って、コーディングはAppCodeでやるってのがいいですよ。
　※私が、iOS系のアプリの開発ってやったこと無いからよくわかってないです。。。
　　XCodeはコードフォーマットがないのが辛い by @yusuke
&lt;/code&gt;&lt;/pre&gt;</content:encoded>
    </item>
    
    <item>
      <title>#DSIRNLP 3.5に参加しました。＆「Emacs実践入門」を頂いちゃいました！(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/11/29/dsirnlp-3-5%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9Femacs%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80%E3%82%92%E9%A0%82%E3%81%84%E3%81%A1%E3%82%83%E3%81%84%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Thu, 29 Nov 2012 02:00:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/11/29/dsirnlp-3-5%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9Femacs%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80%E3%82%92%E9%A0%82%E3%81%84%E3%81%A1%E3%82%83%E3%81%84%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;ヒカリエに行ってみたいという不純な理由で参加してきました。
新しいということもあり、おしゃれで綺麗なカフェでした。
入り口にはおっきな人形も立ってたし。
渋谷の夜景も見下ろせて素敵な場所でした。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ヒカリエに行ってみたいという不純な理由で参加してきました。
新しいということもあり、おしゃれで綺麗なカフェでした。
入り口にはおっきな人形も立ってたし。
渋谷の夜景も見下ろせて素敵な場所でした。&lt;/p&gt;
&lt;p&gt;で、内容です。残念ながら、本編の3回めには参加していなかったのですが、
今回も濃い話が聞けたので楽しかったです。
論文読まなかったり、基礎を勉強したのに忘れてたりと抜けてる部分が多いので、
こういう機会が与えてもらえるというだけで目からうろこです。&lt;/p&gt;
&lt;p&gt;@kumagiさんの&lt;a href=&#34;http://www.slideboom.com/presentations/655201/%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AE%E7%9F%A5%E3%82%89%E3%81%AA%E3%81%84%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E4%B8%96%E7%95%8C&#34;&gt;「あなたの知らないハッシュテーブルの世界」&lt;/a&gt;はハッシュテーブルの基本的な話から、最近の論文で発表されてる内容までをカバーする幅広いお話で面白かったです。
（大学でやってると思うんだけどすっかり抜けてる自分がなんとも。。。）
こういうコアな中身も知ってると、色々とプログラム書いたりするときの見方や考え方も変わってきますよね。
（そんなプログラム書いてないけど。。。）
で、随分おとなしい内容だなぁ？と思いきや、途中からちゃんとLock-Freeの話も出てきてさすがと感心させられましたｗ
最後はJubatusの宣伝まで入ってたし。（某氏のすごい写真入りで。。。）&lt;/p&gt;
&lt;p&gt;@hitoshi_niさんの文書要約の話は、NLPに興味があるので、楽しみにしていた内容でした。
今回もなめらかによどみなく喋られる発表にただただ感心させられるばかりでした。
内容は中級編ということで、文書要約のキモになる処理の文章の短縮の話です。
係り受け木を元にする手法をわかりやすく説明されて、もうなんか、すぐに実装できちゃうんじゃないかと錯覚してしまう始末でした。
係り受け解析というと、CaboChaを思い浮かべてしまうんですが、きっと違う実装なんだろうなぁ。
入門編と次回の重要文抽出の話も聞きたいなぁと。&lt;/p&gt;
&lt;p&gt;最後に、技術評論社さんから「Emacs実践入門」など3冊の書籍のプレゼントまでありました。
その他の2冊は購入済みだったのですが、Emacs本は購入したいリストに入れたままでした。
ということで、欲しいですというアピールをしてゲットしてきました！
Emacsはなんだかんだで、もう10年以上使っていますが、そこまで深入りしないような使い方をしていました。
これを機に、再入門してもっと使いこなせるようになろうかと。
また、読了したタイミングでブログに感想かきます。&lt;/p&gt;
&lt;p&gt;ということで、以下はいつもの自分用のメモになります。おかしいところ、それ書いちゃダメでしょ的なところのツッコミをいただければ。&lt;/p&gt;
&lt;hr&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
日時：2012年11月28日(水) 19:00
場所：渋谷ヒカリエ27F NHN Japan カフェ


◎開会、諸注意など　@overlast
　人材募集、会場説明など。
　前回、本をもらった人はブログ書いてね。オライリー様より
　今回も本のプレゼントあり。技術評論社様より

◎あなたの知らないハッシュテーブルの世界(30分 + 質疑応答10分)　@kumagi さん
　・まずは前提。
　　データの集合を扱いたいよね
　　配列でもできるね。けど、データ増えるとキツイね。
　・ハッシュ関数の話から。
　　リハッシュとかの話
　・ClosedAddressingとOpenAddressingの話
　・ClosedAddressingの場合、ポインタ使ってるからキャッシュミスあり。
　　メモリとかの話
　・OpenAddressingメモリに乗るのでキャッシュミスは少ないけど、削除データの扱いがちょっと大変
　　→削除がいっぱい有ると処理が面倒
　・RubyはClosedAddressing、PythonはOpenAddressing
　　memcachedはClosedAddressing
　・Cuckoo Hashing（2001）
　　密度50%以上になると急にコストが高くなる。
　　挿入がすごく遅くなる。追い出し操作が増えるから？
　・そこで、Hopscotch
　　ググった参考ページ：http://shnya.jp/blog/?p=639
　　http://en.wikipedia.org/wiki/Hopscotch_hashing
　　密度が上がっても性能劣化がない。
　・C++でHashtableが欲しくなったら、google_sparse_hashとdense使うよと。
　・ConcurrentHashmapのお話
　　テーブル部分がvolatile、Chain部分はfinal
　　insertはChainの先頭に。
　　削除は遅い。ReadCopyUpdate。
　　空でも1.7M（K？）持ってく
　・ここからはLock-free系
　　・Lock-Free Hash Table
　　　http://www.azulsystems.com/events/javaone_2007/2007_LockFreeHash.pdf
　　　HotSpot VMの人のもの？こんなのやってる。http://www.0xdata.com/faq.html
　　・（聞きそびれた）
　　・日立謹製Lock-free hashtable
　　　日立のDBで使ってる部品？
　　　ベンチマークが胡散臭い
　　・最後はJubatusのCM
　
◎文書要約入門 中級編(40分 + 質疑応答10分)　@hitoshi_ni
　・画数が少ないです。
　・ヒカリエ綺麗ですね。
　・文書要約とは？
　　「機械に」要約させる。
　・なんで要約？
　　長い文章読みたくない。人件費の削減
　・どうやって要約？
　　1.文分割：文書を文に分割
　　2.文短縮：就職説を削除するなどして、原文より短い文の亜種を出す。
　　3.重要文抽出：要約にふさわしい文を選び出す。
　・今回は文短縮について
　・動機
　　長い文は文抽出で扱いにくい
　　文の中にも重要なところとそうでないとこがある
　・係り受け木の剪定すると短くできると。
　　剪定のルール
　　　中間ノードは落としちゃダメ
　　除去の時に考えること
　　　重要度
　　　言語
　・重要度？
　　文節に点数を付ける
　　文書集合中の出現頻度とかを採用。訓練データからでもいいよ（ロジスティック回帰とか）。
　・言語尤度
　　言語としての尤もらしさ
　　典型的にn-gram言語モデルを使う
　・そして探索
　　基本的には2値ラベリング
　　ビタビアルゴリズムではだめ。係り受け制約が考慮できない
　　ナイーブいはビームサーチをする。
　・文短縮の評価
　　・人間が書いた短縮文と比較
　　・ROUGE-Lという尺度などで評価（これしらないなぁ。）
　・幾つかの論点
　　係り受け解析しない
　　文節じゃなくて、単語単位でもいいよねとか。
　Q：硬い文章以外の要約ってやってるの？
　A：あります。
　　　技術的な話だと、係り受け解析がうまく出来ればできる。
　　　係り受け解析がうまくいけば、そこまで大変じゃない。
　Q：短さが短くなるほど難易度があがるけどどこまでやってます？
　A：短くすればするほど難しい。これは情報の欠落が激しくなるから。
　　　文法性を担保するのも難しい。
　　　10文字くらいならできそう。
　Q：実例としてどのくらいの長さをどのくらい短くしてる？
　A：ある程度の長さを20文字にしてくれとか。Twitterに入るくらいにしてくれとか。
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;p&gt;頂いちゃいました！
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4774150029/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51M3ahu1q8L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4774150029/?tag=johtani-22&#34;&gt;
      Emacs実践入門　～思考を直感的にコード化し、開発を加速する (WEB&amp;#43;DB PRESS plus)
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第9回Solr勉強会を主催しました。#SolrJP(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/11/26/%E7%AC%AC9%E5%9B%9Esolr%E5%8B%89%E5%BC%B7%E4%BC%9A%E3%82%92%E4%B8%BB%E5%82%AC%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-solrjp/</link>
      <pubDate>Mon, 26 Nov 2012 18:44:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/11/26/%E7%AC%AC9%E5%9B%9Esolr%E5%8B%89%E5%BC%B7%E4%BC%9A%E3%82%92%E4%B8%BB%E5%82%AC%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-solrjp/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://atnd.org/events/33718&#34;&gt;第9回Solr勉強会&lt;/a&gt;に参加しました。
皆勤賞です！というか、主催者になってしまいました。
まだ不定期の開催になると思いますが、話をされたい方などいらっしゃいましたら連絡いただければ助かります。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;http://atnd.org/events/33718&#34;&gt;第9回Solr勉強会&lt;/a&gt;に参加しました。
皆勤賞です！というか、主催者になってしまいました。
まだ不定期の開催になると思いますが、話をされたい方などいらっしゃいましたら連絡いただければ助かります。&lt;/p&gt;
&lt;p&gt;今回も面白い話が聞けました。&lt;/p&gt;
&lt;p&gt;最初はKuromojiの開発者でSolrのコミッターでもあるChristianの発表です。
Solr勉強会では初の英語の発表だったんじゃないでしょうか。
Atilikaでやってることの紹介から、Kuromojiの紹介、今後の改良に関する話とひと通り話してもらいました。
途中でKuromoji使ってる人？などの質問があったのですが、残念ながら反応が薄かったです。
漢数字をアラビア数字でも検索できるようにするチケットなど、今後のKuromojiの発展も楽しみです。
（コメントとかパッチを送れというプレッシャーもあったので、パッチ頑張って書きます。。。）&lt;/p&gt;
&lt;p&gt;つぎはニコ生でのSolrのお話。結構、赤裸々（前任者がいない状態で引き取ったとか）に語っていただき、ハラハラしながら聞いてました。
やはり、新語や略語で苦労されてるんだなぁと。
複数のサービスや開発者に対してSolrの環境を提供するという話はなかなか興味深かったです。
いろんな人がSolrを触るような状況になってきてるんだなぁと。
基盤となるラッパーのようなフレームワークとかも作ってるのかなぁ？
今後は台湾語や英語への展開も考えられているようなので、&lt;a href=&#34;http://wiki.apache.org/solr/LanguageDetection&#34;&gt;Language Detection&lt;/a&gt;などを利用してみた感想とその内容を今度発表してもらいたいですねｗ&lt;/p&gt;
&lt;p&gt;つぎはFacetPivotの話です。
昔から要望が出ていたのですが、4.0系でやっと使えるようになりました。
ファセットはSolrの売りの一つだと思います。
最初はこの考え方がしっくりこない人もいるかもなぁと。特にデータをどのように作れば、いいのかって悩むこともあります。
その悩んだ内容について発表してもらいました。
実際にどうやって使うかを悩んだ内容を発表してもらうのもいいなと思いました。&lt;/p&gt;
&lt;p&gt;最後はSolr勉強会なのに、elasticsearchの洗脳会になってましたｗ
elasticsearchはSolrと同じ、Luceneをコアに採用した検索エンジンサーバーになります。
Solrとは別のアプローチでLuceneをラップし、REST APIでアクセスしやすくしたプロダクトです。
Luceneのコミッターの方もelasticsearchの開発に参加しています。
分散インデックスを念頭においた設計や、インストールが簡単なプラグイン構造といったSolrとは違ったアプローチがなされており、面白いものになっています。
残念ながら日本で利用されているという話はまだ聞いた事ないですが、だからこそ、触ってみて事例を紹介してみるのも面白いのではないでしょうか。
今回紹介したKuromojiも使えるようになっていたりしますので、日本語でもある程度使えると思います。&lt;/p&gt;
&lt;p&gt;以上が簡単ですが感想です。主催者だったのに、@hirotakasterさんや@ajiyoshiさんに受付などをやっていただいたので、いつもの様にしっかり話を聞いてしまいました。
発表者の方、会場提供いただいたVOYAGE GROUP、お手伝いいただいた皆さんに感謝です！&lt;/p&gt;
&lt;p&gt;今回初の主催でしたが、本当に助かりました。たどたどしい説明や紹介など至らない点も多々有ったかと思いますが、今後もよろしくお願いいたします。&lt;/p&gt;
&lt;p&gt;主催者的な立場として感じたことも書いておこうかと。
無料の勉強会で、ATNDという参加しやすい環境というのもあるかもしれないのですが、キャンセルをきちんとしていただくほうがいいなと思っています。
幸いにもSolr勉強会はここ数回は盛況で、キャンセル待ちの方が結構いらっしゃいます。
ギリギリまで業務との兼ね合いを見つつ、参加しようと思っていらっしゃる方もいると思うのですが、キャンセル待ちで行けるかな？どうかな？と思っている方もいらっしゃいます。
ドタキャンは問題ないのですが、キャンセルせずに欠席は出来れば避けていただけると助かるなぁと。
（残念ながら、きちんと集計をとれなかったので、次回からは集計取ってみようかなぁと）&lt;/p&gt;
&lt;p&gt;次回の開催は今のところ未定です。発表してみたい方、こんな話を聞いてみたいなど、気兼ねなく連絡いただければと思います。
このブログにコメントを頂いてもいいですし、ツイートしていただいてもいいので、反応をいただけると嬉しいです。
また、今回至らない点があったなどのツッコミ、批判も気兼ねなく言っていただければと思います。
今後の反省点にもしたいので、ぜひ反応をいただければと！&lt;/p&gt;
&lt;p&gt;懇親会でも色々な方とお話できました。（もう少し、Christianと英語で話す努力とかしないとなぁ。。。）&lt;/p&gt;
&lt;p&gt;&lt;del&gt;とりあえず、メモをアップしときます。
リンクとか感想とかはまた（飲んだ）後で。。。&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://togetter.com/li/413428&#34;&gt;togetterでまとめてももらったみたいです&lt;/a&gt;。ありがたいです。&lt;/p&gt;
&lt;hr&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
第9回Solr勉強会
場所：VOYAGE GROUP 会議室
日時：11/26(月) 19:00～21:00

1. Atilika Inc.　Christian Moenさん
　　タイトル：Who we are, what we do, and a little bit about Kuromoji
　◎Atilikaの紹介。
　　会社の目指すもの
　　・BigData、検索、NLP
　◎プロダクト
　　Kuromoji：形態素解析エンジン
　　Akahai：日本語クエリサジェストエンジン
　　Keywords：日本語キーフレーズ抽出
　◎Kuromojiの紹介
　　3.6からデフォルトで使える。

　◎将来の改良の話。
　　・踊り字対応（コミット済み）
　　・漢数字に関するチケット＆パッチのお話。
　　・ユーザ辞書の重複エントリ改良とか（すみません、パッチ書きます。。。）

2. 株式会社ドワンゴ　吉村総一郎さん(@sifue)
　　タイトル：Solr@ニコニコ生放送
　◎ニコニコ生放送の紹介
　　・1日に10万番組。。。
　　・10/17にバージョンQをリリースしたら、トップはひどい叩かれようでした。。。
　◎これまで。
　　Jackrabbit→Lucene→Solr→ニコ生のSolr
　◎退職者と入れ替わりでSolr担当。。。
　　今回は資料と環境を調べて発掘した機能のお話。。。
　◎機能
　　キーワード検索。論理クエリ、などなど。
　◎利用してる環境
　　3.4ベース＋Jetty
　　マスタスレーブ構成（スレーブ2台）
　　途中は分散インデックスを自分で実装？
　　ボトルネック自体がDBからのデータ収集だった
　◎インデックス対象
　　・見れるのは過去1週間と過去の公式番組すべて。
　　　この部分だけ検索可能。
　　・更新頻度の高い情報に「来場者数」「コメント数」
　◎インデックス作成
　　・バッチにて更新
　◎アナライザ
　　CJKTokenizerFactoryを利用
　　HTMLStripCharFilterFactory
　　Bi-gramなので、「FF」とか「DQ」に弱い（FF1でFF13とかヒットしちゃう）
　　検索精度は悪いと言われてるみたい。
　◎1日のリクエスト
　　ピーク時40QPS程度
　　5分おきにスパイクがある。（ユーザが作ったツールによる検索とか。。。）
　◎UPDATEリクエスト
　　ピーク時は80QPS
　◎開発用のJettyのマルチテナント機能を利用したSolr環境の提供
　◎台湾語とか英語もやりたいなぁ。　　

3. 株式会社マーズフラッグ　柳吾朗さん(@hitode7456)
　　タイトル：ドリルダウン色々
　◎Facetの紹介から
　◎楽天でのドリルダウン例（これはFacetの紹介での例であり、実際にSolrが利用されているかはわからないです。）
　◎多段ドリルダウン（ファセット）のお話。
　　アプリを実装するときの考え方とか。
　◎実直形、工夫形、PivotFacet
　Q&amp;amp;A
　　Q：3つの性能系のコストは？
　　A：まだ調べてないです。残り2つは工夫形がいいですよ。と
　　次回、調べた結果の発表もやってほしいなぁ。

4. 兼山元太さん (@penguinana_) https://speakerdeck.com/penguinco/solrtoelasticsearchfalsebi-jiao
　　タイトル：SolrとElasticsearchの比較
　◎クックパッド！
　◎elasticsearchの紹介
　◎比較サイトもあるよ！
　　http://solr-vs-elasticsearch.com
　◎サンプルデータ・セット（ライブドアグルメ）でサンプル実装。
　　https://github.com/penguinco/ld_gourmet_search
　◎APIの紹介
　　REST APIがちゃんと造られてますよと。
　　設計時点でコレクションなどがURLに含まれてるのがいいよねと。
　◎_analyzeによりアナライザーもAPIとして公開されてるよと。
　◎Kuromojiも対応してるよ！
　◎DynamicFieldよりも便利だよ。
　◎クエリのDSLが違うのでちょっとアレ。
　◎スコアリングも色々できるよ。
　◎感想
　　・機能面の不足なし
　　・APIがいい
　　　コア追加とか、curlだけでできるのがいい。
　　・習得が容易（Solrやってると機能とか似てる）
　　・大規模じゃなくても使えそう

　◎分散検索がデザイン時に組み込まれてるのがいいよね。
　　write consistencyなどがインデックスごと（コレクションごと？）に設定可能なので便利。

　◎multi-tenant
　　open/closeなどができる（時系列データとか）
　　shard allocationなどの細かな制御も可能ですよと。

　◎plugin
　　色々プラグインがあるよ。管理画面もプラグインであります。
　　プラグインもコマンド一発で追加可能。
　◎クエリキャッシュがないので、自前でnginx、varnishなどでキャッシュが必要。
&lt;/code&gt;&lt;/pre&gt;</content:encoded>
    </item>
    
    <item>
      <title>AWS ビッグデータ活用事例セミナーに参加しました。#jawsug(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/11/10/aws-%E3%83%93%E3%83%83%E3%82%B0%E3%83%87%E3%83%BC%E3%82%BF%E6%B4%BB%E7%94%A8%E4%BA%8B%E4%BE%8B%E3%82%BB%E3%83%9F%E3%83%8A%E3%83%BC%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-jawsug/</link>
      <pubDate>Sat, 10 Nov 2012 01:07:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/11/10/aws-%E3%83%93%E3%83%83%E3%82%B0%E3%83%87%E3%83%BC%E3%82%BF%E6%B4%BB%E7%94%A8%E4%BA%8B%E4%BE%8B%E3%82%BB%E3%83%9F%E3%83%8A%E3%83%BC%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-jawsug/</guid>
      <description>&lt;p&gt;初目黒（たぶん）で、初Amazonな感じで、流行りの&lt;a href=&#34;http://peatix.com/event/7497&#34;&gt;「ビッグデータ」のセミナー&lt;/a&gt;に参加してきました。&lt;/p&gt;
&lt;p&gt;とりあえず、いつもの自分用のメモを残しておきます。
感想はまた後日。。。（たぶん、頑張れ私。。。）&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;初目黒（たぶん）で、初Amazonな感じで、流行りの&lt;a href=&#34;http://peatix.com/event/7497&#34;&gt;「ビッグデータ」のセミナー&lt;/a&gt;に参加してきました。&lt;/p&gt;
&lt;p&gt;とりあえず、いつもの自分用のメモを残しておきます。
感想はまた後日。。。（たぶん、頑張れ私。。。）&lt;/p&gt;
&lt;hr&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
AWS ビッグデータ活用事例セミナー
日時：2012/11/09 [ 金 ] 9:30 - 12:00
場所：アマゾンデータサービスジャパン目黒オフィス

★AWSビッグデータ概要 @understeer　
　○Amazonの紹介
　○Amazon Web Serviceの紹介
　　・オンプレミスと比べ、初期費投資が不要
　　・コストダウンを促進
　　　過去6年で21回の値下げを実施
　　・IaaSだけじゃなく、PaaSもやってますよ。
　　・OSより上の層は好きに選べるよ。
　○AWSのサービスだけで20ある。
　○3つのV
　　Volume　　2012年で1.2ZB。95%が非構造データ。今後も非構造データが増加
　　Velocity　　デバイスの増加、パーソナライゼーション系の増加
　　Variaty
　　　素粒子のデータの解析とか、地質学、気象予報とかいろいろやってるみたい。
　○BIG DATAの4つのプロセス。
　　収集、保存、分析、共有を繰り返しやりましょう。
　そこで！AWS使いましょう。

　○収集
　　AWSへのデータアップロード
　　オンプレにあるデータをAWS（S3）にアップロード
　　・インターネット経由
　　・専用線サービス（AWS Direct Connect、1/10Gbps）も可能
　　・AWS Import/Export（HDDを送りつけてS3にアップロードしてくれる。Tokyoリージョンにはだない）
　　・インターネットVPN経由も可能
　　・EC2上のデータももちろんできる。
　　※WAN高速化ソリューションも利用可能。
　○保存
　　・AmazonS3
　　　99.999999999%の耐久性。
　　　同一リージョン内の3箇所以上のDCに自動複製
　　　容量無制限で低コスト（1G 約10円/月）
　　　
　　・Amazon Glacier

　　　データの利用準備に3.5～4.5時間かかる。
　　　S3の約1/10という低コスト
　
　○分析　
　　オンプレミスだと運用が大変。
　　・Amazon EC2
　　　スケールアップ/ダウン、アウト/インが即座に可能。ライセンス持ち込みや従量課金に対応
　　　スペックの種類が豊富（SSDとかもあるよと）
　　・Elastic MapReduce
　　　Hadoopをサポートしたの仮想サーバが簡単に用意可能。
　　　S3、Dynamoとの連携も可能
　　　ディストリビューションも選択可能（Apache、MapR）
　　　追加のアプリ（Hive、Pig、HBase）なども利用可能。
　　　ジョブの大きさに合わせてクラスタサイズを適切にすることでコスパがよくなる。
　　　→HadoopのMRのデータのローカリティとかはどうなってるんだろう？
　○共有
　　・AWS RDS
　　　MySQL、Oracle、SQLServerをサポート（PostgreSQLはないのかな？）
　　　自動バックアップ、フェイルオーバー、パッチ適用機能があるよ
　　・Amazon DynamoDB
　　　AmazonオリジナルなNoSQLデータベース。論文有るよ。
　　　運用管理は気にしなくていい。
　　　性能については客指定の性能が出せるようになる。しかも変えられるよと。
　　※データサイズに応じて以下を選択しましょう
　　　RDS、HBase on EMR、DynamoDB、S3
　　　他にもEC2上で、CassandraやmongoDB、GlusterFSを使ってる事例もありますよ。
　○以上を繰り返すのが意味があります。そこで！
　　・Simple Queue Service
　　　マネージド分散キューサービス
　　　最低1度のメッセージ到達の保証。複数DC間で複製保存
　　・Simple Workflow Service
　　　進捗などの管理も可能
　　　NASAのCURIOSITYの制御に利用？10m前進するのに10時間のバッチ処理がある。。。
　データがなくて試せない！そんなあなたに！
　○AWS Public Data Sets
　　すぐ使えるPublic Dataが用意されてるよ。
　　http://aws.amazon.com/jp/publicdatasets/

★AWSのビッグデータ事例紹介　@shot6
　○NETFLIX
　　・どんな会社？
　　　2500万人以上のストリーミング会員
　　　500億以上のイベント
　　・AWSの利用は？（保存）
　　　8TB/日のイベントデータを収集しS3に。
　　　Cassandra上の顧客データもS3に。

　　　1PB以上のデータがS3に保存。
　　・AWSの利用は？（解析）
　　　EMRでレコメンデーション、アドホック分析、パーソナライゼーションなど。
　　　本番クラスタ（ずっと動かしている）
　　　アドホック分析用クラスタ（必要に応じて構築）
　　　解析用のアルゴリズムをAPIで叩けて、ジョブとして定義されてるらしい
　　・Cassandraを使ってるよ。
　　　Cassandraのクラスタをマルチリージョンで対応したりもしてる。
　　　CassandraのBackupもやってる。OSSで公開されてる？
　　　※HBaseのものもあるよ。
　　　※AWS上のCassandra事例もいくつか広告系で出てるみたい。
　　・High I/O Instances for EC2（SSDのインスタンスまだ東京に無いらしい。）
　　・AWSスケールアウトだけでなく、スケールアップも徐々に増えています。
　○yelp

　　・どんな会社？
　　　口コミサイト。
　　　スペルミスの自動修正、検索ワード自動補完、
　　・AWSの利用は？
　　　WebサイトのログをS3に保存。
　　　EMRを利用してHadoopClusterで解析してS3に保存している。
　　　EMRは処理終了後にシャットダウンしてる。
　　・データ解析が日常になった
　○SHAZAM
　　・どんな会社？
　　　広告配信、モバイル系の配信をやってる会社。
　　　Super Bowlの広告配信でAWS、DynamoDBを利用。
　　※マイネット・ジャパンでもDynamoDBを利用している
　○CLIMATE Corporation
　　・どんな会社？
　　　天候保険の会社
　　・AWSの利用は？
　　　200TBの地質、天候データを解析して
　○THOMSON REUTERS
　　・どんな会社？
　　　情報提供の会社。データの提供が元だけど、解析した結果の情報も提供してるみたい。
　　・AWSの利用は？
　　　MarketScanという18年分の個人の医療データ（個人情報自体はないみたい）を販売する、販促ールとして利用。
　　　1500万人分の患者データを提供。

　　　マーケットの分析に使えるデータの提供。
　　　KARMASPHEREとEMRの組み合わせで、ソリューションを提供していますよと。
　　・事例
　　　1.MarketScanをS3にアップロード。
　　　2.分析官が、KARMASPHERE経由でEMRにアクセス。
　　　3.EMRにS3からデータロードされ、結果がRDS（Oracle）に保存
　　　4.RDSに他の人達もアクセスして使ってるよと。
　○RANGESPAN
　　・どんな会社？
　　　ECサイト向けのPaaSサービスを提供してるロンドンの会社。
　　・AWSの利用は？
　　　NLP、機械学習にEMRを利用？
　　　mongoDBのクラスタを構築してる。
　　※mongoDBの日本の事例としてCAがあるらしい。

★Huahin Framework活用事例 on AWS @ryu_kobayashi
　○Cassandra本とかもやられてるみたい。
　○EMRとは
　　PaaSなんだけど、中身を自分でいじれるらしい。
　　Management Consoleでは3つのバージョンが使えるが、コマンドラインからだと他にも使えるみい。
　　・HBaseはAmazonのDistributionのものだけ。
　　・EMRのメリットは？
　　　インフラの面倒を見なくていい。
　　　クラスタの立ち上げも複数あげられるので簡単。本番実行と同じ環境
　　・EMRのデメリット
　　　オンプレミスにすでにデータがあるとアップロードが大変。実際に物理HDDを送ったこともある（2,3日でAWS上にアップロードされた）
　　　外に出せないデータがあると。。。
　○EMRのTips（EMRの連載に載ってますよ！http://gihyo.jp/dev/serial/01/emr）
　　・Bootstrapを設定
　　　EMRのクラスタの起動前にメモリ設定とかHadoopの設定が可能にできる。
　　・ファイルサイズを適切に
　　　Map数=splitを決めるコード
　　　　を指定することで、処理が早くできるのかな？
　○EMRの起動には
　　いろいろあるけど、HuahinEManagerを使うと使いやすいよ？

　○Huahin Frameworkの構成
　　・Huahinの名前の由来は？
　　　社内のコードはワインの産地にするという決まり。
　　　タイの観光地Hua Hinがワインの産地。
　　・他のHadoop関連のマスコットより可愛いでしょ！？
　　・Huahin Core
　　　MRのプログラムを簡易化
　　　WritableとかSecondary Sortとか書かなくていい
　　　考え方がSQL寄り
　　　素のMRも書ける。Pig、Hiveだとパフォーマンスが難しい
　　　Huahin UnitというMRUnitをラップしたものもある
　　・Huahin Tools
　　　汎用的な処理を集めたツール群だけど、Apache Logの成形のみ。
　　　オンプレミスHadoop、スタンドアロン環境でも動かせるようになってる。
　　・Huahin Manager
　　　Jobを管理するマネージャ
　　　　Jobの実行

　　　　　キューを持ってるので、複数の実行が可能だよ。
　　　EMR対応してる。bootstrapに設定するとできるらしい。
　　・Huahin EManager
　　　　EMRのいろいろが管理できるみたい。
　　　　初期設定20までしかインスタンスが挙げられない上限があるらしいので気をつけましょうと。
　　　　キュー登録のPOST機能は便利そうだ。（EMR触る機会まだまだないけど。。。）
　　　EMRにはJobのkillがない→Job FlowをターミネートすればOK→実際にはEMRのマスタノードにSSHすればできるよ。→めんどくさいよね。。。
　　　EManagerなら可能ですよと。これは必須だよなぁ。
&lt;/code&gt;&lt;/pre&gt;</content:encoded>
    </item>
    
    <item>
      <title>Lucene/Solr 4.0.0リリース＆lucene-gosenの4.0対応(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/10/12/lucene-solr-4-0-0%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9lucene-gosen%E3%81%AE4-0%E5%AF%BE%E5%BF%9C/</link>
      <pubDate>Fri, 12 Oct 2012 17:45:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/10/12/lucene-solr-4-0-0%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9lucene-gosen%E3%81%AE4-0%E5%AF%BE%E5%BF%9C/</guid>
      <description>&lt;p&gt;##Lucene/Solr 4.0.0リリース
ついに、Lucene/Solr4.0.0がリリースされました。
MLで流れていましたが、3年越しのリリースだったようです。
コミッターの方々、JIRAにバグ報告をした方々、お疲れ様でした。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;##Lucene/Solr 4.0.0リリース
ついに、Lucene/Solr4.0.0がリリースされました。
MLで流れていましたが、3年越しのリリースだったようです。
コミッターの方々、JIRAにバグ報告をした方々、お疲れ様でした。&lt;/p&gt;
&lt;p&gt;ということで、ちょっと忙しくなりそうです。。。
4.0の機能を調べたりもしたいですし、すこしずつ紹介もしたいです。&lt;/p&gt;
&lt;p&gt;本家サイトのニュースは&lt;a href=&#34;http://lucene.apache.org/solr/solrnews.html&#34;&gt;こちら&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;##lucene-gosenの4.0対応版について
lucene-gosenも4.0正式版のjarを利用したバージョンを公開する予定です。
branches/4xでは、すでに作業を行なっており、jarファイルの差し替えは終了しています。
お急ぎの方は、branches/4xをエクスポートして、ビルドしていただくと利用可能となっています。
なお、Lucene/Solrのバージョンが上がっているため、lucene-gosenのメジャーバージョンも変更し、lucene-gosen-4.0.0としてリリース&lt;del&gt;する予定です&lt;/del&gt;しました。。（順当に行けば、3.0.0ですが、Luceneのメジャーバージョンに合わせたほうがわかりやすいかと思いまして。）
また、現在、trunkが3.6.x対応のソースになっていますが、このあと、現在のbranches/4xのソースをtrunkにする予定です。
3.6.x対応のlucene-gosenについては、branches/lucene-gosen-rel2.0にて作業を行うこととなります。
今後は注意してチェックアウトするようにお願いいたします。&lt;/p&gt;
&lt;p&gt;ということで、&lt;a href=&#34;http://code.google.com/p/lucene-gosen/downloads/list&#34;&gt;ダウンロードできるようにしました。&lt;/a&gt;
lcuene-gosen-4.0.0*.jarとついているものがLucene/Solr 4.0.0に対応したライブラリになります。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>LucidのGrant Ingersollさんの講演を聞いてきました(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/09/26/lucid%E3%81%AEgrant-ingersoll%E3%81%95%E3%82%93%E3%81%AE%E8%AC%9B%E6%BC%94%E3%82%92%E8%81%9E%E3%81%84%E3%81%A6%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Wed, 26 Sep 2012 18:08:12 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/09/26/lucid%E3%81%AEgrant-ingersoll%E3%81%95%E3%82%93%E3%81%AE%E8%AC%9B%E6%BC%94%E3%82%92%E8%81%9E%E3%81%84%E3%81%A6%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://itmedia.smartseminar.jp/public/seminar/view/434&#34;&gt;このイベント&lt;/a&gt;にウチダスペクトラムの枠でMahoutのコミッターである、Grant Ingersollさんが講演されるということで、興味があったので聞いて来ました。
（この枠だけ）&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.lucidworks.com&#34;&gt;LucidWorks社&lt;/a&gt;が現在展開している、LucidWorks BigDataの概要とコンセプトといった話の内容でしょうか。
LucidWorks社（元Lucid Imagination）はLucene/Solrのコミッターの方々が多く在籍している会社です。
検索システムに関するノウハウを元に、発見や解析といった部分にニーズが広がってきているという話の
ざっくりした概要のはなしでした。
検索システムを中核にして、ログや検索で提供しているデータの解析などの重要そうなポイントが散りばめられて
いるお話でした。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://itmedia.smartseminar.jp/public/seminar/view/434&#34;&gt;このイベント&lt;/a&gt;にウチダスペクトラムの枠でMahoutのコミッターである、Grant Ingersollさんが講演されるということで、興味があったので聞いて来ました。
（この枠だけ）&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.lucidworks.com&#34;&gt;LucidWorks社&lt;/a&gt;が現在展開している、LucidWorks BigDataの概要とコンセプトといった話の内容でしょうか。
LucidWorks社（元Lucid Imagination）はLucene/Solrのコミッターの方々が多く在籍している会社です。
検索システムに関するノウハウを元に、発見や解析といった部分にニーズが広がってきているという話の
ざっくりした概要のはなしでした。
検索システムを中核にして、ログや検索で提供しているデータの解析などの重要そうなポイントが散りばめられて
いるお話でした。&lt;/p&gt;
&lt;p&gt;もっと詳しい話を聞きたいなぁ。&lt;/p&gt;
&lt;p&gt;講演では日本語の資料でしたが、サイトに英語の資料がアップされているとのことでした。
原文が読めるのは非常に助かります。他のイベントなどでもこのように英語の資料も見れるようになると嬉しいです。&lt;/p&gt;
&lt;p&gt;以下は、いつものメモになります。&lt;/p&gt;
&lt;hr&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
場所：富士ソフト　アキバプラザ5Fホール
日時：16:10-

◯サーチ技術による情報の可視化
　通常、検索と言うとWebサーチだけど、ウチダスペクトラムのやっている部分はエンタープライズ向け
　ナイスガイ＝Grant S. Ingersollという紹介
◯サーチからSDAへ
　LuceneやSolrのお陰で、検索自体は簡単になってきている。
◯サーチの進化
　ユーザとデータを結びつける意味での検索の進化が必要
　ユーザインタラクションや、アクセスの方法とか
◯SDA
　Search, Discovery and Analytics
　・ユーザからのニーズ
　　検索、優先順序付け、新たな気づき、フィードバックによる学習
　・ビジネスからのニーズ
　　ナレッジの有効活用
◯ユーザ事例
　保険会社での請求に関する不正利用分析を含んだクレーム処理と分析
◯事例：個人に最適化された医薬品
　DNAをベースに検索やファセットで医薬品を検索したり。
◯事例：通信会社における通話記録処理
　ログを元に検索して、不正通話などを解析
◯SDA基盤に必要な要素
　高速で拡張性のある、検索
　大規模でのコスト効率が高いストレージと処理
　NLPとMLにより解析などが向上
◯SDAのアーキテクチャ
　基盤
　　LucidWorks Search、Hadoop、HBase、ApachePig、Mahout、
　NLP、
　管理
　　Zookeeper
　インフラ
　　ZABBIX、AWS、Chef
　データの流し込み
　　Twitterからのデータとか
◯検索部分にフォーカス
　・LucidWorks Search
　　SolrCloudによる簡単なshard処理
　・Hadoop
　　ログ、生データ、中間ファイルの保存
　　WebHDFS
　　小さなファイルには向いていない
　・HBase
　　メトリック、ユーザ履歴などのストレージ
　課題
　　どこに正式に保存する？
　　リアルタイム処理 vs バッチ処理
　　分析はどこで行われるべきか？
◯検索の実装に関連すること
　3つのポイント
　　性能と拡張性
　　関連性
　　オペレーション（モニタリング、フェイルオーバーなど）
　ビジネス側では検索結果の適合性を重要視する
　開発側は性能を重視する傾向がある。
◯適合性に関して
　テストが重要。
　クエリ、クリック、表示したドキュメントなど、すべて保存すべき！
◯Discoveryにフォーカス
◯MahoutによるDiscovery
　3つのC
　・協調フィルタリング
　・クラシフィケーション
　・クラスタリング
　追加事項
　課題
　　収束を伴う計算コストの高い機械学習アルゴリズム
　　Mahout
◯余談：Experiment Management
◯Analyticsにフォーカス
　Rとか、うまく活用
　検索エンジン自体でもできることがある。ファセット、TF、DF/IDF
　SearchとDiscoveryの定量化
　　ログ、ナビゲーション分析
&lt;/code&gt;&lt;/pre&gt;</content:encoded>
    </item>
    
    <item>
      <title>PFIオープンセミナー2012に参加してきました。 #pfiopen2012(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/09/21/pfi%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BB%E3%83%9F%E3%83%8A%E3%83%BC2012%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%A6%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F--pfiopen2012/</link>
      <pubDate>Fri, 21 Sep 2012 17:05:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/09/21/pfi%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BB%E3%83%9F%E3%83%8A%E3%83%BC2012%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%A6%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F--pfiopen2012/</guid>
      <description>&lt;p&gt;PFIオープンセミナー2012に参加してきました。
対象から微妙に外れてたり、話の内容についていけるか自信がありませんでしたが、参加してきました。
PFIさんは前から面白そうなことやってる会社だなぁと思っていたので。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;PFIオープンセミナー2012に参加してきました。
対象から微妙に外れてたり、話の内容についていけるか自信がありませんでしたが、参加してきました。
PFIさんは前から面白そうなことやってる会社だなぁと思っていたので。&lt;/p&gt;
&lt;p&gt;面白い話がいっぱい聞けました。
&lt;del&gt;電池が切れそうなので、とりあえず、まずはメモをアップしときます。&lt;/del&gt;
かろうじてついていけたという感じですが。
丸山先生の話はアーキテクチャの話に入る前のビッグデータの光と影の話がよかったです。
ビッグデータと言っても、まずは、サンプリングなどで小さなデータで処理できるかもしれないと考えるのも必要なのでは？という話や、相関があるからといって、因果が有るわけではないとか、おそらく、統計やってる人や、数学やってる人にしてみれば、当たり前の事なんでしょうが、その部分に警鐘を鳴らす話が聞けたのは良かったです。
もちろん、ビッグデータでなければ意味が無い解析などもありますという話もきちんと出ていました。&lt;/p&gt;
&lt;p&gt;伊藤さんの話は、Screwと呼ばれる、多言語解析基盤のお話です。その前にSedueの紹介で、SolrとSedueの比較の話も出ていました。（若干、強引な感じもしましたが。。。）
多言語解析基盤は、Solrでも少し入ってきています。ただ、それよりも汎用的な作りになるようなので、今後Solrと組み合わせて使うといったことも可能になるかもしれません。
まだ、対応言語などが少ないので今後に期待という感じでしょうか。
複数の言語が混ざった時の挙動がどうなるのかや、身近な文章での言語判定の正確さは少し気になります。&lt;/p&gt;
&lt;p&gt;サイバーセキュリティの話も面白かったのですが、話が多岐にわたるのと、スライドの情報量の多さに少しついていけませんでした。
資料が公開されたら、もう一度見直したいかなぁと。&lt;/p&gt;
&lt;p&gt;比戸さんの話は、Jubatusと関連のある話でした。機械学習の実際の利用の話が特に興味深かったです。
最近になって、ようやく、実際のデータを利用した話が出てきているみたいで、もっと事例が出てくると機械学習も身近になりそうだなぁと。&lt;/p&gt;
&lt;p&gt;最後は、日経BPの中田さんの話でした。これが、一番想像していたものと内容が違って、驚きつつ、楽しめた話でした。
ビッグデータというバズワードがいかにして生まれたのかがよく分かりました。
私は、バズワードだなぁと思う程度だったのですが、出てきた背景にある程度意味があるという考察に感心して聞き入ってしまいました。&lt;/p&gt;
&lt;p&gt;ということで、思っていたよりも話の内容についていけたので、講演された方々の話しのされ方が良かっただと思います。&lt;/p&gt;
&lt;p&gt;少し無理をして参加してよかったと。&lt;/p&gt;
&lt;p&gt;残念だったのは、会場が地下だったため、携帯が入らなかったことでしょうか。
私はe-mobileで接続していたので大丈夫でしたが、docomoの携帯は圏外でした。
ツイートがもう少し盛り上がれば、もっと質問も出たのかもしれないです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://preferred.jp/news/seminar/&#34;&gt;http://preferred.jp/news/seminar/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;資料が公開されたので、リンクを貼っておきます。
PFIの方たちの資料へのリンク：
&lt;a href=&#34;http://preferred.jp/news/?id=1139&#34;&gt;http://preferred.jp/news/?id=1139&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ゲスト講師の資料へのリンク：
&lt;a href=&#34;http://preferred.jp/news/?id=1159&#34;&gt;http://preferred.jp/news/?id=1159&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
◯「多様化する情報を支える技術」　講師：西川徹（株式会社プリファードインフラストラクチャー　代表取締役）
　・PFIの説明
　　VCに頼らない。製品につながるビジネスにこだわる（受託開発しない）、技術の多様性を重視
　・PFIの技術領域、ビジネス
　　製品開発（Sedue/Bazil/Jubatus）、自然言語処理、機械学習、分散システムなど
　・”人”が生み出すデータと&amp;#34;機械&amp;#34;が生み出すデータ
　　ビッグデータの発端はGoogleが元じゃないか？→最後の公演で解説があるよ
　　人：質が高いけど、量が少ない
　　機械：質は低いけど、量が多い
　・検索システムについてのお話
　　社内の資料とか情報が、人によって、まちまちなデータの保存（形式、場所など）が実施されてしまう。
　　情報検索技術と大規模データ
　・人のデータへ必要なアプローチ
　　より検索システムを活用してもらうために、楽に整理できる仕組みなどをどう提供するか
　　質の高いデータなのに、形式的な共有しかできていないのはもったいない
　・機械のデータへ必要なアプローチ

　　大量データと高度な解析が重要（CEPとか）
　　デバイスが性能向上→流れてくるデータが大量に→蓄積するだけでも問題になってくる
　　　→蓄積したデータを扱うだけでも処理コストが高くなる
　　分析をオンライン化、ストリーム化すること→Jubatusで貯めずに高度な解析をしましょう。
　　Edge-Heavyになりつつある。　　

◯「ITアーキテクチャはどこへ向かうのか」
　講師：丸山宏氏（統計数理研究所　副所長　モデリング研究系教授　工学博士）
　・ビッグデータの光と影
　　「その数学が戦略を決める」という本がオススメ
　　・大量データでも、ランダムサンプリングでとければ、ビッグデータじゃなくてもいいよね。
　　　もちろん、ランダムサンプリングだけじゃダメな場合もある。
　　・Hadoopが解ける問題領域って少ないのでは。
　　・TVを見る時間が長い人ほど、方言の使用率が高い
　　　因果関係と相関関係の違いをきちんと理解しましょう。
　　・データをきちんと理解して意思決定などをしたほうがいいよと。
　・つぎのアーキテクチャは何か？
　　・コンピュータ・アーキテクチャの歴史
　　　ConnetionMachine CM-1（1985）
　　　SPARC
　　　Transputer（CSPによる並列性、Occam）
　　　SymbolicsLispMachine
　　　Intelアーキテクチャの台頭により、アーキテクチャの研究が廃れてくる
　　・クラサバ、スマホ・クラウドなどのアーキテクチャの話
　　・じゃあつぎは？
　　　Edge-Heay Data＝スマホなどデータが保存される場所がEdgeになりつつある
　　　ビッグデータのほとんどが廃棄されるデータ
　　・Edge-Heavy Dataに特化したアーキテクチャとは？
　　　分散マッチング・プロトコル→サマリ情報を交換することで、絞り込みが可能
　　　X=3とした場合、センサーとかなら、ピンポイントな値ではなく、範囲では。
　　　分布表現を1stクラスオブジェクトとするプログラミング言語が必要では？
　・アーキテクチャの変節点を見極めよう
　QA：
　　Q：スパースネス問題がランダムサンプリングやフィルタリングじゃ解けないんでは？
　　A：はい。ただ、その前にやることがあるはずですよねという注意喚起の意味での発表です。

　　価値に応じて、EdgeにあるデータをCenterに持ってくるという考え方が必要。
　　今は価値が見いだせないのなら、Centerにまで持ってこなくてもいいのでは。

◯「グローバル化する情報処理」
　講師：伊藤敬彦（株式会社プリファードインフラストラクチャー 研究開発部門　リサーチャー）
　・Sedueの説明
　　NHKニュースなどで
　・提供する機能
　　・検索補助
　　　レコメンド、サジェストなど
　・レコメンド機能の紹介
　・Sedue/Solrの比較
　　サポート体制：開発チームがサポートしてくれる
　　安定性：GCがないのがいい
　　付加機能：
　　検索の完全性：接尾辞配列による検索

　・多言語処理の話
　　・翻訳ではなく、任意の自然言語言語で動作・精度を向上させる処理の話。
　　・背景
　　　サービスのグローバル化、会社組織のグローバル化
　　・複数言語を扱う場合の難しさ
　　　多言語解析基盤Screwの開発。
　　　1.必要な処理を順番に適用する
　　　　処理の順序は設定で。出力はJSONで。
　　　　例：言語同定、単語分割、単語正規化
　　　　　→言語同定処理で
　　　2.言語ごとに必要な処理を適用
　・疑問
　　ScrewはSolrとの組み合わせもできる？
　　複数言語が混ざった文章の場合にどういう形で動作する？
　　言語判定は独自実装？
　
◯「BigData処理技術とサイバーセキュリティ」→題名変更されてた
　講師：桑名栄二氏（NTTセキュアプラットフォーム研究所　所長）
　・経歴
　　Jubatusプロジェクト立ち上げに参画
　・攻撃に関する話
　　原因のわかっていないケースが多い。
　・端末の初期設定のパスワードとかが狙われるケースも多い
　・変化する攻撃、変化するシステム・サービス、変化するデータ
　・マルウェアの分類にJubatus
　・不正IPアドレスを機械学習して
　・ABC
　　「あたりまえ」のことを「ばかみたいに」「ちゃんとやる」

◯「先進ビッグデータ応用を支える機械学習に求められる新技術」
　講師：比戸将平（株式会社プリファードインフラストラクチャー　研究開発部門　リサーチャー）
　・ビッグデータ分析はより深い地検を得られるビッグデータ「解析」へ
　　・ビッグデータ分析プロセス
　　　　Volume、Variety、Velocity
　　　　蓄積（NoSQL系）、分析（CEP）、両方やるのがHadoop
　　・分析から深い解析へ
　　　予測、カテゴリ分類、レコメンド、異常検知　
　　　これを機械学習で解決する方向で
　　・機械学習を応用している例
　　　クレジットカードの不正利用検知：FICO
　　　ネットワーク攻撃/侵入検出
　　　Jeopardy!でクイズ王に勝利
　　　医療診断支援

　・データ解析技術への過度な期待と現実とのギャップ
　　いろいろできるみたいだけど、何が必要？
　　・ビッグデータ処理系を使える人
　　・データサイエンティスト
　　・機械学習ツール

　・ビッグデータ処理系での機械学習への対応状況
　　Hadoop本体（YARN）
　　MapReduce系（Mahout、AllReduce or Vowpal Wabbit、SystemML）
　　非MapReduce系（Spark）
　　・機械学習からビッグデータへの歩み寄り
　　　ベンチマーク性能への固執とか、応用との乖離を批判する論文もあるらしい。
　　・機械学習の応用例
　　　Machine Lerning for the New York City Power Grid[Rudin et al., TPAMI, 2012]
　　　電力配電設備の障害予測・検知
　　　実データを用いた例が今後増えていくのでは。
　・今後重要になる技術とPFIの取り組み
　　・データ解析の敷居を下げるためのトレーサビリティ
　　　機械学習向けスクリプト言語は敷居が高い
　　　WekaやSPSSのようなアイコンベースのデータ処理プロセスの記述は前処理には強力だけど、機械学習とは相性が良くない
　　　結果が見える化部分との統合が不十分。
　　・Bazil Farm学習結果分析例
　　　Tweet年齢推定、Tweet性別推定

◯「“ビッグデータ”が話題になった理由」
　講師：中田敦氏（株式会社日経BP社　記者）
　・自己紹介
　・バズワードができるまで
　　まずは、「クラウド」のバズワードの歴史
　　「バズワードはIT企業やThe Economist誌の煽りでなく一般企業の経営陣が納得すると生まれる」
　・なぜ経営者がビッグデータに興味を？
　　「ザ・クオンツ」という書籍に金融業界のルールの変化が書かれてる。面白いよ。
　　Google/Amazonに対する警戒心から。
　　破壊的な新規産業者へ対抗して行かないといけない思うところからビッグデータが流行ってるのでは。
　　「買ってきたIT」は差別化要因にならないのでは？→自分で作ったITなら差別化できる。
　・競争力は自分で作るしか無い
　　日本のとある特殊事情
　　ITエンジニアの所属先が日米で割合がぜんぜん違う。米国はユーザ企業が75%、日本は25%くらい
　・ビッグデータの次はなに？
　　3次元プリンタがあれば、好きなモノが作れちゃう。＝消費地の近くで作成しちゃえば良くなるのでは。
&lt;/code&gt;&lt;/pre&gt;</content:encoded>
    </item>
    
    <item>
      <title>メインMBAをMountain Lionにアップデート（いろいろ確認中）(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/09/03/%E3%83%A1%E3%82%A4%E3%83%B3mba%E3%82%92mountain-lion%E3%81%AB%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%81%84%E3%82%8D%E3%81%84%E3%82%8D%E7%A2%BA%E8%AA%8D%E4%B8%AD/</link>
      <pubDate>Mon, 03 Sep 2012 14:34:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/09/03/%E3%83%A1%E3%82%A4%E3%83%B3mba%E3%82%92mountain-lion%E3%81%AB%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%81%84%E3%82%8D%E3%81%84%E3%82%8D%E7%A2%BA%E8%AA%8D%E4%B8%AD/</guid>
      <description>&lt;p&gt;友人にお値打価格で購入したMac miniはMountain Lionにアップデートしてたのですが、手元のAirはまだアップデートしていませんでした。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;友人にお値打価格で購入したMac miniはMountain Lionにアップデートしてたのですが、手元のAirはまだアップデートしていませんでした。&lt;/p&gt;
&lt;p&gt;夏休み中にバックアップ＋アップデートをしてしまおうと思いMountain Lionにアップデートはしていたのですが、
本格的に触り始めると色々と動かないものがあったので、備忘録としてブログを書いておきます。
（まだ途中ですが。）&lt;/p&gt;
&lt;div&gt;
###1.Eclipseが起動しない
Java6が未インストール状態になったみたいで、Eclipseを起動すると、Java6をインストールしなさいと言われました。
で、私の記憶が確かなら、前はJavaコマンドを実行するとインストールされたんですが、ターミナルでjavaコマンドを実行するとjavaはすでにインストールされてる模様。。。
あれ？と思い、-versionを実行すると、JDK7u4と出るじゃないですか。
どうやら、Java7u4は別途入れてたものが残ってる模様。
さて、どーする？ということで、ツイートしたりぐぐってみて、「Java Preferences」なる設定用のアプリ？が有ることに気づき、とりあえず開いてみたらJava6ないからインストールしたら？と言われました。
結果オーライということで、インストール開始。
無事、インストールも終了。Eclipseも起動しました。（ただし、今度はMercurialのプラグインがPythonのライブラリが無いとエラーを出すことに）
&lt;/div&gt;
&lt;div&gt;
###2.Xcodeが起動しない。
使ってはいないんですが、Javaの件を調べるのに、起動したらLionじゃないと駄目だよと。
ということで、Xcodeもインストールしなおし。
&lt;/div&gt;
&lt;div&gt;
###3. homebrewが動かない
1.で書いた方法で、Eclipse自体は起動したんですが、Mercurialのプラグインがエラーを吐き始めました。
で、見てみると、hgコマンドを実行しようとしてなんか、壊れていると。
で、hgコマンドってどうやってインストールしたか思い出さないまま、とりあえず、homebrewだっけ？と勘違いしたまま、「brew update」を実行したらエラーがでて、「brew install git」でしょ？って言われてしまいました。
コメントにもいただいていたように、Xcodeをインストールしたのだが、コマンドラインツールが入ってないというのが影響しているみたいです。。。
で、ググってみると、こんな情報が。[http://labs.torques.jp/2012/07/04/2830/](http://labs.torques.jp/2012/07/04/2830/)
ただ、そこに有るようにPreferenceのダウンロードを開いてもなーんにも表示されません。
で、更にググってこちらの情報に。[http://qiita.com/items/9dd797f42e7bea674705](http://qiita.com/items/9dd797f42e7bea674705)（なんだか、TLで見かける人のお名前が！）
AppleのDeveloperサイトからダウンロードかぁと思いつつダウンロード用のリンクを踏んだら、アカウント登録しろとのページが。。。
なかなか遠い道のりですね。。。
Appleのアカウント自体は持ってるので、Developerへの追加登録なんですが、日本語が文字化けしまくりの確認ページが出る始末。
もう、めんどくさいので、そのまま登録しちゃいました。
で、ダウンロードする前にもう一回XcodeのPreference見てみたらなんか、ダウンロードする候補が出てきてるじゃないですか！
結局、XcodeのPereference画面からダウンロードすることにしました。
AppleのDeveloperに登録したからなのか、Xcodeのプロジェクトを作ろうとしてXcodeをきちんと起動したからなのかは結局わかっていません。。。
良くないよなぁ。（ご存知の方いたらコメントもらえると嬉しいです。）
で、やっと「homebrew」を入れようかなぁと。
一応その前に「sudo brew update」ってやってみたらどうなる？と挑戦したら今度は動きました。
homebrewが何を判断してinstallでしょ？って言ってたのかもわかっていませんが、updateで良かったみたいです。
&lt;p&gt;ついでに、upgradeもしときました。（こっちは後からインストールしたもののバージョンが上がってるものがあったら更新してくれるコマンドかなぁ？）&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
###4. pipの更新
ただ、brewをupdateしても相変わらず、EclipseのMercurialのPluginはエラーを出してました。
で、ターミナルからhgコマンドを実行してみたら同じエラーが。まぁ、そうですよね。
エラーメッセージを頼りにこれまたググってみたら、同じ状況のひとがいました。[https://groups.google.com/forum/#!msg/mercurial-ja/MxY6lejLXxo/OgJA_knXV6cJ](https://groups.google.com/forum/#!msg/mercurial-ja/MxY6lejLXxo/OgJA_knXV6cJ)（ここにもTLでお世話になってる方のお名前が！！）
で、書いてあるように「とりあえず pip install mercurial で解決しました. 」ということで、コマンドを実行して見ることに。
これが、また失敗します。。。（日頃の行いが悪い？？てか、日頃MBAをメンテできてないのが悪いのか。。。）
そういえば、過去のMBAセットアップのメモを残してたなぁと思い出して「johtani mercurial」でググってみるとちゃんと[書いてある](http://johtani.jugem.jp/?eid=34)じゃないですかー（偉いぞ、自分）
ということで、「sudo easy_install pip」でpipを更新してから「sudo pip install Mercurial」で無事、hgコマンドもインストールし直せました。
Eclipseを起動してもエラーが出ない。（まだbitbucketに接続確認まではできてないですが。。。眠さに勝てず寝てしまいました。）
&lt;/div&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Fluentd meetup in Japan #2 #fluentd に参加しました。(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/08/23/fluentd-meetup-in-japan--2--fluentd-%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Thu, 23 Aug 2012 02:40:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/08/23/fluentd-meetup-in-japan--2--fluentd-%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;興味をもちつつ、触っていない軟弱者ですが、興味があるので今回も話を聞きに行って来ました。&lt;/p&gt;
&lt;p&gt;まずは、作者古橋さんによるFluentdの魅力や次期バージョンのお話。
あいかわらずわかりやすいスライドで話もわかりやすくてよかったです。
どうしても実績という点を懸念事項として上げる人が多いというアンケートを元に、各社が使ってるし導入もしやすいですというお話。
ここまでしてもらってるのに触ってないなんてほんと申し訳ないです。。。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;興味をもちつつ、触っていない軟弱者ですが、興味があるので今回も話を聞きに行って来ました。&lt;/p&gt;
&lt;p&gt;まずは、作者古橋さんによるFluentdの魅力や次期バージョンのお話。
あいかわらずわかりやすいスライドで話もわかりやすくてよかったです。
どうしても実績という点を懸念事項として上げる人が多いというアンケートを元に、各社が使ってるし導入もしやすいですというお話。
ここまでしてもらってるのに触ってないなんてほんと申し訳ないです。。。&lt;/p&gt;
&lt;p&gt;次は楽天の方によるCloud Foundryのログの問題点解消のためのFluentd導入のお話。
EC2でもそうですが、ファイルが永続化されない？のでログが消えてしまうという問題があるので、
集約しましょうと。
いままでとは少し違う問題点からの話でした。&lt;/p&gt;
&lt;p&gt;次はドリコムの方（浴衣？甚平？でかっこ良く発表）のIDCをまたいだFluentdの活用と、Fluentd自体の監視などについてのお話。
実際にログが増殖して苦労された点を解決するために考えられた監視項目など、あとで見返したくなる資料でした。
実際に試行錯誤されたあとの話はやはりありがたいです。
あと、お子さんが可愛かったｗ&lt;/p&gt;
&lt;p&gt;つぎのCROOZの方のPCがWindowsだったため（？）プロジェクターに繋がらず、急遽QAタイム。
このあたりの@doryokujinの話のつなぎの旨さとかほんとすごいなぁと感心します。&lt;/p&gt;
&lt;p&gt;で、Macに乗り換えてCROOZの方の発表。
Fluentd＋TreasureDataのお話。少人数（というか一人？）でも簡単にログ収集の仕組みが作れて、しかも保存先のサーバを用意せずに簡単な解析もできるというお話。
これは、ちょっとやってみようと思う人（少なくとも、私はやろうと思った）が増えたんじゃないかなぁという発表でした。
スライドがなぜか最後のほうが見えなくなってしまったので、第３回でも発表されるということになってましたｗ
最後は新大阪から文字通り駆けつけた玉川さんのHBase本＋そのた今後の翻訳本の紹介。
つぎはHiveの本も出てくるみたいでした。
日本語の資料ってホント助かります。購入しないと翻訳本が出る機会もないみたいなので皆さん買ってくださいとのこと。
HBaseはまだ触りそうにないから９月に出るAWSの本でも買おうかなぁ。
あ、日本語で解説してある&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4774141755/johtani-22/ref=nosim/&#34;&gt;Solrの本&lt;/a&gt;もあるので是非買ってください！&lt;/p&gt;
&lt;p&gt;その後は懇親会でした。今回もTL上でズケズケと私が勝手に絡んでいる方たちにリアルにお会いできたので楽しかったです。&lt;/p&gt;
&lt;p&gt;自分もフロントよりも、バックエンドに興味があるし、実際に運用されてる人の話が多く聞けるので次回も参加したいです。
それまでにどこかで触るかplugin作るかしないとなぁ。&lt;/p&gt;
&lt;p&gt;ということで、以下はいつもの適当メモです。&lt;/p&gt;
&lt;hr&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
開催日時：2012/08/22 18:00  ～  22:00
場所：グリー株式会社 14F セミナールームYosemite

◎「Fluentdの現在と未来」　Treasure Data, Inc.　古橋　貞之 (@frsyuki)
　◯アンケートの内訳
　◯ドキュメント欲しい？
　　※思ったより日本語のドキュメントじゃなくてもよさそうだった。
　◯loggingってなんでいるの？
　　いろいろな解析ってあるよね。
　◯ログの集約、保存、などの問題点について
　　フォーマットが混在
　　集約するのもいろんなスクリプトが混在
　◯メリット
　　・プラグインアーキテクチャ
　　　in/outに合わせてプラグインが用意/開発可能
　　・フォーマットがJSON
　　　アプリでの解析が楽
　　・HA構成が可能
　◯実績がない？→
　　誰が使ってる？
　　　COOKPADとか、NHNとか
　◯次期バージョンの構想
　　・設定ファイルで色々とらくできるよ。
　　・MessagePackのv5に対応
　　・td-agent-lite
　　などなど

　◯QA
　　Q：時刻にミリ秒を持つことは可能？
　　A：互換性も気になりますが、検討します。
　　Q：JSONで構造化が売りだが、Flumeとかはテキストだけど、テキスト
　　A：ログのパース時にやるというスタンス。
　　Q：日本語ドキュメントがやっぱり欲しい。手伝います！
　　A：別ブランチで翻訳しながら公開して欲しいし、バラバラにやるよりいいので。
　　Q：Windowsでも動かしたいけど、cool.ioの移植とか考えてないですか。
　　A：次期で、fluentdのコアからはcool.ioを外す予定です。

◎「Logging Infrastructure in PaaS by Fluentd」　Rakuten, Inc.　Yohei Sasaki (@yssk22), Waldemar Quevedo (@wallyqs)

　◯Cloud Foundryの説明
　◯Cloud Foundryの問題点
　　解析しようにもログが消えてしまう。。。
　　なので、Fluentdでログを集める仕組みを作ったよと。
　これかな？ https://github.com/rakutentech/dea/
◎「Fluentdを優しく見守る監視事例」　株式会社ドリコム　外道父 ( @GedowFather )
　◯概要：
　　Fluentdをより穏やかに安定稼働させるための監視項目と自動処理について。また，その実運用における障害例なども紹介したいと思います。
　◯目次
　◯動作環境
　　・IDCもバラバラな環境のログを一箇所に集約。
　　　グローバルなネットで、圧縮、暗号化し、VPN使ってない
　　・tailのプラグインを改良して利用
　　　copy、flow counterを利用
　　　forwardも改良
　　Flume OGとは比較にならないし、FlumeNGはOGと全然違うから論外だった。
　◯ローカル監視
　　・monit使って監視してる。
　　ログを記録してるか、内容が正しいか
　　td-agentが正しく起動してるか、Collectorに送っているか
　　　重複起動してないかとか、起動してるかとか。
　　　※重複起動でログが増えてた（@mazgi濡れ衣事件）
　　HDFSに送ってるか、保存されてるか
　　
　◯リモート監視
　　アラート/グラフ作成の集約
　　状態の可視化
　　Collectorのキャパシティ管理
　　Agentにキャパシティの心配はほぼないが、Collectorは足りなくなる可能性がある。
　◯野望
　　CollectorでAgentを把握したい
　
　◯QA
　　Q：圧縮はどうやって？
　　A：forwardを改造してやっている。

◎QAタイム
　Q：秒間どのくらい出るの？
　A；秒間8000メッセージくらいらしい。
　Q：ハートビートの取りこぼしは？
　A：案1：UDPじゃなくて、TCPにする。案２：TCP接続してたらハートビートのカウントとしてしまう。
　Q：CollectorのCPUに影響があるのってなに？
　A：ロックがCPUを食う＝ロックが影響→リクエスト量を減らす
　Q：Windows対応はいつ？（発生源がWindows）
　A：td-agent-liteをWindows対応にしたいと思ってる。
　Q：F#の実装とかテストは？
　A：性能値の測定までは行ってない。メッセージが送れたなぁくらい。
　Q：設定のDSL化はv11ではなくなったの？
　A：ホスト名は入れたい。設定はやっぱり設定だけにしたい（プログラムは入れたくない）
　　　プラグイン側がDSL対応してればDSLできるようなものは入れようかと思ってるが、
　　　DSLは延期したい。
　A（tagomoris）：DSL化したいパターンが幾つかに絞れるなぁと思ってて、それに合わせたプラグインをいくつか作ってるよー。

◎「Fluentd &amp;amp; Treasure Data でこっそり始めるログ集計」　CROOZ 株式会社　池田 朋大（ @mikeda ）
　◯概要：
　　FluentdとTreasureDataプラットフォームを使って、1インフラエンジニアが勢いでログ集計システムを作ってみたお話です
　◯アクセスログ、エラーログ、メールログ（試験中）を集めてる。
　◯TreasureData
　　500Gまで無料なのかー。
　◯ダマで入れてもばれないぞ！
　◯最後は心の目で見えるスライドでした。

◎祝・O&amp;#39;Reilly HBase 訳本発売。訳者本人によるPR。　Sky株式会社 玉川 竜司　※ O&amp;#39;Reillyの新刊「HBase 」　http://www.oreilly.co.jp/books/9784873115665/


◎懇親会
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;そういえば、ステッカーもらったのでアンケート書きましたｗ


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20120823/20120823_2440232.jpg&#34; alt=&#34;Fluentdステッカー&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20120823/20120823_2440232.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Twitter 勉強会 #twtr_hack に参加しました。(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/08/02/twitter-%E5%8B%89%E5%BC%B7%E4%BC%9A--twtr_hack-%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Thu, 02 Aug 2012 11:50:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/08/02/twitter-%E5%8B%89%E5%BC%B7%E4%BC%9A--twtr_hack-%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;またまた&lt;del&gt;飲みに行って&lt;/del&gt;参加してきました。
今回は、Rails、iOSでのTwitter連携の話から、ツイート分析、クライアントアプリの開発の苦労？楽しい話と、
幅広い話題でこれまた面白かったです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;またまた&lt;del&gt;飲みに行って&lt;/del&gt;参加してきました。
今回は、Rails、iOSでのTwitter連携の話から、ツイート分析、クライアントアプリの開発の苦労？楽しい話と、
幅広い話題でこれまた面白かったです。&lt;/p&gt;
&lt;p&gt;Railsはあとで、もう一回資料＋ビデオがみたいかも。あと、発表者の方が言ってたけど他の言語の似たようなサンプルがあると面白いかも。（&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4774141755/johtani-22/ref=nosim/?PHPSESSID=4c20b4d061334d9a7c44ab7afec36007&#34;&gt;Solr入門&lt;/a&gt;みたいに同じ題材で違う言語のサンプルとか）&lt;/p&gt;
&lt;p&gt;ツイート分析は、私の使い方とは異なる分析結果がちょっと意外でした。土日はあんまりツイートしないからなぁ。
利用時間帯とかは、他のSNS（Facebookとかmixiとか）の分析と比較してみると面白いのかも。
まぁ、深夜帯はそれほど利用は無いだろうけど。&lt;/p&gt;
&lt;p&gt;Attaccaは自社や自宅でコーディングするときに利用させてもらってます。
どうしても自分のお気に入りのリストを作ってそれを聞くので満足しちゃうんで、
他の人のお気に入りも一緒にシャッフルして再生とかできると面白いかもなぁ。
もう少し、他にも曲を発見したいんだけど、その導線がもう少しうまく行くと嬉しいかも。&lt;/p&gt;
&lt;p&gt;チャーハン諸島の話は開発者の原点みたいな話で面白かった。やっぱり、自分で作るの大事だよなぁと。
作りたいと思うものがあるのはいいことだし、実際作ってみないとわからないこともいっぱいありますよねぇ。
ただ、何か作ろうかなぁと思うものがあるのはちょっとうらやましいとも思いました。
なかなかサービスとか、ほしいものを作ろうと思うところまで行かないからなぁ。年取ったのかなぁ。&lt;/p&gt;
&lt;p&gt;懇親会では、いつものように@twtrfkさんと喋って、あと &lt;a href=&#34;http://www.lytro.com&#34;&gt;Lytro&lt;/a&gt;を触らせてもらいました！
思ったよりも大きいのが第一印象。
ぱっと見で、何の変哲もないところがズームするところだったりと、インタフェースがちょっとおもしろかったです。
ピントが後から合わせられるということで、どうしても同じ構図になっちゃうのがなぁという話も聞けましたｗ
けど、ちょっと欲しいかもなぁ。動くものを撮るとどんな感じなのかも聞くんだった。&lt;/p&gt;
&lt;p&gt;次回は9月中旬！らしいので、余力がありそうだったらまた遊びに行きます。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;日時：2012/08/01 19:00  ～  21:00
場所：デジタルハリウッド東京本校 1Fセミナールーム&lt;/p&gt;
&lt;p&gt;いつもの自己紹介タイム&lt;/p&gt;
&lt;p&gt;@i7a16k(@_gifteeの中の人)　&lt;a href=&#34;http://www.slideshare.net/i7a/rails-and-twitter-twtrhack&#34;&gt;スライドはこちら&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
 「RailsでTwitter連携アプリをサクっと作る」
　・まずは、Railsの紹介
　　MVC+routes.rbの紹介
　・Dev Twitterの登録する必要なとことか。
　・Railsのインストールから起動まで。
　・実際にログイン画面を作成するまでの紹介
　　コーディングするコマンドの紹介。動画付き
　 　omniauth_twitter
　　ってのを使うみたい。
　・サインイン、サインアウトまで。
　　ツイートは次回！
　　録画がよくできてて、それに合わせてしゃべるのもうまいなぁ。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;@teapipin(&lt;a href=&#34;http://teapipin.blog10.fc2.com/blog-entry-298.html&#34;&gt;ツイッター分析シリーズ &lt;/a&gt;の方)　&lt;a href=&#34;http://www.slideshare.net/teapipin/173twitter-twtrhack-13837615&#34;&gt;スライドはこちら&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
 「約173万ツイートを調査して分かったTwitterの利用動向」
　・ハンドル名は午後の紅茶からきてる？＋ピピン＠
　・ブログで色々公開してます。
　・サービス作るのに、下調べをしてみましたというお話
　　情報が無かったから、自分で調べてみたよと。（すばらしい）
　・Streaming APIで取得
　　タイムゾーンとか言語設定の取得でもうまく取れない。。。
　　ということで、UnicodeBlockで判定してみたけど、、、
　　最後は手作業で不要データを除去（すごい！）
　・4日間で172万ツイート
　　（金環日食とかスカイツリーのイベントがあったので、4日間で我慢）
　・上位5個で50%を占めるクライアントみたい
　・日曜日が多いらしい
　・携帯が60%くらい
　・位置情報（Geoタグつき）
　　日本が多い。4sqが40%占めてる。
　　店舗情報や天気情報などもあるらしい。
　　人口と関係した相関が散布図でわかった。
　　そこで、ツイート内容との関係を分析
　　　あとで資料みたいなー
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;@i2key(#attacca の関係者)　&lt;a href=&#34;http://www.slideshare.net/i2key/iostwitterframework&#34;&gt;スライドはこちら&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
 「iOSのTwitterFrameworkを使ってみたら・・・・」
　・Twitter4Jのほうが楽だったよー
　　デモがいいね！
　・アーキテクチャ
　　play!をバックエンド。Amazonとか。
　　iOS Twitter framework
　・Reverse Authの使い方とか。
　　申請してから、20日間かかった。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;@Mocel(&lt;a href=&#34;http://archive.guma.jp/rice-islands.html&#34;&gt;チャーハン諸島&lt;/a&gt; 開発者)　&lt;a href=&#34;http://www.slideshare.net/Mocel77/twitter-twtrhack&#34;&gt;スライドはこちら&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
 「(仮)Twitter クライアントの開発とかについて」

　・趣味プログラマー
　・「ラーメン大陸」のクローン：「チャーハン諸島」を開発
　　Excel溶けこむGUI
　　Javaで実装
　　コマンドライン風のTL画面もある（自分では使ってないけど）
　　「電力会社の電力使用量モニター」もクライアント初搭載！
　　ラーメン大陸のバージョンチェックも可能ｗ
　・開発したことで
　　自分のニーズにジャストフィット
　　優しい気持ちになれる（苦労がわかる）
　　Twitter APIのテストとかもすぐ試せる
　・GUIアプリ開発のノウハウも手に入るからオススメ
　・API利用規約は読んどこうね
　・自動アップデート機能がいるよ。→バージョンごとのサポートがなくなるよ。
　・通信エラー前提で作りましょう
　・鍵付きの非公式RTはやめなさい。
　・Twitterクライアントの作成はおもしろいよ！
　　反応がプレッシャーになることもあるけど。
　　おもしろ機能をつけるのがいいよーと
　話が上手で聞きやすかった。
&lt;/code&gt;&lt;/pre&gt;</content:encoded>
    </item>
    
    <item>
      <title>Python Developers Festa 2012.07に参加してしゃべってきました #pyfes(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/07/28/python-developers-festa-2012-07%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%A6%E3%81%97%E3%82%83%E3%81%B9%E3%81%A3%E3%81%A6%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F--pyfes/</link>
      <pubDate>Sat, 28 Jul 2012 18:15:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/07/28/python-developers-festa-2012-07%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%A6%E3%81%97%E3%82%83%E3%81%B9%E3%81%A3%E3%81%A6%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F--pyfes/</guid>
      <description>&lt;p&gt;ということで、&lt;a href=&#34;http://via.me/-3guon2i&#34;&gt;ステッカー&lt;/a&gt;欲しさ？に勉強中の話を恥ずかしげもなく偉そうにしゃべってきました。
#pyfesは以前から、気になっていたんですが、タイミングがあわず初の参加になりました。
TwitterのプロフィールにSenseiDBに興味あると書いていたら、@voluntusさんに声をかけていただけて、
さらになぜかelasticsearchの話をすることにして話をしてきました。
まだまだ、いろんな意味（プレゼン的にも内容的にも）で至らない所だらけだったので反省しまくりですが、
これでまた経験値が稼げたかなと。次回に活かしたいと思いますです。
やっぱり、しっかり勉強して、シナリオを練ってから発表しないとダメですね。。。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ということで、&lt;a href=&#34;http://via.me/-3guon2i&#34;&gt;ステッカー&lt;/a&gt;欲しさ？に勉強中の話を恥ずかしげもなく偉そうにしゃべってきました。
#pyfesは以前から、気になっていたんですが、タイミングがあわず初の参加になりました。
TwitterのプロフィールにSenseiDBに興味あると書いていたら、@voluntusさんに声をかけていただけて、
さらになぜかelasticsearchの話をすることにして話をしてきました。
まだまだ、いろんな意味（プレゼン的にも内容的にも）で至らない所だらけだったので反省しまくりですが、
これでまた経験値が稼げたかなと。次回に活かしたいと思いますです。
やっぱり、しっかり勉強して、シナリオを練ってから発表しないとダメですね。。。&lt;/p&gt;
&lt;p&gt;発表のスライドは一番最後にリンクを用意しておきましたので、興味があれば見てもらえればと思います。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;ということで、いつものメモを残しておきます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
日時：日本オラクル青山センター
場所：2012/07/28 10:00 - 20:00
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;概要：&lt;a href=&#34;https://github.com/pyspa/pyfes/blob/develop/201207.rst&#34;&gt;こちらにページあり&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;前半（10時から15時）はハンズオンなどをやられてました。参加せずにスライドを微調整して、他の勉強会のスライドをいじったりしてました。
以下は、15時から行われたスライドのメモになります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　◯PyConJP の宣伝　@shomah4a（LT）
　　9/15-17
　　PythonカンファレンスJapan
　　App Engine、Django、Sphinxなどのカンファレンスも併設
　　遠方参加者支援制度があるらしい。
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　◯elasticsearch 入門　@johtani
　　わかりにくい話でしたかねぇ。。。
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　◯たのしいうぇっぶくろーら　@tokoroten（LT）
　　index.htmlをクロールしまくってる社畜2.0の人らしい。
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　◯Sphinxを使って翻訳してたら本が出てた話　@ymotongpoo（LT）
　　OSSでもドキュメント翻訳でお手伝いできるよ。
　　そしたら、いつのまにか書籍も出せたよ。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href=&#34;http://www.slideshare.net/ymotongpoo/sphinx-13784014&#34;&gt;スライド&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　◯iOS関連のお話　@Seasons
　　バイナリ解析をしてゴニョゴニョする話。
　　解析するのに何を使ったとか思考の遷移を説明してくれるのでわかりやすい。
　　スライドが大きなマインドマップを切り出した形。
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　◯HBaseのお話　@shiumachi
　　HBase
　　　分散DB
　　　列ファミリ思考
　　HBaseなんで？
　　　RDB→シャーディング→だるい。。。
　　　シャーディング→スケールできねー
　　nandeHBase？
　　　書き込みスケールできるよ。
　　　KVS
　　HBaseのデータ構造
　　　キーがいろいろな情報を含んでる
　　　キーがソートされてる
　　HBaseのテーブル構造
　　　リージョンがシャーディングの情報もと？
　　リージョン見つけなど
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href=&#34;http://www.slideshare.net/shiumachi/20hbase&#34;&gt;スライド&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　◯PythonではじめるGit　@mkouhei
　　GitPython
　　LXCホスト？
　　GitもPythonも初心者だわー
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　◯勉強会を成長させる参加者になろう　@sawonya
　　イラストレーター（スタートアップRubyのイラスト書いた人。サインもらいましたｗ）。
　　参加者が増えるとなにがいいの？など。
　　勉強会参加に向けた勉強会の講師とかやられてるらしい。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href=&#34;http://www.sawonya.com/ss.htm&#34;&gt;スライド&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　◯IT 系勉強会ネタ(仮)　@tmmkr 
　　アジャイルサムライを読んだ情報を共有したくなって読書会を開催してみた！
　　ビアバッシュのケータリングとかは楽天デリバリーとか、カクヤスがいいよ。
　　かなり、いいスライドなので、あとで見返す。
　　今、読書会やったりしてるし、Solr勉強会の役にも立てそうだし。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href=&#34;http://slidesha.re/Qt1Rpq&#34;&gt;スライド&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　◯Do not invent your RNG...　@kenji_rikitake
　　Androidの乱数のコードがすごいらしい（ひどい）
　　Pythonの乱数ではos.urandomを使うのが安全です。
　　オレオレ乱数は作っちゃ駄目！
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　◯分散ファイルシステム（LeoFS）　@yosukehara
　　LeoFSの開発者の方。
　　Erlangで98%書いてある。
　　Masterノードは存在しない。SPOFになるから。
　　分散システムとして元にした概念とか論文ってあるんだろうか？
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　◯継続的デリバリー　@troter
　　CIとデリバリーの話。
　　いいこと書いてあるんだけど、実際のツールの話しがないのが辛いこともある
　　ということで、Python周りのツールをこうして見たよというお話。
　　Rubyの方がものがいろいろ揃ってるらしい
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　◯クライアントサイドのみで作ったダッシュボード　@takufukushima 
　　RESTアクセス用のUIのフロントエンドの話？
　　JSのお話の？node.jsとかの話。
　　MVCにしたり、CSSフレームワーク使ったり。
　　backbone.jsつかってるらしい。
　　実際の画面がみたいなぁ。
　　現状の話なので、
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　◯Meinheld　@mopemope
　　Python3対応とかLoggerとかやってから秋くらいに出るみたい。
　　このあたりは未知の領域です。。。
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　◯3分間で開発環境構築 @tk0miya
　　Vagrant＋Chefみたい。
　　VeeWeeってのでIOSイメージからVMイメージを作ってくれる。
　　（githubから持ってこないといろいろ古いらしい）
　　これ、重要だと思う。
　　実践するようにしよう。
　　手順書がわりにChefのレシピを書こうよと。
　　環境マニア募集中！
　　継続的デリバリー座談会やってます
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　◯筋トレ講座　@hiroki_niinuma
　　ジムに通い続けるのはキツイ。
　　成功率5%
　　以下の条件に
　　・10時間以下の仕事時間
　　・ジムが近い
　　・ジムという環境が好き
　　ベンチマークｗ先入観を捨てましょうとｗ
　　ジムで筋トレとかよりも歩くのが全然いいよと。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;togetterがあったのでリンク。
&lt;a href=&#34;http://togetter.com/li/346242&#34;&gt;http://togetter.com/li/346242&lt;/a&gt;
&lt;a href=&#34;http://togetter.com/li/346270&#34;&gt;http://togetter.com/li/346270&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;スライドはこちら。&lt;/p&gt;
&lt;iframe src=&#34;http://www.slideshare.net/slideshow/embed_code/13783936&#34; width=&#34;427&#34; height=&#34;356&#34; frameborder=&#34;0&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34; scrolling=&#34;no&#34; style=&#34;border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px&#34; allowfullscreen&gt; &lt;/iframe&gt; &lt;div style=&#34;margin-bottom:5px&#34;&gt; ** [Elasticsearch入門 pyfes 201207](http://www.slideshare.net/JunOhtani/elasticsearch-pyfes-201207) ** from **[Jun Ohtani](http://www.slideshare.net/JunOhtani)** &lt;/div&gt;
&lt;hr&gt;
&lt;p&gt;それにしても発表するといういい機会を与えてもらえて良かったです！。
継続的にelasticsearchも調べていきたいので、興味ある人は声をかけてくださいー&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Partial UpdateとcopyFieldのバグ【Solr 4.0 ALPHA】(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/07/13/partial-update%E3%81%A8copyfield%E3%81%AE%E3%83%90%E3%82%B0solr-4-0-alpha/</link>
      <pubDate>Fri, 13 Jul 2012 20:02:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/07/13/partial-update%E3%81%A8copyfield%E3%81%AE%E3%83%90%E3%82%B0solr-4-0-alpha/</guid>
      <description>&lt;p&gt;今日はSolr 4.0 ALPHAの興味深い機能があったので紹介です。
数日前に&lt;a href=&#34;http://solr.pl/en/2012/07/09/solr-4-0-partial-documents-update/&#34;&gt;「Solr 4.0: Partial documents update」&lt;/a&gt;という記事を見つけました。&lt;/p&gt;
&lt;p&gt;Solrには、ドキュメント（RDBで言うレコード）のデータを更新したい場合には、特定のフィールドだけを更新するという機能がありませんでした。
ですので、特定の項目（例えば、priceなど）を更新したい場合、ドキュメントの全データをSolrに再度上書き登録するという処理をしなければなりませんでした。
RDBを触っていた方が、Solrを始めた場合に必ず使いづらいと思われる点だと思います。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今日はSolr 4.0 ALPHAの興味深い機能があったので紹介です。
数日前に&lt;a href=&#34;http://solr.pl/en/2012/07/09/solr-4-0-partial-documents-update/&#34;&gt;「Solr 4.0: Partial documents update」&lt;/a&gt;という記事を見つけました。&lt;/p&gt;
&lt;p&gt;Solrには、ドキュメント（RDBで言うレコード）のデータを更新したい場合には、特定のフィールドだけを更新するという機能がありませんでした。
ですので、特定の項目（例えば、priceなど）を更新したい場合、ドキュメントの全データをSolrに再度上書き登録するという処理をしなければなりませんでした。
RDBを触っていた方が、Solrを始めた場合に必ず使いづらいと思われる点だと思います。&lt;/p&gt;
&lt;p&gt;で、4.0でその機能がありますという、&lt;a href=&#34;http://solr.pl/en/2012/07/09/solr-4-0-partial-documents-update/&#34;&gt;「Solr 4.0: Partial documents update」&lt;/a&gt;の記事を見つけました。
ただ、SolrのWikiや4.0 ALPHAの紹介のページには「partial update」という記述が見当たりません。
（あれ、これかな？&lt;a href=&#34;http://wiki.apache.org/solr/Per%20Steffensen/Update%20semantics&#34;&gt;Update semantics&lt;/a&gt;）
あと、まだ完成していないので、載っていないのかもしれないです。（この&lt;a href=&#34;https://issues.apache.org/jira/browse/SOLR-139&#34;&gt;チケットSOLR-139&lt;/a&gt;が部分更新に関するもののはず。チケット番号をみても古くから望まれている機能だということがわかります。）&lt;/p&gt;
&lt;p&gt;ということで、調べてみました。&lt;/p&gt;
&lt;p&gt;###機能概要&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Solrの機能として、特定のフィールドのみを更新するという機能です。
あくまでも、Solrレベルでの機能となり、Luceneの機能を利用したものではありません。
つぎのような流れになっています。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Solrに対して特定フィールドを更新したいという形のドキュメントを投げる&lt;/li&gt;
&lt;li&gt;Solrはドキュメントを受け取ると、内部のインデックスに保存してあるデータを取り出す&lt;/li&gt;
&lt;li&gt;取り出したドキュメントオブジェクトに対して、更新対象フィールドの値だけデータを更新する&lt;/li&gt;
&lt;li&gt;ドキュメントオブジェクトをインデックスに保存する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;このような流れです。
まぁ、言われてみれば当たり前な処理です。
ただし、この機能を使う場合はいくつかの前提条件があります。&lt;/p&gt;
&lt;p&gt;###前提条件&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;前提条件はつぎのとおりです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;すべてのフィールドをstored=&amp;ldquo;true&amp;quot;にする&lt;/li&gt;
&lt;li&gt;「&lt;em&gt;version&lt;/em&gt;」という特殊なフィールドを用意する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;1点目は、データの保存方法についてです。
先ほど流れに書きましたが、Solrが内部に保存してあるデータを取り出して、更新対象以外のデータを保存しなおしてくれます。
このため、stored=&amp;ldquo;true&amp;quot;にしておかないと、元のデータがSolr内部で取得できません。&lt;/p&gt;
&lt;p&gt;2点目の「&lt;em&gt;version&lt;/em&gt;」というフィールドは4.0から導入されたフィールドです。
SolrCloudに必要な機能としてドキュメントのバージョン管理を行うために導入されたフィールドだと思います。（あまり詳しく調べていない。。。）
SolrCloud内でレプリカの更新などに使ってるのかなぁと（そのうち調べます。）
以上の2点が前提条件です。すべてのデータをstored=&amp;ldquo;true&amp;quot;としなければならない点は、インデックスのサイズや性能に関わってくるので考えて利用するほうがいいかと思います。&lt;/p&gt;
&lt;p&gt;###利用方法&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Solrのサンプルデータ（exampledocs/mem.xml）を例として利用します。
部分更新を行うにはつぎのような形のデータを投げると部分更新が可能です。
（JSONでの更新のサンプルについては、&lt;a href=&#34;http://solr.pl/en/2012/07/09/solr-4-0-partial-documents-update/&#34;&gt;こちらの記事&lt;/a&gt;を参考にしてください。）
####XMLのサンプル（partial_update.xmlというファイルで保存する）&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;add&amp;amp;gt;
&amp;lt;doc&amp;amp;gt;
  &amp;lt;field name=&amp;#34;id&amp;#34;&amp;amp;gt;VS1GB400C3&amp;lt;/field&amp;amp;gt;
  &amp;lt;field name=&amp;#34;_version_&amp;#34;&amp;amp;gt;バージョン番号&amp;lt;/field&amp;amp;gt;
  &amp;lt;field name=&amp;#34;cat&amp;#34; update=&amp;#34;add&amp;#34;&amp;amp;gt;cats_and_dogs&amp;lt;/field&amp;amp;gt;
  &amp;lt;field name=&amp;#34;popularity&amp;#34; update=&amp;#34;inc&amp;#34;&amp;amp;gt;10&amp;lt;/field&amp;amp;gt;
  &amp;lt;!-- set empty for SOLR-3502 bug --&amp;amp;gt;
  &amp;lt;field name=&amp;#34;price_c&amp;#34; update=&amp;#34;set&amp;#34;&amp;amp;gt;0.0,USD&amp;lt;/field&amp;amp;gt;
&amp;lt;/doc&amp;amp;gt;
&amp;lt;/add&amp;amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;上記サンプルのうち、&lt;b&gt;バージョン番号&lt;/b&gt;の部分は、現在Solrに登録してある値を指定します。（Solrの管理画面で検索すれば表示されます。）
上記ファイルを「SOLR_HOME/example/exampledocs」に保存し、同フォルダにてつぎのコマンドを実行すると、部分更新されるのがわかります。
Solrに更新であるというフィールドがわかるように、fieldタグにupdateという属性を指定してあります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
java -Durl=http://localhost:8983/solr/update?versions=on -Dout=yes -jar post.jar partial_update.xml
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ちなみに、上記post.jarのオプションで、「-Durl」「-Dout」を追加してあります。
「-Durl」はverions=onというパラメータを追加したいためです。
「-Dout」はPOSTした結果をターミナルに表示するために追加しています。
これらのオプションを指定すると、データ更新後のバージョンが取得できるようになります。&lt;/p&gt;
&lt;p&gt;####更新に利用できるコマンド？
部分更新にはつぎの3つのコマンド？（正式名は不明）が用意されています。fieldタグのupdate属性に指定します。&lt;/p&gt;
&lt;table class=&#34;list_view&#34;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;コマンド？&lt;/th&gt;
      &lt;th&gt;説明&lt;/th&gt;
    &lt;/tr&gt; 
  &lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
  &lt;td&gt;add&lt;/td&gt;
  &lt;td&gt;値を追加します。multiValuedのフィールドでない場合はエラーが出ます。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;set&lt;/td&gt;
  &lt;td&gt;値を新規に登録しなおします。現在入っているデータは無くなります&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;inc&lt;/td&gt;
&lt;td&gt;指定された数値を加算（数値形式のみ）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
以上が、部分更新の機能になります。
ちなみに、登録されているバージョンと更新データに入っているバージョンが異なる場合はエラーが発生する仕組みになっているようです。
&lt;p&gt;それとは別に、この機能を調べていて、copyFieldのバグにぶつかってしまいました。。。
multiValuedでない、copyFieldを利用しているしている場合には注意が必要です。&lt;/p&gt;
&lt;p&gt;###copyFieldのバグ（SOLR-3502）&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;4.0-ALPHA（3.6.0でも再現しました。）のexampleのデータで部分更新の機能を確認できると言いました。
ただし、「price_c」というフィールドのせいで、2回部分更新を行うと2回目にエラーが発生します。
根本的な問題は、部分更新ではなく&lt;a href=&#34;https://issues.apache.org/jira/browse/SOLR-3502&#34;&gt;copyFieldのバグ&lt;/a&gt;のようです。（部分更新の処理にも問題は有るような気がしますが。。。）&lt;/p&gt;
&lt;p&gt;バグの内容はつぎのとおりです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;multiValued=&amp;ldquo;false&amp;quot;のフィールドをdestに指定&lt;/li&gt;
&lt;li&gt;srcに指定されたフィールドに値を設定（exampleのpriceフィールドに「1」を指定）&lt;/li&gt;
&lt;li&gt;destに指定されたフィールドに値を設定（exampleのprice_cフィールドに「2,USD」を指定）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上記のように設定した場合、「price_c」フィールドに、指定された値＋「price」の値がcopyにより追加されます。
通常は「price_c」フィールドはmultiValued=&amp;ldquo;false&amp;quot;なのでエラーが出るはずなのですが、エラーが発生せず2つの値が登録されてしまいます。&lt;/p&gt;
&lt;p&gt;このバグのため、exampleのデータを利用して部分更新を行うとつぎのような状態が発生します。
更新を行う対象のデータはprice、price_cフィールド以外のフィールドとします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1回目の登録後：priceフィールド「&amp;ldquo;185.0&amp;rdquo;」、price_cフィールド「&amp;ldquo;185.0,USD&amp;rdquo;」&lt;/li&gt;
&lt;li&gt;2回目の登録後：priceフィールド「&amp;ldquo;185.0&amp;rdquo;」、price_cフィールド「[&amp;ldquo;185.0,USD&amp;rdquo;,&amp;ldquo;185.0,USD&amp;rdquo;]」&lt;/li&gt;
&lt;li&gt;3回目の登録：エラーが発生&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;部分更新の処理で、すでに登録済みのデータをSolrが自動で取り出すため、2回目の登録処理にて「price_c」の登録済みの値がSolrから取り出され、さらにcopyField設定により、「price」の値が追加されます。
本当は2回目の登録でエラーが発生すべきなのですが、バグのためエラーが発生せずに登録できてしまいます。
部分更新の処理としては、copyフィールドのdestに指定されているフィールドの値を取り出さないほうがいいような気もしますが、きちんと考えてないのでなんとも言えないです。（制約事項とする形のほうがいいかもしれません）&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>MIR輪読会始めました(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/07/13/mir%E8%BC%AA%E8%AA%AD%E4%BC%9A%E5%A7%8B%E3%82%81%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Fri, 13 Jul 2012 01:41:38 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/07/13/mir%E8%BC%AA%E8%AA%AD%E4%BC%9A%E5%A7%8B%E3%82%81%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/0321416910/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51mZhZD7LVL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/0321416910/?tag=johtani-22&#34;&gt;
      Modern Information Retrieval: The Concepts and Technology behind Search (2nd Edition) (ACM Press Books)
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

いやぁ、蒸し暑くてなかなか寝れない日がはじまりましたね。（あんまり関係ないですね。。。）&lt;/p&gt;
&lt;p&gt;Modern Information Retrieval 2nd Editionを輪読会という形で読み始めました。
Solrに関わって数年ですが、昔から検索をやっていたわけではありません。
なので、そろそろ基礎的、理論的なところも勉強して行かないとなと思い、この本を買いました。
ただ、約1000ページある英語の本でして。。。
一人で読むと間違いなく挫折するし、理解不能になりそうだなと。。。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/0321416910/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51mZhZD7LVL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/0321416910/?tag=johtani-22&#34;&gt;
      Modern Information Retrieval: The Concepts and Technology behind Search (2nd Edition) (ACM Press Books)
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

いやぁ、蒸し暑くてなかなか寝れない日がはじまりましたね。（あんまり関係ないですね。。。）&lt;/p&gt;
&lt;p&gt;Modern Information Retrieval 2nd Editionを輪読会という形で読み始めました。
Solrに関わって数年ですが、昔から検索をやっていたわけではありません。
なので、そろそろ基礎的、理論的なところも勉強して行かないとなと思い、この本を買いました。
ただ、約1000ページある英語の本でして。。。
一人で読むと間違いなく挫折するし、理解不能になりそうだなと。。。&lt;/p&gt;
&lt;p&gt;ということで、Twitterで呟いたら賛同してくれる方が現れ、輪読会を開催することにしました。
イベントの開催とか初めてなので、手さぐりしながらです。（それにしても、ほんと、Twitterは素晴らしい。賛同してもらえる人が見つかったのもTwitterのおかげだし。）&lt;/p&gt;
&lt;p&gt;さすがに細かく読んでいくと終わらなそうなので、１周目（できれば、２周目もやりたいなぁと思ってる。１週目が１年でも終わりそうにない感じだけど）は公開されているスライドを元に進めようと思ってます。
それにしても検索周りはいろんな技術が必要なのだなぁと分厚い書籍を見て、途方に暮れつつ、楽しみでもあるなと思いながら、輪読会後の飲みを楽しんでましたｗ&lt;/p&gt;
&lt;p&gt;ということで、各分野の専門家もいそうなので、特別ゲストとして読んできて話に混ざってもらうのも面白いかもと夢想しつつブログを書いています。
だれかいないかなーｗ&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;参考URL：
書籍のHPで公開されているスライドのページです。
&lt;a href=&#34;http://grupoweb.upf.es/WRG/mir2ed/contents.php&#34;&gt;http://grupoweb.upf.es/WRG/mir2ed/contents.php&lt;/a&gt;&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>lucene-gosenのLucene/Solr4.0-ALPHA対応(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/07/05/lucene-gosen%E3%81%AElucene-solr4-0-alpha%E5%AF%BE%E5%BF%9C/</link>
      <pubDate>Thu, 05 Jul 2012 12:11:49 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/07/05/lucene-gosen%E3%81%AElucene-solr4-0-alpha%E5%AF%BE%E5%BF%9C/</guid>
      <description>&lt;p&gt;Lucene/Solrの4.0.0-ALPHAが7/3にリリースされました。&lt;/p&gt;
&lt;p&gt;これに伴い、lucene-goenの4xブランチのjarファイルも4.0-ALPHAのものに置き換え、現在のtrunkの修正もマージしました。
&lt;a href=&#34;http://code.google.com/p/lucene-gosen/source/browse/#svn%2Fbranches%2F4x&#34;&gt;こちらに&lt;/a&gt;あります。チェックアウトしてビルドしてから利用してください。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Lucene/Solrの4.0.0-ALPHAが7/3にリリースされました。&lt;/p&gt;
&lt;p&gt;これに伴い、lucene-goenの4xブランチのjarファイルも4.0-ALPHAのものに置き換え、現在のtrunkの修正もマージしました。
&lt;a href=&#34;http://code.google.com/p/lucene-gosen/source/browse/#svn%2Fbranches%2F4x&#34;&gt;こちらに&lt;/a&gt;あります。チェックアウトしてビルドしてから利用してください。&lt;/p&gt;
&lt;p&gt;※さすがに、jarをダウンロードできるようにすべきかもなぁ。
あと、Maven登録も。。。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Solr勉強会第8回に参加しました。 #SolrJP(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/07/04/solr%E5%8B%89%E5%BC%B7%E4%BC%9A%E7%AC%AC8%E5%9B%9E%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F--solrjp/</link>
      <pubDate>Wed, 04 Jul 2012 20:40:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/07/04/solr%E5%8B%89%E5%BC%B7%E4%BC%9A%E7%AC%AC8%E5%9B%9E%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F--solrjp/</guid>
      <description>&lt;p&gt;またまた参加しました。いまだ皆勤賞です。
&lt;del&gt;感想などはあとで。とりあえず、メモとったので第一弾です。&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;ということで、感想です。
まずは、参加人数。
今回は今までで一番、ATND登録した人が多かったんじゃないかなぁと。
埋まるのも早かったですし。やっとSolrというキーワードが多くの方に触れられるようになってきたんですかねぇ。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;またまた参加しました。いまだ皆勤賞です。
&lt;del&gt;感想などはあとで。とりあえず、メモとったので第一弾です。&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;ということで、感想です。
まずは、参加人数。
今回は今までで一番、ATND登録した人が多かったんじゃないかなぁと。
埋まるのも早かったですし。やっとSolrというキーワードが多くの方に触れられるようになってきたんですかねぇ。&lt;/p&gt;
&lt;p&gt;mixiの事例はやはり、SSDを使った11億文書のインデックスが圧巻です。
実際にマイニングに利用していて、ネガポジ分析なども行われているようで楽しそう。
TLにもありましたが、「ヤバイ」はネガ？ポジ？など、そのへんの分析方法をもう少し詳しく聞いてみたい感じもしました。
あとは、Luceneソースコードリーディングの開催が楽しみです！（候補日知らせないと。。。）&lt;/p&gt;
&lt;p&gt;Lucene Revolution 2012の参加レポートは、自己紹介がおもしろかったですｗ
ずっと検索をやらてているのもあり、色々と理論ではなく、実践的なノウハウを持っていそうで、つぎはそのあたりの話を聞いてみるのも面白そうです（発表してくれないかなーｗ）
残念ながら、私はまだスライドを見ていないので、事例を中心にピックアップして見てみようかなぁと（時間がトレない。。。）&lt;/p&gt;
&lt;p&gt;最後は阿部さんの4.0の紹介です。タイムリーに、前日に4.0-ALPHAがリリースされたので、
資料がすごく参考になりそうです。
SolrCloudについても詳しく書かれてたし。（ちゃんと動くのかなぁ？）&lt;/p&gt;
&lt;p&gt;最後は懇親会です。最近知り合った方から、発表者、昔からの勉強会の参加者といろいろな方と今回も話ができて楽しかったです。
TL上で知り合った方にもお会いできたし。
次回もしゃべってもらえそうな人を捕まえつつあるので、また企画してもらうようにつついてみようかな。&lt;/p&gt;
&lt;p&gt;※そういえば、毎度のことながら4.0ベースで、書籍は出さないのかって言われましたｗ&lt;/p&gt;
&lt;p&gt;※ちなみに、4.0-ALPHAが出たので、lucene-gosenも4xブランチの更新作業をしています。
終わったらまたブログに書くと思います。&lt;/p&gt;
&lt;hr&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
第8回Solr勉強会
場所：VOYAGE GROUP 会議室
日時：7/4(水)　19:00 ～
1. ＠haruyamaさん
　　mixi での Solr の利用
　・mixiの全文検索
　　2011年以前：Hyper Etraier、Tokyo Dystopia、Senna
　　2011年以降：Solrを利用して新規案件の検索システムの構築、入れ替えを行なっている。
　・Anuenueの論理構成など。
　・物理構成
　　1マスター、2スレーブ
　　インデックスが小さい、QPSが100以下
　　インデックスサイズが大きいものは今後構築予定
　・今後やりたいこと
　　・ログ分析
　　・パーソナライズ
　　・外部ストレージ参照のカスタム関数
　・外部ストレージをファンクションカスタム関数クエリ
　　FunctionQueryを活用したい。
　・上記のデモ（検討中のもの？）
　　現在はjar内部のファイルを読んでるよと。
　　速度的な面がどうなるかがきになるところ。
　・テキストマイニング
　　mixiボイス
　　　haruyamaさん入社前：ダンプして解析してた
　　　haruyamaさん入社後：Solrに載せちゃえば

　　600GのSSD　　　
　　　約11億文書
　　　約450GB
　　利用してるもの：Solr 4.0（2012/01）
　　lucene-gosen 1.2.1
　　自作フィルタ
　　　haruyama/solr-filter - GitHub
　
　・利用統計の説明。
　　女性が多い。
　　「AKB」だと20代前半が多い。男性はおっさんも頑張ってる。
　・mergeindex機能を利用して、過去データとマージしてる。
　　1日分だけ集計したいこともあるかもしれないから。
　　updateじゃなくて、mergeindexなのは、ソッチのほうが早かったから。
　・拡張してる分析
　　・ポジネガ分析
　　　形容詞＞絵文字＞顔文字でスコアが効く
　　　機械学習して辞書を調整してる
　・Luceneソースコードリーディングまたやりますよ！

2. 楽天株式会社 大須賀 稔さん
　　Lucene Revolution 2012 in Boston参加レポート(仮)
　・まずは自己紹介。
　　infoseekに転職→楽天→Ask.com→楽天（そして英語）
　・Lucene Revolutionってなに？
　・トレーニング
　　Scaling Search with Big Data &amp;amp; Solr
　　　Hadoopの紹介
　　　SolrとHadoopのMapReduceを利用したインデキシングのハンズオン
　　　Solrのスケーリング（Sharding、Replication）、マルチテナント
　　　※http://www.lucidimagination.com/services/training/big-data-training-scaling-solr
　　　日本ではやってない、残念。

　・カンファレンス
　　スライドとかはlucidimaginationのサイトで見れるよと。
　　　http://www.lucidimagination.com/devzone/events/conferences/lucene-revolution-2012
　　・Lucidworks Big Dataの紹介
　　　Hadoopとかいろいろ組み合わせて使えるよと
　　・Microsoftの人がAzureでSolrの紹介
　　　IEとかWindows8の話ばっかり。
　　・Kuromojiの紹介
　　　やはり、マイノリティ。
　　　内容は日本語勉強会ｗ
　　　中国語とかは対応するの？日本語しか知らないです。。。
　　・ErickさんのSolrCloudの話
　　　4.0は2012年にリリースする予定
　　　スコアリングをプラガブルに。
　　　管理系画面がリッチだよと。
　・一番重要だなぁと思ったのは。。。
　　「英語」！（会社的な感想ではありません。。。）
　Q：これはみとけ的なスライドは？
　A：Hadoop上でインデキシングして、ビットトレントとかで連携してるという例が面白かった。
　Q：FASTとかと比べてSolrってどーなの？
　A：ESPは洗練されてる。クローラーとか、ベイシスのトークナイザーを内包してるとか。
　　　Solrは言語処理系が弱かったとかあるけど、そろってきてるのでは。
　　　4.0は互角になるんじゃないかなぁ。
　　　ESPがWindowsオンリーになるので、LinuxユーザがSolrに行きつつある。

3. 株式会社 ロンウイット　阿部さん
　　Solr 4.0の紹介
　・Solr 4.0の主な機能の紹介
　　　3.xは3.6が最後4.0-ALPHAが7/3に出た
　　・プラガブルなスコアリング
　　　BM25、Language Models、Divergence from Randomness、Information-based Models
　　　関口さんがスライド作ってる
　　・FST対応
　　　Finite State Automata/Transducer
　　　オートマトン理論を活用したもの。
　　　TokenStreamはFSAで実装
　　　SynonymFilterがFSTになると、オフセットが変わってくるらしいと。
　　・Codecプラグイン
　　　Luceneレベルのお話。
　　　ドキュメントをファイルに保存するときの形式をプラガブルに変更可能。
　　　SimpleTextなどもあるらしい。テストに利用できそう。
　　　APIレベルで、マイグレーションの必要があるかも。
　　・NRT
　　　Near Real Time Search
　　　　softCommitのお話
　　　　Realtime-get：IDを入れたらGETできるよと。
　　　　KVSとしても活用できるぞ～と。
　　・PivotFacet
　　　Facetが階層的（？）な感じで取れる
　　・JOIN、pseudo-join
　　　ローカルパラメータでできるよーと。
　　・SolrCloud
　　　インデックスの分散配置をやってくれる（3.6まではやってくれない）
　　　shardがダウンしたらフェイルオーバーしてくれそう
　　　Master/Slave環境
　　　リアルタイムインデクシングとリアルタイム検索とか
　　　・ZooKeeperIntegration実装
　　　　リーダー選出、コンフィグの管理などなど

　・ManifoldCFの近況
　　5月にトップレベルに昇格！
　　http://manifoldcf.apache.org/ja_JP/index.html
　　0.6は7月に出そう。日本語にもなってる。すげー
　　Alfresco Connector、ElasticSearch Connectorなども
　　Solr Plugin for Enterprise Searchとか
&lt;/code&gt;&lt;/pre&gt;</content:encoded>
    </item>
    
    <item>
      <title>Hadoopソースコードリーディング第10回に参加しました。#hadoopreading(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/06/26/hadoop%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E7%AC%AC10%E5%9B%9E%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-hadoopreading/</link>
      <pubDate>Tue, 26 Jun 2012 01:41:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/06/26/hadoop%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E7%AC%AC10%E5%9B%9E%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-hadoopreading/</guid>
      <description>&lt;p&gt;Hadoopからはちょっと離れているのに、面白そうなネタなので参加しました。
Data Science Summit、HBaseCon、Hadoop Summitのイベント参加レポートです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Hadoopからはちょっと離れているのに、面白そうなネタなので参加しました。
Data Science Summit、HBaseCon、Hadoop Summitのイベント参加レポートです。&lt;/p&gt;
&lt;p&gt;最初の草薙さんの発表が実は一番興味を惹かれていたので、参加しました。
データの解析に関するサミットというのはなかなか聞いたことが無いのでどんな内容なのかなぁと。
ちょうどVisualizeなどに興味を持っていたり、データ解析、今後重要ですよねという話が出ていたりしていたので。
実際にデータ解析が今後重要で、どんなことに使えるのかなど、製品に偏らない内容のようで色々とためになりました。
この内容をずっと聞くのは私には無理ですw英語も数学もイマイチなので、ついていけない自信がありますｗ。
「データ分析の結果をビジネスに結び付けられる人とかが今後重要になります」という話が一番気になったキーワードでした。&lt;/p&gt;
&lt;p&gt;HBaseConもかなり濃い内容だったようです。
私は残念ながら、HBaseの概要の概要くらいしか知らないので、内容にはついていけてないですが。。。
Facebookがかなり活用しているようですが、残念ながらスライドが上がっていないようです。
Solrに関連する話もあったようです。HBaseとSolrを組み合わせた&lt;a href=&#34;http://www.lilyproject.org/lily/index.html&#34;&gt;Lilyプロジェクト&lt;/a&gt;に関連する話のようでした。
&lt;a href=&#34;http://www.hbasecon.com/sessions/lightning-session-getting-real-about-interactive-big-data-management-with-lily-hbase/&#34;&gt;スライド&lt;/a&gt;は登録しないと見れないみたいです。&lt;/p&gt;
&lt;p&gt;最後はHadoop Summitの参加レポートです。
まずは、ユーザ寄りの内容を@muddydixonさんから。個人的に、Twitterの話が多いのかなぁと。
ここでも、Visualizeの話が出ていたとか。
Lucidの話もあったようです。&lt;a href=&#34;http://www.lucidimagination.com/products/lucidworks-search-platform/lucidworks-big-data&#34;&gt;LucidWorks BigDataの話かな？&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;最後は@shiumachiさんのHadoopのプロダクト寄りのお話。
YARN（Map/Reduce2.0？）やHBaseの今後の展望など。YARNはキーワードだけ知っていたので、わかりやすい解説で、やっと理解できました。
全体を通して、HBaseが今後もっといろんな局面で使われそうだなぁと。日本語の本も7/24に出るし。（まだページが無いみたいなので、&lt;a href=&#34;http://shop.oreilly.com/product/0636920014348.do&#34;&gt;英語のほうを。&lt;/a&gt;）&lt;/p&gt;
&lt;p&gt;いつものごとく、途中でビールが入ったので後半はメモが適当ですが、楽しかったです。皆さんお疲れ様でした。&lt;/p&gt;
&lt;p&gt;帰り着いたら、さっそくスライドが上がってました。すごい！
スライドはこちら（2012/06/26 0時現在）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.slideshare.net/nagix/data-science-summit-2012-13444399&#34;&gt;Data Science Summit / EMC Worldレポート&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.slideshare.net/hadoopxnttdata/hbasecon-2012&#34;&gt;『HBaseCon 2012 参加レポート』の発表スライドをアップしました。（NTTデータ 猿田 @raspberry1123 ／岩崎）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.google.com/presentation/d/1I4UTI-ylJc9iLWa0fHkPbIT4icjC4xnabBMX2c-6sHE/present#slide=id.p&#34;&gt;@muddydixonさんのHadoopSummit2012参加レポート&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.slideshare.net/shiumachi/hadoop-summit-2012-report&#34;&gt;@shiumachiさんのHadoopSummit2012参加レポート&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/muddydixon/20120617/1339919125&#34;&gt;@muddydixonさんのブログ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;いろんなキーワード、特に、データサイエンス寄りの話が面白かったです。
次回はJenkins関連のようで、7/30開催みたいです。&lt;/p&gt;
&lt;p&gt;以下はいつものメモです。&lt;/p&gt;
&lt;hr&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
日　時： 2012年6月25日（月） 19:00～21:00 （受付開始 18:40）
場　所： 豊洲センタービルアネックス（NTTデータ、豊洲駅直通）

◯ Data Science Summit / EMC World レポート （EMC Japan 草薙）
　・Data Science Summitのレポート
　　揃ってるようで揃ってないスロットの写真ｗ
　　EMC World2012と併設
　　今回2回目。
　・OpeningKeynote: What We Can Predict About Prediction by Nate Silver
　　研究者は不確実性やリスクを包含した、現実的な予測モデルを開発すべき
　　　いろいろ
　・Roundtable: Economic, Political, &amp;amp; Societal Roles of Social Data
　　ユーザの「query-like intent」を自然言語解析と機械学習で捉える
　　属性だけじゃなく、活動を
　　コンテンツからコンテキストへ、コンバージョンからカンバセーション
　・Big Data Transformation - HealthMap
　　ウィルスのアウトブレイクの検知（160日→20日）に。
　　ウィルス＝コンピュータじゃない方
　・Big Data Transformation - Intuit
　　int.com？
　　データがあるから、こういうことが知りたいなどの新しいプロセスが
　　「https://www.mint.com/」
　・Big Data Transformation - InfoMotion Sports Technologies
　　バスケのボールにセンサーつけて、試合や選手の解析に利用して、
　　チームが強くなったりしてるらしい。
　・Big Data Transformation - Decide.com
　　アメリカ？の価格比較サイト
　　ソーシャルデータを元に、買い時、売り時を予測して教えてくれる。
　　もうすぐ新しいモデル出るかもよ？などの噂を利用してる。
　・Analytics Maturity: Master or Novice?
　　2010年のアメリカの教育事情のレポート
　　データサイエンス系の統計とかがもっと必要なんじゃないか。
　・Keynote: Navigating the Road from Business Intelligence to Data science
　　Piyanka Jain
　　BIの限界とか、データサイエンスの恩恵を受け入れるのに必要なもの？など
　　システムじゃなくて、人やスキルに投資しましょう。
　　データ分析の結果をビジネスに結び付けられる人とか。
　Panel: From Raw Data とValue Data
　　プライバシー問題
　　データ品質の問題
　　　異常値を除外するなと。最も興味深いデータになることもある。
　　&amp;#34;Data exhaust&amp;#34;の問題
　　　個人が日々インターネット上で行う様々なインタラクションに関するデータの集合
　　　相関と因果関係の区別が大変難しい。
　Panel: Tapping Into the Pulse of the Data Science movement
　　ストーリを持ってデータを語れるのが重要。
　Keynote: Data Visualizeation at the Point of Influence by Adam Bly
　Closing Keynote: The Promise and Peril in the Human / Technology Relationship by Jonathan Harris
　　TEDで有名な人
　まとめ
　　アメリカはこの分野での投資は回り始めている.
　　http://www.greenplum.com/datasciencesummit/


◯ HBaseCon レポート （NTTデータ 猿田／岩崎）
　・GeneralSession
　　HBaseの開発に参加してね。
　　・レプリケーション、セキュリティ、セカンダリインデックス、スナップショット、バックアップなど特に貢献して欲しいと。
　　・HBaseによりカバーできるアプリケーション領域
　　　メッセージング、位置ベースアプリケーション、リアルタイムレコメンデーション、広告最適化
　　・開発者への要望
　　　メッセージをちゃんとして
　　　解析用メトリクス
　　　管理ツール
　　・M/Rジョブとの連携の改善
　　・自動チューニングなど
　・Applications
　　・GAPの事例
　　　色々試してHBaseにした。
　　　クラスタ構成、16Slave、3Master、NN Failover via NFS
　　　※ZKはスレーブに置くと、アウト。
　　・Tumblr
　　　最初は失敗した。
　　　OpenTSDBを経験して、Motherboy V1に。
　　　　テストフェーズまでが目的
　　　　→幾つかの知見が得られたよーと。
　　　Motherboy V2を構築中。
　　・Facebook
　　　ひと月250TBペースで増加中。。。
　　　なんで、HBaseにしたの？
　　　　低レイテンシ、水平スケール、一貫性重視の設計、M/Rとの親和性とか
　　　Schema V1＝Snapshot Schema
　　　Schema V2＝Split Snapshot Schema
　　　Schema V3＝Hybrid Schema
　　　　HBaseのデータにさらにインデックス作ったりとか。
　　　Schema Vertion Current＝Finer grained schema and Indexer
　　　　読み書きの単位を分析して、スキーマを分割して細かくして行っていた。
　・Operations
　　・HBaseで困ったよ at Facebook
　　　・リージョンサーバに特定データ入れると連鎖的に死亡
　　　・サーバが死に切らないとか。
　　　・HBaseは落ちるときは落ちるので、しぶとく生き残れるアプリを作ってねと。
　　　※Facebook関連のスライドなどがあがってませんと。
　　・HBaseバックアップについて Clouderaの人とFacebookの人
　　　・選択肢
　　　　DistCP
　　　　　/hbaseディレクトリまるごとコピー。一貫性が保証されない
　　　　exportツール
　　　　　MRジョブ。1度に1つのテーブルのみ
　　　　copytableツール
　　　　　データを別クラスタに保存
　　　　　exportツールに似てる。
　　　　レプリケーション
　　　　　。。。
　　　　アプリケーションから複数クラスタへの書き込み
　　　　　。。。
　　　・ユースケース
　　　　・HBASE-5509を利用したバックアップ
　　　　　・開発中バックアップ
　　　　　　HBASE-6055スナップショット、HBASE-4618など

　・Development
　　・HBase Schema Design　Salesforce.comの人
　　　非正規化でやりなさいと。Joinはおすすめしないと
　　　最後にデザインパターンが載ってると。
　　　0.行キーの設計がすべて
　　　1.Design for the questions, not the answers.
　　　2.データサイズは2種類しかない。大きすぎるか、そうじゃないか。
　　　3.コンパクトに詰め込め
　　　4.行単位の原子性を活用する。
　　　5.属性は行キー内に移動することができる。（Lars Georgeがfoldingと読んでいる手法）
　　　6.エンティティをネストさせると、データを事前に集計できる。

　　・HBase Performance Tuning And Organizations　Facebookの中の人
　　　テーブルの事前スプリット
　　　オフピーク時間を設定する。（0.94で入った）
　　　コンパクション設定が効いてくるよ
　　・SolrのバックエンドにHBase？？？


◯ Hadoop Summit レポート (@muddydixonさん)
　・オープニングビデオは必見
　・ショーケース
　　・Datameerを注目した。Visualizationの専任チームがいる。
　　　UIじゃなくて、解析部隊だけで60名
　　　お値打価格。$2900/年
　　・Azure Big Data
　　　JavaScriptで
　　・ショーケースLucid
　　　Solr、HBaseとかいろいろ組み合わせて。
　・Session Hadoop...
　　2015までにApache Hadoopに世界のデータの半分が乗るらしいと。 
　・Session Realtime analytics with Storm and Hadoop
　　フォロワのフォロワをunique処理したり。
　・Session Scalding Twitter&amp;#39;s new DSL for Hadoop
　　※Zipkinにも出てきたな、名前。
　・Hadoop Plugin for MongoDB
　・Hadoop and Vertica The Data Analytics Platform at Twitter
　　Twitter社でのHadoop周りのデータフローとか。
　　Verticaは速度がいるものの処理に利用
　　80-100TB/dayとか。。。
　・Keynotes
　　・Big data analyzing system is censor of company.
　　・It is difficult in blind and deaf.
　・Session Large Scale Search, Discovery and Analytics with Hadoop, Mahout and Solr
　※@muddydixonさんのブログにセッションに対応するスライドのリンクを公開中。http://d.hatena.ne.jp/muddydixon/20120617/1339919125

◯Hadoop Summit レポート (@shiumachiさん)
　・Hadoop1.x MapReduce
　　非常に安定
　　・課題。。。
　・YARN（Yet Another Resource Negociator）
　　ターゲット：6000～10000ノード
　　　　　　　　100,000以上のタスクの同時実行
　　　　　　　　10,000ジョブの同時実行
　　性能は倍以上
　　　Q：これは同じプログラムを動かして？
　　　A：。。。倍以上です！（わかんないっす。）
　　今後の予定
　　　幾つかのJIRAの紹介
　　　MAPREDUCE-4327とかHBASE-4329とか
　まとめ
　　YARNは「汎用」分散処理基盤に向けて一歩踏み出したもの！
　　更なる進化に注目と
　・HBaseの可用性とリペア
　　ダウンタイムを短くしよう。
　　　障害停止7割くらい。
　　　　設定ミスが44%
　　不安定な機能は使うな、推奨構成を推奨！
　　HBase 0.92＋Hadoop 2.0
　　　HDFS HAによる高可用性とか
　　将来：HBase 0.96＋Hadoop 2.x
　　　計画停止時間削減：オンラインスキーマ変更（HBASE-1730）
　　　ローリングアップデート：バージョン間互換性が必須
　　HBase本読みなさい。
　　金があれば、サポート買ってください。
　　日本語HBaseトレーニング開催予定（来月）
　・HBase NameNode HighAvailability
```　　
&lt;/code&gt;&lt;/pre&gt;</content:encoded>
    </item>
    
    <item>
      <title>lucene-gosenのUniDic対応(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/06/18/lucene-gosen%E3%81%AEunidic%E5%AF%BE%E5%BF%9C/</link>
      <pubDate>Mon, 18 Jun 2012 23:03:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/06/18/lucene-gosen%E3%81%AEunidic%E5%AF%BE%E5%BF%9C/</guid>
      <description>&lt;p&gt;Issue 32で上がってきたlucee-gosenのUniDic対応の最初のパッチを書いたので、ブログに残しておきます。&lt;/p&gt;
&lt;p&gt;###UniDicとは___
&lt;a href=&#34;http://www.tokuteicorpus.jp/dist/&#34;&gt;UniDic&lt;/a&gt;とは、日本語テキストを単語に分割し，形態論情報を付与するための電子化辞書です。
&lt;a href=&#34;http://www.tokuteicorpus.jp/dist/&#34;&gt;UniDicの詳細や特長についてはHP&lt;/a&gt;を御覧ください。&lt;/p&gt;
&lt;p&gt;残念ながら、UniDicは利用者登録をして、利用規約に従うと利用が可能となります。
ですので、lucene-gosenでは、Ipadicやnaist-chasenの辞書とは異なり自動で辞書をダウンロードする機能はありません。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Issue 32で上がってきたlucee-gosenのUniDic対応の最初のパッチを書いたので、ブログに残しておきます。&lt;/p&gt;
&lt;p&gt;###UniDicとは___
&lt;a href=&#34;http://www.tokuteicorpus.jp/dist/&#34;&gt;UniDic&lt;/a&gt;とは、日本語テキストを単語に分割し，形態論情報を付与するための電子化辞書です。
&lt;a href=&#34;http://www.tokuteicorpus.jp/dist/&#34;&gt;UniDicの詳細や特長についてはHP&lt;/a&gt;を御覧ください。&lt;/p&gt;
&lt;p&gt;残念ながら、UniDicは利用者登録をして、利用規約に従うと利用が可能となります。
ですので、lucene-gosenでは、Ipadicやnaist-chasenの辞書とは異なり自動で辞書をダウンロードする機能はありません。&lt;/p&gt;
&lt;p&gt;###利用手順___
以下が、Unidicの辞書を利用したjarファイルの作成方法となります。&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1. lucene-gosenをダウンロードし、パッチを当てる&lt;/b&gt;
lucene-gosenのリポジトリからソースをエクスポートし、パッチをダウンロードし、パッチを適用します。
コマンドは以下のとおりです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
svn co . lucene-gosen-trunk-readonly
cd lucene-gosen-trunk-readonly
patch -p0 &amp;amp;gt; ...patch
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;（パッチに関しては今後正式版をリリースされたら手順からは必要なくなります。）&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2. Unidic辞書生成のためのディレクトリを作成「$GOSEN_HOME/dictionary/unidic」&lt;/b&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
mkdir dictionary/unidic
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;3. 対象となるUnidicの辞書のソースファイルをダウンロード&lt;/b&gt;
利用者登録をし、利用規約に同意の上、以下のファイルをダウンロードします。
「/」に添ってダウンロードページから遷移してダウンロードしてください。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
1.3.12個別ファイル/unidic-chasen/unidic-chasen1312src.tar.gz
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;4. ダウンロードしたtar.gzファイルを「dictionary/unidic/」にコピー&lt;/b&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
cp .. lucene-gosen-trunk-readonly/dictionary/unidic/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;5. Antを実行してjarファイルの作成&lt;/b&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
ant -Ddictype=unidic
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;成功すれば、lucene-gosen-trunk-readonly/dist/lucene-gosen-2.1-dev-unidic.jarファイルが生成されます。
あとは、通常通り、SolrやLuceneで利用することが可能です。&lt;/p&gt;
&lt;p&gt;以上がjarファイルの作成手順となります。&lt;/p&gt;
&lt;p&gt;###制約事項（2012/06/18現在）___
現在（2012/06/18）時点で公開しているパッチは、以下の制約が存在します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;COMPOUNDエントリー未対応&lt;/li&gt;
&lt;li&gt;品詞情報（発音）の内容の制限&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;COMPOUNDエントリー未対応&lt;/b&gt;
Unidicの辞書のエントリーの中に1件だけ、COMPOUNDと呼ばれるエントリーが1件だけ存在します。
別々の単語を組み合わせて1単語として扱うことができるようになっているようです。
lucene-gosenでは、残念ながら、このような辞書の形式には対応していません。
1件しか存在しないデータでもあることを鑑みて、今回の辞書構築処理では、スキップするようにしました。&lt;/p&gt;
&lt;p&gt;&lt;b&gt;品詞情報（発音）の内容の制限&lt;/b&gt;
lucene-gosenの実装上、単語の読みのバリエーション数と発音のバリエーション数には以下の制限が存在します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
「読み」バリエーション数  ＜ 「発音」バリエーション数
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;「読み」に対応する形で、「発音」がlucene-gosenでは品詞情報としてデータ登録されています。
UniDicのデータには上記制約を満たさないデータが5件ほど存在します。
現在、これら5件のデータについて、「読み」に対応した「発音」データには空文字が表示されるようになっています。&lt;/p&gt;
&lt;p&gt;まだ、簡単に動作確認をしただけです。UniDicを利用していて問題など有りましたら連絡、Issueへのアップをしていただけると助かります。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>ZipkinのReadme読んでる（その２、残り）(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/06/16/zipkin%E3%81%AEreadme%E8%AA%AD%E3%82%93%E3%81%A7%E3%82%8B%E3%81%9D%E3%81%AE%EF%BC%92%E6%AE%8B%E3%82%8A/</link>
      <pubDate>Sat, 16 Jun 2012 00:02:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/06/16/zipkin%E3%81%AEreadme%E8%AA%AD%E3%82%93%E3%81%A7%E3%82%8B%E3%81%9D%E3%81%AE%EF%BC%92%E6%AE%8B%E3%82%8A/</guid>
      <description>&lt;p&gt;「鉄は熱いうちに打て」ということで、残りも勢いでメモ。
まだ、見直しとかしてない状態なのでおかしいところとかありますが。。。
図とか入れるのはまた今度。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;「鉄は熱いうちに打て」ということで、残りも勢いでメモ。
まだ、見直しとかしてない状態なのでおかしいところとかありますが。。。
図とか入れるのはまた今度。&lt;/p&gt;
&lt;p&gt;&lt;b&gt;　Transport（転送）&lt;/b&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　ZipkinとHadoopに異なるサービスからのトレースを送信するのにScribeを利用します。
　ScribeはFacebookにより開発されました。
　システムの各サーバで実行できるデーモンとして作成されています。
　ログメッセージをListenし、カテゴリごとのcorrectレシーバーに配送します。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;　Zipkin collector daemon&lt;/b&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　トレースデータがZipkinコレクターデーモンに配送されたらvalidかどうかをチェックしてから保管し、インデックスを作成します。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;　Storage&lt;/b&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　ストレージにはCassandraを選びました。
　スケーラブルで、柔軟なスキーマをもっており、Twitter内部で大変使われています。
　このコンポーネントをプラガブルにしようと試みましたが、困難なため、ここでは公開しません。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;　Zipkin query daemon&lt;/b&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　保存、インデックスされたデータを探す方法が必要です。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;　クエリーデーモンはユーザに対して簡単なThriftAPIを公開しており、トレースを探すことが可能です。&lt;a href=&#34;https://github.com/twitter/zipkin/blob/master/zipkin-thrift/src/main/thrift/zipkinQuery.thrift&#34;&gt;Thrift file&lt;/a&gt;を見て下さい。&lt;/p&gt;
&lt;p&gt;&lt;b&gt;　UI&lt;/b&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　多くのユーザはUI経由でデータにアクセスします。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;　Visualizeに&lt;a href=&#34;http://d3js.org/&#34;&gt;D3&lt;/a&gt;を利用したRailsアプリケーションです。
　UIの認証は実装していないことに注意してください。&lt;/p&gt;
&lt;p&gt;&lt;b&gt;モジュール&lt;/b&gt;
　&lt;a href=&#34;https://github.com/twitter/zipkin/raw/master/doc/modules.png&#34;&gt;Zipkin内部のモジュール関連図&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;##インストール___
&lt;b&gt;　&lt;a href=&#34;http://cassandra.apache.org/&#34;&gt;Cassandra&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　ZipkinはCassandraをストレージにしています。Cassandraクラスタが必要になります。
　1. Cassandraサイトを参考にしてクラスタを構築してください。
　2. Zipkin Cassandraスキーマを利用します。つぎのコマンドでスキーマが作成できます。
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
bin/cassandra-cli -host localhost -port 9160 -f zipkin-server/src/schema/cassandra-schema.txt
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;　&lt;a href=&#34;http://zookeeper.apache.org/&#34;&gt;Zookeeper&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　Zipkinは協調のためにZooKeeperを利用します。
　これは、保存すべきサーバをサンプルレートで決定し、サーバを登録します。？
　1. ZooKeeperのサイトを参考にインストールしてください。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;　&lt;a href=&#34;https://github.com/facebook/scribe&#34;&gt;Scribe&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　Scribeはトレースデータを配送するのに利用するロギングフレームワークです。
　ネットワーク保存先としてZipkinコレクターデーモンを指定する必要があります。

　Scribeの設定は次のようにします。
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
&amp;lt;store&amp;amp;gt;
  category=zipkin
  type=network
  remote_host=zk://zookeeper-hostname:2181/scribe/zipkin
  remote_port=9410
  use_conn_pool=yes
  default_max_msg_before_reconnect=50000
  allowable_delta_before_reconnect=12500
  must_succeed=no
&amp;lt;/store&amp;amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　注意：上記設定は、カテゴリーにより送信ホストを見つけるためにZooKeeperを利用するサポートのScribeのTwitterバージョンを使用する方法です。
　コレクターのためのDNSエントリーを利用したりもできます。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;　Zipkinサーバ&lt;/b&gt;
　Zipkinサーバは&lt;a href=&#34;http://www.scala-lang.org/downloads&#34;&gt;Scala 2.9.1&lt;/a&gt;、&lt;a href=&#34;http://www.scala-sbt.org/download.html&#34;&gt;SBT 0.11.2&lt;/a&gt;そしてJDK6で開発しました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
 1. git clone https://github.com/twitter/zipkin.git
 2. cd zipkin
 3. cp zipkin-scribe/config/collector-dev.scala zipkin-scribe/config/collector-prod.scala
 4. cp zipkin-server/config/query-dev.scala zipkin-server/config/query-prod.scala
 5. Modify the configs above as needed. Pay particular attention to ZooKeeper and Cassandra server entries.
 6. bin/sbt update package-dist (This downloads SBT 0.11.2 if it doesn&amp;#39;t already exist)
 7. scp dist/zipkin*.zip [server]
 8. ssh [server]
 9. unzip zipkin*.zip
10. mkdir -p /var/log/zipkin
11. zipkin-scribe/scripts/collector.sh -f zipkin-scribe/config/collector-prod.scala
12. zipkin-server/scripts/query.sh -f zipkin-server/config/query-prod.scala
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　SBTでコレクターとクエリサービスを起動します。
　Scribeコレクターサービスの起動方法は次の通り。
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
bin/sbt &amp;#39;project zipkin-scribe&amp;#39; &amp;#39;run -f zipkin-scribe/config/collector-dev.scala&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　クエリサービスは次の通り
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
bin/sbt &amp;#39;project zipkin-server&amp;#39; &amp;#39;run -f zipkin-server/config/query-dev.scala&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;　Zipkin UI&lt;/b&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　UIはRails3アプリです。
　1. 設定をZooKeeperサーバでアップデートします。これはクエリデーモンを見つけるのに利用します。
　2. Rails3アプリケーションサーバにデプロイします。テストの場合は次のようにすることもできます。
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
bundle install &amp;amp;amp;&amp;amp;amp; bundle exec rails server.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;　zipkin-tracer gem&lt;/b&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　zipkin-tracer gemをトレースしたいRailsアプリケーションにRack Handlerで追加します。
　config.ruにつぎの記載をします。
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
  use ZipkinTracer::RackHandler
  run &amp;lt;YOUR_APPLICATION&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　もし、アプリケーションのstatic assetsがRailsで提供されれば、リクエストがトレースされます。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;##　Running a Hadoop job&lt;hr&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　ScribeからHadoopにログを保存する設定をすることも可能です。
　これをすると、Zipkin自身でオンザフライで簡単に作れないデータから様々なレポートが作成可能です。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;　ScalaでHadoopのジョブをかける&lt;a href=&#34;https://github.com/twitter/scalding&#34;&gt;Scalding&lt;/a&gt;というライブラリを利用します。&lt;/p&gt;
&lt;div style=&#34; margin-left: 2em;&#34;&gt;
```
&lt;p&gt;　1. Hadoopジョブを実行するためのfatなjarを作成します。
　2. scald.rbをjarをコピーしたいホスト名とjobを実行するホスト名に書き換えます。
　3. 必要なら、scald.rbのjarファイルのバージョンを更新します。
　4. scald.rbスクリプトを利用してジョブを実行できます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-&lt;/div&gt;&#34; data-lang=&#34;&lt;/div&gt;&#34;&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;./scald.rb &amp;ndash;hdfs com.twitter.zipkin.hadoop.[classname] &amp;ndash;date yyyy-mm-ddThh:mm yyyy-mm-ddThh:mm &amp;ndash;output [dir]&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
##計測ライブラリの利用方法&amp;lt;hr&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;　計測のためのライブラリとプロトコルがちょっとだけあります。
　しかし、もっと計測するための役に立つものを望んでいます。
　開始する前にトレースデータがどんな構造なのかを知る必要があります。&lt;/p&gt;
&lt;p&gt;　　・Annotation - 値、タイムスタンプ、ホストを含みます。
　　・Span - 特定のRPCに相当するAnnotationの集合
　　・Trace - あるルートSpanにぶら下がるSpanの集合&lt;/p&gt;
&lt;p&gt;　Zipkinに送信するトレースデータです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;　これらの詳細な記述は[こちら](https://github.com/twitter/zipkin/blob/master/zipkin-thrift/src/main/thrift/zipkinCore.thrift)を見て下さい。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;　その他にトレースデータの重要なものは、トレースされたサービス間でやり取りされる情報である、軽量なヘッダーです。
　トレースヘッダは次のものから構成されます。&lt;/p&gt;
&lt;p&gt;　・Trace Id - トレース全体のID
　・Span Id - 個々のリクエストのID
　・Optional Parent Span Id - このリクエストが他のリクエストの一部として生成されたら付与される
　・Sampled boolean - トレースすべきかどうかを表すフラグ&lt;/p&gt;
&lt;p&gt;　データタイプについて、理解したので、どのように計測が行われるかを順をおってみてみましょう
　例はFinagleのHTTPがどのようにトレースされるかを示しています。
　他のライブラリやプロトコルはもちろん、異なりますが、基本的な部分は一緒です。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;b&amp;gt;　サーバサイド&amp;lt;/b&amp;gt;
　1. 到達したリクエストのトレースヘッダー存在するかどうかを調べます。存在すれば、なら、このリクエストに対して関連するIDとします。トレースヘッダーがなければ、サンプリング対象かどうかを決めて、新しいTrace Id、Span Idを生成します。参考には[HttpSererTracingFilter](https://github.com/twitter/finagle/blob/master/finagle-http/src/main/scala/com/twitter/finagle/http/Codec.scala)を見て下さい。

　2. もし、現在のリクエストがサンプリングされる場合、サービス名、ホスト名、スパン名（例えば、http get/put）、その他のAnnotationのような情報を集めます。
　　リクエスト受信時には「server received」というAnnotationを生成し、処理が終了して結果を返すときに「server send」というAnnotationを生成します。
　　参考には[HttpServerTracingFilter](https://github.com/twitter/finagle/blob/master/finagle-http/src/main/scala/com/twitter/finagle/http/Codec.scala)を見てください。

　3. 生成されたトレースデータはServerBuilderにより設定されたトレーサーに渡されます。
　　デバッグのためのConsoleTracerが例としてありますが、ZipkinTracerになります。
　　トレースデータを[ZipkinTracer](https://github.com/twitter/finagle/tree/master/finagle-zipkin)が受け取った時、Span Idにより集約されます。

　4. ZipkinTracerが&amp;#34;end of span&amp;#34;イベント（&amp;#34;server received&amp;#34;アノテーションやタイムアウトのような）を受け取ると、Thrift構造としてデータを集約してScribeに送ります。もし、そのようなイベントが発生しない場合、ZipkinTracerはいつかそのデータを送信します？？？おかしい？。データ送信のための他の方法も追加します。
　ThriftやScribeのようなものですが、JSONやHttpかもしれません？

&amp;lt;b&amp;gt;　クライアントサイド&amp;lt;/b&amp;gt;
　1. リクエストを送る前にそれがトレースの一部かどうかをチェックします。
　　サーバで利用されているとします。　
　　サーバは、リクエストを処理してすでに付与されているトレースIDを割り当てます。
　　トレースIDを再利用しますが、この新しいリクエストには新しいスパンIDを生成します。
　　また、親のスパンIDが存在すれば、前のスパンIDに設定します。
　　[ここ(TracingFilter)](https://github.com/twitter/finagle/blob/master/finagle-core/src/main/scala/com/twitter/finagle/tracing/TracingFilter.scala)や[ここ(Trace)](https://github.com/twitter/finagle/blob/master/finagle-core/src/main/scala/com/twitter/finagle/tracing/Trace.scala)が参考になります。

　2. サーバサイドと同様に、送信されるHttpリクエストにトレースヘッダーを追加するための[HttpClientTracingFilter](https://github.com/twitter/finagle/blob/master/finagle-http/src/main/scala/com/twitter/finagle/http/Codec.scala)があります。

　3. リクエスト送信前の「client send」やサーバからの返信を受信した「client receive」のようなアノテーションを生成します。

　4. サーバサイドと同様に、データがZipkinにデータを送るZipkinTracerに到達します。
&lt;/code&gt;&lt;/pre&gt;</content:encoded>
    </item>
    
    <item>
      <title>ZipkinのReadmeを読んでる（クライアント周りについて）(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/06/15/zipkin%E3%81%AEreadme%E3%82%92%E8%AA%AD%E3%82%93%E3%81%A7%E3%82%8B%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E5%91%A8%E3%82%8A%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/</link>
      <pubDate>Fri, 15 Jun 2012 09:57:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/06/15/zipkin%E3%81%AEreadme%E3%82%92%E8%AA%AD%E3%82%93%E3%81%A7%E3%82%8B%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E5%91%A8%E3%82%8A%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/</guid>
      <description>&lt;p&gt;ZipkinのGithubにあるReadmeを読んでます。
せっかくというか、頭が悪いので読みながら内容をメモ。
まずは、アーキテクチャとトレースデータ送信のためのクライアント側あたりです。
（誤訳とかおかしいだろというツッコミ大歓迎です。）
あとで、リンク貼ったり絵を入れたりするかもしれませんが、とりあえず。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ZipkinのGithubにあるReadmeを読んでます。
せっかくというか、頭が悪いので読みながら内容をメモ。
まずは、アーキテクチャとトレースデータ送信のためのクライアント側あたりです。
（誤訳とかおかしいだろというツッコミ大歓迎です。）
あとで、リンク貼ったり絵を入れたりするかもしれませんが、とりあえず。&lt;/p&gt;
&lt;p&gt;&lt;b&gt;◯アーキテクチャ（&lt;a href=&#34;https://github.com/twitter/zipkin/raw/master/doc/architecture-0.png&#34;&gt;図はこちら&lt;/a&gt;）&lt;/b&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　・対象とするサービスからScribeでデータを収集し、ZipkinのCollectorに投げる
　・CollectorはCassandraにデータを格納
　・WebUIからはQueryでCassandraに問い合わせを行なってデータ取得
　・Scripe、CollectorはZookeeperと連携している（妄想）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;◯計測用ライブラリ（&lt;a href=&#34;https://github.com/twitter/zipkin/raw/master/doc/architecture-1.png&#34;&gt;図はこちら。&lt;/a&gt;図のSと書かれた青い箱）&lt;/b&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　・各ホストの計測用ライブラリがトレースデータを集めてZipkinに送信する。
　・ホストは他のサービスへリクエストを飛ばすときに、リクエストにトレース用のIDを付与してます
　　こうすることで、データをあとで、束ねることが可能となります。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;◯計測ライブラリの利用方法&lt;/b&gt;
&lt;b&gt;　・&lt;a href=&#34;https://github.com/twitter/finagle&#34;&gt;Finagle&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　　JVMのための非同期ネットワークスタックである。
　　それは、JVMベース言語（JavaやScalaなど）で非同期RPCのクライアント・サーバを構築するのに利用できる。
　
　FinagleはTwitterの内部ですごく利用されていて、トレースサポートを実現するのに当然のポイントです。
　現時点で（Finagleは）ThriftやHTTP、Memcache、Redisのクライアント・サーバサポートも持っています。

　ScalaでFinagleサーバをセットアップするのはつぎのようなコードになります。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;　トレースを追加するには、&lt;a href=&#34;https://github.com/twitter/finagle/tree/master/finagle-zipkin&#34;&gt;finagle-zipkin&lt;/a&gt;を追加して、ServerBuilderのtraceFactory関数を呼ぶだけです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
ServerBuilder()
  .codec(ThriftServerFramedCodec())
  .bindTo(serverAddr)
  .name(&amp;#34;servicename&amp;#34;)
  .tracerFactory(ZipkinTracer())
  .build(new SomeService.FinagledService(queryService, new TBinaryProtocol.Factory()))
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　クライアント側も同様です。
　上記のようにサンプリングしたリクエストにZipkinトレーサーを指定することで
　自動的にトレースできるようになります。
　サービスやホストでのリクエストの開始と終了を記録できます。

　さらに付加的な情報を記録したい場合は、つぎのようなコードを追加します。
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
Trace.record(&amp;#34;starting that extremely expensive computation&amp;#34;)
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;

　上記コードは、上記コードが実行された時間に文字列を付加できます。
　キーバリュー情報を付加したい場合は次のようになります。
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
Trace.recordBinary(&amp;#34;http.response.code&amp;#34;, &amp;#34;500&amp;#34;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;　Ruby Thrift&lt;/b&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　リクエストのトレースに利用できるgemもあります。
　リクエストに対してトレースIDを生成し、リクエストに付与し、トレーサーにプッシュするのにRackHandlerのgemを利用できます。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;　トレーサをトレースするサンプルは&lt;a href=&#34;https://github.com/twitter/zipkin/blob/master/zipkin-web/config/application.rb&#34;&gt;zipkin-web&lt;/a&gt;を参照。&lt;/p&gt;
&lt;p&gt;　Rubyからトレースクライアントをコールするのに、&lt;a href=&#34;https://github.com/twitter/thrift_client&#34;&gt;Twitter Ruby Thrift client&lt;/a&gt;を使います。
　つぎのようなコードを書きます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
client = ThriftClient.new(SomeService::Client, &amp;#39;127.0.0.1:1234&amp;#39;)
client_id = FinagleThrift::ClientId.new(:name =&amp;gt; &amp;#34;service_example.sample_environment&amp;#34;)
FinagleThrift.enable_tracing!(client, client_id), &amp;#34;service_name&amp;#34;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;　&lt;a href=&#34;https://github.com/twitter/querulous?PHPSESSID=2fb5ece17b7c5b72b57b7aed4a21ae1f&#34;&gt;Querulous&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　QuerulousはScala用のSQLデータベースのインタフェースライブラリです。
　SQLクエリの実行のタイミング情報をトレースに追加できます。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;　&lt;a href=&#34;https://github.com/twitter/cassie?PHPSESSID=2fb5ece17b7c5b72b57b7aed4a21ae1f&#34;&gt;Cassie&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　CassieはFinagleベースのCassandraクライアントライブラリです。
　CassieのトレーサーはFinagleの例とほぼ一緒ですが、
　CassieではKeyspaceBuilderに設定します。
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
cluster.keyspace(keyspace).tracerFactory(ZipkinTracer())
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;とりあえず、ここまで。___
&lt;span style=&#34;color:#FF0000&#34;&gt;2012/06/22 リンクを貼って体裁を修正&lt;/span&gt;&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>autoGeneratePhraseQueriesのデフォルト値について(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/06/14/autogeneratephrasequeries%E3%81%AE%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E5%80%A4%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/</link>
      <pubDate>Thu, 14 Jun 2012 01:09:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/06/14/autogeneratephrasequeries%E3%81%AE%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E5%80%A4%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/</guid>
      <description>&lt;p&gt;久々にSolrの話です。
といっても、結構前からの話でして。。。&lt;/p&gt;
&lt;p&gt;schema.xmlのfieldTypeの設定に「autoGeneratePhraseQueries」という属性があります。
Solr3.1で導入されました。動作に関しては&lt;a href=&#34;http://lucene.jugem.jp/?eid=403&#34;&gt;関口さんのブログ&lt;/a&gt;で説明されています。
Solr 1.4までは、Analyzerがトークンを複数返してくる場合（例：lucene-gosenで「Solr入門」という文字列を入れた場合など）にフレーズクエリとして処理していました。
Lucene 3.1.0から、この処理がデフォルトfalse（つまり、フレーズクエリにならない）という挙動になりました。（詳しくは&lt;a href=&#34;http://lucene.jugem.jp/?eid=403&#34;&gt;関口さんのブログ&lt;/a&gt;で。）
ただ、Solr 3.1.0では、下位互換性を考慮して、autoGeneratePhraseQueriesの設定値はデフォルトが「true」でした。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;久々にSolrの話です。
といっても、結構前からの話でして。。。&lt;/p&gt;
&lt;p&gt;schema.xmlのfieldTypeの設定に「autoGeneratePhraseQueries」という属性があります。
Solr3.1で導入されました。動作に関しては&lt;a href=&#34;http://lucene.jugem.jp/?eid=403&#34;&gt;関口さんのブログ&lt;/a&gt;で説明されています。
Solr 1.4までは、Analyzerがトークンを複数返してくる場合（例：lucene-gosenで「Solr入門」という文字列を入れた場合など）にフレーズクエリとして処理していました。
Lucene 3.1.0から、この処理がデフォルトfalse（つまり、フレーズクエリにならない）という挙動になりました。（詳しくは&lt;a href=&#34;http://lucene.jugem.jp/?eid=403&#34;&gt;関口さんのブログ&lt;/a&gt;で。）
ただ、Solr 3.1.0では、下位互換性を考慮して、autoGeneratePhraseQueriesの設定値はデフォルトが「true」でした。&lt;/p&gt;
&lt;p&gt;このデフォルト値がSolr 3.3以降で提供されているschemaのバージョン（1.4以上）からデフォルト値が「false」に変更されています。
schemaのバージョンを1.3以前のものから1.4以上に移行する場合は注意が必要です。&lt;/p&gt;
&lt;p&gt;とまぁ、偉そうに書きましたが、私もちゃんと追えてませんでした。
Solr勉強会第６回で、&lt;a href=&#34;http://www.slideshare.net/KojiSekiguchi/lu-solr32-3420110912&#34;&gt;関口さんの発表&lt;/a&gt;できちんと説明されていて、参加してたのに聞けてなかったですし。（&lt;a href=&#34;http://johtani.jugem.jp/?eid=26&#34;&gt;メモ取ってるのに、書いてない。&lt;/a&gt;）&lt;/p&gt;
&lt;p&gt;ということで、Solr入門のサンプルschemaも少し修正しました。
&lt;a href=&#34;http://johtani.jugem.jp/?eid=76&#34;&gt;こちら&lt;/a&gt;と&lt;a href=&#34;http://johtani.jugem.jp/?eid=76&#34;&gt;こちら&lt;/a&gt;の記事に追記してありますので、参考にしてください。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Twitterが公開した分散トレーシング（追跡？）システム、Zipkin(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/06/13/twitter%E3%81%8C%E5%85%AC%E9%96%8B%E3%81%97%E3%81%9F%E5%88%86%E6%95%A3%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%B3%E3%82%B0%E8%BF%BD%E8%B7%A1%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0zipkin/</link>
      <pubDate>Wed, 13 Jun 2012 00:40:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/06/13/twitter%E3%81%8C%E5%85%AC%E9%96%8B%E3%81%97%E3%81%9F%E5%88%86%E6%95%A3%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%B3%E3%82%B0%E8%BF%BD%E8%B7%A1%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0zipkin/</guid>
      <description>&lt;p&gt;すでに読まれた方もいるかも知れませんが、気になったのでメモを書いてみようかと。&lt;/p&gt;
&lt;p&gt;先週の木曜日に&lt;a href=&#34;http://engineering.twitter.com/2012/06/distributed-systems-tracing-with-zipkin.html&#34;&gt;TwitterのエンジニアブログでZipkinというOSSを公開したという記事&lt;/a&gt;がでました。
非常に興味深いシステムだったので、ちょっとずつ読み解いていきたいなという宣言（というか、ハッパをかけてもらうため）も兼ねて、まずはブログの内容をメモ程度に残しておきます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;すでに読まれた方もいるかも知れませんが、気になったのでメモを書いてみようかと。&lt;/p&gt;
&lt;p&gt;先週の木曜日に&lt;a href=&#34;http://engineering.twitter.com/2012/06/distributed-systems-tracing-with-zipkin.html&#34;&gt;TwitterのエンジニアブログでZipkinというOSSを公開したという記事&lt;/a&gt;がでました。
非常に興味深いシステムだったので、ちょっとずつ読み解いていきたいなという宣言（というか、ハッパをかけてもらうため）も兼ねて、まずはブログの内容をメモ程度に残しておきます。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/twitter/zipkin&#34;&gt;Zipkin&lt;/a&gt;は分散トレースシステム（distributed tracing system）です。Twitter APIの１リクエストを構成する様々なサービスのタイミングデータ（計時データ）を集めるために作りました。
Firebugのような性能プロファイラのよなもので、しかもバックエンドのサービスもプロファイル可能です。
ZipkinはAPLv2ライセンスでOSSとしてGithubで公開しています。&lt;/p&gt;
&lt;p&gt;ZipkinはWebのユーザインタフェースを持っています。（元記事参照）
各サービス（縦軸）でどのくらい時間がかかっているか（横軸）がわかり、クリックすることでより詳細な情報が得られます。
Zipkinはパフォーマンス改善の余地のある部分（遅いMySQLのSELECTなど）を見つけるのに役立ちます。&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Zipkinはどのように動くの？&lt;/b&gt;
Twitterに届いたリクエストからサンプリングしたリクエストに対してトレース可能なIDを付与して、すべてのサービスに渡していきます。
全リクエストの一部をサンプリングすることで、トレースのオーバヘッドを減らし、常に本番環境で利用できるようにしています。
Zipkinコレクタ（collector）が、Scribe経由でタイミングデータを受け取り、Cassandraに保存してインデックスを作成します。
Zipkinクエリデーモンがインデックスを利用して、WebUIにトレースデータを見つけます。&lt;/p&gt;
&lt;p&gt;ZipkinはHack Weekで開始されました。
最初はThriftに対する&lt;a href=&#34;http://research.google.com/pubs/pub36356.html&#34;&gt;Google Dapper&lt;/a&gt;の論文の基本的な部分の実装から始まり、現在ではHttp、Thrift、Memcache、SQL、Redisリクエストをサポートしています。
これらはFinagleライブラリで経由で動作します。Rubyのgemも用意してあります。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;ということで、ほぼ直訳ですが、何かの役に立てればと。
ちょっとずつですが、Githubのページやソースを読みながら記事を書いていこうと思っています。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>lucene-gosen 2.0.2リリース（リソース周りの改善など）(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/06/07/lucene-gosen-2-0-2%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E5%91%A8%E3%82%8A%E3%81%AE%E6%94%B9%E5%96%84%E3%81%AA%E3%81%A9/</link>
      <pubDate>Thu, 07 Jun 2012 17:53:54 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/06/07/lucene-gosen-2-0-2%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E5%91%A8%E3%82%8A%E3%81%AE%E6%94%B9%E5%96%84%E3%81%AA%E3%81%A9/</guid>
      <description>&lt;p&gt;lucene-gosenの最新版（2.0.1）をリリースしました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://code.google.com/p/lucene-gosen/&#34;&gt;プロジェクトページ&lt;/a&gt;よりダウンロードが可能です。&lt;/p&gt;
&lt;p&gt;今回の修正では、@haruyama さんからいただいていたパッチの取り込み（&lt;a href=&#34;http://code.google.com/p/lucene-gosen/issues/detail?id=29&#34;&gt;リソース周りの改善など&lt;/a&gt;）が主な対応となっています。
また、コンパイルに利用するjarファイルがLucene/Solr3.6.0に変更になっています。（&lt;a href=&#34;http://code.google.com/p/lucene-gosen/issues/detail?id=31&#34;&gt;Issueはこちら&lt;/a&gt;）
3.6.0から追加されたテストケースにて、&lt;a href=&#34;http://johtani.jugem.jp/?eid=88&#34;&gt;発生する問題への対処&lt;/a&gt;も施したものとなっています。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;lucene-gosenの最新版（2.0.1）をリリースしました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://code.google.com/p/lucene-gosen/&#34;&gt;プロジェクトページ&lt;/a&gt;よりダウンロードが可能です。&lt;/p&gt;
&lt;p&gt;今回の修正では、@haruyama さんからいただいていたパッチの取り込み（&lt;a href=&#34;http://code.google.com/p/lucene-gosen/issues/detail?id=29&#34;&gt;リソース周りの改善など&lt;/a&gt;）が主な対応となっています。
また、コンパイルに利用するjarファイルがLucene/Solr3.6.0に変更になっています。（&lt;a href=&#34;http://code.google.com/p/lucene-gosen/issues/detail?id=31&#34;&gt;Issueはこちら&lt;/a&gt;）
3.6.0から追加されたテストケースにて、&lt;a href=&#34;http://johtani.jugem.jp/?eid=88&#34;&gt;発生する問題への対処&lt;/a&gt;も施したものとなっています。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Issue32について（4096の壁）(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/06/06/issue32%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A64096%E3%81%AE%E5%A3%81/</link>
      <pubDate>Wed, 06 Jun 2012 01:21:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/06/06/issue32%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A64096%E3%81%AE%E5%A3%81/</guid>
      <description>&lt;p&gt;昨晩に引き続き、情けない内容のブログになってしまいますが。。。&lt;/p&gt;
&lt;p&gt;昨晩、&lt;a href=&#34;http://johtani.jugem.jp/?eid=88&#34;&gt;書いた記事&lt;/a&gt;の調査をしていた時に気づいた、問題になるケースがあったので調査をしていました。
&lt;a href=&#34;http://code.google.com/p/lucene-gosen/issues/detail?id=32&#34;&gt;Issue32&lt;/a&gt;に登録した内容になります。
拙い英語を振り絞って書いた英語なので、伝わらないかもしれないのでブログに残しておきます。
昨晩の問題点となったクラス（StreamTagger2.java）の内部処理についてです。
lucene-gosenのLucene向けのTokenizerの内部処理では入力文字列の処理を行うのに、「char buffer[]」を用いて
入力文字列をReaderから読み込むときにバッファリングしています。
このバッファリングにて、特定のケースにて、想定していない場所を単語の切れ目と認識してしまう問題が実装上存在しました。
&lt;a href=&#34;http://code.google.com/p/lucene-gosen/issues/detail?id=32&#34;&gt;Issue32&lt;/a&gt;に記載した内容は次のようになります。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;昨晩に引き続き、情けない内容のブログになってしまいますが。。。&lt;/p&gt;
&lt;p&gt;昨晩、&lt;a href=&#34;http://johtani.jugem.jp/?eid=88&#34;&gt;書いた記事&lt;/a&gt;の調査をしていた時に気づいた、問題になるケースがあったので調査をしていました。
&lt;a href=&#34;http://code.google.com/p/lucene-gosen/issues/detail?id=32&#34;&gt;Issue32&lt;/a&gt;に登録した内容になります。
拙い英語を振り絞って書いた英語なので、伝わらないかもしれないのでブログに残しておきます。
昨晩の問題点となったクラス（StreamTagger2.java）の内部処理についてです。
lucene-gosenのLucene向けのTokenizerの内部処理では入力文字列の処理を行うのに、「char buffer[]」を用いて
入力文字列をReaderから読み込むときにバッファリングしています。
このバッファリングにて、特定のケースにて、想定していない場所を単語の切れ目と認識してしまう問題が実装上存在しました。
&lt;a href=&#34;http://code.google.com/p/lucene-gosen/issues/detail?id=32&#34;&gt;Issue32&lt;/a&gt;に記載した内容は次のようになります。&lt;/p&gt;
&lt;p&gt;上記バッファは4096文字というサイズで固定になっています。
StreamTagger2クラスでは、この4096文字をオーバーするような文字列の場合に、つぎの処理により、4096文字以下の場所に文章の区切りを探そうとします。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;4096文字以上の文字列が入力される&lt;/li&gt;
&lt;li&gt;バッファに入れられるだけの文字（4096文字）をバッファにコピーする。&lt;/li&gt;
&lt;li&gt;バッファの後ろから、つぎの5種類の文字を探索し、見つかった場合（場所をkとし、ｋ＞０の場合）は、その場所を文章の切れ目と判定して、0からk+1文字目までの文字をStringTaggerを利用して形態素解析する。&lt;/li&gt;
&lt;li&gt;あとは、繰り返し&lt;/li&gt;
&lt;li&gt;上記条件に合致しない場合は、4096文字を文章とみなして形態素解析を行います。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ここで、5種類の文字は以下のとおり。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
0x000D:CARRIAGE RETURN(CR)
0x000A:LINE FEED(LF)
0x0085:NEXT LINE (NEL)
0x2028:LINE SEPARATOR
0x2029:PARAGRAPH SEPARATOR
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;見ての通り、制御文字ばかりです。
この5文字以外は切れ目と判断してくれません。
ということで、4097文字の文字列が存在し、上記5種類の文字が一度も出てこない場合、バッファのサイズで文字列が途切れてしまい、想定しない区切り位置で区切られた文章に対して形態素解析が実行されてしまいます.
HTMLから文字列を抜き出して解析したり、長い文書を解析する場合に、改行文字を削除して処理するといったことも考えられます。
上記5種類の文字列のみで文章の区切り位置を判断してしまうのは問題ではないかと。
まずは、4096文字内に「。」句点が存在した場合に、その部分を区切り位置として認識するようなパッチを記載して、&lt;a href=&#34;http://code.google.com/p/lucene-gosen/issues/detail?id=32&#34;&gt;Issue32&lt;/a&gt;に添付しました。&lt;/p&gt;
&lt;p&gt;「。」句点を採用した理由はつぎのとおりです。
StreamTagger2では、上記バッファリングした文字列を更に、BreakIterator.getSentenceIterator(Locale.JAPANESE)にて取得したBreakIteratorにて文節単位に区切ってから、各文節ごとに形態素解析を実施しています。
ということは、BraekIteratorにて分節の区切りとして判断される文字については、上記の文字種に追加しても問題無いという判断からです。
ただし、この修正でも、純粋に4096文字以上、句点が出てこない場合には区切り位置がおかしなことになってしまいますが。。。
もう少し、BreakIteratorの挙動を調べて、他にも利用可能な区切り文字が存在しないかを調査していく予定です。。。&lt;/p&gt;
&lt;p&gt;1年以上コミッターをやっているのに、こんなことも理解していないのかよいうツッコミを受けてしまいそうでなんとも情けない話です。。。
まずは、現状報告でした。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>trunkのライブラリ差し替え（Lucene/Solr3.6.0）とランダムテストの失敗について(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/06/05/trunk%E3%81%AE%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E5%B7%AE%E3%81%97%E6%9B%BF%E3%81%88lucene-solr3-6-0%E3%81%A8%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E5%A4%B1%E6%95%97%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/</link>
      <pubDate>Tue, 05 Jun 2012 01:29:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/06/05/trunk%E3%81%AE%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E5%B7%AE%E3%81%97%E6%9B%BF%E3%81%88lucene-solr3-6-0%E3%81%A8%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E5%A4%B1%E6%95%97%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/</guid>
      <description>&lt;p&gt;久々にlucene-gosenを触っています。
trunkのlibにある、jarファイルが3.5ベースだったので、3.6ベースにしてテストをしたところ、
いくつかある、ランダムテストで結果の不整合が検出されたので、調査していました。
先程、trunkに対応版をコミットしました。もう少しテストケースを追加してからリリースします。
おそらく、通常の使い方では問題無いと思います。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;久々にlucene-gosenを触っています。
trunkのlibにある、jarファイルが3.5ベースだったので、3.6ベースにしてテストをしたところ、
いくつかある、ランダムテストで結果の不整合が検出されたので、調査していました。
先程、trunkに対応版をコミットしました。もう少しテストケースを追加してからリリースします。
おそらく、通常の使い方では問題無いと思います。&lt;/p&gt;
&lt;p&gt;Luceneでは、ランダムな文字列を利用したテストが実装されています。
lucene-gosenでもこのテストを利用してランダムなテストをしています。
実際にはtest/以下のorg.apache.luceneパッケージにテストケースがあります。
今回、jarファイルを差し替えた時に、このランダムなテスト実施にて、assertが失敗するケースが発生しました。&lt;/p&gt;
&lt;p&gt;原因究明までに、いくつかフェーズがあったので、忘れないように書いておきます。&lt;/p&gt;
&lt;p&gt;1.ランダムテストのテストケースにてエラーがassertが失敗するケースが発生
※ただし、成功する場合もあり。
2.該当のテストを再現しつつデバッグ＋該当のテストがどんなものかを解読（勉強不足。。。）
※テストは、失敗した場合につぎのようなメッセージが表示され、同じテストが再現可能です。
以下、エラーの出力例。「NOTE: reproduce with: 」のあとにあるantコマンドを実行すれば、同じテストが再現可能です。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
    [junit] ------------- Standard Error -----------------
    [junit] TEST FAIL: useCharFilter=false text=&amp;#39;wgxznwk&amp;#39;
    [junit] 
    [junit] ===&amp;gt;
    [junit] Uncaught exception by thread: Thread[Thread-3,5,main]
    [junit] org.junit.ComparisonFailure: term 0 expected:&amp;lt;w[gxznwk]&amp;gt; but was:&amp;lt;w[]&amp;gt;
    [junit] 	at org.junit.Assert.assertEquals(Assert.java:125)
    [junit] 	at org.apache.lucene.analysis.BaseTokenStreamTestCase.assertTokenStreamContents(BaseTokenStreamTestCase.java:146)
    [junit] 	at org.apache.lucene.analysis.BaseTokenStreamTestCase.checkAnalysisConsistency(BaseTokenStreamTestCase.java:565)
    [junit] 	at org.apache.lucene.analysis.BaseTokenStreamTestCase.checkRandomData(BaseTokenStreamTestCase.java:396)
    [junit] 	at org.apache.lucene.analysis.BaseTokenStreamTestCase.access$000(BaseTokenStreamTestCase.java:51)
    [junit] 	at org.apache.lucene.analysis.BaseTokenStreamTestCase$AnalysisThread.run(BaseTokenStreamTestCase.java:337)
    [junit] &amp;lt;===
    [junit] 
    [junit] NOTE: reproduce with: ant test -Dtestcase=TestGosenAnalyzer -Dtestmethod=testReliability -Dtests.seed=4ad9618caecb9fb2:d5476c03b8172df:-9c569f70013ffbb -Dargs=&amp;#34;-Dfile.encoding=SJIS&amp;#34;
    [junit] ------------- ---------------- ---------------
    [junit] Testcase: testReliability(org.apache.lucene.analysis.gosen.TestGosenAnalyzer):	Caused an ERROR
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;3.デバッグの結果、Luceneのtest-frameworkにある「MockReaderWrapper」というクラスの影響を確認
LuceneのJIRAの&lt;a href=&#34;https://issues.apache.org/jira/browse/LUCENE-3894&#34;&gt;LUCENE-3894&lt;/a&gt;にて追加されたクラスであるとわかる。
このクラス、Readerのreadメソッド内部で、ランダムな値を元に長さを途中で返すという実装のReaderになっている。
（全部で18文字の文字列なのだが、ランダムな値を元に、12文字として結果を一旦返すという仕組みが実装されている）
4.lucene-gosenの問題箇所を特定。
Readerが途切れた部分を分節として扱ってしまう実装になっていた。
&lt;a href=&#34;http://code.google.com/p/lucene-gosen/source/detail?r=204&#34;&gt;該当の部分に修正をいれてコミット。&lt;/a&gt;
という具合です。
一応、テストを数回走らせてランダムテストが問題なく終了するのを確認はしてあります。
今回の問題に対する、個別のテストケースを追加してから近日中リリースする予定です。
対応が遅くなって申し訳ないです。。。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>オープンソースへの貢献のススメ(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/05/31/%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%B8%E3%81%AE%E8%B2%A2%E7%8C%AE%E3%81%AE%E3%82%B9%E3%82%B9%E3%83%A1/</link>
      <pubDate>Thu, 31 May 2012 01:12:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/05/31/%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%B8%E3%81%AE%E8%B2%A2%E7%8C%AE%E3%81%AE%E3%82%B9%E3%82%B9%E3%83%A1/</guid>
      <description>&lt;p&gt;録画してたEテレの&lt;a href=&#34;http://www.nhk.or.jp/superpresentation/backnumber/120528.html&#34;&gt;スーパープレゼンテーション&lt;/a&gt;を見ててふと書きたくなったので、書いてます。
あとから読んだら恥ずかしくなりそうだけど。。。
「&amp;ldquo;知力の余剰&amp;quot;が世界を変える」というClay Shirkyさんの話を見て思ったことです。
社会的に貢献できる仕組みが最近増えているという話の内容でした。そこで、OSSについても同じことが言えるよなぁと思った次第でして。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;録画してたEテレの&lt;a href=&#34;http://www.nhk.or.jp/superpresentation/backnumber/120528.html&#34;&gt;スーパープレゼンテーション&lt;/a&gt;を見ててふと書きたくなったので、書いてます。
あとから読んだら恥ずかしくなりそうだけど。。。
「&amp;ldquo;知力の余剰&amp;quot;が世界を変える」というClay Shirkyさんの話を見て思ったことです。
社会的に貢献できる仕組みが最近増えているという話の内容でした。そこで、OSSについても同じことが言えるよなぁと思った次第でして。&lt;/p&gt;
&lt;p&gt;昔からいろんなかたが言ってると思うし、今さら何をとおもわれるかもしれないですが、なんとなく書きたくなってしまったので。&lt;/p&gt;
&lt;p&gt;私はシステム開発を生業にしています。特にOSSにはお世話になっています。
実際に、OSSを利用している方はかなりいると思います。
幸いにも、私はOSSのコミッターもやっています。
OSSに色々と関わってきて常々思っていることがありまして。&lt;/p&gt;
&lt;p&gt;OSSは基本は有志の方々が開発やメンテナンスを行なっています。（最近では会社で行なっているところもありますが。）
そんなOSSに貢献する方法はいくつかあるのかなぁと。&lt;/p&gt;
&lt;p&gt;バグを発見したら報告したり、こんな機能を作ってみたけどどうですか？とパッチを送ってみたりするのは素晴らしい貢献だと思います。
ただ、なかなかアクションを起こすのって勇気がいるかなぁと。
実際、私もパッチ書いたりバグ報告するのは気後れすることがありしました。
ただ、貢献する方法ってこれだけじゃないよなぁと、コミッターをやり始めて思いました。&lt;/p&gt;
&lt;p&gt;もちろん、バグ報告してもらえるともっとありがたいですし、新機能とかリクエストを送ってもらえるともっと嬉しいです。
MLに質問するのもありです。ただ、ちょっとハードルが高いと思うこともあります。&lt;/p&gt;
&lt;p&gt;そんな時は、ただ使っているよと、ツイートしたりブログを書いてくれるだけでもありがたいし、ヤル気が出るものです。
使い勝手が悪いなぁというツイートでも、なんでこんなに使いにくいんだというブログでもいいんです。
気になるなぁという形でもいいと思っています。
githubでフォローするだけでもいいかと。
反応があれば、使ったり触ってもらえていることがわかります。
なので、使っているよとかアピールしてもらえると嬉しいよなぁと。&lt;/p&gt;
&lt;p&gt;なんか、締りのない感じになっちゃいましたが、反応があるとうれしいので、お気楽に反応しましょうよというお話です。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>JJUG CCC 2012 Springに参加してきました。(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/05/29/jjug-ccc-2012-spring%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%A6%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Tue, 29 May 2012 11:45:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/05/29/jjug-ccc-2012-spring%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%A6%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;JJUG CCC 2012 Springに参加してきました。
昨年のFallに続き、2回目です。
&lt;a href=&#34;http://www.java-users.jp/contents/events/ccc2012spring/&#34;&gt;概要や、タイムテーブルはこちらを御覧ください。&lt;/a&gt;
今回は、午後一から参加しました。
色々と迷いましたが、つぎのを聞いて来ました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;JJUG CCC 2012 Springに参加してきました。
昨年のFallに続き、2回目です。
&lt;a href=&#34;http://www.java-users.jp/contents/events/ccc2012spring/&#34;&gt;概要や、タイムテーブルはこちらを御覧ください。&lt;/a&gt;
今回は、午後一から参加しました。
色々と迷いましたが、つぎのを聞いて来ました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HotSpot vs JRockit ～ HotRockit到来の前に予習しよう！&lt;/li&gt;
&lt;li&gt;Play! Framework - モダンで高速なWeb開発&lt;/li&gt;
&lt;li&gt;Grails/Groovyの開発活用術&lt;/li&gt;
&lt;li&gt;Scala 最新状況報告&lt;/li&gt;
&lt;li&gt;From Swing to JavaFX SwingからJavaFXへのマイグレーションガイド&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;JRockitは使ったことがなく（たぶん）、新鮮でした。いろいろなコマンドが用意されているなぁと。
あと、jvisualvmの使い方も知らないこともあったのでいい話が聞けました。
プレゼンに慣れているようで、プレゼン中に、コマンドラインの拡大＋コマンドのオプションに赤い下線を入れるなど、どうやってやっているのか、プレゼンの内容よりも気になってしまったのが本音です&lt;/p&gt;
&lt;p&gt;Playは今回の目玉の一つでした。まだ、手元でPlayを触り始めたばかりだったので、概観がつかめたのが良かったです。
あとで&lt;a href=&#34;http://www.slideshare.net/ikeike443/play-jjug2012spring-13100524&#34;&gt;スライドを&lt;/a&gt;見なおさないと。
頭がどうしてもServlet、JSPのため、未だにPlayに切り替えができてないので、もっと触ってみないとなぁと。
ちなみに、紆余曲折してまして、Play 1.2.4→Play 2.0（Javaアプリ）→Play 2.0（Scalaアプリ）と心変わりしまくりで、まだ完全に作ってないのに、ふらふらしてます。。。&lt;/p&gt;
&lt;p&gt;GrailsはGrailsを現場にどのように投入していくのがいいかという、技術よりは、政治的な話でしたが面白かったです。
実際に、あまり有名でないプロダクトを現場に導入するのに、Javaだからと無理やり説得してみたりｗ、開発コストがこれくらい下がりますという話をしてみたりと、いろいろやられているようでした。
あと、PlayのあとにGrailsということもあり、すこしPlayを意識した話もされていました。&lt;/p&gt;
&lt;p&gt;ScalaはScalaDaysの話＋Scalaの最近の動向ということで、ある程度Scalaを知っている人がターゲットのようでした。
少し触っただけなので、何となく分かる部分もありましたが、最後の方はついていけてないです、すみません。。。
一番感じたのは、発表者の水島さんのScalaに対する愛情でしょうか。&lt;/p&gt;
&lt;p&gt;最後は桜庭さんのJavaFXのお話です。
一応、昔、JFreeChart＋Swingでちょっとしたものを作ったことがあるので面白かったです。
プレゼン自体もJavaFXで作成されていたり、オープニングがStarWars風だったりと凝ったプレゼンでした。
JavaFXとしては、JavaOneでも聞いたのですが、グラフやHTMLがリッチに書けるようになったことがびっくりです。&lt;/p&gt;
&lt;p&gt;実際のSwingアプリからJavaFXへの移行に関して、注意する点などがわかりやすく聞けました。
FXMLは確かに便利ですよねぇ。レイアウトをJavaで組むのがすごくめんどくさかったもんなぁ。&lt;/p&gt;
&lt;p&gt;さて、簡単ですが、感想でした。
今回一番残念だったのは、長丁場の割に電源の確保が難しかったことでしょうか。
ツイートしたり、メモ取ったりしたかったのですが、電源が乏しいので、Wi-fiオフにしてメモ取るのが限度でした。。。&lt;/p&gt;
&lt;hr&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
場所：オリンピック記念青少年総合センター
日時：2012/05/28 10:00 - 19:00

◎13:10 - 14:00 C-1 HotSpot vs JRockit ～ HotRockit到来の前に予習しよう！ 谷本 心 @cero_t
　◯HotSpot from Sun
　◯JRockit from BEA
　　今は、どちらもOracle
　◯違いは？
　1.歴史
　2.プラットフォーム
　　JRockitはMacではNG。Solarisは一部。
　　2.1Oracleさん曰く
　　　Solaris/Mac → HotSpot
　　　Windows/Linuxのサーバ → JRockit
　　　Windows/Linuxのクライアント → HotSpot
　　2.2谷本さんは？
　　　WebLogic → JRockit
　　　1.4、5の時の開発環境はJRockit
　　　当時はJRockitの解析ツールがカッコ良かった
　3.解析ツール
　　3.1コマンドラインツール
　　　プロセス
　　　HotSpot ： jps
　　　JRockit ： jrcmd
　　　スレッドダンプ
　　　HotSpot ：jstack 
　　　JRockit ： jjrcmd &amp;lt;pid&amp;gt; print_threads
　　　ヒープ解析
　　　HotSpot：jmap -histo &amp;lt;pid&amp;gt;
　　　JRocket：jrcmd &amp;lt;pid&amp;gt; heap_diagnostics
　　　HotSpot：
　　　JRockit：jrcmd &amp;lt;pid&amp;gt; 
　　他にもJRockitは色いろある。
　　　print_utf8poolとか（内部の文字列が出てくる）
　　3.2GUIツール
　　　HotSpot：jvisualvm　NetBeansベース
　　　JRockit：Mission Control　Eclipseベース
　　メモリリークの解消をツールを使ってみてみましょうデモ。
　　・hprofファイルを吐き出して、jvisualvmで読みこむのが楽な方法
　　・jrmcはヒープダンプファイルを読み込む機能がない。
　　　memleakというツールがある。アプリを起動してから、プロセスを右クリックして選択可能。
　　　　タイプグラフや割当てトレースみたいなものが使えるよ。
　　　　フライトレコーダーというのもあるよ。
　4.HotRockitの紹介
　　まだいつ出るのかなぁという状態だけど、HotSpotにJRockitのツールも使えるようになるVMが出る模様。（2013？）

　※デモ中に画面拡大した時に、赤線でラインを引いているのがすごく気になった。（便利なツールなのかな？そこだけ？）

◎14:15 - 15:05 C-2 Play! Framework - モダンで高速なWeb開発 池田尚史 @ikeike443
　◯自己紹介
　　Play!Frameworkコミッター
　　日本Playframeworkユーザ会
　◯アンケート
　　メイン言語は？Java多数
　　触ったことある？半分くらい？
　　Play1？Play2？半々くらい
　　プロダクションで使ってる人？3人
　◯Playframeworkって？
　　JEEではないよ。
　　Webだよ。
　　ServletとかXML使ってないよ。
　◯JEEは難しいよね。RailsとかDjangoから流れてくると。
　◯Webフレームワーク
　　なので、Webアプリが作れればいいよね。
　　開発すべきものに注力して、抽象化とかを頑張らないようにと。
　◯ライブコーディング！
　　Play2.0のScalaアプリみたい。
　　プロジェクト作成～編集して起動まで。
　　エラーを起こして、エラーがどのように表示されるか。
　　エラーのリンクをクリックして、エディタを起動するということも可能みたい。
　　TODOとかで、まだ終わってないのも記述可能。
　　パラメータとControllerの関数の引数が勝手にひもづけられますよと。
　◯歴史
　　Servletとかもあった。
　　1.2からNetty、Websocket、Scalaサポート
　　2.0.1：Scalaで書き直し。Netty+Akkaで非同期
　◯１と２のちがいは？
　　・Play1
　　　Javaで書かれたJavaのフレームワーク。Scalaはプラグインサポート
　　・Play2
　　　Scalaで書かれたScala/Javaのフレームワーク
　◯Playの特徴
　　ステートレスとかノンブロッキングとかリアクティブとか
　　・高生産性
　　　XMLがないし、unzipするとすぐ使えるよ。
　　　ホットスワップできるよ。
　　　CoffeeScript、LESSサポートも。assetsに入れとくとコンパイルしてくれて静的コンテンツにしてくれる。（Railsにも似たようなのあったっけか？）
　　・ステートレス
　　　HttpSessionがない→必要ならMemcachedとかで管理してね。
　　　「デプロイ→ニーズ・状況に応じて即時スケールアウトという時代じゃないか？」という主張
　　　Playはステートレス養成ギブスであり、時代の要請にマッチ
　　・広範囲な型安全
　　　コンパイルしてエラー検知
　　・ノンブロッキングI/O
　　　非同期処理が手軽に書けるように考えられている。
　　　→リアルタイムWebの時代
　　　　NettyやAkkaにより実現されてるのがいい
　　　Akkaを使ったアプリを書くと、長い処理のActorを別サーバにするなども設定で変更が可能。
　◯テスタビリティ
　　BDDフレームワーク（Specs2？）
　　Viewもテストできるぞと。
　◯事例
　　Klout：ソーシャルスコアリング
　　イギリスのガーディアン：コンテンツAPIの実装がPlay2
　　MinecraftのWebサイト

◎15:20 - 16:10 C-3 Grails/Groovyの開発活用術 ～Java EE資産を活かして開発を加速する～(仮) 上原潤二 山本剛
　◯充電中のためお休み

◎16:25 - 17:15 C-4 Scala 最新状況報告 ～或いはScala Days 2012リポート～ 水島宏太
　◯自己紹介
　　言語を作るのが夢みたい。
　◯Scala最新状況報告
　　ScalaDaysの雰囲気を伝えるよと。（どっちかというと、旅行記かも）
　◯Scala？
　　・オブジェクト指向関数型言語
　　　ハイブリッドじゃなくて、統合したもの
　　・強力な静的型付け
　　　NullPointerExceptionなども起きにくい
　　・超強力なコレクションフレームワーク
　　・Javaと同等の実行速度
　　・コードが簡潔（1/4くらい）
　◯Scala採用企業
　　Twitter、Amazon.com（どこに使ってるかは不明）、Foursquare、LinkedIn、VMWare、Klout、Tumblrなど
　◯Scalaのバージョンは？
　　2.10が開発版。2.9.2がステーブル版。
　◯開発体制
　　Typesafe＋世界のContributor
　　Typesafeメンバの議決でいろいろ決定
　　githubでオープンに開発
　◯ScalaDays2012の目玉
　　豪華ゲスト（私は、わからなかった）
　　Scala2.10の新機能紹介
　　今後のScala、多数の応用例
　◯ScalaDays2012を見ての方向性
　　・All-in-oneパッケージの提供
　　　Typesafe Stackの提供
　　　重要なツール
　　　　sbt（Simple Build Tool）
　　　　gitter8（プロジェクトテンプレート生成ツール。githubを元に色々取ってくる？）
　　　　Akka
　　　　Play 2.0 Framework
　　・学習コストの削減
　　　言語機能のモジュール化
　　　高度な開発者が使う昨日はデフォルトOff
　　・バイナリ互換性問題への対処
　　　・Minor Release間での互換性を維持
　　　　MIMAでジドウテキに非互換性を検出
　　　・Major Release間では互換性は保証しない。
　　　　No more java.util.Date
　　　　ソース互換性は「概ね」保証される
　　　　deprecatedは次期メジャーバージョン時に削除される。
　　・Scala IDEへの注力
　　　インクリメンタルにコンパイルしてくれるから、遅いのも気にならなくなるかも。
　　　デバッガとか、できるよと。
　　・さらなるパフォーマンス改善
　　　Value classes
　　　AnyValを継承したクラスが作成可能
　　　　該クラスのオブジェクトがインライン化
　　　　Pimp my libraryによるヒープ使用料が0に！
　◯2.10最新機能紹介
　　&amp;#34;1+2=#{1+2}&amp;#34;ができない
　　s&amp;#34;1+2=${1+2}&amp;#34;ができるように String = 1 + 2 = 3
　　f&amp;#34;1=${1}%03d&amp;#34;もできるようにSring = 1 = 001
　　自分でStringコンテキストにメソッド追加できるらしい（聞き取った日本語が合ってるか？）
　　とか。（かなり不安。。。まだまだわかってない。。。）

◎17:30 - 18:30 BOF-B-1 From Swing to JavaFX SwingからJavaFXへのマイグレーションガイド 櫻庭 祐一
　◯JavaFX
　　次世代のJava GUI Library
　　Swing+Java2D+α
　　JavaSE8から標準（JavaFX3.0）
　◯サンプル
　　クラス名がいろいろ変わってる。
　◯はまりそうなところ
　　コンテナへの追加がちょっと違う
　　イベントリスナは1種類のみになった。（Genericsを使うようになったよと。）
　◯Bind
　　値が変わるとModelが勝手に検知して変わるみたい。
　　双方向もあり。これだとEventを書かなくても良くなりつつ有るよと。
　◯シナリオベースでマイグレーション考えましょう
　　1.JavaFX in Swing
　　　JavaFXにSwingを埋め込むことはできないぞと。
　　　SwingでできないことをJavaFXでやりますよと。
　　　おー、グラフが動く。JavaDocのHTMLも綺麗に出てる。
　　　使い方：JFXPanelを使う
　　　　シーングラフを記述可能
　　　　データのやり取りが大変。Threadが違うから。
　　　　パフォーマンスが落ちます。Java2Dで画像を書くので遅いですよと。
　　　　新規のものはJavaFXで書きましょうと。
　　2.Swing to JavaFX w/o FXML
　　　SwingをJavaFXに置き換える。
　　　使い方が違うものはTableViewなど、◯Viewとついてるもの。
　　　ちょっと考えるのはLayout
　　　　Swing：コンテナ＋レイアウトマネージャー
　　　　JavaFX：コンテナがレイアウトを含む
　　　　　BorderPaneクラスとか。
　　　問題はTableとか
　　　　Swing：TableModel
　　　　JavaFX：BeanをColumnにバインド
　　3.Swing to JavaFX w/ FXML
　　　・FXML
　　　　GUIの構造をXMLで表す。
　　　　シーングラフを表現。
　　　　スキーマレス
　　　　　クラス：要素
　　　　　プロパティ：属性 or 要素
　　　アノテーションバリバリです。これで、FXMLとJavaのバインディングができるよと。
　　ツール
　　　Java ：NetBeans
　　　　e(fx)clipseってのがあるかも。
　　　FXML：Scene Builder
　　
&lt;/code&gt;&lt;/pre&gt;</content:encoded>
    </item>
    
    <item>
      <title>PlayFramework 2.0(Javaの方)を触ってみてる(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/05/16/playframework-2-0-java%E3%81%AE%E6%96%B9-%E3%82%92%E8%A7%A6%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%A6%E3%82%8B/</link>
      <pubDate>Wed, 16 May 2012 15:55:14 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/05/16/playframework-2-0-java%E3%81%AE%E6%96%B9-%E3%82%92%E8%A7%A6%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%A6%E3%82%8B/</guid>
      <description>&lt;p&gt;PlayFramework2.0を触ってみてます。
ちょっとコーディングしたくなったのと、最近のアプリの作成の調査も兼ねて。
まぁ、せっかくなので、Solr検索のアプリでも作ってみようかと言うことで触ってます。
ただ、Solr検索アプリでしかなく、今のところDBを使わないので、実はPlay Frameworkじゃなくてもいいのではないかという疑問も。。。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;PlayFramework2.0を触ってみてます。
ちょっとコーディングしたくなったのと、最近のアプリの作成の調査も兼ねて。
まぁ、せっかくなので、Solr検索のアプリでも作ってみようかと言うことで触ってます。
ただ、Solr検索アプリでしかなく、今のところDBを使わないので、実はPlay Frameworkじゃなくてもいいのではないかという疑問も。。。&lt;/p&gt;
&lt;p&gt;まだ、触り始めたばかりなので、なんともですが。感想を。
たぶん、Ruby on Railsに似ているのかなと。
RoRは仕事で少し関わったので、なんとなく知っていますが、アプリの作成手順や、ディレクトリ構成などが似ている気がします。&lt;/p&gt;
&lt;p&gt;コントローラーの生成のタイミングとか、内部でオブジェクトをSingletonで保持する方法とかのイメージがまだ良くつかめていない状態で、まずは、Solr検索部分（Palyにあんまり関係ないところ）を実装しているところです。&lt;/p&gt;
&lt;p&gt;現状で一番の疑問点は、Eclipseプロジェクト化した時の参照ライブラリのパスに関するところでしょうか。
Play Frameworkは「play new ほげほげ」コマンドを実行するとアプリの&lt;a href=&#34;http://www.playframework.org/documentation/2.0.1/Anatomy&#34;&gt;ディレクトリ構成が作成&lt;/a&gt;されます。
このあとに、eclipsfyというplayのコマンドを実行すると、Ecilpseのプロジェクトファイルが作成されます。
この時、PlayFrameworkが利用するjarファイルたちが参照ライブラリとしてクラスパスに設定されます。&lt;/p&gt;
&lt;p&gt;このパスには、PlayFrameworkのインストールディレクトリが含まれた絶対パスが記述されるのですが、
複数人で開発するときにはどうしているのかなぁと。
あと、BitbucketやGitHubにアップするときもどうするのかなぁと。
以前、この疑問ツイートして、頂いた回答としては、環境変数として定義して、各自で設定してもらうというものでした。
私も同じ事を考えていたので、腑に落ちたのですが、他にもっといい方法があったりするんでしょうか？
クラスパスやEclipseプロジェクトのファイルをアップしないというのもあると思いますが、それもちょっとなぁと。
なにか、オススメとかあれば、教えていただけると嬉しいです。&lt;/p&gt;
&lt;p&gt;最近、ブログ更新してなかったのもあったので、まずは、導入編でした。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>lucene-gosen 2.0.1リリース（Java7対応）(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/05/09/lucene-gosen-2-0-1%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9java7%E5%AF%BE%E5%BF%9C/</link>
      <pubDate>Wed, 09 May 2012 01:35:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/05/09/lucene-gosen-2-0-1%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9java7%E5%AF%BE%E5%BF%9C/</guid>
      <description>&lt;p&gt;lucene-gosenの最新版（2.0.1）をリリースしました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://code.google.com/p/lucene-gosen/&#34;&gt;プロジェクトページ&lt;/a&gt;よりダウンロードが可能です。&lt;/p&gt;
&lt;p&gt;今回の修正では、Java7でUnicodeのバージョン変更に伴う対応（&lt;a href=&#34;http://johtani.jugem.jp/?eid=73&#34;&gt;詳細はこちらを参照&lt;/a&gt;）を行なっています。&lt;/p&gt;
&lt;p&gt;リソース周りの対応はまた後日。。。すみません。2012/05/16
遅くなりましたが、昨晩、JavaDocをアップしました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;lucene-gosenの最新版（2.0.1）をリリースしました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://code.google.com/p/lucene-gosen/&#34;&gt;プロジェクトページ&lt;/a&gt;よりダウンロードが可能です。&lt;/p&gt;
&lt;p&gt;今回の修正では、Java7でUnicodeのバージョン変更に伴う対応（&lt;a href=&#34;http://johtani.jugem.jp/?eid=73&#34;&gt;詳細はこちらを参照&lt;/a&gt;）を行なっています。&lt;/p&gt;
&lt;p&gt;リソース周りの対応はまた後日。。。すみません。2012/05/16
遅くなりましたが、昨晩、JavaDocをアップしました。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>「IDの秘密」を読みました。(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/04/30/id%E3%81%AE%E7%A7%98%E5%AF%86%E3%82%92%E8%AA%AD%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Mon, 30 Apr 2012 23:03:55 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/04/30/id%E3%81%AE%E7%A7%98%E5%AF%86%E3%82%92%E8%AA%AD%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4621053809/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41OwR50GQsL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4621053809/?tag=johtani-22&#34;&gt;
      IDの秘密 (丸善ライブラリー―情報研シリーズ)
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

非常に面白く読めました。
バーコードの話に始まり、最後はシステムで付与するIDに関する考慮点まで幅広くIDについて語られています。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4621053809/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/41OwR50GQsL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4621053809/?tag=johtani-22&#34;&gt;
      IDの秘密 (丸善ライブラリー―情報研シリーズ)
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

非常に面白く読めました。
バーコードの話に始まり、最後はシステムで付与するIDに関する考慮点まで幅広くIDについて語られています。&lt;/p&gt;
&lt;p&gt;適度に配置されたコラムがまた面白く、ここまで書いてもいいのかな？と思いながらも楽しく読ませて頂きました。
2次元バーコードが汚れに強いのも知らなかったし、チロルチョコの話は知らなかったし、指コレクションとか面白すぎです。
また、JRのSuicaの導入に7年もかけている点などは、やはりすごい技術なのだなぁというため息混じりの感想です。
それほど長い期間のテストや設計は想像がつかないです。&lt;/p&gt;
&lt;p&gt;最後の2章（７，８章）については、エンジニアの以外のシステムに関わる方やエンジニアになられたばかりの方たちにぜひ読んで欲しいと思いました。
もちろん、エンジニアの方にも読んでほしい内容です。&lt;/p&gt;
&lt;p&gt;いくつか疑問点や気になる点もあったので。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「静脈や指紋が人によって異なるって確率はどうやって決めたんだろう？」&lt;/li&gt;
&lt;li&gt;Twitterの説明文のあとにFBの画面の図番号が書いてある。&lt;/li&gt;
&lt;li&gt;日本語がデコードされたけど、QRコードの文字コードって、この中に含まれてるのかな？それとも規格で決まってるのかな？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最後に、&lt;a href=&#34;http://yfrog.com/nuepmlrj&#34;&gt;書影がNIIに合ったので撮影しました。写真へのリンク&lt;/a&gt;です。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Heroku JP Meetup ＃4に参加しました。#herokujp(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/04/21/heroku-jp-meetup-4%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-herokujp/</link>
      <pubDate>Sat, 21 Apr 2012 00:23:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/04/21/heroku-jp-meetup-4%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-herokujp/</guid>
      <description>&lt;p&gt;WebSolrの話があるらしいというのを嗅ぎつけて、初めて&lt;a href=&#34;http://atnd.org/events/27370&#34;&gt;Heroku JP Meetup&lt;/a&gt;に参加しました。
herokuもWebSolrも知りつつ、手を出していなかったので、いい機会でした。
（SignUpだけ、勉強会直前に済ませましたｗ）&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;WebSolrの話があるらしいというのを嗅ぎつけて、初めて&lt;a href=&#34;http://atnd.org/events/27370&#34;&gt;Heroku JP Meetup&lt;/a&gt;に参加しました。
herokuもWebSolrも知りつつ、手を出していなかったので、いい機会でした。
（SignUpだけ、勉強会直前に済ませましたｗ）&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.heroku.com/&#34;&gt;Heroku&lt;/a&gt;はAWS上に構築されたアプリケーションプラットフォームで、簡単にアプリをデプロイして動作させることができるようです。
Ruby on Railsを使うのが多いみたいですが、他の言語も利用できると。
で、herokuの面白いところは、アドオンとして、開発が簡単にできるようなしくみが用意されていることみたいです。
今回発表のあった、IronMQ、WebSolr、PaperTrailもアドオンとして用意されており、簡単に利用することが可能です。
&lt;a href=&#34;http://www.iron.io/products/mq&#34;&gt;IronMQ&lt;/a&gt;はメッセージキューとして利用できます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://websolr.com/&#34;&gt;Websolr&lt;/a&gt;はSolrを簡単に利用できる形で提供しているものになります。
今、利用できるのは3.5.0のようで、最新版（3.6.0）になるのはまだ未定のようです。
今回の発表はWebSolrの話しもありましたが、基本は全文検索の仕組みとKuromojiの説明でした。
ただ、残念ながら、Kuromojiは3.6.0からの提供となるので、現時点では利用できないようです。
あとで、聞いた話だと、schema.xmlを自分で変更できるようです。
ただ、jarファイルを置いたりはできないようなので、lucene-gosenを利用するとかはできないみたいですが。。。
ほかにも、&lt;a href=&#34;http://bonsai.io/home&#34;&gt;bonsai.io&lt;/a&gt;として、ElasticSearchの提供も行うようです。
まだ、利用はできないようですが。&lt;/p&gt;
&lt;p&gt;最後が&lt;a href=&#34;https://papertrailapp.com/&#34;&gt;Papertrail&lt;/a&gt;です。
こちらは、ログを保存して、検索、グラフ化（視覚化）してくれるアドオンです。
まだ、ベータのようですが、ログを保存してくれるようです。無料版もあるようです。
アドオンとしての機能もそうですが、&lt;a href=&#34;https://metrics.librato.com/&#34;&gt;利用しているグラフ化のツール&lt;/a&gt;など、面白そうなものが利用されていました。&lt;/p&gt;
&lt;p&gt;LTはRuby使いの方が多かったです。&lt;/p&gt;
&lt;p&gt;Ruby使いではないのですが、いろいろなアドオンが用意されており、サービスを簡単に提供することができそうだという印象をうけ、ちょっと使ってみたいなぁと思いました。
普段参加していない勉強会だったので、普段では知りえない興味ある話が聞けて面白かったです。&lt;/p&gt;
&lt;p&gt;余談ですがPapertrailの人が利用していた、slideshareのようなサービスの&lt;a href=&#34;http://speakerdeck.com/&#34;&gt;Speaker Deck&lt;/a&gt;もよさそうなので登録してみました。
次に何か発表があった時には資料はこっちにアップしてみようかなぁと&lt;/p&gt;
&lt;p&gt;以下は、いつものように自分用のメモです。&lt;/p&gt;
&lt;hr&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
日時2012/04/20 19:00 to 21:00
会場：パソナグループ本部　呉服橋
◎オープニング – Ayumu AIZAWA (Heroku Evangelist）
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
◎新入社員からの挨拶 – Koichi SASADA (Ruby Developer）
　前職：大学教員
　仕事：CRuby開発
　Heroku使った事無いですｗRailsもよく知らないですｗ
　RUby2.0のリリースがゴール。2013/Feb
　性能アップのことやってます。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;◎&lt;a href=&#34;http://www.iron.io/products/mq&#34;&gt;IronMQ&lt;/a&gt; – Chad Arimura (Iron.IO)&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　「メッセージキューは涼しいです。」
　（Google翻訳による日本語訳付きのスライド）
　Aggregation、Distribution。。。
　IronMQ
　　Elastic、RESTful
　　heroku addon ironmq:rust
　簡単にheroku上にキューが用意できるアドオンです。
　Q：メッセージがキューに到達したのを確認する方法か？
　A：ステータスコードが帰ってくる。
　Q：データのサイズのリミットは？
　A：postのリミットはある。S3とかに巨大データをおいて、ポインタを渡すとかしてほしい。
　Q：キューへの到達の成功の保証は？
　A：アプリケーション側で判断してください？
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;◎Search &amp;amp; Indexing on Heroku – Nick Zadrozny (&lt;a href=&#34;http://websolr.com/&#34;&gt;Websolr&lt;/a&gt;)
&lt;a href=&#34;http://www.slideshare.net/nzadrozny/fulltext-search-with-emphasis-on-japanese&#34;&gt;スライドはこちら。&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;　
　※ツイートしてて、メモとってなかったので、ツイートをコピペ。
　次はWebsolrのお話
　Bonsai.io？
　Bonsai by onemorecloud - http://bit.ly/JjCuaE
　SQLのLIKE検索はO(n)でおそいねぇと。
　クエリのパースについての話。
　今度は転置インデックスのお話。
　Termへの分割ってどーすんの？というお話。Tokenizeのお話。
　その１：N-GramというTokenizeの方法。N文字ずつ先頭からTermを切り出す。開始位置は1文字ずつずらしていくと。
　N-Gramはノイズがのるし、多くのTermがでてきちゃうよと。
　その２：そこで、次は形態素解析ですね。
　先週、Lucene/Solr 3.6.0がリリースされて、Kuromojiという日本語向けの形態素解析器がでましたよ。
　Kuromojiはこちら。（Lucene版とは少し違うけど。）http://atilika.org/
　Kuromojiのサーチモードのお話。
　通常は、「関西国際空港」という単語になってしまうのを、Kuromojiでは「関西」「国際」　「空港」という切り方の単語も出してくれると。
　ちなみに、lucene-gosenでは、サーチモードはないんですねぇ。。。
　「の」はどこに消えたんだ？？そこの説明は？
　ElasticSearchやSolrのコアの部分でLuceneを使ってるよ。
　ElasticSearch　http://bit.ly/qjjvWp
　Kuromojiはユーザ辞書をサポートしてるよ。

　Q：まだ、3.5.0では？
　A：もうすぐやります
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;◎log analysis for your Heroku app – Eric Lindvall (&lt;a href=&#34;https://papertrailapp.com/&#34;&gt;Papertrail&lt;/a&gt;)&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;　
　heroku上にログを貯めて、検索したりグラフ化したりできるようになりそうなもの。
　[スライドはこちら](http://speakerdeck.com/u/lindvall/p/log-analysis-for-your-heroku-app)
　ログを貯めて、検索や可視化できるようにするサービスみたいです。
　まだ、アイデアレベルのものも発表資料には含まれていました。
　内部で利用しているツールなど、資料の最後に出てきますが、色々と面白そうなものがありました。
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
◎Lightning Talks
　◯Receibo ( @shu_0115 )
　　デザイナーｘエンジニアハッカソンでの成果らしい。
　　Webベースの家計簿アプリ。
　　買ったものの名称と料金を入れるだけ。

　◯Heroku + Pusherで作る！リアルタイムアプリケーション ( @satococoa )
　　WebSocketみたいなことが、Pusherでできるらしい。
　　http://www.slideshare.net/satococoa/heroku-pusher　　

　◯Herokuアドオンを作ってみてわかったこと ( @takkam )

　◯heroku client のちょっと進んだ使い方 ( @hsbt )

　◯love heroku? – we love herokuのご紹介 ( @ppworks ）
&lt;/code&gt;&lt;/pre&gt;</content:encoded>
    </item>
    
    <item>
      <title>Solr 3.6.0のCJKの設定とSynonymFilterFactoryの気になる点(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/04/17/solr-3-6-0%E3%81%AEcjk%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%A8synonymfilterfactory%E3%81%AE%E6%B0%97%E3%81%AB%E3%81%AA%E3%82%8B%E7%82%B9/</link>
      <pubDate>Tue, 17 Apr 2012 01:16:11 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/04/17/solr-3-6-0%E3%81%AEcjk%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%A8synonymfilterfactory%E3%81%AE%E6%B0%97%E3%81%AB%E3%81%AA%E3%82%8B%E7%82%B9/</guid>
      <description>&lt;p&gt;先日、Solr入門のサンプルschema.xmlの3.6.0対応版の作成をしていて、気になったことがあったので、
メモとして残しておきます。&lt;/p&gt;
&lt;p&gt;SynonymFilterFactoryの属性「&lt;span style=&#34;color:#FF0000&#34;&gt;tokenizerFactory&lt;/span&gt;」に関連する話です。
（&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4774141755/johtani-22/ref=nosim/&#34;&gt;「Apache Solr入門」&lt;/a&gt;の36-37ページに記載があります。）&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;先日、Solr入門のサンプルschema.xmlの3.6.0対応版の作成をしていて、気になったことがあったので、
メモとして残しておきます。&lt;/p&gt;
&lt;p&gt;SynonymFilterFactoryの属性「&lt;span style=&#34;color:#FF0000&#34;&gt;tokenizerFactory&lt;/span&gt;」に関連する話です。
（&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4774141755/johtani-22/ref=nosim/&#34;&gt;「Apache Solr入門」&lt;/a&gt;の36-37ページに記載があります。）&lt;/p&gt;
&lt;p&gt;SynonymFilterFactoryでは、類義語設定ファイルを読み込む際に利用するTokenizerFactoryを「tokenizerFactory」という属性で指定できます。（以下は書籍の記述を抜粋）&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
  &amp;lt;filter class=&amp;#34;sold.SynonymFilterFactory&amp;#34; synonyms=&amp;#34;synonyms.txt&amp;#34; ... tokenizerFactory=&amp;#34;solrbook.analysis.SenTokenizerFactory&amp;#34;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;このように、TokenizerFactoryが指定できます。&lt;/p&gt;
&lt;p&gt;ただ、&lt;a href=&#34;http://johtani.jugem.jp/?eid=76&#34;&gt;こちらの記事&lt;/a&gt;で書いたように、
Solr 3.6.0のexampleのschema.xmlではCJKのフィールドは次のように設定されています。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
    &amp;lt;!-- CJK bigram (see text_ja for a Japanese configuration using morphological analysis) --&amp;gt;
    &amp;lt;fieldType name=&amp;#34;text_cjk&amp;#34; class=&amp;#34;solr.TextField&amp;#34; positionIncrementGap=&amp;#34;100&amp;#34;&amp;gt;
      &amp;lt;analyzer&amp;gt;
        &amp;lt;tokenizer class=&amp;#34;solr.StandardTokenizerFactory&amp;#34;/&amp;gt;
        &amp;lt;!-- normalize width before bigram, as e.g. half-width dakuten combine  --&amp;gt;
        &amp;lt;filter class=&amp;#34;solr.CJKWidthFilterFactory&amp;#34;/&amp;gt;
        &amp;lt;!-- for any non-CJK --&amp;gt;
        &amp;lt;filter class=&amp;#34;solr.LowerCaseFilterFactory&amp;#34;/&amp;gt;
        &amp;lt;filter class=&amp;#34;solr.CJKBigramFilterFactory&amp;#34;/&amp;gt;
      &amp;lt;/analyzer&amp;gt;
    &amp;lt;/fieldType&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;3.6.0以前は、solr.CJKTokenizerFactoryを利用していましたが、3.6.0からはCJKTokenizerFactoryがdeprecatedになってしまい、代わりにStandardTokenizerFactory＋CJKBigramFilterFactoryの組み合わせになっています。
exampleのCJKのフィールドタイプ設定を利用して、かつ、そのフィールドにSynonymFilterを利用する場合に、
StandardTokenizerFactoryを指定してしまうと、類義語が展開できなくなってしまうので注意が必要です。&lt;/p&gt;
&lt;p&gt;CJKのフィールドでSynonymFilterを利用する場合は、類義語の設定ファイル内の記述を自力でCJKTokenizerが分割する形で記述する（まぁ、やらないでしょうが）か、deprecatedですが、CJKTokenizerFactoryを利用するのが現時点での対応でしょうか。&lt;/p&gt;
&lt;p&gt;なお、これに絡んで、&lt;a href=&#34;https://issues.apache.org/jira/browse/SOLR-3359&#34;&gt;このようなチケット&lt;/a&gt;もできています。&lt;/p&gt;
&lt;h5 id=&#34;syntaxhighlighterを導入してみました&#34;&gt;SyntaxHighlighterを導入してみました。&lt;/h5&gt;
&lt;h5 id=&#34;ちょっとはみやすくなってますかね&#34;&gt;ちょっとはみやすくなってますかね？&lt;/h5&gt;
&lt;h5 id=&#34;まだsyntaxhighlighterの設定を調べながら使っているのでコロコロ変わるかもしれないですが気にしないでください&#34;&gt;まだ、SyntaxHighlighterの設定を調べながら使っているので、コロコロ変わるかもしれないですが、気にしないでください。&lt;/h5&gt;
</content:encoded>
    </item>
    
    <item>
      <title>「Apache Solr入門」のサンプルのKuromojiとlucene-gosen対応（2章～4章）(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/04/14/apache-solr%E5%85%A5%E9%96%80%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AEkuromoji%E3%81%A8lucene-gosen%E5%AF%BE%E5%BF%9C2%E7%AB%A04%E7%AB%A0/</link>
      <pubDate>Sat, 14 Apr 2012 02:58:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/04/14/apache-solr%E5%85%A5%E9%96%80%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AEkuromoji%E3%81%A8lucene-gosen%E5%AF%BE%E5%BF%9C2%E7%AB%A04%E7%AB%A0/</guid>
      <description>&lt;p&gt;先日の続きです。「Apache Solr入門」の2章から4章の説明について、Solr3.6.0で動作させる時の変更点を以下に書いていきます。
なお、前回も説明しましたが、3.6.0からKuromojiという形態素解析器がSolrに同梱されるようになりました。
これから説明する2章の変更点の手順ですが、Kuromojiとlucene-gosenそれぞれの利用方法について説明します。
添付のschema.xmlについては、基本的にKuromojiを利用する形に変更してあります。
それに加えて、lucene-gosen用のフィールドを別途追加で定義しました。
これらのフィールド名については、次の表の用になります。
適宜、書籍のフィールド名と置き換えながら読み進めたり、試したりしてください。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;先日の続きです。「Apache Solr入門」の2章から4章の説明について、Solr3.6.0で動作させる時の変更点を以下に書いていきます。
なお、前回も説明しましたが、3.6.0からKuromojiという形態素解析器がSolrに同梱されるようになりました。
これから説明する2章の変更点の手順ですが、Kuromojiとlucene-gosenそれぞれの利用方法について説明します。
添付のschema.xmlについては、基本的にKuromojiを利用する形に変更してあります。
それに加えて、lucene-gosen用のフィールドを別途追加で定義しました。
これらのフィールド名については、次の表の用になります。
適宜、書籍のフィールド名と置き換えながら読み進めたり、試したりしてください。&lt;/p&gt;
&lt;table class=&#34;list_view&#34;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Kuromojiフィールド&lt;/th&gt;
      &lt;th&gt;lucene-gosenフィールド&lt;/th&gt;
    &lt;/tr&gt; 
  &lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
  &lt;td&gt;title&lt;/td&gt;
  &lt;td&gt;title_gosen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;author&lt;/td&gt;
  &lt;td&gt;auther_gosen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;summary&lt;/td&gt;
  &lt;td&gt;summary_gosen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;intended_reader&lt;/td&gt;
  &lt;td&gt;intended_reader_gosen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;from_author&lt;/td&gt;
  &lt;td&gt;from_author_gosen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;toc&lt;/td&gt;
  &lt;td&gt;toc_gosen&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;2章&#34;&gt;2章&lt;/h2&gt;
&lt;h3 id=&#34;213-schemaxmlのバージョン27ページ&#34;&gt;2.1.3 schema.xmlのバージョン（27ページ）&lt;/h3&gt;
&lt;p&gt;Solr3.xではschema.xmlのファイルの最新バージョンは**1.&lt;span style=&#34;color:#FF0000&#34;&gt;5&lt;/span&gt;**になっています。&lt;/p&gt;
&lt;h3 id=&#34;223-代表的なトークナイザ35ページ&#34;&gt;2.2.3 代表的なトークナイザ（35ページ）&lt;/h3&gt;
&lt;p&gt;solrbook.analysis.SenTokenizerFactoryは必要ありません。
&lt;span style=&#34;color:#FF0000&#34;&gt;Solr 3.6.0からはKuromojiと呼ばれる形態素解析器が用意されています。
solr.JapaneseTokenizerFactoryがそれに該当します。
&lt;/span&gt;
これとは別に、lucene-gosenを利用する場合、Solr向けのトークナイザが用意されています。
solr.&lt;span style=&#34;color:#FF0000&#34;&gt;Gosen&lt;/span&gt;TokenizerFactoryがそれに該当します。&lt;/p&gt;
&lt;h3 id=&#34;224-代表的なトークンフィルタ37ページ&#34;&gt;2.2.4 代表的なトークンフィルタ（37ページ）&lt;/h3&gt;
&lt;p&gt;以下の2つについては&lt;span style=&#34;color:#FF0000&#34;&gt;Kuromojiが同等のトークンフィルタを提供しています。&lt;/span&gt;
また、lucene-gosenを利用する場合は、lucene-gosenに同等のトークンフィルタが存在します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;solrbook.analysis.KatakanaStemFilterFactory&lt;/li&gt;
&lt;li&gt;solrbook.analysis.POSFilterFactory&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&#34;color:#FF0000&#34;&gt;次のものがSolr 3.6.0に用意されているので、こちらを利用します。&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;solr.JapaneseKatakanaStemFilterFactory&lt;/li&gt;
&lt;li&gt;solr.JapanesePartOfSpeechStopFilterFactory&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;それぞれ、次のものがlucene-gosenにあるので、こちらを利用します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;solr.&lt;span style=&#34;color:#FF0000&#34;&gt;Gosen&lt;/span&gt;KatakanaStemFilterFactory&lt;/li&gt;
&lt;li&gt;solr.&lt;span style=&#34;color:#FF0000&#34;&gt;Gosen&lt;/span&gt;PartOfSpeechStopFilterFactory&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2章向けの&lt;a href=&#34;https://bitbucket.org/johtani/solrbook-lucene-gosen-3.x/raw/48834b2d0465/schema/schema.xml&#34;&gt;schema.xmlはこちら&lt;/a&gt;です。その他のtxtファイルについては、特に変更はありません。&lt;/p&gt;
&lt;p&gt;3,4章は特に変更はありません。Solrの起動の仕方にだけ注意してください。（-Dsen.homeは必要ありません）&lt;/p&gt;
&lt;p&gt;以上が4章までの修正点になります。&lt;/p&gt;
&lt;p&gt;昨日に引き続き、眠い目をこすりながら修正したので、おかしいかも。
動かない、意味がわからないなどあれば、コメントorツイートいただければと思います。&lt;/p&gt;
&lt;p&gt;&lt;span style=&#34;color:#FF0000&#34;&gt;2012/06/14提供しているschema.xmlに関して修正を加えました。&lt;/span&gt;&lt;a href=&#34;http://johtani.jugem.jp/?eid=92&#34;&gt;こちらの記事&lt;/a&gt;で説明しているautoGeneratePhraseQueriesの値をtext_gosen、text_cjkのフィールドに対してtrueを設定する記述を追記しました。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Lucene/Solr 3.6.0リリース / 「Apache Solr入門」のサンプルのKuromojiとlucene-gosen対応（1章）(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/04/14/lucene-solr-3-6-0%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9---apache-solr%E5%85%A5%E9%96%80%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AEkuromoji%E3%81%A8lucene-gosen%E5%AF%BE%E5%BF%9C1%E7%AB%A0/</link>
      <pubDate>Sat, 14 Apr 2012 02:45:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/04/14/lucene-solr-3-6-0%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9---apache-solr%E5%85%A5%E9%96%80%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AEkuromoji%E3%81%A8lucene-gosen%E5%AF%BE%E5%BF%9C1%E7%AB%A0/</guid>
      <description>&lt;p&gt;以前より、アナウンスしていた、Kuromojiという日本語形態素解析が含まれるLucene/Solr 3.6.0がリリースされました。&lt;/p&gt;
&lt;p&gt;以下、各リリース内容について簡単に説明されているページへのリンクです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;以前より、アナウンスしていた、Kuromojiという日本語形態素解析が含まれるLucene/Solr 3.6.0がリリースされました。&lt;/p&gt;
&lt;p&gt;以下、各リリース内容について簡単に説明されているページへのリンクです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://lucene.apache.org/solr/solrnews.html&#34;&gt;Solrリリースのお知らせ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://lucene.apache.org/core/corenews.html&#34;&gt;Luceneリリースのお知らせ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Solr 3.6.0の変更の目玉は各言語のAnalyzer/Tokenizerの設定がexampleのschema.xmlに含まれるようになったことです。
Kuromojiという日本語用の形態素解析器もexampleを起動すればすぐに利用できる形になっています。
Kuromojiを利用する場合は、exampleのschema.xmlが参考になるでしょう。&lt;/p&gt;
&lt;p&gt;あと、大きな変更は、Ivyに対応した点です。ソースをダウンロードするとわかりますが、依存するjarファイルが含まれない形に変更されています。
SVNからチェックアウトした場合も同様です。ビルドにはネットワークに接続している環境が必要になりました。&lt;/p&gt;
&lt;p&gt;また、このリリースに合わせて、以前書いた「Apache Solr入門」のサンプルについての記事も変更が必要かと思い、
前回の記事をベースに以下に変更した記事を書いたので、参考にしてください。
今回は、Kuromojiという日本語形態素解析がデフォルトで含まれるようになったので、
Kuromojiの利用方法とあわせて、lucene-gosenの利用方法も記載します。
サンプルのschema.xmlについては、Kuromoji、lucene-gosenが同時に利用できる形のものを用意しました。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;サンプルのschema.xmlを最新版（Solr 3.6 + lucene-gosen-2.0.0-ipadic）のものを用意しました。
なお、あくまでも、3.xでlucene-gosenを利用する場合の「Apache Solr入門」のサンプルプログラムの変更点（とりあえず、4章まで）の違いについて記述します。
申し訳ございませんが、1.4と3.xの違いについての説明はここでは行いません。&lt;/p&gt;
&lt;p&gt;以下では、各章でschema.xmlに関連する記載のある部分を抜粋して、変更点と変更したschema.xmlのリンクを用意しました。参考にしてもらえればと思います。&lt;/p&gt;
&lt;h2 id=&#34;1章&#34;&gt;1章&lt;/h2&gt;
&lt;h3 id=&#34;161-n-gram17ページ&#34;&gt;1.6.1 N-gram（17ページ）&lt;/h3&gt;
&lt;p&gt;1.6.1の手順に変更はありません。
サンプルプログラムが入っているZip「solrbook.zip」のintroduction/ngram/schema.xmlファイルの代わりに
&lt;a href=&#34;https://bitbucket.org/johtani/solrbook-lucene-gosen-3.x/raw/48834b2d0465/introduction/ngram/schema.xml&#34;&gt;こちらのschema.xml&lt;/a&gt;を利用してください。
&lt;span style=&#34;color:#FF0000&#34;&gt;※なお、Solr 3.6.0から、SOLR_HOME/example/solr/conf/schema.xmlにデフォルトでN-gramで利用しているCJKTokenizerの設定が入るようになっています。
（実際にはCJKTokenizerではなく、CJKBigramFilterとCJKWidthFilterに変更されています。）&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&#34;162-形態素解析18ページ20ページ中盤まで&#34;&gt;1.6.2 形態素解析（18ページ～20ページ中盤まで）&lt;/h3&gt;
&lt;p&gt;&lt;span style=&#34;color:#FF0000&#34;&gt;CJKと同様、exampleにKuromojiを利用した設定がすでに記述されています。text_jaというフィールドタイプになります。書籍の21ページ1行目に記載のある、
「Field」のテキストボックスに入力する文字列を「text_ja」とすると、Kuromojiを利用した形態素解析結果が表示されます。exampleですでに幾つかのフィルタも設定されているため、書籍の出力結果とは異なる表示となるはずです。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;lucene-gosenを利用する場合は手順が大きく変わります。
Senを利用する場合、Senの辞書のビルド、Senのjarファイルの配置、Senを利用するためのTokenizerクラスを含んだサンプルjarの配置という作業があります。
lucene-gosenではコンパイル済みの辞書がjarファイルに含まれています。
また、Solr向けのTokenizerもlucene-gosenのjarファイルに含まれています。
lucene-gosenを利用して形態素解析を体験するための手順は次の流れになります。
なお、schema.xmlについては上記N-gramでダウンロードしたschema.xmlに形態素解析の設定もあわせて記載してあります。&lt;/p&gt;
&lt;p&gt;jarファイル（&lt;a href=&#34;http://lucene-gosen.googlecode.com/files/lucene-gosen-2.0.0-ipadic.jar&#34;&gt;lucene-gosen-2.0.0-ipadic.jar&lt;/a&gt;）をダウンロードして、$SOLR/example/solr/lib（libディレクトリがない場合は作成）にコピーします。
コピーが終わりましたら、次のように$SOLR/exampleディレクトリでSolrを起動します。
（-Dsen.homeは必要なし）&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
$ java -jar start.jar
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;あとは、書籍の記述にしたがって管理画面のAnalysis画面で動作を確認します。
ほぼ、図1-6と同じ結果になっていると思います。
（lucene-gosenで出力される情報には本書のサンプルよりも多くの情報が含まれています。また、サンプルでは、形態素解析の後の単語に基本形を採用しているため、「な」が「だ」として出力されています。基本形を出力する場合は後述するこちらで紹介したTokenFilterを利用すれば可能です。）&lt;/p&gt;
&lt;p&gt;2章については後日説明することにします（眠くなってきた。。。）&lt;/p&gt;
&lt;p&gt;動作しないなどあれば、コメントください。&lt;/p&gt;
&lt;p&gt;&lt;span style=&#34;color:#FF0000&#34;&gt;2012/06/14追記提供しているschema.xmlに関して修正を加えました。&lt;/span&gt;&lt;a href=&#34;http://johtani.jugem.jp/?eid=92&#34;&gt;こちらの記事&lt;/a&gt;で説明しているautoGeneratePhraseQueriesの値をtext_gosen、text_cjkのフィールドに対してtrueを設定する記述を追記しました。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>【メモ】Amazon CloudSearchが出てきましたよ(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/04/12/%E3%83%A1%E3%83%A2amazon-cloudsearch%E3%81%8C%E5%87%BA%E3%81%A6%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F%E3%82%88/</link>
      <pubDate>Thu, 12 Apr 2012 23:31:09 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/04/12/%E3%83%A1%E3%83%A2amazon-cloudsearch%E3%81%8C%E5%87%BA%E3%81%A6%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F%E3%82%88/</guid>
      <description>&lt;p&gt;Twitterで&lt;a href=&#34;http://aws.typepad.com/aws/2012/04/amazon-cloudsearch-start-searching-in-one-hour.html/?PHPSESSID=fdfe9b1cde84fd75f396f6121de595d6&#34;&gt;このブログ&lt;/a&gt;流れてきて、気になったので、流し読みして簡単にメモ。
Amazonのサービスでスケールする検索サービスみたい。&lt;/p&gt;
&lt;p&gt;主に、機能面です。価格とかはみてないです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データと検索トラフィックに対して自動でスケール（※automaticってのがどういう感じかは調べてないです）&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://aws.amazon.com/jp/documentation/cloudsearch/&#34;&gt;CloudSearch APIs&lt;/a&gt;でアクセス可能。AWS管理コンソールからオペレーションできる。コマンドツールもある&lt;/li&gt;
&lt;li&gt;データ登録にHTTPSも使えますよ。データ形式はJSON、XML、SDF（Search Document Format）と呼ばれるものに準拠したもの&lt;/li&gt;
&lt;li&gt;near real-timeで検索可能になる。RAMにインデックスを保持して更新処理が早くなる（Lucene/Solrと一緒か？）&lt;/lI&gt;&lt;/li&gt;
&lt;li&gt;ステミングとかストップワードの設定変えたらre-index&lt;/lI&gt;&lt;/li&gt;
&lt;li&gt;ファセット、フィールド指定検索が可能。（ファセットはファセットクエリみたいなのもできるのかな？）&lt;/li&gt;
&lt;li&gt;データ量が増えたら、サーチインスタンスを追加するか、インスタンスタイプを大きくしてスケールする？&lt;/li&gt;
&lt;li&gt;トラフィックが増えたら新しいインスタンスにデータをレプリケートしてインスタンスを追加する&lt;/li&gt;
&lt;li&gt;簡単に実現できるよ。ファセット検索、全文検索、And/OR検索式、ランキングのカスタマイズ、フィールド指定ソート、フィールド指定検索、テキスト処理オプション（ストップワード、類義語、ステミングのような）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;http://aws.amazon.com/jp/documentation/cloudsearch/&#34;&gt;ここ&lt;/a&gt;から詳細のドキュメントが見れるみたいなので、また、見てみます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Twitterで&lt;a href=&#34;http://aws.typepad.com/aws/2012/04/amazon-cloudsearch-start-searching-in-one-hour.html/?PHPSESSID=fdfe9b1cde84fd75f396f6121de595d6&#34;&gt;このブログ&lt;/a&gt;流れてきて、気になったので、流し読みして簡単にメモ。
Amazonのサービスでスケールする検索サービスみたい。&lt;/p&gt;
&lt;p&gt;主に、機能面です。価格とかはみてないです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データと検索トラフィックに対して自動でスケール（※automaticってのがどういう感じかは調べてないです）&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://aws.amazon.com/jp/documentation/cloudsearch/&#34;&gt;CloudSearch APIs&lt;/a&gt;でアクセス可能。AWS管理コンソールからオペレーションできる。コマンドツールもある&lt;/li&gt;
&lt;li&gt;データ登録にHTTPSも使えますよ。データ形式はJSON、XML、SDF（Search Document Format）と呼ばれるものに準拠したもの&lt;/li&gt;
&lt;li&gt;near real-timeで検索可能になる。RAMにインデックスを保持して更新処理が早くなる（Lucene/Solrと一緒か？）&lt;/lI&gt;&lt;/li&gt;
&lt;li&gt;ステミングとかストップワードの設定変えたらre-index&lt;/lI&gt;&lt;/li&gt;
&lt;li&gt;ファセット、フィールド指定検索が可能。（ファセットはファセットクエリみたいなのもできるのかな？）&lt;/li&gt;
&lt;li&gt;データ量が増えたら、サーチインスタンスを追加するか、インスタンスタイプを大きくしてスケールする？&lt;/li&gt;
&lt;li&gt;トラフィックが増えたら新しいインスタンスにデータをレプリケートしてインスタンスを追加する&lt;/li&gt;
&lt;li&gt;簡単に実現できるよ。ファセット検索、全文検索、And/OR検索式、ランキングのカスタマイズ、フィールド指定ソート、フィールド指定検索、テキスト処理オプション（ストップワード、類義語、ステミングのような）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;http://aws.amazon.com/jp/documentation/cloudsearch/&#34;&gt;ここ&lt;/a&gt;から詳細のドキュメントが見れるみたいなので、また、見てみます。&lt;/p&gt;
&lt;p&gt;あと、WikipediaをCloudSearchで動かしてる&lt;a href=&#34;http://wikipedia.searchtechnologies.com/&#34;&gt;デモ&lt;/a&gt;と&lt;a href=&#34;http://www.searchtechnologies.com/wikipedia-cloudsearch.html&#34;&gt;それに関する記事&lt;/a&gt;もあるみたいです。これも暇を見つけて眺めてみます。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Java One Tokyo 2012 に参加しました。#JavaOneJp(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/04/06/java-one-tokyo-2012-%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-javaonejp/</link>
      <pubDate>Fri, 06 Apr 2012 16:51:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/04/06/java-one-tokyo-2012-%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-javaonejp/</guid>
      <description>&lt;p&gt;JavaOne Tokyo 2012に参加してきました。
4/4-4/5の2日間開催されていたのですが、子供が体調を崩してしまい、4/5のみの参加となりました。
4/4はTwitterのTLを眺めて、羨ましがってました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;JavaOne Tokyo 2012に参加してきました。
4/4-4/5の2日間開催されていたのですが、子供が体調を崩してしまい、4/5のみの参加となりました。
4/4はTwitterのTLを眺めて、羨ましがってました。&lt;/p&gt;
&lt;p&gt;7年ぶりに日本で開催されたJavaOneみたいです。
そういえば、7年前くらいに参加した記憶があるなぁと。&lt;/p&gt;
&lt;p&gt;会場入りして最初の感想は年齢層が高いなぁと。
最近、勉強会によく顔を出すようになったのですが、勉強会とは年齢層が少し異なりました。
まぁ、私も年齢層を上げている一人ではあるのですが。。。
Javaも熟成してきてるなぁというのが最初の感想でした。
あと、思ったよりもスーツ率は低かったと思いました。（5割はいましたが）
一番違和感を感じたのは、会場の所々の色が「赤い」ことです。。。&lt;/p&gt;
&lt;p&gt;以下は私が参加したセッションのカンタンな感想です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Java EE6 Modeling　JS2-01　#jt12_s201&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;JavaEEから離れてはや数年。私が関わっていた頃はEJB2.0が出たくらいのタイミングだったので、
色々と変わってきているなぁというのが第一印象です。
CDI、Singleton EJBなど、知らない単語もちらほらと。
earではなく、warファイル1つで済む、jQueryをリソースjarとしてパッケージングしてwarファイルに入れられるなどは簡易になっていいなぁと。
web.xmlがアノテーションで記述できて要らなくなるという話は一長一短だと思いました。
一覧性があるからいいと思うこともあるので。
中国の方？の英語だったので少し特徴的でした。すこしは頑張ってみたものの、やはり同時通訳を聞いてしまって反省しています。。。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;マルチコアCPU時代のJavaプログラミング　JS2-14　#jt12_s214&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;F社の方が実際に経験されてきた性能関連のプログラミングについての話でした。
現時点のJavaでマルチコアCPUで気をつけるべきプログラミングの観点をわかりやすく説明されたいいセッションでした。
詳細は下のメモを見ていただけるといいですが、色々とプログラミングで気をつけるべき点を説明されていました。
いいおさらいになりましたし、忘れていることや知らないこともあって勉強になりました。
TLでも見かけましたが、モダンJavaプログラミングみたいな、今のJavaでのプログラミングの気をつけるべき点を書いた書籍があるといいかもなぁと思いました。
あと、もうひとつ私が好印象だと思ったのは、F社の製品の紹介などがなかったからかもしれませんｗ&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;サービス維持・発展を踏まえた楽天オークションのJava EEによる開発と運用　JS2-23　　#jt12_s223&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;楽天オークションの開発をサれている方の立ち上げから現在に至るまでの開発メンバーの管理の仕方や
実際に利用している開発手法、気をつけている点のお話です。
スライドに書いてあること以外のことを発表者の方が話をされており、もう少し、喋る内容に関連した図などを入れてもらえるとわかりやすかったかもしれません。
あとは、WebLogicの管理画面が使いやすくていいという話のあとに、GlassFishに移行していますという話があったりと、少し「？」が浮かぶ部分がありました。。。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JSR 353: Java API for JSON Processing　JS2-33　#jt12_s233&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;最近、Twitterで遊んでもらっている（勝手に絡んでいるだけという話も。。。）@yusukeyさんの発表です。
結構な数の立ち見が出るほどの盛況ぶりで、発表者の@yusukeyさんもびっくりしていました。
JSRがどういった形で実際の仕様として公開されていくのかという話がわかりやすく紹介されていて勉強になりました。
所々で笑いが入るなど、さすがの安定感でした。立ち見が出るはずです。
ようやく、JavaもJSONに関する処理を仕様として取り入れようとしているのはいい傾向かと。
※残念ながら資料は公開されないようです。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UI Controls and Charts: Drag-and-Drop, Filtering, Sorting, Table Hookup with Charts　JS2-42　#jt12_s242&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;最近、Chartに興味を持っていたので、登録したセッションです。
内容としてはJavaFXのコンポーネントをリストアップして紹介していくというお話でした。
グラフ（Chart）周りも数種類が用意されるようです。
JavaFXをあまり知らないのですが、Swingをすこしやっていたのでなんとかついていくことが出来ました。
発表者の方が、実際にJavaFX内部の実装を行われている方だったようで、QAでいくつかこんなコンポーネントはないのか？という質問に、「私のPCでは動いているのですが、ドキュメントなどの整備が追いついていないので公開できていないです」という回答が出て、なかなか大変なのだなぁとｗ
Chartに関しては、グラフの重ね合わせなどがまだできないということで、JFreeChartを触ったことがある身としてはすこし物足りなさそうだなぁというのが印象です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Learn how the JVM is fundamental to our architecture.　BoF2-03  #jt12_b203&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;今回JavaOneに参加した一番の理由がこのセッションです。
Twitterのアーキテクチャに関するセッションでした。
思った以上に濃い内容で、ツイートしたデータがどんな流れで登録されるのか、登録されたデータを各ユーザのTimelineにどのようにアクセスして表示しているのかが説明されました。
今回は主に&lt;a href=&#34;http://twitter.gthub.com/finagle/&#34;&gt;Finagle&lt;/a&gt;についての話でしたが、非同期処理をどのように活用しているかというお話でした。
負荷分散を行なっているポイントやキャッシュについての考え方などです。
メモを取るのに夢中になってしまい、英語をヒアリングするという目的を見失ってしまいましたが。。。
期待以上の話が聞けて満足しています。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;パネルディスカッション&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;最後はJavaに関連するコミュニティを運営されている方々のコミュニティ運営に関するディスカッションです。
コミュニティの運営の苦労している点や、心がけている点など、運営も大変そうだなぁと。
どうしても長くやっているとメンバーが固定化してしまうという話なども出ていました。
これは難しいですよね。会社も同じことが言えますし。
一番印象に残ったのは桜庭さんの「動くものが作れるのが楽しい」という一言でした。
エンジニアをやってるのは確かにそこが面白いからだなぁと。最近忘れかけているので、もっと色々と作っていきたいですね。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;以上がカンタンな感想です。
少し残念なのですが、事前に参加登録していたセッションについては、マイページと呼ばれるところから資料がダウンロードできるものもあるみたいですが、参加登録してないものについてはダウンロードが出来ない様でした。（4/6現在）
参加できなかったセッションの資料こそ見たいと思うのが普通だと思うのですが、どうでしょう？そのうちどこかに公開されるのかなぁ。&lt;/p&gt;
&lt;p&gt;以下は、いつもの通り個人のメモです。&lt;/p&gt;
&lt;hr&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
場所：六本木ヒルズ　アカデミーヒルズ49F
日時：2012/04/05 

○Java EE6 Modeling　JS2-01　#jt12_s201
　スーツ禁止。Eva好き？
　・特徴
　　Web Profile Pruing
　　POJO、Annotation、Less XML
　　Java EE6の半分のAPIは変更なし。新規が11%
　・JavaEE6 Web Profile
　　CDI、Interceptors、JSR 250
　　Singleton EJB
　　JPAはEntityBeanの代わりかな？
　・パッケージングがearではなく、war一つで済むように。
　　war（ウォーファイル）
　　web.xmlはアノテーションで行えるようになり、要らなくなる。
　　
◯マルチコアCPU時代のJavaプログラミング　JS2-14　#jt12_s214
　HotSpotVM依存のお話ですよ。
　・GCとか
　・java.util.concurrent.ForkJoinPool
　　デフォルト並列数は論理CPU数
　・メモリアロケーション
　　TLABが非効率に。先にある程度大きめにスレッドに割り当てを行うため、
　　スレッド数が上がるとTLABが非効率になる-&amp;gt;Eden全体では未使用領域があるんだけどGC発生とか
　・JNIでの問題
　　GetStringCriticalとReleaseStringCritical間はGCが抑止されるため。

　・無意識のロック
　　HashTableやStringBufferなど。
　　String#getBytes()も。
　　InetAddress#getAllByName()が内部でキャッシュを持ってる＝ロック
　　File#renameTo()も内部でキャッシュ（ExpiringCache）持ってる。
　　　Javaでは時間がかかる処理にはキャッシュを利用するという仕組みなので。スレッド数を増加させる場合は注意が必要
　・フェアネスロック
　　lock = new Object();
　　for (int i=0;i&amp;lt;100;i++0{
　　　synchronized(lock){
　　　　System.out.println(&amp;#34;i=&amp;#34;+i+&amp;#34;tid=&amp;#34;+Thread.currentThread().getId());
　　　}
　　}
　　上記を実行してもかたよることがあるよ。＝フェアじゃない
　　モニターによるスレッド割り当ての説明。
　　RentrantLockでフェアネスになるよ。
　・性能分析
　　println()で区間分析。複数スレッドで実行したら実行時間にずれが。
　　println内部でもsynchronizedを利用している。＝ロックのせいで処理時間が遅くなるスレッドが出てきたりする。
　　JVMTIで性能分析する場合RawMonitorEnter,RawMonitorExitでロックとりあいなるのでもマルチスレッッドだと正しい値がでない。GetThreadLocalStrage使え。
　・まとめ：
　　ハードウェア更改時にプログラムの変更が必要になることもあるよ。
　　わずかのロックが命取りに（ロックをあんまり使わない、無意識なロックを見極めなさい）
　　ロックポリシーの選択（レスポンス重視なのか、スループット重視なのか） 

　QA
　　Q：事例が合ったという話でしたが、コードの修正しかないんですか？
　　A：はい。やっぱり治すのがいいです。あとは、チューニングですが。。。
　　Q：ReentrantLockが昔はスレッドダンプにでなかったのですが、今は？
　　A：今は出ます。
　　Q：各世代とJavaのバージョンのマッピングは？
　　A：第3世代が1.5くらいから。第2世代が1.3とか1.4？
　　
◯サービス維持・発展を踏まえた楽天オークションのJava EEによる開発と運用　JS2-23　#jt12_s223
　・短期で人材が参加できるようにしているというお話
　・楽天オークションの成り立ち（郵政とdocomoと楽天）
　・商品、コミュニティ系（出品とか検索とか）と流通系（入出金、配送など）の2軸
　・メンバー30人くらい
　　ミドルエンジニア
　　エンジニア
　　プロデューサー
　・楽天市場をベースとして機能追加
　・巨大でリリースが大変に。
　・この5年で機能分解して機能ごとのリリースをめざして改善している
　・JavaEEを使う理由
　　WebLogic上にバッチが動いているなどの仕組みをしている？
　　管理機能が充実している（WebLogic）
　・GlassFishへ移行中
　　あれ？Weblogicの管理機能がいいんじゃなかったっけ？
　　EJB実装はWebLogicに依存してるのでWebLogicもバージョンアップしてる。
　※メモはここまで。電池の持ちを気にして

◯ JSR 353: Java API for JSON Processing　JS2-33　#jt12_s233
　・JSONとは
　　JavaScript Object Notation
　　「軽量な」データ交換フォーマット
　・JSON仕様のグラフ
　・XMLもあるのになんで？
　　シンプルで可読性が高い
　　属性がなく、複雑なスキーマ仕様がない。
　・コンパクト
　・Twitter、GoogleMaps、YahooWebServicesなど
　・JCP、JSRのお話
　　JSRの役割とか。
　　リファレンス実装の話。
　・JSR-353 http://jcp.org/en/jsr/detail?id=353 
　　StAXやDOMに対応するよ。
　・ゴールではないもの
　　JSONをJavaのドメインオブジェクトにバインドするとかもどすとか。
　・メンバー
　　@yusukeyも一人
　・参加になったきっかけ
　　2011/10にTwitterがJCPに参加
　　2012/12/6にJSON JSR提出
　　年越しに採択
　　@yusukey「これTwitterで重要じゃない？」
　　@cra　「やりましょう」
　・JSRのコミュニケーション
　　世界各地の人なので、基本メールベース（今は自己紹介したくらい。。）
　・既存のJSONライブラリ
　　json.org、jackson、google-gson
　・なんで、いろいろあるのにJSR？
　　標準化、クラスパスにデフォ、シンプル、ライセンスで悩まないとか。
　・ロードマップ
　　エキスパートグループ作成→アーリードラフト→パブリックレビュー→ファイナルリリース
　　いま、アーリードラフト
　・最新仕様
　　javax.json.*
　　javax.json.spi.*
　　javax.json.stream.*
　　javax.json.tree.*
　　メソッドチェインできるみたい。
　　JsonObject.create(reader);みたい
　　JsonObject obj = …;
　　JsonWriter writer = obj.accept(writer.)
　・改善案
　　JSON***にしたいな。
　　spiはらないんじゃないかな？（いま、一個しか無い）
　　treeもいらないんじゃないかな？（そんなに増えないし）
　　parseじゃないかな？
　　メソッド追加（asStringで文字列化とか、create(String)とか）
　QA
　　Q：JSONのスキーマ決めないの？バリデータとか
　　A：JSONスキーマはあんまりもてはやされてない。一応あるのはある。

　さすがの安定感。適宜笑いが入ってて楽しかったです。

◯UI Controls and Charts: Drag-and-Drop, Filtering, Sorting, Table Hookup with Charts　JS2-42　#jt12_s242
　◯JavaFX 2.0のControls
　◯Label、Button、ToggleButton、RadioButton、Hyperlink、CheckBox
　◯Slider、ScrollBar、ScrollPane、ProgressIndicator、ProgressBar
　◯TextField、PasswordField、TextArea
　◯新しい機能
　　TitledPaneとAccordion
　　TabPaneとSplitPane
　◯Charts
　　XYChartとPieChart
　　XYChartにはLineChart、AreaChart、BarChart、ScatterChart、BubbleChartがある。 
　◯Menu
　　MenuItemの下に色々ある。
　　CheckMenuItem、RadioMenuItem、CustomMenuItem（SeparatorMenuItemとか)
　◯ChoiceBox、ContextMenu、ToolTip
　◯ListView
　◯2.1の新機能
　　ComboBox、http://fxexperience.com/2012/03/new-in-javafx-2-1-combobox/
　　StackedBarChart、
　　StackedAreaChart
　　MenuBarのMac OSへの対応（窓の中じゃなく、画面上部にちゃんと出る。）
　　LCD Text
　QA：
　　Q：テキストエリアの日本語入力とかは？
　　A：JavaFX3.0で対応
　　Q：FXML（Scene Builder）を使ってコードが生成されるのか？
　　A：ドラッグ・アンド・ドロップでやる場合はScene Builderでもできるでしょう。私はNetBeansとかでやりますけどね。
　　Q：Dialogはいつ対応されるんでしょうか？
　　A：私は使ってるんですけど、JavaFXに入れてもらえませんｗコードは出来てますｗ
　　Q：Chartがありますが、pngやsvgでの出力は可能？
　　A：できません。そのうちできるかも。
　　Q：Chartの結合はできる？Axisの時間を便利に使うツールはありますか？
　　A：できないです。ありません。
　　Q：FX2.0でカスタムコントロール作るの大変？
　　A：私のマシンでは動いてるんですがｗ
　　Q：ChartにCSSを適用することは可能？
　　A：可能です。データはJavaから出力されたものだけですけどね。
　　Q：JavaFX2.0の起動速度が上がったけど、どういう仕組？
　　A：私は上の方のエンジニアなのでよくわからないですが、GPUをうまく使ってるみたいです。

◯Learn how the JVM is fundamental to our architecture.　BoF2-03  #jt12_b203
　Java、Scala、Linuxのカーネルまで担当してます。
　・Twitterのアーキテクチャ
　・スパイクが急にあがる場合にも対応できるスケールの話。
　　なでしこ、#バルス、大震災など
　・Twitterはプラットフォーム

　・最上位層：HTTP Proxy（Routing）
　・中層：Twitter App（Models/Biz Objects、Composition）
　　UserService、TweetService、TimelineServiceに分解（Models/Biz Objects）
　　API（Composition）
　・最下層：TimelineStorage、TweetStorage、SocialGraph、UserStorage（Storage/Retrieval）
　
　・NEEDS
　　　サーバ負荷をハンドルできる必要がある。
　　　言語のフレキシビリティ（JavaとかScalaとか）
　　　成熟したコンカレンシーモデル
　・Java が提供してるもの
　　開発者のエコシステムが素晴らしい。例：Nettyを使っている。Non-blocking I/O
　　world class JITとコンカレンシーモデル
　　メモリ管理
　　　利点：メモリ管理を意識しなくていい
　　　課題：GC。OpenJDKのコミュニティで参加してる。
　　複数の言語が実行可能な環境
　・OpenJDKについて
　・Finagleのお話。
　　Netty上に作られた非同期なRPCサーバクライアントのライブラリ
　　http://twitter.gthub.com/finagle/
　・TimelineServiceのお話
　　340M/day
　　10K/sec（イベント時）
　・ツイートが入ってくる仕組み
　　HTTP Proxy → tweet API → queue → tweet daemon → fanout （social graph）→ delivery → timeline cache → redis
　・fanout
　　4000フォロワーごとにdeliveryにツイートが渡される。
　・Timelineを見る仕組み
　　HTTP Proxy → timeline API（user service、） →timeline service →timeline cache
　・timeline、tweets、users
　・timeline serviceとtimeline cacheの関係
　　Finagleで負荷分散している
　・timeline serviceからtimeline cacheへのリクエストを監視して、
　　高頻度のリクエストについては、timeline serviceのin-process cacheに入れる仕組み
　・Service[Request, Response]
　　Scalaの記述
　　service(request).onSuccess {response =&amp;gt; println(&amp;#34;got response! &amp;#34; + response) } 
　・Finagleのコンポーネント
　　コネクション管理
　　プロトコルデコード　ThriftでService以降がつながってる。
　　分散トレース　オーバーヘッドを抑えて全体を監視（RPCトレース（呼び出しと処理時間のタイムラインチャート））
　　サービスディスカバリ　
　　observability

◯パネルディスカッション
　・JGGUG、JRuby、Scala、Groovyのコミュニティ運営に関係している方々によるディスカッション。
&lt;/code&gt;&lt;/pre&gt;</content:encoded>
    </item>
    
    <item>
      <title>lucene-gosenのJava7でのテスト失敗問題の対応(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/04/05/lucene-gosen%E3%81%AEjava7%E3%81%A7%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E5%A4%B1%E6%95%97%E5%95%8F%E9%A1%8C%E3%81%AE%E5%AF%BE%E5%BF%9C/</link>
      <pubDate>Thu, 05 Apr 2012 00:20:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/04/05/lucene-gosen%E3%81%AEjava7%E3%81%A7%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E5%A4%B1%E6%95%97%E5%95%8F%E9%A1%8C%E3%81%AE%E5%AF%BE%E5%BF%9C/</guid>
      <description>&lt;p&gt;先日、&lt;a href=&#34;http://johtani.jugem.jp/?eid=72&#34;&gt;2.0.0リリースの記事&lt;/a&gt;にも記載しましたが、&lt;a href=&#34;http://code.google.com/p/lucene-gosen/issues/detail?id=28&#34;&gt;Java7でテストケースが失敗する問題&lt;/a&gt;がありました。&lt;/p&gt;
&lt;p&gt;@haruyamaさんと@hideaki_tさんの協力により問題を解消し、trunkと4xブランチにコミットしました。&lt;/p&gt;
&lt;p&gt;issueにも記載しましたが、Java6からJava7にバージョンアップするタイミングで変更されたUnicodeのバージョンが原因でした。
Java6ではUnicodeのバージョンが4.0です。Java7ではUnicodeのバージョンが6.0に変更されています。
今回の問題は「・」（0x30FB）の文字列のCharacter.getType()がCONNECTOR_PUNCTUATIONからOTHER_PUNCTUATIONに変更されたのが原因です。（この変更自体はUnicode 4.1で変更されたみたい）
カタカナ文字種の判別をlucene-gosenのnet.java.sen.tokenizers.ja.JapaneseTokenizerのgetCharClass(char c)メソッドで行なっています。
修正前は、ここで、charの範囲が0x30A0～0x30FFにある文字でかつ、Character.getType()がCONNECTOR_PUNCTUATIONでないものがカタカナとして判別されていました。
issueの添付ファイルにJava6とJava7で上記範囲の文字のCharacter.getType()のリストを生成して、該当する文字を探した所、「・」（0x30FB）のみであることがわかりました。
ということで、このコードの意図としては、「・」はカタカナではないと判別したかったのだと。
上記の確認を行えたので、ソースコードを修正してコミットしました。
2.0.1としてリリースするかは、&lt;a href=&#34;http://code.google.com/p/lucene-gosen/issues/detail?id=29&#34;&gt;Issue29&lt;/a&gt;のボリュームを見て考えますので、もう少しお待ちください。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;先日、&lt;a href=&#34;http://johtani.jugem.jp/?eid=72&#34;&gt;2.0.0リリースの記事&lt;/a&gt;にも記載しましたが、&lt;a href=&#34;http://code.google.com/p/lucene-gosen/issues/detail?id=28&#34;&gt;Java7でテストケースが失敗する問題&lt;/a&gt;がありました。&lt;/p&gt;
&lt;p&gt;@haruyamaさんと@hideaki_tさんの協力により問題を解消し、trunkと4xブランチにコミットしました。&lt;/p&gt;
&lt;p&gt;issueにも記載しましたが、Java6からJava7にバージョンアップするタイミングで変更されたUnicodeのバージョンが原因でした。
Java6ではUnicodeのバージョンが4.0です。Java7ではUnicodeのバージョンが6.0に変更されています。
今回の問題は「・」（0x30FB）の文字列のCharacter.getType()がCONNECTOR_PUNCTUATIONからOTHER_PUNCTUATIONに変更されたのが原因です。（この変更自体はUnicode 4.1で変更されたみたい）
カタカナ文字種の判別をlucene-gosenのnet.java.sen.tokenizers.ja.JapaneseTokenizerのgetCharClass(char c)メソッドで行なっています。
修正前は、ここで、charの範囲が0x30A0～0x30FFにある文字でかつ、Character.getType()がCONNECTOR_PUNCTUATIONでないものがカタカナとして判別されていました。
issueの添付ファイルにJava6とJava7で上記範囲の文字のCharacter.getType()のリストを生成して、該当する文字を探した所、「・」（0x30FB）のみであることがわかりました。
ということで、このコードの意図としては、「・」はカタカナではないと判別したかったのだと。
上記の確認を行えたので、ソースコードを修正してコミットしました。
2.0.1としてリリースするかは、&lt;a href=&#34;http://code.google.com/p/lucene-gosen/issues/detail?id=29&#34;&gt;Issue29&lt;/a&gt;のボリュームを見て考えますので、もう少しお待ちください。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;参考にしたサイト：
&lt;a href=&#34;http://www.hos.co.jp/blog/20111004/&#34;&gt;JavaSE 7でメソッド名に使えなくなった文字&lt;/a&gt;
&lt;a href=&#34;http://www.unicode.org/reports/tr44/tr44-4.html#Change_History&#34;&gt;UNICODE CHARACTER DATABASE&lt;a/&gt;のHistory&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>【重要】lucene-gosen 2.0.0リリース(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/04/02/%E9%87%8D%E8%A6%81lucene-gosen-2-0-0%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9/</link>
      <pubDate>Mon, 02 Apr 2012 19:22:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/04/02/%E9%87%8D%E8%A6%81lucene-gosen-2-0-0%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9/</guid>
      <description>&lt;p&gt;先日、宣言したとおり、lucene-gosenのパッケージ名＋クラス名の変更を行ったlucene-gosen 2.0.0をリリースしました。
Lucene/Solr 3.6.0のリリースを待つつもりだったのですが、なかなか出ないので先にリリースを行いました。
現時点では、branches/4xについては、パッケージ名、クラス名の修正が追いついていません。
明日までに4xブランチについても修正を反映する予定です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;先日、宣言したとおり、lucene-gosenのパッケージ名＋クラス名の変更を行ったlucene-gosen 2.0.0をリリースしました。
Lucene/Solr 3.6.0のリリースを待つつもりだったのですが、なかなか出ないので先にリリースを行いました。
現時点では、branches/4xについては、パッケージ名、クラス名の修正が追いついていません。
明日までに4xブランチについても修正を反映する予定です。&lt;/p&gt;
&lt;p&gt;参考までに、1.2.1から2.0.0への変更点について以下にまとめました。
また、変更に伴い、Solrのschema.xmlに記述するクラス名も変更になります。
&lt;a href=&#34;http://lucene-gosen.googlecode.com/svn/trunk/example/schema.xml.snippet&#34;&gt;schema.xmlのサンプルについてはこちらをご覧下さい。&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;変更点&#34;&gt;&lt;strong&gt;変更点&lt;/strong&gt;&lt;/h3&gt;
&lt;hr&gt;
&lt;p&gt;まずは、パッケージ名の変更点です。
左が旧パッケージ名、右が新パッケージ名となります。&lt;/p&gt;
&lt;table class=&#34;list_view&#34;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;旧パッケージ名&lt;/th&gt;
      &lt;th&gt;新パッケージ名&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr class=&#34;spec&#34;&gt;
      &lt;td&gt;org.apache.lucene.analysis.ja&lt;/td&gt;
      &lt;td&gt;org.apache.lucene.analysis.gosen&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr class=&#34;specalt&#34;&gt;
      &lt;td class=&#34;alt&#34;&gt;org.apache.lucene.analysis.ja.tokenAttributes&lt;/td&gt;
      &lt;td class=&#34;alt&#34;&gt;org.apache.lucene.analysis.gosen.tokenAttributes&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;また、パッケージ名とは別に、以下のクラス名も変更になっています。
まずは、&lt;b&gt;org.apache.lucene.analysis.gosen&lt;/b&gt;のクラス名の変更点です。&lt;/p&gt;
&lt;table class=&#34;list_view&#34;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;旧クラス名&lt;/th&gt;
      &lt;th&gt;新クラス名&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr class=&#34;spec&#34;&gt;
      &lt;td&gt;JapaneseAnalyzer.java&lt;/td&gt;
      &lt;td&gt;GosenAnalyzer.java&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr class=&#34;specalt&#34;&gt;
      &lt;td&gt;JapaneseBasicFormFilter.java&lt;/td&gt;
      &lt;td&gt;GosenBasicFormFilter.java&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr class=&#34;spec&#34;&gt;
      &lt;td&gt;JapaneseKatakanaStemFilter.java&lt;/td&gt;
      &lt;td&gt;GosenKatakanaStemFilter.java&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr class=&#34;specalt&#34;&gt;
      &lt;td&gt;JapanesePartOfSpeechKeepFilter.java&lt;/td&gt;
      &lt;td&gt;GosenPartOfSpeechKeepFilter.java&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr class=&#34;spec&#34;&gt;
      &lt;td&gt;JapanesePartOfSpeechStopFilter.java&lt;/td&gt;
      &lt;td&gt;GosenPartOfSpeechStopFilter.java&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr class=&#34;specalt&#34;&gt;
      &lt;td&gt;JapanesePunctuationFilter.java&lt;/td&gt;
      &lt;td&gt;GosenPunctuationFilter.java&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr class=&#34;spec&#34;&gt;
      &lt;td&gt;なし&lt;/td&gt;
      &lt;td&gt;GosenReadingsFormFilter.java&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr class=&#34;specalt&#34;&gt;
      &lt;td&gt;JapaneseTokenizer.java&lt;/td&gt;
      &lt;td&gt;GosenTokenizer.java&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr class=&#34;spec&#34;&gt;
      &lt;td&gt;JapaneseWidthFilter.java&lt;/td&gt;
      &lt;td&gt;GosenWidthFilter.java&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
次は&lt;b&gt;**org.apache.solr.analysis**&lt;/b&gt;です。
&lt;table class=&#34;list_view&#34;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;旧クラス名&lt;/th&gt;
      &lt;th&gt;新クラス名&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr class=&#34;spec&#34;&gt;
      &lt;td&gt;JapaneseBasicFormFilterFactory.java&lt;/td&gt;
      &lt;td&gt;GosenBasicFormFilterFactory.java&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr class=&#34;specalt&#34;&gt;
      &lt;td&gt;JapaneseKatakanaStemFilterFactory.java&lt;/td&gt;
      &lt;td&gt;GosenKatakanaStemFilterFactory.java&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr class=&#34;spec&#34;&gt;
      &lt;td&gt;JapanesePartOfSpeechKeepFilterFactory.java&lt;/td&gt;
      &lt;td&gt;GosenPartOfSpeechKeepFilterFactory.java&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr class=&#34;specalt&#34;&gt;
      &lt;td&gt;JapanesePartOfSpeechStopFilterFactory.java&lt;/td&gt;
      &lt;td&gt;GosenPartOfSpeechStopFilterFactory.java&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr class=&#34;spec&#34;&gt;
      &lt;td&gt;JapanesePunctuationFilterFactory.java&lt;/td&gt;
      &lt;td&gt;GosenPunctuationFilterFactory.java&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr class=&#34;specalt&#34;&gt;
      &lt;td&gt;なし&lt;/td&gt;
      &lt;td&gt;GosenReadingsFormFilterFactory.java&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr class=&#34;spec&#34;&gt;
      &lt;td&gt;JapaneseTokenizerFactory.java&lt;/td&gt;
      &lt;td&gt;GosenTokenizerFactory.java&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr class=&#34;specalt&#34;&gt;
      &lt;td&gt;JapaneseWidthFilterFactory.java&lt;/td&gt;
      &lt;td&gt;GosenWidthFilterFactory.java&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;また、上記クラスに関連するテストクラスの名前も変更になっています。&lt;/p&gt;
&lt;p&gt;以上がクラス名、パッケージ名の対応に関する修正ついてでした。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;また、現在、&lt;a href=&#34;http://code.google.com/p/lucene-gosen/issues/detail?id=28&#34;&gt;Java7にてテストケースが失敗する問題&lt;/a&gt;が見つかっています。
こちらの問題の対応版についても近日中にリリースを行う予定です。&lt;/p&gt;
&lt;p&gt;問題点、質問などありましたら、コメントしていただくと回答いたします。&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2012-04-03追記&lt;/b&gt;
忘れてました、すみません。今回のリリースで、以下の機能が追加されています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Antのパラメータにproxy.user、proxy.passwordの追加&lt;/li&gt;
&lt;li&gt;GosenReadingsFormFilterの追加&lt;/li&gt;
&lt;li&gt;TokenAttributeの修正（PronunciationsAttributeImpl、ReadingsAttributeImpl）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Antは認証が必要なプロキシ環境で辞書のビルドを実施するときにユーザ名、パスワードを指定できるようにしました。&lt;/p&gt;
&lt;p&gt;GosenReadingsFormFilterは単語を読みに変換するTokenFilterになります。
よみは、辞書に登録してある読みになります。オプションとして、romanizedが指定可能です。指定をすると、よみをローマ字に変換します。&lt;/p&gt;
&lt;p&gt;TokenAttributeの修正は、バグフィックスになります。&lt;a href=&#34;http://code.google.com/p/lucene-gosen/issues/detail?id=26&amp;amp;can=1&#34;&gt;Issueはこちら&lt;/a&gt;です。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>【重要】lucene-gosenの次期リリースについて(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/03/27/%E9%87%8D%E8%A6%81lucene-gosen%E3%81%AE%E6%AC%A1%E6%9C%9F%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/</link>
      <pubDate>Tue, 27 Mar 2012 02:39:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/03/27/%E9%87%8D%E8%A6%81lucene-gosen%E3%81%AE%E6%AC%A1%E6%9C%9F%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/</guid>
      <description>&lt;p&gt;lucene-gosenを利用して頂いてる皆様に連絡があります。&lt;/p&gt;
&lt;h3 id=&#34;連絡事項&#34;&gt;連絡事項&lt;/h3&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;次期lucene-gosenのリリース（2.0を予定）にて、org.apache系のパッケージ名および、クラス名の変更を行います。&lt;/strong&gt;
Lucene/Solrの次期リリース版である3.6.0以降では、lucene-gosen 2.0（予定）を利用するようにしてください。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;lucene-gosenを利用して頂いてる皆様に連絡があります。&lt;/p&gt;
&lt;h3 id=&#34;連絡事項&#34;&gt;連絡事項&lt;/h3&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;次期lucene-gosenのリリース（2.0を予定）にて、org.apache系のパッケージ名および、クラス名の変更を行います。&lt;/strong&gt;
Lucene/Solrの次期リリース版である3.6.0以降では、lucene-gosen 2.0（予定）を利用するようにしてください。&lt;/p&gt;
&lt;h3 id=&#34;経緯&#34;&gt;経緯&lt;/h3&gt;
&lt;hr&gt;
&lt;p&gt;Twitterでは少しずつツイートしていますが、Lucene/Solr 3.6から日本語の形態素解析器がLucene/Solrにて用意されることになりました。
ベースとなっているのは、Atilika社が開発した&lt;a href=&#34;http://atilika.org/&#34;&gt;Kuromoji&lt;/a&gt;という形態素解析器です。
Lucene/SolrにコントリビュートされたタイミングではKuromojiAnalyzerなど、Kuromojiという名称が残った形で取り込みが行われました。
その後、&lt;a href=&#34;https://issues.apache.org/jira/browse/LUCENE-3909&#34;&gt;LUCENE-3909&lt;/a&gt;にて、Kuromojiではなく、一般的な名称（Japanese*）に変更する提案が行われました。
この提案で、luene-gosenが利用しているクラス名、パッケージ名と大半のクラスが衝突してしまうこととなりましす。
今後も、lucene-gosenを利用していただけるように、lucene-gosenの&lt;a href=&#34;http://code.google.com/p/lucene-gosen/issues/detail?id=27&#34;&gt;Issue&lt;/a&gt;を発行し、
現在、lucene-gosenのtrunkにてパッケージ名の変更及びクラス名の変更作業を行なっています。
正式にリリースするタイミングになりましたら、再度連絡いたします。&lt;/p&gt;
&lt;h3 id=&#34;ブランチなどについて&#34;&gt;ブランチなどについて&lt;/h3&gt;
&lt;hr&gt;
&lt;p&gt;現時点ではパッケージ名、クラス名の変更はリポジトリの以下のものについてのみ作業を行う予定です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;trunk&lt;/li&gt;
&lt;li&gt;branches/4x&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;現時点でのリリース版（1.2系）のソースについてはbranches/rel-1.2にて、これまで同様のクラス名、パッケージ名のまま変更を行いません。
1.2系についてはこちらをご覧下さい。&lt;/p&gt;
&lt;p&gt;また、当ブログにて、提供しているSolr入門のサンプルに利用可能なschema.xmlなどの&lt;a href=&#34;http://johtani.jugem.jp/?eid=44&#34;&gt;記事&lt;/a&gt;についてもLucene/Solr3.6がリリースされた際には再度修正して掲載いたします。
Kuromojiの利用方法もあわせて記載したいです。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;参考：
lucene-gosenとKuromojiの機能などの比較については&lt;a href=&#34;http://www.rondhuit.com/solr%E3%81%AE%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%AF%BE%E5%BF%9C.html&#34;&gt;こちら&lt;/a&gt;を参考にしてください。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>久々にMac Miniのことでも(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/03/25/%E4%B9%85%E3%80%85%E3%81%ABmac-mini%E3%81%AE%E3%81%93%E3%81%A8%E3%81%A7%E3%82%82/</link>
      <pubDate>Sun, 25 Mar 2012 04:47:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/03/25/%E4%B9%85%E3%80%85%E3%81%ABmac-mini%E3%81%AE%E3%81%93%E3%81%A8%E3%81%A7%E3%82%82/</guid>
      <description>&lt;p&gt;子供の寝かしつけしてたら、寝かしつけされてしまって、２時に目が覚めてしまいました。
TSUTAYAでCD借りてきてウォークマンに入れようと思っていたのに。。。
ということで、今作業してます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;子供の寝かしつけしてたら、寝かしつけされてしまって、２時に目が覚めてしまいました。
TSUTAYAでCD借りてきてウォークマンに入れようと思っていたのに。。。
ということで、今作業してます。&lt;/p&gt;
&lt;p&gt;MBAを買う前から使っている、もう９年目のWindows自作デスクトップで基本的にはCDの取り込みをしています。
&lt;a href=&#34;http://buffalo.jp/products/catalog/storage/hs-dhtgl_r5/?PHPSESSID=1c389a9c0b58221d0102b4b1e8498e2e&#34;&gt;ファイルサーバ（BuffaloのTeraStation）&lt;/a&gt;がLionから接続できないというのと、
X-アプリで曲管理していたのでという理由です。
あと、ウォークマンなのでMac用のソフトがなかったりというのも理由です。&lt;/p&gt;
&lt;p&gt;で、眠い目をこすりながらWindowsマシンを起動すると、ネットワークにつながらないじゃないですか。。。
再起動してもダメでした。&lt;/p&gt;
&lt;p&gt;となってしまったので、せっかく、譲ってもらったMac miniも活用しないといけないなと思い、iTunesでアルバムを取り込んでみています。
ここ数年はWAV形式でデータを取り込んでいたので、WAVでの取り込みを設定して、iTunesで取り込みました。&lt;/p&gt;
&lt;p&gt;とまぁ、ここまでやってから、件のWindows機を再度、再起動したらネットワークに繋がってしまいました。。。
なので、残りのCDはWindows機で取り込みしてます。
けど、そろそろこのPCも危なそうなので、データをサルベージして、Mac miniで作業できるようにしないとなぁ。
Macでウォークマンを運用している人はどうやってるんだろう？
ちなみに私が利用しているウォークマンは&lt;a href=&#34;http://www.sony.jp/walkman/products/NW-A847_V/index.html&#34;&gt;NW-A847&lt;/a&gt;です。
エンコードはWAV形式で取り込んで、X-アプリでウォークマンに入れています。
iTunes使ってる人は、アップルのロスレスエンコードをつかってるのかなぁ？
ということで、調査・検討したい項目はこんなところですか。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;調査：TeraStationにMacからつなぐ方法（Lionで利用できそうなソフトなにかないかな？）&lt;/li&gt;
&lt;li&gt;調査：iTunesでウォークマンに曲転送（やってみればすぐわかるだろう。。。）&lt;/li&gt;
&lt;li&gt;調査：iTunesの曲をCDに焼く方法（車で曲聞くのにCDだから）&lt;/li&gt;
&lt;li&gt;検討：ファイルサーバのリプレース対象となる機種（ファイルサーバは導入してまだ５年だから余裕がないと買い換えない）&lt;/li&gt;
&lt;li&gt;検討：iPodに鞍替え（Sony好きだし、ウォークマン好きだし、買ったばっかりだからまず無い選択肢）&lt;/li&gt;
&lt;li&gt;検討：Mac miniにVirtualBox入れて、WindowsからX-アプリ使うとか。（ファイルサーバが見えるようになるかな？）&lt;/li&gt;
&lt;li&gt;検討：Mac miniをWindowsとして運用（もったいなさすぎる気がする）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;とまぁ、まだ悩んでるだけで、取り留めもない事を書いて、しかも結論が出ないままですが、ご容赦ください。
ご意見、提案を大募集してます！！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第5回 Twitter API勉強会 @渋谷 #twtr_hack(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/03/22/%E7%AC%AC5%E5%9B%9E-twitter-api%E5%8B%89%E5%BC%B7%E4%BC%9A--%E6%B8%8B%E8%B0%B7--twtr_hack/</link>
      <pubDate>Thu, 22 Mar 2012 00:28:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/03/22/%E7%AC%AC5%E5%9B%9E-twitter-api%E5%8B%89%E5%BC%B7%E4%BC%9A--%E6%B8%8B%E8%B0%B7--twtr_hack/</guid>
      <description>&lt;p&gt;はい。またまた、Twitter API勉強会に参加してきました。（今回から開催回数の記載がなくなった？）
今回は直前でタイムテーブルが変わってしまう波乱がありましたが、個人的には楽しめる内容でした。
Twitterの国際化や形態素解析などの話が聞けたのがすごく面白かったです。
アーキテクチャや利用されている形態素解析器の話など、また、現状の問題点なども話が聞けました。
日々、進化しているんだなぁと。
残念ながら、発表者の方が懇親会にいらっしゃらなかったので、詳しく聞けませんでしたが、挨拶だけは出来ました。
実際のテスト環境や導入方法、A/Bテストとかやってるのかなど、ブログをかきながら色々と気になることが出てきてしまいますｗ
頭の回転がよくないので、話を聞いてる間は質問があんまり思い浮かばなかったなぁ。。。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;はい。またまた、Twitter API勉強会に参加してきました。（今回から開催回数の記載がなくなった？）
今回は直前でタイムテーブルが変わってしまう波乱がありましたが、個人的には楽しめる内容でした。
Twitterの国際化や形態素解析などの話が聞けたのがすごく面白かったです。
アーキテクチャや利用されている形態素解析器の話など、また、現状の問題点なども話が聞けました。
日々、進化しているんだなぁと。
残念ながら、発表者の方が懇親会にいらっしゃらなかったので、詳しく聞けませんでしたが、挨拶だけは出来ました。
実際のテスト環境や導入方法、A/Bテストとかやってるのかなど、ブログをかきながら色々と気になることが出てきてしまいますｗ
頭の回転がよくないので、話を聞いてる間は質問があんまり思い浮かばなかったなぁ。。。&lt;/p&gt;
&lt;p&gt;その他にも（使ったことなくてすみません。。。）「昼会」のサービスの話、他の言語でのTwitterの活用の話も聞けました。&lt;/p&gt;
&lt;p&gt;途中で帰ってしまいましたが、懇親会でも数人の方とお話できて、楽しかったです。
（今回の懇親会会場はちょっと人数の割に手狭だったかもなぁ）&lt;/p&gt;
&lt;p&gt;次回は4月末を予定しているようでした。今度こそ、利用規約の話になるんですかね？
忙しさを見つつ、また参加しようかと思います。&lt;/p&gt;
&lt;p&gt;ということで、いつものメモです。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;開催日時：2012/03/21 19:00  ～  21:00場所：ハロー会議室shibuya
&lt;a href=&#34;http://www.zusaar.com/event/237004&#34;&gt;Zusaarのページ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;◎Twitterの日本語検索、ハッシュタグについて　@keita_f&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　◯アーキテクチャ
　　・Twitterバックエンドの国際化
　　　Before
　　　　各言語ごとに独自実装。
　　　After
　　　　共通テキスト処理ライブラリ：Penguin
　　・アーキテクチャ：検索
　　　Firehose → ingester → Earlybird ⇔ Blender ← ユーザの検索
　　　Firehose：ツイートの受信
　　　ingester：ツイート解析
　　　Earlybird：Luceneベースのインデクサ
　　　Blender：
　　・アーキテクチャ：トレンド
　　　TrendsはGeo（ユーザ位置情報）を利用してるっぽい。
　　　Term Statisticsは過去ツイートからHadoopで頻出フレーズを解析する。
　　　今頻出しているフレーズ＋過去頻出しているフレーズ
　◯日本語関連
　　・ツイートの言語判定
　　　言語判定にはIndigenous Tweets（Kevin Scannell）をベースに実装。
　　　５０言語サポート、Javaで実装
　　　・文字種チェック
　　　・エンコーディングチェック
　　　・Ngram（the→英語、das→ドイツ語）
　　　問題点：
　　　　２つ以上の言語が混じってる場合
　　　　絵文字が入ってる場合
　　　　Unicodeアルファベット
　　・形態素解析
　　　日本語：Gomoku
　　　中国語：LuceneのSmartCN
　　　その他：N-Gram
　　　問題点：
　　　　形態素が小さすぎる
　　　　→そのままだと細かすぎるので品詞情報を元に大きめに区切るようにしている
　　　　iPhone4Sなどが数字で区切られる
　　　　→ASCIIの数字とアルファベットは連結しなおす
　　・フレーズ抽出
　　　他の言語もあったけど、キー入力間に合わず
　　　日本語の場合：
　　　　トークンに分割
　　　　トークンでNgramを生成
　　　　品詞情報を使ってフィルター
　　　　　最初、最後が助詞はNG、接頭詞で終わるのはNG
　　　
　　・やりたい事はまだまだたくさん
　　　・形態素解析の品質向上
　　　　辞書への単語追加
　　　　韓国語、タイ語のトークなイザー
　　　・同義語、類義語、翻訳、音訳、略語などのサポート
　　　・フレーズ・トピックのクラスタリング
　　　・Sentiment Analysis
　　・日本語のできるエンジニア募集中ｗ
　　QA
　　　Q：顔文字を手動で抜き出すと言われたんですが、どのくらいあるんでしょうか？　　　A：正規表現なので、なんとも言えませんが、パターンを
　　　Q：Gomokuの選択の理由は？
　　　A：Javaだから。jarに辞書が入るから。スピードが出るから。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;◎ランチタイム共有サービス「&lt;a href=&#34;http://www.hirukai.jp/&#34;&gt;昼会(http://www.hirukai.jp/)&lt;/a&gt;」のご紹介　@setomits&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;　
　◯前提
　　・ネットワーキングは重要
　　・出会いも重要
　　・飲み会だとコスパが悪い
　◯ランチだと
　　・金額が限られる
　　・必ず食べる
　　ということで、昼会だ！
　◯画面でサービスの説明
　　パブリックな昼会、プライベートな昼会がある。
　◯なんでTwitter？
　　LinkedInのOAuthを使ったログイン検討してた。
　　ビジネス目的＋
　　敷居が高いのでTwitterに変更
　◯Twitterのapiで利用しているものなど
　◯ユーザの声
　　・DMを使ってる＝自分からのDMが気持ち悪い
　　　APIの使用制限やフォローしてもらう必要があるのが辛い。
　　　- スパムかと思った
　　　- 乗っ取られたかと思った。
　　　- エンジニアからは、「まぁ、こうするよね」
　　・OAuthについて
　　　- ユーザ登録しなくていいのは嬉しい
　　　- イベント参加のためにOAuthでの書き込み権限まで与えたくない
　◯８ヶ月経って
　　・新しい出会いがあった
　　・昼会を開催する敷居が高い
　　　＝なかなか使ってもらえない
　◯今後の計画
　　募集中！
　　
　QA
　　Q：AppEngineで月額どのくらい？
　　A：料金改定前：数千円/１ヶ月、料金改定後：２万円くらい/１ヶ月
　　　　処理数を減らして、現時点では数千円/１ヶ月に最適化した
　　Q：夜会はないんですか？
　　A：設計していたら、出会い系サイト？になりそうなので、昼にした。
　　　　ドメイン的になぁ。まだ悩み中
　　Q：GAE特化したもの？AWSに移行できる作り？
　　A：できない作りです。（pythonで書いてます。）
　　　　GAEが楽なので、移行可能な作りにするのがつらい。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;◎LT
　◯Twitter 4 contact　@inda_re
　　・広告！&lt;a href=&#34;http://partake.in/events/629f58aa-2407-4ca5-80b3-9050a3680b61&#34;&gt;アジャイルサムライの道場&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　　・問い合わせフォームをTwitterにしちゃう
　　　今あるHTMLにフォームを入れる方法（MySQLとPHP）
　　　githubにサンプルあるよ。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;　◯PerlのTwitterモジュールについて　@xtetsuji&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　　・前回出席したら、ムチャぶりが！
　　・いまどきのPerl
　　　進化してるよ、古い情報が検索で出てきてしまうのがネック
　　・perlbrewってのがある
　　　http://perlbrew.pl/
　　・AnyEvent::Twitter::Streamをよく使ってます。
　　・gistにサンプルあげてあるよ！
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;　◯KotlinでもTwitter4J　@ngsw_taro
　　・Kotlinの説明
　　・以下のサイトでインストールしなくても動かせるよ！
　　　&lt;a href=&#34;http://kotlin-demo.jetbrains.com/&#34;&gt;http://kotlin-demo.jetbrains.com/&lt;/a&gt;
　　・NULL安全
　　　Nullを許容する型、許容しない型がある。
　　・一応、Twitter4Jのサンプルも作ったけど、ブログ見てね
　　　 &lt;a href=&#34;http://d.hatena.ne.jp/ngsw_taro/&#34;&gt;http://d.hatena.ne.jp/ngsw_taro/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;　◯締め
　Twitter API勉強会ではスピーカーを常に募集中です。登録は&lt;a href=&#34;http://bit.ly/twtr-talk&#34;&gt;こちら！&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;　
　&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>「自分の小さな「箱」から脱出する方法」を読みました。(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/03/20/%E8%87%AA%E5%88%86%E3%81%AE%E5%B0%8F%E3%81%95%E3%81%AA%E7%AE%B1%E3%81%8B%E3%82%89%E8%84%B1%E5%87%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%82%92%E8%AA%AD%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Tue, 20 Mar 2012 23:32:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/03/20/%E8%87%AA%E5%88%86%E3%81%AE%E5%B0%8F%E3%81%95%E3%81%AA%E7%AE%B1%E3%81%8B%E3%82%89%E8%84%B1%E5%87%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%82%92%E8%AA%AD%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;TLで面白いと見かけて、Amazonで買ってしまいました。
SEやってるのに、つい最近Amazonを使い始めた軟弱者です。
それにしてもAmazon危険です。スマートフォンにAmazonの
Androidアプリを入れたのですが、これがまた、レコメンドに面白そうな本が出てきて危険です。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;TLで面白いと見かけて、Amazonで買ってしまいました。
SEやってるのに、つい最近Amazonを使い始めた軟弱者です。
それにしてもAmazon危険です。スマートフォンにAmazonの
Androidアプリを入れたのですが、これがまた、レコメンドに面白そうな本が出てきて危険です。&lt;/p&gt;
&lt;p&gt;話がそれてしまいましたが、面白い本でした。
久々に、小説でも技術書でもない本を短期間で読みました。
「箱」と呼ばれる概念の中と外について、とある会社に転職した管理職の人が学んでいくという物語風の作りです。
いくつか、自分の経験にカブるシーンがあったので、サクサク読めました。
今までの自分になかった考えである「箱」という視点が得られたのがよかったです。&lt;/p&gt;
&lt;p&gt;ただ、いくつか気になる点もあるので、また少し時間を開けてからサラっと流し読みしたいと思います。&lt;/p&gt;
&lt;p&gt;あと、すこしだけ、キリスト教チックな考え方でもあるかなぁと思う部分もありました。（キリスト教をちゃんと勉強してるわけではないので認識が間違ってるかもしれないです）&lt;/p&gt;
&lt;p&gt;人によっては共感出来なかったり、読みにくかったりすると思いますが、私は面白いと思った本でした。
なんとなく、人間関係に違和感を感じていることがある場合は目を通してみるといいかもしれません。&lt;/p&gt;
&lt;p&gt;Twitterで読み終えたというツイートをしたら、&lt;a href=&#34;http://twitter.com/#!/ledsun/status/182100538727473152?PHPSESSID=43e66de98af6cc0a11e1a6953d2619a2&#34;&gt;「自分を変える気づきの瞑想法」を読むとまた面白いですという＠ツイート（これがmentionの日本語の正式名称らしい？）&lt;/a&gt;を&lt;a href=&#34;http://twitter.com/ledsun&#34;&gt;@ledsun&lt;/a&gt;いただきました。
箱に入る原理が別の視点で書かれているようです。
読んでみたいです。（本会過ぎてる気がするので、図書館で探そうかなぁ。。。）&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/490450786X/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51--IvLbZ5L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/490450786X/?tag=johtani-22&#34;&gt;
      自分を変える気づきの瞑想法【増補改訂版】
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/490450786X/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51--IvLbZ5L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/490450786X/?tag=johtani-22&#34;&gt;
      自分を変える気づきの瞑想法【増補改訂版】
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Scala始めました(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/03/14/scala%E5%A7%8B%E3%82%81%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Wed, 14 Mar 2012 00:27:01 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/03/14/scala%E5%A7%8B%E3%82%81%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;えーと、ブログ更新してないなぁとふと思ったので。
１年前くらいからずーっと、つぶやいてましたが、やっとScalaを始めました。
長かった。。。
とある、サンプルデータを作成するので、ついでにScalaを勉強してしまえという感じで始めました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;えーと、ブログ更新してないなぁとふと思ったので。
１年前くらいからずーっと、つぶやいてましたが、やっとScalaを始めました。
長かった。。。
とある、サンプルデータを作成するので、ついでにScalaを勉強してしまえという感じで始めました。&lt;/p&gt;
&lt;p&gt;Scalaで学ぶ関数脳入門を買ってもう１年以上経ってました。。。
とりあえず、CSVデータからInsert文を作ってます。
書籍を見ながら、四苦八苦してるところです。
今日は、csvファイルを読み込んで適当に出力した所で終了でした。
現状を忘れないようにというのと、いくつか気になった点があったので、備忘録のため上げておきます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;scala IDE for Eclipseを利用（もっさりしてる）&lt;/li&gt;
&lt;li&gt;classとは別にobjectというものがある点に慣れない&lt;/li&gt;
&lt;li&gt;セミコロンいらないのに、ついつい打ってしまう&lt;/li&gt;
&lt;li&gt;usingを利用しようとしたが、Eclipseに怒られた（なんで？）&lt;/li&gt;
&lt;li&gt;メソッドの戻り値を省略出来る場合とできない場合がよくわかってない&lt;/li&gt;
&lt;li&gt;Javaが混ざる（ファイル出力にBufferedWriterを使う）のがまた戸惑う&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ということで、四苦八苦してますｗ
７つの言語、７つの世界も参考にしつつ、コップ本をパラパラしながら、ググって書くといった感じです。
Javaだととっくにできていると思うのですが、まだ、読み込んで出力できただけです。&lt;/p&gt;
&lt;p&gt;新しいものに触れるのは頭を使って面白いのですが、思い通りに行かず（とくにIDEがもっさりしてたり、上手く使えなかったり）イライラもしていますｗ
まぁ、ちょっとずつ勉強していきます。&lt;/p&gt;
&lt;p&gt;（ほかにもいろいろやらないとなぁ。。。）&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4844330845/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/415CsfYp64L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4844330845/?tag=johtani-22&#34;&gt;
      Scalaスケーラブルプログラミング第2版
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4844330845/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/415CsfYp64L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4844330845/?tag=johtani-22&#34;&gt;
      Scalaスケーラブルプログラミング第2版
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第0回 Twitter Hack #twtr_hack に遊びに行きました。(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/03/09/%E7%AC%AC0%E5%9B%9E-twitter-hack--twtr_hack-%E3%81%AB%E9%81%8A%E3%81%B3%E3%81%AB%E8%A1%8C%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Fri, 09 Mar 2012 03:10:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/03/09/%E7%AC%AC0%E5%9B%9E-twitter-hack--twtr_hack-%E3%81%AB%E9%81%8A%E3%81%B3%E3%81%AB%E8%A1%8C%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;森ビルに行ったことなかったので、参加してみました。
あと、最近まともにコーディングしてないので、そのへんを矯正するためにもと思って。
（まぁ、遊びに行きたかっただけなんですけどね）&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;森ビルに行ったことなかったので、参加してみました。
あと、最近まともにコーディングしてないので、そのへんを矯正するためにもと思って。
（まぁ、遊びに行きたかっただけなんですけどね）&lt;/p&gt;
&lt;p&gt;すこし遅刻して参加です。
会場は、Twitter Japanさんの@yakitoriでした。ここだけ、撮影可でした。


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20120309/20120309_2267058.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20120309/20120309_2267058.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

で、肝心のハッカソンの中身です（ハッカソン自体、初参加！）。
Twitter APIもTwitter4Jも触ったことがありません。
なので、ソファーに座ってMac Book AirでTwitter4Jのサンプルを眺めながら、とりあえず、Solrに流しこむってのを作ってみました。
今回、Solrに用意したのはlucene-gosenによる形態素解析を行うフィールドとあとは、Solrのexampleについてるダイナミックフィールドたちです。
Twitter4Jからどんなデータが取れるかわからないので、ダイナミックフィールドで型だけ指定してSolrを起動しておきます。
次に、Twitter4Jにある&lt;a href=&#34;http://twitter4j.org/en/javadoc/twitter4j/TwitterStream.html#sample()&#34;&gt;sample()&lt;/a&gt;にてパブリックなツイートの1%を取得（適当なのがこれくらいしか思い浮かばなかったから）。
あとは、SolrJの&lt;a href=&#34;http://lucene.apache.org/solr/api/org/apache/solr/client/solrj/impl/StreamingUpdateSolrServer.html&#34;&gt;StreamingUpdateSolrServer&lt;/a&gt;を利用して、流し込みです。
あんまり時間がなかった（準備とかウォーミングアップで時間かかった）ので、結局、Screan名とツイート本文を
SolrInputDocumentに無理やり詰め込んで登録しただけでした。
ほかにも色々と情報が取れるはずなので、そのへんも格納してファセットとかで遊びたかったなぁ。
とまぁ、こんな感じでタイムアップです。（コードは大したことないので文章だけでｗ）
画面も用意出来なかったので、発表はSolrのダサい管理画面で検索でした。
次回は、もう少し中身を勉強して画面もbootstrapで作ってとかやってみたいですね。
あと、自己紹介スライドに書きましたが、Scalaから使ってみるのもやってみたいです。（その前に、Scalaに入門しないといけないんですけど。。。）&lt;/p&gt;
&lt;p&gt;ということで、個人的にいろいろと反省点があるハッカソンでした。
反省点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;立ち上がりに時間がかかった（普段からコーディングしてないから）&lt;/li&gt;
&lt;li&gt;Twitter4Jについて事前に勉強してない（ごめんなさい）&lt;/li&gt;
&lt;li&gt;環境面が整備しきれてない&lt;/li&gt;
&lt;li&gt;Twitter API ポケットリファレンス（右の本）を忘れた。。。&lt;/li&gt;
&lt;li&gt;スターウォーズのピザの箱の写真取り忘れた＞＜&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;普段、コーディングをしていない仇が出てしまいました。
もっと、すぐにコーディングをできる環境、体質を日頃から鍛えておかないといけないなぁと。
（SolrやTwitter4JのJavaDocをオロオロしながら探すとか情けないです。。。）&lt;/p&gt;
&lt;p&gt;場所や雰囲気は全然問題ありませんでした。
ピザを@yusukeyさんからごちそうになったり、飲み物、お菓子が用意されていたりと至れり尽くせりでした。
iPadで音楽も流してくれてたし。
他のハッカソンに参加したことないので比較はできないですが、集中できてよかったです。
あと、ソファーでコーディングもなかなかいいなぁと実感出来ました。（初めて！）
人数的にもこのくらいのほうが話がしやすくていいかなぁと。発表も時間かからないですし。
ただ、帰り道に誰かが言っていましたが、「マラソンというよりは短距離走だったね」というのは否めないかなぁと。
時間は限られちゃうので、準備をしっかりしないとなぁと。
私としては、土日のハッカソンだと参加しづらいので、平日開催がうれしいのですが。
いやぁ、楽しかったです。みなさんの面白いネタも見れたし。（自分のやったのは普通すぎて少し恥ずかしかったです。。。）
あと、GoogleDocsの使い方（自己紹介スライドとかアンケートの集計とか）も学べたのが収穫でした。
@yusukeyありがとうございます！
次回もありそうなので、懲りずに参加しようかな。&lt;/p&gt;
&lt;p&gt;さて、他の方たちのブログやtogetterは@yusukeyさんのページからたどってくださいｗ。
&lt;a href=&#34;http://samuraism.jp/diary/2012/03/08/1331132580000.html&#34;&gt;第0回Twitterハッカソンを開催しました #twtr_hack&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;今日購入したCD聴きながらブログ書いてます。
タワレコで視聴して購入したCDです。
なかなか大人な雰囲気でオススメです。&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B006ZCWTXS/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/518TTEpfFGL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B006ZCWTXS/?tag=johtani-22&#34;&gt;
      Heaven
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Clean Coderを読んだ(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/03/03/clean-coder%E3%82%92%E8%AA%AD%E3%82%93%E3%81%A0/</link>
      <pubDate>Sat, 03 Mar 2012 01:14:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/03/03/clean-coder%E3%82%92%E8%AA%AD%E3%82%93%E3%81%A0/</guid>
      <description>&lt;p&gt;&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4048860690/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51dv8ZDoLBL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4048860690/?tag=johtani-22&#34;&gt;
      Clean Coder プロフェッショナルプログラマへの道
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

Clean Coderを読みました。
理由はTwitterで「Clean Code」がいい本だと流れてきたためです。
「Clean Code」はまだ読んでいないのですが、クリーンなコード（メンテナンスしやすく、修正などもやりやすいコード？）を書くために必要な話が書いてあるのだと思います。（まだ妄想）&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4048860690/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51dv8ZDoLBL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4048860690/?tag=johtani-22&#34;&gt;
      Clean Coder プロフェッショナルプログラマへの道
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

Clean Coderを読みました。
理由はTwitterで「Clean Code」がいい本だと流れてきたためです。
「Clean Code」はまだ読んでいないのですが、クリーンなコード（メンテナンスしやすく、修正などもやりやすいコード？）を書くために必要な話が書いてあるのだと思います。（まだ妄想）&lt;/p&gt;
&lt;p&gt;そして、何も考えずに、「Clean Code”r”」という本が新しく出ていたので、新しい方に手を出しました。
まぁ、軽い勘違いですｗ（コードの構造の話などは出てこなかったです。）
それほど分厚くなく、軽く読めそうだということで読み進めると軽い衝撃を受けました。
Clean Coderはプロのプログラマとして、どのような意識を持つべきか、立ち居振る舞いをするべきかなどが書かれています。
「～したい」はまず守らない約束だという話、ユニットテストを書くことはプロとして当たり前の行為だ、目的意識を明確に持つことなどなど、耳の痛いことが色々と書かれています。
これは、著者の方（パンチカードのころからコーディングをされている！）の実体験を元に、失敗した経験から導きだされているようです。
ところどころ、古くてよくわからない話やちょっとだけしっくりこない表現（ビジネス、QAといった単語）もありましたが、概ねわかりやすい話でした。&lt;/p&gt;
&lt;p&gt;基本的にはアジャイルなスタイルの開発を行うプログラマ（設計書に基づいてコーディングするだけの人ではない）について書かれています。
この本を読んでいて、昨年、仕事をご一緒させていただいたRubyistの方たちの開発スタイルを思い出しました。
私よりもこの本に書かれているプロに近いなぁと。
ペアプロやったり、実装方法について相談していたりと。&lt;/p&gt;
&lt;p&gt;勘違いでしたが、良い本に出会えて本当によかったです。
私もこの本に書かれているようなチームでのプログラミングをやりたい、またなにかコーディングをしたいという気にさせてくれました。（「～したい」じゃダメって書いてあったのに。。。）
自分を戒めるためにも、定期的に読み返したい本です。
プログラマでいたい方、ある程度プログラミングができるようになってきた方にはぜひ読んでいただきたい本です。
（この流れで、アジャイルサムライやClean Codeを読んだら理解が深まりそうだなぁ）&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;参考URL：
&lt;a href=&#34;http://d.hatena.ne.jp/ledsun/touch/20120128/1327759675&#34;&gt;35歳定年説をブチ破れ！「Clean Coder プロフェッショナルプログラマへの道 Robert C. Martin」 - ledsunの日記 &lt;/a&gt;&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>親子で楽しめる 絵本で英語をはじめる本(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/02/26/%E8%A6%AA%E5%AD%90%E3%81%A7%E6%A5%BD%E3%81%97%E3%82%81%E3%82%8B-%E7%B5%B5%E6%9C%AC%E3%81%A7%E8%8B%B1%E8%AA%9E%E3%82%92%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E6%9C%AC/</link>
      <pubDate>Sun, 26 Feb 2012 01:20:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/02/26/%E8%A6%AA%E5%AD%90%E3%81%A7%E6%A5%BD%E3%81%97%E3%82%81%E3%82%8B-%E7%B5%B5%E6%9C%AC%E3%81%A7%E8%8B%B1%E8%AA%9E%E3%82%92%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E6%9C%AC/</guid>
      <description>&lt;p&gt;&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/479931131X/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/517jhrVNwvL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/479931131X/?tag=johtani-22&#34;&gt;
      親子で楽しめる 絵本で英語をはじめる本
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

Twitterでこの本について書かれたブログ記事が流れてきて、購入しました。&lt;/p&gt;
&lt;p&gt;最近、英語を身につけておいたほうがいいなと思うことが多々あり、子供にも英語を勉強してもらいたいなと思っていたところでした。
あとは、私自身が英語が苦手というのもあり、子供をダシにして勉強したいというのもありまして。。。
サラっと読んでみましたが、参考になりました。
特に「多読」というキーワードが面白かったです。&lt;a href=&#34;http://www.seg.co.jp/sss/&#34;&gt;こちら&lt;/a&gt;が元のようですが。
多読とは、文章を分析しないで大意を把握する読書法だそうです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/479931131X/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/517jhrVNwvL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/479931131X/?tag=johtani-22&#34;&gt;
      親子で楽しめる 絵本で英語をはじめる本
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

Twitterでこの本について書かれたブログ記事が流れてきて、購入しました。&lt;/p&gt;
&lt;p&gt;最近、英語を身につけておいたほうがいいなと思うことが多々あり、子供にも英語を勉強してもらいたいなと思っていたところでした。
あとは、私自身が英語が苦手というのもあり、子供をダシにして勉強したいというのもありまして。。。
サラっと読んでみましたが、参考になりました。
特に「多読」というキーワードが面白かったです。&lt;a href=&#34;http://www.seg.co.jp/sss/&#34;&gt;こちら&lt;/a&gt;が元のようですが。
多読とは、文章を分析しないで大意を把握する読書法だそうです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;辞書を引かずに楽しめるものを読む&lt;/li&gt;
&lt;li&gt;わかるところをつなげて読む&lt;/li&gt;
&lt;li&gt;自分が面白いと思う本を選んで読む&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;という原則があるようで、確かにいいなと思いました。
絵本だと絵が書かれているので、辞書を引かなくても想像できそうですし、楽しめそうだなぁと。
また、多読は&lt;a href=&#34;http://johtani.jugem.jp/?eid=46&#34;&gt;先日読んだ、速読の本に書かれていた本の読み方&lt;/a&gt;にも通じるものがあるなと。（まだ、実践できてないんですけどね）&lt;/p&gt;
&lt;p&gt;どうしても英語を勉強させたい！、勉強しないと！と思ってしまいがちですが、この本にも書いてあるように楽に楽しんでやったほうがやっぱいいなぁと。
楽しくないと続かないですからねぇ（実際、何度も挫折してるし、押し付けられるとヤル気がなくなるので。。。）&lt;/p&gt;
&lt;p&gt;ということで、実践してみようと思います。（平日は子供が寝てしまってから帰宅なので、まずは土日から）子供のためというよりは、自分の英語の勉強のために。
まずは、簡単な絵本を購入して。
この本の後半半分は、著者の方の感想や説明がついた、オススメの絵本50冊が書かれています。
英語の絵本を入手するのは、結構大変（実際に売ってる店もなかなかないし、手にとって見る機会も少ない）だと思うのですごく参考になりそうです。
いくつかピックアップして、あわよくば本屋で手にとってみようかと。なければ、Amazonで購入しようかなぁと思ってる所です。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第4回 Twitter API勉強会 @デジタルハリウッド #twtr_hack に参加しました。(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/02/24/%E7%AC%AC4%E5%9B%9E-twitter-api%E5%8B%89%E5%BC%B7%E4%BC%9A--%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E3%83%8F%E3%83%AA%E3%82%A6%E3%83%83%E3%83%89--twtr_hack-%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Fri, 24 Feb 2012 01:50:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/02/24/%E7%AC%AC4%E5%9B%9E-twitter-api%E5%8B%89%E5%BC%B7%E4%BC%9A--%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E3%83%8F%E3%83%AA%E3%82%A6%E3%83%83%E3%83%89--twtr_hack-%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;今週も勉強会に参加しました。
@yusukey さんが開催してるTwitter API勉強会です。
前回とは会場が異なりましたが、広くて大画面で良い会場でした。駅も近いし。（デジタルハリウッドさいこー！）
今回はLT枠のbootstrapの話が聞きたくて参加しました。（ムチャぶり駆動勉強会の現場をTLで目撃してたのでｗ）
あと、バーチャファイター（昔、VF目当てでセガサターンを買ったなぁ、懐かしい）の話も聞きたかったので。
（ごめんなさい、Twitter APIはまだ触る機会がなさそうです。。。）
今回も途中で参加者同士を数グループ（座席が近い人）に分けて自己紹介タイムがあり素敵でした。
ちょっと残念だったのはネームプレートが今回はなかったことでしょうか。
自己紹介でツイッターID教える＋聞くのがちょっと辛かったです。（やっぱり個人名刺作ったほうがいいかなぁ）
私はPCを開いていたのでTwitterのページを見せることで対応出来ましたが。
（次やるときはお手伝いするのでこえかけてください。）&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今週も勉強会に参加しました。
@yusukey さんが開催してるTwitter API勉強会です。
前回とは会場が異なりましたが、広くて大画面で良い会場でした。駅も近いし。（デジタルハリウッドさいこー！）
今回はLT枠のbootstrapの話が聞きたくて参加しました。（ムチャぶり駆動勉強会の現場をTLで目撃してたのでｗ）
あと、バーチャファイター（昔、VF目当てでセガサターンを買ったなぁ、懐かしい）の話も聞きたかったので。
（ごめんなさい、Twitter APIはまだ触る機会がなさそうです。。。）
今回も途中で参加者同士を数グループ（座席が近い人）に分けて自己紹介タイムがあり素敵でした。
ちょっと残念だったのはネームプレートが今回はなかったことでしょうか。
自己紹介でツイッターID教える＋聞くのがちょっと辛かったです。（やっぱり個人名刺作ったほうがいいかなぁ）
私はPCを開いていたのでTwitterのページを見せることで対応出来ましたが。
（次やるときはお手伝いするのでこえかけてください。）&lt;/p&gt;
&lt;p&gt;内容はメモをとってあり、下に書いてますので見ていただければ。&lt;/p&gt;
&lt;p&gt;Twitter APIの説明はいろいろ新鮮でした。今回はWebページに貼るリンクやボタンの話でした。
カスタマイズも出来るようになってるってのは知りませんでした。Webサイトやってる人は簡単にカスタマイズできるのは便利ですよね。&lt;/p&gt;
&lt;p&gt;バーチャファイターのTwitter連携の話は結構詳細な話が出てきてびっくりでした。（テーブル名とかまで出てきましたｗ）
ゲーム筐体の前のユーザの動きまで考えてシステム作るとかすごいなぁとか。違う業界の話って面白いです。&lt;/p&gt;
&lt;p&gt;Bootstrap入門はbootstrapの紹介だけじゃなく、Tips（bootstrap弊害とかw）やその他の便利なサイトの紹介までありました。
スライドもあとから読んでもわかるのがすごく嬉しいです。時間を見て試してみます。
TwitterSphereは懇親会でもデモが見れました。Groovyは名前を知ってるだけだったのですが、Swingとかまで動くんですね。（JVMだから当たり前なんだけどなんか新鮮。）
最後はAndroidのAPI Demoのお話。こちらも普段Android携帯使ってるのに知らないことが多くて。。。
Macでもデモが動くんですね。やっぱり動くものを作ってLTするのって素晴らしいですねぇ（なんか作るかー）&lt;/p&gt;
&lt;p&gt;とまぁ、最近はキーワードだけ知ってて、いろいろ触れてもいないものが多いなぁと思ってたところに、
今日の勉強会で色々見れて面白かったです。
Twitterがいろんな人に興味を持たれているのがわかります。
（けど、Twitterってどうやって儲かってるんだろう？？？）
懇親会は、入り口からは想像できない貸パーティースペースで素敵でした。
開始の乾杯の音頭を取ることもできましたし（もちろん、ムチャぶり）。
学生が多かったのですが、声をかける暇なく懇親会が終わってしまったのが少し心残りですかねぇ。
毛色が違うメンバーが居て面白いので、次回も空きがあれば参加しようと思います。
スタッフとかお手伝いもしますので。&lt;/p&gt;
&lt;p&gt;ということで、いつものメモです。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;開催日時：2012/02/23 19:00  ～  21:00
場所：デジタルハリウッド東京本校 1Fセミナールーム
&lt;a href=&#34;http://www.zusaar.com/event/208101&#34;&gt;Zusaarのページはこちら。&lt;/a&gt;他にも学生枠とかありました。&lt;/p&gt;
&lt;p&gt;◯ Webサイト向けAPI @yusukey&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　・Webサイト向けAPI
　　フォローボタン、ツイートボタン、Web Intents、@Anywhere
　　サーバサイドの実装扶養、htmlのみで構成可能
　・Twitterボタン
　　Twitterのサイトで色々カスタマイズ可能なボタンが作れます。
　　ツイートのカウント表示とか。
　・Web Intents
　　@ツイート、リツイート、お気に入りが簡単にできるものが作成可能。
　　ツイートの埋め込み用リンクがTwitterのWeb版のツイート詳細から生成可能。
　　「このツイートをサイトに埋め込む」リンクをクリックするとダイアログが出てきます。
　・@Anywhere
　　あんまりフォローされてないけど、JavaScriptでサーバサイドなしにTwitterと連携可能。
　　ユーザIDを辞書的に検知してTwitterの情報をホバーで出してくれる。
　・ウィジェット（検索、プロフィール、お気に入り、リストなど）
　　これもTwitterサイトでカスタマイズ可能。
　・ツイートボタンには公式ロゴを利用しましょう
　・注意点
　　charsetを必ず指定しましょう。
　　IE/Firefoxで問題が発生します。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;◯ グルーブに分かれて簡単に自己紹介&lt;/p&gt;
&lt;p&gt;◯ デジタルハリウッドよりご挨拶&lt;/p&gt;
&lt;p&gt;◯ 「Virtua Fighter5 Final ShowdownのTwitter連動機能について」@twtrfk&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　部内にAmitterというSNSを構築して自由に使ってもらって、Twitterを疑似体験してもらった。
　VF5FSでの開発中はTwitter4JにAmitterのラッパーを追加してテストしてたらしい。（おもしろいなー）
　当時は、筐体にツイート機能を入れることも考えていたらしい。
　ツイート自体はバッチで処理してます。
　ゲーム筐体にお客さんが座ってる時間もシステムの性能として考慮しないといけない。
　苦労した点：
　　テストアカウントを100個地道に作成（連番、内容がバレるアカウント名はNGだから）
　　Twitter4Jがうまく動かなかった。。。
　今後の展開：
　　まだ未定
　QA
　　Q：FB連携とかは？
　　A：今は考えてないです。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;◯ LT
　・ @making「Twitter Bootstrap入門」
　　&lt;a href=&#34;http://www.slideshare.net/makingx/twitter-bootstrap&#34;&gt;スライドはこちら&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　　・Bootstrapとは？
　　　Twtter者が提供するWebアプリケーションのフロントエンド
　　　一般的にCSSフレームワークと呼ばれるもの
　　　簡単にかっこいいデザインにするための枠組み
　　　ダウンロードしてきてHTMLで読み込むだけ。
　　・Bootstrapのコンポーネント紹介
　　　いろいろおしゃれなコンポーネントあるよ。（スライド見ましょう）
　　・Tips
　　　examplesがあるので、それをベースに作るのが簡単です！
　　　Initializrも対応してて、こっちで作るのもいいよ！
　　　bootstrap簡単すぎて、みんな同じデザインのサイトに（弊害）
　　　差別化のサービスが出てきてます。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;　・ @kimukou_26 「TwitterSphere of Twitter4J」&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　　Griffon？
　　codehausで作られてるGroovy製のMVCイメージのGUIフレームワーク
　　codehausはJetty作ってるとこですね
　　地球儀にツイートを乗っけることができるアプリ。
　　Groovyの記述がちょっと新鮮。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;　・ @bina1204 「ApiDemos of Twitter4J for Android」&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　　API DemosというAndroidのデモがあり、ここにTwitter4Jを仕込んでみた？
　　Android系は持ってるのに知らない。。。
&lt;/code&gt;&lt;/pre&gt;</content:encoded>
    </item>
    
    <item>
      <title>lucene-gosenとSynonymFilterを利用するときの注意点（問題点編）(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/02/21/lucene-gosen%E3%81%A8synonymfilter%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B9%E5%95%8F%E9%A1%8C%E7%82%B9%E7%B7%A8/</link>
      <pubDate>Tue, 21 Feb 2012 01:41:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/02/21/lucene-gosen%E3%81%A8synonymfilter%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B9%E5%95%8F%E9%A1%8C%E7%82%B9%E7%B7%A8/</guid>
      <description>&lt;p&gt;久々にlucene-gosenの話です。
しかも、あんまり嬉しくない話しです。&lt;/p&gt;
&lt;p&gt;すでに&lt;a href=&#34;http://code.google.com/p/lucene-gosen/issues/detail?id=23&#34;&gt;issueをアップ&lt;/a&gt;していますが、lucene-gosenとSynonymFilterを併用する場合に、特定の条件下でNullPointerExceptionが発生してしまいます。&lt;/p&gt;
&lt;p&gt;条件は以下の組み合わせになります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Solr 3.5.0以前&lt;/li&gt;
&lt;li&gt;lucene-gosen1.2.0 - 1.2.1の辞書なしjar&lt;/li&gt;
&lt;li&gt;SynonymFilterFactoryにてtokenizerFactoryを指定&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;根本的にはSolr側の問題のようです。&lt;a href=&#34;https://issues.apache.org/jira/browse/SOLR-2909&#34;&gt;SOLR-2909&lt;/a&gt;としてissueが上がっています。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;久々にlucene-gosenの話です。
しかも、あんまり嬉しくない話しです。&lt;/p&gt;
&lt;p&gt;すでに&lt;a href=&#34;http://code.google.com/p/lucene-gosen/issues/detail?id=23&#34;&gt;issueをアップ&lt;/a&gt;していますが、lucene-gosenとSynonymFilterを併用する場合に、特定の条件下でNullPointerExceptionが発生してしまいます。&lt;/p&gt;
&lt;p&gt;条件は以下の組み合わせになります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Solr 3.5.0以前&lt;/li&gt;
&lt;li&gt;lucene-gosen1.2.0 - 1.2.1の辞書なしjar&lt;/li&gt;
&lt;li&gt;SynonymFilterFactoryにてtokenizerFactoryを指定&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;根本的にはSolr側の問題のようです。&lt;a href=&#34;https://issues.apache.org/jira/browse/SOLR-2909&#34;&gt;SOLR-2909&lt;/a&gt;としてissueが上がっています。&lt;/p&gt;
&lt;p&gt;SynonymFilterFactoryでは、類義語の設定ファイルの単語を読み込むときにtokenizerFactoryを指定できます。
このとき、SynonymFilterFactory内部でtokenizerFactoryに指定されたFactoryのクラスが読み込まれ、
インスタンス化されて、Tokenizerが作成されます。
この、Tokenizerのインスタンス化の処理シーケンスに問題があります。
schema.xmlの&amp;lt;tokenizer&amp;gt;タグで指定されたTokenizerFactoryでは、ResourceLoaderAwareインタフェースのinform(ResourceLoader loader)メソッドが実行されます。
このinform()メソッドがSynonymFilterFactoryのToeknizerのインスタンス化の場合に実行されません。
lucene-gosenのJapaneseTokenizerFactoryではこのinform()メソッドでdictionaryDirのパスの読み込みを行なっています。（&lt;a href=&#34;http://code.google.com/p/lucene-gosen/source/browse/branches/rel-1.2/src/java/org/apache/solr/analysis/JapaneseTokenizerFactory.java#73&#34;&gt;このへん&lt;/a&gt;）&lt;/p&gt;
&lt;p&gt;上記の条件では、NullPointerExceptionが発生すると書きました。
辞書を内包したjarファイルを利用している場合、NullPointerExceptionが発生しなくても次のような問題点があります。こちらの問題は見た目は動いているように見えてしまうので注意が必要です。
すべて、SynonymFilterを利用する時点でも問題点になります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;compositePOS設定が類義語辞書読み込み時に無効&lt;/li&gt;
&lt;li&gt;dictionaryDir設定が類義語辞書読み込み時に無効（＝jarに内包されている辞書で動作する）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一見動いているように見えるかもしれませんが、望んでいてる動作になっていない可能性があるので注意が必要です。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;解決策まだ途中&#34;&gt;解決策（まだ途中）&lt;/h3&gt;
&lt;p&gt;先程書きましたが、基本的にはSolr側の修正をするのが妥当です。
&lt;a href=&#34;https://issues.apache.org/jira/browse/SOLR-2909?PHPSESSID=15f554bea5726faaad9185880c7e6a15&#34;&gt;SolrのJIRAにパッチもアップされました。&lt;/a&gt;
こちらのパッチをSolrに適用し、SynonymFilterFactoryを次のように指定することで問題を回避することが可能になります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;

　&amp;lt;tokenizer class=&amp;#34;solr.JapaneseTokenizerFactory&amp;#34; compositePOS=&amp;#34;compositePOS.txt&amp;#34;
　 dictionaryDir=&amp;#34;dictionary/naist-chasen&amp;#34;/&amp;amp;gt;
　...
　　&amp;lt;filter class=&amp;#34;solr.SynonymFilterFactory&amp;#34; synonyms=&amp;#34;synonyms.txt&amp;#34; ignoreCase=&amp;#34;true&amp;#34; 
　　  expand=&amp;#34;true&amp;#34; tokenizerFactory=&amp;#34;solr.JapaneseTokenizerFactory&amp;#34; 
　　  **compositePOS=&amp;#34;compositePOS.txt&amp;#34; dictionaryDir=&amp;#34;dictionary/naist-chasen&amp;#34;**/&amp;amp;gt;
　...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;SynonymFilterFactoryの設定にcompositePOS、dictionaryDirを追加します。
ここの設定は&amp;lt;tokenizer&amp;gt;タグで指定された設定と同じ物を指定します。以上で問題なく動作することになります。&lt;/p&gt;
&lt;p&gt;ただし、この方法はSolrにパッチを当てなければいけません。
Solrにパッチを当てるのもなかなかな作業だと思います。
ということで、どうにかlucene-gosen側だけでも対応出来る形にしたいなぁと考えているところです。
残念ながら、まだ考えているだけですので、もう少し提供できるのは先になってしまいますが。。。
現時点では、次の方法を考え中です。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;informメソッドを呼ぶフラグを追加して、どうにかしてinformメソッドを呼び出す&lt;/li&gt;
&lt;li&gt;SynonymFilterの修正版をlucene-gosenに内包して提供する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;できれば、a.にて対応できればと思っています。
最悪、b.の方法かと。
悩んでいる間にSolrの次のバージョンが出てしまわないように出来るだけ早く対応しようと思っています。
他にも問題点や気になる点があれば、日本語、英語を問わないので、気兼ねなくissueに上げてもらうか、Twitterで私宛にメンションしてもらえればと。
（あ、issue23へのパッチでもいいですよ！）&lt;/p&gt;
&lt;p&gt;追記：
まだ、SOLR-2909のパッチを適用してからの確認はできていません。（ソース見て大丈夫だと思ってるレベル）
あと、現時点での対応方法としては、「lucene-gosenとは別のjarにSynonymFilterFactoryなどを入れて提供」が妥当かなぁと考えているところです。（無理やりinformメソッド呼び出すのは骨が折れそう＋パッチが思いの外早く出て、導入されたのでlucene-gosen本体に特殊処理を入れるのはあまりメリットを感じない。）&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Hadoopソースコードリーディング第8回に参加しました。#hadoopreading(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/02/09/hadoop%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E7%AC%AC8%E5%9B%9E%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-hadoopreading/</link>
      <pubDate>Thu, 09 Feb 2012 01:03:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/02/09/hadoop%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E7%AC%AC8%E5%9B%9E%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-hadoopreading/</guid>
      <description>&lt;p&gt;また、勉強会ログです、すみません。。。
直接業務とは関係ないのですが、今回はリクルートの中野さんが話しをされるというので顔を出してきました。
もちろん、内容も気になりましたというのもありますが。
実際には中野さんは2分くらいしか喋らなかったんですけどね。。。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;また、勉強会ログです、すみません。。。
直接業務とは関係ないのですが、今回はリクルートの中野さんが話しをされるというので顔を出してきました。
もちろん、内容も気になりましたというのもありますが。
実際には中野さんは2分くらいしか喋らなかったんですけどね。。。&lt;/p&gt;
&lt;p&gt;今回は、最初のセッションはちゃんとしたソースコードリーディングでした。
Hadoopの入力としてデータをHDFSじゃなくて、MongoDBから取得するときに利用するMultipleInputの実装をしてみたというお話でした。
MongoDBやHadoopを知らないと（私はあんまり知らない。。。）少しきつかったかもしれないです。
幸い、HadoopのMultipleInputについては以前、すこしだけ見たことがあったので、かろうじてついていけました。
最初の部分を聞きのがしてしまったので合っているか自信がないのですが、10genから出ている&lt;a href=&#34;https://github.com/mongodb/mongo-hadoop&#34;&gt;mongo-hadoop&lt;/a&gt;の使い勝手、効率の悪そうなところに手を入れた話しがベースになっているんでしょうか？（ツッコミあるとうれしいです）
気になったのは、MongoDBのデータをHadoopから直接取りに行くというユースケースがどういう場合に出てくるのかという点です。
ネットワークやMongoDBの負荷がHadoop処理へのボトルネックになるんじゃないかしらという懸念がありそうだなと。
発表を聞いていて感じたのは、やっぱりソース書いて動かさないとダメだよねぇ、自分も手を動かそうというところです。
リクルートさんの発表は波乱万丈（？）でした。
最後まで話しを聴いたあとに思った感想は「こんなに話して大丈夫なのかな？」「いろんな人を敵に回してない？」というものです。
実際に昨年の夏くらいからEMCの草薙さんも検証メンバーに入って、リクルート社内での活用シーンをベースにMapRの検証をいろんな項目でやられたようです。（ある程度の詳細は以下のメモ参照）
で、最終的な結論はまだ出ていないのですが、最後に出てきた検討中の比較対象が某C社のCDH。
どちらかというとCDHの方に傾いてる感じに取れる終わり方で心配になりました。。。
会場が会場だからというのもあったのかなぁ？
mesosというキーワードが出てきたのが気になりました。単語だけは以前Twitterで流れてきたのを目にしてたのですが、どんなものかという概要がわかったのは収穫でした。
リクルートさんの資料はどこまで公開されるかわからないですが、もう一度見たい気がします。（mesosの部分だけでも公開して欲しい）&lt;/p&gt;
&lt;p&gt;ということで、以下はいつもの自分用メモです。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;日時： 2012年2月8日（水） 19:00～21:30 （受付開始 18:40）
場所： 豊洲センタービルアネックス（NTTデータ、豊洲駅直通）&lt;/p&gt;
&lt;p&gt;◎日本OSS貢献者賞・奨励賞のご案内　@hamaken
　&lt;a href=&#34;http://ossforum.jp/ossaward7th&#34;&gt;日本OSS貢献者賞・奨励賞&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;◎『オレオレMultipleInputを作る方法（仮）』@muddydixon さん
&lt;a href=&#34;http://www.slideshare.net/muddydixon/multipleinput&#34;&gt;http://www.slideshare.net/muddydixon/multipleinput&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　hadoopからMongoDBを利用する方法を紹介
　CDH3u2かu3で試しました。
　10genからも出てるけど使いにくい？から作った？
　MongoMultipleInputs.addInputPath
　　で色々簡単に使えるようにしたかった。
　　絞り込みしてデータをMapperにとり込みたかったため。
　　　＝絞り込みできないと必要なデータ以外も取得できてしまいJSONのパース処理がオーバヘッドになるから。
　com.mongodb.hadoop.input.DelegatingInputFormat
　　mongodbの環境にあわせて多くのsplitを生成する。
　mongosへのアクセスはメタ情報の取り出しだけ。
　あとは、個々のサーバにアクセスしてるのでデータ取り出しが高速？
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;◎『MapRってどうよ？ - 実際に使ってみた感触を紹介します』
　 - リクルート 中野さん、高林さん、大坪さん&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　MapRの説明資料がなかったので、EMCの草薙さんが出てきて説明を開始。

　Greenplum MRはMapRテクノロジが開発した実装のOEM版。
　EMCは特に手を加えず。
　※MapRについては前回のMapR勉強会の記事を御覧くださいな。
　Q：JavaのAPI互換と言われている部分はHadoopのどのバージョン？
　A：CDH3u2に近いパッチが当たってるらしい。
　Q：DFSIO性能の比較対象のHadoopはどのバージョン？
　A：手元に資料は残念ながらないです。

　ここからリクルートさん。
　検証内容：性能検証
　　中古車サイトで利用されている3つのHiveに置き換えてみた。
　結果（パーティション圧縮）
　　MapRのほうが約1.3倍高速に（そこまで速くならなかった？）
　結果（非パーティション圧縮）
　　MapRのほうが約1.7倍高速に（そこまで速くならなかった？）
　　ビルドイン圧縮はGzip圧縮と比較して高速
　※チューニング次第では結果変わるかもね。

　機能検証：マルチテナント検証
　　目的：
　　　複数ユーザに対して1つのクラスタを提供する
　　　セキュリティの担保（）
　　　余剰リソースの有効活用
　　　複数ユーザのJobの並列実行？
　　結果１（ユーザ権限まわり）
　　　MapRのユーザはLinuxユーザに準拠。
　　　同じmaprユーザでもUIDがずれてるとエラーが起きる。
　　　MapR内のPermissionは内部のクラスタ、ボリュームの権限定義が可能
　　　※Volumeは管理者に付加的な情報を与えるような存在
　　　Job実行はHadoopと一緒のアクセス権。
　　　
　　結果２（FairScheduler）
　　　MapRではデフォルトとなっている。
　　　複数テナントからの同時ジョブ実行の動作を確認。
　　　poolをベースにタスクを割り当ててく。
　　　min/max値にあわせてslotが利用される模様
　　結果３（Load処理（Hive）、Job実行（HiveのSelect））
　　　じゃらんPVデータ１ヶ月分をロード。
　　　NFS→MFS
　　結果４（フェイルオーバー）
　　　HA機能
　　　ノード切り替え時間、タスクの復旧までの時間とか。
　　結果５（DirectNFSでの転送）
　　　NFSGatewayをクライアント側にした場合との違いなど。
　　　クライアント側に載せた場合、通信量が減るから速度が出てる。
　Mesos概要
　　Apache IncubatorのOSS。C++により実装
　　効率的なリソース分離、リソース共有機能を提供するクラスタマネージャ。
　Mesosでの検証
　　マルチテナント（ユーザ権限）硬い。
　　リソース制限ができない。などなど。
　MapRとMesosの比較
　　資料期待！
　リクルートとしてのMapRの評価
　　保守/サポート/教育が充実してるのが重要。速度だけじゃない。
　　けど、まだ検討中です。
　Q：クラスタに対するパーミッションの権限情報はどこで管理されてるの？
　　　どこが落ちたときにそのパーミッションの情報がとれなくなる？
　A：CLDBで管理されてます。
　Q：CLDB内部でのデータはバイナリ？DBを別途持ってる？
　A：HDFS上にボリュームが作られてそこに吐き出されてる。
　Q：Jobのスケジュールの情報とかはどこに？
　A：Job管理データはJobTracker用のボリュームに保存されてる。
　　　それを別の人が引き継ぐ。
　Q：ボリュームが壊れたら？
　A：さすがに壊れたら引き継げない。
　　　けど、壊れにくくしてあるのが売り？
　Q：MapRのチューニングのポイントはどんなものがあるの？
　A：チューニングに関しては256Mのchunkサイズを64Mに減らした場合の化粧しかしてない。Apache Hadoopの方は若干チューニングした。
　Q：DFSのシリアライズは？ボンディングとかでもできるんじゃないの？
　A：そこはやってないのでやってみます。
　Q：MapRでの8台構成で全部のせてみた場合、CLDBのリソースはどのくらいもっていってるの？
　A：結構使ってる。CLDBを3台以上にしたらサポート対象外。
　Q：CLDBを3台に制限してる理由は？
　A：わからない。
　Q：本番MapR、検証CDHというのはあり？
　A：M3を開発環境で利用して欲しいですね。（ステマ？）開発目的だとM5を無償提供してほしいなー（EMCへのお願い？）
　Q：Pigの検証は？
　A：リクルートではHiveを利用してたので検証してない。


次回は3月ころかなぁ？だそうです。
&lt;/code&gt;&lt;/pre&gt;</content:encoded>
    </item>
    
    <item>
      <title>Fluentd Meetup Japanに参加しました。(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/02/05/fluentd-meetup-japan%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Sun, 05 Feb 2012 00:03:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/02/05/fluentd-meetup-japan%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.zusaar.com/event/193104&#34;&gt;Fluentd meetup in Japan&lt;/a&gt;に参加しました。いつも面白そうな話を聞いてばっかりなので、役に立つためにスタッフとしても参加してみました。
まずは、会場が綺麗でびっくりしました。しかも電源タップまで用意されていてかなり充実してました。Ustはまだ見ていないのですが、Ustも録画までされていて素晴らしい運営メンバーでした。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;http://www.zusaar.com/event/193104&#34;&gt;Fluentd meetup in Japan&lt;/a&gt;に参加しました。いつも面白そうな話を聞いてばっかりなので、役に立つためにスタッフとしても参加してみました。
まずは、会場が綺麗でびっくりしました。しかも電源タップまで用意されていてかなり充実してました。Ustはまだ見ていないのですが、Ustも録画までされていて素晴らしい運営メンバーでした。&lt;/p&gt;
&lt;p&gt;開発者の古橋さんほか、Treasure Data Inc.の方たち（太田さんはいなかった）が集まり、
Fluentdの仕組みから、プラグイン開発の方法、実際にプラグイン開発してしかも本番で利用してる実例まで
「パーフェクトFluentd」という本がそのまま書けてしまうのではというくらい密度の濃い話が聞けました。
私個人は、いつものごとく興味を持ってるんだけど、仕事、私用では触っていないという腰抜けなので話についていくのが大変でしたが。。。
各セッションごとに、しっかりとしたQA時間が取られていて、質問者も質が高く、中の人や発表者の方も誠実に回答されている感じがすごく良かったです。
（残念ながらLTの時は懇親会の準備を手伝っていたので聞けてないです）
基本はログの中継サーバとして利用するという話でした。
個人的には性能系のデータやログ（遅いクエリのログに関するプラグインの話などもあった）をストレージに保存して、時間を軸にログとグラフを表示するとかいう仕組みに使うと面白いかもなぁと感じました。
今回はFluentdがメインなので、ログを集める部分の話が主だったところでしたが、懇親会直前の@doryokujinさんのスライドでも上がっていた集計後のビジュアライゼーションに関する部分のはなしも聞いてみたいなぁと思ってるところです。&lt;/p&gt;
&lt;p&gt;あとは、いくつか知りたかったことが。
Treasure Data Serviceというサービスをやってるみたいで、SQLライクな問い合わせやビジュアライゼーションされた画面があるみたいな話があがっていたんですが、画面が見てみたかったです。
また、@just_do_neetさんの構想図のその後を聞いてみたいですねぇ。&lt;/p&gt;
&lt;p&gt;それにしても実例も構成から性能値まで上がっていたので、実際に利用する場合に参考になる資料だらけで普及にはずみがつきそうです。
Ust録画が上がっているようなので復習したいと思います。
（あ、内容とは関係ないけど、Ust録画にハッシュタグつきのツイートを時間軸で重ねて表示するサービスとか機能ってないのかな？）&lt;/p&gt;
&lt;p&gt;ということで、以下はいつものメモ書きです。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2012/02/04 12:30  ～  19:00&lt;/p&gt;
&lt;p&gt;フューチャーアーキテクト セミナールーム&lt;/p&gt;
&lt;p&gt;参考URL：&lt;a href=&#34;http://fluentd.org&#34;&gt;http://fluentd.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;◎13:00～14:00     「What&amp;rsquo;s Fluentd? - The missing log collector」
&lt;a href=&#34;http://www.slideshare.net/treasure-data/fluentd-meetup-in-japan-11410514&#34;&gt;http://www.slideshare.net/treasure-data/fluentd-meetup-in-japan-11410514&lt;/a&gt;
　Treasure Data, Inc.　古橋 貞之 (@frsyuki)&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　まずは、Fluentdの概要。syslogdみたいなもの
　Fileのtailで流すことが基本。
　Clientライブラリから流すことも可能。
　他との比較
　　ScribeとFluentd
　　　構造化されたデータを扱う
　　　gemとかapt-get，yumでインストールあg可能
　　　Rubyで書かれてるからカスタマイズもプラグインの追加も簡単。
　　FluentdとFlume
　　　FlumeはZKやマスタノードが必要＝セットアップが面倒
　　　JVMだから面倒、設定も簡単。
　Fluentdのアーキテクチャ
　　Bufferプラグイン：スレッドセーフ、バッファ処理など
　　Outputプラグイン：出力だけ
　　out_forwardプラグイン：Cassandraと同じアルゴリズムでHeartBeatしてる
　　out_copyプラグイン：同じ出力を別の出力先にコピー
　　bof_fileプラグイン：バッファ先をファイルにする。Fluentdがこけても大丈夫
　　out_exec_filterプラグイン：外部プログラムからの入出力を使える
　　in_tailプラグイン：ログのパーサーが内蔵されてるみたい。
　開発者用API
　　Unitテストフレームワーク（MRUnitに似てる）
　　TailInput（パーサカスタマイズも簡単）
　ドキュメントとか
　　http://fluentd.org
　　にあります。
　会社紹介！
　　Treasure Data Service
　　Fluentdでは出力先がいろいろできるけど、自分で解析しないといけない
　　！ここで、Treasure Data Service（クラウド）に保存すると。。。
　　データのVisualizationとかがリアルタイムで出来る。


　QA：
　　Q：ログ転送にUDP使ってますか？
　　A：TCPです。UDPはハートビートに利用してます。
　　Q：文字コードはどういう扱い？
　　A：バイナリ形式であつかってます。
　　　　文字列で扱う場合はプラグインで対応しましょう。
　　Q：性能大丈夫？
　　A：Twitterで議論があがって、いろいろ対応しました。
　　Q：TreasureDataServiceはクラウド対応だけなの？
　　A：データはクラウド上で管理してるので上げても大丈夫なものだけが現在は対応。暗号化などは行なっている。
　　Q：TreasureDataServiceはどこで動いてる？
　　A：AWS上（S3にデータ保存）
　　Q：解析プラットフォームを提供している？SQLだけ？
　　A：HiveのSQLで解析可能。Visualizationのツールもある。
　　Q：コンサルタントもあるの？ログ出力系とか。
　　A：あとから解析できるように。
　　Q：in_tailでログローテート（iノードが変わって）も大丈夫？　　A：大丈夫。動かなかったら連絡ください。
　　Q：ファイルバッファリングされるデータの順序は保証される？
　　A：キュー形式なので、保証される。けど、S3とかだと出力先が遅いので、
　　　　パラレルモードで対応が可能。だけど、パラレルだと順序は保証されない。
　　Q：実際のシステムが投げるときにFluentd側で認証とかできる？
　　A：認証はないです。推奨は同一アプリサーバでFluentdを起動。
　　Q：Fluentd間のデータ通信のセキュリティ対応は？
　　A：今はない。プラグインとか作ればOK。
　　Q：中間層のFluentdを置くのは推奨？なしで直接ストレージ保存も可能？
　　A：柔軟な対応（送信先、バッファリングとか）が可能にできるように中間層を置くほうがいい。直接出すことも可能。
　　Q：TDAgentでのセットアップが推奨？gemは？
　　A：gemはOSS版でtrunkに近い。TDAgentはテストとかしっかりやってる。
　　　　バージョンの対応表はリリースノート見ないとわからない。
　　Q：Flumeのほうが優れているのは？
　　A：設定ファイルが一元管理ができる。大規模はFlumeのほうがいいかも
　　　　ただし、includeでHTTPサーバ経由で設定ファイルを取得可能な機能あり。
　　Q：バッファサイズは指定可能？
　　A：可能。
　　Q：ストレージがずっと停止している場合にログがあふれるのを防ぎたい場合の対処法は？
　　A：セカンダリという機能がある。（ただし、対応できてないプラグインもある）
　　Q：フェイルオーバーでローカルファイル出力とかはできる？
　　A：out_forwardは対応してる？
　　Q：Fluentdからのbuf_fileに出力してる部分で遅延、書き込み不可が発生したら？
　　A：入力と出力がスレッドで分かれてる。
　　　　入力スレッドでのエラーはinput_plugin側にException上がる
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;◎14:15～15:00     「Dive into Fluent Plugin」
　&lt;a href=&#34;http://www.slideshare.net/repeatedly/fluentd-meetup-dive-into-fluent-plugin&#34;&gt;http://www.slideshare.net/repeatedly/fluentd-meetup-dive-into-fluent-plugin&lt;/a&gt;
　Preferred Infrastructure, Inc.　Masahiro Nakagawa (@repeatedly)&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　好きなプラグインとか言いましょう（発表者さん）
　MongoDBのプラグインをベースにプラグイン開発の説明
　http://bit.ly/fluentd-with-mongo
　プラグイン名はfluent-plugin-xxxで統一されてます。
　fluent-plugin-mongoがダウンロード数が1位に！
　（scribeのプラグインがデイリーでテストが走ってダウンロード数が増えるという卑怯なカウント稼ぎしてたらしいｗ）
　
　fluentd.confの説明
　fluentdの起動は以下のとおり。開発中は-vつけるといいよ
　　fluentd -c fluentd.conf
　プラグインをどう作る？
　Fluentdの構成図による説明
　　Cool.io、MessagePack、Rubyなど。
　それぞれの説明を簡単に。
　Cool.ioがファイル監視とかをやってくれるみたい。
　プラグイン開発に関する詳細な説明
　　テスト、gem構成などを書いてくれてる。
　QA：
　　Q：複数行のログを扱うのはどこを作ればいい？tailプラグインの正規表現だとうまく行かなかった。
　　A：tailをoverrideしてparserLineを実装する。複数行のparserは難しいけどね
　　Q：ログのアグリゲーションをやってみたいのだが、どう？CPU利用率とかを1分間バッファしてからアグリゲーションして平均出すとか。
　　A；fluent-plugin-aggregateってのがあって、forward-pluginを書き換えて作ってる。
　　　　TimeSlicedOutputでやると時間の期間指定とかが可能。
　　管理画面つくろうと思ってるので手伝ってください！@repeatedly
　　Q：fluentd自体が処理した統計データの出力とかある？
　　A：古橋さんが頑張ります！協力して！=&amp;gt;@tagomoris先生が書いてる！
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;◎15:15～16:00     「fluent を使った大規模ウェブサービスのロギング」
　&lt;a href=&#34;
http://www.slideshare.net/hotchpotch/20120204fluent-logging&#34;&gt;&lt;a href=&#34;http://www.slideshare.net/hotchpotch/20120204fluent-logging&#34;&gt;http://www.slideshare.net/hotchpotch/20120204fluent-logging&lt;/a&gt;&lt;/a&gt;
　COOKPAD, Inc.　舘野 祐一 (id:secondlife, @hotchpotch)&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　COOKPADでの基盤全般を見てる部署の人　PVログ＋MySQL
　　1日分はオンメモリにのるから高速。けど、1週間前とかになると遅くなる
　blackholeエンジン（MySQLの一部？）だと速い（ときどきおそくなる）
　データ保存でも問題
　　直近データしか保存できない。大きすぎて。
　　今後スケールしないときつくなる（1日分もメモリに載らなくなる可能性も出てくる）
　他のログはMySQLへJSONでシリアライズして出力とかもしてた。
　　アプリでDBにログ出力はinsertのコストが厳しい。PVとかなら、1リクエスト＝1insertだけど、1リクエストで多数ログ出力とかが厳しい。
　そこにFluentd登場！！！
　　出力先が色々使える。（MySQL以外もOK）
　パフォーマンス
　　バッファリング＋転送をやってくれるし、非同期で処理可能なのでレスポンスタイムへの影響が最小限にできてる。
　安定性
　　プラグインはちょっと注意が必要。
　　バッファリングしてくれてるので、一時的に停止もできるのがうれしい。
　　6時間止めてもOKだったよ（テヘッｗ）
　今後
　　PV系のログをMySQLから移行検討中
　具体例！！
　　td-agentをrpmで入れてるし、Rubyまで入ってくれる。
　　構成管理はpuppetを利用してる。
　　td-agentの設定の注意点
　　　「retry_limit 9」に変更してる。標準だと17なんだけど、2の16乗＝大体1日かかる。9だと大体10分くらい
　　中央転送用サーバ
　　　gitで設定ファイル管理してる。
　　　　よく変更するため。　　　gemfileで各種fluentd/pluginを利用してる。
　　　　自分たちで手を入れたソースを利用できるようにもしたいため。
　　テスト時にテストが書けるのが嬉しい（Rubyで出来てるアプリからもいじりやすいし、アプリのテストでも簡単に使える）
　　ロガーへの実装追加もできる。
　　Tips
　　　バッファからすぐ処理させたい場合とかの説明
　こんなのあったら嬉しいな。
　　設定ファイルの柔軟な設定記述方式
　　DSLにならないかなぁ（けど、やり過ぎも厳しいし。。。）
　ログの重要性
　　統計を考えられるエンジニアが重要。
　　どのデータにどんな価値があってそれを仕事（お金）に結び付けられるか？
　QA：
　　Q：障害対応のノウハウとか？
　　A：nagios、muninでサーバとか監視してる。
　　　　アラートチェックもしてる。
　　　　Fluentdの安定性は2ヶ月実際に導入してみて特に問題は出てない。
　　Q：MongoDBの構成は？
　　A：master/slave構成。PVログはS3に保存してEMRで処理。
　　Q：パフォーマンスの測定は？
　　A：40Mbit/sが処理できてたのは見てる。あとは、後ろの発表ですごいのがある！
　　Q：設定ミスの防止とかをどうやった？
　　A：今回はpuppetの設定後のリロードをチェックするような仕組みを入れた。
　　　　本来なら、データが流れてるかどうかのチェックを入れるプラグインを書いて欲しいｗ
　　Q：データマイニングエンジニアの定義は？
　　A：データの価値を見いだせるエンジニア。あとは、きちんと統計学を学んできてるエンジニア。両方募集中！！
　　Q：DynamoDBは検討は？
　　A：西海岸でしか動かないのでデータ転送の時間がかかってしまった＋RESTで１件ずつ登録なので今回は見送った。スキーマレスなのでうまく使えそう。
　　A２（古橋さん）：バルクインポートがないので使いにくい。
　　Q：ログ出力の形式をFluentdにあわせて変更したとかありますか？
　　A：もともとアプリで出力してたから特に変更なかった。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;◎16:15～17:00　「fluentをサービスで使ってみた」
　&lt;a href=&#34;http://www.slideshare.net/naverjapan/20120204fluent-public&#34;&gt;http://www.slideshare.net/naverjapan/20120204fluent-public&lt;/a&gt;
　NHN Japan株式会社　Tetsuya Ohira (@just_do_neet)&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　自己紹介が面白かったｗ
　実例の話。
　事例１：
　　社内向けのログ解析に利用　
　　Fluentd＋Hadoop
　　データノードにFluentdで出力して、データノードからHDFSに書き込んでる。
　事例２：
　　NAVERまとめのまとめ作成者へのデータ解析
　　Fluentd＋Hadopo＋Azkaban
　　Azkaban（個人的にはオススメできないｗ）
　　flutendの負荷は全然上がってない。
　監視
　　tcp portの監視
　　転送されたデータサイズのチェック。HDFS側のデータ量でチェックしてる。
　　なぜか半死半生の状態になった（よくわからない。）
　プラグインを自分で直せるので対応が楽。（Ruby力は必要だけど。）
　demo
　　準リアルタイム解析基盤の構成案（おもろそう）
　　　fluentd、MongoDB、Hadoop、Jubatus、node.js
　　地図にアクセス解析結果をのっけて見せる。（maptail.js？）
　提案or相談：
　　動的に設定ファイルの内容を変更できるようにしたい
　　　log rotateのタイミングでshell実行でfluentd再起動
　　必要な情報だけrelayしたい
　　　フィルタープラグインみたいなものが書きたい。
　　fluentd自体のメトリクスを出して欲しい
　　jubatusプラグインはー？
　QA：　　Q：log rotateへの対応はどーしてる？
　　A：今はログローテートのタイミングでfluentd再起動してる
　　Q：Apps側のFluentdがコケたときにaccess_logをcopyしてるらしいけど、重複しないの？
　　A：失敗した対象のログをストレージから一旦廃棄して、再送してる。
　　Q：Rubyがそこまで得意じゃないのにFluentdを選んだ理由は？
　　A：他のモノが使いにくかった＋既存システムに手を入れなくて済む＋タイムリーだったという理由。
　　Q：構成案のデータの流れは？
　　A：MongoDB、Hadoopへは同一ログを流して、リアルタイムが重要な場合はMongoDB、大量データ回すのはHadoop？
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;◎17:15～18:00     「Distributed message stream processing on fluentd」
　&lt;a href=&#34;http://www.slideshare.net/tagomoris/distributed-stream-processing-on-fluentd-fluentd&#34;&gt;http://www.slideshare.net/tagomoris/distributed-stream-processing-on-fluentd-fluentd&lt;/a&gt;
　NHN Japan株式会社 ウェブサービス本部　Tagomori Satoshi (@tagomoris)&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　sed | grep | wc がメイン。
　Hiveで集計してます。
　なんでFluentd？（not Storm、Kafka or Flume?）
　　Rubyが好き（ライブドアはJavaが入ってない環境もあるし）
　　プラグインやTimeSlicedOutputがあるのも採用理由
　ログ収集の構成図
　　ブログに別の勉強会の資料があるので見てください。
　まだ１０日間しか動いてないので実績は少ない？
　　127サーバからのログを流してる。
　　7万行/sec、ピーク120Mbpsが流れてる。
　　89 fluentd インスタンスが12ノード（4コアHT）で動いてる。
　1行のログを1行のタブ区切りで出力する（Hiveでインポートしやすいから）
　Apacheのログに幾つか追加したデータなどが出力されてて、それをタブ区切りにするため設定一発では変換できない。
　TimeSlicedOutputが重要
　　時刻単位でログ出力できないとキツイ（ログの流量が半端ないから）
　　ログローテートでは時刻単位できちんと出力されてない。
　ログから解析までの流れ図
　　以前は生ログをHadoopに書き出してたので25分くらいのタイムラグが出てしまっていた。（ノード数が少ないという理由もあるけど、お金的に増やしたくない）＋Hadoopで他のジョブが実行されてるとさらに遅くなる。。。
　　fluentd でログを流しながらコンバートもかけられ、Hadoopでのデータコンバートの処理遅延が少なくなってハッピーに！
　ストリーミング処理の重要な点
　　バッチでもストリーミング処理でも同じことが可能。（out_exec_filterとHadoop Streaming）
　　SPOFがないこと
　トポロジ、Fluentdの構成　　
　　ログエージェント（scribeline：お手製）
　　　pythonで書かれたscribelineというものを利用してる。
　　　フェイルオーバーの処理（primary、secondary構成）が可能
　　　fluentdは入れてない。（ログを拾い上げて流すだけには重い）
　　workerノード
　　serializerノードが必要なのは出力先の競合を減らす必要があるため。

　　　出力先が大量のアクセスに向いてない場合があるから。
　　　あと、ログの流れを元に監視したい項目にもここで対応可能。
　　watcherノード
　　　deliver、serializerからのデータを見ながら監視、統計処理を行える。
　設定は自動生成してる。800行くらいになっちゃうから。
　　workerへの分散具合をよしなにしたいから。
　 remove_prefix 、add_prefixでデータの流れ先の交通整理してるのか。 
　GrowthForecastでグラフを出力してる。
　　https://github.com/kazeburo/GrowthForecast
　

　QA
　　Q：大規模環境での移行はどうやったの？
　　A：もともと流すような仕組みはあって、流し先を変えたので
　　　　それほど大変ではなかった。ただ、アプリ側で動いてた部分に手を入れたときは配備が大変だった。
　　Q：workerが1サーバ8の理由は？
　　A：4コアHT＝8というので8としている。
　　Q：deliverのカーネルパラメータをいじってたりしない？
　　A：ライブドア標準の設定がされてる。CentOSのデフォルトでもそれほどきびしくないかな？
　　Q：deliverノードでラウンドロビン＋out_forwardになってる理由は？out_forwardだけじゃだめ？
　　A：バッファのタイミングでの切り替えだと溢れてしまうので、最大でも1秒でラウンドロビンしてworkerを切り替える必要がある。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;※懇親会設営の手伝いのためあんまり聞けず。
◎18:15～19:00(Plugin紹介LT)(各10分)　@shun0102: 「fluent-plugin-dstatを使ったリアルタイムクラスタモニタリング」
　&lt;a href=&#34;http://www.slideshare.net/shun0102/fluent-plugindstat&#34;&gt;http://www.slideshare.net/shun0102/fluent-plugindstat&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;　@ixixi: 「fluent-plugin-couch」
　&lt;a href=&#34;http://www.slideshare.net/ixixi/fluent-plugins-for-couchdbamazon-sqssns&#34;&gt;http://www.slideshare.net/ixixi/fluent-plugins-for-couchdbamazon-sqssns&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;　@chobi_e: 「Fluentd &amp;amp; PHP」
　&lt;a href=&#34;http://www.slideshare.net/shuheitanuma/fluentd-and-php&#34;&gt;
&lt;a href=&#34;http://www.slideshare.net/shuheitanuma/fluentd-and-php&#34;&gt;http://www.slideshare.net/shuheitanuma/fluentd-and-php&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;　@railute:「Fluent Output Plugin for Cassandra」
　&lt;a href=&#34;https://skydrive.live.com/view.aspx?cid=D105615A0F594518&amp;amp;resid=D105615A0F594518%21333&#34;&gt;https://skydrive.live.com/view.aspx?cid=D105615A0F594518&amp;amp;resid=D105615A0F594518%21333&lt;/a&gt;&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>今興味があること(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/01/27/%E4%BB%8A%E8%88%88%E5%91%B3%E3%81%8C%E3%81%82%E3%82%8B%E3%81%93%E3%81%A8/</link>
      <pubDate>Fri, 27 Jan 2012 01:50:41 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/01/27/%E4%BB%8A%E8%88%88%E5%91%B3%E3%81%8C%E3%81%82%E3%82%8B%E3%81%93%E3%81%A8/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://johtani.jugem.jp/?eid=53&#34;&gt;昨年末に今年の抱負について書いた&lt;/a&gt;のですが、
他にも興味あるものが増えたので備忘録＆公約？を兼ねてブログに書いておきます。
（興味あるものがあれば、シェアしたりできると楽しいので、ツイート、コメント待ってます。）&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;http://johtani.jugem.jp/?eid=53&#34;&gt;昨年末に今年の抱負について書いた&lt;/a&gt;のですが、
他にも興味あるものが増えたので備忘録＆公約？を兼ねてブログに書いておきます。
（興味あるものがあれば、シェアしたりできると楽しいので、ツイート、コメント待ってます。）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ZooKeeper&lt;/li&gt;
&lt;li&gt;SolrCloud&lt;/li&gt;
&lt;li&gt;SenseiDB&lt;/li&gt;
&lt;li&gt;Lucene&lt;/li&gt;
&lt;li&gt;検索システムのアジャイル開発？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;まずは、ZooKeeper。このなんとも言えない&lt;a href=&#34;http://zookeeper.apache.org/images/zookeeper_small.gif&#34;&gt;アイコン&lt;/a&gt;でお馴染みのヤツです。
こんな顔してますが（顔関係ない。。。）、いろんな所に出没します。
Katta、Lilly、SolrCloudにも出てくるんです。SenseiDBにも出てくるんです。分散処理にことごとく絡んできます。
で、これは、知っとかないとまずそうだと。&lt;/p&gt;
&lt;p&gt;SolrCloud。まぁ、妥当です。一応、Solrな人なんで。
昨年、NewSolrDesignを訳してみてもいます。訳しただけでほったらかし。。。
elasticsearchとかSenseiDBとかSolrに似たLuceneを利用している検索サーバがチラホラ話題になってます。
できれば、このあたりの分散の仕組みを比較しながら調べたいなと思ってみたり。
すべてをカバーするのはキツイので、SolrCloudかSenseiDBあたりを調べていきたいなぁと。&lt;/p&gt;
&lt;p&gt;で、SenseiDBです。先日、Publickeyで&lt;a href=&#34;http://www.publickey1.jp/blog/12/senseidblinkedin.html&#34;&gt;記事&lt;/a&gt;が出て飛びつきました。
Zookeeper使ってるし、分散だし、全文インデックスにLucene使ってるし。
なんだか興味あること、全部入りな感じです。&lt;/p&gt;
&lt;p&gt;Luceneも興味津津です。
Solrがコアとして使ってますし、昨年、Solrと同時にリリースされるようになりました。
Luceneも奥が深く、時々、Solr調べててLuceneのソースも見るのですが、本格的に全体像を把握したりは残念ながらできていません。
そのくせ、Zookeeper同様、いろんな所に出没するんです、これが。
ということで、足元を固めるためにもLuceneに入門しないとなぁと。&lt;/p&gt;
&lt;p&gt;で、最後に検索システムのアジャイル開発です。
lucene-gosenのコミッターをやらせてもらってたり、Solrに絡んだ仕事もしてますが、長期にわたってフィードバックをもらいながら検索システムを育てていくというのが最近興味が出てきてることです。
検索システムは作ったらおしまいとは行かないのが厄介なところです。
データは増加しますし、検索されるキーワードも変わってきます。
また、検索される方法も変わってきたりもします。
ユーザが検索したいものも変化があります。
思ったように検索にヒットしない場合とユーザが離れて行ってしまいますし、検索しにくい場合も同様です。
今日、クックパッドの方の話しを聞いて思い出した次第です。（前に、Solr勉強会でも同じ話しをされて、同じ思いに至ったのですが、いかんせん忘れやすくてｗ）
また、ログ解析の話などをTwitterで見てることもあり、検索という側面でのログ解析ってのも重要だよなぁと。
いくつか思いつくこともあるのですが、実践出来る場も限られてます。
色々と話しをする場を設けるのも面白いかもなぁと妄想してる次第です。&lt;/p&gt;
&lt;p&gt;取り留めもなく、現時点で気になってることを書きだして見ました。
また、数ヶ月したら気が変わってるかもしれないですが、とりあえず書き残してみます。
興味がある方がいらっしゃったら声をかけてもらえるとうれしいですね。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>モーショノロジー2012#1に参加しました。(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/01/27/%E3%83%A2%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%8E%E3%83%AD%E3%82%B8%E3%83%BC2012-1%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Fri, 27 Jan 2012 00:52:35 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/01/27/%E3%83%A2%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%8E%E3%83%AD%E3%82%B8%E3%83%BC2012-1%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;ということで、いつものように勉強会に参加したメモです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://atnd.org/events/23608&#34;&gt;http://atnd.org/events/23608&lt;/a&gt;
日時 :2012/01/26 19:00 to 22:00
会場 :アカデミーヒルズ(六本木ヒルズ内) 49階（タワーホールA） （港区六本木6-10-1）
ハッシュタグ :#mnlgy&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ということで、いつものように勉強会に参加したメモです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://atnd.org/events/23608&#34;&gt;http://atnd.org/events/23608&lt;/a&gt;
日時 :2012/01/26 19:00 to 22:00
会場 :アカデミーヒルズ(六本木ヒルズ内) 49階（タワーホールA） （港区六本木6-10-1）
ハッシュタグ :#mnlgy&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
■タイムテーブル
司会：CROOZLabs株式会社 研究所 所長 代表取締役社長　小俣 泰明

モーションノロジーの説明があったけど、他のことしてました。すんません。

1.
発表者: 有限会社未来検索ブラジル　森 大二郎
概要：groongaの索引構築の実装

　全文検索とは。歴史から
　　1971：full-text。。。というキーワードが。
　　現代の全文検索の課題はあんまり変わってない

　全文検索の手法
　　いくつかあるけど、転置索引の説明だけ。groongaも転置索引

　groongaはインデックスの動的構築が得意
　静的構築も考慮してます。

2.
発表者：CROOZ株式会社　長谷川 博紀
概要：MeCabからの脱出？(仮
　
　CROOZ MALLの解説
　MySQLとMeCabでやってます。
　Tritonnつかってるのか？
　groongaとの性能比較検証やってみました。
　MeCabが問題じゃなくて、辞書ありの形態素解析が問題。
　　辞書にない単語もうまく検索したい
　　辞書に単語登録したら形態素やり直し
　　ソート用のデータが。。。（ここはわからなかった）

　QA
　　Q：MeCabの代わりとなっているものは？
　　A：MeCabを改善してみる？

3.
発表者 : グリー株式会社　一井 崇
概要：全文検索のちょっとちがった使い方（仮）

　グリーでの数値指標管理
　　事前集計してKVSに登録してみてみる
　1億パターンのキーが存在する。。。
　　キーがわからなくなる問題とか事前集計できてる？とか迷子になる。
　キーも全文検索に入れてみては？
　　「富士山の標高は何メートル？」とかでデータが取れる。
　構造化されたキーをkey stringとして全文検索する。
　構造化Keyに対応したKVSがあればいいんだけど。
　データストアとしての全文検索もいいのでは。

4.
発表者：株式会社クリアコード　須藤 功平
概要：rroongaによる検索サービスの実装

　groongaとRubyの組み合わせでrroonga。Rubyによるインタフェース？
　groongaとのつながり部分をRubyで書いたライブラリ
　多段ドリルダウン機能
　　絞り込みによる検索結果の比較とかに利用可能
　メタデータ抽出にドリルダウンが便利
　　例：番組説明から出演者を抽出
　サジェスト機能もある
　　コンテンツベース
　　　すぐできる。候補の精度がいい
　　統計情報ベース
　　　元データがある程度必要
　　　候補が増えるけど、精度の問題あり

5.
発表者: 株式会社ぐるなび　塩畑 公一
概要: groongaの位置情報検索関連について。

　2010年4月からgroongaを利用し始めた
　　レストラン検索、地図検索など
　円形、矩形の緯度経度検索が可能。
　距離算出もやってる。ソートとか用かな。
　球面近似もやってる。
　geoの検索速度についてパフォーマンステストしました。
　Q：近似手法をいくつもサポートされてるけど必要？
　A：距離計算を正確にしないと不利になるお店が出てきちゃうから

6.
発表者: クックパッド株式会社 兼山 元太
概要: Solrを使ったレシピ検索のプロトタイピング

　クックパッドとは？
　　女性多いよ
　　AWS上でRubyで組んであるよ
　プロトタイピングって？
　　ユーザの問題を発見してから、プロトタイピング
　　本番デプロイ（一部ユーザに公開）
　　　問題を抱えているユーザーに向けてそれぞれ数十のバージョンが動いている
　　インタビューとかしてフィードバック受ける。
　本番の検索エンジンのフィールドをいっぱい追加
　Solrの紹介（MySQL（Tritonn）から移植しました）

　ダイナミックフィールドやレプリケーションの話。
　JSON型でHTTP経由で検索できるのが便利。
　Solr本の紹介して頂きました！あざっす！
　気になってるSolrの新機能
　　not to cache
　　SurroundQuery
　　BloomFilter
　Q：全部AWS？
　A：全部AWSに移行しました。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;とまぁ、参加してきました。
初六本木ヒルズで、おしゃれな場所、雰囲気にやられてしまって、あんまりちゃんと聞けてないところがありますが。。。
メモを取りましたので。参考までに。
groongaについては勉強不足のため、いまいちついていけませんでした。
ちょっと英語の記事を読んでいたのもありまして。（内職良くない。。。）
MeCabに関する発表に興味があり、勝手にMeCabの代わりorMeCabよりいいものを使ってます！みたいな発表かと想像していました。（ちょっと違ったみたい、妄想は良くないですね。。。）&lt;/p&gt;
&lt;p&gt;グリーの方の発表は興味深かったです。ログ解析とかにも確かに全文検索の技術使えるし。
検討が進んだ次の話も聞いてみたいです
groongaの位置情報の話やrroongaでのgroongaの色々な機能のはなしも出てきてgroongaの理解もちょっと進んだのはありがたかったです。&lt;/p&gt;
&lt;p&gt;最後のクックパッドさんの話は、今回もわかりやすくて面白かったです。
検索を成長させていくという姿勢と、実際にどんな形でそれを実施されているかが楽しそうに話されててとても羨ましかったです。
次はSolrで困ってる点とか、検索のログとか利用され方をどのように解析してるのかといった話も聞きたいですね。&lt;/p&gt;
&lt;p&gt;どうしてもSolrに思い入れがあるので、感想が偏ってるかもしれません、すみません。
気になる点やいや、こうなんだよ！ってツッコミがあれば、ぜひコメントやTweetしてもらえるとありがたいです。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>MapR中身説明会に参加しました。(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/01/20/mapr%E4%B8%AD%E8%BA%AB%E8%AA%AC%E6%98%8E%E4%BC%9A%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Fri, 20 Jan 2012 00:58:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/01/20/mapr%E4%B8%AD%E8%BA%AB%E8%AA%AC%E6%98%8E%E4%BC%9A%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;日時：2012/01/19 18:30-20:30
場所：ベルサール三田Room2シアター&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
Inside MapR
　デモ＋内部のお話。
　・自己紹介
　　Susheel Kaushik
　　　元YahooのHadoop系の人。製品担当責任者。
　　草薙さん

　3台のベアボーンでMapRが動いてるデモが開始。
　クラスタ管理画面の説明。
　なぜか、NFSのサービスが1台落ちてますがｗ
　MapReduceなんかの実行結果なども出てくるのか。
　ボリューム管理も画面から操作
　レプリケーション、スナップショットも管理画面で操作、動作確認できますよ。
　ミラー先はリードオンリーでボリュームの同期が可能。
　スナップショットによりMapRのクラスタ内部にバックアップが保持可能。
　NFSのHA構成可能。VIPの機能などもあるよ。
　事前定義された各種Alertの発行も可能。
　JobTrackerもMapRで拡張された表示がある。
　例：MapTaskPrefetchCapacity：次のジョブのMapperを起動する準備可能な仕組み
　MapR内で独自に出力してる測定値をGangliaで見ることができるよ。

　MapRはHadoopの置き換えとなる製品。
　HDFS部分を重点的に性能アップさせるために主に置き換えた製品。
　MapReduce部分にも手を入れてる。例：Direct Shuffle（HTTPじゃなくて、RPCでShuffleの通信を行ってるとか）ボリューム活用してるらしい。
　分散NameNode、JavaGCの影響の排除、ビルトイン圧縮によるI/O削減など。
　Mapperの出力をHDFSに置くと、メタデータ更新が多くなり、NameNodeがパンクする。（Apache Hadoop）
　Q：中間データもレプリケーションすると性能劣化しないんですか？
　A：中間データボリュームは特定ノードしか保持されない（＝レプリカ数は１）

　ストレージプール（SP）
　　ソフトウェアでストライピング。RAIDしなくてよい。
　コンテナ（データ、ネームがある。）
　　データブロックをグループ化したもの
　　※ストレージプールの数と同数のボリュームを作成すべき。
　CLDBがコンテナを管理してる。

　Q：トランザクション失敗するのは？
　A：どこかにかければトランザクションは成功。
　　　コンテナが復旧してきたら、データがコピーされる。復旧されない場合は別途コンテナを割り当てることもある？

　Q：ノードが追加される場合の挙動は？
　A：。。。聞き逃した。

　トポロジ
　　ノードを階層的にグループ化してデータ配置をコントロール。
　Q：トポロジ設定などの権限設定は？
　A：Permission画面があるよ。
　Q：ボリューム単位のファイルシステムアクセスに関する設定は？
　A：？？？聞き逃した？

　ボリューム
　　いろいろな設定が可能。
　スナップショット
　　Copy-on-Write方式による差分格納
　ミラー
　　ソースからミラーにコピー。手動orスケジュールによる起動が必要。
　　ミラー側はRead-only
　　※誤解を招きやすいので注意
　　読み出しが多い場合にミラーを利用することで対応が可能。
　ビルトイン圧縮
　　LZZFの一種を高速化してる
　　ネットワークIOにも効いてくる
　JobTracker HA
　　最大３ノードで構成可能。アクティブスタンバイ
　NFS HA
　　すべてのノードで稼働可能。
　NFS機能
　　NFSv3相当
　　クライアント側にNFSサービスをインストールするという構成も可能に。
　Q：NFSマウントして作成したファイルもブロックサイズ分のファイルサイズになるの？
　A：8Kバイト単位で内部的にはファイルを作成してる。8KB単位で圧縮して管理してるので、小さいサイズでもいい。（アロケーションサイズが8KB）
　Q：8KBにしてしまったために大きなブロックサイズの利点がなくなるのでは？
　A：オーバーヘッド内容な構成になってる。シーケンシャルに8KBに並んでるから？
　Q：NFSによるとMapReduceによるアクセスの排他制御とかは？
　A：独自で頑張らないといけない。Job起動時に効果的にスナップショット取ったりはしてない。

　リバランスもバックグラウンドで実行可能
　Apache Hadoopが備えるJava APIは100%語幹
　Q：なんで、HDFSをがりっと書き換えたの？
　A：運用性も、ノード管理も。。。全部です。
　　　なくなっても良いデータなら、別にHadoopでもいいですよね。
　　　けど、基幹システムとかだと、信頼性が必要だし、運用の効率も必要だしいろいろ必要。
　Q：実績が必要なんですが、どのような試験を行われているのかという情報が公開される？EMCでやられてるテストのプロセスを適用しているなどの裏付けは公開されないの？
　A：内部で6ヶ月利用してデータロスはない。
　　　品質については強化していく。
　Q：MapRとしてHadoopコミュニティへの還元していく内容ってどんなもの？
　A：Apacheコミュニティに対して1000台のクラスタを提供してスケーラビリティテストとかやってくださいとしている。
　Q：このクラスタを実際にはどう使ってもらうの？
　A：品質アップするためにテスト環境として使ってもらう？
　Q：ApacheのAPIの互換性を死守するのが必ずしもいいとは思えない場合にどうするの？MapR独自APIとかは出さないの？
　A：ApacheのAPIに準拠するのは非常に重要。他のHadoop上のアプリが動作しなくなるから。
　Q：MapRを容量の大きなファイルシステムとしてだけ利用するなんて想定はありますか？MapReduceを利用しないパターンです。
　A：いや、それはｗ
　Q：MapRはエンタープライズがターゲットだけど、Amazonはパブリッククラウドが対象。マルチテナントなパブリックサービスでMapRを利用するとかは？
　A：。。。
　Q：ジョブ管理にも手を入れてるの？
　A：あんまり手を入れてません。
　Q：EMCのストレージ製品でMapRのMapReduceない版みたいの出てない？
　A：中身はMapRじゃないですよ。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;想定とは異なり、日本の草薙さんが主に説明されたのですごくわかりやすかったです。
しかもかなり内部まで理解されている方だったので突っ込んだ質問にもきちんと回答されてるので更に理解が進みました。
今回利用された資料は現時点では公開の予定はないという話でした。
ただ、かなりまとまってる資料なので、後悔して欲しいものです。
普通にviとかしてるだけなのに、すごいと思うデモってなんか新鮮でした。
MapR自体を触る機会はまだまだないと思うのですが、MapRとしてHadoopに対する思想が垣間見えたのが面白かったです。
すごいメンツが質問を投げまくるのでいろいろな側面で話が聞けました。
ただ、やっぱり英語のヒアリングがダメダメだというのが露呈しました。。。今年は少し頑張らないと、先が思いやられますね。。。
あと、疑問と言うか、感想ですが、MapR自体が結構多機能で、その機能をどう扱うか、どのようなノード構成やボリューム構成を取るかといった設計が結構大事でしかも大変なんじゃないかなぁという印象を受けました。
特にマルチテナントで利用する場合などは、想定されないミラーの利用などでデータ容量が足りなくなったりといった側面も出てくるのかなぁと。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;日時：2012/01/19 18:30-20:30
場所：ベルサール三田Room2シアター&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
Inside MapR
　デモ＋内部のお話。
　・自己紹介
　　Susheel Kaushik
　　　元YahooのHadoop系の人。製品担当責任者。
　　草薙さん

　3台のベアボーンでMapRが動いてるデモが開始。
　クラスタ管理画面の説明。
　なぜか、NFSのサービスが1台落ちてますがｗ
　MapReduceなんかの実行結果なども出てくるのか。
　ボリューム管理も画面から操作
　レプリケーション、スナップショットも管理画面で操作、動作確認できますよ。
　ミラー先はリードオンリーでボリュームの同期が可能。
　スナップショットによりMapRのクラスタ内部にバックアップが保持可能。
　NFSのHA構成可能。VIPの機能などもあるよ。
　事前定義された各種Alertの発行も可能。
　JobTrackerもMapRで拡張された表示がある。
　例：MapTaskPrefetchCapacity：次のジョブのMapperを起動する準備可能な仕組み
　MapR内で独自に出力してる測定値をGangliaで見ることができるよ。

　MapRはHadoopの置き換えとなる製品。
　HDFS部分を重点的に性能アップさせるために主に置き換えた製品。
　MapReduce部分にも手を入れてる。例：Direct Shuffle（HTTPじゃなくて、RPCでShuffleの通信を行ってるとか）ボリューム活用してるらしい。
　分散NameNode、JavaGCの影響の排除、ビルトイン圧縮によるI/O削減など。
　Mapperの出力をHDFSに置くと、メタデータ更新が多くなり、NameNodeがパンクする。（Apache Hadoop）
　Q：中間データもレプリケーションすると性能劣化しないんですか？
　A：中間データボリュームは特定ノードしか保持されない（＝レプリカ数は１）

　ストレージプール（SP）
　　ソフトウェアでストライピング。RAIDしなくてよい。
　コンテナ（データ、ネームがある。）
　　データブロックをグループ化したもの
　　※ストレージプールの数と同数のボリュームを作成すべき。
　CLDBがコンテナを管理してる。

　Q：トランザクション失敗するのは？
　A：どこかにかければトランザクションは成功。
　　　コンテナが復旧してきたら、データがコピーされる。復旧されない場合は別途コンテナを割り当てることもある？

　Q：ノードが追加される場合の挙動は？
　A：。。。聞き逃した。

　トポロジ
　　ノードを階層的にグループ化してデータ配置をコントロール。
　Q：トポロジ設定などの権限設定は？
　A：Permission画面があるよ。
　Q：ボリューム単位のファイルシステムアクセスに関する設定は？
　A：？？？聞き逃した？

　ボリューム
　　いろいろな設定が可能。
　スナップショット
　　Copy-on-Write方式による差分格納
　ミラー
　　ソースからミラーにコピー。手動orスケジュールによる起動が必要。
　　ミラー側はRead-only
　　※誤解を招きやすいので注意
　　読み出しが多い場合にミラーを利用することで対応が可能。
　ビルトイン圧縮
　　LZZFの一種を高速化してる
　　ネットワークIOにも効いてくる
　JobTracker HA
　　最大３ノードで構成可能。アクティブスタンバイ
　NFS HA
　　すべてのノードで稼働可能。
　NFS機能
　　NFSv3相当
　　クライアント側にNFSサービスをインストールするという構成も可能に。
　Q：NFSマウントして作成したファイルもブロックサイズ分のファイルサイズになるの？
　A：8Kバイト単位で内部的にはファイルを作成してる。8KB単位で圧縮して管理してるので、小さいサイズでもいい。（アロケーションサイズが8KB）
　Q：8KBにしてしまったために大きなブロックサイズの利点がなくなるのでは？
　A：オーバーヘッド内容な構成になってる。シーケンシャルに8KBに並んでるから？
　Q：NFSによるとMapReduceによるアクセスの排他制御とかは？
　A：独自で頑張らないといけない。Job起動時に効果的にスナップショット取ったりはしてない。

　リバランスもバックグラウンドで実行可能
　Apache Hadoopが備えるJava APIは100%語幹
　Q：なんで、HDFSをがりっと書き換えたの？
　A：運用性も、ノード管理も。。。全部です。
　　　なくなっても良いデータなら、別にHadoopでもいいですよね。
　　　けど、基幹システムとかだと、信頼性が必要だし、運用の効率も必要だしいろいろ必要。
　Q：実績が必要なんですが、どのような試験を行われているのかという情報が公開される？EMCでやられてるテストのプロセスを適用しているなどの裏付けは公開されないの？
　A：内部で6ヶ月利用してデータロスはない。
　　　品質については強化していく。
　Q：MapRとしてHadoopコミュニティへの還元していく内容ってどんなもの？
　A：Apacheコミュニティに対して1000台のクラスタを提供してスケーラビリティテストとかやってくださいとしている。
　Q：このクラスタを実際にはどう使ってもらうの？
　A：品質アップするためにテスト環境として使ってもらう？
　Q：ApacheのAPIの互換性を死守するのが必ずしもいいとは思えない場合にどうするの？MapR独自APIとかは出さないの？
　A：ApacheのAPIに準拠するのは非常に重要。他のHadoop上のアプリが動作しなくなるから。
　Q：MapRを容量の大きなファイルシステムとしてだけ利用するなんて想定はありますか？MapReduceを利用しないパターンです。
　A：いや、それはｗ
　Q：MapRはエンタープライズがターゲットだけど、Amazonはパブリッククラウドが対象。マルチテナントなパブリックサービスでMapRを利用するとかは？
　A：。。。
　Q：ジョブ管理にも手を入れてるの？
　A：あんまり手を入れてません。
　Q：EMCのストレージ製品でMapRのMapReduceない版みたいの出てない？
　A：中身はMapRじゃないですよ。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;想定とは異なり、日本の草薙さんが主に説明されたのですごくわかりやすかったです。
しかもかなり内部まで理解されている方だったので突っ込んだ質問にもきちんと回答されてるので更に理解が進みました。
今回利用された資料は現時点では公開の予定はないという話でした。
ただ、かなりまとまってる資料なので、後悔して欲しいものです。
普通にviとかしてるだけなのに、すごいと思うデモってなんか新鮮でした。
MapR自体を触る機会はまだまだないと思うのですが、MapRとしてHadoopに対する思想が垣間見えたのが面白かったです。
すごいメンツが質問を投げまくるのでいろいろな側面で話が聞けました。
ただ、やっぱり英語のヒアリングがダメダメだというのが露呈しました。。。今年は少し頑張らないと、先が思いやられますね。。。
あと、疑問と言うか、感想ですが、MapR自体が結構多機能で、その機能をどう扱うか、どのようなノード構成やボリューム構成を取るかといった設計が結構大事でしかも大変なんじゃないかなぁという印象を受けました。
特にマルチテナントで利用する場合などは、想定されないミラーの利用などでデータ容量が足りなくなったりといった側面も出てくるのかなぁと。&lt;/p&gt;
&lt;p&gt;説明会のあと、Hadoopにあんまり絡んでないのに図々しくも飲み会にまで参加してきました。
これまた濃いメンバーだったので話についていくのも大変でしたが、面白い話が聞けました。やっぱり懇親会重要ですよねぇ。&lt;/p&gt;
&lt;p&gt;事前に&lt;a href=&#34;http://d.hatena.ne.jp/nagixx/20111216/1324006829?PHPSESSID=9d59999a496d495f782647a94315862d&#34;&gt;このブログ&lt;/a&gt;を読んでいたので話しを聞くのが楽でした。
MapR勉強するために必須のページです。（どうやら今日説明した人がかいてるきがしますが。。。）&lt;/p&gt;
&lt;p&gt;追記：
&lt;a href=&#34;http://togetter.com/li/244244&#34;&gt;トゥギャってくれた人に感謝。&lt;/a&gt;
　&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>OSSAJのミニセミナーで話しをしてきました(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/01/19/ossaj%E3%81%AE%E3%83%9F%E3%83%8B%E3%82%BB%E3%83%9F%E3%83%8A%E3%83%BC%E3%81%A7%E8%A9%B1%E3%81%97%E3%82%92%E3%81%97%E3%81%A6%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Thu, 19 Jan 2012 11:46:24 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/01/19/ossaj%E3%81%AE%E3%83%9F%E3%83%8B%E3%82%BB%E3%83%9F%E3%83%8A%E3%83%BC%E3%81%A7%E8%A9%B1%E3%81%97%E3%82%92%E3%81%97%E3%81%A6%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;お久しぶりです。インフルエンザで一家全滅という最悪の状況に陥っていた我が家でした。
流行してるみたいなのでみなさんも気をつけてください。&lt;/p&gt;
&lt;p&gt;さて、そんな中、&lt;a href=&#34;http://www.ossaj.org/seminar/120118/ossaj_seminar_20120118_brochure.html&#34;&gt;OSSAJのミニセミナー&lt;/a&gt;でSolrについて簡単に話しをしてきました。
人生初Ustだったのですが、ぶっ倒れている中作成した資料だったためなんとも情けない発表だった気がします。（言い訳カッコ悪いですね。。。）
関係者の皆様、申し訳ございませんでした。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;お久しぶりです。インフルエンザで一家全滅という最悪の状況に陥っていた我が家でした。
流行してるみたいなのでみなさんも気をつけてください。&lt;/p&gt;
&lt;p&gt;さて、そんな中、&lt;a href=&#34;http://www.ossaj.org/seminar/120118/ossaj_seminar_20120118_brochure.html&#34;&gt;OSSAJのミニセミナー&lt;/a&gt;でSolrについて簡単に話しをしてきました。
人生初Ustだったのですが、ぶっ倒れている中作成した資料だったためなんとも情けない発表だった気がします。（言い訳カッコ悪いですね。。。）
関係者の皆様、申し訳ございませんでした。&lt;/p&gt;
&lt;p&gt;内容としては、Solrの機能を簡単に紹介する程度の資料となっています。デモなどもないのでスライドだけ見てもなんだこれという感じかもしれませんが。&lt;/p&gt;
&lt;p&gt;ということで、恥ずかしながら、録画もされているようなので、後で見て反省しようと思います。。。&lt;/p&gt;
&lt;div style=&#34;width:425px&#34; id=&#34;__ss_11146713&#34;&gt; &lt;strong style=&#34;display:block;margin:12px 0 4px&#34;&gt;[オープンソースソフトウェア検索サーバ Solr入門](http://www.slideshare.net/JunOhtani/solr-11146713)** &lt;iframe src=&#34;http://www.slideshare.net/slideshow/embed_code/11146713&#34; width=&#34;425&#34; height=&#34;355&#34; frameborder=&#34;0&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34; scrolling=&#34;no&#34;&gt;&lt;/iframe&gt; &lt;div style=&#34;padding:5px 0 12px&#34;&gt; View more [presentations](http://www.slideshare.net/) from [Jun Ohtani](http://www.slideshare.net/JunOhtani) &lt;/div&gt; &lt;/div&gt;
</content:encoded>
    </item>
    
    <item>
      <title>lucene-gosenのLucene/Solr4.0対応ブランチ更新(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/01/08/lucene-gosen%E3%81%AElucene-solr4-0%E5%AF%BE%E5%BF%9C%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%9B%B4%E6%96%B0/</link>
      <pubDate>Sun, 08 Jan 2012 23:41:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/01/08/lucene-gosen%E3%81%AElucene-solr4-0%E5%AF%BE%E5%BF%9C%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%9B%B4%E6%96%B0/</guid>
      <description>&lt;p&gt;先日のSolr勉強会でLucene/Solr4.x系のlucene-gosenについて質問を受けていたのを忘れないように（年越しちゃいました、すみません。）先週金曜日（1/6）に&lt;a href=&#34;http://code.google.com/p/lucene-gosen/issues/detail?id=22&#34;&gt;issueに登録&lt;/a&gt;しました。
まずは忘れないようにと思って、登録だけして3連休に突入したのですが、Robertさんが1/7に対応してくれました。
Lucene/Solr 4.x系では3.x系とはパッケージやメソッドが変更されるなど少し異なる部分があります。
lucene-gosenでは、プロジェクトのページにもあるとおり、4.x系にも対応しています。
ただ、&lt;a href=&#34;http://code.google.com/p/lucene-gosen/source/browse/#svn%2Fbranches%2F4x&#34;&gt;この4x系に対応したブランチ&lt;/a&gt;が、2011年5月から放置されていました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;先日のSolr勉強会でLucene/Solr4.x系のlucene-gosenについて質問を受けていたのを忘れないように（年越しちゃいました、すみません。）先週金曜日（1/6）に&lt;a href=&#34;http://code.google.com/p/lucene-gosen/issues/detail?id=22&#34;&gt;issueに登録&lt;/a&gt;しました。
まずは忘れないようにと思って、登録だけして3連休に突入したのですが、Robertさんが1/7に対応してくれました。
Lucene/Solr 4.x系では3.x系とはパッケージやメソッドが変更されるなど少し異なる部分があります。
lucene-gosenでは、プロジェクトのページにもあるとおり、4.x系にも対応しています。
ただ、&lt;a href=&#34;http://code.google.com/p/lucene-gosen/source/browse/#svn%2Fbranches%2F4x&#34;&gt;この4x系に対応したブランチ&lt;/a&gt;が、2011年5月から放置されていました。&lt;/p&gt;
&lt;p&gt;ということで、Lucene/Solr 4.0系でlucene-gosenを利用されている方、これから利用される方は、&lt;a href=&#34;http://code.google.com/p/lucene-gosen/source/browse/#svn%2Fbranches%2F4x&#34;&gt;この4x系に対応したブランチ&lt;/a&gt;を利用してください。
なお、このブランチにはLucene/Solrのtrunk (r1228509)のSNAPSHOT版のjarファイルが利用されています。&lt;/p&gt;
&lt;p&gt;今後はlucene-gosen側でバグ修正や機能追加を行った場合にも4xブランチを更新していく予定です。
※ただし、Lucene/Solr 4.0が正式リリースされていないため、頻繁にSNAPSHOTのjarファイルを入れ替えることはこなわないと思います。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>あけましておめでとうございます＋会社のブログ更新(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2012/01/05/%E3%81%82%E3%81%91%E3%81%BE%E3%81%97%E3%81%A6%E3%81%8A%E3%82%81%E3%81%A7%E3%81%A8%E3%81%86%E3%81%94%E3%81%96%E3%81%84%E3%81%BE%E3%81%99%E4%BC%9A%E7%A4%BE%E3%81%AE%E3%83%96%E3%83%AD%E3%82%B0%E6%9B%B4%E6%96%B0/</link>
      <pubDate>Thu, 05 Jan 2012 12:56:57 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2012/01/05/%E3%81%82%E3%81%91%E3%81%BE%E3%81%97%E3%81%A6%E3%81%8A%E3%82%81%E3%81%A7%E3%81%A8%E3%81%86%E3%81%94%E3%81%96%E3%81%84%E3%81%BE%E3%81%99%E4%BC%9A%E7%A4%BE%E3%81%AE%E3%83%96%E3%83%AD%E3%82%B0%E6%9B%B4%E6%96%B0/</guid>
      <description>&lt;p&gt;あけましておめでとうございます。（もう5日ですが。。。）
今年もlucene-gosenを中心に色々と記事を書いていきますので、ツッコミ、コメント待ってます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;あけましておめでとうございます。（もう5日ですが。。。）
今年もlucene-gosenを中心に色々と記事を書いていきますので、ツッコミ、コメント待ってます。&lt;/p&gt;
&lt;p&gt;たまには会社のブログを書かないとイカンということで、会社のブログに&lt;a href=&#34;http://blog.seamark.co.jp/?p=305?PHPSESSID=1bdf737d8906533c6f92bfbddc12b17a&#34;&gt;NearRealTime検索についての記事&lt;/a&gt;をアップしました。
読んでやってください。&lt;/p&gt;
&lt;p&gt;ということで、今年もいろんな勉強会に出没しますので、よろしくお願い致します。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>今年の振り返りと来年の抱負？(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/12/28/%E4%BB%8A%E5%B9%B4%E3%81%AE%E6%8C%AF%E3%82%8A%E8%BF%94%E3%82%8A%E3%81%A8%E6%9D%A5%E5%B9%B4%E3%81%AE%E6%8A%B1%E8%B2%A0/</link>
      <pubDate>Wed, 28 Dec 2011 02:15:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/12/28/%E4%BB%8A%E5%B9%B4%E3%81%AE%E6%8C%AF%E3%82%8A%E8%BF%94%E3%82%8A%E3%81%A8%E6%9D%A5%E5%B9%B4%E3%81%AE%E6%8A%B1%E8%B2%A0/</guid>
      <description>&lt;p&gt;他の方たちよりひと足はやいですが、今年の仕事が終わりました。
せっかくブログを始めたので、振り返りと来年の抱負など書いてみようかなと。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;今年の振り返り&lt;/em&gt;&lt;/strong&gt;
まずは、今年1年を振り返ってみます。
今年の出来事はこんな感じでした。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;他の方たちよりひと足はやいですが、今年の仕事が終わりました。
せっかくブログを始めたので、振り返りと来年の抱負など書いてみようかなと。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;今年の振り返り&lt;/em&gt;&lt;/strong&gt;
まずは、今年1年を振り返ってみます。
今年の出来事はこんな感じでした。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3月に仕事が一区切り&lt;/li&gt;
&lt;li&gt;lucene-gosenに参加&lt;/li&gt;
&lt;li&gt;ブログを始める&lt;/li&gt;
&lt;li&gt;色々な勉強会に参加&lt;/li&gt;
&lt;li&gt;Twitterでつぶやきまくり&lt;/li&gt;
&lt;li&gt;Mac Book Airの購入&lt;/li&gt;
&lt;li&gt;PSVita買いました&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3月に一昨年から参加していた仕事が一区切りつきました。
もう少し色々とやり残した感がある中で区切りがついたのが少し心残りでした。
あと、3月は震災もあり、色々と大変でした。ただ、自分の中では震災の記憶が少し薄れつつあるのが気がかりです。
良くも悪くも忘れて行ってしまうのだなと。今でも頑張っている方々もいるので、少しでも心に留めておきたいものです。&lt;/p&gt;
&lt;p&gt;個人的に一番大きな今年の変化は「lucene-gosenへの参加」です。
関口さんとここ数年ずっと仕事をご一緒させていただいていることもあり、コミッターとして参加させてもらうことが出来ました。
英語が苦手な中、Robertさんへ自己紹介のメールを書いたり、Issueを英語で書いたりと苦労もしていますが、OSSに参加できることがとても楽しいです。
また、使っていただいている方たちからのフィードバックもいただけているのがすごく励みになります。
やはり、OSSは使ってもらってさらに良いものになっていくのかなぁという感想です。
ただ、自分の腰が重いため、なかなか対応が遅かったりといったところもあるなと反省するところも。&lt;/p&gt;
&lt;p&gt;勉強会にも色々と参加しました。Solr勉強会を始めとして、かねてより興味があるHadoopのカンファレンスやソースコードリーディング。MongoDBの勉強会やDSIRNLPといった少し研究よりの勉強会にも参加しました。
Solr勉強会に参加してきた経験もあり、他の勉強会にも気負わずに参加できたので本当にSolr勉強会には感謝しています。
おかげで、社外のいろいろな方と話ができ、様々な刺激をうけることが出来ました。&lt;/p&gt;
&lt;p&gt;勉強会以外にもTwitterで色々な方に絡みまくったのもまた社外の方とのつながりが出来るいい機会でした。
Twitter依存症じゃないかというくらい、つぶやいたり、人に絡んだりしてます。。。（迷惑だったら言ってください。）
お陰で@doryokujinさんや@wyukawaさんが主催してくれたログ解析の飲み会に誘ってもらえたり、@nobu_kさんや@
IjokarumawakさんにSolr勉強会で講演してもらえたりしました。
あと、Twitterを通じて勉強会やHadoop関連の情報、lucene-gosenへのフィードバックなどももらえていてかなり助かってます。
@yusukeyさんや@repeatedlyさんに遊んでもらってるのも楽しいですｗ&lt;/p&gt;
&lt;p&gt;最後の大きな変化はApple製品の購入でした。
これまでもブログで書いてきましたが、私は今年の中頃までアンチApple派でした。
それがここ半年足らずでAir、Mini、iPadと3つのApple製品に囲まれています。
Emacsのショートカットが使えるのが最大の要因ですが、何ごとも毛嫌いせずためしてみるのがいいなと思いましたね。
今では、Windowsで開発したくないくらいになってきています。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;2012年の抱負&lt;/em&gt;&lt;/strong&gt;
さて、来年の抱負です。
今年いくつかチャレンジしようとして挫折してるものがあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MongoDB触ってみる&lt;/li&gt;
&lt;li&gt;Scala触ってみる&lt;/li&gt;
&lt;li&gt;なんかWebサービス作ってみる（Amazonとかで）&lt;/li&gt;
&lt;li&gt;elasticsearch、IndexTankを調べてみる&lt;/li&gt;
&lt;li&gt;NewSolrCloudDesignを読み込んで自分なりにまとめる&lt;/li&gt;
&lt;li&gt;Junsaiに参加する&lt;/li&gt;
&lt;li&gt;「7つの言語7つの世界」の続き&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最初の3つはセットですかね。コップ本買ったり、NoSQLの本を買ったりしてるのですが、手付かずです。。。
電子書籍の検索サービスでもつくってみようと思いつつ、腰が重い状態です。
来年は余裕を見ながらちょっとずつやりたいですね。&lt;/p&gt;
&lt;p&gt;elasticsearchやIndexTankは仕事がらみです。
Solr入門を書いたこともあり、検索関連には興味があります。Solrだけでも2ヶ月おきに新バージョンがリリースされたり、4.0系でいろんな機能が実装されているのですが、それ以外にもOSSの検索サーバがいくつかあります。
気になってはいるものの英語が障壁でなかなか手を出して来ませんでした。
来年はSolr以外についてももう少し知識をつけていきたいです。
個人的ですが、分散処理にも少々興味を持っています。
慣れ親しんでいるSolrでもSolrCloudという壮大な計画が上がっていて、少しずつ実装もされています。
ブログでWikiページを翻訳してもみたのですが、翻訳に注力しすぎて理解ができていないです。
このあたりをもう少し理解しつつどのような実装がされているかも調べたいところです。&lt;/p&gt;
&lt;p&gt;JunsaiはSolr入門の著者である武田さんが最新のMeCab（今はMeCabが新しくなってしまったので、少し前のMeCabになってしまいました）をJavaに移植したプロジェクトです。
今年頭のSolr勉強会でお披露目があり、私も一応参画しているのですが、手が出せていない状態です。
lucene-gosenで少しは経験を積んできたので、その部分を生かしつつ、こちらももっと活性化させたいところです。
最後は夏ごろにやっていた「7つの言語7つの世界」の再開です。序盤で止まってしまっています。。。
新しい技術に触れる題材としてちょうどよいので、余裕をつくって続きを再開します。
なんか、抱負と言うよりも積み残しですね。。。
他にもTwitterで情報を仕入れるとやりたいことも変わってくるかもしれませんが、それも含めてブログに少しずつでも書きためていこうと思います。&lt;/p&gt;
&lt;p&gt;先ほども書きましたが、今年はTwitterを通じて色々な方たちと知り合いになれた一年でした。
ここには書ききれていませんが、フォローしてもらっている方々や勝手に絡んでも相手をしてくれている方々に感謝しています。
今後も絡みますのでよろしくお願いしますｗ
あと、様々な勉強会に今後も顔を出していくので、かまってやってください。
いやぁ、色々書いたけど恥ずかしいですね。。。
まぁ、何事も経験なので、恥ずかしいと思いつつ今後も色々書いていきます。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第2.1回 Twitter API 勉強会 @東京に参加しました。(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/12/22/%E7%AC%AC2-1%E5%9B%9E-twitter-api-%E5%8B%89%E5%BC%B7%E4%BC%9A--%E6%9D%B1%E4%BA%AC%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Thu, 22 Dec 2011 01:41:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/12/22/%E7%AC%AC2-1%E5%9B%9E-twitter-api-%E5%8B%89%E5%BC%B7%E4%BC%9A--%E6%9D%B1%E4%BA%AC%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;@yusukeyさんにサインをもらう目的で勉強会に参加してきました。前回もらいそびれたのでｗ
残念ながら、まだTwitter APIを触ってないし、利用したサービスも思いついてないんですが。。。
けど、勉強になりました。
といことで、いつものごとく、自分メモです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;@yusukeyさんにサインをもらう目的で勉強会に参加してきました。前回もらいそびれたのでｗ
残念ながら、まだTwitter APIを触ってないし、利用したサービスも思いついてないんですが。。。
けど、勉強になりました。
といことで、いつものごとく、自分メモです。&lt;/p&gt;
&lt;p&gt;◎APIの基本と最新動向について @yusukey
　資料：&lt;a href=&#34;http://www.slideshare.net/yusukey/21twitter-api-api?PHPSESSID=e79359141a811977c01f64da4592dc44&#34;&gt;http://www.slideshare.net/yusukey/21twitter-api-api&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　・検索APIについて
　　http://search.twitter.com/search.json?q=***
　　%3Aは「:」
　　詳しくはリファレンスを買ってね。

　・ページ処理のベストプラクティス
　　Pageじゃなくて、MaxIdを利用して取得すると１５００件以上のデータも取れるよ。
　・最近のTwitterAPIアップデートについて
　　- ポケリファでの変更点
　　　ストリーミングのエンドポイントがSSLのみに。（twitter4jは2.2.5以上）

　　- ユーザ名が検索APIのスキーマに追加（１２月以降）
　　- in_reply_toの追加（１２月以降）
　　　=&amp;gt;検索結果から会話を追える。
　・include_entitiesが追加
　　t.coの展開したリンクも取得可能。
　　けど、t.coリンクの飛び先はt.coリンクにしてね。パトロールとかしてるから。

　・本当にあった怖いt.co
　　- URLのつもりじゃないのにリンクになる。
　　→仕様です
　　- 日本語を含むURLがおかしくなる。
　　→少しずつ治ってきてる。
　　- リンク先のURLがわからない（クライアント依存）
　そのたいろいろ？
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;◎Zusaarについて何か @knj77
　資料：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　・特徴
　　- SNSアカウントでログイン
　　　トラブル抑制など
　　- 事前決済可能。最小催行人数が決められて、払い戻しも可能。
　・利用例
　　旅行とか合宿に使う例がないんだけど、できるんじゃないかな？
　・イベントを依頼する機能
　　欲しいイベントを提案可能
　　http://www.zusaar.com/idea/
　・アーキテクチャ
　　GAE/Java、Twitter4j、Yahoo APIのテキスト解析

　・SNS連携
　　TwitterのDMが送れない。他のSNSのアカウントが主催者とか。
　　なので、自分からDMが届く。

　・PayPal連携
　　小さいアプリほど相性がいい
　　固定費ゼロ、マイクロペイメント（１００円とか可能）
　　銀行口座の登録不要、返金可能。部分返金も可能。

　・トラブル
　　- SNS側のエラーが適当
　　　ステータスコードは信用できないｗ
　　- PayPalの実装を３回変更
　　- GAE料金体系の変更
　　　9$/month。追加料金はほとんど使ってない。Googleのアナウンスが下手。
　　- ブルーオーシャンのはずが...

　Q：Zusaarで返金できるポイントは？
　A：主催者が主導（手動？）で返金可能。
　Q：無料イベントで約束手形的に課金するのはできる？
　A：やろうと思えば出来ます。ただ、システム的には１００円は手数料としてもらっている。
　Q：新しいATNDに対抗意識はありますか？
　A：ZusaarはCtoCをターゲットにしてる。ATNDはBtoCなので、補完できる関係だと思ってる。
　Q：APIでTwitterIDとかで検索したいんですが。
　A：対応予定あります。
　Q：できればATNDのAPIと共通化してほしい。
　A：追加してるだけのつもりです。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;◎グループに分かれて自己紹介
　6人中、懇親会参加者が5人もいたｗ&lt;/p&gt;
&lt;p&gt;◎LT
　- OAuth Echoについて@tkawa
　　資料：&lt;a href=&#34;http://www.slideshare.net/tkawa1/oauth-echo-20111221-10657954&#34;&gt;http://www.slideshare.net/tkawa1/oauth-echo-20111221-10657954&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　　　twitpicで使ってる。
　　　認証をServiceProviderに委譲する仕組み。
　　　クライアントがOAuth登録してあれば、。。。
　　・問題点
　　　非公式仕様
　　　OAuth1.0に基づいてて2.0では変わってそう。
　　・Railsで実装してみたよ。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;　- GroovyとQuartzとTwitter4Jの甘い生活G @mike_neck
　　資料：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　　ベトナムから緊急来日らしい。
　　しかもむちゃぶりされたらしい。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;　- 認証なしで使えるAPIまとめ？@ts_3156
　　&lt;a href=&#34;http://www.egotter.com/&#34;&gt;えごったー&lt;/a&gt;の作者で学生！&lt;/p&gt;
&lt;p&gt;　- TDD (Twitter4J Driven Development) @sue445
　　資料：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　　AZusaarの作者！
　　テストドリブンなはなし。
　　Twitter4Jを利用するときのTDDの簡単に実装できる仕組みの話。
　　ここにソースがあるのかな？
　　http:/github.com/sue445/twtrhack/
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　- 放射線を自動計測してTwitterにつぶやくimaocandeの紹介 @imaoca
　　松山の方。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;とまぁ、APIの話だけでなく、実際にAPIを利用している方のサービスの話など色々と面白い話が聞けました。
厚かましくも懇親会にも参加して、そこでも今までのイベントとは違うクラスタの方たちの話が聞けたのが楽しかったです。
やはり、APIを利用して色々とやってみようと思っている方が多かったのでいつもと違う話が聞けたんですかね。
私自身はサービスを思いついたりしないタイプなので、いい刺激になりました。（まだ、特になにか作る気にはなってないですがｗ）
ということで、次回も余力があれば参加したいなー。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>1.2.1リリースしました(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/12/21/1-2-1%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Wed, 21 Dec 2011 12:15:39 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/12/21/1-2-1%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;lucene-gosenの最新版（1.2.1）をリリースしました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://code.google.com/p/lucene-gosen/&#34;&gt;プロジェクトページ&lt;/a&gt;よりダウンロードが可能です。&lt;/p&gt;
&lt;p&gt;今回の修正では、特定文字列でメモリの使用量が爆発してしまうバグへの対処となっています。
1.2.1以前のバージョンを利用している場合は最新版を利用するようにしてください。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;lucene-gosenの最新版（1.2.1）をリリースしました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://code.google.com/p/lucene-gosen/&#34;&gt;プロジェクトページ&lt;/a&gt;よりダウンロードが可能です。&lt;/p&gt;
&lt;p&gt;今回の修正では、特定文字列でメモリの使用量が爆発してしまうバグへの対処となっています。
1.2.1以前のバージョンを利用している場合は最新版を利用するようにしてください。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Solr勉強会第７回に参加しました。（発表もしました）(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/12/20/solr%E5%8B%89%E5%BC%B7%E4%BC%9A%E7%AC%AC%EF%BC%97%E5%9B%9E%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E7%99%BA%E8%A1%A8%E3%82%82%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Tue, 20 Dec 2011 01:21:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/12/20/solr%E5%8B%89%E5%BC%B7%E4%BC%9A%E7%AC%AC%EF%BC%97%E5%9B%9E%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E7%99%BA%E8%A1%A8%E3%82%82%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;いつものようにSolr勉強会に参加してきました。
皆勤賞を継続中です。（暇人というはなしも。。。）
今回は話しを聞きたいですねぇといったら、いやいや、話もしてくださいと言われてしまったので、
発表もしてきました。
発表資料はブログの最後に掲載してあります。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;いつものようにSolr勉強会に参加してきました。
皆勤賞を継続中です。（暇人というはなしも。。。）
今回は話しを聞きたいですねぇといったら、いやいや、話もしてくださいと言われてしまったので、
発表もしてきました。
発表資料はブログの最後に掲載してあります。&lt;/p&gt;
&lt;p&gt;日時：2011/12/19(月) 19:00～21:00
場所：Voyage Group 8階&lt;/p&gt;
&lt;p&gt;1.Fessについて N2SM菅谷さん
　資料：&lt;a href=&#34;http://www.slideshare.net/shinsuke/solr-fess&#34;&gt;http://www.slideshare.net/shinsuke/solr-fess&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　マルチコアで構成されてる。
　S2Robotでクロールしてますよ。
　※ごめんなさい、あまり聞けなかった。。。あとで資料を読んで質問します！
2.lucene-gosenについて @johtani
　発表しました。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;3.ApacheConに参加しました @Ijokarumawak
　資料：&lt;a href=&#34;http://www.slideshare.net/KojiKawamura/apache-con-2011report&#34;&gt;http://www.slideshare.net/KojiKawamura/apache-con-2011report&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　日本-&amp;gt;カナダ-&amp;gt;ベルリン-&amp;gt;カナダ-&amp;gt;日本
　50万円。。。
　キーノート１：
　　セキュアな開発について。
　キーノート２：
　　Hortonworksのコミュニティ運営大変だよねぇ、頑張るよという話。
　キーノート３：
　本題：Lucene 4.0の話：Simonさん
　　ヨーロッパの方？
　　PostingsFormatの話。
　　Document内部の情報を使うためにどうする？
　　　StoredField：あんまり効率よくないね。
　　　FieldCache（on RAM）：インデックス作る動作の逆を行う。これも効率よくないね。
　　　IndexDocValue：インデックス作成時に作られるので読み込み性能が１００倍！（DocValue）
　　Document Writer Per Thread！
　　Automaton Query
　　　あいまい検索の処理に利用。
　Solr Flair
　　Solr同梱
　Prism
　　LucidImaginationが出してるJRubyのラッパー
　　GitHubで公開されてるらしい。
　Blacklight
　　RoR
　　図書館むけのパッケージじゃなかったっけ？
　VUFind
　　PHP
　　これも図書館向け？
　TwigKit
　　JSPのタグリブ
　　おぉ。これ直接読んでるのかな？
　Ajax Solr
　　Ajax用

　QA
　　Q：TwigKit、Ajax Solrは直接Solrを呼んでるんですかね？
　　A：たぶん、そうですね。JSPのはSolrJかもしれないですが。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;4.サフィックスアレイの話 @nobu_k
資料：&lt;a href=&#34;http://www.slideshare.net/nobu_k/suffix-arraysolr&#34;&gt;http://www.slideshare.net/nobu_k/suffix-arraysolr&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　Suffix Arrayの話
　全文検索インデックスの話。
　Suffix Array＝検索漏れがない。
　Suffix＝接尾辞
　RedBullがどの文書に入っているか！
　SuffixArrayのメリット
　　検索漏れがない＝n-gramと同様
　　仕組み上n-gramよりも早くなるケースが多い。
　　長いクエリに対して速い
　　　THIS IS IT：全部ストップワード
　SuffixArrayのデメリット
　　インデックス構築系
　　　アルゴリズムが難しい。
　　メモリ上での構築はちょっとだけ楽（けど、簡単ではない）
　　　SAISなど。けど、これだとメモリがいっぱいないとキツイ
　　HDDでの構築
　　　ランダムアクセスを排除したアルゴリズムが必要（dc3,dc7）
　　インデックス更新、差分更新できない。
　　　頑張って１台100GB/day
　　Sedueでは？
　　　SA＆インメモリn-gramのハイブリッド
　　　更新分はn-gramに
　　　検索時にはn-gram＋SAの内容をマージして出力
　　検索
　　　二分探索はHDDとは相性が悪い。
　　　　メモリ上で検索できればOKだけど、サイズが大きいからきびしい。
　　　　圧縮接尾辞配列なら可能だけど、低速。。。
　　　SSDだとはやいよ！
　　　　SSD対応のクラウドはまだないけど。。。
　　　Sedueでは最初の２０段でキャッシュしてる。
　VSストップワード
　　ストップワード込でインデックス作るみたい。
　　1.SAを二分探索
　　2.該当区間から出現位置をロード
　　3.出現位置をソート
　　　O(n)だけど、CPUのキャッシュミスが激しく影響
　　4.ソートした出現位置からヒット文書を求める。
　　　同じくキャッシュミスがやばい
　　・実際にはmallocした領域のページフォルトが一番やばい
　SAが超活躍する場面
　　遺伝子の検索
　　　n-gramとか死ぬ。形態素解析も無理。区切りがわからんｗ
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;5.P2P検索 ORBIS @ceeflyer
資料：&lt;a href=&#34;http://www.slideshare.net/ceeflyer/p2p-search-engine-orbis&#34;&gt;http://www.slideshare.net/ceeflyer/p2p-search-engine-orbis&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;　ORBISとは？ラテン語で「目」
　ORBISとは？
　　リアルタイム検索エンジン
　　自律分散検索エンジン
　もともとはAmebaなうの検索のため
　ノード構成
　　比較的小規模（～１０００台）&amp;lt;=しょ、小規模ですか。すごいな。
　　Master-Slaveの差がなし
　　MessagePack利用
　　フルメッシュネットワークを構築
　インデックス
　　フィールド：
　　　Content（形態素解析対象）
　　　Appendix（形態素解析しない）
　　　Flag（属性）
　　ハッシュレプリケーションで登録。近いハッシュ値に登録（レプリカ数を指定できるのかな？）
　単語に対して転置インデックスを一定数で固定
　　投稿日時が新しいものだけ検索するため。
　検索：
　　マージして結果を返す。
　　壊れてたら取れたものだけ返す。

　QA：
　　Q：ハッシュ値が大きくて１台しか選ばれないとかあるのでは？
　　A：ハッシュ値は循環しているという形で３台とか選ぶ。
　　Q：最大何台で稼働させてる？
　　A：現在はまだ５台程度
　　Q：障害時にレプリケーションの維持はするのか？
　　A：現時点はしてない。
　　Q；Cassandra、Lucendraとかあるけど、それをしなかった理由は？
　　A：単純にConfigurationができるから、１から作った。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;今回はSolr以外の話も聞けたのがとても面白かったです。
やはり、Solr以外の検索エンジンについても知見があると、色々と比較の話しとかしやすいので。
それにしても、一からP2Pの検索エンジンを作っているのにはびっくりしました。
他にもSuffixArray（Sedue）の話も気になっていたのが少し氷解したし、海外旅行のノウハウがApacheConの話で聞けたしｗ
やはり、発表をすると話しをしてもらえるのもあって、いい機会だなと再認識しました。
今回も紹介ネタだったので、ちゃんと事例とか測定したものも発表できるようにならねばと。。。&lt;/p&gt;
&lt;p&gt;ということで、私の発表資料はこちらになります。疑問点とか質問事項とか、指摘事項など、コメントorTwitterで連絡いただけるとすごく嬉しいです。&lt;/p&gt;
&lt;div style=&#34;width:425px&#34; id=&#34;__ss_10635521&#34;&gt; &lt;strong style=&#34;display:block;margin:12px 0 4px&#34;&gt;[Lucene gosenの紹介 solr勉強会第7回](http://www.slideshare.net/JunOhtani/lucene-gosen-solr7)** &lt;iframe src=&#34;http://www.slideshare.net/slideshow/embed_code/10635521&#34; width=&#34;425&#34; height=&#34;355&#34; frameborder=&#34;0&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34; scrolling=&#34;no&#34;&gt;&lt;/iframe&gt; &lt;div style=&#34;padding:5px 0 12px&#34;&gt; View more [presentations](http://www.slideshare.net/) from [Jun Ohtani](http://www.slideshare.net/JunOhtani) &lt;/div&gt; &lt;/div&gt;
</content:encoded>
    </item>
    
    <item>
      <title>第2回 データ構造と情報検索と言語処理勉強会に参加しました(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/12/11/%E7%AC%AC2%E5%9B%9E-%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0%E3%81%A8%E6%83%85%E5%A0%B1%E6%A4%9C%E7%B4%A2%E3%81%A8%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86%E5%8B%89%E5%BC%B7%E4%BC%9A%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Sun, 11 Dec 2011 00:04:35 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/12/11/%E7%AC%AC2%E5%9B%9E-%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0%E3%81%A8%E6%83%85%E5%A0%B1%E6%A4%9C%E7%B4%A2%E3%81%A8%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86%E5%8B%89%E5%BC%B7%E4%BC%9A%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;ということで、懲りずに&lt;a href=&#34;http://partake.in/events/92c72f87-6717-43ee-a358-413d63badf57&#34;&gt;#DSIRNLP&lt;/a&gt;に参加してきました。
基礎的な部分をおろそかにしたくないけど、TokyoNLPとかWebMiningではついていけないので。。。
今回もしがみつくのが精一杯かもしれないと思いつつ、聞いて来ました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ということで、懲りずに&lt;a href=&#34;http://partake.in/events/92c72f87-6717-43ee-a358-413d63badf57&#34;&gt;#DSIRNLP&lt;/a&gt;に参加してきました。
基礎的な部分をおろそかにしたくないけど、TokyoNLPとかWebMiningではついていけないので。。。
今回もしがみつくのが精一杯かもしれないと思いつつ、聞いて来ました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
0. DSIRNLPについて　@overlast
　講演者が可能なら実装に関して言及する。
　「こうやって作って結果を出す」系の発表をしましょう。
　開催に際して協力してくださったみなさんへの感謝の辞。

1.自然言語処理はじめました　@phyllo
　資料：http://www.slideshare.net/phyllo/ngram-10539181
　ブログ：http://d.hatena.ne.jp/jetbead/20111210/1323499634
　某Web企業の新入社員！（すごい）
　で、入って自然言語処理をはじめたらしい。
　N-Gramの説明

　Perl？
　　1.ナイーブな方法
　　　Perlでハッシュ使って数えてみたよ。これでOK？
　　　いやいや、Nが大きくなったりデータが大きくなるとキツイでしょ
　　2.SuffixArrayを使う
　　　ということで、Suffix Arrayを使ってみた。
　　　SuffixArrayのデータを作ってから、上からN文字数えれば数えられる！
　　　（数式出てきたけど目も取れなかったｗ）
　　　これでいいじゃん？いやいや、更に大規模だとどーすんの。1TBのメモリ
　　3.近似カウント法
　　　いくつかある中からLossy Countingを説明します。
　　　ストリームデータから数えてみよう。
　　　C++の実装？
　　4.分散処理を使う方法
　　　近似じゃダメ！正確な頻度が欲しい！
　　　＝＞Hadoopつかえ！
　色々やってみた感想が良かった。

　SuffixArrayのメモリ使用量という話がありましたが、ディスクを使う方法もあります。 by ?

　新人から自然言語やり始めたというが、自分が新人の頃にはこんなに出来なかった気がするなぁ。
　発表とかもってのほかだったし。

2.AI で AI 創ってみた（LT）　@uchumik
　資料：
　Luaプログラミングが出てきたので、
　多クラスロジスティック回帰とListNetを書いて見ました。（ただし、本は読んでないよ。）
　学習器のお話。
　ラグナロクオンラインのAIがLuaでかけることを思い出した。
　動画の途中で終了ｗ
　GitHubにあげなさい。ブログ書きなさい。動画もあげなさい。 by @overlast

　資料の割に時間がｗ　

2.5.CMコーナー
　技評の方からWEB+DBのCM！（ただし、商品なし）
　読者層の95%が男性ｗ
　総集編買ってね！WEB+DB plusシリーズも買ってね！
　書いてor買ってね。

　技評さんつぎはオライリーさんに負けないように賞品持ってきてねｗ

3.Mahout にパッチを送ってみた　@issay
　資料：http://www.slideshare.net/issaymk2/mahout-10539755
　人がやめていく会社で検索やHadoopやってます。
　※今日は皆既月食です。
　機械学習関連
　SGDはMapReduceでの分散に対応していないので、パッチを送ってみた。
　MapReduce、Shuffleなどの説明
　これをベースにナイーブベイズの説明をあわせて実装を見てみる。
　　・単語ｗのカテゴリｃにおける確率
　　・文書ｄのカテゴリｃにおける確率
　　　-文書ｄに出てくる単語ｗの確率の積と定義
　　単語の相関を見ない。
　　ゼロ頻度問題の解説
　　文書頻度の逆数（IDF）
　　カテゴリ毎の文書数のばらつきに対応するために、Complement Naive Bayes
　　BayesFeatureDriver
　次はランダムフォレスト
　　決定木とは？
　　ランダムフォレストとは？
　　ここでは素性。
　　Mahoutでの実装は？
　　　決定木の数だけ処理分散が可能。
　　　Reducerは使ってない。＝Mapperで計算が終わっちゃうから？
　次はロジスティクス回帰
　　尤度関数、損失関数、確率的勾配降下法（SGD）
　　先程まではオンライン。バッチ学習もある。
　　Mahoutでの実装はオンラインで、MapReduceに向いてない！
　　Adaptive Logistic Regrettion（アダプティブロジスティクス回帰）というのも実装されてる。
　送ったパッチの概要
　　Iterative Parameter Mixisngというのがあるので、それをSGDに適用するパッチ
　今後
　　MapReduce以外も増えるかも。
　
　Q:パッチがはいったバージョンはいつでる？A:3日前に送ったのでまだです
　Q:ナイーブベイズのMapReduceが一段ムダでは？（文書数のカウントは同時に出来るよね）A:そうですね、ぜひパッチを送ってみてください。
　Q:Mahout、Hadoopの未来は明るいんでしょうか？A:HDFSのデータをMapReduce以外のフレームワークで使えるといい。
　Q:Hadoopのパッチ送るの大変ですか？どのくらいかかりました？A:4,5ヶ月かかりました。

　すみません、途中から頭がパンクしてしまいました。。。
　ただ、MahoutがHadoopに乗っかってるからといって、MapReduce活用できてるわけじゃないという話がわかりました。


4.GraphDBのデータ構造　@kimuras
　資料：http://www.slideshare.net/skimura/graphdatabase-data-structure
　LTみたいな資料にになっちゃいました。すみません。
　mixiではMySQLだけど、いろんなDB触ってます。
　なので、GraphDBに興味持ちました。
　Luceneを教科書的に読んでます。
　Neo4jモダンな作りでよかった。　　http://www.slideshare.net/skimura/ss-8787632
　ノードデータの構造
　　NodeManagerというのがいて、Cache系を管理してる。
　　プロパティのインデックス、トランザクションManagerもいて、PersistenceManager
　　ここからNodeにアクセス（探索、）。
　キャッシュとかいいね。
　Soft LRU Cacheってのもあるよ。
　その他色々ｗ

　Q:トランザクション周りでLRUのキャッシュはどうなるんでしょうか@kumagi A:きちんとロックしてました。
　Q:分散はネットワーク、HDDどちらがキツイ？A:HDDがかなりきつい
　Q:プロパティもキャッシュに乗ってたほうがいい？A:プロパティも必要なら載せたほうがいい。メモリのしてはできたはず。

　Luceneがほめられてました。Neo４Jの

5.冬のLock-free祭り　@kumagi
　資料：https://docs.google.com/viewer?a=v&amp;amp;pid=explorer&amp;amp;chrome=true&amp;amp;srcid=0B72X9w6tG5q0NzMyODgwNDYtNjY4Yy00ZDgwLTliZDMtMjQwYmViMWE5NGU5&amp;amp;hl=en_US
　※資料がうまく見れないのは、アニメーションガチガチって話だからかな？
　http://twitter.com/#!/kumagi/status/145363169718697984

　辻Lock-free活動してます。
　　Lock-freeとツイートすると補足されるらしい。
　CPUの系譜のおさらい
　　ポラックの系譜
　　最新のIntelManyCoreとか東大とかに配られてるらしい。
　なんで、マルチコアのCPUがTSUKUMOとかで売ってないの？
　　僕らが使いこなせてないから。＝マルチスレッドの対応がうまくできてないから。
　CAS＝Compare And Swap
　まずは、Lock-free stack
　　ABA問題？
　Lock-free Queue
　　QueueのEnqueueの場合は2回のCASが必要になる。
　　不変条件を守る。ロックだと守りやすい。
　　2回のCAS処理の間が危険領域
　Lock-free List
　　色々なロックの説明。
　Lock-free hash map
　　これも気が狂ってるアルゴリズム？
　　ConcurrentHashMapなども話が出てきたが、説明しない＝Lock-freeじゃないからｗ
　Lock-free SkipList
　　SkipList：
　　　順序関係のあるデータをO(log n)で検索・挿入・削除ができるデータ構造（2分木ともろかぶり）
　　DougLea先生がjava.util.concurrentに入っています。
　Lock-free Btree
　　論文ないんですよ。簡単すぎて。
　SoftwareTransactionalMemory
　The Art of Multiprocessor Programmingを読みましょう！
　論文のお話。
　　http://labs.gree.jp/Top/OpenSource/Flare.html
　　を利用しているらしい。
　The Art of Multiprocessor Programming関連サイト
　http://www.cs.brown.edu/courses/cs176/lectures.shtml
　
　すごくわかりやすかった。資料をもっと見たいなぁ。
　Q:STMはメモリ使用量が2倍になる？A:
　Q:STM（Clojure）使ってみたけど残念な性能しか出なかったけど、なんで？A:Clojureのものはロックベース。でうーむ。。。

6.機械学習と最適化の基礎（仮）　@tkng
　PFIの徳永さん
　日本語入力を支える技術（技評）2012年2月発売予定
　最適化の話、機械学習の話、学習率の話。
　大域的最適、局所的最適の説明。（言いにくそう、大域的最適ｗ）
　凸最適化問題＝最適解が1つしかない？
　　大域的最適解＝局所的最適解
　機械学習なはなし。
　スパムメールの例で説明

　淡々と語られてましたが、わかりやすい説明でした。もっと昔にこんな形で数学の説明聞きたかった。。。
　
7.機械学習・言語処理技術を用いた誤り検出・訂正（LT）　@mamoruk
　資料：
　スペル誤り訂正とかに機械学習とか使われてます。

8.神の言語による自然言語処理（LT）　@AntiBayes
　資料：http://www.slideshare.net/AntiBayesian/ss-10539347#
　Lispさいこー
　Clojureさいこー
　lucene-gosenもいいよーｗ

9.言語判定へのいざない（LT）　@shuyo
　資料：
　Solrで採用されたlanguage-detection libraryの紹介。
　アゼルバイジャン語とか大変みたい。

12.作ろう！簡潔ビットベクトル　@echizen_tm
　資料：http://www.scribd.com/doc/73565169/Lets-Impl-Sbv
　入門編：
　　簡潔データ構造
　　　データサイズをほぼ情報量的下限にまで小さくしたデータ構造
　　　データは小さいし、速度速いというのがこれ。
　　実用化されてる。
　　　mozc（LOUDSが使われてます）
　　　Sedue（圧縮接尾辞配列（デフォルトではなくなった by @tkng））
　　種類：
　　　ビット列：ここの説明がこのあと
　　　木構造：トライ木をLOUDSが結構で実装するケースが多い。データサイズが小さくなる
　　　文字列：ウェーブレット木が有名。全文検索、転置インデックスにウェーブレット木を使う研究が多い。
　中級編
　　簡潔ビットベクトル：
　　rank(i)関数：i番目より前の立っているビットの数。
　　　疎なデータ列の効率的な実装に使える。検索結果が少ない場合のFacetとかに使える？
　　select(i)関数：？
　　　可変長データ列の効率的な実装
　上級編
　　ダメでした。。。ごめんなさい。。。

　体力的に厳しかったです。。。けど面白いし、わかりやすい。どういった所でこれらを使うべきかを取捨選択するのがすこし難しそうです。Luceneとかの内部ソース見ると実はこのあたりで実装されてる部分があったりするのかも。

11.類似文字列検索の仕組み　@overlast
　資料：
　使い所のはなし
　　例：辞書メンテナンスコストを軽減したい
　　架空の事例から類似検索を適用できるというストーリー
　　既存データが活用されるうれしさの例？
　　Apporoのデータ構造とかの話かな？

11.5.審査委員長から賞品持って帰る人の発表
　@kumagi
　@tkng
　@echizen_tm
　の方たちでしたー

12.懇親会
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;いやぁ、前回も感じましたが、基礎ができてないなぁと実感できた勉強会です。
そして幅も広い。やはり、数学的な要素が時々出てくるのでその部分をもっと身につけないといけないなぁと。。。
ついていけなかったところも多々ありましたが、頭の中にキーワードが入ってればなんとかなるかなぁと。
Neo4jやLuceneのソースコードリーディングをやるのが仕事に役立ちそうなので、少しずつでもやろう。
これから懇親会なので、とりあえず、このへんで。
あとで、見返しながら、リンク貼り直したりすると思います。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>MBAセットアップ備忘録その５とMac Mini（2009late）セットアップとその他くだらない話(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/12/01/mba%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E5%82%99%E5%BF%98%E9%8C%B2%E3%81%9D%E3%81%AE%EF%BC%95%E3%81%A8mac-mini2009late%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%81%A8%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%8F%E3%81%A0%E3%82%89%E3%81%AA%E3%81%84%E8%A9%B1/</link>
      <pubDate>Thu, 01 Dec 2011 01:00:28 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/12/01/mba%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E5%82%99%E5%BF%98%E9%8C%B2%E3%81%9D%E3%81%AE%EF%BC%95%E3%81%A8mac-mini2009late%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%81%A8%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%8F%E3%81%A0%E3%82%89%E3%81%AA%E3%81%84%E8%A9%B1/</guid>
      <description>&lt;p&gt;ひさびさに、MBAのお話です。
セットアップといっても、物理的な方ですね。
&lt;a href=&#34;http://johtani.jugem.jp/?eid=34&#34;&gt;以前、ケース（カバー）について記載しました。&lt;/a&gt;
この記事にも書いてあったのですが、付属の滑り止めが簡易なシールで、カバンの中から出し入れすると剥がれるは、作業をしてるとずれるわで、悩んでいました。
今日、たまたま、東急ハンズに行くことがあったので、店員さんに相談してすべり止め対策のグッズを購入しました。
相談した所、カバーは傷がつきにくくなるような素材ですから、シールもつきにくいとのこと。（言われてみればそりゃそうか。）
対策としては紙ヤスリで傷つけたところに薄手のシールゴムをつければはがれにくくなりますよとのこと。
ということで、やってみました。まぁ、ゴムにホコリはつくかもしれませんが、今のところ滑らず快適！
いやぁ、ハンズの店員さんすごいですわ。
MBAについてはこんなとこです。最近また、出先に行っていてMBA使えないので、ブログを書くかメールにしか使ってないです。。。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ひさびさに、MBAのお話です。
セットアップといっても、物理的な方ですね。
&lt;a href=&#34;http://johtani.jugem.jp/?eid=34&#34;&gt;以前、ケース（カバー）について記載しました。&lt;/a&gt;
この記事にも書いてあったのですが、付属の滑り止めが簡易なシールで、カバンの中から出し入れすると剥がれるは、作業をしてるとずれるわで、悩んでいました。
今日、たまたま、東急ハンズに行くことがあったので、店員さんに相談してすべり止め対策のグッズを購入しました。
相談した所、カバーは傷がつきにくくなるような素材ですから、シールもつきにくいとのこと。（言われてみればそりゃそうか。）
対策としては紙ヤスリで傷つけたところに薄手のシールゴムをつければはがれにくくなりますよとのこと。
ということで、やってみました。まぁ、ゴムにホコリはつくかもしれませんが、今のところ滑らず快適！
いやぁ、ハンズの店員さんすごいですわ。
MBAについてはこんなとこです。最近また、出先に行っていてMBA使えないので、ブログを書くかメールにしか使ってないです。。。&lt;/p&gt;
&lt;p&gt;で、もう一つはMac Mini（2009 late：Core2Duo 2.26GHz、メモリ4G、HDD250G）です。
前職の同期から安く譲ってもらいました。音声が出力されないという問題点があるとFacebookでつぶやいているのをみて、興味を持ったらゲット出来ましたｗ
で、セットアップをしたのです。
大変でした。まずつまずいたのが、キーボードとマウスでした。
これまで使っていたデスクトップのキーボードがあるのですが、これがPS/2ということで使えません。（軽いジャブ）
MBAのキー配列にも慣れてきていたので、ビックカメラで悩みながらもApple純正のワイヤレスキーボードとまじっくトラックパッドを購入。
で、まずは、付属のLeopardで初期化。
このときは、ワイヤレスキーボードは認識したのですが、マジックトラックパッドはこの時代に無かったらしく、反応せず（さらに軽いジャブ）
さすがに前のPCのマウスはUSBだったので、これを利用してセットアップ再開
次にSnow Leopard（これもつけてくれた）にアップグレードして最後にLionです。
Snow Leopardでソフトウェアアップデートしたところでようやくトラックパッドが認識できたと。
で、やっと使い始めたのですが、MBA（2011）に慣れていたので、思いの外もっさりした動きをしているMacMiniに
戸惑ってます。（トドメのストレート。現在ここ）
ということで、どうやれば快適に使えるかアイデア募集中です。
とりあえず、Lionの設定のウィンドウ復元機能やアニメーションをオフにするなど対策してます。
HDDのSSD化とかメモリ増設とか考えないとダメかなぁ。
あと、ついでにBootcampも興味があるので、せっかくだから実験する予定です。
Windowsが前のデスクトップより快適に使えるようになるなら、Windowsマシンとするのもありかなぁと。。。&lt;/p&gt;
&lt;p&gt;セットアップ系はこのへんで。
あとは、最近興味が有ること2点です。（技術系ではありません）
1つ目は最近発売されたゼルダ。夜な夜なやってます。
もともとゲーム好きでゼルダも欠かさずやってきてますが、ゼルダらしさを残しつつ新しい要素やアクションも取り入れとなかなか楽しいです。
ただ、Wii全般に言えることですが難しい！まぁ、楽しんでますけどね
2つ目は前からつぶやいてるのですが、電子書籍を読むためのタブレットがすごく気になってます。
最初は財布に優しく、MBAを普段持ち歩いてるのもあるから、LenovoのA1（7インチ）で決まりだと思っていたのですが、技術書を読むのは少しキツイかもという印象。
どうしてもオライリー本などの大きめのサイズになるため、7インチの画面でPDFを表示したところ、字が小さくなってしまい拡大しないと見づらいのです。
ただ、拡大してしまうと今度はパッと見るという一覧性が下がってしまいます。。。
少々重くなってもいいので10インチにしたほうがいいのかな、けど、電車で立って読むの辛いかもなどなど考えているところで最終的な決断ができない次第です。。。
最初は毛嫌いしていたiPad2もいいかもと思う始末で困ってるとこです。
安い中華パッド（2万ちょっと）に手を出すか、7インチで我慢するか、Galaxy Tab 10.1のWifi版を輸入業者から購入するかと悩んでるところ。
ただ、長く使うのを考えると、OSのバージョンアップなどを保証してくれるiPad2が実はいいじゃないかなぁなど。
皆さんからしてみればくだらないなぁと思われるかもしれないけどずーっと悩んでつぶやいたりしております。
はぁ、こまった。（そもそもそんなにスペックいらないんじゃないかというのもあるからなぁ。メインはPDF読むことだから。）
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B002C1ARK8/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51z2q6C&amp;#43;X5L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B002C1ARK8/?tag=johtani-22&#34;&gt;
      ゼルダの伝説 スカイウォードソード (期間限定生産 スペシャルCD同梱)
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>「どんな本でも大量に読める「速読」の本」を読みました(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/11/29/%E3%81%A9%E3%82%93%E3%81%AA%E6%9C%AC%E3%81%A7%E3%82%82%E5%A4%A7%E9%87%8F%E3%81%AB%E8%AA%AD%E3%82%81%E3%82%8B%E9%80%9F%E8%AA%AD%E3%81%AE%E6%9C%AC%E3%82%92%E8%AA%AD%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Tue, 29 Nov 2011 13:57:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/11/29/%E3%81%A9%E3%82%93%E3%81%AA%E6%9C%AC%E3%81%A7%E3%82%82%E5%A4%A7%E9%87%8F%E3%81%AB%E8%AA%AD%E3%82%81%E3%82%8B%E9%80%9F%E8%AA%AD%E3%81%AE%E6%9C%AC%E3%82%92%E8%AA%AD%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4479793313/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51NGLvdEIHL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4479793313/?tag=johtani-22&#34;&gt;
      どんな本でも大量に読める「速読」の本
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

Twitterで知り合った方がこの本について書かれていた&lt;a href=&#34;http://www.metisous.com/2011/10/post-62&#34;&gt;ブログ記事&lt;/a&gt;を読んで興味を持ち、読みました。
書籍（特に技術書）が山になっていたこともあり、速読に興味を持っていたところちょうど記事を目にしたのは
きっと何かのタイミングなんだろうなと。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4479793313/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/51NGLvdEIHL._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/4479793313/?tag=johtani-22&#34;&gt;
      どんな本でも大量に読める「速読」の本
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

Twitterで知り合った方がこの本について書かれていた&lt;a href=&#34;http://www.metisous.com/2011/10/post-62&#34;&gt;ブログ記事&lt;/a&gt;を読んで興味を持ち、読みました。
書籍（特に技術書）が山になっていたこともあり、速読に興味を持っていたところちょうど記事を目にしたのは
きっと何かのタイミングなんだろうなと。&lt;/p&gt;
&lt;p&gt;悪い癖で、電車で読もうと本を常に持ち歩くのですが、ついついスマートフォンやゲームで遊んでしまい、今回も読むのに時間がかかってしまいました。
３章の途中までを今月頭に読んでいたのですが、そこから少しほったらかしで、読み終わったのが昨日でした。&lt;/p&gt;
&lt;p&gt;本の内容ですが、先ほどのブログにも書かれていますが、速読は技術ではない。
&lt;span style=&#34;color:#FF0000&#34;&gt;### 速読　＝　速読技術　X　ストック（知識、経験、情報）&lt;/span&gt;
であると。あとは、わからなくてもいいから、ざっと目を通す感じで繰り返し読みなさいと。
さらに、１回でわからんくてもいいから、とにかく繰り返し読むことが重要だということでした。&lt;/p&gt;
&lt;p&gt;確かに「速読＝１回で速く読む」、「読書＝１回で理解する」という意識がどこかにあったなぁと気付かされました。
プログラム組んだり、あることを覚えるときは繰り返しを意識してたのに、読書は１回読んで「はい、おしまい。」という気になってました。（マンガは繰り返し読むんですけどねぇ）&lt;/p&gt;
&lt;p&gt;他の速読の本は胡散臭いし、絶対無理だよなぁと思ってたのですが、この本に書かれている話は筋が通っているように感じました。
ただ、考えずにサラサラ読みなさいという部分の実践はなかなか難しいかな。どうしても頭の中で音読してしまうので。
私は間を開けてしまったせいで、時間がかかってしまいましたが普通なら１日あれば読める内容なので速読に関してちょっとと思ってる方は読んでみると面白いかと思います。&lt;/p&gt;
&lt;p&gt;ちょっとだけショックだったのは、この本の論理だと電子書籍は速読に向いていないというところです。
せっかく溜まった書籍をPDF化して、タブレット購入して（まだ買ってない。。。）読もうと思っていたところなのに。。。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Hadoopソースコードリーディング第7回に参加しました。(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/11/29/hadoop%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E7%AC%AC7%E5%9B%9E%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Tue, 29 Nov 2011 01:51:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/11/29/hadoop%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E7%AC%AC7%E5%9B%9E%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;Hadoopソースコードリーディング第7回に参加しました。
いつものごとく、自分用のメモをとっていたので。
第6回（2010/12）には参加してたのですが、あれからそういえば、話が無いなぁと思っていたところに
再開するという話がTwitterに流れてきたので、即申し込みしました。
思い返せば、Hadoopに興味をもって少し触っているところで参加したのだったなぁと感慨深い思いを思い出しました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Hadoopソースコードリーディング第7回に参加しました。
いつものごとく、自分用のメモをとっていたので。
第6回（2010/12）には参加してたのですが、あれからそういえば、話が無いなぁと思っていたところに
再開するという話がTwitterに流れてきたので、即申し込みしました。
思い返せば、Hadoopに興味をもって少し触っているところで参加したのだったなぁと感慨深い思いを思い出しました。&lt;/p&gt;
&lt;p&gt;今回は場所を変えて豊洲のNTTデータさんで開催されました。&lt;/p&gt;
&lt;p&gt;日時：2011/11/28（月）19:00～22:00
場所：豊洲センタービルアネックス NTTデータ&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
◎アジェンダ＋導入（NTTデータ 濱野さん）
　ちょっと間が空きましたが隔月で行う予定。
　2012/01/12くらいに次回を予定。ネタ募集中。

◎Hadoop World NYC 2011 参加レポート
　- NTTデータ 下垣 徹さん （Hadoop徹底入門著者の一人です！）
　　・イベント概要：2011/11/08～09にNYで開催
　　　スポンサー企業の数がどんどん大きくなってる。
　　・会場の様子
　　　最初のキーノートは立ち見が出るほど。
　　　個別に5並列でセッションが開催されてましたと。
　　・キーノート紹介
　　　1.Hadoop World（Michael Olson）
　　　　アンケートからの概観
　　　　HadoopはNext Generation DataCenterだそうで。
　　　2.JP Morgan（Larry Feinsmith）
　　　　コスト削減＋収入増加のためにHadoopつかうぞと。
　　　　BigData分析の戦略
　　　　ユースケース１：ETL（Extract/Transfer/Load）ツールとして
　　　　ユースケース２：共通データ基盤
　　　　　検索頻度が低いデータの低コストストレージなどなど。
　　　　ユースケース３：データマイニング
　　　　　異常値検出とか。
　　　3.eBay（E. Williams）
　　　　Cassini：オークション情報の検索エンジン
　　　　　柔軟な検索＋協力なランキング機能
　　　　Hadoopで転置インデックス作成＝Luceneは使ってるってことかな？
　　　　HBaseも利用。データはHBaseに登録してる。
　　　4.Informatica（James Markarian）
　　　　データとプロセス
　　　　Hadoopが賑わうからRDBMSも活気づく
　　　　Hadoopはプラットフォームになるよと
　　　5.Cloudera（Doug Cutting）
　　　　Hadoopの背景と今後について
　　　　BigDataを分散処理するためのカーネルになりつつあるよと。
　　　　Apacheプロジェクトの良さ
　　　　　類似するプロジェクトも共存させてるよと。
　　　　Hadoopの今とこれから（0.20（今）、0.23（将来））
　　　　0.23はHDFSの性能面改善、スケーラビリティの強化、HA
　　　　　　　MapReduce2.0
　　　　CDH4のはなし。
　　　　Hadoopコミュニティはまだまだ若い
　　・HadoopWorldの傾向
　　　HBaseの利用増加
　　　　利用理由？
　　　　　小さいレコードにも強い。
　　　　　ランダムアクセス
　　　大手ベンダ参加
　　　　Oracleすげー。Hadoopの周りを固めていくぞと。
　　　　Hadoopの周りを各社がどう固めていくかというはなし。
　　　事例が多い
　　　　WibiData：HBaseの利用事例。Fonedoctor
　　　　Walt Disney：Big Dataに対する機会損失があるから、導入するよと。
　　　　　　　　　　テーマパークの交通流解析にも使うぞ！
　　イケメンによる来年（2012年）のHadoop Worldの動向！？
　　　参加者3000人！
　　　ラスベガスで開催？
　　　スポンサー拡大で食事が美味しく！？
　　　全方位戦略vs.特化型
　　　BIツールベンダの巻き込み
　　　利用事例のアピール合戦
　　　HBaseの利用事例が続々！（Salesforce.comあたりがセッション持つんじゃね？）
　　　Hadoop対抗アプリケーション、業界特化型キラーアプリケーションがますます増える？
　　　Mahout事例の増加
　　　データマイニング＋Web勉強会
　- NTTデータ 政谷さんのHadoopNYでの発表のダイジェスト
　　まずは印象。深く使っている人は去年より減っている。バズワードになってるからかな？
　　今後もHadoopコミュニティは健全なコミュニティになりそう。（いろんな所が出てきたけど、大丈夫そうだなぁ）
　　・発表スライドのダイジェスト版
　　　日本でのHadoopの盛り上がりの話。
　　　Hadoopと他との住み分けの話。
　　　Sqoopのお話。PostgreSQLに向けたインテグレーションの話。これはPostしてコミット待ち。
　　　Low-Latency Serving Systemへの受け渡し（前処理はHadoopでGPGPU使ってデータをクラスタリングして処理速度をあげる）
　　　FujitsuのETERNUSにHDFS APIが用意されたという話。
　　　MapRの話に似ているよと。小さめのクラスタの場合に有効？セッションの後に少し話題になった。
　　　扇子を配りましたよと。

　※ビールが配られ始めた！（ビールじゃないという声もチラホラｗ）
◎『Hadoop Troubleshooting 101』 セッションレポート
　 - Cloudera 嶋内さん （@shiumachi）
　Hadoopを壊す7つの方法
　Hadoop設定したりしたことある人？＝結構いた。さすがソースコードリーディング
　Clouderaでは木曜日に重要なミーティング（ボードゲームするかFPSするか）というのがあるらしい。
　チケット分析
　　設定ミス？
　　　HadoopやOSの設定ファイルの変更を必要とするあらゆるチケットの事
　　　35%が該当
　　問題の原因別のグラフ
　　　1番は設定ミス
　　　2番はバグ（これはベータ版リリースからチケット管理してるから）
　　メモリの管理ミス
　　　Task Out Of Memory Error
　　　　io.sort.mb &amp;lt; mapred.child.java.optsとなるように設定すること
　　　　io.sort.mb = mapバッファのサイズ
　　　　mapperとreducerを減らす。
　　　　　mapper＝ノード上のコア数
　　　　　これは机にはっとけ！
　　　　　Total RAM = (Mappers + Reducers) * Child Task Heap + DN heap + 3GB + RS heap + ？
　　　JobTracker Out Of Memory Error
　　　　JTのメモリ使用量の合計　＞　割り当てRAM
　　　　原因は？
　　　　　タスクが小さすぎ
　　　　　jobヒストリが多すぎ
　　　　解決は？
　　　　　maximumを減らしなさい？
　　　Unable to Create New Native Thread
　　　　どういう意味？
　　　　　プロセスが起動中にもかかわらずDNが障害ノードとして表示されている。
　　　　原因は？
　　　　　nprocのデフォルト値が低すぎる
　　　　対応は？
　　　　　/etc/seurity/limits.confの値を考えろ
　　　Too Many Fetch-Failures
　　　　元スライドの発表者はこれが大好きらしい
　　　　どういう意味？
　　　　　Reducerのfetch操作がmapperの出力の取得に失敗
　　　　　ブラックリスト入りのTTで発生するらしい
　　　　原因は？
　　　　　DNSの問題
　　　　対応は？
　　　　　mapred.reduce.slowstart.completed.maps = 0.80
　　　　　　reducerの開始を遅らせることで対応
　　　　　tasktracker.http.threads = 80
　　　　　Jetty 6.1.26は使うな！CDH3u2に上げましょう。
　　　Not Able to Place Enough Replicas
　　　。。。きっとどっかにスライドあるからメモはこのへんでいいか。。。

◎Hadoop World NYC 2011 参加レポート
　- Acroquest Technology 阪本 雄一郎さん （@frutescens） 落合 雄介さん （@taro_x）
　・RとHadoopの融合（Revolution AnalyticsのDavid Champagneさん）
　　R言語の紹介
　　Rとの接続点（rmr、rhdfs、？）
　　R言語の利点がHadoopで使えるから、記述が少なくて済むよと。
　　統計処理がわからなくてもRが使えると分析ができるよ。（そう言われても、その分析で正しいのかとかは結局統計とかをある程度理解してないと厳しいんじゃないか？）

　・Hadoopを使った衛星画像解析
　　スケールとかしたいからHadoopにしたけど、ジョブ起動遅いし、科学計算ライブラリが不十分

　・Hadoopをクラウド上に展開（vmware）
　　Hadoopだけじゃなく、NoSQLとかもスケールしてから使いたいよねぇ。
　　ということで、vmwareの色々なものを使ってHadoopと他をうまく構築しますよ事例紹介。
　　マルチテナントのHadoopの話とかもありますよねと。

◎最後はHadoopには関係ないのが多かったけどおみやげ争奪戦。
　なぜか、MongoDBのシールをもらいました。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ということで、HadoopWorld2011の総括＋各スライドの紹介でした。
これまでのHadoopWorldの傾向などから、参加者などのトレンドがどうなっているかなどの話が聞けたのが面白かったです。
ClouderaのスライドはHadoopのトラブルシューティングとして必見になりそうな感じでした。
内容が濃くて、それほど触っていない私にはわからないところもチラホラ。（日本語資料の公開されるかなぁ？）
案の定、ビール（発泡酒）を飲んだので、途中から一部が飲み会状態になってたし、ピザ食べてたので、私のメモも途中から適当になってしまいました。
あとは、とある件についていろんなかたからの知見を入手できたのが良かったですね。
他にもLilyプロジェクト（Solrが利用されているOSSの話）の話もあったようなのですが（HPの方が教えてくれました）、今回の参加レポートでは含まれてなかったです。（話聞きたかったなぁ。余力があれば、スライド読むかなぁ。誰か発表してくれないかなぁ）
今日もまた、Twitterで絡んでいた方たち数人と面識が得られました。
今後は定期開催の流れになるようなので、これからもHadoopにしがみついていくためにも参加するようにがんばりますよと。&lt;/p&gt;
&lt;p&gt;会場提供のNTTデータのみなさん、発表者の皆さんお疲れ様でした。次回も期待してます！！&lt;/p&gt;
&lt;p&gt;2011/12/01追記
&lt;a href=&#34;http://togetter.com/li/221481&#34;&gt;Togetterのまとめ&lt;/a&gt;&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>「Apache Solr入門」のサンプルのlucene-gosen対応（1章から4章）(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/11/26/apache-solr%E5%85%A5%E9%96%80%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AElucene-gosen%E5%AF%BE%E5%BF%9C1%E7%AB%A0%E3%81%8B%E3%82%894%E7%AB%A0/</link>
      <pubDate>Sat, 26 Nov 2011 03:00:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/11/26/apache-solr%E5%85%A5%E9%96%80%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AElucene-gosen%E5%AF%BE%E5%BF%9C1%E7%AB%A0%E3%81%8B%E3%82%894%E7%AB%A0/</guid>
      <description>&lt;p&gt;先週末から勤労感謝の日まで風邪で寝こんでました。。。
みなさん、朝晩、冷え込みが激しいので風邪には気をつけてください。&lt;/p&gt;
&lt;p&gt;季節の言葉も入れたので本題です。
つい最近、「Apache Solr入門」のサンプルをlucene-gosenでどうやって動かすんですかー？という質問を受けました。
確かに、「Apache Solr入門」を書いたのはSolrのバージョンが1.4が出る直前でしたし、lucene-gosenは存在せず、
当時はSenを元にした日本語の形態素解析のサンプルとなっていました。
そのSenも入手しづらくなってきており、私もlucene-gosenのプロジェクトに携わるようになってきてある程度時間が
経ちました。
せっかくなので、サンプルのschema.xmlだけでも最新版（Solr 3.4 + lucene-gosen-1.2.0-ipadic）のものを用意しました。
なお、あくまでも、3.xでlucene-gosenを利用する場合の「Apache Solr入門」のサンプルプログラムの変更点（とりあえず、4章まで）の違いについて記述します。
申し訳ございませんが、1.4と3.xの違いについての説明はここでは行いません。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;先週末から勤労感謝の日まで風邪で寝こんでました。。。
みなさん、朝晩、冷え込みが激しいので風邪には気をつけてください。&lt;/p&gt;
&lt;p&gt;季節の言葉も入れたので本題です。
つい最近、「Apache Solr入門」のサンプルをlucene-gosenでどうやって動かすんですかー？という質問を受けました。
確かに、「Apache Solr入門」を書いたのはSolrのバージョンが1.4が出る直前でしたし、lucene-gosenは存在せず、
当時はSenを元にした日本語の形態素解析のサンプルとなっていました。
そのSenも入手しづらくなってきており、私もlucene-gosenのプロジェクトに携わるようになってきてある程度時間が
経ちました。
せっかくなので、サンプルのschema.xmlだけでも最新版（Solr 3.4 + lucene-gosen-1.2.0-ipadic）のものを用意しました。
なお、あくまでも、3.xでlucene-gosenを利用する場合の「Apache Solr入門」のサンプルプログラムの変更点（とりあえず、4章まで）の違いについて記述します。
申し訳ございませんが、1.4と3.xの違いについての説明はここでは行いません。&lt;/p&gt;
&lt;p&gt;以下では、各章でschema.xmlに関連する記載のある部分を抜粋して、変更点と変更したschema.xmlのリンクを用意しました。参考にしてもらえればと思います。&lt;/p&gt;
&lt;h2 id=&#34;1章&#34;&gt;1章&lt;/h2&gt;
&lt;h3 id=&#34;161-n-gram17ページ&#34;&gt;1.6.1 N-gram（17ページ）&lt;/h3&gt;
&lt;p&gt;1.6.1の手順に変更はありません。
サンプルプログラムが入っているZip「solrbook.zip」のintroduction/ngram/schema.xmlファイルの代わりに
&lt;a href=&#34;https://bitbucket.org/johtani/solrbook-lucene-gosen-3.x/raw/b51b74e8c573/introduction/ngram/schema.xml&#34;&gt;こちらのschema.xml&lt;/a&gt;を利用してください。&lt;/p&gt;
&lt;h3 id=&#34;162-形態素解析18ページ20ページ中盤まで&#34;&gt;1.6.2 形態素解析（18ページ～20ページ中盤まで）&lt;/h3&gt;
&lt;p&gt;手順が大きく変わります。
Senを利用する場合、Senの辞書のビルド、Senのjarファイルの配置、Senを利用するためのTokenizerクラスを含んだサンプルjarの配置という作業があります。
lucene-gosenではコンパイル済みの辞書がjarファイルに含まれています。
また、Solr向けのTokenizerもlucene-gosenのjarファイルに含まれています。
lucene-gosenを利用して形態素解析を体験するための手順は次の流れになります。
なお、schema.xmlについては上記N-gramでダウンロードしたschema.xmlに形態素解析の設定もあわせて記載してあります。&lt;/p&gt;
&lt;p&gt;jarファイル（&lt;a href=&#34;http://lucene-gosen.googlecode.com/files/lucene-gosen-1.2.0-ipadic.jar&#34;&gt;lucene-gosen-1.2.0-ipadic.jar&lt;/a&gt;）をダウンロードして、$SOLR/example/solr/lib（libディレクトリがない場合は作成）にコピーします。
コピーが終わりましたら、次のように$SOLR/exampleディレクトリでSolrを起動します。
（-Dsen.homeは必要なし）&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
$ java -jar start.jar
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;あとは、書籍の記述にしたがって管理画面のAnalysis画面で動作を確認します。
ほぼ、図1-6と同じ結果になっていると思います。
（lucene-gosenで出力される情報には本書のサンプルよりも多くの情報が含まれています。また、サンプルでは、形態素解析の後の単語に基本形を採用しているため、「な」が「だ」として出力されています。基本形を出力する場合は後述するこちらで紹介したTokenFilterを利用すれば可能です。）&lt;/p&gt;
&lt;h2 id=&#34;2章&#34;&gt;2章&lt;/h2&gt;
&lt;h3 id=&#34;213-schemaxmlのバージョン27ページ&#34;&gt;2.1.3 schema.xmlのバージョン（27ページ）&lt;/h3&gt;
&lt;p&gt;Solr3.xではschema.xmlのファイルの最新バージョンは&lt;strong&gt;1.4&lt;/strong&gt;になっています。&lt;/p&gt;
&lt;h3 id=&#34;223-代表的なトークナイザ35ページ&#34;&gt;2.2.3 代表的なトークナイザ（35ページ）&lt;/h3&gt;
&lt;p&gt;solrbook.analysis.SenTokenizerFactoryは必要ありません。
先ほども説明しましたが、lucene-gosenにはSolr向けのトークナイザが用意されています。
solr.JapaneseTokenizerFactoryがそれに該当します。&lt;/p&gt;
&lt;h3 id=&#34;224-代表的なトークンフィルタ37ページ&#34;&gt;2.2.4 代表的なトークンフィルタ（37ページ）&lt;/h3&gt;
&lt;p&gt;以下の2つについてはlucene-gosenに同等のトークンフィルタが存在します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;solrbook.analysis.KatakanaStemFilterFactory&lt;/li&gt;
&lt;li&gt;solrbook.analysis.POSFilterFactory&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;それぞれ、次のものがlucene-gosenにあるので、こちらを利用します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;solr.JapaneseKatakanaStemFilterFactory&lt;/li&gt;
&lt;li&gt;solr.JapanesePartOfSpeechStopFilterFactory&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2章向けの&lt;a href=&#34;https://bitbucket.org/johtani/solrbook-lucene-gosen-3.x/raw/b51b74e8c573/schema/schema.xml&#34;&gt;schema.xmlはこちら&lt;/a&gt;です。その他のtxtファイルについては、特に変更はありません。&lt;/p&gt;
&lt;p&gt;3,4章は特に変更はありません。Solrの起動の仕方にだけ注意してください。（-Dsen.homeは必要ありません）&lt;/p&gt;
&lt;p&gt;以上が4章までの修正点になります。
動作しないなどあれば、コメントください。
サンプルアプリについてはまた後日余裕があれば。。。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>MongoDB勉強会（第7回）に行って来ました。(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/11/16/mongodb%E5%8B%89%E5%BC%B7%E4%BC%9A%E7%AC%AC7%E5%9B%9E%E3%81%AB%E8%A1%8C%E3%81%A3%E3%81%A6%E6%9D%A5%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Wed, 16 Nov 2011 02:08:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/11/16/mongodb%E5%8B%89%E5%BC%B7%E4%BC%9A%E7%AC%AC7%E5%9B%9E%E3%81%AB%E8%A1%8C%E3%81%A3%E3%81%A6%E6%9D%A5%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;今回は、触ろうと思って触れていないMongoDBの勉強会に行って来ました。
2週連続の渋谷で、さすがに今回は出口をすんなりでれました。
今回は初のGMOさんのビルへの潜入です。
ということで、いつものごとく自分のメモを残しておきます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今回は、触ろうと思って触れていないMongoDBの勉強会に行って来ました。
2週連続の渋谷で、さすがに今回は出口をすんなりでれました。
今回は初のGMOさんのビルへの潜入です。
ということで、いつものごとく自分のメモを残しておきます。&lt;/p&gt;
&lt;p&gt;日時 :2011/11/15 14:30 to 20:00
定員 :140 人
会場 :GMO Yours （セルリアンタワー（11階））
ハッシュタグ :#mongotokyo&lt;/p&gt;
&lt;p&gt;1.fluentd plugins for MongoDB    &lt;a href=&#34;http://twitter.com/#!/doryokujin&#34;&gt;@doryokujin&lt;/a&gt;
&lt;a href=&#34;http://www.slideshare.net/doryokujin/an-introduction-to-fluent-mongodb-plugins&#34;&gt;スライドはこちら&lt;/a&gt;。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　FluentとMongoDBのコラボレーション
　・Fluentとは？
　　解析対象のログについて。データ量が膨大
　　これまでのログの扱い方。日次でS3に送信して、ログ解析サーバにて前日分を解析する。
　　これではリアルタイム性がないのが問題！しかも1日分なので、データ量が半端ない。
　　そこでFluentにてストリーミングアプローチ。
　　リレーサーバ（Fluentd）にログを流すと、適宜、解析サーバに流れていく仕組みが可能。
　　これにより、ネットワークに負荷をあまりかけずにログを定期的（時次とか）で流せる。
　　※splunkに近い考えかな。
　　ここで、Fluentのスライドで説明が入りました。http://www.scribd.com/doc/70897187/Fluent-event-collector-update
　・Out Mongo For Local Back-Up
　　MongoDBへの出力。
　　信頼性をあげるためにローカルにmongoDBを置いておき、スプールしておく。
　　リレーサーバにも配置してみるという仕組み。
　　バッファリングにMongoDBを使うので
　　Aggregation Mongoってのを作ったらしい。そのせいで、スライドの作成が遅れたらしいw
　・Aggregation Mongo
　　Map/Reduceの集約のようなプラグイン。
　　fluentdのアプリを通して、特定のキーをベースに集計してから、outputする仕組み。
　　更に、キーに対してshufleが行われて、次のfluentdにデータが集まる。　
　　fluentdを使ってM/Rっぽいことが可能なのかな。
　QA
　　最終的な流れ込み先のMongoDBはCappedCollectionじゃなくしたほうがいい。検索とかしたくなるから。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;2.about Server Density and MongoDB    &lt;a href=&#34;http://twitter.com/#!/davidmytton&#34;&gt;@davidmytton&lt;/a&gt;
&lt;a href=&#34;http://www.slideshare.net/boxedice/mongodb-tokyo-monitoring-and-queueing&#34;&gt;スライドはこちら&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　Queuingシステムで利用。
　MongoDBとRabbitMQとの比較？
　MongoDB関連のノウハウかな。
　データ量に関する話。メモリに載せたほうがいいのかとか、ログ出力の設定とか、ジャーナルとか。
　HDDの見積もりに関連しそう。
　健康状態の監視方法。
　コネクションプールの話とか。
　rs＝ReplicaSet？
　mongostatってコマンドがあるのか。
　ServerDensityのツールとダッシュボードなどについて。
　※英語のスライド見ながら話聞くとメモがとれない。　
　まとめ：
　　Keep it in Ram インデックスはメモリに載せましょう。
　　Watch your Strage ストレージのサイズは監視しましょう。（ログ、データ、ジャーナルなどなど）
　　db.serverStatus()　コマンドあるよ。これで見れるデータが重要なのかな？
　　rs.stats()　コマンドあるよ。これで見れるデータが重要なのかな？
　　
　QA：残念ながら聞き取れなかったっすｗ
　　Q：MongoDBのクエリログの統計の質問。DBごと？＝コレクションごと？のクエリ統計のとり方は？
　　A：MongoDBにはないので、ログレベルを下げて統計取ったりする方法しかないかなぁ。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;3.MongoDB: Case Study for AMN    &lt;a href=&#34;http://twitter.com/#!/koyhoge&#34;&gt;@koyhoge&lt;/a&gt;
&lt;a href=&#34;http://www.slideshare.net/koyhoge/mongodb-case-study-for-amn&#34;&gt;スライドはこちら&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　サービス（アジャイルメディア・ネットワーク）で利用している実例について
　広告配信に関連して利用してる。
　最初にPostgreSQLにて実装。5分おきにCronで再起動するはめに。。。
　PostgreSQLの次にSimpleDBへ（インサートが遅い。分散インサート）
　SimpleDB＋SQSに変更。1日130$で断念。
　SaaSなKVSはやめてMongoDBに移行してみる。
　負荷も軽いし、インサートも速い！
　EC2でMongoDB。しかもレプリカを東京A、B、シンガポールAにしてみよう。
　shardingは残念ながらうまく行かず。
　ストレージはEBSの1TB
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;4.「MongoDBとHadoopの蜜月関係」    &lt;a href=&#34;http://twitter.com/#!/muddydixon&#34;&gt;@muddydixon&lt;/a&gt;
&lt;a href=&#34;https://github.com/muddydixon/mongotokyo7th&#34;&gt;スライドはこちら&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　お父さんエンジニアなので、土曜日の勉強会は無理です！＝同じく辛いです！
　HadoopとMongoDBのつなぎについて。
　MongoDBからデータを読み込んで、Hadoopで計算してMongoDBに戻すものがmongo-hadoop
　データロストがニュースになってて心配してる。データロストはめったにない（by @doryokujin）
　Hadoopを計算だけに利用できるのでクラスタが落ちても気にせず立ち上げができそう。
　MongoDBからデータを取得する時点でフィルタリングが可能なので、Hadoopでの演算が楽。
　AdHocなクエリをMongoDBに投げれるのがうれしいのかな？
　HBaseとかHiveに入れてやったりはダメなんかな？

　QA
　　Q：なんで、みんなMongoDBにログ入れるの？@kzk_mover
　　A：様々な形式を入れやすいから。
　　Q：捨てるのどーするの？
　　A：コンパクションが大変（ただし、2.0以降は良くなる予定）
　　Q：MongoDBのMap/Reduceは？
　　A：時間がかかった上に死ぬというひどい目にあったので。。。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;5.Fusion-io    &lt;a href=&#34;http://twitter.com/#!/hasegaw&#34;&gt;@hasegaw&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　340の仮想マシンが4台で動きます！
　すごそう。。。一回は触ってみたいかも。
　Fusion-ioすげーーーって感じ。（Ustストップ）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;6.MongoDB on Cloud Foundry    &lt;a href=&#34;http://twitter.com/#!/yssk22&#34;&gt;@yssk22&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　VMWare社のPaaSオファリングの名称
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;感想など&#34;&gt;感想など：&lt;/h3&gt;
&lt;p&gt;mongoDBに興味はあるのに、腰が引けてるおじさんになって結局触らずに会場入りしてしまいました。
会場に入っていきなり、Treasure Dataの太田さんがマグカップを売っているという場面に遭遇するというインパクトがあるスタート。（思わず1個購入）
最初はMongoDB JPの主催者でもある@doryokujinさんの話から。今熱いfluentdとmongoDBの組み合わせに関する話で、面白かったです。
途中でfluentdを作っている古橋さんのスライドを用いてfluentdの解説まで入りました。
TL上では、その古橋さんが時々フォローを入れているという贅沢な流れ。
なんとなく仕組みはスライドなどを見ていたのですが、更に理解が深まりました。
次が、イギリスから来日されていた@davidmyttonさん（なんと24歳という若さ！）のお話。
残念ながら英語のヒアリングは微妙な私なので、あまり理解できなかったのですが、どうやら、MongoDBの運用でのTipsのお話だったようです。スライドを後で見なおしたほうがいいかな。
次は、実際のMongoDBを利用した事例の紹介。PostgreSQLから試行錯誤してMongoDB＋AWSの組み合わせのお話。
やはり実例があると面白いですね。試行錯誤された部分があるので、非常にわかりやすかったです。
次が、HadoopとMongoDBの組み合わせのお話。HadoopのMap/Reduceの部分だけを利用して、データ保存先はMongoDBにしましょうという割りきった話でした。
いくつか疑問点がメモにもありますが、残念ながら質問する勇気なしという腰抜けっぷり（もうちょっと積極的にならないと。。。）
で、このあとFusion-ioとCloud Foundryの話になるのですが、体力切れ＋lucene-gosenのjavadocが古いことに気づいてしまい、作業をしながら聞いていたのであまり頭に残っていません。（ほんとに申し訳ない。。。）
とまぁ、最近、Twitter上でいろんな人に絡みまくってまして、@doryokujinにも絡みまくってたというのもあり、今回参加することにしたという次第でした。
懇親会にも多くの人が残っており、良いコミュニティができてるなぁというのが正直な感想です。
各セッションでも@doryokujinさんが適宜QAなどのフォローをされていて感心しっぱなしでした。
あとは、Twitter上で会話をしていた方たちとも顔合わせができたので、大収穫でした。&lt;/p&gt;
&lt;p&gt;次は、少しでもいいので、触ってから参加することにしようかと思います。
来年1月には&lt;a href=&#34;http://www.10gen.com/events/mongo-tokyo-2012&#34;&gt;Mongo Tokyo 2012&lt;/a&gt;というイベントも開かれるようで、ますます注目を浴びていきそうですね。主催者もミドルウェアもｗ&lt;/p&gt;
&lt;p&gt;あ、そうそう、そんなMongoDBの勉強会でしたが、CouchDBの話もちらほら出てまして、&lt;a href=&#34;http://www.couchbase.com/couchconf-tokyo&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CouchConf
TOKYO&lt;/a&gt;というチラシも&lt;a href=&#34;http://twitter.com/#!/Ijokarumawak&#34;&gt;@Ijokarumawak&lt;/a&gt;さんから頂きました。こちらも1月開催のようです。&lt;/p&gt;
&lt;p&gt;追記：


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20111116/20111116_2134939.jpg&#34;  /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20111116/20111116_2134939.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;戦利品の画像です。マグカップ（500円）以外は貰い物です。
なんと、このUSBにはMongoDBのコマンドやクエリのチートシート（PDF）が入ってました。びっくり！&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Splunk Live!のイベントに行って来ました。(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/11/09/splunk-live%E3%81%AE%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AB%E8%A1%8C%E3%81%A3%E3%81%A6%E6%9D%A5%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Wed, 09 Nov 2011 16:00:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/11/09/splunk-live%E3%81%AE%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AB%E8%A1%8C%E3%81%A3%E3%81%A6%E6%9D%A5%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;Solr本の武田さんから教えていただいた&lt;a href=&#34;http://splunk.intellilink.co.jp/&#34;&gt;Splunk&lt;/a&gt;の
イベントに行って来ました。
Splunkとは様々な機器のログなどを一箇所に集めてリアルタイムに検索、分析できるようにするための製品です。（ざっくりした説明ですが。。。）
ちなみに、データ量が小さければフリー版も用意されています。
以前、話しを聞いていて気になっていた所イベントが開催されるということだったので参加してきました。
以下に、その時取ったメモを記載しておきます。いつものごとく、自分用のメモなので、役に立つかはわかりませんが。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Solr本の武田さんから教えていただいた&lt;a href=&#34;http://splunk.intellilink.co.jp/&#34;&gt;Splunk&lt;/a&gt;の
イベントに行って来ました。
Splunkとは様々な機器のログなどを一箇所に集めてリアルタイムに検索、分析できるようにするための製品です。（ざっくりした説明ですが。。。）
ちなみに、データ量が小さければフリー版も用意されています。
以前、話しを聞いていて気になっていた所イベントが開催されるということだったので参加してきました。
以下に、その時取ったメモを記載しておきます。いつものごとく、自分用のメモなので、役に立つかはわかりませんが。&lt;/p&gt;
&lt;p&gt;Splunk Live! in toyosu&lt;/p&gt;
&lt;p&gt;日時：2011/11/02　10:00-12:00
場所：豊洲&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
1.挨拶＋アジェンダ紹介
2.ビッグデータ取り込み、ロードマップ（Splunk Inc.）CEO Godfrey Sullivan
　英語でした。。。
　データの種類と量が大きくなってきてるのに、ツールが追いつかないし、回答するのもはやくしろと言われる。
　非構造化データの例としてApacheのログが出ていた。
　TimeSeriesのフラットファイルがsplunkのデータのインデックス。（No RDB＝スキーマいらないよと。）　
　　※ここが重要な点かもしれない。
　リアルタイムに解析できるのが売り。Jubatusとの違いとか聞くと面白いかも。
　Machine Data Engine＝Splunk
　データの関連付けの方法がどんなものか？
　事前のスキーマが不要＝流しこむ前には定義が必要？だよね？
　？No need to filter/forward？？
　デベロッパーフレームワークってなんだ？？
　Splunkbaseと呼ばれる場所にSplunk Appsと呼ばれるアプリケーションがある。色々な場所、OS、アプリで利用できるものらしい。
　？自動監視も学習する仕組みがある？？
　それとも定義するのか？
　あくまでもMachine Dataと言っている。これは、ユーザのリレーションの解析などはないということか？
　Leading Social Gaming Company＝Zynga
　Introscopeのログバージョンに似てるかもなぁ。
　Cloudベースのアプリの解析にも利用（saleforce）
　色々な利用シーンのお話。

3.適用事例（独立行政法人理化学研究所）
　和光と神戸で利用。10G程度のデータを扱ってる？
　ログから情報基盤を監視するのに利用している。
　syslogベースでsplunkにログを送信している。
　事例１：VPNに接続できない（接続数上限がある？）
　　CISCOのログから解析
　　どの研究室で発生しているかも検索。
　事例２：DHCPの接続ミス？（IPアドレスロスト）
　　ここまでは問題が発生してからログを漁るという使い方。
　事例３：LINK FLAPのアラート
　　短時間にUPDOWNを繰り返す場合にスイッチがおかしくなってるんでは？
　事例４：メール大量送信（ウィルス感染）
　　不特定多数のサーバに短時間でメールを配信している

　※使い方としては情報基盤環境すべて（ネットワークとかサーバなど）のログを集めておいて監視＋解析に利用して障害対応などに利用している？データセンターとかに入れるのか？

　あくまでも、ログを保存して、検索できる仕組みが１箇所にまとめられているという感じ。
　そのログの解析について（どういった問題に対して、どういったクエリを投げるか？どういったトラップを仕込むか？）は利用する側の腕にかかっている印象。
　※実際に触ってみたいなぁ。500M/dayか。ご近所に入れてみるか？syslogで転送設定＋入れるサーバが必要。

4.最新アプリなどの紹介（Splunk Inc.）
　GUIがきれいだなー（最近のgoogleっぽいが。。。）
　リアルタイムにデータが入っているのが見えるのか。おもろいな。
　どこのフィールドにヒットしたかがファセットで表示できるらしい。おもろい。
　flashでできたビューがすごくおもろかったぞ。（ドキュメントどこだ？）

5.最新の取り組み（NTTデータ先端）
　やっぱり武田さんだった。
　複数の監視システムのメッセージを統合して検索、アラートを出せるようにする。
　消費電力を算出するためにログを集めて集計する。

6.QA
　ロードマップ
　　・２年以内にビジネスサイドでの利用に向けての動きを見せていく予定。
　　・アプリケーションフレームワークにして、他のパートナーのアプリを載せていきたい。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ということで、感想ですが、事例紹介などを聴いた感じだと今のところはインフラ系のログを一元化して検索、監視、アラートをあげるということに活用するためのツールの用に感じました。
当初の使い方がそういったところにあるためだとは思いますが。
開発者としての視点で話しを聞いていて、活用できそうだというのは次のシーンでしょうか。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;開発時の開発環境のログ集約&lt;/li&gt;
&lt;li&gt;性能試験などでのログ、性能データ集約&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;開発時点もしくは性能試験時ですが、色々なサーバ（DBやアプリサーバ）の時間を横串にして表示検索などができると思うので、問題があった時の各種サーバの状態を一元的に見れるため、どのサーバにどういった負荷がかかっていたか、
どこに問題があったかなどをグラフ化して見ることが簡単にできるのではないかなぁという感想です。
あとは、ログが一元化されているので、問題があったときにまずログを検索すればいいのが楽ですかね。&lt;/p&gt;
&lt;p&gt;基本的にはログが集まってるからあとは、どう使うかはご自由にという印象でした。
どのようなログを集めておき、どういったトラップでアラートさせるか、どのような検索をすれば望んでいるログが出てくるか、どのような集計をしたいかなどについては、やはり導入してからノウハウを貯めていくか、導入時にコンサルしてもらうなどが必要かと。
また、このツールを入れることでどのようなフィードバックをどのように活用できるかをイメージしていなければ、
宝の持ち腐れになりそうです。
あとは、使い方次第ですが、サーバログ以外にアプリログ（ユーザの行動履歴とか）などを入れることで、インフラ以外での使い道もありそうです。
とりあえず、保存しておいて、あとから特定の傾向を見出すのに検索できるのはちょっと面白いかも。&lt;/p&gt;
&lt;p&gt;あ、そう、ストラップとUSBメモリ（4G）のノベルティをお土産にもらいました。無料セミナーなのに。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Lucene Eurocon 2011 Barcelona のスライド読みました(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/11/08/lucene-eurocon-2011-barcelona-%E3%81%AE%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%89%E8%AA%AD%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Tue, 08 Nov 2011 13:02:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/11/08/lucene-eurocon-2011-barcelona-%E3%81%AE%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%89%E8%AA%AD%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;最近忘れやすいので、記録しておこうかと。
読んだスライドの簡単な内容と感想です。
ちなみに、スライドの一覧はこちらです。
&lt;span style=&#34;color:#FF0000&#34;&gt;※スライドへのリンクはすべてPDFへのリンクになっていますので、注意が必要です。&lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href=&#34;http://www.lucidimagination.com/sites/default/files/file/Eurocon2011/miller_solr4highlights2_eurocon2011.pdf&#34;&gt;&lt;em&gt;&lt;strong&gt;Solr 4 Highlights（PDF）&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;最近忘れやすいので、記録しておこうかと。
読んだスライドの簡単な内容と感想です。
ちなみに、スライドの一覧はこちらです。
&lt;span style=&#34;color:#FF0000&#34;&gt;※スライドへのリンクはすべてPDFへのリンクになっていますので、注意が必要です。&lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href=&#34;http://www.lucidimagination.com/sites/default/files/file/Eurocon2011/miller_solr4highlights2_eurocon2011.pdf&#34;&gt;&lt;em&gt;&lt;strong&gt;Solr 4 Highlights（PDF）&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Solrの次期バージョン4.0で採用される機能の紹介でした。
紹介されているのは次の機能。各機能について、JIRAの番号も記載があるので便利ですね。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DirectSolrSpellChecker&lt;/li&gt;
&lt;li&gt;NRT (&lt;a href=&#34;http://wiki.apache.org/solr/NearRealtimeSearch&#34;&gt;Near RealTime search&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Realtime Get&lt;/li&gt;
&lt;li&gt;SolrCloud - search side&lt;/li&gt;
&lt;li&gt;SolrCloud - indexing side (WIP)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これまでと異なるSpellChecker、Commit前のデータが検索できるNRT（なんでNRSじゃないんだろう？）、Commit前の登録済みデータを取得することが出来るRealtime Getなどの簡単な紹介です。
あと、個人的に興味のあるSolrCloud周りが絵付きで紹介されてます。ZooKeeperもちょっと出てきます。
まだ、ちゃんとまとめてないですが、NewSolrCloudDesignの翻訳したものも参考までに。（&lt;a href=&#34;http://johtani.jugem.jp/?eid=31&#34;&gt;その１&lt;/a&gt;、&lt;a href=&#34;http://johtani.jugem.jp/?eid=32&#34;&gt;その２&lt;/a&gt;）&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;a href=&#34;http://www.lucidimagination.com/sites/default/files/file/Eurocon2011/Binns_archiveit_eurocon2011.pdf&#34;&gt;Archive-It: Scaling Beyond a Billion Archival Web-pages&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;InternetArchiveの事例紹介。1996年からWebページのアーカイブを行なっているサイトですね。
その一部でSolrが利用されています。
「1,375,473,187 unique documents」との記述もあり、データ量が巨大です。
データ量が多いのに、ここでFieldCollapsing/Groupingも利用しているようで、インデックス作成、検索両方に対してカスタマイズしたものをgithubで公開している模様です。&lt;/p&gt;
&lt;hr&gt;
[&lt;em&gt;**Scaling search at Trovit with Solr and Hadoop**&lt;/em&gt;](http://www.lucidimagination.com/sites/default/files/file/Eurocon2011/MarcSturlese_scalingsearchTrovit_eurocon2011.pdf)
&lt;p&gt;次は、Trovitという会社のSolr＋Hadoopの事例紹介です。
最初はLuceneをベースに検索サーバ作ってたけど、Solrが出てきたので、Solrを使うようになったようで。
データ保存先として最初はMySQLを利用してDataImportHandlerでSolrにデータ登録してたけど、
データ量が増加するが、MySQLのShardingが面倒なので、Hadoop（Hive）でデータをパイプライン処理してSolrのインデックスを作成しましょうという流れになったようです。
私が以前、&lt;a href=&#34;http://www.slideshare.net/nabeta/ss-8118052&#34;&gt;Solr勉強会で紹介したSOLR-1301&lt;/a&gt;のパッチをベースにMap/Reduceの処理を2段階にして性能をアップさせたという話が記載されてました。
ただ、これで早くなるのかはよくわからないんですが。。。
一応、資料では、いきなり大きなSolrのインデックスを作らずに、最初のM/Rで小さなインデックスを作成し（TaskTrackerの数＞＞Solrのshardサーバ数だから小さくしたほうが速い？）、
2段目のM/Rでインデックスをマージしてshardサーバ数のインデックスに集約する？という形みたいです。
（英語力のなさが。。。）
あとは、テキスト処理を幾つかHadoopでやってますよという紹介でした。
SOLR-1301の利用者が他にもいて、違うアプローチをとっていたのが印象的。
毎回全データインデックス生成するときは、SOLR-1301を利用してshard数が増えてもすぐに対応が可能になるので、
かなり便利ですよ。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href=&#34;http://www.lucidimagination.com/sites/default/files/file/Eurocon2011/Gio_Kincade-Solr_Etsy_eurocon2011.pdf&#34;&gt;&lt;em&gt;&lt;strong&gt;Solr @ Etsy&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Etsyは個人の作家（編み物とかシールとか）の方が出店するためのショッピングモールのようなサイトです。
実は、最近、MacBookAirのステッカーを購入したのがここでした。
で、検索にSolrを使っています。
面白いのが、検索サーバとWebアプリ（PHPで書かれている）の間のデータのやり取りにThriftを利用していること。
Solrの前にThriftを話すサーバを別途用意しているようです。ネットワークのデータ量を減らすことが目的らしいです。
そのあとは、少しThriftのサーバでのLoadBalancingの話が続きます。
次にレプリケーションの性能問題のはなし。定期的にレプリケーションに異様に時間がかかるのが問題になったようで、
Multicast-Rsyncを試してみたけどダメでしたというはなし。
Bit Torrent + Solrという組み合わせで回避したらしいのですが、いまいち仕組みがわからなかったです。。。
こちらもgithubに公開されている模様。
あとは、QParser、Stemmerをカスタマイズしたものの話です。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href=&#34;http://www.lucidimagination.com/sites/default/files/file/Eurocon2011/Baldeschwieler_HortonWorks_LuceneEurocon20111018.pdf&#34;&gt;&lt;strong&gt;&lt;em&gt;Architecting the Future of Big Data and Search&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;LuceneのカンファレンスにHortonworksが出てきてびっくりしました。
まぁ、Luceneの生みの親＝Hadoopの生みの親ですから、問題ないのかもしれないですが。
大半が予想通り、Hadoopに関する話でした。
知らないApacheのプロジェクト「&lt;a href=&#34;http://incubator.apache.org/ambari/&#34;&gt;Ambari&lt;/a&gt;」というのが出てきました。これは、HadoopConferenceJapan2011 Fallでの発表にもチラッと出てきたようです。
「Ambari is a monitoring, administration and lifecycle management project for Apache Hadoop clusters.」ということで、Hadoopクラスタの統合管理のツールになるんでしょうか？
最後の2枚くらいにLuceneが出てきます。絡めてみたって感じですかね。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href=&#34;http://www.lucidimagination.com/sites/default/files/file/Eurocon2011/scholten_Configuring_Mahout_Clustering_Jobs_Eurocon2011.pdf&#34;&gt;&lt;em&gt;&lt;strong&gt;Configuring mahout Clustering Jobs&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;今度はMahoutが出てきました。はやりのものが満載です。
まぁ、MahoutもLuceneのインデックスを利用するという話もありますので。
スライドはクラスタリングとはどういうものか、Mahoutの説明とテキストクラスタリング処理のお話、最後はstuckoverflowでのMahoutとSolrの活用の仕方について。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;ということで、英語力がない中、かなり流し読みな感じですが、あとで思い出すために書きだして見ました。
何かの役に立てれば幸いです。&lt;/p&gt;
&lt;p&gt;他に、こんなスライドが面白かったとか、このスライドについても書いてほしいなどあれば、コメントください。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Bookscanを使ってみました(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/11/02/bookscan%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Wed, 02 Nov 2011 18:11:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/11/02/bookscan%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.bookscan.co.jp/?PHPSESSID=d512d1ff0e4682d92b088c8fc7072623&#34;&gt;Bookscan&lt;/a&gt;というサービスがあります。
書籍を電子化（PDF）して原本を破棄してくれるサービスです。&lt;/p&gt;
&lt;p&gt;電子書籍にはずっと興味を持っていました。
技術書を購入するのですが、技術書は３００ページ超の大きな書籍が大半です。
また、日本語の技術書については、なかなか電子書籍が見つからないもしくは、電子化されるのが遅いとうのが現状です。
海外では、&lt;a href=&#34;http://www.manning.com/?PHPSESSID=d512d1ff0e4682d92b088c8fc7072623&#34;&gt;Manning&lt;/a&gt;など、電子書籍も同時に発売（もしくは、製本前から電子書籍が売られている）サイトがありますが、やはり英語の書籍はハードルが高いなぁと。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;http://www.bookscan.co.jp/?PHPSESSID=d512d1ff0e4682d92b088c8fc7072623&#34;&gt;Bookscan&lt;/a&gt;というサービスがあります。
書籍を電子化（PDF）して原本を破棄してくれるサービスです。&lt;/p&gt;
&lt;p&gt;電子書籍にはずっと興味を持っていました。
技術書を購入するのですが、技術書は３００ページ超の大きな書籍が大半です。
また、日本語の技術書については、なかなか電子書籍が見つからないもしくは、電子化されるのが遅いとうのが現状です。
海外では、&lt;a href=&#34;http://www.manning.com/?PHPSESSID=d512d1ff0e4682d92b088c8fc7072623&#34;&gt;Manning&lt;/a&gt;など、電子書籍も同時に発売（もしくは、製本前から電子書籍が売られている）サイトがありますが、やはり英語の書籍はハードルが高いなぁと。&lt;/p&gt;
&lt;p&gt;そんな中、Bookscanの噂を耳にしました。
ということで、どんどん、積ん読になっていく技術書だったので、思い切って、電子化してみることにしました。
※残念ながらまだタブレット（電子書籍端末）は持っていないのですが。。。もうすぐ発売されるlenovoの7inchタブレットを待ちかねているところです。&lt;/p&gt;
&lt;p&gt;Bookscanでは、１冊１００円で書籍をPDFにしてくれます。（ページ数により変わってくる）
この場合、あくまでも書籍をスキャンするだけで、検索などはできません。
OCR処理については別途１冊１００円（これもページ数による）のオプションが必要になります。
詳しいサービス内容は&lt;a href=&#34;http://www.bookscan.co.jp/service.php&#34;&gt;こちら&lt;/a&gt;を御覧ください。
基本的には書籍をBookscanに発送してから約３ヶ月ほど電子化するのに時間がかかります。
これでは、すぐに見たい場合に手元にないという状態になってしまいます。
この電子化までの時間を短くできる、「プレミアム会員」というオプションが存在します。
月額固定の費用（９９８０円）を支払うことで、５０冊（※ページ数により１冊の単位が異なります）まで無料で、「スキャン＋OCR＋書籍名をファイル名」のPDFファイルを書籍到着後１週間以内で作成してもらうことができます。
また、プレミアム会員は月単位での契約が可能なようで、１ヶ月（＝５０冊）だけ早く電子化してもらうといった利用方法もできるようです。&lt;/p&gt;
&lt;p&gt;で、実際にプレミアム会員となって４９冊の書籍を送付して電子化してもらいました。
先週金曜日に発送、Bookscanに書籍が到着したのが翌土曜日、電子化が完了したのが火曜日の夜という感じでした。
すごくはやい！かなり感動してます。自炊自体をしたことがないので、出来上がりが自炊と比べてという比較はできないのですが、ざっと見ている感じでは全然問題なく読めそうです。&lt;/p&gt;
&lt;p&gt;ただ、１冊の２ページだけ、ページの端が文章の途中で切れているPDFがありました。
この書籍に関しては、サポートサービスにお願いして、再スキャンをしてもらいました。
昨日夜に頼んで今日の午後には問題なく電子化されているというサービスの質でとても満足しています。
なお、原本の破棄が電子化後から１０日後に行われるため、問題ないかの確認はそれまでに行う必要があるようです。
大量の本を送る場合は小分けに送ったほうが確認するのが楽になると思います。（送料は小分けにした分、かかってしまいますが。）&lt;/p&gt;
&lt;p&gt;書籍の山になっていた机がすっきりして、とても満足しています。
せっかく電子化したので、早くタブレットが欲しいなと思う今日この頃。。。
基本的には今後は電子書籍を購入するようにしていく予定なので、プレミアム会員を継続することはないと思いますが、
家に溜まっている漫画を電子化するのもありかなぁと思っているところです
漫画の場合はOCRに掛ける必要もないですし。&lt;/p&gt;
&lt;p&gt;個人的にはBookscanさんには悪いのですが、もっと電子書籍が増えると助かります。
技術書はページ数が多く、重たいうえ、実際に利用するときは検索したくなることが多々ありますので。
あとは、電子書籍を検索できるサイトがあるといいなと思ってもいるところです。
現在は、各出版社が個別に電子書籍のHPを持っている状況で、会社によっては検索すらできないです。
電子書籍があるかないかだけでも簡単に検索できると、いいなと思っています。（小説などはまた別なのかもしれないですが。）
みんなはどう思ってるんですかねぇ？検索したくないですか？&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>1.2.0リリース(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/10/31/1-2-0%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9/</link>
      <pubDate>Mon, 31 Oct 2011 15:46:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/10/31/1-2-0%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9/</guid>
      <description>&lt;p&gt;lucene-gosenの最新版（1.2.0）をリリースしました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://code.google.com/p/lucene-gosen/&#34;&gt;プロジェクトページ&lt;/a&gt;よりダウンロードが可能です。&lt;/p&gt;
&lt;p&gt;新規追加機能については&lt;a href=&#34;http://johtani.jugem.jp/?eid=38&#34;&gt;こちらのエントリ&lt;/a&gt;を御覧ください。&lt;/p&gt;
&lt;p&gt;バグなどありましたら、容赦なく報告をいただけると助かります。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;lucene-gosenの最新版（1.2.0）をリリースしました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://code.google.com/p/lucene-gosen/&#34;&gt;プロジェクトページ&lt;/a&gt;よりダウンロードが可能です。&lt;/p&gt;
&lt;p&gt;新規追加機能については&lt;a href=&#34;http://johtani.jugem.jp/?eid=38&#34;&gt;こちらのエントリ&lt;/a&gt;を御覧ください。&lt;/p&gt;
&lt;p&gt;バグなどありましたら、容赦なく報告をいただけると助かります。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>辞書の外部化とLucene/Solr3.4対応(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/10/26/%E8%BE%9E%E6%9B%B8%E3%81%AE%E5%A4%96%E9%83%A8%E5%8C%96%E3%81%A8lucene-solr3-4%E5%AF%BE%E5%BF%9C/</link>
      <pubDate>Wed, 26 Oct 2011 01:12:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/10/26/%E8%BE%9E%E6%9B%B8%E3%81%AE%E5%A4%96%E9%83%A8%E5%8C%96%E3%81%A8lucene-solr3-4%E5%AF%BE%E5%BF%9C/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://johtani.jugem.jp/?eid=22?PHPSESSID=744a73e2820c6e94289eb9ba777c1ff2&#34;&gt;すぐやりますと言いつつ&lt;/a&gt;、はや1ヶ月。。。
腰が重い、ダメエンジニアですね。。。&lt;/p&gt;
&lt;p&gt;すみませんでした。。。
ようやくtrunkにコミットしました。
すぐにリリース版を用意すると思います。&lt;/p&gt;
&lt;p&gt;1ヶ月もあいてしまったので、追加した機能に関するまとめと、
用途別の利用方法を記載しておきます。
（lucene-gosenのWikiにもそろそろ書かないとなぁ。日本語でもいいから。）&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;http://johtani.jugem.jp/?eid=22?PHPSESSID=744a73e2820c6e94289eb9ba777c1ff2&#34;&gt;すぐやりますと言いつつ&lt;/a&gt;、はや1ヶ月。。。
腰が重い、ダメエンジニアですね。。。&lt;/p&gt;
&lt;p&gt;すみませんでした。。。
ようやくtrunkにコミットしました。
すぐにリリース版を用意すると思います。&lt;/p&gt;
&lt;p&gt;1ヶ月もあいてしまったので、追加した機能に関するまとめと、
用途別の利用方法を記載しておきます。
（lucene-gosenのWikiにもそろそろ書かないとなぁ。日本語でもいいから。）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;追加した機能&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
これまでのlucene-gosenはjarに辞書を含む形でライブラリを提供していました。
ただ、この場合、カスタム辞書を利用している環境ではカスタム辞書を修正し、ビルドしなおすたびに、
jarファイルを作成しなければなりません。
また、jarファイルをSolrなどに配布する必要も出てきます。
この手間を考慮して、辞書を外部ディレクトリで指定することができるようにしたものが
今回の修正になります。
また、修正の過程で同一VM内で異なる辞書を使えるようにする機能も副産物として生まれました。
今回追加した機能は次のようなものになります。
&lt;ul&gt;
&lt;li&gt;辞書を含まないjarのビルドおよび提供&lt;/li&gt;
&lt;li&gt;ディレクトリ指定による辞書の指定&lt;/li&gt;
&lt;li&gt;同一VM内での複数辞書の利用&lt;/li&gt;
&lt;li&gt;辞書リビルド用のAntターゲットの追加&lt;/li&gt;
&lt;li&gt;Lucene/Solr jarファイルの最新化（3.4.0対応）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ディレクトリ指定による辞書の指定ですが、以下のような形になります。
まずは、LuceneのTokenizerでの指定方法です。
「辞書のディレクトリ」という引数が追加になっています。
ここに、辞書ディレクトリ（*.senファイルが存在するディレクトリ）を相対/絶対パスで指定します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
...
Tokenizer tokenizer = new JapaneseTokenizer(reader, null, &amp;#34;辞書のディレクトリ&amp;#34;);
...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;つぎは、Solrでの設定の方法です。
schema.xmlにて次のような設定を行います。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
...
&amp;lt;fieldType name=&amp;#34;text_ja&amp;#34; ...&amp;gt;
  &amp;lt;analyzer&amp;gt;
    ...
    &amp;lt;tokenizer class=&amp;#34;solr.JapaneseTokenizerFactory&amp;#34; compositePOS=&amp;#34;compositePOS.txt&amp;#34; dictionaryDir=&amp;#34;辞書のディレクトリ&amp;#34;/&amp;amp;gt;
    ...
  &amp;lt;/analyzer&amp;gt;
&amp;lt;/fieldType&amp;gt;
...  
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;schema.xmlの設定については、&lt;a href=&#34;https://code.google.com/p/lucene-gosen/source/browse/trunk/example/schema.xml.snippet&#34;&gt;example/schema.xml.snippet&lt;/a&gt;にも説明がありますので、こちらもあわせて参考に。
なお、Solrの設定については、先ほどのLuceneでの辞書のディレクトリの指定方法（絶対/相対パス）に加えて、
&lt;em&gt;$SOLR_HOME/conf&lt;/em&gt; からの相対パスでの指定も可能になっています。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Antのターゲットについて&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
辞書なしjarファイルを作成するターゲットなどを追加しています。
実際に追加したターゲットは以下のとおりです。
&lt;table class=&#34;list_view&#34;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ターゲット名&lt;/th&gt;
&lt;th&gt;説明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class=&#34;spec&#34;&gt;
&lt;td&gt;nodic-jar&lt;/td&gt;
&lt;td&gt;辞書なしのjarファイルを生成するためのターゲット。辞書のダウンロード、コンパイルは行いません。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;specalt&#34;&gt;
&lt;td class=&#34;alt&#34;&gt;rebuild-dic&lt;/td&gt;
&lt;td class=&#34;alt&#34;&gt;lucene-gosenのビルド済み辞書（.senファイル）を削除してから辞書のコンパイル（ビルド）を行います。-Ddictypeにより辞書のタイプ（ipadic|naist-chasen）の指定が必要です。また、-Dcustom.dicsによりカスタム辞書の指定もあわせて可能です。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;spec&#34;&gt;
&lt;td&gt;build-dic-ipadic&lt;/td&gt;
&lt;td&gt;テスト用に追加。-Ddictype=ipadicを指定してbuild-dicを実行。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;specalt&#34;&gt;
&lt;td class=&#34;alt&#34;&gt;build-dic-naist-chasen&lt;/td&gt;
&lt;td class=&#34;alt&#34;&gt;ついでに追加。-Ddictype=naist-chasenを指定してbuild-dicを実行。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;最後の２つはあまり関係ありません。内部的に有ると便利だったため、作りました。
重要なのは最初の２つです。
ひとつめの「nodic-jar」は辞書を含まないjarファイルをビルドします。
このjarファイル＋辞書の入ったディレクトリを利用することで、辞書の外部化が可能となります。&lt;/p&gt;
&lt;p&gt;そして、「rebuild-dic」です。こちらは、&lt;a href=&#34;http://johtani.jugem.jp/?eid=4&#34;&gt;以前記事に書きました&lt;/a&gt;が、カスタム辞書のコンパイルが思いの外面倒だったので、ターゲットを追加しました。
次のように指定することで、辞書のリビルドが可能です。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
$ ant -Ddictype=naist-chasen -Dcustom.dcs=&amp;#34;custom1.csv custom2.csv&amp;#34; rebuild-dic
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;提供されるjarファイルについて&lt;/strong&gt;&lt;hr&gt;&lt;/p&gt;
&lt;p&gt;提供されるjarファイルは次のようになる予定です。
1番目のjarファイルが今回追加になる、辞書なしのjarファイルになります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;lucene-gosen-1.x.x.jar&lt;/li&gt;
&lt;li&gt;lucene-gosen-1.x.x-ipadic.jar&lt;/li&gt;
&lt;li&gt;lucene-gosen-1.x.x-naist-chasen.jar&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;用途別の利用方法&lt;/strong&gt;&lt;hr&gt;
利用用途別に利用するjarファイルやantのターゲットを利用シーンを交えて想定を書いてみます。
Solrでの利用シーンを想定します。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;お手軽に使う。辞書ありjarファイルで一発インストール。&lt;/strong&gt;&lt;/em&gt;
これまでどおりの使い方になります。
辞書込みのjarファイルを利用すれば、すぐに利用可能になります。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;カスタム辞書を使い倒す。定期的に辞書をメンテナンス。&lt;/strong&gt;&lt;/em&gt;
定期的にシステム固有の単語が増える（例：製品名、新語など）場合です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;利用するjar：lucene-gosen-1.x.x.jar&lt;/li&gt;
&lt;li&gt;辞書のコンパイル＋配置：ant -Ddictype=naist-chasen -Dcustom.dics=&amp;ldquo;custom1.csv&amp;rdquo; rebuild-dir&lt;/li&gt;
&lt;li&gt;Solrの該当コアのRELOAD&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Solrのマルチコア環境を利用します。なお、sharedLib設定にlucene-gosen-1.x.x.jarを配置すると、辞書の再読み込みができないので注意してください。
設定は、上記のようにTokenizerFactoryの設定でdictionaryDirにて辞書のディレクトリを設定しておきます。
カスタム辞書に単語を追加後、antにて、辞書のリビルドを行います。
リビルドした辞書ファイルを必要に応じて対象の辞書ディレクトリにコピーします。（ビルド後のディレクトリをそのまま利用している場合はコピーの必要はないです。）
最後に、Solrの該当コアのリロードを行います。（リロードの仕方は&lt;a href=&#34;http://wiki.apache.org/solr/CoreAdmin?PHPSESSID=d9edccf00e1c13655f96b005f36819c4&#34;&gt;こちらを参考に&lt;/a&gt;。）
コアのリロードにより、辞書の再読み込みが行われるので、リロード後から新しい辞書が適用されます。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;異なる辞書を使い倒す。TokenizerごとにdictionaryDir設定するぞ&lt;/strong&gt;&lt;/em&gt;
1つのSolrで異なる辞書を使ったフィールドを使いたい場合です。
ipadicとnaist-chasenといった異なる場合はあまり想定できないですが、カスタム辞書の部分が異なるという形が想定できるでしょうか。（例：製品名のフィールド、企業名のフィールド。。。など）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;利用するjar：lucene-gosen-1.x.x.jar&lt;/li&gt;
&lt;li&gt;設定：schema.xmlに異なるdictionaryDirを設定したTokenizerFactoryを設定&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上記、カスタム辞書の定期更新も一緒に行うことも可能です。コアをリロードすれば、リロードしたコアで利用している
辞書がすべてリロードされます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;最後に&lt;/strong&gt;&lt;hr&gt;
遅くなってしまいましたが、ようやく、trunkにコミットしました。
できるだけ速く、リリースしますので、もう少々お待ちを。&lt;/p&gt;
&lt;p&gt;Solrのconfディレクトリからの指定については、&lt;a href=&#34;http://twitter.com/shinobu_aoki&#34;&gt;＠shinobu_aoki&lt;/a&gt;さんにパッチを提供してもらいました。
また、trunkにコミットしていないパッチを適用して記事を書いてくれた方もいらっしゃいました。こちらもあわせて参考に。私より説明が上手です。
&lt;a href=&#34;http://www.mwsoft.jp/programming/munou/lucene_gosen.html&#34;&gt;Java製形態素解析ライブラリ「lucene-gosen」を試してみる&lt;/a&gt;&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>JJUG CCC 2011 Fallに参加してきました。(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/10/18/jjug-ccc-2011-fall%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%A6%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Tue, 18 Oct 2011 16:20:43 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/10/18/jjug-ccc-2011-fall%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%A6%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;JJUG CCC 2011 Fallに参加してきました。
個人的にはかなり久々のJavaのカンファレンスです。（※あくまで「Javaの」という話で。SolrやHadoopとは別という意味です。）&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;JJUG CCC 2011 Fallに参加してきました。
個人的にはかなり久々のJavaのカンファレンスです。（※あくまで「Javaの」という話で。SolrやHadoopとは別という意味です。）&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.java-users.jp/contents/events/ccc2011fall/&#34;&gt;概要やタイムテーブルはこちら&lt;/a&gt;。
予定があったので、残念ながら最後の２つのセッション（Scala、Twitter）しか参加できませんでした。
Hadoopの話も聞きたかったのですが、しょうがないかと。
いつものごとく、メモを個人的に取ったので。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
★楽々Scalaプログラミング
　浅海

　◎OOPからOFPへの道しるべ
　　・関数型の使い所、プログラミングのコツ
　　・つながりの部分

　◎最近の活動
　　モデリングからモデル駆動によるソース生成などに利用。
　　Scala、2008年から使い始めている

　◎Scalaと他の機能との比較図
　◎Scalaの用途
　　・高い生産性
　　　体感で3倍。コード量が少なくなる。
　　　IDEのサポートを考えるとまだ、Java+Eclipseのほうが高い！
　　・DSL
　　　ドメインモデルの記述
　　　フレームワークAPI
　　・並行プログラミング
　　　Many Core
　　　　消費電力的に複数のコアで動かす＝関数型のほうが並行性が上がる（スレッドさわるJavaだけだときつい）
　　　Parallel Everything

　　Object指向＋関数型が扱いやすい。

　◎関数型言語とは
　　・公開関数をあつかえる
　　　関数を値として扱える、引数と返却地に関数を渡せる。（やさしめ）
　　　　＜＝＞
　　　数学（ラムダ計算、圏論など）的にプログラムを記述できる（きびしめ）
　　ある程度使えるはず。厳しめの部分も
　◎関数型言語の長所と短所
　　長所
　　　・高階関数を使った技が使える
　　　　　List（？？？）

　　短所
　　　・メモリ、関数実行オーバーヘッド、スタックの大きさが読めない（再帰的）

　◎関数型言語の系譜
　　純粋関数型言語
　　　pure Lisp
　　伝統的関数型言語
　　　OCaml
　　新世代関数型言語
　　　Haskell
　　　Scala
　　　型クラス
　　　　代数データ型、モナド
　　　　Parametric polymorphism
　◎関数型でしたいこと
　　DSL（Domain Specific Lanuguage）
　　昨年の資料を参考に！
　◎準備
　　scalaの文法
　◎並列コレクション
　　スレッドを利用しないで並列に動作実行させるか？
　　※List().par.map(sitelen).sum
　　　これで並行実行させられる。
　◎Future
　　（これってJavaでもあるよね？＝あるよ）
　　処理を非同期で先行実行し、あとから結果を取得可能
　　Scalaではアクターライブラリでサポート（cala.actors）
　　　関数合成するとFutureの実行結果を取り出す所でブロックされる！！
　◎Promise
　　Futureより強力
　　関数合成すると、合成関数全体が非同期実行される！
　　scalazを利用してた

　◎5つのコツ
　　コツ１：　y=f(x)
　　　引数がひとつの関数が基本
　　　関数合成のビルディングブロックになるよ
　　　引数が複数ある関数は他の関数（map関数とか）で合成しにくい
　　　　対処方法：カリー化（関数の戻りを関数とする）
　　　　　addc(a: Int)(b: Int) : Int = a + b
　　　　　とすることで、
　　コツ２：分割統治
　　コツ３：演算は転換
　　　flatMapとかfoldLeftとか
　　※永続データ構造
　　　前に作ったデータ
　　コツ４：オブジェクトの世界と関数の世界を分ける
　　　更新指示書の形でObjectに渡す？
　　　関数型データ構造
　　コツ５：新しいデザインパターン
　　　関数型プログラミングの用語
　　　　・Functor（関手）
　　　　・Subgroup（半群）
　　　　・Monoid（モノイド）
　　　　・Monad（モナド）
　　　OOPのデザインパターン的に考えれば、数学的なところまで理解しなくてもよさそう？
★Twitterとオープンソース　@yusukey
　http://dev.twitter.com
　http://bit.ly/tdt-ja
　id：twj_dev

　◎OSSとの関わり
　　支援してます。
　　　Apache、Eclipse、Open Invention、JCP、OpenJDK
　　パフォーマンス系のためにもOpenJDKに参画してる
　◎Twitter API
　　オープンなAPIで無償提供
　　１３言語でAPIライブラリがあるよ
　◎Twitter4Jのこれまで
　　ほぼ全てをカバー
　　APIはだいぶ落ち着いてきていて、追加変更は少なくなってる。
　◎立ち位置
　　Twitterはコミュニティを活発にするためにもライブラリを出さないらしい。
　◎Twitter4Jのこれから
　　キャッシング
　　ストリーミングAPI利用を簡単に
　　モックテスト
　　　レートリミットの影響を受けると辛いから。。。
　　ツイート/ユーザの永続化機能
　　jClouds対応？
　　ライブラリからフレームワークへ
　　半公式ライブラリへ
　　　github/twitter/twitter4jへ
　　JSR Social API
　　　Twitter4Jが参照実装に？？？
　スケーラビリティの話。
　Hadoopはユーザのデータ解析とかに使ってる。
　メッセージはキューイングしている。デモ。
　　memcachedプロトコルなんだけど、値を取ると値が消えるよ。（memcachedとは動きが違うよねー。プロトコル的にはクライアントがいっぱいあっていいよねー）
　　RubyのGCがきつかったのでJavaベースに変更
　Kestrel（Scalaで記述。）
　　Kestrelのフォーカス外
　　　メッセージの順序保証（してないよ）
　　　トランザクション
　　memcachedプロトコルの拡張１
　　　ブロックフェッチ
　　　　コンシューマから取りに行くというのが特徴
　　memcachedプロトコルの拡張２
　　　リライアブルフェッチ
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ということで感想。&lt;/p&gt;
&lt;p&gt;Scalaは前から気になっていて、本までかってるのになかなか手を付けられていない始末でした。
そんな時にこのJJUGの話があったので、ちょうどいいと聞きに。
関数型やScalaのぼんやりしたイメージのみを持って聴いていたのですが、思った以上にキーワードが多くてついていくのがやっとというイメージ。
で、いつものごとく、Twitterでつぶやいていた所、色々な反応が。（わからずにつぶやいたのもあり、波紋を呼んだ模様）
お陰で、Scala関連の方たちをフォローできたので結果オーライでした。
話の内容自体はサラっとながす感じだったので、再度資料を見る＋Scalaをもっと勉強しないと理解出来ないなぁという印象でした。
ちなみに、&lt;a href=&#34;http://www.slideshare.net/asami224/scala-9728001&#34;&gt;資料はこちら&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;次は、最近Twitterの中の人になった山本さん（&lt;a href=&#34;http://twitter.com/yusukey&#34;&gt;@yusukey&lt;/a&gt;）の話しを聞きました。
Twitter4Jの話と、TwitterのOSSへの関わりの話。あとは、実際にTwitterが作成しているOSSのひとつKestrelについて。
TwitterはRubyベースで色々と作ってきていたのだが、Java（JVM上で動く言語（Scalaなど））に徐々にシフトしているというのが一番の印象です。あとは、Lucene、Hadoopなど私の興味のあるOSSも利用しているなど。
Kestrelについてはデモを交えながら、実際の動きを説明されていたのでとてもわかり易かったです。
プレゼン中もTweetを表示しながらという、さすがTwitterの中の人という印象でした。
Twitterでは少し前から知り合いだったのですが、実際にお会いできた（イケメンでしたよ！）のも収穫でした。
次はStormの話も聞きたいかなぁ&lt;/p&gt;
&lt;p&gt;で、２セッション（山本さんの話のあとにLT大会にも参加）だけですが、全体の感想を。
「クロスコミュニティカンファレンス」というだけあり、Java以外の話題（CouchDBとか名前がありました）もちらほらあったようです。
ただ、最近の他の勉強会やカンファレンスに比べると人が少ない印象でした。
私が参加したセッションは比較的大きな部屋だったせいもあり、40～50人くらい入っていたと思うのですが、ガラガラな印象でした。良い意味で、Javaも安定してきているため、参加者が少なかったのかなぁと
あとは、年齢層がHadoopなどに比べると高めかなぁという印象（かく言う私も年齢層を上げている一人ですが。。。）。Javaも長いですからねぇ。
午前中から参加していると違った印象だったかもしれないですが。。。
あと、初めて行った会場で、しかも大きめの施設でした。午後の途中から行ったせいもあるかもしれないですが、
案内が出ていなくて若干迷子に。。。
ただ、セッションの部屋自体は各席に机があり、電源も比較的多めにあったので、PC持ち込みでメモを取るには最適でした。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>lucene-gosenで文章からキーワード抽出（イレギュラー？）(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/10/12/lucene-gosen%E3%81%A7%E6%96%87%E7%AB%A0%E3%81%8B%E3%82%89%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89%E6%8A%BD%E5%87%BA%E3%82%A4%E3%83%AC%E3%82%AE%E3%83%A5%E3%83%A9%E3%83%BC/</link>
      <pubDate>Wed, 12 Oct 2011 12:17:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/10/12/lucene-gosen%E3%81%A7%E6%96%87%E7%AB%A0%E3%81%8B%E3%82%89%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89%E6%8A%BD%E5%87%BA%E3%82%A4%E3%83%AC%E3%82%AE%E3%83%A5%E3%83%A9%E3%83%BC/</guid>
      <description>&lt;p&gt;昨日、文章から特定の単語（リストあり）を探したいという話を聞き、lucene-gosenでもできるねぇという話になりました。
まぁ、考えてみればごくごく当たり前なのですが。。。（その筋の方たちにしてみれば常識なのかもしれないですが。。。）
一応やってみたので、こんなこともできるなという一例ですということで、記録を残しておきます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;昨日、文章から特定の単語（リストあり）を探したいという話を聞き、lucene-gosenでもできるねぇという話になりました。
まぁ、考えてみればごくごく当たり前なのですが。。。（その筋の方たちにしてみれば常識なのかもしれないですが。。。）
一応やってみたので、こんなこともできるなという一例ですということで、記録を残しておきます。&lt;/p&gt;
&lt;p&gt;今回の例文として&lt;a href=&#34;http://www.kantei.go.jp/jp/noda/statement/201109/13syosin.html&#34;&gt;野田首相の所信表明演説の一部&lt;/a&gt;を活用させてもらいます。
単語のリストは次のようにします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;内閣総理大臣&lt;/li&gt;
&lt;li&gt;正心誠意&lt;/li&gt;
&lt;li&gt;東日本&lt;/li&gt;
&lt;li&gt;日本&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回も結果をわかりやすくするためにSolrのanalysis画面を利用します。
作業手順は以下のとおり。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;dictionary.csvの編集&lt;/li&gt;
&lt;li&gt;辞書のコンパイル&lt;/li&gt;
&lt;li&gt;fieldTypeの定義（Solrのschema.xmlの設定）&lt;/li&gt;
&lt;li&gt;文章からキーワード抽出（Solrのanalysis画面）&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
### **1.dictionary.csvの編集**
今回はnaist-chasenディレクトリで作業します。
なお、今回利用するlucene-gosenは[ここ](http://johtani.jugem.jp/?eid=21)で紹介した辞書分離バージョンです。（はやくtrunkにコミットせねば。。。）
dictionary.csvを先ほど上げた単語だけのエントリに変更します。
キーワードだけを抽出したいので、他の単語は必要ないからです。
```
&lt;p&gt;&amp;ldquo;内閣総理大臣&amp;rdquo;,1,名詞,一般,&lt;em&gt;,&lt;/em&gt;,&lt;em&gt;,&lt;/em&gt;,&amp;ldquo;内閣総理大臣&amp;rdquo;,&amp;ldquo;ナイカクソウリダイジン&amp;rdquo;,&amp;ldquo;ナイカクソウリダイジン&amp;rdquo;
&amp;ldquo;正心誠意&amp;rdquo;,1,名詞,一般,&lt;em&gt;,&lt;/em&gt;,&lt;em&gt;,&lt;/em&gt;,&amp;ldquo;正心誠意&amp;rdquo;,&amp;ldquo;セイシンセイイ&amp;rdquo;,&amp;ldquo;セイシンセイイ&amp;rdquo;
&amp;ldquo;東日本&amp;rdquo;,1,名詞,一般,&lt;em&gt;,&lt;/em&gt;,&lt;em&gt;,&lt;/em&gt;,&amp;ldquo;東日本&amp;rdquo;,&amp;ldquo;ヒガシニホン&amp;rdquo;,&amp;ldquo;ヒガシニホン&amp;rdquo;
&amp;ldquo;日本&amp;rdquo;,1,名詞,一般,&lt;em&gt;,&lt;/em&gt;,&lt;em&gt;,&lt;/em&gt;,&amp;ldquo;日本&amp;rdquo;,&amp;ldquo;ニホン&amp;rdquo;,&amp;ldquo;ニホン&amp;rdquo;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;/div&amp;gt;

&amp;lt;div&amp;gt;
### **2.辞書のコンパイル**
先ほど作成した辞書をコンパイルし、lucene-gosen用バイナリ辞書を作成します。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;$ cd $LUCENE_GOSEN_HOME¥dictionary
$ ant -Ddictype=naist-chasen clean-sen compile&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;/div&amp;gt;

&amp;lt;div&amp;gt;
### **3.fieldTypeの定義（Solrのschema.xmlの設定）**
Solrのschema.xmlにlucene-gosenを利用するフィールドタイプを定義します。
追加するのは次の通り
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;fieldType name=&amp;quot;text_ja&amp;quot; class=&amp;quot;solr.TextField&amp;quot; positionIncrementGap=&amp;quot;100&amp;quot; autoGeneratePhraseQueries=&amp;quot;false&amp;quot;&amp;amp;gt;
  &amp;lt;analyzer&amp;amp;gt;
    &amp;lt;tokenizer class=&amp;quot;solr.JapaneseTokenizerFactory&amp;quot; compositePOS=&amp;quot;compositePOS.txt&amp;quot; dictionaryDir=&amp;quot;keyword-dic&amp;quot;/&amp;amp;gt;
    &amp;lt;filter class=&amp;quot;solr.JapanesePartOfSpeechKeepFilterFactory&amp;quot; tags=&amp;quot;keeptags_ja.txt&amp;quot; enablePositionIncrements=&amp;quot;true&amp;quot;/&amp;amp;gt;
  &amp;lt;/analyzer&amp;amp;gt;
&amp;lt;/fieldType&amp;amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
また、ここで定義しているcompositePOS.txt、keeptags_ja.txtは次のようになります。


compositePOS.txt
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;未知語&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
keeptags_ja.txt
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;名詞-一般&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
未知語がバラバラに出現しないようにして見やすくするためと、必要な単語（今回は「名詞-一般」しか利用しないため。）だけを抽出したいための設定です。

&amp;lt;/div&amp;gt;

&amp;lt;div&amp;gt;
**### 4.文章からキーワード抽出（Solrのanalysis画面）**
あとは、analysis画面で解析して見るだけになります。


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20111012/20111012_2085981.png&#34; alt=&#34;キーワード抽出結果&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20111012/20111012_2085981.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;


ということで、辞書に登録された単語だけが抽出されてますね。
この例ではインデックスに登録となりますが。
ただし、「東日本」「日本」のような一部を含む単語の場合、「東日本」が見つかった場合は「日本」は抽出されません。
あくまでも、ベストな解が見つかるのみという形です。
すべての単語を出したい場合はもう少しやり方を考えたほうがいいかもしれません。
（まぁ、このやり方でキーワードを抽出するかも考えたほうがいいかもしれませんが。。。）

&amp;lt;/div&amp;gt;
最近、頭が硬くなってきてるなぁと実感してしまいました。まぁ、こんな使い方もあるかなぁと。
もっと頭を柔らかくして問題を解けるけるようになりたいなぁと。
&lt;/code&gt;&lt;/pre&gt;</content:encoded>
    </item>
    
    <item>
      <title>「7つの言語　7つの世界」 Io 1日目(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/10/07/7%E3%81%A4%E3%81%AE%E8%A8%80%E8%AA%9E-7%E3%81%A4%E3%81%AE%E4%B8%96%E7%95%8C-io-1%E6%97%A5%E7%9B%AE/</link>
      <pubDate>Fri, 07 Oct 2011 21:22:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/10/07/7%E3%81%A4%E3%81%AE%E8%A8%80%E8%AA%9E-7%E3%81%A4%E3%81%AE%E4%B8%96%E7%95%8C-io-1%E6%97%A5%E7%9B%AE/</guid>
      <description>&lt;p&gt;ちょっと間があいてしまったが、ようやくIoの1日目を終了。
なれない感じの言語なので苦労しました。
&lt;span style=&#34;color:#FF0000&#34;&gt;今回もセルフスタディの私の回答が最後の方に記載されてます。&lt;/span&gt;見たくない人は気をつけてください。
ツッコミ大募集です。コメント欄にどしどしコメントください。そこは違うだろ？こっちのほうがいいのでは？という感じで。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ちょっと間があいてしまったが、ようやくIoの1日目を終了。
なれない感じの言語なので苦労しました。
&lt;span style=&#34;color:#FF0000&#34;&gt;今回もセルフスタディの私の回答が最後の方に記載されてます。&lt;/span&gt;見たくない人は気をつけてください。
ツッコミ大募集です。コメント欄にどしどしコメントください。そこは違うだろ？こっちのほうがいいのでは？という感じで。&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;div&gt;　　スロット、オブジェクトのクローンについて。
　　メッセージとその送信について。
　　あくまでもオブジェクトだけの世界。クローンであり、クラスのインスタンスではない。（まだつかめない。。。）
&lt;/div&gt;
### ○オブジェクト、プロトタイプ、継承
&lt;div&gt;
　　slotNamesで取れないけど、継承してる。クローンで元をコピーしてるだけか？
　　頭文字が大文字かどうかがtypeかどうかの違い。大文字＝type（クラスもどき＝）
　　オブジェクト＝スロットの入れ物
　　オブジェクトのクローン＝オブジェクトのチェーン？（Object ＝＞ Vehicle ＝＞ Car ＝＞ ferrari）
&lt;/div&gt;
&lt;div style=&#34;color:#0000FF&#34;&gt;　　疑問点：
　　　存在しないスロット名をgetSlot()で呼び出したら？＝＞nilが返る
　　　存在しないスロットをメッセージとして送信したら？＝＞Exceptionが出る
&lt;/div&gt;
&lt;h3 id=&#34;メソッド&#34;&gt;○メソッド&lt;/h3&gt;
&lt;div&gt;
　　method()で定義
　　メソッドもオブジェクト＝スロットに入れることができる（まだつかめない。。。）
　　メソッドをスロットから呼び出すと実行される。
&lt;/div&gt;
&lt;h3 id=&#34;リストとマップ&#34;&gt;○リストとマップ&lt;/h3&gt;
&lt;div&gt;
　　リスト、マップは簡単。幾つか（スタックやキュー）のメソッドも用意されてる。
&lt;/div&gt;
&lt;h3 id=&#34;truefalsenilsingleton&#34;&gt;○true、false、nil、singleton&lt;/h3&gt;
&lt;div&gt;
　　cloneメソッドを最定義することでsingletonの動作にする。（言われてみれば当たり前か）
　　Object cloneをオーバーライドすることもできるが、プロセス停止などしないとダメ。（恐るべし。。。）
&lt;/div&gt;
&lt;h3 id=&#34;インタビュー&#34;&gt;○インタビュー&lt;/h3&gt;
&lt;div&gt;
　　SIMD（Single Instruction Multiple Data）http://ja.wikipedia.org/wiki/SIMD
&lt;/div&gt;
&lt;h3 id=&#34;やりながら感想&#34;&gt;やりながら感想：&lt;/h3&gt;
&lt;div&gt;
　　シンタックスが全然違うのでかなり戸惑い。
　　ただ、考え方はシンプル。slotとか。
　　まだ、予約語がわかってない（cloneとかprintとかslotNamesとか）ので。
&lt;/div&gt;
&lt;h2 id=&#34;セルフスタディ&#34;&gt;★セルフスタディ&lt;/h2&gt;
&lt;h3 id=&#34;探してみよう&#34;&gt;（探してみよう）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;○Ioのいくつかの問題点の例&lt;/strong&gt;
&lt;span style=&#34;color:#FF0000&#34;&gt;　　見つけられず。。。英語がダメダメ。。。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;○質問に答えてくれるIoコミュニティ&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;
　　ML：http://tech.groups.yahoo.com/group/iolanguage/
　　twitter：http://twitter.com/#!/iolanguage
&lt;/div&gt;
**○Ioのイディオムに関するスタイルガイド**
&lt;div&gt;
　　Io Note（英語）
　　　[http://iota.flowsnake.org/](http://iota.flowsnake.org/)
　　Ioプログラミングガイド
　　　[http://iolanguage.com/scm/io/docs/IoGuide.html](http://iolanguage.com/scm/io/docs/IoGuide.html)
　　　[http://xole.net/docs/IoGuide_ja.html](http://xole.net/docs/IoGuide_ja.html)（日本語）
　　Ioスタイルガイド
　　　[http://en.wikibooks.org/wiki/Io_Programming/Io_Style_Guide](http://en.wikibooks.org/wiki/Io_Programming/Io_Style_Guide)
　　　[http://d.hatena.ne.jp/katzchang/20080819/p1](http://d.hatena.ne.jp/katzchang/20080819/p1)（日本語訳してくれてるブログ）
&lt;/div&gt;
&lt;h3 id=&#34;確認してみよう&#34;&gt;（確認してみよう）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;○1 + 1を評価してから、1 + &amp;ldquo;one&amp;quot;を評価する。Ioは強く型付けされた言語か？&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;
　　```
&lt;p&gt;Io&amp;gt; 1 + 1
==&amp;gt; 2
Io&amp;gt; 1 + &amp;ldquo;one&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;exception-argument-0-to-method--must-be-a-number-not-a-sequence&#34;&gt;Exception: argument 0 to method &amp;lsquo;+&amp;rsquo; must be a Number, not a &amp;lsquo;Sequence&amp;rsquo;&lt;/h2&gt;
&lt;p&gt;message &amp;lsquo;+&amp;rsquo; in &amp;lsquo;Command Line&amp;rsquo; on line 1&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ということで、型付けは強いです。
&amp;lt;/div&amp;gt;

**○0は真か偽か？空文字列はどうか？nilは真か偽か？**
&amp;lt;div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Io&amp;gt; 0
==&amp;gt; 0
Io&amp;gt; true and 0
==&amp;gt; true
Io&amp;gt; true and &amp;quot;&amp;rdquo;
==&amp;gt; true
Io&amp;gt; &amp;quot;&amp;quot;
==&amp;gt;
Io&amp;gt; true and nil
==&amp;gt; false
Io&amp;gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;0、空文字列はtrue、nilはfalseでした。
&amp;lt;/div&amp;gt;

**○プロトタイプに存在するスロットを確認するにはどうすればよいか？**

&amp;lt;div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Io&amp;gt; Highlander := Object clone
==&amp;gt;  Highlander_0x1a233a0:
type             = &amp;ldquo;Highlander&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Io&amp;gt; hoge := Highlander clone
==&amp;gt;  Highlander_0x1a83630:&lt;/p&gt;
&lt;p&gt;Io&amp;gt; hoge proto slotNames
==&amp;gt; list(type)
Io&amp;gt; Highlander name := &amp;ldquo;arnold&amp;rdquo;
==&amp;gt; arnold
Io&amp;gt; hoge slotNames
==&amp;gt; list()
Io&amp;gt; hoge proto slotNames
==&amp;gt; list(type, name)
Io&amp;gt; Highlander slotNames
==&amp;gt; list(type, name)
Io&amp;gt; hoge name
==&amp;gt; arnold
Io&amp;gt; hoge getSlot(&amp;ldquo;name&amp;rdquo;)
==&amp;gt; arnold&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;こんな感じ。slotNamesでスロット名を確認し、スロット内部についてはgetSlotで確認できます。
&amp;lt;/div&amp;gt;
**○等号（=）、コロン等号（:=）および、コロンコロン等号（::=）の違いはなにか？どのようなときに使うか？**
&amp;lt;div&amp;gt;
&amp;lt;table class=&amp;#34;list_view&amp;#34;&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;th&amp;gt;演算子&amp;lt;/th&amp;gt;
&amp;lt;th&amp;gt;説明&amp;lt;/th&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr class=&amp;#34;spec&amp;#34;&amp;gt;
&amp;lt;td&amp;gt;:::=&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;スロットへの代入＋setterの追加&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr class=&amp;#34;specalt&amp;#34;&amp;gt;
&amp;lt;td class=&amp;#34;alt&amp;#34;&amp;gt;:=&amp;lt;/td&amp;gt;
&amp;lt;td class=&amp;#34;alt&amp;#34;&amp;gt;スロットへの代入&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr class=&amp;#34;spec&amp;#34;&amp;gt;
&amp;lt;td&amp;gt;=&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;スロットへの代入（ただし、スロットが存在しない場合は例外が発生）&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
とまぁ、記載したが、実際に動かして確認しました。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Io&amp;gt; Highlander := Object clone
==&amp;gt;  Highlander_0x223b800:
type             = &amp;ldquo;Highlander&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Io&amp;gt; hoge := Highlander clone
==&amp;gt;  Highlander_0x21acd60:&lt;/p&gt;
&lt;p&gt;Io&amp;gt; hoge slotNames
==&amp;gt; list()
Io&amp;gt; hoge name ::= &amp;ldquo;arnold&amp;rdquo;
==&amp;gt; arnold
Io&amp;gt; hoge slotNames
==&amp;gt; list(setName, name)
Io&amp;gt; hoge sword := &amp;ldquo;long sword&amp;rdquo;
==&amp;gt; long sword
Io&amp;gt; hoge slotNames
==&amp;gt; list(setName, name, sword)
Io&amp;gt; hoge clothes = &amp;ldquo;armor&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;updating&#34;&gt;Exception: Slot clothes not found. Must define slot using := operator before
updating.&lt;/h2&gt;
&lt;p&gt;message &amp;lsquo;updateSlot&amp;rsquo; in &amp;lsquo;Command Line&amp;rsquo; on line 1&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;/div&amp;gt;

### （試してみよう）
**○ファイルからIoプログラムを実行せよ**
&amp;lt;div&amp;gt;
ファイル「great.io」を作成し、以下を入力。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Highlander := Object clone
Highlander giveWarCry := &amp;ldquo;Woooooooo!!&amp;rdquo; println
Highlander giveWarCry()&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;で、以下のコマンドを実行する。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;$ io great.io
Woooooooo!!&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;/div&amp;gt;


**○スロットの名前を指定して格納されているコードを実行せよ**
&amp;lt;div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Io&amp;gt; Masason := Object clone
==&amp;gt;  Masason_0x20ae7d0:
type             = &amp;ldquo;Masason&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Io&amp;gt; Masason recieveNiceTweet := method(&amp;ldquo;やりましょう&amp;rdquo; println)
==&amp;gt; method(
&amp;ldquo;やりましょう&amp;rdquo; println
)
Io&amp;gt; Masason getSlot(&amp;ldquo;recieveNiceTweet&amp;rdquo;)
==&amp;gt; method(
&amp;ldquo;やりましょう&amp;rdquo; println
)
Io&amp;gt; Masason getSlot(&amp;ldquo;recieveNiceTweet&amp;rdquo;) call
やりましょう
==&amp;gt; やりましょう&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
callとgetSlotが鍵ですね。
&amp;lt;/div&amp;gt;



1日目の途中で間があいてしまったのでシンタックスを忘れてしまう始末。。。
ただ、そんなに込み入った記述もないので、最初に勉強することは少ないかもしれないです。
まだメソッドをあとから追加とか、cloneしたあとにまたプロトタイプを変更して反映可能など、考え方になれないもところがありますが、良い頭の体操になってます。
間を置かずに3日目まで行かないと！！
&lt;/code&gt;&lt;/pre&gt;</content:encoded>
    </item>
    
    <item>
      <title>MBAセットアップ備忘録その４(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/10/07/mba%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E5%82%99%E5%BF%98%E9%8C%B2%E3%81%9D%E3%81%AE%EF%BC%94/</link>
      <pubDate>Fri, 07 Oct 2011 15:25:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/10/07/mba%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E5%82%99%E5%BF%98%E9%8C%B2%E3%81%9D%E3%81%AE%EF%BC%94/</guid>
      <description>&lt;p&gt;久々に、MBAの備忘録です。
あれから色々入れました。
なので、入れたソフトの一覧を追加。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AIR：TweetDeckをインストールするのに必要だったため&lt;/lI&gt;&lt;/li&gt;
&lt;li&gt;TweetDeck（AIR版）：TwitterとFacebookを同じ画面で見ることができるため。&lt;/lI&gt;&lt;/li&gt;
&lt;li&gt;TextWrangler：テキストエディタ（まだあんまり使ってない）&lt;/lI&gt;&lt;/li&gt;
&lt;li&gt;Skitch：Evernoteに買収されて無料に。先日のSolr管理画面の説明書きにもちょっと使用&lt;/lI&gt;&lt;/li&gt;
&lt;li&gt;ClamXav：フリーのセキュリティソフト。&lt;/lI&gt;&lt;/li&gt;
&lt;li&gt;SourceTree：Twitterで知ったMac用のgit、mercurialのクライアントソフト。&lt;a href=&#34;http://blogs.atlassian.jp/2011/10/sourcetree-git-hg-client-by-atlassian-j.html&#34;&gt;AtlassianがSourceTreeを買収したのを機に一時的に無料公開されていたので。&lt;/a&gt;&lt;/lI&gt;&lt;/li&gt;
&lt;li&gt;Firefox：基本はSafariを使ってます。WindowsではChromeを使ってます。ただ、Webページを表示されていない部分もまるごとキャプチャするのにChromeのプラグインだとダメだったので入れました。今のところキャプチャ用のブラウザです。&lt;/lI&gt;&lt;/li&gt;
&lt;li&gt;Full Screen enable for Eclipse on Lion：Eclipseをフルスクリーン対応するためのプラグイン&lt;/lI&gt;&lt;/li&gt;
&lt;li&gt;MercurialEclipse：bitbucketにアカウントをもっているので。&lt;/lI&gt;&lt;/li&gt;
&lt;li&gt;mercurial：pipを使ってインストール。MercurialEclipseでコマンドが必要だから。「sudo pip install Mercurial」&lt;/lI&gt;&lt;/li&gt;
&lt;li&gt;pip：mercurialをインストールするためにインストール。「sudo easy_install pip」でインストール&lt;/lI&gt;&lt;/li&gt;
&lt;li&gt;iStat pro（ウィジェット）：&lt;a href=&#34;http://www.apple.com/jp/downloads/dashboard/status/istatpro.html&#34;&gt;CPUなどの情報を表示するウィジェット&lt;/a&gt;。ウィジェットがアップルのサイト（AppStoreではない）から検索できるというのを人から聞いた。ウィジェットってあんまり使われないのか？&lt;/li&gt;
&lt;li&gt;Mac Blu-ray Player：現時点で有料ソフトはこれだけ。&lt;a href=&#34;http://jp.macblurayplayer.com/index.htm&#34;&gt;こちら。&lt;/a&gt;もともとNASのデータのバックアップ用にBlu-rayのドライブ買ったんですが、せっかくだからMacにも使ってみようと思い、MacでBlu-rayを見るために購入しました。所用で長距離移動もあったので、新幹線で映画見てました。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このくらいです。
ほんとはリンクを貼ればいいのですが、そこまでの元気がないので、ご勘弁を。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;久々に、MBAの備忘録です。
あれから色々入れました。
なので、入れたソフトの一覧を追加。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AIR：TweetDeckをインストールするのに必要だったため&lt;/lI&gt;&lt;/li&gt;
&lt;li&gt;TweetDeck（AIR版）：TwitterとFacebookを同じ画面で見ることができるため。&lt;/lI&gt;&lt;/li&gt;
&lt;li&gt;TextWrangler：テキストエディタ（まだあんまり使ってない）&lt;/lI&gt;&lt;/li&gt;
&lt;li&gt;Skitch：Evernoteに買収されて無料に。先日のSolr管理画面の説明書きにもちょっと使用&lt;/lI&gt;&lt;/li&gt;
&lt;li&gt;ClamXav：フリーのセキュリティソフト。&lt;/lI&gt;&lt;/li&gt;
&lt;li&gt;SourceTree：Twitterで知ったMac用のgit、mercurialのクライアントソフト。&lt;a href=&#34;http://blogs.atlassian.jp/2011/10/sourcetree-git-hg-client-by-atlassian-j.html&#34;&gt;AtlassianがSourceTreeを買収したのを機に一時的に無料公開されていたので。&lt;/a&gt;&lt;/lI&gt;&lt;/li&gt;
&lt;li&gt;Firefox：基本はSafariを使ってます。WindowsではChromeを使ってます。ただ、Webページを表示されていない部分もまるごとキャプチャするのにChromeのプラグインだとダメだったので入れました。今のところキャプチャ用のブラウザです。&lt;/lI&gt;&lt;/li&gt;
&lt;li&gt;Full Screen enable for Eclipse on Lion：Eclipseをフルスクリーン対応するためのプラグイン&lt;/lI&gt;&lt;/li&gt;
&lt;li&gt;MercurialEclipse：bitbucketにアカウントをもっているので。&lt;/lI&gt;&lt;/li&gt;
&lt;li&gt;mercurial：pipを使ってインストール。MercurialEclipseでコマンドが必要だから。「sudo pip install Mercurial」&lt;/lI&gt;&lt;/li&gt;
&lt;li&gt;pip：mercurialをインストールするためにインストール。「sudo easy_install pip」でインストール&lt;/lI&gt;&lt;/li&gt;
&lt;li&gt;iStat pro（ウィジェット）：&lt;a href=&#34;http://www.apple.com/jp/downloads/dashboard/status/istatpro.html&#34;&gt;CPUなどの情報を表示するウィジェット&lt;/a&gt;。ウィジェットがアップルのサイト（AppStoreではない）から検索できるというのを人から聞いた。ウィジェットってあんまり使われないのか？&lt;/li&gt;
&lt;li&gt;Mac Blu-ray Player：現時点で有料ソフトはこれだけ。&lt;a href=&#34;http://jp.macblurayplayer.com/index.htm&#34;&gt;こちら。&lt;/a&gt;もともとNASのデータのバックアップ用にBlu-rayのドライブ買ったんですが、せっかくだからMacにも使ってみようと思い、MacでBlu-rayを見るために購入しました。所用で長距離移動もあったので、新幹線で映画見てました。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このくらいです。
ほんとはリンクを貼ればいいのですが、そこまでの元気がないので、ご勘弁を。&lt;/p&gt;
&lt;p&gt;Skitchがおすすめです。簡単に画像編集＋説明書きが入れられて、矢印などがよくある画像編集の野暮ったさがないので、画面キャプチャに説明書くのに今後活躍する予定です。&lt;/p&gt;
&lt;p&gt;あと、ソフトではなく、サービスなのですが、&lt;a href=&#34;https://cacoo.com/&#34;&gt;Cacoo&lt;/a&gt;というサービスが便利です。
ここ最近、ちょっとした作図にはこのサービスを使うようにしています。オンラインで利用できるので、いろんな場所で編集できます。
また、図の作成もさることながら、図を共有することが可能です。
先日は、lucene-gosenが思ったように動かないという相談を受けて、このCacooでanalysis画面や設定を貼ってもらったりしながら使いました。結構便利ですね。
ただ、付属のチャットを使ったのですが、このチャットの内容がテキスト形式でコピー出来なかったのが残念でした。今後の改修に期待ということで。&lt;/p&gt;
&lt;p&gt;あと、セットアップとは少し違いますが、ジャケット買ってつけました。
ステッカーを直接貼るのがちょっと気になったので、ジャケットつけてステッカーを貼ってます。
ただ、ステッカーは思ったよりチープな感じが。。。ジャケットの中に貼らないとダメだったかも。まぁ、それが嫌でジャケット買ったんですが。。。
&lt;div class=&#34;amazon-shortcode-box&#34;&gt;
  &lt;div class=&#34;amazon-shortcode-image&#34;&gt;
    &lt;a style=&#34;display: inline-block;&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B0057BZK8Y/?tag=johtani-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://m.media-amazon.com/images/I/21jC&amp;#43;b4zj2L._SL160_.jpg&#34; &gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&#34;amazon-shortcode-info&#34;&gt;
    &lt;p class=&#34;amazon-shortcode-title&#34;&gt;
      &lt;a target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; href=&#34;https://www.amazon.co.jp/gp/product/B0057BZK8Y/?tag=johtani-22&#34;&gt;
      エアージャケットセット for Macbook Air 13inch(クリア)PMC-81
      &lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Solrの新しい管理画面（Solr4.x trunk系）(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/10/05/solr%E3%81%AE%E6%96%B0%E3%81%97%E3%81%84%E7%AE%A1%E7%90%86%E7%94%BB%E9%9D%A2solr4-x-trunk%E7%B3%BB/</link>
      <pubDate>Wed, 05 Oct 2011 19:43:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/10/05/solr%E3%81%AE%E6%96%B0%E3%81%97%E3%81%84%E7%AE%A1%E7%90%86%E7%94%BB%E9%9D%A2solr4-x-trunk%E7%B3%BB/</guid>
      <description>&lt;p&gt;Lucene/SolrのMLでSolrの管理画面を新しくするというチケットが流れていたのでちょっと触って見ました。
ほんとにちょっと触っただけですが、いくつかキャプチャ撮ってみたので、アップしときます。
※以下ではサムネイル画像に元画像（100Kくらいの画像）へのリンクが設定されています。携帯などでは見づらいかもしれませんが、ご容赦を。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Lucene/SolrのMLでSolrの管理画面を新しくするというチケットが流れていたのでちょっと触って見ました。
ほんとにちょっと触っただけですが、いくつかキャプチャ撮ってみたので、アップしときます。
※以下ではサムネイル画像に元画像（100Kくらいの画像）へのリンクが設定されています。携帯などでは見づらいかもしれませんが、ご容赦を。&lt;/p&gt;
&lt;p&gt;URLは旧管理画面とことなり、http://localhost:8983/solr/になります。&lt;/p&gt;
&lt;hr&gt;


&lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.johtani.info/css/hugo-easy-gallery.min.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20111005/20111005_2075207.jpg&#34; alt=&#34;新管理画面：トップ画面&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20111005/20111005_2075207.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
まずはトップ画面
ダッシュボードと呼ばれるトップ画面。メモリの利用率や起動してからの時間、Luceneなどのバージョンが表示されます。&lt;br style=&#34;clear:both&#34; /&gt;
&lt;br style=&#34;clear&#34;&gt;
&lt;hr&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20111005/20111005_2075141.png&#34; alt=&#34;新管理画面：クエリ実行結果&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20111005/20111005_2075141.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
次は検索画面すっきりしてます。facetが指定できるようになったのは大きいかな。ただし、facet.fieldを複数指定などができないが。結果についてはとくに指定がなければXMLで帰ってきます。ただ、パラメータの追加ができなくなってる気がするなぁ&lt;br style=&#34;clear:both&#34; /&gt;
&lt;br style=&#34;clear&#34;/&gt;
&lt;hr&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20111005/20111005_2075230.png&#34; alt=&#34;新管理画面：クエリ接続エラー&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20111005/20111005_2075230.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
ちなみに、Solrを止めて検索したらこんな感じの画面になりました。クエリの実行ならこのようにエラーがわかったのですが、停止後に左のメニューにあるSchemaなどをクリックしても白い画面が出るだけで、エラーかどうかがわかりにくいです。&lt;br style=&#34;clear:both&#34; /&gt;
&lt;br style=&#34;clear&#34;/&gt;
&lt;hr&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20111005/20111005_2075122.png&#34; alt=&#34;新管理画面：Analysisのサンプル（lucene-gosen）&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20111005/20111005_2075122.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
Analysis画面。入力画面がシンプルになりました。フィールド名はリストで表示されるので選択するだけです。あとは、これまでどおり。サンプルはlucene-gosenの解析結果です。ハイライトもきちんと表示されます。ただし、長い文章の場合は結果部分だけがスクロールできる形になり、ちょっとわかりにくかったです。&lt;br style=&#34;clear:both&#34; /&gt;
&lt;br style=&#34;clear&#34;/&gt;
&lt;hr&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20111005/20111005_2075142.png&#34; alt=&#34;新管理画面：Analysis失敗&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20111005/20111005_2075142.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
Analysisの入力画面を表示したあとにSolrを停止して解析してみたらこんなエラー画面が出ました。ちなみに、その後、画面を切り替えずにSolrを起動して解析したら、赤い帯のエラーは出たままでした。一度別画面にすれば、元に戻りますが。&lt;br style=&#34;clear:both&#34; /&gt;
&lt;br style=&#34;clear&#34;/&gt;
&lt;hr&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20111005/20111005_2075140.png&#34; alt=&#34;新管理画面：キャッシュの状態確認&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20111005/20111005_2075140.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
Pluginsの画面（旧管理画面のstatisticsに相当）。
キャッシュの状態が確認できます。今まであった画面と情報的には一緒かと。一段カテゴリ（CACHEとかCOREとか）の選択ができるようになり、見やすくなりました。
&lt;br style=&#34;clear:both&#34; /&gt;
&lt;br style=&#34;clear&#34;/&gt;
&lt;hr&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20111005/20111005_2075143.png&#34; alt=&#34;新管理画面：updatehandlerの状態。ドキュメント数とか&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20111005/20111005_2075143.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
同じくPluginsの画面。
こちらはupdateHandlerについての情報です。commit数やoptimizeの回数、updateして、commitする前の状態のドキュメント数などが表示されます。前より表示される項目が多くなってるかな？&lt;br style=&#34;clear:both&#34; /&gt;
&lt;br style=&#34;clear&#34;/&gt;
&lt;hr&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20111005/20111005_2075208.jpg&#34; alt=&#34;新管理画面：スキーマブラウザ&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20111005/20111005_2075208.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
最後はスキーマブラウザこの画面が一番良くなっています。旧管理画面では、フィールド名がすべて大文字で表示され、しかもソートがされていない状態だったため、ダイナミックフィールドを利用しているとフィールドを探すのが一苦労でした。
今回は、プルダウンでフィールドやフィールドタイプのリストが表示され、辞書順で並んでいます。Filterなどもわかりやすい表示になっているかと。
&lt;br style=&#34;clear:both&#34; /&gt;
&lt;br style=&#34;clear&#34;/&gt;
&lt;hr&gt;
おまけ


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20111005/20111005_2075181.png&#34; alt=&#34;Solritasと呼ばれるサンプル画面&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20111005/20111005_2075181.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
Solritasと呼ばれるVelocityを使った、3.x系で入ってきた新しいサンプル画面です。URLはhttp://localhost:8983/solr/browseです。ファセットなどを使った簡単なサンプル画面なので、検索結果画面でこんなことができるというデモにも使えるかと。ただ、これも旧管理画面よりはましですが、デザインが。。。&lt;br style=&#34;clear:both&#34; /&gt;
&lt;p&gt;とまぁ、簡単ですが、4.x系の管理画面をいくつか触ってみて、キャプチャをとって見ました。
デザインは前よりもすっきりしています。ただ、クエリについてはパラメータの追加ができなくなっているので、もう少し改良されるといいかなぁ（自分でやれよと言われそうですが。。。）&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>New SolrCloud Designの翻訳（その2）(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/10/04/new-solrcloud-design%E3%81%AE%E7%BF%BB%E8%A8%B3%E3%81%9D%E3%81%AE2/</link>
      <pubDate>Tue, 04 Oct 2011 18:32:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/10/04/new-solrcloud-design%E3%81%AE%E7%BF%BB%E8%A8%B3%E3%81%9D%E3%81%AE2/</guid>
      <description>&lt;p&gt;遅くなりましたが、続きです。
さらに英語力のなさを痛感して凹んでいるところですが、何かの役に立てばと恥を晒すところです。。。&lt;/p&gt;
&lt;p&gt;一応、訳してみたのですが、訳すのに必死になってしまい、つながりがわかっていない点もちらほら。
このあと一旦見直しつつ、再度理解する「理解編」をアップしようかと思います。
できれば、シーケンス図とかも交えつつ。（そうしないと理解ができない可能性が。。。）
前回同様、原文は最後に付加しておきます。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;遅くなりましたが、続きです。
さらに英語力のなさを痛感して凹んでいるところですが、何かの役に立てばと恥を晒すところです。。。&lt;/p&gt;
&lt;p&gt;一応、訳してみたのですが、訳すのに必死になってしまい、つながりがわかっていない点もちらほら。
このあと一旦見直しつつ、再度理解する「理解編」をアップしようかと思います。
できれば、シーケンス図とかも交えつつ。（そうしないと理解ができない可能性が。。。）
前回同様、原文は最後に付加しておきます。&lt;/p&gt;
&lt;h3 id=&#34;boot-strapping&#34;&gt;Boot Strapping&lt;/h3&gt;
&lt;h4 id=&#34;cluster-startupクラスタの起動&#34;&gt;Cluster Startup（クラスタの起動）&lt;/h4&gt;
&lt;p&gt;ノードはZookeeperのホストとポートを指定することから始めます。
クラスタの最初のノードはクラスタのschema/configとクラスタの設定を指定するとこから開始します。
最初のノードはZookeeperに設定をアップロードしてクラスタをブートします。
クラスタは「ブートストラップ」状態です。
この状態ではノード-&amp;gt;パーティションマッピングは計算されず、クラスタはクラスタ管理コマンド以外のどんなread/writeリクエストも受け付けません。&lt;/p&gt;
&lt;p&gt;クラスタの最初のノード集合が起動した後、クラスタ管理コマンド（TBD記述？？？）が管理者によって発行されます。このコマンドは整数「partitions」パラメータを受け取り、次のステップを実行します。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cluster Lockを取得&lt;/li&gt;
&lt;li&gt;「partitions」をパーティション数として割り当て&lt;/li&gt;
&lt;li&gt;各パーティションのためのノードを取得&lt;/li&gt;
&lt;li&gt;ZooKeeperのノード-&amp;gt;パーティションマッピングを更新&lt;/li&gt;
&lt;li&gt;Cluster Lockをリリース&lt;/li&gt;
&lt;li&gt;全ノードに対して最新版のノード-&amp;gt;パーティションマッピングをZooKeeper経由で更新させる&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;node-startup&#34;&gt;&lt;strong&gt;Node Startup&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;ノードが起動すると、自分がすでに存在するシャードの一部かどうかZooKeeperでチェックします。
もし、ZooKeeperがノードのレコードを持っていない、またはどのシャードの一部でもないと判断したら、
ノードは後述の「New Node」のステップを実行します。すでに存在するノードの場合は後述の「Node Restart」のステップを実行します。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;New Node&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;新しいノードはクラスタの一部ではなく、クラスタのキャパシティを増強するためのものです。&lt;/p&gt;
&lt;p&gt;「auto_add_new_nodes」クラスタプロパティが「false」の場合、新しいノードはZooKeeperに「idle」として登録され、他のノードが参加してくれと言うまで待機します。
そうでない場合（auto_add_new_nods=true）は次のステップを実行します。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cluster Lockを取得します。&lt;/li&gt;
&lt;li&gt;適切なnode-&amp;gt;partitionエントリを選び出します。&lt;/li&gt;
&lt;li&gt;利用可能なパーティションのリストをスキャンして「replication_factor」のノード数以下のパーティションのエントリを探します。複数ある場合はノード数が最小のエントリを選びます。それも一緒ならランダムに選びます。&lt;/li&gt;
&lt;li&gt;全パーティションが「replication_factor」以上のノードを持っている場合、ノードはパーティションが最も多いものをスキャンします。複数ある場合はパーティション内のドキュメント数が最大のエントリを選びます。ドキュメント数が同一なら任意のエントリを選びます。&lt;/li&gt;
&lt;li&gt;もし、選んだノード-&amp;gt;パーティションエントリを現在のノードに移動させることでがクラスタのパーティション：ノード比率の最大値を小さくするなら、現在のエントリを返します。。それ以外の場合選ばれたエントリがないので、アルゴリズムは終了です。。&lt;/li&gt;
&lt;li&gt;ZooKeeper内のノード-&amp;gt;パーティションマッピングを更新します&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;ZooKeeper内のノードステータスを「リカバリ」状態にします&lt;/li&gt;
&lt;li&gt;Cluster Lockをリリースします&lt;/li&gt;
&lt;li&gt;「リカバリ」はパーティションのリーダーから開始します。&lt;/li&gt;
&lt;li&gt;リカバリが終了したら、再度、Cluster Lockを取得します。&lt;/li&gt;
&lt;li&gt;元のエントリはZooKeeperのノード-&amp;gt;パーティションマッピングから削除されます。&lt;/li&gt;
&lt;li&gt;Cluster Lockをリリースします&lt;/li&gt;
&lt;li&gt;元のノードはZooKeeperからノード-&amp;gt;パーティションマッピングを更新させられます&lt;/li&gt;
&lt;li&gt;ステップ1に戻ります。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;node-restart&#34;&gt;&lt;strong&gt;Node Restart&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;ノードの再起動とは次のいずれかを意味しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JVMがクラッシュし、手動または自動でのリスタート&lt;/li&gt;
&lt;li&gt;ノードが一時的にネットワークから切り離された。もしくは、ZooKeeperに接続できなかった（死んでいると思われた）。または、ある一定期間、リーダーからの更新を受信できなかった。&lt;/li&gt;
&lt;li&gt;このシナリオが表す書き込み処理のライフサイクルの間にネットワークから分断された&lt;/li&gt;
&lt;li&gt;ハード故障もしくはメンテナンスウインドウによりクラスタからノードが分断され、ノードをクラスタにrejoinさせるために起動した。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ノードが各パーティションに対してメンバーであるパーティションのリストを読み、パーティションのリーダーがリカバリプロセスを実行する。その時、ノードは「auto_add_new_nods」プロパティをチェックして、「New Node」処理のステップを実行する。
これはクラスタが。。。（元の文章が切れてて意味が不明）&lt;/p&gt;
&lt;p&gt;クライアントは標準的なSolrの更新形式を利用して書き込みできます。
書き込み処理はクラスタの任意のノードに送信されます。
ノードはハッシュ関数を利用して、どのパーティションに所属するか決めるためにrange-パーティションマッピングを使います。
ZooKeeperはシャードのリーダーを識別して、書き込み処理をそこに送ります。
SolrJはリーダーに対して書き込みを直接送信するための拡張がされています。&lt;/p&gt;
&lt;p&gt;リーダーはPartitionバージョンの操作を割り当て、そのトランザクションログの操作を書き込み、シャードに属する他のノードにドキュメントバージョンハッシュを転送します。
ノードはインデックスにドキュメントハッシュを書き込み、トランザクションログに操作を記録します。
リーダーは、min_writesの最小数のノード以上のノードが「OK」とレスポンスを返したら「OK」とレスポンスを返します。
クラスタプロパティのmin_writesは書き込みリクエスト時に指定することで、異なる値を指定できます。&lt;/p&gt;
&lt;p&gt;クラウドモードはコミット/ロールバック操作を明示的には行いません。
コミットは特定の間隔で（commit_within）リーダーによりオートコミットにより管理されます。
また、シャードの全メンバーのコミットはトリガーにより管理されます。
ノードが利用可能な最新バージョンはコミットの時点で記録されます。&lt;/p&gt;
&lt;h3 id=&#34;transaction-log&#34;&gt;&lt;strong&gt;Transaction Log&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;トランザクションログは2つのコミットの間にインデックスに対して実行された操作全てを記録したもの&lt;/li&gt;
&lt;li&gt;コミットはそれ以前に実行された操作の耐久性を保証するために、新しいトランザクションログを開始します。&lt;/li&gt;
&lt;li&gt;同期は調整が可能です。例えば、flush vs fsynです。fsyncがデフォルトで、JVMクラッシュに対して保証できるが、電源異常の場合には保証できないが、速度的には早いです。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;recovery&#34;&gt;Recovery&lt;/h3&gt;
&lt;p&gt;次のトリガーにより復旧が可能です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bootstrap&lt;/li&gt;
&lt;li&gt;パーティション分割&lt;/li&gt;
&lt;li&gt;クラスタの再構築&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ノードは自身に「recovering」というステータスを設定して復旧を開始します。
このフェーズの間、ノードは読み込みリクエストを受けることができませんが、トランザくkションログに書きこまれるすべての新しい書き込みリクエストを受け取ります。
ノードは自身が持つインデックスのバージョンを調べて、パーティションの最新バージョンのリーダーに問い合わせます。
リーダーはシャード内の残りのノードと同期する前に実行されるべき操作の集合を返します（？？？）。&lt;/p&gt;
&lt;p&gt;最初にインデックスをコピーし、最新のノードにあるトランザクションログをリプレイします。
もし、インデックスのコピーが必要ならば、インデックスファイルをローカルにまずコピーし、その後トランザクションログをリプレイします。
トランザクションログのリプレイは通常の書き込みリクエストの流れと同じです。
この時、ノードは新しい書き込みを受け付けるかもしれません。その書き込みはインデックスに再生されるべきです。
ある時点でノードは最新のコミットポイントに追いつき、自身のステータスを「ready」にします。
この時点で、このノードは読み込みリクエストを処理できます。&lt;/p&gt;
&lt;h4 id=&#34;handling-node-failures&#34;&gt;Handling Node Failures&lt;/h4&gt;
&lt;p&gt;一時的にネットワークが分断され、幾つかのノードとZooKeeperの間の通信が遮断されるかもしれません。
クラスタはデータの再構築（リバランシング）の前にしばらく待ちが発生します。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Leader failure&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ノードが故障し、もしそれがシャードのリーダだった場合、他のメンバーがリーダー選出のプロセスを開始します。
新しいリーダーが選出されるまで、このパーティションへの書き込みは受け付けられません。
この時、これはリーダー以外の故障ステップを処理します。（？？？）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Leader failure&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;シャードの一部に新しいノードが割り当てられる前にリーダーはmin_reaction_timeの間待ちます。
リーダーはCluster Lockを取得し、シャードの新規メンバーとしてノードを割り当てるためのノード-シャード割り当てアルゴリズムを使用します。
ZooKeeperのノード-&amp;gt;パーティションマッピングが更新され、Cluster Lockがリリースされます。
新しいノードはZooKeeperからノード-&amp;gt;パーティションマッピングを強制的にリロードされます。&lt;/p&gt;
&lt;h3 id=&#34;splitting-partitions&#34;&gt;Splitting partitions&lt;/h3&gt;
&lt;p&gt;明示的なクラスタ管理コマンドもしくはSolrによる自動的な分割戦略（ストラテジ）はパーティションを分割することができます。
明示的な分割コマンド（split command）は対象となるパーティションを分割するために実行されます。&lt;/p&gt;
&lt;p&gt;パーティションXが100から199のハッシュの範囲を持つものとし、X（100から149）、Y（150～199）に分割するとします。
Xのリーダーは、XとYの新しい値の範囲をZooKeeperに分割アクションを記録します。
ノードはこの分割アクションもしくは新しいパーティションの存在については通知を受けません。（？？？）&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;XのリーダはCluster Lockを取得し、パーティションY（アルゴリズムはto be determined）を割り当てるノードを決定し、新しいパーティションを知らせ、パーティション-&amp;gt;ノードマッピングを更新します。Xのリーダはノードのレスポンスを街、新しいパーティションがコマンドを受付可能な状態になったら次の処理を実行します。&lt;/li&gt;
&lt;li&gt;Xのリーダーは分割が完了するまですべてのコミットを停止します。&lt;/li&gt;
&lt;li&gt;Xのリーダーは最新のコミットポイント（バージョンVとする）のIndexReaderをオープンし、同じバージョンのIndexReaderもオープンするように命じます&lt;/li&gt;
&lt;li&gt;XのリーダーはYのリーダーに対してバージョンV以降のトランザクションログのうちハッシュ値の範囲が150から199のものを流します。&lt;/li&gt;
&lt;li&gt;Yのリーダーはトランザクションログの#2（#3の間違い？）で送られたリクエストだけを記録します？？？&lt;/li&gt;
&lt;li&gt;Xのリーダーはステップ#2で開いたIndexReaderに対してインデックスの分割を開始します。&lt;/li&gt;
&lt;li&gt;#5で作成されたインデックスはYのリーダーに送られ、登録されます。&lt;/li&gt;
&lt;li&gt;Yのリーダーは「recovery」プロセスを開始するように（シャードの）他のノード命令し、インデックスのトランザクションログを再生し始めます。&lt;/li&gt;
&lt;li&gt;パーティションYのすべてのノードがバージョンVに到達したならば&lt;/li&gt;
&lt;li&gt;YのリーダーはXのリーダーに#2で作成されたReaderの上に、ハッシュの範囲が100から149だけに属しているドキュメントを抽出するようにするFilteredIndexReaderを準備するように頼みます。&lt;/li&gt;
&lt;li&gt;Xのリーダーは#8aのリクエストが完了したのを検知したら、YのリーダーがCluster Lockを取得し、クラスタ全体の検索/登録リクエストの受信を開始するためにレンジ-&amp;gt;パーティションマッピングを変更します。&lt;/li&gt;
&lt;li&gt;YのリーダーはXのリーダーに検索リクエストのために#8aで作成されたFilteredIndexReaderの利用開始を頼みます&lt;/li&gt;
&lt;li&gt;YのリーダーはXのリーダーに、ZooKeeperからレンジ-&amp;gt;パーティションマッピングを矯正リフレッシュするように頼みます。この時点で#3で開始されたトランザクションログの流しこみが停止されるのが保証されます。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Xのリーダーは自身のパーティションに存在するべきでないハッシュ値をもつドキュメントを削除し、最新のコミットポイントのsearcherを再度開きます。&lt;/li&gt;
&lt;li&gt;この時点で分割は完全に終了し、Xのリーダーはcommit_withinパラメータによるコミットをレジュームします（？？？）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Notes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;分割操作が完了するまで、commit_withinパラメータによるパーティションの分割は実行されない&lt;/li&gt;
&lt;li&gt;#8b開始から#8c終了までの間の分散検索は一貫しない検索結果を帰す場合がある（例えば：検索結果が異なる）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;cluster-re-balancing&#34;&gt;Cluster Re-balancing&lt;/h3&gt;
&lt;p&gt;クラスタは明示的なクラスタ管理コマンドにより再構築（リバランシング）できる。&lt;/p&gt;
&lt;p&gt;TBD
（to be determined）&lt;/p&gt;
&lt;h3 id=&#34;cluster-re-balancing-1&#34;&gt;Cluster Re-balancing&lt;/h3&gt;
&lt;p&gt;TBD
（to be determined）&lt;/p&gt;
&lt;h3 id=&#34;configuration&#34;&gt;Configuration&lt;/h3&gt;
&lt;h4 id=&#34;solr_&#34;&gt;&lt;strong&gt;solr_cluster.properties&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;これはクラスタ内の全ノードにわたって適用される一般的なSolr設定ファイルとは別のプロパティファイルの集合である。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;replication_factor：クラスタによって管理されるドキュメントのレプリカの数&lt;/li&gt;
&lt;li&gt;min_writes：書き込み操作が成功になる前の最小の書き込み？？？？。これは書き込みごとに上書き設定可能&lt;/li&gt;
&lt;li&gt;commit_within：検索に現れるまでの書き込み操作の最大回数&lt;/li&gt;
&lt;li&gt;hash_function：ドキュメントのハッシュ値を計算するための関数の実装&lt;/li&gt;
&lt;li&gt;max_hash_value：ハッシュ関数が出力することができる最大値。理論的には、この値はクラスタが保持できるパーティションの最大数でもある&lt;/li&gt;
&lt;li&gt;min_reaction_time：起動、停止の後に再配分/分割にかかる時間（？？）&lt;/li&gt;
&lt;li&gt;min_replica_for_reaction：レプリカノード数がこの値以下になったら、min_reaction_timeにならなくても分割が実行される。&lt;/li&gt;
&lt;li&gt;auto_add_new_nodes：booleanフラグ。もしtrueなら新しいノードは自動的にパーティションからレプリカを読み込む。そうでない場合は新しいノードはクラスタに「idle」状態で登録される&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;cluster-admin-commands&#34;&gt;&lt;strong&gt;Cluster Admin Commands&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;すべてのクラスタ管理コマンドはすべてのノードでパス（/cluster_admin）を与えることで実行できます。
全ノードは同じコマンドを受け付けることができ、振る舞いも同じものになるでしょう。
以下のコマンドはユーザが利用できるパブリックなコマンドです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;init_cluster：（パラメータ：パーティション）このコマンドはノードの集合の初期化後に実施されます。このコマンドが実行されるまで、クラスタは読み込み/書き込みコマンドを受け付けません。&lt;/li&gt;
&lt;li&gt;split_partition：（パラメータ：パーティション（任意））パーティションを2つに分割します。もしパーティションパラメータが指定されない場合は、ドキュメント数が最大の&lt;/li&gt;
&lt;li&gt;add_idle_nodes：このコマンドはauto_add_new_nodes=falseの場合に利用できます。このコマンドはクラスタに対して「idle」状態のすべてのノードを追加するトリガーとなります。&lt;/li&gt;
&lt;li&gt;move_partition：（パラメータ：パーティション、from、to）fromのノードからtoの別のノードに引数で指定されたパーティションを移動します。&lt;/li&gt;
&lt;li&gt;command_status：（パラメータ：completion_id（任意））上記コマンドはすべて非同期で実行され、completion_idを返します。このコマンドは特定の実行中のコマンドもしくは全ての実行中のコマンドの状態を表示するために利用できます。&lt;/li&gt;
&lt;li&gt;status：（パラメータ：パーティション（任意））パーティションのリストを表示し各パーティションの次の情報を表示します。&lt;/li&gt;
&lt;li&gt;リーダーノード&lt;/li&gt;
&lt;li&gt;ノードのリスト&lt;/li&gt;
&lt;li&gt;ドキュメント数&lt;/li&gt;
&lt;li&gt;平均読み込み回数（reads/sec）&lt;/li&gt;
&lt;li&gt;平均書き込み回数（writes/sec）&lt;/li&gt;
&lt;li&gt;平均読み込み時間（time/read）&lt;/li&gt;
&lt;li&gt;平均書き込み時間（time/write）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;migrating-from-solr-to-solrcloud&#34;&gt;Migrating from Solr to SolrCloud&lt;/h3&gt;
&lt;p&gt;クラウドに移行するときに幾つかの特徴は不要かもしれないし、サポートされないかもしれません。
既存の（クラウドでない）バージョンでのすべての特徴をSolrCloudでサポートし続けなければなりません。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;レプリケーション：これは必要ありません。&lt;/li&gt;
&lt;li&gt;CoreAdminコマンド：明示的なコアの操作は許可されません。内部にコアがあるかもしれないが、暗黙的に管理されるでしょう&lt;/li&gt;
&lt;li&gt;複数スキーマのサポート？：単純化のため、ver1.0ではサポートしないかもしれない&lt;/li&gt;
&lt;li&gt;solr.xml：SolrCloudでほんとに必要？&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;alternative-to-a-cluster-lock&#34;&gt;Alternative to a Cluster Lock&lt;/h3&gt;
&lt;p&gt;リーダーを選出する常設の調停ノード（masterはインデックスレプリケーションで利用している用語なので、「調停」とする）を持つほうが単純かもしれません。
「truth」状態をZookeeperの状態としてみなすような次のパターンでは、将来の柔軟性（クラスタを制御するためのZookeeperの状態を直接変更するような外部管理ツールのような）を考慮に入れることができます。
（毎回ロックを取得するよりも）調停ノードを持つことにより、よりスケーラブルになるかもしれません。
特定条件下でのみCluster Lockを利用するハイブリッドも意味があるでしょう。&lt;/p&gt;
&lt;h3 id=&#34;single-node-simplest-use-case&#34;&gt;Single Node Simplest Use Case&lt;/h3&gt;
&lt;p&gt;単一ノードでスタートして、ドキュメントをインデックス登録できないといけません。
また、あとで、クラスタに2番目のノードを追加できないと行けません。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1つのノードから開始し、最初にZookeeperに設定ファイルをアップロードし、shard1にノードを作成＋登録します。&lt;/li&gt;
&lt;li&gt;他の情報がない状態で設定が作成され、1つのシャードのシステムとなります。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;いくつかのドキュメントをインデックスします&lt;/li&gt;
&lt;li&gt;他のノードが起動し、「まだ割り当てられていない場合、レプリカの最小の数をもつshardに割り当てられ、「recovery」プロセスを開始します」というパラメータを受け取ります。
* 出来れば、同一ホスト上に同じシャードはコピーしない
* この時点の後で、ノードが停止したら、再起動し、同じ役割が再開されるべきです。（Zookeeperでそれ自身であると判別されれば）
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;原文はこちらからです。&lt;/p&gt;
&lt;h3 id=&#34;boot-strapping-1&#34;&gt;Boot Strapping&lt;/h3&gt;
&lt;h4 id=&#34;cluster-startup&#34;&gt;Cluster Startup&lt;/h4&gt;
&lt;p&gt;A node is started pointing to a Zookeeper host and port. The first node in the cluster may be started with cluster configuration properties and the schema/config files for the cluster. The first node would upload the configuration into zookeeper and bootstrap the cluster. The cluster is deemed to be in the “bootstrap” state. In this state, the node -&amp;gt; partition mapping is not computed and the cluster does not accept any read/write requests except for clusteradmin commands.&lt;/p&gt;
&lt;p&gt;After the initial set of nodes in the cluster have started up, a clusteradmin command (TBD description) is issued by the administrator. This command accepts an integer “partitions” parameter and it performs the following steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Acquire the Cluster Lock&lt;/li&gt;
&lt;li&gt;Allocate the “partitions” number of partitions&lt;/li&gt;
&lt;li&gt;Acquires nodes for each partition&lt;/li&gt;
&lt;li&gt;Updates the node -&amp;gt; partition mapping in ZooKeeper&lt;/li&gt;
&lt;li&gt;Release the Cluster Lock&lt;/li&gt;
&lt;li&gt;Informs all nodes to force update their own node -&amp;gt; partition mapping from ZooKeeper&lt;/li&gt;
&lt;li&gt;The Cluster Lock is acquired&lt;/li&gt;
&lt;li&gt;A suitable source (node, partition) tuple is chosen:&lt;/li&gt;
&lt;li&gt;The list of available partitions are scanned to find partitions which has less then “replication_factor” number of nodes. In case of tie, the partition with the least number of nodes is selected. In case of another tie, a random partition is chosen.&lt;/li&gt;
&lt;li&gt;If all partitions have enough replicas, the nodes are scanned to find one which has most number of partitions. In case of tie, of all the partitions in such nodes, the one which has the most number of documents is chosen. In case of tie, a random partition on a random node is chosen.&lt;/li&gt;
&lt;li&gt;If moving the chosen (node, partition) tuple to the current node will decrease the maximum number of partition:node ratio of the cluster, the chosen tuple is returned.Otherwise, no (node, partition) is chosen and the algorithm terminates&lt;/li&gt;
&lt;li&gt;The node -&amp;gt; partition mapping is updated in ZooKeeper&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;The node status in ZooKeeper is updated to “recovery” state&lt;/li&gt;
&lt;li&gt;The Cluster Lock is released&lt;/li&gt;
&lt;li&gt;A “recovery” is initiated against the leader of the chosen partition&lt;/li&gt;
&lt;li&gt;After the recovery is complete, the Cluster Lock is acquired again&lt;/li&gt;
&lt;li&gt;The source (node, partition) is removed from the node -&amp;gt; partition map in ZooKeeper&lt;/li&gt;
&lt;li&gt;The Cluster Lock is released&lt;/li&gt;
&lt;li&gt;The source node is instructed to force refresh the node -&amp;gt; partition map from ZooKeeper&lt;/li&gt;
&lt;li&gt;Goto step #1&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;node-restart-1&#34;&gt;&lt;strong&gt;Node Restart&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;A node restart can mean one of the following things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The JVM crashed and was manually or automatically restarted&lt;/li&gt;
&lt;li&gt;The node was in a temporary network partition and either could not reach ZooKeeper (and was supposed to be dead) or could not receive updates from the leader for a period of time. A node restart ine node failure.&lt;/li&gt;
&lt;li&gt;Lifecycle of a Write Operation this scenario signifies the removal of the network partition.&lt;/li&gt;
&lt;li&gt;A hardware failure or maintenance window caused the removal of the node from the cluster and the node has been started again to rejoin the cluster.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The node reads the list of partitions for which it is a member and for each partition, starts a recovery process from each partition’s leader respectively. Then, the node follows the steps in the New Node section without checking for the auto_add_new_nodes property. This ensures that the cluster recovers from the imbalance created by th&lt;/p&gt;
&lt;p&gt;Writes are performed by clients using the standard Solr update formats. A write operation can be sent to any node in the cluster. The node uses the hash_function , and the Range-Partition mapping to identify the partition where the doc belongs to. A zookeeper lookup is performed to identify the leader of the shard and the operation is forwarded there. A SolrJ enhancement may enable it to send the write directly to the leader&lt;/p&gt;
&lt;p&gt;The leader assigns the operation a Partition Version and writes the operation to its transaction log and forwards the document + version + hash to other nodes belonging to the shard. The nodes write the document + hash to the index and record the operation in the transaction log. The leader responds with an ‘OK’ if at least min_writes number of nodes respond with ‘OK’. The min_writes in the cluster properties can be overridden by specifying it in the write request.&lt;/p&gt;
&lt;p&gt;The cloud mode would not offer any explicit commit/rollback operations. The commits are managed by auto-commits at intervals (commit_within) by the leader and triggers a commit on all members on the shard. The latest version available to a node is recorded with the commit point.&lt;/p&gt;
&lt;h3 id=&#34;transaction-log-1&#34;&gt;&lt;strong&gt;Transaction Log&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A transaction log records all operations performed on an Index between two commits&lt;/li&gt;
&lt;li&gt;Each commit starts a new transaction log because a commit guarantees durability of operations performed before it&lt;/li&gt;
&lt;li&gt;The sync can be tunable e.g. flush vs fsync by default can protect against JVM crashes but not against power failure and can be much faster&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;recovery-1&#34;&gt;Recovery&lt;/h3&gt;
&lt;p&gt;A recovery can be triggered during:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bootstrap&lt;/li&gt;
&lt;li&gt;Partition splits&lt;/li&gt;
&lt;li&gt;Cluster re-balancing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The node starts by setting its status as ‘recovering’. During this phase, the node will not receive any read requests but it will receive all new write requests which shall be written to a separate transaction log. The node looks up the version of index it has and queries the ‘leader’ for the latest version of the partition. The leader responds with the set of operations to be performed before the node can be in sync with the rest of the nodes in the shard.&lt;/p&gt;
&lt;p&gt;This may involve copying the index first and replaying the transaction log depending on where the node is w.r.t the state of the art. If an index copy is required, the index files are replicated first to the local index and then the transaction logs are replayed. The replay of transaction log is nothing but a stream of regular write requests. During this time, the node may have accumulated new writes, which should then be played back on the index. The moment the node catches up with the latest commit point, it marks itself as “ready”. At this point, read requests can be handled by the node.&lt;/p&gt;
&lt;h4 id=&#34;handling-node-failures-1&#34;&gt;Handling Node Failures&lt;/h4&gt;
&lt;p&gt;There may be temporary network partitions between some nodes or between a node and ZooKeeper. The cluster should wait for some time before re-balancing data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Leader failure&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If node fails and if it is a leader of any of the shards, the other members will initiate a leader election process. Writes to this partition are not accepted until the new leader is elected. Then it follows the steps in non-leader failure&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Non-Leader failure&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The leader would wait for the min_reaction_time before identifying a new node to be a part of the shard. The leader acquires the Cluster Lock and uses the node-shard assignment algorithm to identify a node as the new member of the shard. The node -&amp;gt; partition mapping is updated in ZooKeeper and the cluster lock is released. The new node is then instructed to force reload the node -&amp;gt; partition mapping from ZooKeeper.&lt;/p&gt;
&lt;h3 id=&#34;splitting-partitions-1&#34;&gt;Splitting partitions&lt;/h3&gt;
&lt;p&gt;A partition can be split either by an explicit cluster admin command or automatically by splitting strategies provided by Solr. An explicit split command may give specify target partition(s) for split.&lt;/p&gt;
&lt;p&gt;Assume the partition ‘X’ with hash range 100 - 199 is identified to be split into X (100 - 149) and a new partition Y (150 - 199). The leader of X records the split action in ZooKeeper with the new desired range values of X as well as Y. No nodes are notified of this split action or the existence of the new partition.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The leader of X, acquires the Cluster Lock and identifies nodes which can be assigned to partition Y (algorithm TBD) and informs them of the new partition and updates the partition -&amp;gt; node mapping. The leader of X waits for the nodes to respond and once it determines that the new partition is ready to accept commands, it proceeds as follows:&lt;/li&gt;
&lt;li&gt;The leader of X suspends all commits until the split is complete.&lt;/li&gt;
&lt;li&gt;The leader of X opens an IndexReader on the latest commit point (say version V) and instructs its peers to do the same.&lt;/li&gt;
&lt;li&gt;The leader of X starts streaming the transaction log after version V for the hash range 150 - 199 to the leader of Y.&lt;/li&gt;
&lt;li&gt;The leader of Y records the requests sent in #2 in its transaction log only i.e. it is not played on the index.&lt;/li&gt;
&lt;li&gt;The leader of X initiates an index split on the IndexReader opened in step #2.&lt;/li&gt;
&lt;li&gt;The index created in #5 is sent to the leader of Y and is installed.&lt;/li&gt;
&lt;li&gt;The leader of Y instructs its peers to start recovery process. At the same time, it starts playing its transaction log on the index.&lt;/li&gt;
&lt;li&gt;Once all peers of partition Y have reached at least version V:&lt;/li&gt;
&lt;li&gt;The leader of Y asks the leader of X to prepare a FilteredIndexReader on top of the reader created in step #2 which will have documents belonging to hash range 100 - 149 only.&lt;/li&gt;
&lt;li&gt;Once the leader of X acknowledges the completion of request in #8a, the leader of Y acquires the Cluster Lock and modifies the range -&amp;gt; partition mapping to start receiving regular search/write requests from the whole cluster.&lt;/li&gt;
&lt;li&gt;The leader of Y asks leader of X to start using the FilteredIndexReader created in #8a for search requests.&lt;/li&gt;
&lt;li&gt;The leader of Y asks leader of X to force refresh the range -&amp;gt; partition mapping from ZooKeeper. At this point, it is guaranteed that the transaction log streaming which started in #3 will be stopped.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;The leader of X will delete all documents with hash values not belonging to its partitions, commits and re-opens the searcher on the latest commit point.&lt;/li&gt;
&lt;li&gt;At this point, the split is considered complete and leader of X resumes commits according to the commit_within parameters.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Notes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The partition being split does not honor commit_within parameter until the split operation completes&lt;/li&gt;
&lt;li&gt;Any distributed search operation performed starting at the time of #8b and till the end of #8c can return inconsistent results i.e. the number of search results may be wrong.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;cluster-re-balancing-2&#34;&gt;Cluster Re-balancing&lt;/h3&gt;
&lt;p&gt;The cluster can be rebalanced by an explicit cluster admin command.&lt;/p&gt;
&lt;p&gt;TBD&lt;/p&gt;
&lt;h3 id=&#34;monitoring&#34;&gt;Monitoring&lt;/h3&gt;
&lt;p&gt;TBD&lt;/p&gt;
&lt;h3 id=&#34;configuration-1&#34;&gt;Configuration&lt;/h3&gt;
&lt;h4 id=&#34;solr_-1&#34;&gt;&lt;strong&gt;solr_cluster.properties&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;This are the set of properties which are outside of the regular Solr configuration and is applicable across all nodes in the cluster:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;replication_factor&lt;/strong&gt; : The number of replicas of a doc maintained by the cluster&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;min_writes&lt;/strong&gt; : Minimum no:of successful writes before the write operation is signaled as successful . This may me overridden on a per write basis&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;commit_within&lt;/strong&gt; : This is the max time within which write operation is visible in a search&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;hash_function&lt;/strong&gt; : The implementation which computes the hash of a given doc&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;max_hash_value&lt;/strong&gt; : The maximum value that a hash_function can output. Theoretically, this is also the maximum number of partitions the cluster can ever have&lt;/li&gt;
&lt;li&gt;min_reaction_time : The time before any reallocation/splitting is done after a node comes up or goes down (in secs)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;min_replica_for_reaction&lt;/strong&gt; : If the number of replica nodes go below this threshold the splitting is triggered even if the min_reaction_time is not met&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;auto_add_new_nodes&lt;/strong&gt; : A Boolean flag. If true, new nodes are automatically used as read replicas to existing partitions, otherwise, new nodes sit idle until the cluster needs them.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;cluster-admin-commands-1&#34;&gt;&lt;strong&gt;Cluster Admin Commands&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;All cluster admin commands run on all nodes at a given path (say /cluster_admin). All nodes are capable of accepting the same commands and the behavior would be same. These are the public commands which a user can use to manage a cluster:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;init_cluster&lt;/strong&gt; : (params : partition) This command is issued after the initial set of nodes are started. Till this command is issued, the cluster would not accept any read/write commands&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;split_partition&lt;/strong&gt; : (params : partitionoptional). The partition is split into two halves. If the partition parameter is not supplied, the partition with the largest number of documents is identified as the candidate.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;add_idle_nodes&lt;/strong&gt; : This can be used if auto_add_new_nodes=false. This command triggers the addition of all ‘idle’ nodes to the cluster.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;move_partition&lt;/strong&gt; : (params : partition, from, to). Move the given partition from a given node from to another node&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;command_status&lt;/strong&gt; :(params : completion_idoptional) . All the above commands are asynchronous and returns with a completion_id . This command can be used to know the status of a particular running command or all the current running commands&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;status&lt;/strong&gt; : (params : partitionoptional) Shows the list of partitions and for each partition, the following info is provided&lt;/li&gt;
&lt;li&gt;leader node&lt;/li&gt;
&lt;li&gt;nodes list&lt;/li&gt;
&lt;li&gt;doc count&lt;/li&gt;
&lt;li&gt;average reads/sec&lt;/li&gt;
&lt;li&gt;average writes/sec&lt;/li&gt;
&lt;li&gt;average time/read&lt;/li&gt;
&lt;li&gt;average time/write&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;migrating-from-solr-to-solrcloud-1&#34;&gt;Migrating from Solr to SolrCloud&lt;/h3&gt;
&lt;p&gt;A few features may be redundant or not supported when we move to cloud such as. We should continue to support the non cloud version which supports all the existing features&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Replication. This feature is not required anymore&lt;/li&gt;
&lt;li&gt;CoreAdmin commands. Explicit manipulation of cores will not be allowed. Though cores may exist internally and they meay be managed implicitly&lt;/li&gt;
&lt;li&gt;Multiple schema support ? Should we just remove it from ver 1.0 for simplicity?&lt;/li&gt;
&lt;li&gt;solr.xml . Is there a need at all for this in the cloud mode?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;alternative-to-a-cluster-lock-1&#34;&gt;Alternative to a Cluster Lock&lt;/h3&gt;
&lt;p&gt;It may be simpler to have a coordinator node (we avoid the term master since that is associated with traditional index replication) that is established via leader election. Following a pattern of treating the zookeeper state as the &amp;ldquo;truth&amp;rdquo; and having nodes react to changes in that state allow for more future flexibility (such as allowing an external management tool directly change the zookeeper state to control the cluster). Having a coordinator (as opposed to grabbing a lock every time) can be more scalable too. A hybrid model where a cluster lock is used only in certain circumstances can also make sense.&lt;/p&gt;
&lt;h3 id=&#34;single-node-simplest-use-case-1&#34;&gt;Single Node Simplest Use Case&lt;/h3&gt;
&lt;p&gt;We should be able to easily start up a single node and start indexing documents. At a later point in time, we should be able to start up a second node and have it join the cluster.&lt;/p&gt;
&lt;p&gt;start up a single node, upload it&amp;rsquo;s configuration (the first time) to zookeeper, and create+assign the node to shard1.
in the absence of other information when the config is created, a single shard system is assumed
index some documents
start up another node and pass it a parameter that says &amp;ldquo;if you are not already assigned, assign yourself to any shard that has the lowest number of replicas and start recovery process&amp;rdquo;
avoid replicating a shard on the same host if possible
after this point, one should be able to kill the node and start it up again and have it resume the same role (since it should see itself in zookeeper)&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>New SolrCloud Designの翻訳（その１）(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/09/28/new-solrcloud-design%E3%81%AE%E7%BF%BB%E8%A8%B3%E3%81%9D%E3%81%AE%EF%BC%91/</link>
      <pubDate>Wed, 28 Sep 2011 20:45:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/09/28/new-solrcloud-design%E3%81%AE%E7%BF%BB%E8%A8%B3%E3%81%9D%E3%81%AE%EF%BC%91/</guid>
      <description>&lt;p&gt;ちょっと興味があるので、訳してみました。（Wikiのページは&lt;a href=&#34;http://wiki.apache.org/solr/NewSolrCloudDesign&#34;&gt;こちら&lt;/a&gt;）
更新されているようなので、もとの文章も残しておきます。（ページ下部の続きはこちら部分以降）
全部訳そうと思ったのですが、終わらなかったので、まずは前半部分です。まだ、訳しただけで理解できてない。。。
（英語力のなさをさらけ出してしまうのですが、これも修行です。。。おかしいところはツッコミを。）&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ちょっと興味があるので、訳してみました。（Wikiのページは&lt;a href=&#34;http://wiki.apache.org/solr/NewSolrCloudDesign&#34;&gt;こちら&lt;/a&gt;）
更新されているようなので、もとの文章も残しておきます。（ページ下部の続きはこちら部分以降）
全部訳そうと思ったのですが、終わらなかったので、まずは前半部分です。まだ、訳しただけで理解できてない。。。
（英語力のなさをさらけ出してしまうのですが、これも修行です。。。おかしいところはツッコミを。）&lt;/p&gt;
&lt;h3 id=&#34;what-is-solrcloud&#34;&gt;What is SolrCloud?&lt;/h3&gt;
&lt;p&gt;Solrクラウドはクラウドでの検索サービスとしてのSolrを管理、運用するための既存のSolrを拡張するものです。&lt;/p&gt;
&lt;h3 id=&#34;用語集&#34;&gt;用語集&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cluster：クラスタは1単位として管理されるSolrノードの集合です。クラスタ全体で単一のschema、solrconfigをもたないといけません。&lt;/li&gt;
&lt;li&gt;Node：ひとつのJVMインスタンスで起動しているSolrのこと&lt;/li&gt;
&lt;li&gt;Partition：パーティションはドキュメント集合全体のサブセット（部分集合）のことです。パーティションは部分集合のドキュメントが単一のインデックスに含まれるような形で作られます。&lt;/li&gt;
&lt;li&gt;Shard：パーティションはn（＝replication factor）個のノードに保存される必要があります。このn個のノードすべてでひとつのshardです。1つのノードはいくつかのshardの一部にで有る場合があります。&lt;/li&gt;
&lt;li&gt;Leader：各Shardは1つのリーダとなるノードを持っています。パーティションに登録されたドキュメントリーダーからコピーされます&lt;/li&gt;
&lt;li&gt;Replication Factor：クラスタによって保持されるレプリカの最小限の数&lt;/li&gt;
&lt;li&gt;Transaction Log：各ノードによって保持される書き込み処理の追記ログ&lt;/li&gt;
&lt;li&gt;Partition version：これは各shardのリーダーが持っているカウンターで、書き込み処理ごとに増加し、レプリカに送られます。&lt;/li&gt;
&lt;li&gt;Cluster Lock：これはrange（※後述されているハッシュ値の範囲のことか？）-&amp;gt;パーティションもしくはパーティション-&amp;gt;ノードのマッピングを変更するために取得しなければいけないグローバルなロックのことです。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;※用語だけだと関係がわかりづらかったので、図を書いてみました。&lt;/p&gt;
&lt;p&gt;

&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20110928/20110928_2063185.png&#34; alt=&#34;SolrCloudのパーティションについて&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20110928/20110928_2063185.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

ドキュメントの集合とパーティションについての考え方&lt;/p&gt;
&lt;p&gt;

&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope
    itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34; &gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://blog.johtani.info/images/entries/20110928/20110928_2063186.png&#34; alt=&#34;SolrCloudのクラスターについて&#34;
         /&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://blog.johtani.info/images/entries/20110928/20110928_2063186.png&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;

クラスタ、ノード、シャードの考え方。&lt;/p&gt;
&lt;h3 id=&#34;処理原則&#34;&gt;&lt;strong&gt;処理原則&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;任意の処理はクラスタにある任意のノードに実行可能です。&lt;/li&gt;
&lt;li&gt;リカバリできないSPOFはありません。&lt;/li&gt;
&lt;li&gt;クラスタは伸縮自在（elastic）でなければならない&lt;/li&gt;
&lt;li&gt;書き込みが失われないこと（耐久性）を保証する&lt;/li&gt;
&lt;li&gt;書き込み順序が保証されなければならない&lt;/li&gt;
&lt;li&gt;2つのクライアントが2つの「A」というドキュメントを同時に送信してきた場合、すべてのレプリカで一貫してどちらか一方が保存されなければならない。&lt;/li&gt;
&lt;li&gt;クラスタの設定は中央管理されなければならない。また、クラスタのどのノードからもクラスタ設定が更新できます。&lt;/li&gt;
&lt;li&gt;読み込み（検索）の自動的なフェイルオーバー&lt;/li&gt;
&lt;li&gt;書き込み（インデクシング）の自動的なフェイルオーバー&lt;/li&gt;
&lt;li&gt;ノードの故障が発生しても自動的にrepcation factorの数は守られます。（故障したら動的にレプリカを再配置？）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;zookeeper&#34;&gt;&lt;strong&gt;Zookeeper&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;ZooKeeperクラスタは次のために使用されます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クラスタ設定の集中管理&lt;/li&gt;
&lt;li&gt;分散同期に必要な操作のコーディネータ&lt;/li&gt;
&lt;li&gt;クラスタ構成を保存するためのシステム&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;partitioning&#34;&gt;&lt;strong&gt;Partitioning&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;クラスタは固定されたmax_hash_value＝「N」が設定されます。
max_hash_valueは1000のような大きな値が設定されます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
hash = hash_function(doc.getKey()) % N
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ハッシュ値の範囲がパーティションに割り当てられ、ZooKeeperに保存されます。
次の例のような形で、パーティションに対して範囲が設定されます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
range  : partition
------  ----------
0 - 99 : 1
100-199: 2
200-299: 3
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ハッシュはドキュメントにインデックスフィールドとして追加され、変更されない値です。
これは、インデックスを分割するときにも利用します。&lt;/p&gt;
&lt;p&gt;ハッシュ関数はプラガブルです。これはドキュメントを受け取り、一貫した正整数ハッシュ値を返します。デフォルトのハッシュ関数として、必須でかつ変更されないフィールド（デフォルトはユニークキーフィールド）からハッシュ値を計算する関数が提供されます。&lt;/p&gt;
&lt;h4 id=&#34;using-full-hash-range&#34;&gt;&lt;strong&gt;Using full hash range&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;max_hash_valueは必ずしも必要ではありません。各shardはいずれにしろハッシュ値の範囲持っているので、完全な32 bitsハッシュを使うこともできます。
設定可能なmax_hash_valueを利用しないで、クライアントからの値をもとにハッシュ値を作ることができます。
例えば、電子メールの検索アプリでは次のようにハッシュ関数を作ることができます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
(hash(user_id)&amp;lt;&amp;lt;24) | (hash(message_id)&amp;gt;&amp;gt;&amp;gt;8)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ユーザIDから8bitのハッシュコードの先頭8ビットを利用することで、任意のユーザのメールがクラスタの同じ256番目（のノード？）にあるのを保証します。検索時はこの情報をもとにクラスタのその部分への問い合わせだけで情報が得られます。&lt;/p&gt;
&lt;p&gt;おそらく、私たちは最大値から最小値をカバーする範囲を表現するのにハッシュ空間を輪（固定のハッシュではなく）とみなしたいです。（？？？円状のハッシュ空間とすることで、クラスタ内のノード数の増減に耐えられるようにするよということかな？）&lt;/p&gt;
&lt;h4 id=&#34;shard-naming&#34;&gt;&lt;strong&gt;shard naming&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;シャードからハッシュ値の範囲へのマッピングを別々に管理するよりも、ハッシュコードによりパーティションを構成するときに実際にはハッシュの範囲をシャード名にします。
（シャード「1-1000」は1から1000の間のハッシュコードを持つドキュメントが含まれるという形）&lt;/p&gt;
&lt;p&gt;現時点では（コレクション1つに対してシングルコアの1Solrサーバと仮定して）solrコア名はコレクション名をつけるようになっています。
同一コレクションのためのマルチコアに対してのいい命名規則をつけるという課題が残っています。
（※コレクションに対する説明がここまでないかな？）&lt;/p&gt;
&lt;h3 id=&#34;shard-assignment&#34;&gt;Shard Assignment&lt;/h3&gt;
&lt;p&gt;ノード-&amp;gt;パーティションのマッピングはZooKeeperにあるCluster Lockを取得したノードによってのみ変更が可能です。
ノードの追加時に、まず、Cluster Lockを取得し、次にそれがどのパーティションを取得できるかを識別します。&lt;/p&gt;
&lt;h4 id=&#34;node-to-a-shard-assignment&#34;&gt;Node to a shard assignment&lt;/h4&gt;
&lt;p&gt;新しいノードを探しているノードはまずCluster Lockを取得しないといけません。
第一に、リーダーはシャードを決めます。
シャードが持つ、すべての利用可能なノード数で最小の値を持つノードが選び出されます。
もし、同値ならランダムにノードを選びます。&lt;/p&gt;
&lt;p&gt;原文はこちらからです。&lt;/p&gt;
&lt;h3 id=&#34;new-solrcloud-design&#34;&gt;&lt;strong&gt;New SolrCloud Design&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;(Work in progress)&lt;/p&gt;
&lt;h3 id=&#34;what-is-solrcloud-1&#34;&gt;What is SolrCloud?&lt;/h3&gt;
&lt;p&gt;SolrCloud is an enhancement to the existing Solr to manage and operate Solr as a search service in a cloud.&lt;/p&gt;
&lt;h3 id=&#34;glossary&#34;&gt;Glossary&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cluster : Cluster is a set of Solr nodes managed as a single unit. The entire cluster must have a single schema and solrconfig&lt;/li&gt;
&lt;li&gt;Node : A JVM instance running Solr&lt;/li&gt;
&lt;li&gt;Partition : A partition is a subset of the entire document collection. A partition is created in such a way that all its documents can be contained in a single index.&lt;/li&gt;
&lt;li&gt;Shard : A Partition needs to be stored in multiple nodes as specified by the replication factor. All these nodes collectively form a shard. A node may be a part of multiple shards&lt;/li&gt;
&lt;li&gt;Leader : Each Shard has one node identified as its leader. All the writes for documents belonging to a partition should be routed through the leader.&lt;/li&gt;
&lt;li&gt;Replication Factor : Minimum number of copies of a document maintained by the cluster&lt;/li&gt;
&lt;li&gt;Transaction Log : An append-only log of write operations maintained by each node&lt;/li&gt;
&lt;li&gt;Partition version : This is a counter maintained with the leader of each shard and incremented on each write operation and sent to the peers&lt;/li&gt;
&lt;li&gt;Cluster Lock : This is a global lock which must be acquired in order to change the range -&amp;gt; partition or the partition -&amp;gt; node mappings.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;guiding-principles&#34;&gt;&lt;strong&gt;Guiding Principles&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Any operation can be invoked on any node in the cluster.&lt;/li&gt;
&lt;li&gt;No non-recoverable single point of failures&lt;/li&gt;
&lt;li&gt;Cluster should be elastic&lt;/li&gt;
&lt;li&gt;Writes must never be lost i.e. durability is guaranteed&lt;/li&gt;
&lt;li&gt;Order of writes should be preserved&lt;/li&gt;
&lt;li&gt;If two clients send document &amp;ldquo;A&amp;rdquo; to two different replicas at the same time, one should consistently &amp;ldquo;win&amp;rdquo; on all replicas.&lt;/li&gt;
&lt;li&gt;Cluster configuration should be managed centrally and can be updated through any node in the cluster. No per node configuration other than local values such as the port, index/logs storage locations should be required&lt;/li&gt;
&lt;li&gt;Automatic failover of reads&lt;/li&gt;
&lt;li&gt;Automatic failover of writes&lt;/li&gt;
&lt;li&gt;Automatically honour the replication factor in the event of a node failure&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;zookeeper-1&#34;&gt;&lt;strong&gt;Zookeeper&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;A ZooKeeper cluster is used as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The central configuration store for the cluster&lt;/li&gt;
&lt;li&gt;A co-ordinator for operations requiring distributed synchronization&lt;/li&gt;
&lt;li&gt;The system-of-record for cluster topology&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;partitioning-1&#34;&gt;&lt;strong&gt;Partitioning&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;The cluster is configured with a fixed max_hash_value (which is set to a fairly large value, say 1000) ‘N’. Each document’s hash is calculated as:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
hash = hash_function(doc.getKey()) % N
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ranges of hash values are assigned to partitions and stored in Zookeeper. For example we may have a
range to partition mapping as follows&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
range  : partition
------  ----------
0 - 99 : 1
100-199: 2
200-299: 3
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The hash is added as an indexed field in the doc and it is immutable. This may also be used during an index split&lt;/p&gt;
&lt;p&gt;The hash function is pluggable. It can accept a document and return a consistent &amp;amp; positive integer hash value. The system provides a default hash function which uses the content of a configured, required &amp;amp; immutable field (default is unique_key field) to calculate hash values.&lt;/p&gt;
&lt;h4 id=&#34;using-full-hash-range-1&#34;&gt;&lt;strong&gt;Using full hash range&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Alternatively, there need not be any max_hash_value - the full 32 bits of the hash can be used since each shard will have a range of hash values anyway. Avoiding a configurable max_hash_value makes things easier on clients wanting related hash values next to each other. For example, in an email search application, one could construct a hashcode as follows:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
(hash(user_id)&amp;lt;&amp;lt;24) | (hash(message_id)&amp;gt;&amp;gt;&amp;gt;8)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;By deriving the top 8 bits of the hashcode from the user_id, it guarantees that any users emails are in the same 256th portion of the cluster. At search time, this information can be used to only query that portion of the cluster.&lt;/p&gt;
&lt;p&gt;We probably also want to view the hash space as a ring (as is done with consistent hashing) in order to express ranges that wrap (cross from the maximum value to the minimum value).&lt;/p&gt;
&lt;h4 id=&#34;shard-naming-1&#34;&gt;&lt;strong&gt;shard naming&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;When partitioning is by hash code, rather than maintaining a separate mapping from shard to hash range, the shard name could actually be the hash range (i.e. shard &amp;ldquo;1-1000&amp;rdquo; would contain docs with a hashcode between 1 and 1000).&lt;/p&gt;
&lt;p&gt;The current convention for solr-core naming is that it match the collection name (assuming a single core in a solr server for the collection). We still need a good naming scheme for when there are multiple cores for the same collection.&lt;/p&gt;
&lt;h3 id=&#34;shard-assignment-1&#34;&gt;Shard Assignment&lt;/h3&gt;
&lt;p&gt;The node -&amp;gt; partition mapping can only be changed by a node which has acquired the Cluster Lock in ZooKeeper. So when a node comes up, it first attempts to acquire the cluster lock, waits for it to be acquired and then identifies the partition to which it can subscribe to.&lt;/p&gt;
&lt;h4 id=&#34;node-to-a-shard-assignment-1&#34;&gt;Node to a shard assignment&lt;/h4&gt;
&lt;p&gt;The node which is trying to find a new node should acquire the cluster lock first. First of all the leader is identified for the shard. Out of the all the available nodes, the node with the least number of shards is selected. If there is a tie, the node which is a leader to the least number of shard is chosen. If there is a tie, a random node is chosen.&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Hadoop Conference Japan 2011 Fallに参加してきました。(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/09/27/hadoop-conference-japan-2011-fall%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%A6%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Tue, 27 Sep 2011 17:51:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/09/27/hadoop-conference-japan-2011-fall%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%A6%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;Hadoop Conference Japan 2011 Fallに行ってきました。
まずは、ユーザ会の方々、運営の方々、発表された方々お疲れ様でした。こんな機会を用意していただき、ありがとうございます。
Hadoopは昨年触っていたのですが、最近は縁がなくなってしまいました。
ただ、触っていたときに面白かったので参加してきました。
ということで、今回も自分用にメモを取ったので。（今回は英語のヒアリングがあって、メモがひどい事になってます。。。）
いつものことながら、おかしいところとかあれば、ツッコミなどフィードバックをもらえると嬉しいです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Hadoop Conference Japan 2011 Fallに行ってきました。
まずは、ユーザ会の方々、運営の方々、発表された方々お疲れ様でした。こんな機会を用意していただき、ありがとうございます。
Hadoopは昨年触っていたのですが、最近は縁がなくなってしまいました。
ただ、触っていたときに面白かったので参加してきました。
ということで、今回も自分用にメモを取ったので。（今回は英語のヒアリングがあって、メモがひどい事になってます。。。）
いつものことながら、おかしいところとかあれば、ツッコミなどフィードバックをもらえると嬉しいです。&lt;/p&gt;
&lt;p&gt;場所：ベルサール汐留
日時：2011/09/26 10:00～18:00＋懇親会：18:30～21:00&lt;/p&gt;
&lt;p&gt;オープニングトーク：濱野、太田
　参加者：1100名超！（実際は800名弱？）
　Hadoopの経験：利用経験なしな方が580名
　カンファレンスの認知：Twitterよりも知人、その他が多かった。
　会場提供：リクルート様
　リクルート米谷様より一言。
　　Question VOTE！！サイトを用意。
　　http://mit.recruit.co.jpにて情報提供。
　※残念ながら地下だったため、E-mobileにつながらず、あと、電源確保が難しかったのでMBAをスタンドアロンにしてメモをとっていたので、
　　QAサイトにはアクセスしませんでした。もう少し活用したかったんですが、携帯でTwitterを追っかけるので精一杯。。。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;◎The role of the Distribution in the Apache Hadoop Ecosystem：Todd Lipcon（Cloudera）&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　1.Introduction
　　Todd Lipcon：Clouderaエンジニア
　　Hadoop とHBaseのコミッター
　2. Hadoop Overview
　　HDFS＋MapReduceの説明
　　Hadoopの生まれてきた経緯　
　　　様々な形式のデータが大量に存在し、データのハンドリングが難しくなってきたため。
　　　Flexible, Scalable Solutionが必要に。
　　Hadoop の2つのユースケース
　　　1.Advanced Analytics
　　　　SNS（Web）、Content Optimization（Media）、Network Analytics（Telco）、
　　　2.Data Processing
　　　　Clickstream SessionizationEngagement

　3.Cloudera Overview
　　ClouderaCustomers
　　　・Large National Bank
　　　・Web-Based Media
　　　　click-through dataや広告のログ
　　　・Wireless Telecom
　　　　大量のデータ
　　目標：大量データからビジネスを引き出すこと。
　　Cloudera Japan：トレーニング。NTTDと協業して開発支援も
　4.CDH Overview
　　100% pure Apache Hadoop
　　SCM Epress(Service &amp;amp;amp; Configuration Manager)
　　　Free 
　　なぜ、CDHを利用するの？
　　　Linuxを利用する場合にLinux.orgからはダウンロードしないように、Hadoopも同じように提供したい。
　　　　RedHat系を目指しているみたい。
　　　様々なパッケージの依存関係が混乱を招く。
　　　　CDHならテストが終わってるものが提供されてる。
　　※SolrはLWEがLucidWorksEnterpriseがこれを目指してるのか。
　5.Cloudera Enterprise
　　Activity Monitor：Jobのパフォーマンスをリアルタイムに監視
　　SCM：設定のvalidateや管理。
　　Resource Manager：。。。
　6.まとめ
　　CDH：簡単にHadopが使えるよ。
　　SCM Express：簡単にHadoopの設定ができてフリーだよ
　　Cloudera：Hadoopに関していろいろサポートしているよ。（Enterprise用ソフトやトレーニングなど）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;◎About Hortonworks：Owen O&amp;rsquo;Malley（Hortonworks）&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　1.About Hortonworks
　　2011/2月に設立
　　22人のYahooからのアーキテクトとコミッタにより設立
　2.Credentials
　　Yahooのクラスタの経験者がいますよ。
　　OSSに長けた人達によるチームです。
　3.What is Apache Hadoop
　　Hadoopの説明（別の側面が幾つかあり。）
　　Commodity Hardwareで動く
　　簡単にプログラムできる
　　典型的なアプリケーションのタグクラウド（あとでちゃんと見る）
　　HadoopのほとんどのソースコードはYahooで作られてるよ。
　　Clouderaとか目じゃないよ
　4.Hadoop @ Yahoo!
　　各種サーバや規模など
　　Science Hadoop Cluster &amp;lt;-&amp;amp;gt; Production Hadoop Cluster &amp;lt;-&amp;amp;gt; Serving Systems
　　　という構成で、いろいろやってます。
　5.Hadoop Market
　　ビジネス：ビッグデータを扱って色々やろうね
　　金融系：IT系のコストをOSSとHadoopで削減
　　技術系：
　6.Hortonworks Strategy
　　Hadoopを利用、管理しやすくするためのいろんなことをコミュニティに還元しますよ。
　　性能などについても同様。
　　トレーニングやテクニカルサポートやりますよ。
　QA：
　　Q：42Kのノードの管理ツールはなに？
　　A：手で管理してます。
　　Q：社名の由来は？
　　A：童話でHortonという名前の象の話がある。
　　Q：CDHはおすすめ？それともほかのものがいい？
　　A：※聞き取れず。。。
　　Q：500万Query/月はアドホックQueryもあるの？
　　A：幾つかのクラスタに分けて使ってる。アドホックは不明
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;◎How Hadoop needs to evolve and integrate into the enterprise：Ted Dunning（MapR）&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　・Quick History
　・英語わからない身には辛い。。。
　Zookeeperの人らしい。
　Narrow Foundations
　　HDFSとNASの間には大きな壁があり、大きなデータを移動するのはコストが掛かる。
　Broad Foundation
　　HDFSの代わりにNAS、RDBMSの下に位置するMapRを用意
　　ど、どんな仕組み？-&amp;amp;gt;テクニカルセッションで。
　QA：
　　Q：MapRはOSSにしないのか？
　　A：MapRで開発したものはApacheに還元はしますが、OSSにはしないよ。フリー版は提供するかも
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ここで昼食。午前中からいた人にはランチボックスが提供されました。
午後からはコミュニティトラックとテクニカルトラックの2トラックがありましたが、LTが聞きたかった（それよりも英語が辛かった？）のでコミュニティトラックのど真ん中、最前列に入り浸りました。
&lt;strong&gt;★コミュニティトラック&lt;/strong&gt;
&lt;strong&gt;◎Elastic MapReduce Amazonが提供するHadoop：大谷晋平（Amazon）&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　・Amazonとは
　　Eコマース
　　流通
　　AWS
　　の3つのサービス
　・AWS
　　Low-level、High-level、Cross Service、Tools to access services、アプリケーション
　　色々あるなー
　・Bigデータが大変な理由
　　ケタ違いのデータ量、異なる形式データ、即時性
　　現状システムはスケールしない
　　ビジネスとして成立する？
　　　成立するならすぐスケールだめならすぐ縮小
　・Hadoopとは？
　　これまでのお話。
　　スケーラブル、低価格なハード
　　誰でも入手可能で、実績多数。
　・Amazon EMR
　　AWS上でスケーラブルなインフラ上に構築が可能
　　オンプレミスからMapReduceアプリを移行可能なため、分析、解析に集中可能
　　S3からデータIN/OUTするので、データ欠損がない。
　　Hadoopそのままではチューニングやクラスタサイズ見積もりも難しい
　　　＝＞クラスタサイズを動的に拡張伸縮可能。パフォーマンス最適化もできるよ。
　　0.18、0.20が利用可能。
　　EMRはHDFSとジョブ（タスク）トラッカーを別構成にしている。
　　EC2上にMaster、Core、タスクノードを展開
　　S3にデータを格納
　　SimpleDB（KVS）を利用
　・EMR注目機能
　　ジョブフローの高速化
　　　ジョブの再起動無しにコスト/パフォーマンス比を変更可能。
　　　タスクノードを動的に増やせる
　　柔軟なデータウェアハウスクラスタ
　　　タスクノードをバッチ実行時にのみ増やせる。
　　※増減できるのはタスクノード
　　　Coreノードは増加のみ
　　EMR＋Spotインスタンスの活用
　　　コスト削減効果が非常に高い
　　　AWSの余剰リソースをリーズナブルに提供（Amazon的にもウハハだ）
　・その他の機能
　　東海岸だけだけど、スパコンレベルのインスタンスも利用可能
　　AWS上での最適化設計など
　　※ちょっと時間足りなくなってきたｗ
　・EMRの事例
　　1.Razorfish
　　　ROAS（広告費用対効果）を500%改善（すげー）
　　2.So-net
　・EMR都市伝説
　　物理vs仮想
　　　そりゃ、物理が速いよ
　　EMRの柔軟性・拡張性がセールスポイント
　　　ビッグデータは成功/失敗が読めないのもあるので、
　　　インフラに投資する部分を少なくできるよ。
　　オンプレミスが安い？
　　　いやいや、HWの購入から設定など時間かかる。
　・Beyond Hadoop
　　HadoopのIn/Out含めてスケーラブル、フレキシビリティが重要
　　運用管理の仕組みも重要
　　まだまだやってくよ。
　QA
　　Q：EMRは複数サービスから構築してるけど、一部がダウンするとどーなる？（例：SimpleDBが落ちてるとか）
　　A：ジョブはReRunしてもらうか、SimpleDBの状態をみてリカバリをしてもらう。
　　Q：上記にともない、SLAの計算は？
　　A：SLAはEMRについては定義できてない。S3などはリージョン跨いで
　　Q：S3のセキュリティが心配だが、どう考えてるか？
　　A：いままで脆弱性を晒してデータをロストしてない。
　　　　ユーザコントロールなどもできる。基本的には問題ない
　　Q：EMRでS3を使う＝Hadoopのローカリティの利点が失われるのでは？
　　A：オーバヘッドはあるが、実際のデータはS3で守られているので、HDFSが飛んでも大丈夫。
　　Q：S3からのコピーオーバヘッドはどーなるか？
　　A：Single5で少しずつor分割して全部送るも可能
　　Q：EMRはマルチテナントだけど他のユーザのネットワークの影響を受けないの？
　　A：マルチテナントだと起こる可能性がある。
　　　　M1（？）だと内部ネットワークは専有可能らしい。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;◎LT&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　・Hadoop and Subsystems in livedoor @tagomoris
　　ピーク時に15Gbps。
　　10ノード（36コア）
　　CDH3b2を利用
　　データマイニングではなく、ログからレポーティングをするのに利用している。
　　hadoop streaming + Hiveで実施
　　580G/dayが96サーバから来る
　　ScribeにてHadoop Streaming（Perl）でper hourでHiveにload
　　scribelineをWebサーバに入れててログ配送してくれる。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;**　・Lightweight　@stanaka（はてなCTO：田中慎司さん）**&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　　EMR以前
　　　自前20台クラスタ
　　　ジョブがあふれてきた
　　　ナマMapReduceを利用
　　　PerlでMapper/Reducerを記述（Hadoop Streaming）
　　EMR導入
　　　リソース増やせて便利！
　　　必要な台数に伸縮可能
　　　問題点：
　　　　S3にアップしないとダメ
　　　　　＝＞ログデータをS3に展開するlog2s3.plを作成。毎時実行。
　　　　起動、ジョブキック、結果改修どーする？
　　　　　＝＞Net::Amazon::EMR::Wrapperを作成した。
　　　　　　クラスタ起動、ジョブキック、クラスタ停止などできる
　　　　　作ってみて思ったこと
　　　　　　よかったところ：
　　　　　　　Perlでかける。Cronで実行可能。HiveQL便利。
　　　　　　悪かったところ。
　　　　　　　途中で失敗してクラスタ起動しっぱなしとかがある。S3にデータを展開が大変。複雑な計算がきつい。
　　　　慣れてないエンジニアにも触れるようにしたい
　　　　　＝＞Perlで書けるようにした？。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;**　・HBaseでグラフ構造を扱う（開発中）：アメーバ鈴木**&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　　自己紹介@brfrnl69
　　アメーバのソーシャルグラフ
　　　基本はMySQL
　　　マスタ分散が難しい、シャーディング管理が面倒
　　　　＝＞HBaseでやってみるか。
　　目的　
　　　グラフデータに対して高速に更新追加したい。
　　　隣接ノードが取れればいい（これを高速化したい）
　　　オンライン処理したい
　　　運用コストの削減したい。
　　Not目的
　　　マルチホップはどうでもいい。
　　アーキテクチャ
　　　JavaでGatewayつくってみる。
　・Large-Scale Graph Processing：井上さん（@doryokujin）さん
　　Map/Reduceではグラフ計算だめ？
　　　Vertex基本だとShuffleに問題ががが。
　　BSPの紹介
　　　Bulk Synchronous Processing
　　Google Pregel 
　　SSSP：MapReduce Model
　　　すごい計算時間が掛かりそう。MRの組み合わせが何回回ることやら。
　　　枝が少ないとこっちのほうがいいのか？
　　SSSP：PregelModel
　　　シンプルなアルゴリズム
　　Pregel使えるのあるの？
　　　Hama
　　　GoldenOrb
　　　Giraph
　　　　YERN？YARN？
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;◎リクルート式Hadoopの使い方：石川（リクルート）&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　@ground_beetle
　・導入の課題点
　　バッチ処理時間対策のため。
　　　＝＞実は入れたかっただけｗ
　・導入の障壁
　　現行システムへの影響＋開発工数
　　　＝＞これへの対処がこのあとの話
　・課題の克服と活用シーン
　　Azkaban知らなかった。ジョブスケジューリングツール
　　Hadoop単体ではなく、エコシステム（関連ツール）が魅力
　・活用シーン：Hive
　　SQLゆーがざ多く、HiveQLがSQLライクのため導入が簡単に！
　　既存機能のリプレイス系案件に活躍（低工数＋簡単に高速化）
　　とりあえず、Hive実装
　　　＝＞性能アップのためにMapReduceで書きなおし
　　Hotpepperなどのアトリビューション分析に利用
　・活用シーン：Sqoop＋Hive
　　RDBとHadoop連携のツール：Sqoop
　　現行システムの横にHadoopを配置でき、RDBMSの利点も利用しつつHiveも利用できるようになる。
　　　（※気を付けないといけないけどねぇ。）
　　ゼクシィで活用しようとしてるところ。
　・活用シーン：Mahout
　　マイニング用ツール
　　カーセンサーのレコメンド（同時に閲覧される車種）
　　アソシエーション分析＋クラスタリング
　・活用シーン：BIツールの導入
　　何度か導入しようとして失敗してます。。。
　　BIツールの前処理（クレンジングなど）にHadoopを活用
　・インフラリソースは？
　　全部で118台。
　　最小のクラスタ構成はサーバ6台で構成してる
　・Hadoopで複数処理を回す方法
　　ここまで紹介したものを入れてますよ。Hive、Sqoop、Solr。。。
　・Azkaban
　　TomcatにWar配置で利用可能。
　　LinedInのチームにより作成
　※若干マシントラブルで中断
　・今後のHadoop導入
　　ログ基盤
　　分析エンジン・レコメンドエンジンとして
　　バッチ処理短縮＝トライアンドエラーが簡単にできるようになる。＝色々な気づきが出てくる。
　　アジャイル的な解析が可能に。
　・開発サイクルの短縮ができるエコシステムでビジネスが回りだす。
　・今後の展開
　　MapRが気になってる。
　　　マルチテナント対応ができてうはうはできそう。
　　　EMCと共同して検証中

　QA：
　　Q：性能監視ツールの選別の理由は？
　　A：Zabbix、Cactiです。今から利用しようと思っている段階。
　　Q：CDH、GreenPlum、Apacheをそれぞれ利用してるけど、使い分けのシーンは？比較は？
　　A：CDH3u0です。GreenPlumは使ってないです。理由は言うとクビが飛ぶ可能性ががが。
　　Q：高度なデータ分析ができる技術者はどこからヘッドハントしてるの？
　　A：MITに別途分析チームが存在し、高度な分析をしてくれる。
　　Q：NameNodeの冗長化はどーやってんの？
　　A：象本と一緒DRBD＋HeartBeat
　　Q：EMRの導入を検討してる？
　　A：今後、サーバ数が多くなると導入の検討をしていくと思う。
　　　　現時点は、運用ノウハウも入手するために社内で使ってる。
　　　　EMRになるかRCloud（リクルート社内クラウド）になるかは不明。
　　Q：HBaseを利用してる？
　　A：してないです。スペック的にサーバが買ってもらえないと厳しいです。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;◎The history and the future of Hadoop use case at Rakuten：Tarje Marthinussen（楽天）&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　・Introduction（self、rakuten）
　　NextGeneration Search Group
　　Norwayから来ましたよ。
　・RakutenのBigDataとは
　・Hadoop at rakuten　
　　Recommendation（2009）
　　ProductRanking、GenreRanking、Log解析、（2010）
　　Enhance Search。。。（2011）
　・PigやHiveのようなものが簡単に利用できるようになってきた
　・新しい検索プラットフォームを構築中
　　index 10k docs/sec
　　search 400qps
　・What&amp;#39;s Next Generation Search
　　20%はインデックスとQuery評価の
　　50%がデータの前処理（データとQuery）
　　30%がアナライズ
　・Collecting Data？
　　ログの取得はバッチ処理だった。これをStreamingに（Flume）
　・Flume
　　Zookeeperを利用してFlumeを管理してる？？？
　・気になる部分があったので、改善のコーディングしてるよ。
　　・セキュリティ
　　　マスタで管理できるように
　　・Pools
　　　Agentが送信先がコケてると他のPoolにスイッチ可能に。
　　・MasterlessACKs
　QA
　　Q：パッチ作成は何人でやってるの？
　　A：50人が働いていてOSSコミッターが何人いるかはわからんです。
　　Q：ログはテキストだけど、パース処理はどこで？（古橋さん）
　　A：Flumeは各ノードでうまい構成になっていて
　　　　Decorator
　　　性能問題は？
　　　HiveはJSONデータをうまく活用できてるよ。
　　Q：Masterlessとそうじゃないバージョンの性能比は？
　　A：ノード数が増えると
　　Q：HBaseじゃなくてCassandraなの？
　　A：（※英語きつい。。。聞き取れず）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;◎マーケティング向け大規模ログ解析事例紹介：原謙治（NTTコミュニケーション）&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　・自己紹介
　・BizCITYというクラウドサービスを展開中
　　まずは、宣伝。
　　Bizストレージ、Bizマーケティングとして大規模データ、分散処理を実施してる。
　・Hadoop in Bizマーケティング
　　CGMデータを解析して口コミ情報抽出
　　アクセスログから行動情報抽出
　・Hadoop in BuzzFinder
　　CGM DBからHDFSにインポートして解析開始。DBはPostgreSQL
　　処理フローは資料参照。
　　リッチインデクシング技術（NTT研究所が開発した日本語解析技術）
　　※検索インデックスってどんなものなんだろう？
　　ポジネガ分析気になる。
　・Fast Map-Reduce for PaaS Services
　　アクセス解析やマーケティング解析を行う上でShuffleコストが大きくなるため大量マシンが必要
　　　＝＞マシン数を減らすことが目的？
　　Map Multi-Reduce、PJoinはNTT研究所が開発した技術！？（子象本にないっけ？？）
　　　＝＞Multi-Reduce。同一ノード上のMap出力をReduceすることで、shuffleフェーズに渡るデータを削減している。
　　　　＝＞PJoin　
　QA
　　Q：Map multi-reduce、PJoinはどう実現してるのか？公開するのか？
　　A：Hadoopの0.19に改造をしてる。
　　　　公開できるかどうかはわかりません。NTT研究所が研究しているものを試しに実装してみてるから。
　　　　なのでパッチにはなりませんかね（研究所に聞いてみないとわからないっす）
　　Q：性能が向上したパターンはあったが、悪化する場合などはあるのか？
　　A：不明
　　Q：Map-side Joinとの違いは？
　　A：。。。
※この辺で少し集中力が途切れてしまいました、すみません。（次に集中したかったので。。。）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;◎ミクシィにおけるHadoopの利用：伊藤敬彦（mixi）&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　LSH-Based Recommendation engine powered by hadoop
　・実はmixiの話はすくないよ。
　・利用している環境。5or6台/クラスタ
　・Hadoopの活用
　　ログデータをHDFSに保存
　　DBコンテンツをHDFSに入れることで、DBに負荷をかけずに解析する。
　・マイニングも検証中
　　検索クエリログをベースにデータマイニング
　では、本題。
　・LSHを利用した推薦
　・推薦とは？
　　mixiにはいろいろ推薦（レコメンド）を付加できるサービスがある。
　・推薦するには？
　　類似インスタンス集合を抽出する。
　　インスタンスは文書だったりユーザだったり
　・類似インスタンスとは？
　　同じ特徴を持つ集合
　　例：同一商品購入したユーザとか同一単語を持つ文書とか
　・抽出するには？
　　全ユーザごとに全ユーザとの類似性をチェックすると時間がかかりすぎる！
　　＝＞LSHを利用しよう！
　・LSHについて
　　特徴：
　　・速い！
　　・精度はそれほどではない
　　事例：
　　・Google Newsのレコメンド（USロケール）
　・LSHの処理ステップ
　　2つだけ。
　　1.インスタンスベクトルを計算（似ているデータは同じ値が返りやすい関数）
　　2.同一値が帰ってきたデータが類似インスタンス
　・インスタンスベクトル例（あとでスライド見ようね）
　・Likelikeがいち実装。Hadoopでうごくよ
　・実験について
　　トップページに表示されていない記事を知ってもらうために推薦してみるぞ！
　・実験１
　　性能を測ってみた
　・実験２
　　精度を調べてみた。
　　精度はほんとにひどいな。。。
　　＝＞同一カテゴリの遷移を元に計算したらそれなりになってきた。
　・今後
　　データソースを増やしたい。
　　他のアルゴリズムも実装したい
　・CM
　　以下も作ってますよ。
　　Oluolu
　　Anuenue

　QA
　　Q：Mahoutは使わないんですか？
　　A：Likelikeを作った頃にMahoutになかったので作った。
　　　　性能比較したいと思ってる。
　　Q：ログサーバのデータ転送はどーやってる？
　　A：伊藤さんのところにはどういう仕組みかは上がって来てない。

　　Q：ベクトルの次元数はどのくらいまで耐えられる？
　　A：高次元のデータに対して耐えられるように作られてる。
　　　　次元数が低くて良い制度が欲しければ他のアルゴリズムがいいかも。
　　Q：ユーザのベクトルを作るテクニックは？
　　A：画像などであれば大変だけど、ユーザであれば、単語とかキーワードとかで

　　Q：ニュース以外のデータは？
　　A：まだまだ実験中。まだやってない。

　　Q：推薦される記事数のばらつきはどういった理由が考えられる？
　　A：後ほど考察してQAサイトに入れます。

　　Q：LSHをMapReduceに載せたということだけど、関数の計算をさせてる？
　　A：Iterationはしてない。
　　　Map側でLSH関数計算してる。Reduceにて類似インスタンスを導出してる。

　　Q：今後の予定の空間木とは？R-Treeだと高次元できついのでは？
　　A：低次元にて利用できるように用意したい。
　　　
　　Q：HamaとかGiraphで高速化させてみるのはどう？
　　A：イテレーションがいらないからあまり利用用途がないかなぁ。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;◎懇親会&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　AWSを採用しない企業がいくつかあったのでそのあたりを質問してみた。
　AWSは通常運用に利用すると結構なコストがかかる場合があるので、ノウハウがある企業や
　データ量が多い場合は、オンプレミスの場合を選択しているらしい。
　やはりスポットで利用する方がお得感があるみたいだった。
　Twitter上だけの知り合いだった方々と面識が持てたのが一番の収穫でした。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;感想＋調べること&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;感想&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
　会場規模とかQAサイトとかオープニングムービーとかすごかったです。しかも無料。さすがリクルートさん。
　ランチボックスとか出てきたし。装飾もとても無料のカンファレンスと思えない出来でした。
　午前中はHadoopをもとにした各社の戦略とCMという感じが色濃かったです。少しずつ各社の立ち位置が違いそれはそれで面白かったです。

　AWSの説明を聞いてやはりAWSを扱える技術は必要だと再認識。
　お金かけないで触ってみれるレベルでまずは触ってみるかなぁ。
　洗脳されてるのかもしれないけど、自社or自前でHadoop運用するのは厳しそうです。（懇親会ですこし認識が変わった）

　カフェコーナーでは、リクルートのMITの冊子が配られていたり、映像や案内に使われていたHadoopマスコットのシールが配られていたりと小技も聞いてました。
　あと、オライリーの販売コーナーも用意されていて、思わず子象本を買ってしまう罠にはまったりもしましたが。。。

　mixiの伊藤さんの話は最後で疲れていたのですが、ストーリーが上手くできていて、実験や事例もあったのでわかりやすかったです。
　Hadoopはエコシステムと呼ばれるHadoopを活用するツール群（Hiveの話が多かった？）、Hadoopの今後、Hadoopを活用したログ解析の話など、
　話題が豊富でそれぞれの話が面白くて困ってしいまうくらいです。
　いくつかのセッションで出てきたのですが、アクセスログなどをHDFS上に集めるための仕組みがまだ乱立（定番がまだない）している感じを受けました。
　Flume、Scribe、MapR。。。などなど

　あとは、テクニカルセッションのビデオがアップされたらまた目を通さないと。。。
　残念ながらHadoopから少し縁遠くなっていますが、これからもネタや参考になりそうな話には事欠かなそうなのでかじりついていこうと思います。
　※一番やらないといけないのは英語の勉強かもしれないです。。。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;調べること&lt;/strong&gt;
一応Solrの人なので、Solrに関連しそうな話に興味がいってしまいます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NTT研究所のリッチインデクシング技術&lt;/li&gt;
&lt;li&gt;やっぱりAWS触ってみる。EMRまでとは言わないが。（herokuもちょっと興味あるが。）&lt;/li&gt;
&lt;li&gt;Mesos、GreenPlum、Scribe、Storm、Flume、Giraphこれらの概要&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;関連サイト&lt;/strong&gt;
　&lt;a href=&#34;http://mit.recruit.co.jp/hadoop/conference2011fall/SES000000001?pno=1&#34;&gt;公式QAサイト&lt;/a&gt;。後日録画していたセッションがアップされるそうです
　&lt;a href=&#34;http://d.hatena.ne.jp/okachimachiorz/touch/20110927/1317076207&#34;&gt;Hadoop Conferene Japan Fall 2011 - 急がば回れ、選ぶなら近道&lt;/a&gt;
　&lt;a href=&#34;http://itpro.nikkeibp.co.jp/article/NEWS/20110926/369421/?ST=cloud&amp;amp;P=1&#34;&gt;Hadoopカンファレンスが開催、本格普及を見据えた支援サービスや先進事例が充実 - ニュース：ITpro&lt;/a&gt;
　&lt;a href=&#34;http://infra-engineer.com/hadoop/hadoop-conference-japan-2011-fall%E3%81%A7%E4%BD%BF%E7%94%A8%E3%81%95%E3%82%8C%E3%81%9F%E8%B3%87%E6%96%99%E3%82%84%E3%81%A4%E3%81%B6%E3%82%84%E3%81%8D-hcj11f/&#34;&gt;Hadoop Conference Japan 2011 fallで使用された資料 #hcj11f | インフラエンジニアのつぶやき&lt;/a&gt;（スライドをまとめてくれてます。）&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>「7つの言語　7つの世界」 Io 0日目(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/09/23/7%E3%81%A4%E3%81%AE%E8%A8%80%E8%AA%9E-7%E3%81%A4%E3%81%AE%E4%B8%96%E7%95%8C-io-0%E6%97%A5%E7%9B%AE/</link>
      <pubDate>Fri, 23 Sep 2011 03:34:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/09/23/7%E3%81%A4%E3%81%AE%E8%A8%80%E8%AA%9E-7%E3%81%A4%E3%81%AE%E4%B8%96%E7%95%8C-io-0%E6%97%A5%E7%9B%AE/</guid>
      <description>&lt;p&gt;台風15号すごかったですね。幸いにも（？）夏休みだったので、通勤などでひどい目に合わずにすみました。
風雨はすごくてちょっと怖かったですが。。。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;台風15号すごかったですね。幸いにも（？）夏休みだったので、通勤などでひどい目に合わずにすみました。
風雨はすごくてちょっと怖かったですが。。。&lt;/p&gt;
&lt;p&gt;さて、夏休みに進める予定が、子供の寝かしつけで一緒に寝てしまう日が続いてしまい、
間が開いてしまいました。&lt;/p&gt;
&lt;p&gt;0日目というタイトルになっているのは、まだ、1日目に入ってないからです。。。
Ioという未知の言語をMBAにそのままインストールするのも抵抗があり、VirtualBox上にLinuxをインストールしてから
進めようとして思いの外手こずってしまったためです。
ということで、0日目として、VirtualBox上にScientific Linux 6.1をインストールしてIoのインストールまでではまった箇所を記録として残しておきます。&lt;/p&gt;
&lt;h3 id=&#34;罠その１&#34;&gt;罠その１&lt;/h3&gt;
&lt;p&gt;罠と言うよりは、私の無知に関する部類なのですが。。。
Scientific Linux 6.1のインストールは特に手こずることなくインストールでき、
起動も出来ました。
次にscpコマンドでダウンロードしてきたIoのソースをLinuxに渡そうとしてはまりました。
問題となったのはネットワーク接続が「NAT」のみだったため。
NATのため、Linux（ゲストOS）から外部への接続は可能だったのですが、Mac（ホストOS）からLinux（ゲストOS）への接続ができませんでした。
で、変更したのは以下の2点。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VirtualBoxの環境設定-&amp;gt;ネットワーク-&amp;gt;ホストオンリーネットワークの追加&lt;/li&gt;
&lt;li&gt;仮想マシン（Linux）の設定-&amp;gt;ネットワーク-&amp;gt;アダプタ2を有効にしてホストオンリーアダプタを割り当て&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;1番目のホストオンリーネットワークの追加をしておかないと、2番目のアダプタ2でホストオンリーアダプタを選択したときにエラーが出て、設定ができませんでした。割り当てるべきアダプタを先に用意しとかないとダメですよね、そりゃあ。&lt;/p&gt;
&lt;h3 id=&#34;罠その２&#34;&gt;罠その２&lt;/h3&gt;
&lt;p&gt;これも罠というほどではないのですが。。。
Ioのビルドには&lt;a href=&#34;http://www.cmake.org/&#34;&gt;cmake&lt;/a&gt;が必要なのですが、Scientific Linux 6.1に入っているcmakeはバージョンが古い（2.6.4）ため、必要なバージョン（2.8以上）をインストールしないとダメでした。
インストール自体はcmakeのサイトにある手順通りのため割愛します。&lt;/p&gt;
&lt;h3 id=&#34;罠その３&#34;&gt;罠その３&lt;/h3&gt;
&lt;p&gt;これもちゃんとドキュメント読めよというレベルですが。。。
Ioのインストールは以下のコマンドを実行するという話です。
私がcmakeについて知らなかったと言われればそれまで。。。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
$ cd io
$ mkdir build &amp;amp;amp;&amp;amp;amp; cd build
$ ccmake ..
$ make
$ sudo make install
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;3つ目の「ccmake」の部分がIoのGetting Startedの下の方にありました。上の方に記載がある「cmake」ではエラーがでてうまく行かなかったので。
IoのGetting Startedにもありますが、ccmakeの場合はCUI上にGUIのようなものが起動するので、「c」（configure）と実行後、「g」（generate）を実行して最後に「e」（exit）でccmakeを離れます。
するとmakeが実行できるようになりました。&lt;/p&gt;
&lt;p&gt;あとは、/etc/ld.so.conf.d/io.confファイルを作成し、「/usr/local/lib」と記述。ldconfigを実行することで、Ioが実行可能になります。
ということで、1日目に入れず終了。。。&lt;/p&gt;
&lt;p&gt;明日は出来るかなぁ。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Lucene/Solr 3.4リリース（速報）(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/09/15/lucene-solr-3-4%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E9%80%9F%E5%A0%B1/</link>
      <pubDate>Thu, 15 Sep 2011 09:31:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/09/15/lucene-solr-3-4%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E9%80%9F%E5%A0%B1/</guid>
      <description>&lt;p&gt;Solr/Lucene 3.4がリリースされました。（速報）&lt;/p&gt;
&lt;p&gt;以下、各サイトへのリンクです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://lucene.apache.org/solr/#14+September+2011+-+Solr+3.4.0+Released&#34;&gt;Solrリリースのお知らせ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://lucene.apache.org/#14+September+2011+-+Lucene+Core+3.4.0+and+Solr+3.4.0+Available&#34;&gt;Luceneリリースのお知らせ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ちなみに、先日のSolr勉強会で関口さんが話されていた&lt;a href=&#34;https://issues.apache.org/jira/browse/LUCENE-3418&#34;&gt;インデックスが壊れるバグ&lt;/a&gt;ですが、
先日のアメリカのハリケーン（Irene）で実際に電源が落ちて見つかったみたいです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Solr/Lucene 3.4がリリースされました。（速報）&lt;/p&gt;
&lt;p&gt;以下、各サイトへのリンクです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://lucene.apache.org/solr/#14+September+2011+-+Solr+3.4.0+Released&#34;&gt;Solrリリースのお知らせ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://lucene.apache.org/#14+September+2011+-+Lucene+Core+3.4.0+and+Solr+3.4.0+Available&#34;&gt;Luceneリリースのお知らせ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ちなみに、先日のSolr勉強会で関口さんが話されていた&lt;a href=&#34;https://issues.apache.org/jira/browse/LUCENE-3418&#34;&gt;インデックスが壊れるバグ&lt;/a&gt;ですが、
先日のアメリカのハリケーン（Irene）で実際に電源が落ちて見つかったみたいです。&lt;/p&gt;
&lt;p&gt;ということで、3.4がリリースされたので、3.1から3.3は利用しないほうがいいようです。&lt;/p&gt;
&lt;p&gt;&lt;span style=&#34;color:#FF0000&#34;&gt;追記：&lt;/span&gt;
&lt;a href=&#34;http://www.lucidimagination.jp/2011/09/lucene-3-4solr-3-4-%E3%81%8C%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9/&#34;&gt;lucidimagination.jpのサイトに日本語のリリースノートが公開されていた&lt;/a&gt;ので、リンクを記載しておきます。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>「7つの言語　7つの世界」 Ruby 3日目（最終日）(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/09/14/7%E3%81%A4%E3%81%AE%E8%A8%80%E8%AA%9E-7%E3%81%A4%E3%81%AE%E4%B8%96%E7%95%8C-ruby-3%E6%97%A5%E7%9B%AE%E6%9C%80%E7%B5%82%E6%97%A5/</link>
      <pubDate>Wed, 14 Sep 2011 18:21:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/09/14/7%E3%81%A4%E3%81%AE%E8%A8%80%E8%AA%9E-7%E3%81%A4%E3%81%AE%E4%B8%96%E7%95%8C-ruby-3%E6%97%A5%E7%9B%AE%E6%9C%80%E7%B5%82%E6%97%A5/</guid>
      <description>&lt;p&gt;ということで、Rubyの最終日の感想。
&lt;span style=&#34;color:#FF0000&#34;&gt;今回もセルフスタディの私の回答が最後の方に記載されてます。&lt;/span&gt;見たくない人は気をつけてください。
ツッコミ大募集です。コメント欄にどしどしコメントください。そこは違うだろ？こっちのほうがいいのでは？という感じで。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ということで、Rubyの最終日の感想。
&lt;span style=&#34;color:#FF0000&#34;&gt;今回もセルフスタディの私の回答が最後の方に記載されてます。&lt;/span&gt;見たくない人は気をつけてください。
ツッコミ大募集です。コメント欄にどしどしコメントください。そこは違うだろ？こっちのほうがいいのでは？という感じで。&lt;/p&gt;
&lt;h2 id=&#34;感想&#34;&gt;感想：&lt;/h2&gt;
&lt;h3 id=&#34;メタプログラミングが特徴&#34;&gt;◎メタプログラミングが特徴&lt;/h3&gt;
&lt;p&gt;例：ActiveRecordのhas_many、has_oneがいい例&lt;/p&gt;
&lt;h3 id=&#34;オープンクラス&#34;&gt;◎オープンクラス&lt;/h3&gt;
&lt;p&gt;クラス定義をいつでも変更可能。
あらゆるクラスやオブジェクトをいつでも再定義できる
書きやすいコードのために再定義が可能＝何でもできるが気を付ける必要あり。
DSLの定義に便利。
確かに便利。ただ、範囲を限定しないと予期せぬ場所で問題が発生しそう。
&lt;span style=&#34;color:#0000FF&#34;&gt;※解析するための手段はいいのがあるのかな？=&amp;gt;method_missingみたい&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&#34;method_missing&#34;&gt;◎method_missing&lt;/h3&gt;
&lt;p&gt;対象メソッドが見つからない場合に最後に実行されるメソッド
通常はNoMethodErrorが発行される。&lt;/p&gt;
&lt;h3 id=&#34;モジュールによるメタプログラミング&#34;&gt;◎モジュールによるメタプログラミング&lt;/h3&gt;
&lt;p&gt;defやattr_accessorなどその一例。
DSLではモジュール内にメソッドを定義してメソッド＋定数を利用
&lt;span style=&#34;color:#0000FF&#34;&gt;ActsAs&amp;hellip;ってそういう意味合いだったのか。&lt;/span&gt;
親クラスバージョン、親クラス＋マクロ、モジュールそれぞれの実装の仕方の紹介。
&lt;span style=&#34;color:#0000FF&#34;&gt;※マクロもinclude同様、実行順で、メソッドの上書きが発生するのか？&lt;/span&gt;
ActiveRecordではメタプログラミングを利用してDBのカラム名からアクセサを追加。
シンタックスの美しさ＝読みやすさ&lt;/p&gt;
&lt;h2 id=&#34;感想疑問点&#34;&gt;感想＆疑問点：&lt;/h2&gt;
&lt;p&gt;メタプログラミングはフレームワークを作成するのが便利そう。
ただし、エラーや問題が起きた時の対処をきちんと準備しておかないとひどい目に合いそう。
&lt;span style=&#34;color:#0000FF&#34;&gt;クラスやモジュールはわかりやすい単位で1ファイルにまとめるもの？&lt;/span&gt;
&lt;span style=&#34;color:#0000FF&#34;&gt;ファイル名の規則とかあったりする？&lt;/span&gt;
&lt;span style=&#34;color:#0000FF&#34;&gt;ディレクトリ構成でパッケージ構成が可能？&lt;/span&gt;
&lt;span style=&#34;color:#0000FF&#34;&gt;複数のモジュール（gemとか）を組み合わせて使っている場合にincludeの順序がどのようになるかが気になる。&lt;/span&gt;
予期せぬ順序でincludeされて利用しようと思ったメソッドがオーバーライドされてるとかありそう。
追っかけるのがまた大変そうだ。
異なるパフォーマンス（開発者の開発速度）の観点が一番おもしろかった。ただ、なれるまでは大変そう。すんなりinjectとかコードブロックをうまく利用するイメージがわかない。
まぁ、思考については反復練習かな。これは他の言語でも一緒かな&lt;/p&gt;
&lt;p&gt;ようやく、Rubyの世界が終わりました。楽しかった。次は未知の言語である「Io」です。&lt;/p&gt;
&lt;h3 id=&#34;試してみよう&#34;&gt;（試してみよう：）&lt;/h3&gt;
&lt;dl&gt;
&lt;dt&gt;○eachメソッドがCsvRowオブジェクトを返すようにCSVアプリケーションを変更せよ。そのCsvRowのmethod_mmissingを使って、与えられた見出しの列の値を返すようにせよ。&lt;/dt&gt;
&lt;dd&gt;
モジュールにて実装してみた。
```
&lt;p&gt;module ActsAsCsv&lt;/p&gt;
&lt;p&gt;def self.included(base)
base.extend ClassMethods
end&lt;/p&gt;
&lt;p&gt;module ClassMethods
def acts_as_csv
include InstanceMethods
end
end&lt;/p&gt;
&lt;p&gt;module InstanceMethods&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def read
  @csv_rows = []
  file = File.new(self.class.to_s.downcase + &#39;.txt&#39;)
  headers = file.gets.chomp.split(&#39;, &#39;)

  file.each do |row|
    @csv_rows &amp;lt;&amp;lt; CsvRow.new(headers,row.chomp.split(&#39;, &#39;))
  end
end

def each(&amp;amp;block)
  csv_rows.each(&amp;amp;block)
end

attr_accessor :csv_rows

def initialize
  read
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;end&lt;/p&gt;
&lt;p&gt;class CsvRow
def initialize(headers, csv_contents)
@headers = headers
@csv_contents = csv_contents
end&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;attr_accessor :headers, :csv_contents

def method_missing name, *args
  csv_contents.fetch(headers.find_index(name.to_s))
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;end
end&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ここまでが実装したモジュール＋クラス。
以下は実行例。id,name,sizeというheaderをもつCSVを使ってみた。
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;require &amp;lsquo;acts_as_csv_module_mod.rb&amp;rsquo;
=&amp;gt; true
class RubyCsv
include ActsAsCsv
acts_as_csv
end
=&amp;gt; RubyCsv
csv = RubyCsv.new
=&amp;gt; #&amp;lt;RubyCsv:0x103c4c530 @csv_rows=[#&amp;lt;ActsAsCsv::CsvRow:0x103c4c030 @csv_contents=[&amp;ldquo;1&amp;rdquo;, &amp;ldquo;RubyCsv.class&amp;rdquo;, &amp;ldquo;20&amp;rdquo;], @headers=[&amp;ldquo;id&amp;rdquo;, &amp;ldquo;name&amp;rdquo;, &amp;ldquo;size&amp;rdquo;]&amp;gt;, #&amp;lt;ActsAsCsv::CsvRow:0x103c4be78 @csv_contents=[&amp;ldquo;2&amp;rdquo;, &amp;ldquo;JRubyCsv.class&amp;rdquo;, &amp;ldquo;50&amp;rdquo;], @headers=[&amp;ldquo;id&amp;rdquo;, &amp;ldquo;name&amp;rdquo;, &amp;ldquo;size&amp;rdquo;]&amp;gt;]&amp;gt;
csv.each {|row| puts row.name}
RubyCsv.class
JRubyCsv.class
=&amp;gt; [#&amp;lt;ActsAsCsv::CsvRow:0x103c4c030 @csv_contents=[&amp;ldquo;1&amp;rdquo;, &amp;ldquo;RubyCsv.class&amp;rdquo;, &amp;ldquo;20&amp;rdquo;], @headers=[&amp;ldquo;id&amp;rdquo;, &amp;ldquo;name&amp;rdquo;, &amp;ldquo;size&amp;rdquo;]&amp;gt;, #&amp;lt;ActsAsCsv::CsvRow:0x103c4be78 @csv_contents=[&amp;ldquo;2&amp;rdquo;, &amp;ldquo;JRubyCsv.class&amp;rdquo;, &amp;ldquo;50&amp;rdquo;], @headers=[&amp;ldquo;id&amp;rdquo;, &amp;ldquo;name&amp;rdquo;, &amp;ldquo;size&amp;rdquo;]&amp;gt;]
csv.each {|row| puts row.id}
(irb):8: warning: Object#id will be deprecated; use Object#object_id
2179096600
(irb):8: warning: Object#id will be deprecated; use Object#object_id
2179096380
=&amp;gt; [#&amp;lt;ActsAsCsv::CsvRow:0x103c4c030 @csv_contents=[&amp;ldquo;1&amp;rdquo;, &amp;ldquo;RubyCsv.class&amp;rdquo;, &amp;ldquo;20&amp;rdquo;], @headers=[&amp;ldquo;id&amp;rdquo;, &amp;ldquo;name&amp;rdquo;, &amp;ldquo;size&amp;rdquo;]&amp;gt;, #&amp;lt;ActsAsCsv::CsvRow:0x103c4be78 @csv_contents=[&amp;ldquo;2&amp;rdquo;, &amp;ldquo;JRubyCsv.class&amp;rdquo;, &amp;ldquo;50&amp;rdquo;], @headers=[&amp;ldquo;id&amp;rdquo;, &amp;ldquo;name&amp;rdquo;, &amp;ldquo;size&amp;rdquo;]&amp;gt;]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
&amp;lt;span style=&amp;#34;color:#FF0000&amp;#34;&amp;gt;※idというcsvフィールド名にしたら、object_idとかぶっているようでwarningが出てしまった。&amp;lt;/span&amp;gt;

CsvRowクラスの定義がモジュールの中に入っているが、この実装でも動くみたい。ただ、パッケージみたいな感じ7日までは調査してない。。。
&lt;/code&gt;&lt;/pre&gt;</content:encoded>
    </item>
    
    <item>
      <title>第6回Solr勉強会に参加しました。(Jugemより移植)</title>
      <link>https://blog.johtani.info/blog/2011/09/12/%E7%AC%AC6%E5%9B%9Esolr%E5%8B%89%E5%BC%B7%E4%BC%9A%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Mon, 12 Sep 2011 16:03:00 +0900</pubDate>
      
      <guid>https://blog.johtani.info/blog/2011/09/12/%E7%AC%AC6%E5%9B%9Esolr%E5%8B%89%E5%BC%B7%E4%BC%9A%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://atnd.org/events/18637&#34;&gt;「第6回Solr勉強会」&lt;/a&gt;に参加しました。
なんだかんだと第6回で、今のところ皆勤賞です。&lt;/p&gt;
&lt;p&gt;ということで、主に自分用ですが、メモなどとったので。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;概要&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;日時 :2011/09/12 19:00 to 21:00&lt;/li&gt;
&lt;li&gt;定員 :110 人&lt;/li&gt;
&lt;li&gt;会場 :株式会社 ECナビ&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
1.「Lucene/Solr 3.2-3.4」 by  ロンウイット 関口 宏司さん
　※Solr2.9.4、3.1でデグレードし、Solr3.4で修正されたバグがあります。
　　インデックス中にPCがシャットダウンされた場合にインデックスが壊れてしまうものあり。
　　Solr3.1-3.3は使用しないようにとのこと。
　○index
　　・IndexWriter.addDocuments(docs)
　　　複数ドキュメントの更新が可能になった。
　　　※検索で話をする親子関係のNestedQuery向けの登録にも利用する。
　　　この登録では途中でフラッシュされないため、セグメントが分割されない特徴あり。
　　　複数だけでなく、
　　・TieredMergePolicy
　　　※Lucene3.2/Solr3.3からデフォルトになった。
　　　新しいインデックスのマージポリシー。（amebaの開発者ブログに説明があった。）
　　　インデックスの登録順が守られていたが、このマージ処理では保証がされなくなったので注意が必要。
　　・update.chain
　　　update.processorがdeprecatedに。
　　　update.chainというパラメータに変更
　○index(cont&amp;#39;d)
　　・TwoPhaseCommit
　　　
　　・UniqFieldsUpdateProcessor
　　　重複した値を削除するための機能。
　　　UIMAでの提案から取り込まれた
　○search
　　・group=on
　　　検索グルーピング機能を使えるパラメータ
　　・{!term}
　　　クエリパーサを通さないでTermQueryをかける機能。
　　・structured explanation
　　　debug=onの算出根拠を
　　　XMLタグで構造化されたExplanationが取得可能に
　　・ReloadCacheRequestHandler
　　　関口さん担当。ExternalFileField
　　　インデックス外（外部ファイル）を元にFunctionQueryの情報を利用可能にできるのだが、
　　　このファイルのリロードが可能になる。
　　・Carrot2　3.5.0
　　　アップグレード。
　　　デモあり。Carrot2のworkbenchとか　　
　○search(cont&amp;#39;d)
　　・hl.phraseLimit parameter
　　　FastVectorHighlighterの高速化用パラメータ。
　　・{!cache=false}
　　　キャッシュを利用しないためのローカルパラメータ。fqのローカルパラメータに利用可能。
　　　検索セッション内でキャッシュへの処理（参照・登録）をしなくなる
　　・BlockJoinQuery
　　　NestedDocumentQueryの名前が変更された。
　　　（Luceneで登録されたところまで。）
　○schema
　　・KStemFilter
　　　PoterStemmerとは別のstemmer
　　・ReversePathHierarchyTokenizer
　　　パスの構造化インデックスの逆バージョン
　　・ommitPositions=&amp;#34;true&amp;#34;
　　　指定が可能になった。
　　・version 1.4
　　　スキーマのバージョンが新しくなった。
　○admin/tools
　　・action=MERGEINDEXES&amp;amp;srcCore=coreName
　　　コア名指定可能。
　　・action=UNLOAD&amp;amp;deleteIndex=true
　　　UNLOAD時にインデックス削除
　　・action=CREATE&amp;amp;property.name
　　　※ぎゃーーー。打ち込み失敗。
　○ぎゃーーーー失敗。
　○技術者大募集中！！
　Q&amp;amp;A
　　Q：クラスタリングの日本語は大丈夫？入門には制限があると記載があったが。
　　A：analyzerが記載が簡単になってるかは不明
　　　　前処理をして別フィールドにメタデータ的にある程度単語で区切ったようなものを作成したほうがいい。
　　Q：グルーピングで、グルーピング後のファセット件数が取得可能か？
　　A：3.4ではグループ数で表示可能。
　　　　パラメータ指定で可能。

2.「Solr＠cookpad」 　by ＠PENGUINANA_ さん
　○COOKPADとは？
　　・レシピ投稿サイト
　　・105万のユーザのレシピ
　　・30代女性の1/2が利用
　○レシピ検索
　　・PC：1307万UU、1億回強/月
　　・モバイルで利用が多く、スーパの店頭などで利用？
　　・Androidもあるよ。
　○人気順検索（Solrですよ）
　　
　○自己紹介
　　・＠PNGUINANA_
　　・情報可視化＋検索が好き！！
　　　yats、など
　○Solrはどのように利用
　　・レシピ検索
　　・もしかして
　○Tritonnから移行
　　同じ検索結果になるようにして徐々に移行
　○なぜ？
　　パフォーマンスが良い。
　　フィールド追加が簡単
　　レプリケーション-&amp;gt;ファイルベース
　　プロトタイピングが楽
　○Solr4 nightly（on Oracle JVM）
　　・マルチコア利用
　　・Ruby on Railsから
　○簡単な構成＋説明
　　・バッチからSolrへの更新をしている。
　　　※Analyzerを利用せず、バッチ側で分かち書き、正規化、同義語展開を行っている。
　　　Rubyで全部かけるほうが社内に展開しやすい。
　　・バッチ終了後、可能ならoptimize
　　　※検索速度がmax20%高速になる。
　　・マスタ-&amp;gt;スレーブレプリケーションはschema.xmlもレプリケート
　　　新規フィールド追加などはレプリケーションだけで実行できて楽。
　　・アプリはMySQLとSolrのSlaveにアクセス。
　　　Solrにはidのみ。本文はMySQLから取得
　　　インデックスサイズを小さくできる＝レプリケーション時間が短くなる
　　　オンメモリにできるため検索速度も向上
　○監視（munin）
　　・監視項目（コア別）：
　　　クエリ：QTime/QPS
　　　キャッシュ：hit/eviction
　　　　キャッシュから漏れている数をみてキャッシュサイズを定期的に変更して無駄をなくす
　　　インデックス：サイズ/docの数
　　　　運用してから重要。開始当初は気にしてるが、そのうち気にならなくなるため。
　　　レプリケーション：所要時間
　　　　スレーブ間でのズレを検知するため。
　　　※コアごとに監視することで、問題点を把握しやすくしている。
　○監視（nagios）
　　・監視項目（コア別）：
　　　　サーバの基本的なヘルスチェック
　　　　　Solrが動いてるサーバのはなし。
　　　　レプリ：インデックスバージョンのチェック
　　　　　ズレが長いとメールが飛ぶ
　○便利だった機能
　　・DynamicField
　　　フィールドをあとから簡単に追加可能。
　　　例：人気順のアルゴリズムの違うフィールド。検索用フィールド
　　・FacetQuery
　　　絞り込み検索をクエリで記載可能。
　　　現時点では社内向け検索機能で利用。
　　　※ファセットで簡単な解析もやってる。
　　　　例：鍋の季節ごとの登録件数。
　　・HTTP経由で色々可能
　　　検索の並列化
　　　　通常検索画面：3クエリを同時実行
　　　　あるプロトタイプ画面だと8クエリで実行したりしてる。
　　・分散検索（Distributed Search）
　　　簡単にsharding可能
　　　　思いクエリは４shardで投げる
　　　　オーバヘッドが大きいので思いクエリにだけ利用しているらしい。
　○開発の流れ
　　・まずはステージングを更新
　　・問題なければマスターも更新
　　　例外：
　　　　フィールド追加するだけだったら直接マスタへ
　　　　例：ファセット追加など。
　○パフォーマンスとか大丈夫？
　　本番で複数のバージョンを持っており、
　　バグっていても自動フォールバックするらしい。
　　価値があったらパフォーマンス向上＋テスト追加
　　例：スニペット変更
　○気になっている機能
　　・not to cache(SOLR-2429)
　　・SurroundQuery(Solr-2703)
　　・JOIN(SOLR-2272)
　　　SQLのJOINなイメージ
　　・BloomFilter(SOLR-1375)
　　　単語が存在するかどうかのチェック
　○Solr入門おすすめ
　○おすすめ
　　・http://blog.sematext.com
　　　月一で新機能が出てくる
　　・SolrのJIRA
　　・@otisg
　○今後やりたいこと
　　・わかち書きの精度向上
　　・検索セッションの分析
　　　nDCG、クエリ分類、検索意図
　　・デバイス対応
　　・パーソナライズ
　Q&amp;amp;A
　　Q：同義語は誰が集めている？
　　A：外部辞書を利用。０件キーワードから解析して取得
　　　　単語登録も一緒。
　　Q：プチトマトとトマトの違いはどうやってる？
　　A：上位、下位の概念で同義語を利用している。
　　　本にあるよ。
　　Q：もしかしてはSolrの機能？
　　A：Solrではない。訂正候補の単語をSolrに検索してからチェックして表示する。
　　Q：人気順はどういった計算をしてるんですか？計算してから登録？By 大谷
　　A：１フィールドに外から入れている。
　　Q：RubyからSolrの利用方法は？独自？ライブラリ？By 大谷
　　A：Rsolrを利用しており、コネクション管理にだけ利用している。
　　　　あとは、ラッパーを独自で作成。
　　Q：4.0を利用している理由は？なかなかチャレンジャー。By関口
　　A：グループクエリを利用したかったため。
　　　　実際には重くて使えていない。
　　　　今は必要ないかもと思っている。年始のバージョンを利用。いつでも入れ替え可能。
　　　　マスタスレーブ構成のsolrのバージョンアップはサービスアウトしてから入れ替える。

3. 「Solrを用いた検索システムの構築」　by データセクション株式会社 高井さん
　　いろいろな試行錯誤について
　○データセクションについて
　　言語処理を元にデータの解析（Twitterとかブログとか）している会社。
　　・昔は自社で検索サーバを構築していた
　　・Luceneを利用して検索サーバを構築するように変更。
　○構成（過去？）
　　・Lucene＋RMI
　　　3.0から縮小で、4.0で廃止に
　○SolrにするかLuceneにするか？
　　・いろいろ機能があるからSolr使ってみるかｗ
　○Solr導入は1.4.1から
　　スペック
　　　マスタ：
　　　　メモリ：16G
　　　　Disk：2Tｘ12
　　　スレーブ：
　　　　256GのSSDを利用
　　　　JavaVMが32bit
　○ひと月分を1shardにして登録
　○検証＋手探り？
　　メモリが足りない。
　　Solrのキャッシュを全Offに。
　　BOBO SolrPluginってのを利用
　　compressオプションも利用。
　　各スレーブにキューを用意して1つだけしか処理しない。（なんでだ？？）
　○結果
　　キャッシュはフィルタキャッシュのみ利用
　　ユーザが同じクエリを投げるのはほぼないので。
　　フィルタキャッシュのエントリのメモリ量の計算式（あとで資料が出てくるかなぁ。）
　○問題点
　　・レプリケーションでインデックスサイズの2倍の容量が必要になる。
　　・レプリケーションの日時フォーマットのバグ（SOLR-1995）を踏んでしまった。
　　・レプリケーション後にインデックスが消えない場合がある
　○検討（1.4.1-&amp;gt;3.2）
　　うれしい要素
　　　レプリケーションバグがfix
　　　省メモリや範囲検索の高速化など　
　　かなしい要素
　　　compressが使えなく（しかも回答してからriindexしてくれる）
　○検討
　　余計なインデックス消す
　　nearinfinityが出しているlucene-compressionを利用
　　　https://github.com/nearinfinity/lucene-compression
　○残った問題
　　facet.rangeが使えないなど。
　○じゃあ集約サーバつくっちゃえ（すごいな。）
　　facet書き換えコンポーネントなど。
　○シャードのインデックスサイズが下がった
　　130GiB-&amp;gt;90GiB
　　これはlucene-compressionの効果
　○ここまでの変更はプラグインにて対応（この一覧いいかも）
　○感想
　　コンポーネント化されてて、簡単に追加機能が実装可能
　　用途次第であまりスペック高くなくても使える。

　Q&amp;amp;A
　　Q：Twitterのデータのクロール方法は？
　　A：HTMLをスクレイピングしている。publicなTLのみ。
　　Q：いきなりSolrに入れる？Solrの前処理は？
　　A：SolrJを利用して前処理済みのデータを登録している。

4. 「Anuenueの紹介と最近の進捗」 by @takahi_i さん（mixi）
　○自己紹介
　　・NAIST出身
　　・ファストサーチ
　　・今はmixi
　○mixiとは？
　○社内の緊急タスク
　　・内製検索エンジンをメンテナンスしやすいOSSにしたい！
　　　-&amp;gt;Solrを選択
　　　　Anuenueも実装
　○Anuenueの作成理由は？
　　インデックス運用が面倒（検索（distributed search）はあるがインデックスは自前）
　　クラスタ用のコマンドが提供されていない。
　○Anuenueが提供する機能
　　・検索クラスタの簡単設定
　　・クラスタ用コマンド
　　・もしかして機能
　○機能：Anuenueのクラスタ設定
　　Merger：クライアントからのクエリをMasterに分散
　　Master：インデックス作成側
　　Slave：検索用スレーブ。マスタからコピー
　○クラスタの管理コマンド
　　クラスタのコマンドを用意。
　　起動、コミット、登録など
　○SolrCloud向けのAnuenueを検討中
　　branch-cloudにあります。
　　今後の予定
　　　インスタンス追加削除を動的に実行できるようにしたい
　○Hadoop Conferenceの宣伝ｗ
　　Oluolu：Hadoop上で動くクエリログマイニングツール
　　Likelike：LSHをHadoopで実装（Hadoop Conference 2011 Fallで発表）
　　
5. LT
5.1　「solrとRの連携について」　by @yutakashino さん（BakFoo）
　　　Python本、Zope本を書いてます。
　　○NHKの実証実験で利用？
　　○TwitterストリームをSolrにストア
　　　facet.date
　　○Rでキーワード頻度グラフ
　　　Node.js、Redis、R、Solrを使ってる。しかもPython
　　○デモ
　　　キーワード＋日付でグラフが出てくる。
　　　Rでプロット。
　　　GoogleのチャートAPIを利用すると面白いことができる。


5.2　「 Apache ManifoldCF」　by 阿部さん(ロンウィット)
　○Apache Incubator
　○Manifold Connector Framework
　　Solr ＜－ MCF ＜－ web＋non-web repositories
　　すぐに利用可能。
　○概要
　　出力はSolr。
　　接続先はWeb、DB、CMS、などなどいろいろRepositoryConnectorというのがあります。
　○Crawler Agent
　　クロールに関するJobの管理
　　　接続先、スケジュールなど
　○Windowsサーバのクロールもできる
　　社内のナレッジ共有などに使える。権限周りも簡単に対応可能。
　　JCIFS.jarによりWindowsの権限情報を取得
　○クロール設定画面もある
　　デモ
　○導入が簡単なのがおすすめ。
　○ManifoldCFの資料関連
　　http://www.manning.com/wright
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;懇親会についてはあとで記載します！！
ということで追記です。
懇親会でも色々と面白い話を聞けました。
&lt;a href=&#34;http://twitter.com/#!/PENGUINANA_&#34;&gt;@PENGUINANA_&lt;/a&gt;さんにはCOOKPADのCI関連の話を聞けました。
1日に数度リリースするという話もあるようでした。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;http://atnd.org/events/18637&#34;&gt;「第6回Solr勉強会」&lt;/a&gt;に参加しました。
なんだかんだと第6回で、今のところ皆勤賞です。&lt;/p&gt;
&lt;p&gt;ということで、主に自分用ですが、メモなどとったので。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;概要&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;日時 :2011/09/12 19:00 to 21:00&lt;/li&gt;
&lt;li&gt;定員 :110 人&lt;/li&gt;
&lt;li&gt;会場 :株式会社 ECナビ&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
1.「Lucene/Solr 3.2-3.4」 by  ロンウイット 関口 宏司さん
　※Solr2.9.4、3.1でデグレードし、Solr3.4で修正されたバグがあります。
　　インデックス中にPCがシャットダウンされた場合にインデックスが壊れてしまうものあり。
　　Solr3.1-3.3は使用しないようにとのこと。
　○index
　　・IndexWriter.addDocuments(docs)
　　　複数ドキュメントの更新が可能になった。
　　　※検索で話をする親子関係のNestedQuery向けの登録にも利用する。
　　　この登録では途中でフラッシュされないため、セグメントが分割されない特徴あり。
　　　複数だけでなく、
　　・TieredMergePolicy
　　　※Lucene3.2/Solr3.3からデフォルトになった。
　　　新しいインデックスのマージポリシー。（amebaの開発者ブログに説明があった。）
　　　インデックスの登録順が守られていたが、このマージ処理では保証がされなくなったので注意が必要。
　　・update.chain
　　　update.processorがdeprecatedに。
　　　update.chainというパラメータに変更
　○index(cont&amp;#39;d)
　　・TwoPhaseCommit
　　　
　　・UniqFieldsUpdateProcessor
　　　重複した値を削除するための機能。
　　　UIMAでの提案から取り込まれた
　○search
　　・group=on
　　　検索グルーピング機能を使えるパラメータ
　　・{!term}
　　　クエリパーサを通さないでTermQueryをかける機能。
　　・structured explanation
　　　debug=onの算出根拠を
　　　XMLタグで構造化されたExplanationが取得可能に
　　・ReloadCacheRequestHandler
　　　関口さん担当。ExternalFileField
　　　インデックス外（外部ファイル）を元にFunctionQueryの情報を利用可能にできるのだが、
　　　このファイルのリロードが可能になる。
　　・Carrot2　3.5.0
　　　アップグレード。
　　　デモあり。Carrot2のworkbenchとか　　
　○search(cont&amp;#39;d)
　　・hl.phraseLimit parameter
　　　FastVectorHighlighterの高速化用パラメータ。
　　・{!cache=false}
　　　キャッシュを利用しないためのローカルパラメータ。fqのローカルパラメータに利用可能。
　　　検索セッション内でキャッシュへの処理（参照・登録）をしなくなる
　　・BlockJoinQuery
　　　NestedDocumentQueryの名前が変更された。
　　　（Luceneで登録されたところまで。）
　○schema
　　・KStemFilter
　　　PoterStemmerとは別のstemmer
　　・ReversePathHierarchyTokenizer
　　　パスの構造化インデックスの逆バージョン
　　・ommitPositions=&amp;#34;true&amp;#34;
　　　指定が可能になった。
　　・version 1.4
　　　スキーマのバージョンが新しくなった。
　○admin/tools
　　・action=MERGEINDEXES&amp;amp;srcCore=coreName
　　　コア名指定可能。
　　・action=UNLOAD&amp;amp;deleteIndex=true
　　　UNLOAD時にインデックス削除
　　・action=CREATE&amp;amp;property.name
　　　※ぎゃーーー。打ち込み失敗。
　○ぎゃーーーー失敗。
　○技術者大募集中！！
　Q&amp;amp;A
　　Q：クラスタリングの日本語は大丈夫？入門には制限があると記載があったが。
　　A：analyzerが記載が簡単になってるかは不明
　　　　前処理をして別フィールドにメタデータ的にある程度単語で区切ったようなものを作成したほうがいい。
　　Q：グルーピングで、グルーピング後のファセット件数が取得可能か？
　　A：3.4ではグループ数で表示可能。
　　　　パラメータ指定で可能。

2.「Solr＠cookpad」 　by ＠PENGUINANA_ さん
　○COOKPADとは？
　　・レシピ投稿サイト
　　・105万のユーザのレシピ
　　・30代女性の1/2が利用
　○レシピ検索
　　・PC：1307万UU、1億回強/月
　　・モバイルで利用が多く、スーパの店頭などで利用？
　　・Androidもあるよ。
　○人気順検索（Solrですよ）
　　
　○自己紹介
　　・＠PNGUINANA_
　　・情報可視化＋検索が好き！！
　　　yats、など
　○Solrはどのように利用
　　・レシピ検索
　　・もしかして
　○Tritonnから移行
　　同じ検索結果になるようにして徐々に移行
　○なぜ？
　　パフォーマンスが良い。
　　フィールド追加が簡単
　　レプリケーション-&amp;gt;ファイルベース
　　プロトタイピングが楽
　○Solr4 nightly（on Oracle JVM）
　　・マルチコア利用
　　・Ruby on Railsから
　○簡単な構成＋説明
　　・バッチからSolrへの更新をしている。
　　　※Analyzerを利用せず、バッチ側で分かち書き、正規化、同義語展開を行っている。
　　　Rubyで全部かけるほうが社内に展開しやすい。
　　・バッチ終了後、可能ならoptimize
　　　※検索速度がmax20%高速になる。
　　・マスタ-&amp;gt;スレーブレプリケーションはschema.xmlもレプリケート
　　　新規フィールド追加などはレプリケーションだけで実行できて楽。
　　・アプリはMySQLとSolrのSlaveにアクセス。
　　　Solrにはidのみ。本文はMySQLから取得
　　　インデックスサイズを小さくできる＝レプリケーション時間が短くなる
　　　オンメモリにできるため検索速度も向上
　○監視（munin）
　　・監視項目（コア