Upgrade to Pro — share decks privately, control downloads, hide ads and more …

LastaFluteに移行したFessとElasticsearch+ESFluteによるDBF...

 LastaFluteに移行したFessとElasticsearch+ESFluteによるDBFlute環境

Fess 10でLastaFluteベースに変更され、検索エンジンもElasticsearchに変わります。ElasticsearchへのアクセスもDBFluteライクに実装できるようにESFluteを開発したのでそのご紹介です。

Shinsuke Sugaya

November 21, 2015
Tweet

More Decks by Shinsuke Sugaya

Other Decks in Technology

Transcript

  1. DBFluteフェス 2015 ▪ 名前: 菅谷信介 ▪ オープンソース活動: ➔ Apache Portalsコミッタ

    ➔ CodeLibsプロジェクト運営 https://github.com/codelibs               などなど・・・ ▪ Blog: http://www.chazine.com/ ▪ Twitter: https://twitter.com/shinsuke_sugaya/ 自己紹介
  2. DBFluteフェス 2015 ▪ オープンソースの全文検索システム ➔オールインワンで簡単に利用可能 ▪ Apacheライセンスで提供 ▪ 現在の最新バージョンは9.4 ▪

    Apache Solrを検索エンジンとして利用 ▪ クローラフレームワークとしてS2Robotを利用 ▪ データベースのアクセスはDBFluteを利用 ▪ 商用サポートも提供 (N2 Search) Fessとは http://fess.codelibs.org/ja/
  3. DBFluteフェス 2015 ▪ Javaの実行環境があればすぐに利用可能 ▪ Webサイトのクロール(FTPも対応) ▪ ファイルシステム(共有フォルダ)のクロール ▪ データベース等のクロール

    ▪ ブラウザによる管理画面 ▪ MS Office、PDF、圧縮ファイルもサポート ▪ Responsive Web Designに対応 ▪ AD等の認証情報で検索結果の出し分け可能 ▪ ファセット検索やジオ・サーチに対応 ▪ ドキュメントブーストやキーマッチ機能 ▪ 検索ログやクリックログで集計 ▪ サジェストや関連表示などにも対応 Fessの特徴
  4. DBFluteフェス 2015 2009/09 Fess 1.0リリース ➔ ウェブやファイルシステムをクロール&インデクシング(Solr 1.3を利用) 2010/01 Fess

    2.0リリース ➔ 検索結果のラベル付け、ロール検索に対応 2010/03 Fess 3.0リリース ➔ 差分クロール、データベースクロール対応 2010/12 Fess 4.0リリース ➔ NTLM認証対応 2011/12 Fess 5.0リリース ➔ ジオ・サーチ対応 2012/03 Fess 6.0リリース ➔ UIの変更 2012/08 Fess 7.0リリース ➜ 言語判定機能 2013/02 Fess 8.0リリース ➔ Responsive Web Design化 2014/02 Fess 9.0リリース  → 2015/10 Fess 9.4.2 (Solr 4.10.4) Fessの歴史
  5. DBFluteフェス 2015 H2Database (MySQL) (Oracle) すぐに利用できるようにオールインワンで提供 アーキテクチャ SAStruts Solr S2Robot

    Seasar2 DBFlute アプリケーションサーバ (Tomcatなど) Fess DBFluteを利用することで複数のDBに対応
  6. DBFluteフェス 2015 ▪ S2Robotのクロールデータ保存 ▪ Fessの設定を保存しているDBへのアクセス ▪ 管理画面をMavenプラグインで自動生成 ➔ 自動生成したものを修正して対応

    ▪ DBFluteにより複数の種類のDBサポート ➔ H2Database, MySQL, Oracle ▪ FessとS2Robotで異なるDBFluteを利用 ➔ S2RobotはMaven Shadeプラグインでパッケー ジ名を変更している DBFluteの利用
  7. DBFluteフェス 2015 商用サポート ▪ N2SMではFessに関する商用サポートを提供 ➔ 導入支援からカスタマイズ開発まで ➔ コミュニティはベストエフォート対応だが、商用サポートでは 様々な質問にも期限内に対応

    ▪ 商用製品としては、N2 Searchとして提供 ➔ ベースはFessと同じ (ブランチ管理されている) ➔ 設定を最適化したパッケージを利用 ➔ ApacheやMySQLなど含めて提供 ➔ ユーザなどを管理するコンソール ➔ 約ニ十万語の辞書をバンドル ▪ ASPとしても提供 ▪ お問い合わせはこちら: http://www.n2sm.net/
  8. DBFluteフェス 2015 ▪ Java 7/Struts 1 ➔ 古いと楽しくないし、ビジネス上のツッコミを受ける ▪ Seasar2/SAStruts

    ➔ 開発が停止していた ▪ Solr ➔ 拡張開発やスケール問題があるし、Solr 5でwarをやめる ▪ 開発リソース ➔ SolrかElasticsearchの両方を扱うのはなかなか大変 ▪ 海外展開 ➔ 海外でも通用するプロダクトにしたい 今までの課題 検討を始めた1年くらい前の話…
  9. DBFluteフェス 2015 ▪ Java 7/Struts 1 ➔ 古いと楽しくないし、ビジネス上のツッコミを受ける ▪ Seasar2/SAStruts

    ➔ 開発が停止していた ▪ Solr ➔ 拡張開発やスケール問題があるし、Solr 5でwarをやめる ▪ 開発リソース ➔ SolrかElasticsearchの両方を扱うのはなかなか大変 ▪ 海外展開 ➔ 海外でも通用するプロダクトにしたい 今までの課題 検討を始めた1年くらい前の話… LastaFluteでいくつかの課題が解決!
  10. DBFluteフェス 2015 ▪ Java 7 ➔ 古いと楽しくないし、ビジネス上のツッコミを受ける ▪ Seasar2/SAStruts ➔

    開発が停止していた ▪ Solr ➔ 拡張開発やスケール問題があるし、Solr 5でwarをやめる ▪ 開発リソース ➔ SolrかElasticsearchの両方を扱うのはなかなか大変 ▪ 海外展開 ➔ 海外でも通用するプロダクトにしたい 残る課題 検討を始めた1年くらい前の話… 検索まわりをどのようにするかの決断が必要だった ➔ warになるなら、Solr 5でもElasticsearchでも作業工数に 大差がない ➔ Elasticsearchの様々なナレッジも十分にある Elasticsearchに移行しよう!
  11. DBFluteフェス 2015 ▪ Java 8化 ➔ ラムダ式やStream API等 ▪ Seasar2/SAStrutsからLastaFluteへ

    ➔ ベースの部分の進化が進む ▪ SolrからElasticsearchへ ➔ Elasticsearch 2.0を採用 ➔ プラグインによる拡張が容易に ➔ より大規模案件にも安心して対応できる(はず) ▪ DBの利用をやめる ➔ 設定情報もElasticsearchに格納 (ここでESFlute) ▪ English First ➔ 日本語環境でも最適化するが英語圏を優先する Fess 10の特徴
  12. DBFluteフェス 2015 ▪ fessコマンドで起動 $ ./bin/fess ▪ 検索画面へのアクセス ➔ http://localhost:8080/fess/

    ▪ 管理画面へのアクセス ➔ http://localhost:8080/fess/admin/ ➔ admin/adminでログイン Fess 10の利用方法
  13. DBFluteフェス 2015 Fess 10のディレクトリ構造 ├── app │ ├── META-INF │

    ├── WEB-INF │ ├── css │ ├── images │ └── js ├── bin │ ├── fess │ └── fess.in.sh ├── es │ ├── data │ └── plugins ├── lib │ └── classes ├── logs └── temp Fessのアプリケーション warを展開したもの 実行スクリプト Elasticsearch ・data: インデックスの格納場所 ・plugins: プラグイン ログファイル 一時ファイルファイル Tomcat Boot関連ファイル Tomcat Bootを利用しているが、成果物は maven assembly pluginでwarを分解して独自に構築している
  14. DBFluteフェス 2015 2015/11 Fess 10 alpha1リリース ➔ 開発者向け 2015/12 Fess

    10 beta1リリース ➔ 開発者向け 2016/01 Fess 10 GAリリース ➔ 正式リリース ➔ N2 Search 10として、案件適用開始(大規模向けから) 2016/夏頃(?) Fess 11リリース ➔ Elasticsearchのリリース状況などにも依存 Fessのロードマップ
  15. DBFluteフェス 2015 Elasticsearchとは ▪ オープンソースの分散リアルタイム検索&分析エンジン ▪ 開発元:Elastic社 (2010~) ▪ 特徴

    ➔ リアルタイムデータが扱える ➔ リアルタイム分析 ➔ 分散環境 (スケールが容易) ➔ 高可用性 ➔ マルチテナント ➔ 全文検索 ➔ ドキュメント志向 ➔ 衝突管理 (楽観的バージョン制御) ➔ スキーマフリー ➔ RESTful API ➔ 操作単位での永続性 (トランザクションログ)
  16. DBFluteフェス 2015 ▪ elasticsearchコマンドを実行 zip/tar.gz: $ ./bin/elasticsearch rpm: $ sudo

    /etc/init.d/elasticsearch start ▪ 1.x系では以下の設定変更がelasticsearch.ymlで ほぼ必須 cluster.name: <your_cluster> discovery.zen.ping.multicast.enabled: false ▪ localhost:9200でアクセス可能 Elasticsearchのセットアップ
  17. DBFluteフェス 2015 ▪ クラスタ ➔ 1つ以上のノードから構成される ▪ ノード ➔ Elasticsearchのインスタンス

    ▪ インデックス ➔ 1つ以上のシャードから構成される ➔ クラスタは複数のインデックス(DBでいうDB)を保持できる ▪ シャード ➔ ドキュメント(データ)を格納する場所 ➔ インデックスは複数のシャードから構成される ➔ シャードは1つのプライマリと複数のレプリカで構成される ➔ ノードは複数のシャードを保持できる クラスタ/ノード/インデックス/シャード
  18. DBFluteフェス 2015 クラスタの構成図 ノード1 ノード3 ノード2 ノード4 インデックス1 シャード1 インデックス1

    シャード2 インデックス2 シャード2 インデックス1 シャード2 インデックス2 シャード1 インデックス1 シャード3 インデックス1 シャード1 インデックス2 シャード1 インデックス1 シャード4 インデックス1 シャード3 インデックス2 シャード2 インデックス1 シャード4 クラスタ
  19. DBFluteフェス 2015 curl -XPUT ‘localhost:9200/company -d ‘{ “settings”: { …(Analyzer等のインデックス関連の指定)...

    }, “mappings”: { …(スキーマなど指定)... } }’ ▪ インデックス名を指定してPUT ➔ パラメータはJSONで渡す インデックス作成 companyインデックスが作成される HTTPのDELETEでインデックスを削除できる
  20. DBFluteフェス 2015 curl -XPUT ‘localhost:9200/company/employee/1’ -d ‘{ “employee_id”: ”00001”, “first_name”:

    “Taro”, “last_name”: “Suzuki” }’ ▪ インデックス、タイプ、IDを指定してPUT ➔ POSTでID自動採番も可能 ➔ 格納するデータはJSONで渡す ドキュメントの追加 companyインデックスのemployeeタイプに IDが1のドキュメントがJSONの内容で追加される (refreshされるまでデータは見えない)
  21. DBFluteフェス 2015 curl -XPOST ‘localhost:9200/company/employee/1’ -d ‘{ “employee_id”: ”00001”, “first_name”:

    “Taro”, “last_name”: “Suzuki” }’ ▪ インデックス、タイプ、IDを指定してPOST ➔ 一部更新をしたい場合はUpdate APIもある ドキュメントの更新
  22. DBFluteフェス 2015 curl -XPOST ‘localhost:9200/company/employee/_search’ -d ‘{ "query": { "multi_match":

    { "query": "Taro", "fields": ["first_name"] } }, "sort": [ {"employee_id": {"order": "asc"}} ], "size": 10 }’ ▪ Query DSLで_searchにPOST ➔ フィルタとクエリーを使い分ける ドキュメントの検索
  23. DBFluteフェス 2015 ▪ GET API (Multi GET) ▪ Exists API

    ▪ Update API ▪ Bulk API ▪ Flush ▪ Refresh ▪ Optimize/Upgrade API ・・・等々 その他のAPI
  24. DBFluteフェス 2015 ▪ DBFluteのElasticsearch版 ▪ Elasticsearchのインデックス設定情報からBhvや CBのソースを自動生成 ▪ DBFlute的にはDB→インデックス、Table→タイプ ➔

    タイプごとにBhvやCBが生成される ▪ Elasticsearch 1.7と2.0以上に対応 ➔ 1系と2系では一部生成されるコードが異なる ▪ DBFlute本体にバンドル ▪ Exampleプロジェクト https://github.com/lastaflute/lastaflute-example-waterfront ESFluteとは
  25. DBFluteフェス 2015 ▪ インデックスを作成して、設定情報をファイルに保 存 curl -XGET localhost:9200/[index] > [index].json

    ▪ DBFluteの基本的な設定を作成 例(Mavenプロジェクトなら): mvn dbflute:download mvn dbflute:create-client ▪ esfluteMap.dfpropを編集 ▪ DBFluteのFreeGenを実行 mvn dbflute:freegen ➔ [basePackage].[index]パッケージ以下にソースコードを自 動生成 ESFluteの利用方法
  26. DBFluteフェス 2015 ▪ dbflute_[project]/dfprop/esfluteMap.dfprop esfluteMap.dfprop map:{ # base package of

    generated classes ; basePackage = org.docksidestage.esflute # base path to JSON resource, URL or relative path ; basePath = ./playes/index ←インデックスの設定情報ファイルを置いておくディレクトリ # settings for indexes ; indexMap = map:{ ; maihama = map:{ ←インデックス名 ; package = maihama } } # version for elasticsearch's jar file (no version means latest) ; elasticsearchVersion = 2.0.0 }
  27. DBFluteフェス 2015 ▪ Bhvインスタンスでinsert ➔ オプションで即時反映も可能 ➔ 更新も同じ感じで データの追加 @Resource

    private ProductBhv productBhv; … Product product = new Product(); product.setProductDescription(form.productDescription); product.setProductCategoryCode(form.productCategoryCode); ... productBhv.insert(product, op -> { op.setRefresh(true); // 即時反映 });
  28. DBFluteフェス 2015 ▪ Bhvインスタンスでdelete ➔ オプションで即時反映も可能 ➔ Delete By Queryも内部的にScroll

    Scanで実現 データの削除 productBhv.selectByPK(form.productId).ifPresent(entity -> { productBhv.delete(entity, op -> { op.setRefresh(true); }); }).orElse(() -> { throw404("Not found the product: " + form.productId); });
  29. DBFluteフェス 2015 ▪ CBで条件を指定して、Bhvでselect〜 ➔ 検索に特化した〜_MatchPhrase等追加 ➔ boolやフィルタも指定可能 データの検索 return

    productBhv.selectPage(cb -> { if (form.productName != null) { cb.query().setProductName_MatchPhrase(form.productName); } if (form.productStatus != null) { cb.query().setProductStatusCode_Equal(form.productStatus); } cb.query().addOrderBy_ProductName_Asc(); cb.query().addOrderBy_Id_Asc(); cb.paging(getPagingPageSize(), pageNumber); });
  30. DBFluteフェス 2015 ▪ DBFlute的に必要なメソッドの実装 ▪ ネストしたプロパティへの対応 ▪ multifieldの対応 ▪ join対応

    ▪ aggregation対応 ▪ HTTPでの接続方法 ▪ 適切でない利用方法やクエリを通知する 今後のタスク やることはまだまだありますので、 興味がある方はぜひご協力を! (検索マスターになれるはず)
  31. DBFluteフェス 2015 ▪ Fess 10 ➔ Java 8/LastaFlute/Elasticsearch/ESFlute ➔ 2015/01に正式リリース予定

    ▪ ESFlute ➔ DBFluteのように実装可能 ➔ 既にDBFluteにバンドル済み ➔ 開発者を募集中 まとめ