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

55
LastaFluteに移行したFessElasticsearch+ESFluteによるDBFlute環境 DBFluteフェス2015

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

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

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

DBFluteフェス2015

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

DBFluteフェス 2015

■ 名前: 菅谷信介■ オープンソース活動:

➔ Apache Portalsコミッタ➔ CodeLibsプロジェクト運営

https://github.com/codelibs              などなど・・・

■ Blog: http://www.chazine.com/■ Twitter: https://twitter.com/shinsuke_sugaya/

自己紹介

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

DBFluteフェス 2015

■ Fessの今■ Fess 10について■ Elasticsearchについて■ ESFluteの紹介

アジェンダ

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

DBFluteフェス 2015

Fess

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

DBFluteフェス 2015

■ オープンソースの全文検索システム➔オールインワンで簡単に利用可能

■ Apacheライセンスで提供■ 現在の最新バージョンは9.4■ Apache Solrを検索エンジンとして利用■ クローラフレームワークとしてS2Robotを利用■ データベースのアクセスはDBFluteを利用■ 商用サポートも提供 (N2 Search)

Fessとは

http://fess.codelibs.org/ja/

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

DBFluteフェス 2015

クローラやUIを提供することで手軽な導入実現

検索分野での立ち位置

検索関連の知識なくても利用可能(すぐに使える)

検索関連の知識が必要(ガッツリ作りこみが必要)

検索システム➔ Fess、商用検索システム(GSAとか)

検索サーバ+クローラ➔ Hyper Estraier、Namazu、Nutchなど

検索サーバ➔ Solr、Elasticsearch、groongaなど

検索ライブラリ➔ Luceneなど

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

DBFluteフェス 2015

■ Javaの実行環境があればすぐに利用可能■ Webサイトのクロール(FTPも対応)■ ファイルシステム(共有フォルダ)のクロール■ データベース等のクロール■ ブラウザによる管理画面■ MS Office、PDF、圧縮ファイルもサポート■ Responsive Web Designに対応■ AD等の認証情報で検索結果の出し分け可能■ ファセット検索やジオ・サーチに対応■ ドキュメントブーストやキーマッチ機能■ 検索ログやクリックログで集計■ サジェストや関連表示などにも対応

Fessの特徴

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

DBFluteフェス 2015

Fessの検索結果画面デモ:http://search.n2sm.co.jp/

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

DBFluteフェス 2015

Fessの管理画面

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

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の歴史

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

DBFluteフェス 2015

H2Database(MySQL)(Oracle)

すぐに利用できるようにオールインワンで提供

アーキテクチャ

SAStruts

SolrS2Robot

Seasar2

DBFlute

アプリケーションサーバ(Tomcatなど)

Fess

DBFluteを利用することで複数のDBに対応

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

DBFluteフェス 2015

■ S2Robotのクロールデータ保存■ Fessの設定を保存しているDBへのアクセス■ 管理画面をMavenプラグインで自動生成➔ 自動生成したものを修正して対応

■ DBFluteにより複数の種類のDBサポート➔ H2Database, MySQL, Oracle

■ FessとS2Robotで異なるDBFluteを利用➔ S2RobotはMaven Shadeプラグインでパッケー

ジ名を変更している

DBFluteの利用

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

DBFluteフェス 2015

商用サポート

■ N2SMではFessに関する商用サポートを提供➔ 導入支援からカスタマイズ開発まで➔ コミュニティはベストエフォート対応だが、商用サポートでは

様々な質問にも期限内に対応■ 商用製品としては、N2 Searchとして提供➔ ベースはFessと同じ (ブランチ管理されている)➔ 設定を最適化したパッケージを利用➔ ApacheやMySQLなど含めて提供➔ ユーザなどを管理するコンソール➔ 約ニ十万語の辞書をバンドル

■ ASPとしても提供■ お問い合わせはこちら: http://www.n2sm.net/

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

DBFluteフェス 2015

今までの課題

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

DBFluteフェス 2015

■ Java 7/Struts 1➔ 古いと楽しくないし、ビジネス上のツッコミを受ける

■ Seasar2/SAStruts➔ 開発が停止していた

■ Solr➔ 拡張開発やスケール問題があるし、Solr 5でwarをやめる

■ 開発リソース➔ SolrかElasticsearchの両方を扱うのはなかなか大変

