Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

5,365 views

Published on

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

Published in: Technology
  • Be the first to comment

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

  1. 1. LastaFluteに移行したFessと Elasticsearch+ESFluteによるDBFlute環境 DBFluteフェス2015
  2. 2. DBFluteフェス 2015 ■ 名前: 菅谷信介 ■ オープンソース活動: ➔ Apache Portalsコミッタ ➔ CodeLibsプロジェクト運営 https://github.com/codelibs               などなど・・・ ■ Blog: http://www.chazine.com/ ■ Twitter: https://twitter.com/shinsuke_sugaya/ 自己紹介
  3. 3. DBFluteフェス 2015 ■ Fessの今 ■ Fess 10について ■ Elasticsearchについて ■ ESFluteの紹介 アジェンダ
  4. 4. DBFluteフェス 2015 Fess
  5. 5. DBFluteフェス 2015 ■ オープンソースの全文検索システム ➔オールインワンで簡単に利用可能 ■ Apacheライセンスで提供 ■ 現在の最新バージョンは9.4 ■ Apache Solrを検索エンジンとして利用 ■ クローラフレームワークとしてS2Robotを利用 ■ データベースのアクセスはDBFluteを利用 ■ 商用サポートも提供 (N2 Search) Fessとは http://fess.codelibs.org/ja/
  6. 6. DBFluteフェス 2015 クローラやUIを提供することで手軽な導入実現 検索分野での立ち位置 検索関連の知識なくても利用可能(すぐに使える) 検索関連の知識が必要(ガッツリ作りこみが必要) 検索システム ➔ Fess、商用検索システム(GSAとか) 検索サーバ+クローラ ➔ Hyper Estraier、Namazu、Nutchなど 検索サーバ ➔ Solr、Elasticsearch、groongaなど 検索ライブラリ ➔ Luceneなど
  7. 7. DBFluteフェス 2015 ■ Javaの実行環境があればすぐに利用可能 ■ Webサイトのクロール(FTPも対応) ■ ファイルシステム(共有フォルダ)のクロール ■ データベース等のクロール ■ ブラウザによる管理画面 ■ MS Office、PDF、圧縮ファイルもサポート ■ Responsive Web Designに対応 ■ AD等の認証情報で検索結果の出し分け可能 ■ ファセット検索やジオ・サーチに対応 ■ ドキュメントブーストやキーマッチ機能 ■ 検索ログやクリックログで集計 ■ サジェストや関連表示などにも対応 Fessの特徴
  8. 8. DBFluteフェス 2015 Fessの検索結果画面 デモ:http://search.n2sm.co.jp/
  9. 9. DBFluteフェス 2015 Fessの管理画面
  10. 10. 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の歴史
  11. 11. DBFluteフェス 2015 H2Database (MySQL) (Oracle) すぐに利用できるようにオールインワンで提供 アーキテクチャ SAStruts Solr S2Robot Seasar2 DBFlute アプリケーションサーバ (Tomcatなど) Fess DBFluteを利用することで複数のDBに対応
  12. 12. DBFluteフェス 2015 ■ S2Robotのクロールデータ保存 ■ Fessの設定を保存しているDBへのアクセス ■ 管理画面をMavenプラグインで自動生成 ➔ 自動生成したものを修正して対応 ■ DBFluteにより複数の種類のDBサポート ➔ H2Database, MySQL, Oracle ■ FessとS2Robotで異なるDBFluteを利用 ➔ S2RobotはMaven Shadeプラグインでパッケー ジ名を変更している DBFluteの利用
  13. 13. DBFluteフェス 2015 商用サポート ■ N2SMではFessに関する商用サポートを提供 ➔ 導入支援からカスタマイズ開発まで ➔ コミュニティはベストエフォート対応だが、商用サポートでは 様々な質問にも期限内に対応 ■ 商用製品としては、N2 Searchとして提供 ➔ ベースはFessと同じ (ブランチ管理されている) ➔ 設定を最適化したパッケージを利用 ➔ ApacheやMySQLなど含めて提供 ➔ ユーザなどを管理するコンソール ➔ 約ニ十万語の辞書をバンドル ■ ASPとしても提供 ■ お問い合わせはこちら: http://www.n2sm.net/
  14. 14. DBFluteフェス 2015 今までの課題
  15. 15. DBFluteフェス 2015 ■ Java 7/Struts 1 ➔ 古いと楽しくないし、ビジネス上のツッコミを受ける ■ Seasar2/SAStruts ➔ 開発が停止していた ■ Solr ➔ 拡張開発やスケール問題があるし、Solr 5でwarをやめる ■ 開発リソース ➔ SolrかElasticsearchの両方を扱うのはなかなか大変 ■ 海外展開 ➔ 海外でも通用するプロダクトにしたい 今までの課題 検討を始めた1年くらい前の話…
  16. 16. DBFluteフェス 2015 課題解決に向けて まず・・・
  17. 17. DBFluteフェス 2015 LastaFlute との出会い
  18. 18. DBFluteフェス 2015 LastaFluteの誕生 Seasar Conference 2015 http://www.slideshare.net/jflute/lasta-seasar-2015 Fess 10に向けて、Spring化などの作業を始めていた、ある日の立ち話…
  19. 19. DBFluteフェス 2015 LastaFluteの誕生 それだったらということで、無邪気にメールでお願いしてみた Seasar Conference 2015 http://www.slideshare.net/jflute/lasta-seasar-2015
  20. 20. DBFluteフェス 2015 ■ Java 7/Struts 1 ➔ 古いと楽しくないし、ビジネス上のツッコミを受ける ■ Seasar2/SAStruts ➔ 開発が停止していた ■ Solr ➔ 拡張開発やスケール問題があるし、Solr 5でwarをやめる ■ 開発リソース ➔ SolrかElasticsearchの両方を扱うのはなかなか大変 ■ 海外展開 ➔ 海外でも通用するプロダクトにしたい 今までの課題 検討を始めた1年くらい前の話… LastaFluteでいくつかの課題が解決!
  21. 21. DBFluteフェス 2015 残る課題
  22. 22. DBFluteフェス 2015 ■ Java 7 ➔ 古いと楽しくないし、ビジネス上のツッコミを受ける ■ Seasar2/SAStruts ➔ 開発が停止していた ■ Solr ➔ 拡張開発やスケール問題があるし、Solr 5でwarをやめる ■ 開発リソース ➔ SolrかElasticsearchの両方を扱うのはなかなか大変 ■ 海外展開 ➔ 海外でも通用するプロダクトにしたい 残る課題 検討を始めた1年くらい前の話… 検索まわりをどのようにするかの決断が必要だった ➔ warになるなら、Solr 5でもElasticsearchでも作業工数に 大差がない ➔ Elasticsearchの様々なナレッジも十分にある Elasticsearchに移行しよう!
  23. 23. DBFluteフェス 2015 Fess 10
  24. 24. DBFluteフェス 2015 ■ Java 8化 ➔ ラムダ式やStream API等 ■ Seasar2/SAStrutsからLastaFluteへ ➔ ベースの部分の進化が進む ■ SolrからElasticsearchへ ➔ Elasticsearch 2.0を採用 ➔ プラグインによる拡張が容易に ➔ より大規模案件にも安心して対応できる(はず) ■ DBの利用をやめる ➔ 設定情報もElasticsearchに格納 (ここでESFlute) ■ English First ➔ 日本語環境でも最適化するが英語圏を優先する Fess 10の特徴
  25. 25. DBFluteフェス 2015 今後もオールインワンで提供 アーキテクチャ LastaFlute Elasticsearch Fess Crawler Lasta DI ESFlute Tomcat Boot Fess Elasticsearchは切り離すことも可能
  26. 26. DBFluteフェス 2015 Fess 10の検索結果画面
  27. 27. DBFluteフェス 2015 Fess 10の管理画面
  28. 28. DBFluteフェス 2015 ■ fessコマンドで起動 $ ./bin/fess ■ 検索画面へのアクセス ➔ http://localhost:8080/fess/ ■ 管理画面へのアクセス ➔ http://localhost:8080/fess/admin/ ➔ admin/adminでログイン Fess 10の利用方法
  29. 29. 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を分解して独自に構築している
  30. 30. 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のロードマップ
  31. 31. DBFluteフェス 2015 Elasticsearch
  32. 32. DBFluteフェス 2015 Elasticsearchとは ■ オープンソースの分散リアルタイム検索&分析エンジン ■ 開発元:Elastic社 (2010~) ■ 特徴 ➔ リアルタイムデータが扱える ➔ リアルタイム分析 ➔ 分散環境 (スケールが容易) ➔ 高可用性 ➔ マルチテナント ➔ 全文検索 ➔ ドキュメント志向 ➔ 衝突管理 (楽観的バージョン制御) ➔ スキーマフリー ➔ RESTful API ➔ 操作単位での永続性 (トランザクションログ)
  33. 33. 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のセットアップ
  34. 34. DBFluteフェス 2015 Elasticsearchの構成要素
  35. 35. DBFluteフェス 2015 ■ クラスタ ➔ 1つ以上のノードから構成される ■ ノード ➔ Elasticsearchのインスタンス ■ インデックス ➔ 1つ以上のシャードから構成される ➔ クラスタは複数のインデックス(DBでいうDB)を保持できる ■ シャード ➔ ドキュメント(データ)を格納する場所 ➔ インデックスは複数のシャードから構成される ➔ シャードは1つのプライマリと複数のレプリカで構成される ➔ ノードは複数のシャードを保持できる クラスタ/ノード/インデックス/シャード
  36. 36. 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 クラスタ
  37. 37. DBFluteフェス 2015 ■ インデックス内に複数のタイプを定義することが できる(DBでいうとTableのような単位だが Tableほど独立していない) インデックスとタイプ インデックス タイプ タイプ ・・・ Doc DocDoc Doc Doc DocDoc Doc
  38. 38. DBFluteフェス 2015 Elasticsearchの操作
  39. 39. DBFluteフェス 2015 curl -XPUT ‘localhost:9200/company -d ‘{ “settings”: { …(Analyzer等のインデックス関連の指定)... }, “mappings”: { …(スキーマなど指定)... } }’ ■ インデックス名を指定してPUT ➔ パラメータはJSONで渡す インデックス作成 companyインデックスが作成される HTTPのDELETEでインデックスを削除できる
  40. 40. 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されるまでデータは見えない)
  41. 41. DBFluteフェス 2015 curl -XPOST ‘localhost:9200/company/employee/1’ -d ‘{ “employee_id”: ”00001”, “first_name”: “Taro”, “last_name”: “Suzuki” }’ ■ インデックス、タイプ、IDを指定してPOST ➔ 一部更新をしたい場合はUpdate APIもある ドキュメントの更新
  42. 42. DBFluteフェス 2015 curl -XDELETE ‘localhost:9200/company/employee/1’ ■ インデックス、タイプ、IDを指定してDELETE ドキュメントの削除 ■ クエリー指定で複数削除をする場合 ➔ Delete By QueryのAPIは廃止 ➔ scroll scanで取得しながらバルクでID指定で削除
  43. 43. 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 ➔ フィルタとクエリーを使い分ける ドキュメントの検索
  44. 44. DBFluteフェス 2015 ■ GET API (Multi GET) ■ Exists API ■ Update API ■ Bulk API ■ Flush ■ Refresh ■ Optimize/Upgrade API ・・・等々 その他のAPI
  45. 45. DBFluteフェス 2015 ESFlute
  46. 46. 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とは
  47. 47. 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の利用方法
  48. 48. 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 }
  49. 49. DBFluteフェス 2015 ESFluteで操作
  50. 50. 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); // 即時反映 });
  51. 51. 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); });
  52. 52. 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); });
  53. 53. DBFluteフェス 2015 ■ DBFlute的に必要なメソッドの実装 ■ ネストしたプロパティへの対応 ■ multifieldの対応 ■ join対応 ■ aggregation対応 ■ HTTPでの接続方法 ■ 適切でない利用方法やクエリを通知する 今後のタスク やることはまだまだありますので、 興味がある方はぜひご協力を! (検索マスターになれるはず)
  54. 54. DBFluteフェス 2015 まとめ
  55. 55. DBFluteフェス 2015 ■ Fess 10 ➔ Java 8/LastaFlute/Elasticsearch/ESFlute ➔ 2015/01に正式リリース予定 ■ ESFlute ➔ DBFluteのように実装可能 ➔ 既にDBFluteにバンドル済み ➔ 開発者を募集中 まとめ

×