これらの記事の続きです:
nsf2dxl2web の挑戦(1)
nsf2dxl2web の挑戦(2)
nsf2dxl2web の挑戦(3)
nsf2dxl2web の挑戦(4)
nsf2dxl2web の挑戦(5)
ノーツデータベースのウェブ化ツールである nsf2dxl2web を紹介しています。5回目となる今回は検索編と位置付けています。 nsf2dxl2web そのものの機能紹介ではないのですが、nsf2dxl2web でウェブ化したデータベース内のビュー/フォルダや各文書を検索する仕組みをオープンソース全文検索サーバーである Fess を使って構築する手順を紹介します。なお一般的な Fess の使い方となるクイックスタートはこちらを参照ください:
https://fess.codelibs.org/ja/quick-start.html
まず、今回のために nsf2dxl2web を使って2つのノーツデータベースをウェブ化したサイトを以下に公開しました:
https://dotnsf.github.io/nsf2dxl2web_githubpages/
アクセスすると上図のように2つのノーツデータベース(「NSF2DXL2WEB サンプル」と「サンプルDB」)をウェブ化したサイトが表示されます。この2つのノーツデータベースは私が nsf2dxl2web の動作テスト用に UI 含めて作ったものです(「サンプル DB」はリンク先のテスト目的で作ったものなので1文書だけのシンプルなものです。「NSF2DXL2WEB サンプル」にはサブフォームや添付ファイルを含めた様々なリッチテキスト要素が含まれています。前回説明しましたが、検索対象となることを想定してどちらも Standard UI のビュー/フォルダ形式にしています)。もともとノーツのワークスペース上に存在していた時の様子は以下なので、データベースアイコン含めて再現されていることが改めて確認できると思います:
"NSF2DXL2WEB サンプル" と書かれたアイコンをクリックすると、選択したノーツデータベースを nsf2dxl2web を使ってウェブ化したページが表示されます:
ではこのノーツデータベースをウェブ化した上記サイトを Fess で全文検索する手順を以下に紹介します。このサイトはパブリックに公開しているので、よかったら皆さんの Fess 構築作業(後述)の練習にも使ってみてください。
【Fess について】
Fess は Java で開発されたオープンソースの全文検索エンジンです。商用サポートのついたソフトウェアである N2SM Search のコミュニティ版、という位置づけです。
Fess は主に以下の機能が提供されています:
・ウェブのデータ収集と、収集したページの全文検索エンジン(今回紹介する機能)
・ファイルサーバーのデータ収集と、収集したファイルの全文検索
・データストア(CSV や RDB など)のデータ収集と、収集したデータの全文検索エンジン
Fess には Windows 版と Linux 版があり、Linux 版は rpm 形式や deb 形式でのパッケージ配布に加え、docker に対応したコンテナイメージも提供されています。本ブログエントリでは docker 版を使って構築手順を紹介します。
【Fess のインストール】
以下では docker 版の Fess をインストールする手順を紹介します。前提として docker (と docker-compose)がインストールされた x86_64 版の Linux 環境が必要になるため、自分の PC やクラウドサーバー上に用意しておいてください。
そして docker 導入済みの環境で以下のコマンドを実行して Fess を(正確には OpenSearch 版の Fess を)インストールします:
補足として、3つ目のコマンドを実行する理由はこの設定が推奨されていたためです。また4つ目のコマンドで実際に Fess を起動するのですが、Fess の検索機能で CORS の有効/無効を切り替えたい場合(Fess サーバーの外部から JavaScript で検索した場合などは有効にする必要があります)は4つ目のコマンドを実行する前に compose-opensearch2.yaml ファイルを編集して CORS コマンドの有効/無効を切り替えておく必要があります:
最後のコマンドを実行すると Fess が起動します。初回のみイメージのダウンロードを伴うため時間がかかりますが、(イメージのダウンロードが済んだ)2回目以降はすぐに起動できるはずです。
Fess は 8080 番ポートで起動します。コマンド完了後に docker ホストの 8080 番ポートにアクセスし、以下のような画面が表示されればインストールが成功しています:
デフォルトでは
ユーザーID: admin
パスワード: admin
のアカウントが作成されています。「ログイン」と書かれたリンクからログインします:
初回ログイン時のみパスワードの更新が求められるので、新しいパスワードに更新します。以後、この新しいパスワードでログインしているものとして説明を続けます:
【Fess で nsf2dxl2web サイトの全文検索インデックスを作る手順】
では Fess に(nsf2dxl2web で作ったウェブの)新しい検索インデックスを登録します。ログイン名の所をクリックし、「管理」を選択します:
下のような管理画面が表示されます。画面左上にハンバーガーメニューがあることを確認します:
ハンバーガーメニューから 「クローラー」-「ウェブ」 を選択します:
ウェブのクローラー設定の一覧画面が表示されます(最初の状態では何も登録されていません)。ここに新しいウェブを追加するので、画面右上の「新規作成」をクリックします:
ウェブクロールの新規設定画面が表示されます:
ここに以下の内容を入力していきます(書かれていない項目はデフォルト値のまま):
・名前:(任意の設定の名称 例えば "NSF2DXL2WEB サンプル")
・URL:検索先ページの URL、上記例であれば "https://dotnsf.github.io/nsf2dxl2web_githubpages/49258A000002200B/index.html"
・クロール対象から除外する URL:(デフォルトから "|xml" を削除したもの)
・深さ:3
なお、除外する URL から "|xml" を除いた理由ですが、デフォルト設定のままだと "xml" で終わる URL はクロールされないことになります。nsf2dxl2web でウェブ化したサイトの場合、各文書の URL は ".xml" で終わるので、このデフォルト設定のままだと文書データが検索インデックスに含まれなくなってしまいます。この状況を回避する目的でこの設定にしています。
また「深さ=3」を指定する意味ですが、ここでの「深さ」とは「ページ内のリンクを何段階まで辿るか」を意味しています。nsf2dxl2web でウェブ化した場合、対象 URL は index.html を指しているので、
深さ=0:index.html のみ
深さ=1:views.html (ビュー/フォルダ一覧)まで
深さ=2:各ビュー/フォルダの HTML まで
深さ=3:各文書まで(Standard UI の場合のみ)
を対象にクロールすることになります。というわけで、各文書のデータまで検索できるよう、ここでは「3」を指定しています。
設定できたら最後に「作成」ボタンをクリックします:
ウェブのクローラー設定の一覧画面に戻ります。いま作成した設定が追加されていることを確認してクリックします:
自動で付与された ID などを含め、作成した内容が表示されます。この登録内容を使い、「ジョブ」という単位でクロールを実行することになります。そのジョブを新規に作成するため、最下部の「新しいジョブの作成」ボタンをクリックします:
画面に色々表示されますが、すべてデフォルト値のままで構いません。最下部の「作成」ボタンをクリックします:
すると「ジョブスケジューラ」画面に切り替わり、今作成したジョブが追加されていることが確認できます。この作成されたジョブを選択します:
※なお、このジョブスケジューラの一覧画面はハンバーガーメニューから 「システム」-「スケジューラ」 を選択することでも表示することができます:
作成したジョブの内容が表示されます。ジョブの実行タイミングやスケジュールを指定することができるのですが、nsf2dxl2web でウェブ化したノーツデータベースの場合は(このシリーズの初回に背景として説明したように、ノーツデータベース側の変更が加わることはほとんどない想定でウェブ化されていることが多いと思うので)1回実行しておけば2度目は不要ということがほとんどだと思っています。ほぼこのままで問題ないはずですが、必要に応じて実行スケジュールを変更してください。
このジョブを実行するには最下部の「今すぐ開始」をクリックします:
ジョブの実行が開始された、という旨のメッセージが表示されます。これで指定した内容でのクローリングが開始されています:
ジョブの実行状況を確認する場合はハンバーガーメニューから 「システム情報」-「ジョブログ」 を選択します:
過去に実行したジョブのログが一覧で表示されています。「状態」列が「実行中」となっている場合はジョブが実行中であることを意味しています:
この値が「OK」になっているとジョブの実行が完了、つまりクロールが完了して、検索可能な状態になっていることを意味しています。状態が「OK」になっていない場合は「OK」になるまで待ちます:
これを必要なノーツデータベースのぶんだけ繰り返します。今回の場合は「NSF2DXL2WEB サンプル」に加えて「サンプル DB」も Standard UI で用意しているので検索可能です。というわけでこちらのデータベースについても同様にインデックスを作成して検索ジョブを実行し、両方が完了している状態を作っておきました:
なお、このサンプルのサイトの場合は(普通に公開されているので)不要ですが、検索対象先にベーシック認証がかかっている場合はハンバーガーメニューから 「クローラー」-「ウェブ認証」 を選択して、ウェブ認証情報を追加することも可能です:
では検索インデックスが準備できたので、実際に検索してみます。Fess のトップページに戻り、適当なキーワード(下図では「タブ」)を入力後に Enter キーで検索してみます:
検索結果の一覧が表示されます。ちゃんと全文検索できているので、ビューも文書も検索結果に含まれています:
試しに検索結果のある文書をクリックすると、その文書が正しく表示されます:
この例では複数のノーツデータベースの検索インデックスを有効にしていたので、複数のデータベースにまたがる検索が可能です。複数のデータベース内に含まれる検索ワード(下の例では「テスト」)を指定して検索した検索結果は異なるデータベースのものが含まれるはずです。ノーツデータベースでいうところの「串刺し検索」が可能になっていることを確認できます:
以上、ノーツデータベースの参照ウェブ化ツールである nsf2dxl2web の使い方を、カスタマイズや検索機能まで含めて5回にわたって紹介してきました。ノーツデータベースを参照目的に絞ってウェブ化するツールですが、XSL を採用することでノーツの設計思想に近い形のままウェブ化でき、そのためカスタマイズ時にもフォーム単位でのカスタマイズが可能になっていたり、nginx やクラウド/コンテナ化を併用することで抜群のパフォーマンスが期待できたり、参照用途には必須の全文検索まで含めて実現できることが確認できています。
ノーツをほぼ参照目的だけで使い続けているケースではこういうウェブ化もアリなんじゃないかと思いながら作ってみた nsf2dxl2web がどこかで誰かの役に立つ日が来ることを願っています。
(過去記事はこちらです)
nsf2dxl2web の挑戦(1)
nsf2dxl2web の挑戦(2)
nsf2dxl2web の挑戦(3)
nsf2dxl2web の挑戦(4)
nsf2dxl2web の挑戦(5)
nsf2dxl2web の挑戦(1)
nsf2dxl2web の挑戦(2)
nsf2dxl2web の挑戦(3)
nsf2dxl2web の挑戦(4)
nsf2dxl2web の挑戦(5)
ノーツデータベースのウェブ化ツールである nsf2dxl2web を紹介しています。5回目となる今回は検索編と位置付けています。 nsf2dxl2web そのものの機能紹介ではないのですが、nsf2dxl2web でウェブ化したデータベース内のビュー/フォルダや各文書を検索する仕組みをオープンソース全文検索サーバーである Fess を使って構築する手順を紹介します。なお一般的な Fess の使い方となるクイックスタートはこちらを参照ください:
https://fess.codelibs.org/ja/quick-start.html
まず、今回のために nsf2dxl2web を使って2つのノーツデータベースをウェブ化したサイトを以下に公開しました:
https://dotnsf.github.io/nsf2dxl2web_githubpages/
アクセスすると上図のように2つのノーツデータベース(「NSF2DXL2WEB サンプル」と「サンプルDB」)をウェブ化したサイトが表示されます。この2つのノーツデータベースは私が nsf2dxl2web の動作テスト用に UI 含めて作ったものです(「サンプル DB」はリンク先のテスト目的で作ったものなので1文書だけのシンプルなものです。「NSF2DXL2WEB サンプル」にはサブフォームや添付ファイルを含めた様々なリッチテキスト要素が含まれています。前回説明しましたが、検索対象となることを想定してどちらも Standard UI のビュー/フォルダ形式にしています)。もともとノーツのワークスペース上に存在していた時の様子は以下なので、データベースアイコン含めて再現されていることが改めて確認できると思います:
"NSF2DXL2WEB サンプル" と書かれたアイコンをクリックすると、選択したノーツデータベースを nsf2dxl2web を使ってウェブ化したページが表示されます:
ではこのノーツデータベースをウェブ化した上記サイトを Fess で全文検索する手順を以下に紹介します。このサイトはパブリックに公開しているので、よかったら皆さんの Fess 構築作業(後述)の練習にも使ってみてください。
【Fess について】
Fess は Java で開発されたオープンソースの全文検索エンジンです。商用サポートのついたソフトウェアである N2SM Search のコミュニティ版、という位置づけです。
Fess は主に以下の機能が提供されています:
・ウェブのデータ収集と、収集したページの全文検索エンジン(今回紹介する機能)
・ファイルサーバーのデータ収集と、収集したファイルの全文検索
・データストア(CSV や RDB など)のデータ収集と、収集したデータの全文検索エンジン
Fess には Windows 版と Linux 版があり、Linux 版は rpm 形式や deb 形式でのパッケージ配布に加え、docker に対応したコンテナイメージも提供されています。本ブログエントリでは docker 版を使って構築手順を紹介します。
【Fess のインストール】
以下では docker 版の Fess をインストールする手順を紹介します。前提として docker (と docker-compose)がインストールされた x86_64 版の Linux 環境が必要になるため、自分の PC やクラウドサーバー上に用意しておいてください。
そして docker 導入済みの環境で以下のコマンドを実行して Fess を(正確には OpenSearch 版の Fess を)インストールします:
$ git clone https://github.com/codelibs/docker-fess.git $ cd docker-fess/compose $ sudo sysctl -w vm.max_map_count=262144 $ docker compose -f compose.yaml -f compose-opensearch2.yaml up -d または $ docker-compose -f compose.yaml -f compose-opensearch2.yaml up -d
補足として、3つ目のコマンドを実行する理由はこの設定が推奨されていたためです。また4つ目のコマンドで実際に Fess を起動するのですが、Fess の検索機能で CORS の有効/無効を切り替えたい場合(Fess サーバーの外部から JavaScript で検索した場合などは有効にする必要があります)は4つ目のコマンドを実行する前に compose-opensearch2.yaml ファイルを編集して CORS コマンドの有効/無効を切り替えておく必要があります:
: services: es01: environment: - "api.cors.allow.origin=*" - "api.cors.allow.methods=GET, POST, OPTIONS, DELETE, PUT" - "api.cors.max.age=3600" - "api.cors.allow.headers=Origin, Content-Type, Accept, Authorization, X-Requested-With" - "api.cors.allow.credentials=true" :
最後のコマンドを実行すると Fess が起動します。初回のみイメージのダウンロードを伴うため時間がかかりますが、(イメージのダウンロードが済んだ)2回目以降はすぐに起動できるはずです。
Fess は 8080 番ポートで起動します。コマンド完了後に docker ホストの 8080 番ポートにアクセスし、以下のような画面が表示されればインストールが成功しています:
デフォルトでは
ユーザーID: admin
パスワード: admin
のアカウントが作成されています。「ログイン」と書かれたリンクからログインします:
初回ログイン時のみパスワードの更新が求められるので、新しいパスワードに更新します。以後、この新しいパスワードでログインしているものとして説明を続けます:
【Fess で nsf2dxl2web サイトの全文検索インデックスを作る手順】
では Fess に(nsf2dxl2web で作ったウェブの)新しい検索インデックスを登録します。ログイン名の所をクリックし、「管理」を選択します:
下のような管理画面が表示されます。画面左上にハンバーガーメニューがあることを確認します:
ハンバーガーメニューから 「クローラー」-「ウェブ」 を選択します:
ウェブのクローラー設定の一覧画面が表示されます(最初の状態では何も登録されていません)。ここに新しいウェブを追加するので、画面右上の「新規作成」をクリックします:
ウェブクロールの新規設定画面が表示されます:
ここに以下の内容を入力していきます(書かれていない項目はデフォルト値のまま):
・名前:(任意の設定の名称 例えば "NSF2DXL2WEB サンプル")
・URL:検索先ページの URL、上記例であれば "https://dotnsf.github.io/nsf2dxl2web_githubpages/49258A000002200B/index.html"
・クロール対象から除外する URL:(デフォルトから "|xml" を削除したもの)
・深さ:3
なお、除外する URL から "|xml" を除いた理由ですが、デフォルト設定のままだと "xml" で終わる URL はクロールされないことになります。nsf2dxl2web でウェブ化したサイトの場合、各文書の URL は ".xml" で終わるので、このデフォルト設定のままだと文書データが検索インデックスに含まれなくなってしまいます。この状況を回避する目的でこの設定にしています。
また「深さ=3」を指定する意味ですが、ここでの「深さ」とは「ページ内のリンクを何段階まで辿るか」を意味しています。nsf2dxl2web でウェブ化した場合、対象 URL は index.html を指しているので、
深さ=0:index.html のみ
深さ=1:views.html (ビュー/フォルダ一覧)まで
深さ=2:各ビュー/フォルダの HTML まで
深さ=3:各文書まで(Standard UI の場合のみ)
を対象にクロールすることになります。というわけで、各文書のデータまで検索できるよう、ここでは「3」を指定しています。
設定できたら最後に「作成」ボタンをクリックします:
ウェブのクローラー設定の一覧画面に戻ります。いま作成した設定が追加されていることを確認してクリックします:
自動で付与された ID などを含め、作成した内容が表示されます。この登録内容を使い、「ジョブ」という単位でクロールを実行することになります。そのジョブを新規に作成するため、最下部の「新しいジョブの作成」ボタンをクリックします:
画面に色々表示されますが、すべてデフォルト値のままで構いません。最下部の「作成」ボタンをクリックします:
すると「ジョブスケジューラ」画面に切り替わり、今作成したジョブが追加されていることが確認できます。この作成されたジョブを選択します:
※なお、このジョブスケジューラの一覧画面はハンバーガーメニューから 「システム」-「スケジューラ」 を選択することでも表示することができます:
作成したジョブの内容が表示されます。ジョブの実行タイミングやスケジュールを指定することができるのですが、nsf2dxl2web でウェブ化したノーツデータベースの場合は(このシリーズの初回に背景として説明したように、ノーツデータベース側の変更が加わることはほとんどない想定でウェブ化されていることが多いと思うので)1回実行しておけば2度目は不要ということがほとんどだと思っています。ほぼこのままで問題ないはずですが、必要に応じて実行スケジュールを変更してください。
このジョブを実行するには最下部の「今すぐ開始」をクリックします:
ジョブの実行が開始された、という旨のメッセージが表示されます。これで指定した内容でのクローリングが開始されています:
ジョブの実行状況を確認する場合はハンバーガーメニューから 「システム情報」-「ジョブログ」 を選択します:
過去に実行したジョブのログが一覧で表示されています。「状態」列が「実行中」となっている場合はジョブが実行中であることを意味しています:
この値が「OK」になっているとジョブの実行が完了、つまりクロールが完了して、検索可能な状態になっていることを意味しています。状態が「OK」になっていない場合は「OK」になるまで待ちます:
これを必要なノーツデータベースのぶんだけ繰り返します。今回の場合は「NSF2DXL2WEB サンプル」に加えて「サンプル DB」も Standard UI で用意しているので検索可能です。というわけでこちらのデータベースについても同様にインデックスを作成して検索ジョブを実行し、両方が完了している状態を作っておきました:
なお、このサンプルのサイトの場合は(普通に公開されているので)不要ですが、検索対象先にベーシック認証がかかっている場合はハンバーガーメニューから 「クローラー」-「ウェブ認証」 を選択して、ウェブ認証情報を追加することも可能です:
では検索インデックスが準備できたので、実際に検索してみます。Fess のトップページに戻り、適当なキーワード(下図では「タブ」)を入力後に Enter キーで検索してみます:
検索結果の一覧が表示されます。ちゃんと全文検索できているので、ビューも文書も検索結果に含まれています:
試しに検索結果のある文書をクリックすると、その文書が正しく表示されます:
この例では複数のノーツデータベースの検索インデックスを有効にしていたので、複数のデータベースにまたがる検索が可能です。複数のデータベース内に含まれる検索ワード(下の例では「テスト」)を指定して検索した検索結果は異なるデータベースのものが含まれるはずです。ノーツデータベースでいうところの「串刺し検索」が可能になっていることを確認できます:
以上、ノーツデータベースの参照ウェブ化ツールである nsf2dxl2web の使い方を、カスタマイズや検索機能まで含めて5回にわたって紹介してきました。ノーツデータベースを参照目的に絞ってウェブ化するツールですが、XSL を採用することでノーツの設計思想に近い形のままウェブ化でき、そのためカスタマイズ時にもフォーム単位でのカスタマイズが可能になっていたり、nginx やクラウド/コンテナ化を併用することで抜群のパフォーマンスが期待できたり、参照用途には必須の全文検索まで含めて実現できることが確認できています。
ノーツをほぼ参照目的だけで使い続けているケースではこういうウェブ化もアリなんじゃないかと思いながら作ってみた nsf2dxl2web がどこかで誰かの役に立つ日が来ることを願っています。
(過去記事はこちらです)
nsf2dxl2web の挑戦(1)
nsf2dxl2web の挑戦(2)
nsf2dxl2web の挑戦(3)
nsf2dxl2web の挑戦(4)
nsf2dxl2web の挑戦(5)
コメント