Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

14,237 views

Published on

Fessは「5分で簡単に構築可能な全文検索サーバー」です。 Javaで開発され、検索エンジン部分にはelasticsearchを採用しています。起動すればすぐに全文検索システムとして利用することも可能ですが、APIも提供しているので、開発しているシステムに組み込んで利用することも可能です。

FessではWebやファイルシステム上のHTML、PDF、MS Office系ファイルなどをクロールしてインデクシングすることができます。また、データベース内のデータも取り込んでインデクシングすることも設定だけで可能です。検索についても複雑なクエリーを覚える必要もなく、必要な検索をシンプルに行うことができます。

今回は、Fessを用いた全文検索システムを簡単に構築する方法からJavaでどのように開発しているかなどをご紹介します。

Published in: Software
  • Be the first to comment

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

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

×