曖昧検索

曖昧検索(ファジー検索)

検索語に完全一致しない単語も検索したい場合には曖昧検索(ファジー検索)を利用できます。タイプミスや表記ゆれ、つづり違いなどで完全一致しないドキュメントも拾いたい場合に有効です。曖昧検索は、検索語とインデックスに登録されている単語との違い(編集距離)が一定の範囲内であれば、その単語を一致とみなして検索する方法です。編集距離とは、ある単語を別の単語に変換するために必要な文字の挿入・削除・置換などの最小回数のことです。Fess では、既定でこれらの操作に加えて隣接する 2 文字の入れ替えも 1 回の違いとして数えるダメラウ・レーベンシュタイン距離(最適文字列アライメント)を使用します。

利用方法

曖昧検索を適用したい検索語の後に「~」を付加します。

たとえば、「Fess」という単語を曖昧検索したい場合、以下のように検索フォームに入力することで、「Fess」に近い語 (「Fes」など) を含むドキュメントを検索できます。

Fess~

「~」の後ろに数字を付けると、許容する編集距離 (何文字までの違いを許容するか) を指定できます。指定できる値は 0、1、2 のいずれかの整数です。

Fess~1

上記の場合は、「Fess」との編集距離が 1 以内の単語を検索します。

数字を省略して「~」のみを指定した場合は、編集距離 2 として扱われます。編集距離の最大値は 2 であり、3 以上の値を指定した場合も 2 として扱われます。

フィールドを指定して曖昧検索を行うこともできます。次の例では、title フィールドに「Fess」に近い語を含むドキュメントを検索します。

title:Fess~

フィールドを指定しない場合は、title および content フィールドを対象に曖昧検索を行います。

利用条件

曖昧検索を利用する際は以下の点に注意してください。

  • 曖昧検索は単語単位で適用されます。引用符で囲んだフレーズには適用できません。なお、フレーズの後ろに付けた数字 (たとえば "Fess Search"~2) は、曖昧検索ではなく単語間の距離を表す近接検索になります。

  • 曖昧検索はインデックスに登録された単語を対象に行われ、検索語は再解析されません。そのため、bi-gram や形態素解析でトークン化される日本語などのテキストでは期待どおりに動作しないことがあります。曖昧検索は主に英数字の単語で有効です。

  • 1〜2 文字などの非常に短い単語は、編集距離が単語の長さより小さくないと一致しないため、「~」を付けても完全一致に近い動作になる場合があります。

注釈

曖昧検索の動作は fess_config.properties で調整できます。

  • query.fuzzy.prefix_length (既定値: 0): 先頭から完全に一致させる文字数です。値を大きくすると、誤りを許容する範囲が狭くなります。

  • query.fuzzy.expansions (既定値: 50): 一致候補として展開する単語の最大数です。

  • query.fuzzy.transpositions (既定値: true): 隣接する 2 文字の入れ替えを 1 回の編集として数えるかどうかを指定します。true の場合はダメラウ・レーベンシュタイン距離、false の場合は古典的なレーベンシュタイン距離になります。

注釈

「~」を付けない通常の検索でも、Fess は一定の長さ以上 (既定では 4 文字以上) の検索語に対して、関連度を高める目的でわずかな重み付けの曖昧一致を自動的に補助として加えます (query.boost.fuzzy.*)。これは検索結果の順位付けを調整するための機能であり、「~」による曖昧検索とは別の仕組みです。

関連項目