Elasitcsearchで「全文検索」寄りでいろいろ遊んでみようと思うと、程よい公開データが欲しくなります。
そんなデータの一例として、livedoorレストラン DataSetというのがありますので、こちらを利用させてもらって勉強するというのも一つの手かと思います。
CSVをkibanaやその他の機能で取り込みしても良いでしょうが、今回は全文検索ということで、正規化されてテーブルごとに分割されている各CSVを結合して、1ドキュメント1レストランデータのJSONドキュメント化して、これをバルクロードしたいと思います。
この類のものは、遊んでみるだけであればそれほど難しくないのですが、いざやり始めると手練れの方でもデータを確かめながらになったりそれはそれで時間を要すると思います。
多少私の好みに寄せたドキュメント形式(プロパティ構成)になっていますが、Elasticsearchすげぇってことで、ある程度雑にインポートしてもよろしくやってくれるので、結果、ぼちぼち良い感じかなというところで、サンプル公開させていただきます。
Elasticsearchと名がついた記事ですが、実態はPandasのサンプルプログラムの分量が多いですね....
確認に使ったElasticsearchのバージョン: 6.8 Pandasのバージョン: 1.0.1
生成されるドキュメントデータイメージ(1件)
元の項目を残しつつ(ただし以下では簡単のため取り除きました)、次のようなドキュメントプロパティになるようにデータを派生生成します。
サンプルプログラム
livedoorレストランDataSetをダウンロードして伸張したディレクトリで、次のPythonプログラムを起動してください。 Elasticsearchのサーバのアドレスや取り込み先のインデックス名はよろしく改変してください。(ここでは、「ldgourmet」という名前のインデックスに取り込むこととしています。)
見てのとおり、pandasはもちろん、PythonのElasticsearchクライアントも利用していますので、必要なら事前にインストールをお願いします。
途中、バルクロード用のJSONファイルを出力するわけではないのですが、仮に出力するとした場合はおおよそ250MBぐらいの容量になりました。
また、Elasticsearch(ローカル起動)へのバルクロード所要時間は、手元の端末(iMac Retina 5K, 27-inch, Late 2014)で約10分ほどです。
livedoor グルメのDataSet のCSVをElasticsearchでの全文検索を意識し…
Mapping設定
取り込みに使ったMapping設定は前項の後半のJSONファイルの内容のとおりです。 (ただし、インポートができるかできないかでいうと、このMapping設定は必須ではありません。)
ちなみに、プログラムとJSONファイル相当をエンベッドしましたが、今みるとインデントが崩れているように見えます。
もしお手元でもインデントなどが変だということであれば、リンク先のGistか「raw」表示で適宜ご覧いただくようお願いします。
また、Mapping、Analyzer設定については、次の過去記事も参照いただけると嬉しいです。
ひとまず
以上です...
kibanaのDevToolsなどで
GET /ldgourmet/_search
などとやると次のようなデータが戻ってきます。
思ったより長くなったので、取り込んだデータを使った全文検索についてはまた改めて。
↓
検索本道ではありませんが、このデータを使ったAggregationsの例はこちら。
その他
この記事は以下の過去記事の部分リバイバルだったりします。当時よりは少々Pandasの使い方が洗練されたかもしれない(ひとりごと)。