このシリーズは、Luceneのサーチに関して紹介する。Luceneは数十のサーチを提供しているが、コアロジックは同じである。今回は、QueryのサブクラスBooleanQueryを紹介しようと思う。
サーチ方式
以下はよく使われるサーチ方式である:
● TermQuery
● BooleanQuery
● WildcardQuery
● PrefixQuery
● FuzzyQuery
● RegexpQuery
TermQuery
図1:
図1のTermQueryには、FieldNameはcontent、バリュー(FieldValue)はaを含むファイルを探す。
BooleanQuery
図2:
BooleanQueryは多数のサーチを組むサーチである。図2では、多数のTermQueryを組むサーチである。希望のファイルは最低2つのTermQueryには一つが満たされる。同時に2つのTermQueryも満たされたら、スコアが高くなる。
WildcardQuery
Luceneでは、2つのWildcardができる
public static final char WILDCARD_STRING = '*';
public static final char WILDCARD_CHAR = '?';
public static final char WILDCARD_ESCAPE = '\\';
*はゼロや多数の文字を意味する。?は一つの文字を意味する。\はそのまま文字をとして使われる。
図3:
?を使うサーチ:
図4:
図4のサーチにより、ファイル3とファイル1が結果として出る。
\を使うサーチ:
図5:
図4のサーチにより、ファイル0とファイル1とファイル2とファイル3が結果として出る。
*を使うサーチ:
図6:
图4のサーチにより、ファイル3が結果として出る。
PrefixQuery
図7のPrefixQueryは、FieldNameはcontent、バリュー(FieldValue)のプレフィックスバリューはgoであるファイルを探す。
図3の例にすると、図7はファイル0とファイル1が結果として出る。
FuzzyQuery
FuzzyQueryは編集距離を使って近似文字列照合を実現する。以下のサーチは図3を例とする。
図8:
図8の各パラメータを紹介する:
● maxEdits:編集距離の最大値
● prefixLength:近似文字列照合によるtermは、最低図8のgodと比べて2つの同じなプレフィックスバリュー、即ちgo。
● maxExpansions:maxEidtsとprefixLengthが満たされた場合、処理できるtermの最大数。
● transpositions:有限オートマトンに関するもの、今回は紹介しないにする。
図8にはファイル0とファイル1が結果として出る。
図9:
図9は図8のコンストラクタファンクションを使い、maxExpansionsとtranspositionsはデフォルトバリューにセットされる。
maxExpansions:デフォルトバリューは50
● transpositions:デフォルトバリューはtrue
図9にはファイル0とファイル1が結果として出る。
図10:
図10は図8のコンストラクタファンクションを使い、prefixLengthとmaxExpansionsとtranspositionsはデフォルトバリューにセットされる。
prefixLength:デフォルトバリューは0
● maxExpansions:デフォルトバリューは50
● transpositions:デフォルトバリューはtrue
図10にはファイル0とファイル1とファイル2とファイル3が結果として出る。
図11:
図11は図8のコンストラクタファンクションを使い、maxEditsとmaxEprefixLengthとmaxExpansionsとtranspositionsはデフォルトバリューにセットされる。
● maxEdits:デフォルトバリューは2
● prefixLength:デフォルトバリューは0
● maxExpansions:デフォルトバリューは50
● transpositions:デフォルトバリューはtrue
図11にはファイル0とファイル1とファイル2とファイル3が結果として出る。
RegexpQuery
図12のRegexpQueryは、FieldNameはcontentで、FieldValueはgをスタートとして、dをエンドとして、真ん中はゼロや幾つのoを含むファイルを探す。
図12にはファイル0とファイル1とファイル2が結果として出る。