Elasticsearchベースの全文検索システムFess

28
Elasticsearchベースの 全文検索システムFess 16elasticsearch勉強会

Transcript of Elasticsearchベースの全文検索システムFess

Page 1: Elasticsearchベースの全文検索システムFess

Elasticsearchベースの 全文検索システムFess

第16回elasticsearch勉強会

Page 2: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

■ Fessとは■ FessにおけるElasticsearchまわりの話■ デモ

アジェンダ

Page 3: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

Fessとは

Page 4: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

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

■ Apacheライセンスで提供■ Elasticsearchを検索エンジンとして利用■ 現在の最新バージョンは10.1➔2009/09にSolrベースで1.0をリリース

■ 商用サポートも提供 (N2 Search)

Fessとは

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

Page 5: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

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

検索分野での立ち位置

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

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

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

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

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

検索ライブラリ➔ Luceneなど

Page 6: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

■ Javaの実行環境があればすぐに利用可能■ Web/共有フォルダ/DBなどのクロール■ ブラウザによる操作■ MS Office、PDF、圧縮ファイルもサポート■ Responsive Web Designに対応■ Active Directory連携 (ロール検索)■ ファセット検索やジオ・サーチに対応■ ドキュメントブーストやキーマッチ機能■ 検索ログやクリックログで集計(表示はKibana)■ 独自のサジェストを実装

Fessの特徴

Page 7: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

■ SolrからElasticsearchへ➔ 大規模検索の対応

■ Seasar2/SAStrutsからLastaFluteへ➔ 技術的負債の解消

■ DBFluteからESFluteへ➔ DBをやめて、すべてをESに

■ ロール検索の強化➔ AD/LDAPなどの連携強化

■ 国際化➔ 27言語のAnalyzerを対応(10.2〜)

Fess 10での変更

Page 8: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

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

アーキテクチャ

LastaFlute

Elasticsearch

Fess Crawler

Lasta DI

ESFlute

Tomcat Boot

Fess

Elasticsearchは切り離すことも可能

Page 9: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

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関連ファイル

標準でElasticsearchを同梱している

Page 10: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

商用サポート

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

様々な質問にも期限内に対応

■ 商用製品としては、N2 Searchとして提供➔ Fessにカスタマイズを追加して提供➔ 設定を最適化したパッケージを利用➔ 約ニ十万語の辞書をバンドル

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

Page 11: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

FessにおけるElasticsearchの話

Page 12: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

日本語検索

Page 13: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

■ bi-gram/形態素解析のハイブリット検索➔ 1文字検索とスコア調整

■ 標準フィールドと各言語用フィールドを作成➔ 例:titleとtitle_jaなど

■ bi-gram(standard_analyzer)➔ 英数字はワード(文字数上限を設定)&ステミング➔ マルチバイトはbi-gram

■ 形態素解析(japanese_analyzer)➔ kuromoji-neologd (elasticsearchプラグイン)

■ ブラウザの言語設定によって、言語用フィールドをブーストしてor検索

日本語検索

Page 14: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

■ タームへの一致度が高いもののスコアを上げる

ハイブリット検索

“query” : { “bool” : { “should” : [{ “match” : { “title” : { “query” : “検索語”, “type” : “phrase”, “boost” : 1.0 } },{ “match” : { “title_ja” : { “query” : “検索語”, “type” : “phrase”, “boost” : 2.0 } },{...

Page 15: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

言語自動判定

Page 16: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

■ LangFieldプラグインを利用https://github.com/codelibs/elasticsearch-langfield

■ インデクシング時にフィールドの内容を見てcopy_toのような動きをする➔ 登録するJSONには”title”:”〜”というデータを入れて、その文

が日本と判定されれば、title_jaフィールドにcopy_toする

■ language-detectionをフォークして利用➔ https://github.com/shuyo/language-detection

言語自動判定

Page 17: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

ロール検索

Page 18: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

■ ログイン状態に適した検索結果を表示する■ 検索時

➔ ログイン時に権限情報をセッションに保存

■ インデキシング時➔ ドキュメントの権限情報フィールドに保存

■ 検索時にはbool:filter:termクエリーを利用

ロール検索

Page 19: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

■ 権限情報でfilterクエリーで絞り込む

ロール検索

“query” : { “bool” : { “must” : [...検索条件...], “filter” : [{ "bool" : { "should" : [ { "term" : { "role" : "1guest" } }, { "term" : { "role" : "Rguest" } } ]

Page 20: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

辞書の配布

Page 21: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

■ Elasticsearchは分離可能なので、APIで辞書ファイルの操作できる必要がある

■ Conifg Syncプラグインを利用https://github.com/codelibs/elasticsearch-configsync

■ REST APIで辞書ファイルをGET/POST■ アップロードした情報はElasticsearchがアクセス可

能な場所にファイルとして保存できる

辞書の配布

Page 22: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

DBFlute/ESFlute

Page 23: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

■ DBFluteはJavaの素晴らしいO/Rマッパー➔ SpringやOracleなど様々に対応➔ https://github.com/dbflute

■ ESFluteはDBFluteのElasticsearch版■ ESFluteにより必要なJavaクラスを自動生成■ Elasticsearchへの通信はTransportを利用

DBFlute/ESFlute

Page 24: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

■ 自動生成されたエンティティを用いてElasticsearchにアクセス可能

ESFluteのコード例

@Resourceprivate ProductBhv productBhv;…

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

});

Page 25: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

デモ

Page 26: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

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

Page 27: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

まとめ

Page 28: Elasticsearchベースの全文検索システムFess

第16回elasticsearch勉強会

■ Fess 10➔ オープンソースの全文検索システム➔ Elasticsearchのリリースに合わせて更新

■ Fessの今後➔ より大規模検索へ (対象容量が数十TBへ)➔ Deep Learningを用いた検索 (画像とか)

まとめ