2018年から2019年へ

こんにちわ。
リエです。
 
2018年も残りわずかとなりました。
2019年は平成が終わり新しい元号が始まる年になりますね。
現段階では新元号は決まっていませんが、どんな元号になるのでしょうか。
 
2019年は亥年。
干支の中で最後の12番目に位置します。
植物の成長としては葉っぱも花も散ってしまい、種に生命を引き継いだ状態が「亥」だそうです。
十二支にはそれぞれ季節が割り当てられていて、亥は冬。
春の芽吹きまでじっとエネルギーを内にためているイメージが亥の意味です。
亥でエネルギーをしっかりとためると、それは「核」となり春には開花します。
なので弊社もしっかりとさらなる地盤作りに努めたいと思います。
参考サイト:https://mshabit.info/2019_eto/
 
2018年も弊社に関わってくださった皆さま。
本当にありがとうございました。
 
来年も何卒よろしくお願いいたします。

PDF をページ単位でインデックスする Solr の RequestHandlerを作成する

はじめに

Solr 6以降では PDF やワードなどのバイナリファイルをインデックスする機能(ExtractingRequstHandler)がサポートされています。
ファイル内に含まれるテキストをまとめて1つの文書として、メタデータ(作成日時、作成者等)と共にインデックスを作成してくれるのでこれはとても便利な機能ではありますが、用途によってはキーワードが何ページ目にヒットするのかを知りたいこともあります。そこで、自前の RequestHandler 作成の練習として PDF をページ単位でインデックスする ReqestHandler を作成してみました。

Apache Tika

Solr では PDF 等の各種フォーマットを扱うために Apache Tika を利用しています。
Tika では PDF 等を XHTML に変換した上で SAX パーサーにコンテンツハンドラを渡して XHML の要素毎の処理を実行させられます。それと同時にファイルに含まれるメタデータが Metadata クラスのオブジェクトに格納されます。
従って、Tika の呼び出し側は

  • ファイルに含まれる構造化コンテンツが XHTML に変換されたもの
  • ファイルのメタデータ

を扱うことができます。

Tika によって PDF から変換された XHTML がどんなフォーマットになっているかは、extractOnly=true オプションを指定することで見ることができます。

bin/post -c test -params "extractOnly=true&wt=json&indent=true" -out yes /tmp/test.pdf

XHTML の body 部分だけを抜粋すると以下のようになっています。

<body>
<div class="page">
<p/>
<p>テストドキュメント1ページ目です。</p>
<p/>
</div>
<div class="page">
<p/>
<p>2ページ目の文章です。</p>
<p/>
</div>
<div class="page">
<p/>
<p>これは3ページ目です。</p>
<p/>
</div>
</body>
</html>

ページ毎に

<div class="page">

に囲まれた構造になっていることが分かります。

ExtractingRequestHandler には capture という実行時パラメータがあり、これを指定することで特定の XHTML 要素(この場合div)を個別にインデックスすることができるのですが

  • 文書IDはファイル全体で共通
  • 同じ名前の要素が複数存在する場合は multivalued のフィールドに入れられる

という仕様のためページ番号との紐付けができそうもなかったのが、今回自前で実装してみようと思ったきっかけでした。

SolrがPDFを扱う仕組み

ExtractingRequestHander では以下のクラス構成で PDF 等のインデックス処理を実行しています。

  • ExtractingRequestHander
    リクエストのエントリポイント(/solr/update/extract)。

    • 設定の読み込み
    • Tika のパーサーが生成する SAX イベントを処理するコンテンツハンドラ(SolrContentHandler)用のファクトリ(SolrContentHandlerFactory)を生成
    • ExtractingDocumentLoader を生成して load メソッド(ファイル読み込みとインデックス処理のメイン)を実行
  • ExtractingDocumentLoader
    実際にファイルを読み込んでインデックス処理を実行。

    • メタデータ読み込み
    • コンテンツの種類に対応したパーサーを生成
    • ExtractingRequestHander から与えられたファクトリ(SolrContentHandlerFactory)を使ってコンテンツハンドラ(SolrContentHandler)オブジェクトを生成
    • パーサーにコンテンツハンドラ(SolrContentHandler)を与えてパース処理を実行
    • 生成されたメタデータオブジェクトとコンテンツ文字列をインデックスに投入
  • SolrContentHandler
    Tika のパーサーが生成する SAX イベントを処理する。
    基本的に XHTML に含まれるコンテンツ部分の文字列を結合して1つの大きな文字列を作っている。
  • SolrContentHandlerFactory
    SolrContentHandler のファクトリメソッドを提供する。

ページ単位のインデックス処理を実装

