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の管理画面
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
SolrS2Robot
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/elasticsearchrpm:
$ 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
DocDocDoc
DocDocDoc
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:downloadmvn 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➔ オプションで即時反映も可能➔ 更新も同じ感じで
データの追加
@Resourceprivate 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にバンドル済み➔ 開発者を募集中
まとめ
Top Related