Fessで"word1 word2"~Nという近接検索の指定を、実際の検索クエリに反映するようにしました。フレーズの間に別の単語が入っていても探せるため、完全一致では取りこぼしてしまう文書を見つける際に役立ちます。
フレーズ検索との違い
通常のフレーズ検索は、解析後の単語が連続する条件で検索します。
"quick fox"
近接検索では、フレーズの後ろに~と数値を付けます。
"quick fox"~1
例えば単純に単語ごとの位置が付く場合、quick brown foxのように間に1語入った文も対象になります。タイトルなどフィールドを指定した検索にも使えます。
title:"quick fox"~2
従来はパーサーが距離の値を保持していても、検索エンジンへ渡すmatch_phraseクエリに反映していませんでした。今回、通常フィールド、指定フィールド、未知のフィールドからのフォールバックに距離を渡し、ハイライトのクエリにも反映します。
距離は文字数ではない
Nが数えるのは、フィールドのアナライザーが生成したトークンの位置です。英語ではおおむね単語間の距離になりますが、除去されたストップワードも位置を占めます。単語の順序を入れ替えた一致にも距離が必要です。
日本語では、一般のタイトル・本文フィールドでCJK bigram、言語別フィールドで形態素解析を使うなど、解析方法によって距離の意味が変わります。単純に「N文字以内」と読み替えることはできません。
"全文 検索"~5
"大阪 おいしい"~10
日本語で複数の語の近さを指定する場合も、語を空白で区切ります。つなげた文字列を指定すると、意図した単語間の近接検索にならない場合があります。少し広めの距離から始め、実際の結果を見ながら絞り込んでください。
どんな検索に向いているか
「運用」と「手順」のように関係する語が同じ箇所に現れる文書を探したいときに使えます。AND検索では離れた場所にある語も一致し、完全なフレーズ検索では間に語が入った文書を落としてしまうので、その中間の条件として利用できます。
近接検索の説明ページもFess 15.9のドキュメントに追加しました。実際のアナライザーによる違いを踏まえて距離を調整するのがポイントです。