■ 海外展開➔ 海外でも通用するプロダクトにしたい

今までの課題検討を始めた1年くらい前の話…

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

DBFluteフェス 2015

課題解決に向けてまず・・・

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

DBFluteフェス 2015

LastaFluteとの出会い

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

DBFluteフェス 2015

LastaFluteの誕生

Seasar Conference 2015 http://www.slideshare.net/jflute/lasta-seasar-2015

Fess 10に向けて、Spring化などの作業を始めていた、ある日の立ち話…

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

DBFluteフェス 2015

LastaFluteの誕生それだったらということで、無邪気にメールでお願いしてみた

Seasar Conference 2015 http://www.slideshare.net/jflute/lasta-seasar-2015

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

DBFluteフェス 2015

■ Java 7/Struts 1➔ 古いと楽しくないし、ビジネス上のツッコミを受ける

■ Seasar2/SAStruts➔ 開発が停止していた

■ Solr➔ 拡張開発やスケール問題があるし、Solr 5でwarをやめる

■ 開発リソース➔ SolrかElasticsearchの両方を扱うのはなかなか大変

■ 海外展開➔ 海外でも通用するプロダクトにしたい

今までの課題検討を始めた1年くらい前の話…

LastaFluteでいくつかの課題が解決!

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

DBFluteフェス 2015

残る課題

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

DBFluteフェス 2015

■ Java 7➔ 古いと楽しくないし、ビジネス上のツッコミを受ける

■ Seasar2/SAStruts➔ 開発が停止していた

■ Solr➔ 拡張開発やスケール問題があるし、Solr 5でwarをやめる

■ 開発リソース➔ SolrかElasticsearchの両方を扱うのはなかなか大変

■ 海外展開➔ 海外でも通用するプロダクトにしたい

残る課題検討を始めた1年くらい前の話…

検索まわりをどのようにするかの決断が必要だった➔ warになるなら、Solr 5でもElasticsearchでも作業工数に

大差がない➔ Elasticsearchの様々なナレッジも十分にある

Elasticsearchに移行しよう!

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

DBFluteフェス 2015

Fess 10

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

DBFluteフェス 2015

■ Java 8化➔ ラムダ式やStream API等

■ Seasar2/SAStrutsからLastaFluteへ➔ ベースの部分の進化が進む

■ SolrからElasticsearchへ➔ Elasticsearch 2.0を採用➔ プラグインによる拡張が容易に➔ より大規模案件にも安心して対応できる(はず)

■ DBの利用をやめる➔ 設定情報もElasticsearchに格納 (ここでESFlute)

■ English First➔ 日本語環境でも最適化するが英語圏を優先する

Fess 10の特徴

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

DBFluteフェス 2015

今後もオールインワンで提供

アーキテクチャ

LastaFlute

Elasticsearch

Fess Crawler

Lasta DI

ESFlute

Tomcat Boot

Fess

Elasticsearchは切り離すことも可能

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

DBFluteフェス 2015

Fess 10の検索結果画面

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

DBFluteフェス 2015

Fess 10の管理画面

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

DBFluteフェス 2015

■ fessコマンドで起動$ ./bin/fess

■ 検索画面へのアクセス➔ http://localhost:8080/fess/

■ 管理画面へのアクセス➔ http://localhost:8080/fess/admin/➔ admin/adminでログイン

Fess 10の利用方法

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

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を分解して独自に構築している

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

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のロードマップ

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

DBFluteフェス 2015

Elasticsearch

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

DBFluteフェス 2015

Elasticsearchとは

■ オープンソースの分散リアルタイム検索&分析エンジン■ 開発元:Elastic社 (2010~)■ 特徴

➔ リアルタイムデータが扱える➔ リアルタイム分析➔ 分散環境 (スケールが容易)➔ 高可用性➔ マルチテナント➔ 全文検索➔ ドキュメント志向➔ 衝突管理 (楽観的バージョン制御)➔ スキーマフリー➔ RESTful API➔ 操作単位での永続性 (トランザクションログ)

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

DBFluteフェス 2015

■ elasticsearchコマンドを実行zip/tar.gz:

$ ./bin/elasticsearchrpm:

$ sudo /etc/init.d/elasticsearch start■ 1.x系では以下の設定変更がelasticsearch.ymlで

