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

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