Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

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

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

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

Shinsuke Sugaya

January 26, 2017
Tweet

More Decks by Shinsuke Sugaya

Other Decks in Technology

Transcript

  1. 歴史 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に変更 (大規模対応) ➔ グローバル化
  2. 配布物 ▪ GitHubからダウンロード可能 ➔https://github.com/codelibs/fess/releases ▪ 各種形式で提供 ➔ZIP: 組み込みElasticsearchを利用 ➔RPM: ElasticsearchのRPMを利用

    ➔DEB: ElasticsearchのDEBを利用 ▪ 手軽に起動して試すならZIP版 ➔Windows環境向け ➔設定すれば、外部Elasticsearchに変更可能 ▪ Java 8が必要
  3. 起動方法 ▪ 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
  4. 検索 ▪ 検索テキストフィールドに検索語を入力 ➔AND検索 ➔OR検索 ➔NOT検索 ➔範囲検索 ➔ワイルドカード検索 ➔フィールド指定検索 ➔あいまい検索

    ➔ソート(ファイル名、日付、サイズ、クリック数等) ▪ 検索対象数はElasticsearchクラスタに依存 ▪ テキストが取得できるファイルが検索対象
  5. クロール種類 ▪ 3種類のクロール方法 ➔ウェブ:http, https ➔ファイルシステム:file, smb, ftp ➔データストア:DB, CSV,

    Elasticsearch ▪ 独自の外部システムを対象にする場合 ➔データストアのI/Fを実装する ➔例:GitBucket連携 (https://github.com/codelibs/gitbucket-fess-plugin)
  6. データストアクロール ▪ いろいろなデータソースをクロールする ➔DBのデータを検索対象にする場合 ➔外部のデータ群を検索対象にする場合 ▪ 対応可能なデータベース ➔JDBCドライバが提供されているもの ➔SELECT文を書いて、インデックスにマップする ▪

    CSVファイルリストをクロール ➔NASなどのファイル更新ログで差分更新 ➔数TB以上の大規模ファイルシステム向け ▪ DataStoreを実装すれば何でも検索可能 DBや独自システム Fess 何でも可
  7. DataStore public interface DataStore { // クロール設定が渡されるのでそれを元にcallbackにドキュメントを渡す void store(DataConfig config,

    IndexUpdateCallback callback, Map<String, String> initParamMap); // 処理を停止するときに呼ばれる void stop(); }
  8. 検索処理 ▪ 多言語対応のハイブリット検索 ➔ 日本語はbi-gram/形態素解析のハイブリット検索 ▪ 標準フィールドと各言語用フィールドを作成 ➔ 例:titleとtitle_jaなど ▪

    標準フィールド:bi-gram(standard_analyzer) ➔ 英数字はワード(文字数上限を設定)&ステミング ➔ マルチバイトはbi-gram ▪ 形態素解析 ➔ 標準ではkuromojiを利用 ➔ kuromoji-neologdプラグインで差し替え可能 ▪ ブラウザの言語で言語用フィールドをブースト
  9. 検索クエリー変換 ▪ 検索語を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 }
  10. 認証システム連携 ▪ 外部の認証システムと連携可能 ➔LDAP ➔Active Directory ➔OpenID Connect ▪ SSO対応(Windows統合認証に対応)

    ▪ SsoAuthenticatorを実装することで追加可能 検索対象システム Fess AD/LDAP等 利用者 認証問い合わせ
  11. SsoAuthenticator public interface SsoAuthenticator { // ログイン情報を返す LoginCredential getLoginCredential(); }

    public interface LoginCredential { // 保存する情報は認証方法に依存 } // 例 public class UserPasswordCredential implements LoginCredential { protected final String user; protected final String password; ... }
  12. WebApiManager public interface WebApiManager { // リクエストが処理すべきなものか判定 boolean matches(HttpServletRequest request);

    // リクエストを処理(サーブレットフィルタ上で処理されている) void process(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException; }
  13. ディレクトリ構成 ├── 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を同梱している
  14. 〜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拡張
  15. 利用しているElasticsearchプラグイン ▪ Elasticsearchはプラグインにより拡張 ▪ Analysis系プラグイン ➔analysis-ja: 日本語処理 (日本語以外も含む…) ➔analysis-synonym: 同義語処理

    ➔analysis-fess: Fess用言語処理 ▪ LangFieldプラグイン ➔インデックス対象の言語自動判定 ▪ ConfigSyncプラグイン ➔辞書をクラスタに配布 ▪ DataFormatプラグイン ➔各種形式でデータのダウンロード(バックアップで利用)
  16. 開発概要 ▪ GitHubでソースコードを管理 ▪ Mavenプロジェクトとして構成 ▪ 組み込みTomcatのウェブアプリ ➔Java 8 ➔〜Fluteシリーズ

    ➔組み込みElasticsearch ▪ Tomcatで動く普通のJavaのウェブアプリ ▪ 画面はJSPで作成 http://fess.codelibs.org/ja/dev/getting-started.html
  17. 開発するためには ▪ GitHubからソースコードをClone ▪ Elasticsearchプラグインのダウンロード ➔mvn antrun:run ▪ ソースコードの自動生成 (必要に応じて)

    ➔mvn dbflute:freegen ▪ org.codelibs.fess.FessBootを(デバッグ)実行 ➔http://localhost:8080/ にアクセス ▪ 上記でウェブアプリ部分をデバッグ可能 ▪ 各種パッケージ生成 ➔mvn package rpm:rpm jdeb:jdeb