miauのブログ

はてなダイアリー「miauの避難所」をはてなブログに移行しました

Solrのフレーズ検索についてちょっとメモ

最近 Apache Solr を触ってます。基本的に

この本を読めば基本的なところはわかるのですが、フレーズ検索のところだけわかりづらかったので、ちょっとメモしておきます。


この本の p82〜p83 に検索式の記述方法が載っていて、フレーズ検索の説明は

検索式の例
title:"Webプログラミング"
説明
2つ以上の単語の出現順序を保証した検索

となっています。出現順序を保証するということは、"Webプログラミング" で検索する例だと「Webプログラミング」や「Webアプリケーションプログラミング」にはヒットするけど「プログラミングWeb」にはヒットしないということだと理解していました。

じゃあ厳密に「Webプログラミング」の単語を含む場合だけヒットさせたい場合はどうするんだろう?と調べてみると「フレーズ検索を使え」という情報が出てきて、ちょっと混乱してきました。それなら本にも「2つ以上の単語が連続して出現することを保証した検索」とか説明が書いてそうなものだけど。

図書館で Apache Lucene 入門 ~Java・オープンソース・全文検索システムの構築 を借りていたので、こっちの説明も見てみます。
p171

Luceneは「フレーズ検索」をサポートする。フレーズ検索というのは,次のようにダブルクオーテーションで2語以上からなる検索質問語をくくって,指定された語が連続して現れるドキュメントを検索するように指示できる機能のことだ:

"Java プログラミング"

あれ?やっぱり連続する部分を検索するの?

・・・と思ったけど。p190 より。

Luceneのフレーズ検索では,フレーズを構成する語は互いに離れていてもよい。1つのフレーズとみなせる語と語の最大距離をslopと呼び,PhraseQueryのsetSlop()メソッドでフレーズ検索時に許容するslopを設定する。デフォルトのslopは0であり,その場合は,PhraseQueryにadd()メソッドで追加した語が追加した順番に隙間なは現れている Documentが検索される。

slopを1以上にすれば連続してなくても検索できるそうで。Solr でもそういう指定が可能なのかはわからないですが、確かにそれなら「出現順序を保証した検索」という説明で正しいみたいです。ちょっとわかりにくいですけどね。

ということで、Apache Lucene 入門を返却する前にメモでした。この本は Solr を使う上では知らなくていい情報も多いのですが、上記のように個々の説明が詳しかったり、スコアの計算がどんな感じになっているか書いてあったりで、参考になりました。