Solr で検索位置 (Offset) を出力する
全文検索エンジン Solr の検索結果に検索ワードの出現位置を含ませたいと思ったことはないでしょうか?
結論から言うと、これを実現するには query をどんなにいじっても無理です。
出現位置を出力させるには次の方法があります。
- 手元で再検索する
- Plugin を作成して、Formatter を指定する
- Term Vector Component を使って算出する
- あきらめる
ここでは2を選択します。
Plugin を作る
標準の機能として query に hl パラメータを渡してやることで、ヒットした前後にタグを挿入することができます。
この機能は SimpleHTMLFormatter によって実現されていますが、これを自前で実装してタグ中に開始オフセットと終了オフセットを出力させます。
自前の Plugin を実装するのは大変に感じるかもしれませんが、意外と簡単でした。
まず次の二つのクラスを実装します。
- Formatter を実装したクラス
- HighlightingPluginBase を継承し、SolrFormatter を実装したクラス
継承元となる各クラスは次の jar に格納されています。
これらの jar は配布されている solr 内にあります。
- solr-core-*.jar
- solr-solrj-*.jar
- lucene-highlighter-*.jar
Formatter の実装
lucene の SimpleHTMLFormatter を参考に Formatter を実装したクラスを作成します。
このインターフェースは次のメソッドのみなのでそれほど難しくありません。
highlightTerm
引数の originalText はヒットした文字列ではないことに注意してください。
第二引数の TokenGroup の getTotalScore の値が0以下の場合は無視したほうが良いです。
この TokenGroup の次の二つの値がそのままほしい開始/終了位置のオフセットです。
- getStartOffset
- getEndOffset
この情報を originalText を挟む形で文字列を組み立てます。
SolrFormatter の実装
こちらは Solr の HtmlFormatter の実装を参考に次の二つのメソッドを実装します。
getFormatter
実装した Formatter クラスのインスタンスを返すだけす。
getDescription
このクラスの名前を開始ます。
実装した Plugin を Solr で使用する
Plugin を Solr に使用するには次の手順で Solr に読み込ませてやります。
- jar 作成し、配置する
- solrconf.xml を編集する
- hl パラメーターで指定する
jar の作成と配置
- 各クラスを jar にまとめる
- exmple/solr に lib ディレクトリを作成する
- lib に作成した jar を配置する
solrconf.xml の編集
searchComponent の highlighing 要素内に次の要素を追加します。
<formatter name="(hl.formatterで指定する名前)" class="(実装した SolrFormatter のクラスパス)" />
hl パラメーターの指定
solrconfl.xml を編集したら solr を再起動して jar と solrconf.xml を読み込ませてやります。
再起動が完了したら、クエリに次のパラメーターを追加します。
これでレスポンスの中に、オフセットが埋め込まれていると思います。