全文検索システムFessを用いた検索システム構築入門

51
全文検索システムFessを用いた 検索システム構築入門 JJUG CCC 2016 Fall

Transcript of 全文検索システムFessを用いた検索システム構築入門

Page 1: 全文検索システムFessを用いた検索システム構築入門

全文検索システムFessを用いた検索システム構築入門

JJUG CCC 2016 Fall

Page 2: 全文検索システムFessを用いた検索システム構築入門

自己紹介

名前:菅谷信介お仕事:➔ N2SMでFessを作ったり…➔ ビズリーチで機械学習をやったり…

オープンソース関連:➔ Fess, DBFlute関連, Apache Portals,

Codehaus, Seasar2,...

Page 3: 全文検索システムFessを用いた検索システム構築入門

アジェンダ

■ Fessの概要■ 各種機能の説明■ システム構成の説明■ ユースケース■ 開発について

Page 4: 全文検索システムFessを用いた検索システム構築入門

Fessとは

Page 5: 全文検索システムFessを用いた検索システム構築入門

Fessとは

■ オープンソースの全文検索システム➔5分で構築できるくらい簡単に利用可能

■ Apacheライセンスで提供■ Javaベースのアプリケーションサーバ■ Elasticsearchを検索エンジンとして利用■ 現在の最新バージョンは10.3

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

Page 6: 全文検索システムFessを用いた検索システム構築入門

検索分野での立ち位置

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

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

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

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

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

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

検索ライブラリ➔ Luceneなど

Page 7: 全文検索システムFessを用いた検索システム構築入門

歴史

2009/09 Fess 1.0リリース➔ ウェブやファイルシステムを対象に検索(Solr 1.3を利用)

Fess 2.0〜8.0➔ ロール検索に対応 (認証状態による検索)➔ 差分クロール、データベースクロール対応➔ NTLM認証対応➔ ジオ・サーチ対応➔ Responsive Web Design化2014/02 Fess 9.0リリース➔ Solr 4.10.4を利用

2016/02 Fess 10.0リリース➔ Java 8対応➔ Elasticsearchに変更 (大規模対応)➔ グローバル化

Page 8: 全文検索システムFessを用いた検索システム構築入門

配布物

■ GitHubからダウンロード可能➔https://github.com/codelibs/fess/releases

■ 各種形式で提供➔ZIP: 組み込みElasticsearchを利用➔RPM: ElasticsearchのRPMを利用➔DEB: ElasticsearchのDEBを利用

■ 手軽に起動して試すならZIP版➔Windows環境向け➔設定すれば、外部Elasticsearchに変更可能

■ Java 8が必要

Page 9: 全文検索システムFessを用いた検索システム構築入門

起動方法

■ ZIP版$ ./bin/fess

■ RPM/DEB版$ sudo service elasticsearch start$ sudo service fess start or$ sudo systemctl start elasticsearch.service$ sudo systemctl start fess.service

■ Windowsのサービスとしても登録可能■ インストールガイドを参照

➔http://fess.codelibs.org/ja/10.3/install/index.html

Page 10: 全文検索システムFessを用いた検索システム構築入門

http://localhost:8080/ にアクセス

デモ環境: http://search.n2sm.co.jp/

検索画面

PC版 スマホ版

Page 11: 全文検索システムFessを用いた検索システム構築入門

検索

Page 12: 全文検索システムFessを用いた検索システム構築入門

検索

■ 検索テキストフィールドに検索語を入力➔AND検索➔OR検索➔NOT検索➔範囲検索➔ワイルドカード検索➔フィールド指定検索➔あいまい検索➔ソート(ファイル名、日付、サイズ、クリック数等)

■ 検索対象数はElasticsearchクラスタに依存■ テキストが取得できるファイルが検索対象

Page 13: 全文検索システムFessを用いた検索システム構築入門

ロール検索

■ 認証状態により検索結果を出し分ける➔Fessにログインしているユーザー情報を利用する➔ログインすれば、ロール検索が適用される➔AD連携して、共有フォルダ検索等に利用