ほぼ必須cluster.name: <your_cluster>discovery.zen.ping.multicast.enabled: false

■ localhost:9200でアクセス可能

Elasticsearchのセットアップ

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

DBFluteフェス 2015

Elasticsearchの構成要素

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

DBFluteフェス 2015

■ クラスタ➔ 1つ以上のノードから構成される

■ ノード➔ Elasticsearchのインスタンス

■ インデックス➔ 1つ以上のシャードから構成される➔ クラスタは複数のインデックス(DBでいうDB)を保持できる

■ シャード➔ ドキュメント(データ)を格納する場所➔ インデックスは複数のシャードから構成される➔ シャードは1つのプライマリと複数のレプリカで構成される➔ ノードは複数のシャードを保持できる

クラスタ/ノード/インデックス/シャード

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

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

クラスタ

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

DBFluteフェス 2015

■ インデックス内に複数のタイプを定義することができる(DBでいうとTableのような単位だがTableほど独立していない)

インデックスとタイプ

インデックス

タイプ タイプ

・・・Doc

DocDocDoc

DocDocDoc

Doc

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

DBFluteフェス 2015

Elasticsearchの操作

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

DBFluteフェス 2015

curl -XPUT ‘localhost:9200/company -d ‘{ “settings”: { …(Analyzer等のインデックス関連の指定)... }, “mappings”: { …(スキーマなど指定)... }}’

■ インデックス名を指定してPUT➔ パラメータはJSONで渡す

インデックス作成

companyインデックスが作成されるHTTPのDELETEでインデックスを削除できる

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

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されるまでデータは見えない)

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

DBFluteフェス 2015

curl -XPOST ‘localhost:9200/company/employee/1’ -d ‘{ “employee_id”: ”00001”, “first_name”: “Taro”, “last_name”: “Suzuki”}’

■ インデックス、タイプ、IDを指定してPOST➔ 一部更新をしたい場合はUpdate APIもある

ドキュメントの更新

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

DBFluteフェス 2015

curl -XDELETE ‘localhost:9200/company/employee/1’

■ インデックス、タイプ、IDを指定してDELETE

ドキュメントの削除

■ クエリー指定で複数削除をする場合➔ Delete By QueryのAPIは廃止➔ scroll scanで取得しながらバルクでID指定で削除

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

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➔ フィルタとクエリーを使い分ける

ドキュメントの検索

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

DBFluteフェス 2015

■ GET API (Multi GET)■ Exists API■ Update API■ Bulk API■ Flush■ Refresh■ Optimize/Upgrade API

・・・等々

その他のAPI

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

DBFluteフェス 2015

ESFlute

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

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とは

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

DBFluteフェス 2015

■ インデックスを作成して、設定情報をファイルに保存

curl -XGET localhost:9200/[index] > [index].json ■ DBFluteの基本的な設定を作成

例(Mavenプロジェクトなら):mvn dbflute:downloadmvn dbflute:create-client

■ esfluteMap.dfpropを編集■ DBFluteのFreeGenを実行

mvn dbflute:freegen➔ [basePackage].[index]パッケージ以下にソースコードを自

動生成

ESFluteの利用方法

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

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}

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

DBFluteフェス 2015

ESFluteで操作

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

DBFluteフェス 2015

■ Bhvインスタンスでinsert➔ オプションで即時反映も可能➔ 更新も同じ感じで

データの追加

@Resourceprivate ProductBhv productBhv;…

Product product = new Product();product.setProductDescription(form.productDescription);product.setProductCategoryCode(form.productCategoryCode);...productBhv.insert(product, op -> { op.setRefresh(true); // 即時反映

});

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

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);});

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

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);});

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

DBFluteフェス 2015

■ DBFlute的に必要なメソッドの実装■ ネストしたプロパティへの対応■ multifieldの対応■ join対応■ aggregation対応■ HTTPでの接続方法■ 適切でない利用方法やクエリを通知する

今後のタスク

やることはまだまだありますので、興味がある方はぜひご協力を!

(検索マスターになれるはず)

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

DBFluteフェス 2015

まとめ

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

DBFluteフェス 2015

■ Fess 10➔ Java 8/LastaFlute/Elasticsearch/ESFlute➔ 2015/01に正式リリース予定

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

まとめ