ディープラーニング顔認証システム · ※サーバーの検索処理中に2台目のクライアントが 検索しようとした場合、検索中のメッセージが
全文検索システムFessを用いた検索システム構築入門
-
Upload
shinsuke-sugaya -
Category
Software
-
view
2.910 -
download
5
Transcript of 全文検索システムFessを用いた検索システム構築入門
全文検索システムFessを用いた検索システム構築入門
JJUG CCC 2016 Fall
自己紹介
名前:菅谷信介お仕事:➔ N2SMでFessを作ったり…➔ ビズリーチで機械学習をやったり…
オープンソース関連:➔ Fess, DBFlute関連, Apache Portals,
Codehaus, Seasar2,...
アジェンダ
■ Fessの概要■ 各種機能の説明■ システム構成の説明■ ユースケース■ 開発について
Fessとは
Fessとは
■ オープンソースの全文検索システム➔5分で構築できるくらい簡単に利用可能
■ Apacheライセンスで提供■ Javaベースのアプリケーションサーバ■ Elasticsearchを検索エンジンとして利用■ 現在の最新バージョンは10.3
http://fess.codelibs.org/ja/
検索分野での立ち位置
クローラやUIを提供することで手軽な導入実現
検索関連の知識なくても利用可能(すぐに使える)
検索関連の知識が必要(ガッツリ作りこみが必要)
検索システム➔ Fess、商用検索システム(GSAとか)
検索サーバ+クローラ➔ Hyper Estraier、Namazu、Nutchなど
検索サーバ➔ Solr、Elasticsearch、groongaなど
検索ライブラリ➔ Luceneなど
歴史
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に変更 (大規模対応)➔ グローバル化
配布物
■ GitHubからダウンロード可能➔https://github.com/codelibs/fess/releases
■ 各種形式で提供➔ZIP: 組み込みElasticsearchを利用➔RPM: ElasticsearchのRPMを利用➔DEB: ElasticsearchのDEBを利用
■ 手軽に起動して試すならZIP版➔Windows環境向け➔設定すれば、外部Elasticsearchに変更可能
■ Java 8が必要
起動方法
■ 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
http://localhost:8080/ にアクセス
デモ環境: http://search.n2sm.co.jp/
検索画面
PC版 スマホ版
検索
検索
■ 検索テキストフィールドに検索語を入力➔AND検索➔OR検索➔NOT検索➔範囲検索➔ワイルドカード検索➔フィールド指定検索➔あいまい検索➔ソート(ファイル名、日付、サイズ、クリック数等)
■ 検索対象数はElasticsearchクラスタに依存■ テキストが取得できるファイルが検索対象
ロール検索
■ 認証状態により検索結果を出し分ける➔Fessにログインしているユーザー情報を利用する➔ログインすれば、ロール検索が適用される➔AD連携して、共有フォルダ検索等に利用
■ クロール時に権限情報を付加する➔クロール設定で権限情報を指定可能➔Sambaクロールの場合はファイルの権限が付加される
クロール
クロール種類
■ 3種類のクロール方法➔ウェブ:http, https➔ファイルシステム:file, smb, ftp➔データストア:DB, CSV, Elasticsearch
■ 独自の外部システムを対象にする場合➔データストアのI/Fを実装する➔例:GitBucket連携
(https://github.com/codelibs/gitbucket-fess-plugin)
ウェブクロール
■ HTMLファイルのリンクをクロールする➔WWWサイトやイントラサイトを検索対象にする場合➔リンク構造を辿ってクロールする➔JavaScript的なHTMLサイト以外は検索可能にできる
■ 正規表現でクロール対象を制御可能■ BASIC/Digest/NTLM/FORM認証に対応■ リクエストヘッダーを付加可能
インターネット
イントラネット
Fess
http://〜https://〜
ファイルシステムクロール
■ 階層的なディレクトリ構造をクロールする➔共有フォルダ等を検索対象とする場合➔指定したディレクトリ以下をクロールする
■ SambaやFTPの認証に対応■ file:へのアクセス問題への対応■ 共有フォルダはファイルの権限情報を取得
➔AD連携で自動で閲覧権限を設定
ファイルサーバ等Fess
file://〜smb://〜ftp://〜
データストアクロール
■ いろいろなデータソースをクロールする➔DBのデータを検索対象にする場合➔外部のデータ群を検索対象にする場合
■ 対応可能なデータベース➔JDBCドライバが提供されているもの➔SELECT文を書いて、インデックスにマップする
■ CSVファイルリストをクロール➔NASなどのファイル更新ログで差分更新➔数TB以上の大規模ファイルシステム向け
■ DataStoreを実装すれば何でも検索可能
DBや独自システムFess
何でも可
DataStore
public interface DataStore {
// クロール設定が渡されるのでそれを元にcallbackにドキュメントを渡す
void store(DataConfig config, IndexUpdateCallback callback, Map<String, String> initParamMap);
// 処理を停止するときに呼ばれる
void stop();
}
その他
■ ラベル➔検索対象にラベル(タグ)付けして、検索可能
■ キーマッチ➔登録された検索語での検索時にブーストする
■ ドキュメントブースト➔特定の条件にマッチするものをブーストする
■ 重複ホストの正規化➔例:codelibs.org→www.codelibs.org
検索処理
検索処理
■ 多言語対応のハイブリット検索➔ 日本語はbi-gram/形態素解析のハイブリット検索
■ 標準フィールドと各言語用フィールドを作成➔ 例:titleとtitle_jaなど
■ 標準フィールド:bi-gram(standard_analyzer)➔ 英数字はワード(文字数上限を設定)&ステミング➔ マルチバイトはbi-gram
■ 形態素解析➔ 標準ではkuromojiを利用➔ kuromoji-neologdプラグインで差し替え可能
■ ブラウザの言語で言語用フィールドをブースト
辞書管理
■ 各種辞書を管理画面で編集可能➔形態素解析(Kuromoji, Seunjeon)➔同義語➔文字マッピング➔ステミング除外単語
■ Kuromojiと同義語は再起動なしに反映■ 辞書情報はElasticsearchにHTTPで送信
検索クエリー変換
■ 検索語を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}
管理機能
管理画面
■ adminでログイン
検索画面管理
■ 管理画面で検索画面の編集できる➔管理画面で検索画面のJSPを編集可能
■ 画像やCSS等のアップロードや削除も可能
ジョブ管理
■ 定期実行する処理をジョブとして登録・管理➔クロールの実行もジョブとして管理➔ログやキャッシュのパージ処理等もジョブで登録
■ cron形式で実行時間を指定■ Groovyで任意の処理を記述可能
ユーザー管理
■ ユーザー情報を管理➔ユーザー、ロール、グループを編集可能
■ 管理者はadminロールを持つ■ ロール検索のユーザーを登録可能■ LDAP同期して管理可能
認証システム連携
■ 外部の認証システムと連携可能➔LDAP➔Active Directory➔OpenID Connect
■ SSO対応(Windows統合認証に対応)■ SsoAuthenticatorを実装することで追加可能
検索対象システム
Fess
AD/LDAP等
利用者 認証問い合わせ
SsoAuthenticator
public interface SsoAuthenticator {
// ログイン情報を返す
LoginCredential getLoginCredential();}
public interface LoginCredential { // 保存する情報は認証方法に依存
}
// 例public class UserPasswordCredential implements LoginCredential { protected final String user; protected final String password;...}
検索ログ
■ 検索ログをfess_logインデックスに保存➔検索語➔検索結果のクリック➔利用者➔お気に入り
■ Kibanaの利用を想定➔Fess 9までは管理画面上に表示していた
サジェスト
■ サジェスト機能を独自に実装➔検索ログとコンテンツから生成➔日本語の読みの入力にも対応
■ 管理画面で手動で登録や除外も可能
検索API
■ 検索結果をJSONやXML等で取得可能➔JSON形式➔Google Search Appliance互換形式
■ アクセストークンによりロール検索も可能■ WebApiManagerを実装することで追加可能
WebApiManager
public interface WebApiManager {
// リクエストが処理すべきなものか判定
boolean matches(HttpServletRequest request);
// リクエストを処理(サーブレットフィルタ上で処理されている) void process(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException;}
システム構成
アーキテクチャ
すぐ利用できるようにオールインワンで提供
LastaFlute
Elasticsearch
Fess Crawler
Lasta DI
ESFlute
Tomcat Boot
Fess
Elasticsearchは切り離すことも可能
ディレクトリ構成
├── 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を同梱している
〜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拡張
利用しているElasticsearchプラグイン
■ Elasticsearchはプラグインにより拡張■ Analysis系プラグイン
➔analysis-ja: 日本語処理 (日本語以外も含む…)➔analysis-synonym: 同義語処理➔analysis-fess: Fess用言語処理
■ LangFieldプラグイン➔インデックス対象の言語自動判定
■ ConfigSyncプラグイン➔辞書をクラスタに配布
■ DataFormatプラグイン➔各種形式でデータのダウンロード(バックアップで利用)
ユースケース
ユースケース (連携方法など)
■ スタンドアロンサーバでの連携■ JavaScriptでJSONを取得して連携■ サーバでJSONを取得して連携
スタンドアロンサーバでの連携
■ 利用者はFessからHTMLで検索結果を取得する■ Fessの検索画面(JSP)を編集する
検索対象システムWebアプリ
Fess
クロール
利用者
http://www.〜
http://search.〜
HTML
HTML
画面は管理画面で編集可能
JavaScriptでJSONを取得して連携
■ 利用者はFessからJSONで検索結果を取得する■ 検索結果画面はJavaScriptで作成する
検索対象システムWebアプリ
Fess
クロール
利用者
http://www.〜
http://search.〜
HTML
JavaScriptで検索結果を取得&描画する
JSON
サーバでJSONを取得して連携
■ 利用者はFessに直接アクセスはしない■ ウェブアプリがAPIでFessにアクセスする■ Fessを検索APIサーバとして利用する
検索対象システムWebアプリ
Fess
クロール
利用者
http://www.〜
HTML
ウェブアプリ等で検索結果を取得する
検索APIJSONなど
開発情報
開発概要
■ GitHubでソースコードを管理■ Mavenプロジェクトとして構成■ 組み込みTomcatのウェブアプリ
➔Java 8➔〜Fluteシリーズ➔組み込みElasticsearch
■ Tomcatで動く普通のJavaのウェブアプリ■ 画面はJSPで作成
http://fess.codelibs.org/ja/dev/getting-started.html
開発するためには
■ GitHubからソースコードをClone■ Elasticsearchプラグインのダウンロード
➔mvn antrun:run■ ソースコードの自動生成 (必要に応じて)
➔mvn dbflute:freegen■ org.codelibs.fess.FessBootを(デバッグ)実行
➔http://localhost:8080/ にアクセス
■ 上記でウェブアプリ部分をデバッグ可能■ 各種パッケージ生成
➔mvn package rpm:rpm jdeb:jdeb
クロール部分の開発するためには
■ クロールは別プロセスとして実行➔FessBootからデバッグできない
■ ジョブで実行するものはリモートデバッグ➔管理画面でジョブの設定で.remoteDebug()を追加する➔IDEで8000番をリモートデバッグ
■ クロールとインデクシングで異なるスレッド
まとめ
まとめ
■ Fessはオープンソースの全文検索システム■ Apacheライセンスで提供■ Javaベースのアプリケーションサーバ■ 様々な場所で利用できる