■ クロール時に権限情報を付加する➔クロール設定で権限情報を指定可能➔Sambaクロールの場合はファイルの権限が付加される

Page 14: 全文検索システムFessを用いた検索システム構築入門

クロール

Page 15: 全文検索システムFessを用いた検索システム構築入門

クロール種類

■ 3種類のクロール方法➔ウェブ:http, https➔ファイルシステム:file, smb, ftp➔データストア:DB, CSV, Elasticsearch

■ 独自の外部システムを対象にする場合➔データストアのI/Fを実装する➔例:GitBucket連携

(https://github.com/codelibs/gitbucket-fess-plugin)

Page 16: 全文検索システムFessを用いた検索システム構築入門

ウェブクロール

■ HTMLファイルのリンクをクロールする➔WWWサイトやイントラサイトを検索対象にする場合➔リンク構造を辿ってクロールする➔JavaScript的なHTMLサイト以外は検索可能にできる

■ 正規表現でクロール対象を制御可能■ BASIC/Digest/NTLM/FORM認証に対応■ リクエストヘッダーを付加可能

インターネット

イントラネット

Fess

http://〜https://〜

Page 17: 全文検索システムFessを用いた検索システム構築入門

ファイルシステムクロール

■ 階層的なディレクトリ構造をクロールする➔共有フォルダ等を検索対象とする場合➔指定したディレクトリ以下をクロールする

■ SambaやFTPの認証に対応■ file:へのアクセス問題への対応■ 共有フォルダはファイルの権限情報を取得

➔AD連携で自動で閲覧権限を設定

ファイルサーバ等Fess

file://〜smb://〜ftp://〜

Page 18: 全文検索システムFessを用いた検索システム構築入門

データストアクロール

■ いろいろなデータソースをクロールする➔DBのデータを検索対象にする場合➔外部のデータ群を検索対象にする場合

■ 対応可能なデータベース➔JDBCドライバが提供されているもの➔SELECT文を書いて、インデックスにマップする

■ CSVファイルリストをクロール➔NASなどのファイル更新ログで差分更新➔数TB以上の大規模ファイルシステム向け

■ DataStoreを実装すれば何でも検索可能

DBや独自システムFess

何でも可

Page 19: 全文検索システムFessを用いた検索システム構築入門

DataStore

public interface DataStore {

// クロール設定が渡されるのでそれを元にcallbackにドキュメントを渡す

void store(DataConfig config, IndexUpdateCallback callback, Map<String, String> initParamMap);

// 処理を停止するときに呼ばれる

void stop();

}

Page 20: 全文検索システムFessを用いた検索システム構築入門

その他

■ ラベル➔検索対象にラベル(タグ)付けして、検索可能

■ キーマッチ➔登録された検索語での検索時にブーストする

■ ドキュメントブースト➔特定の条件にマッチするものをブーストする

■ 重複ホストの正規化➔例:codelibs.org→www.codelibs.org

Page 21: 全文検索システムFessを用いた検索システム構築入門

検索処理

Page 22: 全文検索システムFessを用いた検索システム構築入門

検索処理

■ 多言語対応のハイブリット検索➔ 日本語はbi-gram/形態素解析のハイブリット検索

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

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

■ 形態素解析➔ 標準ではkuromojiを利用➔ kuromoji-neologdプラグインで差し替え可能

■ ブラウザの言語で言語用フィールドをブースト

Page 23: 全文検索システムFessを用いた検索システム構築入門

辞書管理

■ 各種辞書を管理画面で編集可能➔形態素解析(Kuromoji, Seunjeon)➔同義語➔文字マッピング➔ステミング除外単語

■ Kuromojiと同義語は再起動なしに反映■ 辞書情報はElasticsearchにHTTPで送信

Page 24: 全文検索システムFessを用いた検索システム構築入門

検索クエリー変換

■ 検索語をQuery DSLに変換➔ElasticsearchのQuery Stringを利用していない➔Fessが検索語を解析してQueryDSLを生成➔LuceneのSyntax Parserをベースにしている➔Fessではフィールド指定を制御している➔タイトルと本文をor検索(ブースト付きで)

Fess AND 使い方

{ “query”: { “bool”: { “must”: [ {“match_phase”: {“title”:”Fess”}}, … } }, “offset”: 0 “size”: 20}

Page 25: 全文検索システムFessを用いた検索システム構築入門

管理機能

Page 26: 全文検索システムFessを用いた検索システム構築入門

管理画面

■ adminでログイン

Page 27: 全文検索システムFessを用いた検索システム構築入門

検索画面管理

■ 管理画面で検索画面の編集できる➔管理画面で検索画面のJSPを編集可能

■ 画像やCSS等のアップロードや削除も可能

Page 28: 全文検索システムFessを用いた検索システム構築入門

ジョブ管理

■ 定期実行する処理をジョブとして登録・管理➔クロールの実行もジョブとして管理➔ログやキャッシュのパージ処理等もジョブで登録

■ cron形式で実行時間を指定■ Groovyで任意の処理を記述可能

Page 29: 全文検索システムFessを用いた検索システム構築入門

ユーザー管理

■ ユーザー情報を管理➔ユーザー、ロール、グループを編集可能

■ 管理者はadminロールを持つ■ ロール検索のユーザーを登録可能■ LDAP同期して管理可能

Page 30: 全文検索システムFessを用いた検索システム構築入門

認証システム連携

■ 外部の認証システムと連携可能➔LDAP➔Active Directory➔OpenID Connect

■ SSO対応(Windows統合認証に対応)■ SsoAuthenticatorを実装することで追加可能

検索対象システム

Fess

AD/LDAP等

利用者 認証問い合わせ

Page 31: 全文検索システムFessを用いた検索システム構築入門

SsoAuthenticator

public interface SsoAuthenticator {

// ログイン情報を返す

LoginCredential getLoginCredential();}

public interface LoginCredential { // 保存する情報は認証方法に依存

}

// 例public class UserPasswordCredential implements LoginCredential { protected final String user; protected final String password;...}

Page 32: 全文検索システムFessを用いた検索システム構築入門

検索ログ

■ 検索ログをfess_logインデックスに保存➔検索語➔検索結果のクリック➔利用者➔お気に入り

■ Kibanaの利用を想定➔Fess 9までは管理画面上に表示していた

Page 33: 全文検索システムFessを用いた検索システム構築入門

サジェスト

■ サジェスト機能を独自に実装➔検索ログとコンテンツから生成➔日本語の読みの入力にも対応

■ 管理画面で手動で登録や除外も可能

Page 34: 全文検索システムFessを用いた検索システム構築入門

検索API

■ 検索結果をJSONやXML等で取得可能➔JSON形式➔Google Search Appliance互換形式

■ アクセストークンによりロール検索も可能■ WebApiManagerを実装することで追加可能

Page 35: 全文検索システムFessを用いた検索システム構築入門

WebApiManager

public interface WebApiManager {

// リクエストが処理すべきなものか判定

boolean matches(HttpServletRequest request);

// リクエストを処理(サーブレットフィルタ上で処理されている) void process(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException;}

Page 36: 全文検索システムFessを用いた検索システム構築入門

システム構成

Page 37: 全文検索システムFessを用いた検索システム構築入門

アーキテクチャ

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

LastaFlute

Elasticsearch

Fess Crawler

Lasta DI

ESFlute

Tomcat Boot

Fess

Elasticsearchは切り離すことも可能

Page 38: 全文検索システムFessを用いた検索システム構築入門

ディレクトリ構成

├── 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 39: 全文検索システムFessを用いた検索システム構築入門

〜Fluteシリーズ

FessではDBFluteを始めとする様々な〜Fluteライブラリを使用しています!

■ DBFlute: DB変更に強いO/Rマッパ&ツール群■ LastaDI: DIコンテナ

➔Seasar2からフォークしてJava8対応

■ LastaFlute: Java8対応のWebフレームワーク➔リーンスタートアップ&インクリメンタル開発向け➔SAStrutsからフォークして発展

■ LastaJob: ジョブスケジューラ■ ESFlute: Elasticsearch向けのO/Rマッパ■ MailFlute: メール送信ライブラリ

➔テンプレートなども利用可能

■ UTFlute: newしたものにDIできるJUnit拡張

Page 40: 全文検索システムFessを用いた検索システム構築入門

利用しているElasticsearchプラグイン

■ Elasticsearchはプラグインにより拡張■ Analysis系プラグイン

➔analysis-ja: 日本語処理 (日本語以外も含む…)➔analysis-synonym: 同義語処理➔analysis-fess: Fess用言語処理

■ LangFieldプラグイン➔インデックス対象の言語自動判定

■ ConfigSyncプラグイン➔辞書をクラスタに配布

■ DataFormatプラグイン➔各種形式でデータのダウンロード(バックアップで利用)

Page 41: 全文検索システムFessを用いた検索システム構築入門

ユースケース

Page 42: 全文検索システムFessを用いた検索システム構築入門

ユースケース (連携方法など)

■ スタンドアロンサーバでの連携■ JavaScriptでJSONを取得して連携■ サーバでJSONを取得して連携

Page 43: 全文検索システムFessを用いた検索システム構築入門

スタンドアロンサーバでの連携

■ 利用者はFessからHTMLで検索結果を取得する■ Fessの検索画面(JSP)を編集する

検索対象システムWebアプリ

Fess

クロール

利用者

http://www.〜

http://search.〜

HTML

HTML

画面は管理画面で編集可能

Page 44: 全文検索システムFessを用いた検索システム構築入門

JavaScriptでJSONを取得して連携

■ 利用者はFessからJSONで検索結果を取得する■ 検索結果画面はJavaScriptで作成する

検索対象システムWebアプリ

Fess

クロール

利用者

http://www.〜

http://search.〜

HTML

JavaScriptで検索結果を取得&描画する

JSON

Page 45: 全文検索システムFessを用いた検索システム構築入門

サーバでJSONを取得して連携

■ 利用者はFessに直接アクセスはしない■ ウェブアプリがAPIでFessにアクセスする■ Fessを検索APIサーバとして利用する

検索対象システムWebアプリ

Fess

クロール

利用者

http://www.〜

HTML

ウェブアプリ等で検索結果を取得する

検索APIJSONなど

Page 46: 全文検索システムFessを用いた検索システム構築入門

開発情報

Page 47: 全文検索システムFessを用いた検索システム構築入門

開発概要

■ GitHubでソースコードを管理■ Mavenプロジェクトとして構成■ 組み込みTomcatのウェブアプリ

➔Java 8➔〜Fluteシリーズ➔組み込みElasticsearch

■ Tomcatで動く普通のJavaのウェブアプリ■ 画面はJSPで作成

http://fess.codelibs.org/ja/dev/getting-started.html

Page 48: 全文検索システムFessを用いた検索システム構築入門

開発するためには

■ GitHubからソースコードをClone■ Elasticsearchプラグインのダウンロード

➔mvn antrun:run■ ソースコードの自動生成 (必要に応じて)

➔mvn dbflute:freegen■ org.codelibs.fess.FessBootを(デバッグ)実行

➔http://localhost:8080/ にアクセス

■ 上記でウェブアプリ部分をデバッグ可能■ 各種パッケージ生成

➔mvn package rpm:rpm jdeb:jdeb

Page 49: 全文検索システムFessを用いた検索システム構築入門

クロール部分の開発するためには

■ クロールは別プロセスとして実行➔FessBootからデバッグできない

■ ジョブで実行するものはリモートデバッグ➔管理画面でジョブの設定で.remoteDebug()を追加する➔IDEで8000番をリモートデバッグ

■ クロールとインデクシングで異なるスレッド

Page 50: 全文検索システムFessを用いた検索システム構築入門

まとめ

Page 51: 全文検索システムFessを用いた検索システム構築入門

まとめ

■ Fessはオープンソースの全文検索システム■ Apacheライセンスで提供■ Javaベースのアプリケーションサーバ■ 様々な場所で利用できる