上記の4クラスをそれぞれ継承したクラスを実装しました。(コードはこの記事の最後に)
実装の内容は以下の通りです。

  • 設定の読み込みは親クラスに任せる
  • 具象クラスの生成処理は上書き
  • SolrContentHandler のサブクラスで
    <div class="page">
    

    を認識してページ番号とページ毎のコンテンツとが対応付けされたテーブルを作成

  • ExtractingDocumentLoader のサブクラスでページ毎に文書IDを振ってインデックス投入

利用方法

  1. 4クラスをコンパイルして Jar ファイルを生成
  2. contrib/extraction/lib に Jar ファイルをコピー
  3. solrconfig.xml の
    <requestHandler name="/update/extract"
                      startup="lazy"
                      class="solr.extraction.ExtractingRequestHandler" >
    

    の箇所を jp.co.splout.solr.plugin.MyExtractingRequestHandler に変更

  4. Solr 再起動

実行例

投入

$ bin/post -c test -params "extractOnly=false&wt=json&indent=true&literal.id=testpdf1" -out yes test.pdf

検索結果

最後に

PDF をページ単位でインデックスする Solr のプラグインを作成しました。
PoC ということで最小限の実装しかしていませんが、ちゃんとするなら

  • せっかくなのでメタデータも有効に使いたい
  • ExtractingRequestHandler の実行時パラメータで共用できるものは共用したい
  • もっというなら ExtractingRequestHandler の1機能として統合?

ということも考えたいと思います。

コード

仕事で使うメールアドレスにフリーメール・・・?

最近プライベートで名刺をいただく機会が増え、もやもやしていることがあります。
仕事で使っているはずのメールアドレスにフリーメールのアドレスがそのまま使われている・・・
ドメインを取得し、ホームページをもっている企業でもフリーメールのアドレスがそのまま使われている・・・
こんな事が結構な頻度であります。

もったいない・・・!

歳をとって細かいことが気になるオッサンになったからかもしれないですが、凄く気になる。

例えば何も情報がない状態で以下の2パターンのメールアドレスだとどちらが信頼できそうでしょうか?
・sploutgames@gmail.com
・games@splout.co.jp
一概には言えないですが、私はフリーメール=誰でも自由に使い捨てアドレスが取得できる。という観点から後者の企業ドメイン(games@splout.co.jp)のほうが信頼できそうな気がしてしまいます。

例としてGmailを挙げましたが、Gmail自体はセキュリティにも優れた素晴らしいものです。
逆に企業ドメインのアドレスについては適当に設定されたメールサーバで稼働するセキュリティの低いものの可能性だってあります。

ただ、それでも企業として利用するメールアドレスにフリーメールアドレスをそのまま使うのは違うと思ってしまうのです。

そこで是非ともおすすめしたいのがG Suiteです。
G SuiteはGoogleが提供する様々なツールを、1つのパッケージで全て利用できるサービスです。
これにはGmailも含まれており、企業ドメインを使用したメールアドレスが利用可能になります。
G Suiteについてもう少し詳しい内容が次の記事にあります。
https://blog.splout.co.jp/2150/

導入はもちろん、導入のご相談からサポートまで一貫したお手伝いをさせていただいております。
この機会にG Suiteの導入をご検討されてみてはいかがでしょうか?
お気軽にご相談ください。

お問い合わせ

人間の集中力の時間

こんにちわ。
リエです。
 
最近勉強したい分野ができたので隙間時間で勉強をしたいと考えています。
やはり社会人になってからの勉強で1番のハードルとなるのが、「勉強時間の確保」ですよね。

 
学生のころは本分が勉強だったので、毎日学校に行って90分授業を4コマ、5コマ受けていたわけですが、今はそんなに勉強時間を確保できません。
 
平日はお仕事が終わってからの勉強となるので、睡眠時間を考えると勉強に時間を取れるのは1・2時間。
なるべく効率よく勉強したい!ということで、人間の集中力の時間について調べてみました。
 
よく人間が本気で集中できるのは15分ぐらいと聞きますよね。
脳科学的にみて15分という時間は集中力を最も高めることができる時間の単位とのこと。
15分の次に普通に集中できるのが30分で続いて45分、長くても90分が限界だそうです。
 
確かに時間が経つにつれて他のことが気になったりして集中力は弱まりますよね。
15分刻みの間に5分休憩をいれて勉強や読書をしたほうがより高い集中力を保てるそうです。
参考サイト
https://www.buzzgeekmagazine.com/human-shuchuryoku/
 
うまく休憩をいれつつ集中力を保ったまま勉強したいと思います。
 
ノートに書きながら勉強しているのですが、最近パソコンやスマホばかり使い字を書くことが少なくなったので、自分の字が本当に下手になっていて泣けます。(元々そんなに字がうまいわけではありませんが。。)
 
たまには字を書かなきゃですね。
字がきれいな人に憧れるので、ペン字習字もしようかな〜。