最近PowerCMSに付属の「PowerSearchプラグイン(エンタープライズ検索)」を使用し、指定の期間に公開された記事を抽出して表示する機能の実装を行いました。その際、どのようなクエリストリング・テンプレートにすれば良いのか、マニュアルを読んでもなかなか答えにたどり着くことができませんでした。
そもそも、PowerSearchはインデックス型の検索エンジンである「Hyper Estraier」を利用したシステムです。そこで、Hyper Estraierを自分のマシンであるMacにインストールし、コアであるHyper Estraierについての理解を深めることにしました。
インストール方法
- 公式サイトからパッケージをダウンロードし、展開します。
- ターミナルを開いて1.で展開したディレクトリに移動し、
./configure
を実行してビルド環境を設定します。 make mac
を実行し、プログラムをビルドします。make install-mac
を実行し、プログラムをインストールします。
Macの場合はmake mac
・make 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について理解を深めてみてください。