スタッフブログ 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について理解を深めてみてください。

今年も残り2ヶ月を切りました。

1年があっという間です。
今年も残り少なくなって来たので来年用の卓上カレンダーを購入しました。


個人的に、ものすごく癒されるので3年連続同じシリーズを使っています。
芝生や動物たちのパーツが立体的になっていてまるで絵本のようです。

夏の間は災害の影響等もあって滞り気味だった業務の方も年末らしさがでてきました。
本当にありがたいことです。

なお、年内は29日が土曜日のため、カレンダー通り28日(金)までの営業予定です。

12月は決算・年末調整と事務作業も入ってきますが、良い新年を迎えられるよう引き続き頑張ります。

文字参照を使用するとCMSからの出力値がエスケープしにくい

最近の出来事ですので角が立ってはいけないのですが、安全なWebサイトを構築する上で重要なことですのでまとめておきたいと思います。

徳丸先生の『体系的に学ぶ 安全なWebアプリケーションの作り方 第2版』の4.3節「表示処理に伴う問題」にも書かれていますし、アルファサード社の野田さんもよく言われていますが、Webアプリケーション(CMS)でHTMLを生成する時はエスケープ処理を行うことが重要です。PowerCMSやMovable Typeだと<mt:Entry escape="html" />のように必ずescape="html"(もしくはencode_html="1")を付けてエスケープ処理を行います。WordPressだとesc_html()を書きますね。

ただ、出力値に「文字参照(数値文字参照・文字実体参照)」が含まれると困ったことが起こります。例えばタイトル欄に&reg;と入力されている時、<mt:Entry escape="html" />で出力すると&amp;reg;のように表示されてしまうからです。これがきっかけでescape="html"をやめようか、という話になってしまうのです。

どのようにするのが良いのか?

実は話は単純で、文字コードにUnicodeを利用している環境においては、そもそも文字参照を利用しなくても良いという事実があります。『Google HTML/CSS Style Guide』の「3.1.6 Entity References」にも「Do not use entity references.」とあります。

また、PowerCMSやMovable Typeに「®」の文字を入力して保存してみたのですが、問題なく保存・出力されます。

昔からWeb制作に携わっている方は長年の習慣で文字参照を使ってしまいがちですが(私もつい書いてしまうことがあります...)、キーボード入力やIMEの文字パレットなどを使い目的の文字をそのまま入力するようにしましょう。そうすればテンプレート職人は何のためらいもなく値のエスケープができる(escape="html"が利用できる)のです。

CSVインポートには注意が必要

PowerCMSにはCSVインポート・エクスポート機能が備わっていますが、CSVを利用する際には文字化けに注意が必要です。ExcelもUTF-8に対応しているのですが、どうもBOM付でないと文字化けするようです。PowerCMSからUTF-8でエクスポートしたCSVにnkf --overwrite --oc=UTF-8-BOM [ファイル名]でBOM付きにすると文字化けすることなく開くことができました。このようなこともあって無難に扱えるShift JISを使うこともありますが、Shift JISですと「®」の文字は利用することができません。&reg;と書いてインポートした後に「®」に置換するのが良いかなと考えています。

おまけ...esape="html"とescape="url"

Movable Typeにおいて、escape="html"escape="url"のどちらを使うかも整理しておきたいと思います。

通常のテキストや属性値などにはescape="html"を利用して< > " ' &をエスケープします。URLだからといってescape="url"を使うとおかしくなります。属性値はダブルクォートで囲みます。ちなみにWordPressの場合、a要素のhref属性はesc_url()を使用してエスケープします。複数のCMSを扱う方はそれぞれのCMSの仕様を正しく把握しましょう。

<h1><mt:EntryTitle escape="html" /></h1>
<a href="<mt:EntryPermalink escape="html" />">

クエリストリングに記事タイトルを付ける等の場合はescape="url"を使い、アルファベット以外の文字を16進数ベースの%xx形式に変換します。(URLエンコード)

<a href="https://example.com/?q=<mt:EntryTitle escape="url" />">

ただ、お客様など詳しくない方はファイル名を日本語にされている場合があってどうしたものか...、と思います。

初心者向けプログラミング学習アプリ「Progate」

初心者向けのプログラミング学習アプリ「Progate」。

SNSで見かけて気になったので使ってみました。

まだHTML & CSS初級編の2レッスンしかやっていませんが、ゲーム感覚で勉強できて、解説もわかりやすいです。

私はこれまで本等で何度か勉強しようとして、なんとなく知識だけは持っているものの、いざ実践!となるとできない状態だったので、実際にやりながら(最初はカンタンな穴埋めから)学べるのはとても良いです。

正解するまで先に進めないのですが、すぐにヒントも見ることができるのでストレスもたまりにくい気がします。

まだほんの初歩段階だからかもしれませんが^^;

スマホアプリなので空き時間ができた時などにすぐ使えるのも良いです。

私はデザインまでしか担当していないのですが(社内に優秀なエンジニアが3人いるので出番もないのですが)、プログラミングのことも知っておくとお客様との話もスムーズですし、プロジェクトが効率的に進みますよね。

と思ってこれまで何度かチャレンジしては挫折してきたので・・・気長にやってみようと思います。

年々勉強は苦痛なものになってきているので、「楽しい」と感じながら学べるのはすごく大事だな、と思いました。

無料から始められるので敷居も低いですね。

UI開発者の夏休み

顧客企業様のご理解・ご協力も賜りまして、今年は土・日も含め6日間の夏季休暇を頂きました。普段仕事をしていると勤務時間以外にもつい考え事をしたり、「こんなコードにすると上手くいくかな?」などと実験をしたりしがちなので、休みの間は仕事のことを忘れリフレッシュの時間に充てました。

8月15日には「福山夏まつり あしだ川花火大会」へと出かけました。写真を撮ることが趣味ですので一眼レフカメラに三脚を携え、2回目のあしだ川花火大会の撮影にチャレンジしたのです。今年は開始直前に雨が降り少々大変でしたが、昨年よりも見栄えの良い写真を撮ることができたように思います。

「黒いうちわ」で多重露光をしてみようと考えていたのですが雨降りで操作が大変でしたので、ソフトウェアで擬似的な多重露光の作品に仕上げてみました。カラフルな花火の美しさをお届けできたら、と思います。
写真:あしだ川花火大会で打ち上げられたカラフルな花火

撮影した写真はInstagramなどのSNSでもシェアしています。福山をはじめ私が訪ねた土地の美しい風景を少しでも多くの人に届け、仕事以外でも地元に貢献できたらなと考えているこの頃です。

仕事を離れ一市民としてWebを閲覧してみて気付く点もありました。

  • マッサージの空き状況を確認しながら予約できるのは便利だな
  • 今日の天候で花火大会が開催されるか知りたいけれど、サイトが混雑してつながらないな
  • 道の駅の公式Webページを見たいのだけれど、検索しても結果に出てこないような気がする
  • 腱鞘炎のような症状があるので診察をしてもらいたいのだけれど、いつまでお盆の休診なのだろう
  • ページの内容を早く見たいのだけれど、毎回アニメーションがあり見えるまでに時間がかかるな

こうした経験はこれからの業務にも役立てていけたらなと感じました。

2018年も2/3が過ぎようとしています。休暇で蓄えたパワーを基に、残りの1/3の日々も頑張っていきたいと思います。

お問い合わせ Contact

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