この記事は、Elasticsearchで品詞分解① (テンプレート編) の続きです。
テンプレートとマッピングの定義まで出来たので、データを投入して、Kibanaで表示させてみます。
テストデータ投入
{
"body_txt": "jsoupというとスクレイピングがよくに出てきますが、こういう使い方もありますよ、という事で。ログイン->cookie保持->ログイン後処理というjsoupコードが日本語であんまりなかったので、せっかくの機会ですし纏めてみました。jsoupで一番苦労するのは、実際に処理が実行されるURLがどういうものなのか、を見つける事ですね。formで指定されていたり、リダイレクトされたり…メモ帳でtsvを触ると、なぜか先頭に?が入ってしまう、という謎の現象が起きたので、IPアドレスの取得方法には正規表現を使用しています。エディタの指定とかできないんで…つい昔の習慣で、beanを作って詰めてしまいますが、最近はこうじゃないんですかね…新しい方法も勉強しないと^^;",
"execDate": "2018/01/16T10:40:00+09:00",
"paragraph": 1,
"title": "[Java]jsoupでブラウザから時刻合わせ"
}
Kibana確認
Kibanaでindexを確認してみると…
body_txtだけがテンプレートの条件に合致して、品詞分解が行われました。
#searchable
等のチェックは、マッピングで指定したfielddata
等の指定に依ります。(どれがどの項目に対応してたかは忘れました…)
Discoverで見てみると…
なぜか品詞分解結果ではなく、投入したデータそのものが表示されています…
Dev Tools で確認しても、投入したデータだけが表示されており、マッピングで追加したフィールドは表示されませんでした。
では、分解に失敗しているかというと、そうでもないようです。
フィルタを原型「纏める」で検索しても、「纏めて」の箇所がヒットしました。
マッピングで、fielddata
とstore
も設定しているので、ビジュアライズのフィールドにも設定可能です。
何となく分解はうまくいってそうですが、やはりDiscoverに出てこないとちょっと分かりにくいですね。
という事で、Discoverに分解した項目のリストを表示すべく四苦八苦してみました。
Scripted fields
KibanaのScript FieldでPainlessを使う (公式)
Scripted fields
にはpainless
という言語が、5.0より追加されています。
これがなかなか情報がなくてですね……
しかも、フィールドの記載ミスとかの場合、エラーじゃなくてワーニングで出てくるという謎仕様。
#多分indexのマッピングが変わった時とかに対応してるんじゃないですかね…
そんなこんなで試行錯誤しながら作成した、品詞分解後の項目リストを結合するスクリプトが以下です。
def analyzed = doc['body_txt.analyzed-meishi'];
def txt = "";
for (int i = 0; i < analyzed.length; i++) {
txt = txt + "/" + analyzed[i];
}
return txt;
Kibana再確認
各品詞の項目リストを作成して、KibanaのDiscoverを再表示。
分解された項目が一行に結合されて表示されました!
所感
Scripted fields 難しいです…もっと色んな事ができそうなんですけどね~
ただ、使いすぎると重くなるそうなので、その辺の兼ね合いが難しいですね。