スタッフブログ Staff Blog

PowerCMSに付属の「PowerSearchプラグイン(エンタープライズ検索)」の理解を深める

最近PowerCMSに付属の「PowerSearchプラグイン(エンタープライズ検索)」を使用し、指定の期間に公開された記事を抽出して表示する機能の実装を行いました。その際、どのようなクエリストリング・テンプレートにすれば良いのか、マニュアルを読んでもなかなか答えにたどり着くことができませんでした。

そもそも、PowerSearchはインデックス型の検索エンジンである「Hyper Estraier」を利用したシステムです。そこで、Hyper Estraierを自分のマシンであるMacにインストールし、コアであるHyper Estraierについての理解を深めることにしました。

インストール方法

  1. 公式サイトからパッケージをダウンロードし、展開します。
  2. ターミナルを開いて1.で展開したディレクトリに移動し、./configureを実行してビルド環境を設定します。
  3. make macを実行し、プログラムをビルドします。
  4. make install-macを実行し、プログラムをインストールします。

Macの場合はmake macmake install-macになるのがポイントです。正しくインストールできた場合、estcmdを実行するとestcmdの詳細が表示されます。

ドラフトファイルの作成

適当な内容でドラフトファイルをいくつか作成します。文書ドラフトはHyper Estraier独自のデータ形式で、詳細は公式サイトのユーザーガイドに記載があります。

今回は特定の期間に公開された記事の抽出についてコマンドラインでテストをしたいので、@cdate属性のみ丁寧に作り、後の情報は適当に埋めました。(PowerCMSで検索を行う際は、テンプレートを書いて丁寧にドラフトファイルを作成して下さい。)

@uri=https://www.anothersky.pw/test/2018-06-02-002.html
@title=テスト2018-06 02-002
@cdate=2018-06-17T15:31:18+09:00
@suffix=html
@blog_id=1
@entry_id=1

テスト2018-06 02-002

インデックスの生成

Hyper Estraierで検索を行う際は、事前に対象文書の情報を登録したインデックスを準備する必要があります。以下のコマンドを実行することでインデックスが作成できます。

estcmd gather -il ja test.index ./draft

-il jaは文字コードの指定、test.indexはインデックスのデータベース名です。

以下のような内容が表示されると、インデックスが正常に生成されています。出力にregisteredが見えるか、その左にあるドラフトファイルのパスが目的のファイルになっているかを確認しましょう。

estcmd: INFO: reading list from the directory: ./draft
estcmd: INFO: status: name=test.index dnum=0 wnum=0 fsiz=6899176 crnum=0 csiz=0 dknum=0
estcmd: INFO: 1 (/Users/[ユーザー名]/hyperestraier-1.4.13/draft/draft_test.est): registered
estcmd: INFO: 2 (/Users/[ユーザー名]/hyperestraier-1.4.13/draft/draft_test2.est): registered
estcmd: INFO: 3 (/Users/[ユーザー名]/hyperestraier-1.4.13/draft/draft_test3.est): registered
estcmd: INFO: 4 (/Users/[ユーザー名]/hyperestraier-1.4.13/draft/draft_test4.est): registered
estcmd: INFO: flushing index words: name=test.index dnum=4 wnum=1 fsiz=6901330 crnum=7 csiz=585 dknum=0
estcmd: INFO: closing: name=test.index dnum=4 wnum=8 fsiz=6901493 crnum=0 csiz=0 dknum=0
estcmd: INFO: finished successfully: elapsed time: 0h 0m 0s

検索の実行

estcmd searchで検索を実行します。公式サイトのユーザーガイドを見ながらひたすらコマンドを実行するのみです。「検索条件式」の項をじっくり読んで試しましょう。ヒットした場合、ヒットした数やURLが表示されます。

--------[02D18ACF123C0EEC]--------
VERSION 1.0
NODE    local
HIT 2
HINT#1  [UVSET] 4
TIME    0.001362
DOCNUM  4
WORDNUM 8
VIEW    URI

--------[02D18ACF123C0EEC]--------
2   https://www.anothersky.pw/test/2018-06-02-002.html
3   https://www.anothersky.pw/test/2018-06-02-003.html
--------[02D18ACF123C0EEC]--------:END

私の場合は「特定の期間に公開された記事の抽出」でしたので、以下のコマンドが正解であることが分かりました。-attrで属性インデックスの対象となる属性名とデータ型を指定しています。PowerCMSのマニュアルには記載がないものの公式サイトのユーザーガイドには記載のあるNUMBTが使えることが分かりました。-attrは複数指定ができるようです。

estcmd search -vu -attr "@cdate NUMBT 2018/06/24 2018/10/26" test.index

今回コマンドを実行してテストをしたことで、どのようにすると1日分の結果が出るのか(2018/10/25 2018/10/26とするのか? 2018/10/26 2018/10/26とするのか?)まで細かく調査ができました。

テンプレートへの落とし込み

どのような条件を与えれば目的の結果が得られるか分かれば、あとはそれをPowerCMSのテンプレート、もしくはクエリストリングへ落とし込むだけです。

私の場合は、テンプレートは以下のようになりました。add_attr="@cdate" add_condition="NUMBT"はコマンドを叩いてテストした結果を反映した条件指定です。set_order="@cdate" order_condition="NUMD"は検索結果の並び替えです。今回は検索クエリを使用しないため、no_query="1"も指定します。

<mt:EstraierResults no_query="1" set_order="@cdate" order_condition="NUMD" add_attr="@cdate" add_condition="NUMBT">

そして以下のようなURLを渡すとPowerSearchプラグインにおいても目的の検索結果が表示されました。

/apps/search?blog_id=10&target=10&limit=100&offset=1&@cdate=2018-9-1+2018-10-1&selected_category=2018年09月

ちなみにblog_idで指定されたウェブサイト/ブログにある「Hyper Estraier 検索結果」テンプレートを使用して、targetで指定したウェブサイト/ブログの検索結果を表示するというのもポイントでしょうか。これを上手く使えば内容と見た目の一部のみ違う検索テンプレートを上手くまとめることが可能です。selected_categoryのように、目的の表示を作るためだけに使う情報を送ることもできます。

まとめ

Hyper Estraierやestcmdについて理解を深めておくと、PowerSearchプラグイン(エンタープライズ検索)の利用がスムーズになると思います。テンプレートを作ったものの上手く表示されない時、サーバー上でestcmdを実行してみればインデックスに問題はないか等の調査ができるようになります。また、PowerCMS上で検索を実行するとテンプレート・プラグイン・Hyper Estraierが関係してきますが、コマンドラインだとHyper Estraierだけにターゲットを絞ることができ、答えを見つけやすくなることも期待できます。

コマンドの操作は苦手という方もいらっしゃるかもしれませんが、一度チャレンジしてHyper Estraierについて理解を深めてみてください。

お問い合わせ Contact

制作のご依頼、ご相談などは下記のフォームからご連絡ください。