Luceneのサーチ原理（一）

このシリーズは、Luceneのサーチに関して紹介する。Luceneは数十のサーチを提供しているが、コアロジックは同じである。今回は、QueryのサブクラスBooleanQueryを紹介しようと思う。
## サーチ方式
以下はよく使われるサーチ方式である：
● TermQuery
● BooleanQuery
● WildcardQuery
● PrefixQuery
● FuzzyQuery
● RegexpQuery
## TermQuery
図1：
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648622/9414a800-ffb8-4839-6cda-973893b6a3ac.png)
図1のTermQueryには、FieldNameはcontent、バリュー（FieldValue）はaを含むファイルを探す。
## BooleanQuery
図2：
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648622/12a45b31-f7fa-1c41-03c3-411f0af17a0e.png)
BooleanQueryは多数のサーチを組むサーチである。図２では、多数のTermQueryを組むサーチである。希望のファイルは最低２つのTermQueryには一つが満たされる。同時に２つのTermQueryも満たされたら、スコアが高くなる。
## WildcardQuery
Luceneでは、２つのWildcardができる
```
 public static final char WILDCARD_STRING = '*';   
 public static final char WILDCARD_CHAR = '?';   
 public static final char WILDCARD_ESCAPE = '\\';
```
*はゼロや多数の文字を意味する。?は一つの文字を意味する。\\はそのまま文字をとして使われる。
図3：![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648622/99b9dbb7-2992-7a6e-9557-b3460d46c6cc.png)

？を使うサーチ：
図4：![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648622/4e9b1e36-ed1c-6ad9-2dfa-8c086a7e2498.png)
  
図4のサーチにより、ファイル３とファイル１が結果として出る。
\\を使うサーチ：
図5：![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648622/08132b5c-e51b-07ff-722d-91b95e47a102.png)

図4のサーチにより、ファイル０とファイル１とファイル２とファイル３が結果として出る。
*を使うサーチ：
図6：![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648622/fa977a32-07b8-3ed7-8e63-f36a1fb3339b.png)

图4のサーチにより、ファイル３が結果として出る。
## PrefixQuery
図7：![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648622/988f66a3-eda8-0899-ca3a-13db92d11038.png)

図7のPrefixQueryは、FieldNameはcontent、バリュー（FieldValue）のプレフィックスバリューはgoであるファイルを探す。
図3の例にすると、図７はファイル０とファイル１が結果として出る。
## FuzzyQuery
FuzzyQueryは編集距離を使って近似文字列照合を実現する。以下のサーチは図３を例とする。
図8：![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648622/702e23c4-366e-44a3-445a-3e021a0d2a90.png)

図8の各パラメータを紹介する：
● maxEdits：編集距離の最大値
● prefixLength：近似文字列照合によるtermは、最低図８のgodと比べて２つの同じなプレフィックスバリュー、即ちgo。
● maxExpansions：maxEidtsとprefixLengthが満たされた場合、処理できるtermの最大数。
● transpositions：有限オートマトンに関するもの、今回は紹介しないにする。
図8にはファイル０とファイル１が結果として出る。
図9：![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648622/0ca21aee-d842-ef03-0621-0cdde4179e39.png)

図9は図8のコンストラクタファンクションを使い、maxExpansionsとtranspositionsはデフォルトバリューにセットされる。
maxExpansions：デフォルトバリューは50
● transpositions：デフォルトバリューはtrue
図9にはファイル０とファイル１が結果として出る。
図10：![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648622/0abbb88e-4e4f-8d64-bdc9-7c0d1f3f0586.png)

図10は図8のコンストラクタファンクションを使い、prefixLengthとmaxExpansionsとtranspositionsはデフォルトバリューにセットされる。
prefixLength：デフォルトバリューは0
● maxExpansions：デフォルトバリューは50
● transpositions：デフォルトバリューはtrue
図10にはファイル０とファイル１とファイル２とファイル３が結果として出る。
図11：![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648622/878dc1a1-1a4c-4752-b07d-9fdc246b59fe.png)

図11は図8のコンストラクタファンクションを使い、maxEditsとmaxEprefixLengthとmaxExpansionsとtranspositionsはデフォルトバリューにセットされる。
● maxEdits：デフォルトバリューは2
● prefixLength：デフォルトバリューは0
● maxExpansions：デフォルトバリューは50
● transpositions：デフォルトバリューはtrue
図11にはファイル０とファイル１とファイル２とファイル３が結果として出る。
## RegexpQuery
regを使うサーチである。
図12：![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648622/8d2e1f98-8bd9-34d9-4a9d-2598d6db6843.png)

図12のRegexpQueryは、FieldNameはcontentで、FieldValueはgをスタートとして、dをエンドとして、真ん中はゼロや幾つのoを含むファイルを探す。
図12にはファイル０とファイル１とファイル２が結果として出る。