Apache Lucene 検索構文¶
ここでは、 Apache Lucene の検索式の構文について説明します。Scheduler Index は内部で Lucene を使用するため、Scheduler Index を検索するには Lucene の構文を使用する必要があります。
項¶
クエリは項と演算子に分けられます。項には、単一語と語句の 2 種類があります。
単一語は 1 つの単語です (例: 「test」や「hello」)。
語句は、二重引用符で囲まれた単語のグループです (例: "hello world")。
複数の項をブール演算子で結合して、より複雑なクエリを構成できます (以下を参照)。
注釈
クエリ文字列内の語および語句に適用されるアナライザーは、インデックスの作成に使用したアナライザーです。そのため、クエリ文字列で使用されている語や語句に干渉しないアナライザーを選択することが重要です。
フィールド¶
検索の実行時、デフォルトフィールドは指定しても指定しなくてもかまいません。
たとえば、Lucene のインデックスに text
がデフォルトフィールドとして含まれているとします。この場合、text フィールドに「lucene」が含まれる、「Jakarta Project」というタイトルのドキュメントを検索する際には、以下の入力のどちらでも使用できます。
text:lucene
または
lucene
text
はデフォルトフィールドであるため、フィールドの指定は必須ではありません。
検索語の修飾子¶
Lucene では、クエリ語の修飾がサポートされており、広範な検索オプションが提供されています。
ワイルドカード検索 Lucene では、1 文字および複数文字のワイルドカード検索がサポートされています。
1 文字のワイルドカード検索を実行するには、
?
記号を使用します。複数文字のワイルドカード検索を実行するには、
*
記号を使用します。1 文字のワイルドカード検索では、「?」を任意の 1 文字に置き換えて、残りの指定文字に一致する語を検索します。たとえば、「text」または「test」を検索するには、次の検索を使用できます。
te?t
複数文字のワイルドカード検索では、「*」を 0 個以上の任意の文字に置き換えて、残りの指定文字に一致する語を検索します。たとえば、「test」、「tests」、または「tester」を検索するには、次の検索を使用できます。
test*
単語の中でワイルドカード検索を使用することもできます。
te*t
注釈
*
記号や?
記号を検索語の先頭文字として使用することはできません。あいまい検索
Lucene では、レーベンシュタイン距離 (編集距離) アルゴリズムに基づくあいまい検索がサポートされています。あいまい検索を実行するには、1 つの単語の末尾にチルダ (波形ダッシュ) 記号
~
を付けます。たとえば、スペルが「roam」と似ている語を検索するには、次のあいまい検索を使用します。roam~
この検索では、foam や roams のような語が検出されます。
追加 (オプション) のパラメータを使用して、必要な類似度を指定することもできます。値は 0 ~ 1 の範囲で指定します。1 に近い値ほど、より類似度の高い語にのみ一致します。次に例を示します。
roam~0.8
このパラメータを指定しないと、デフォルト値 0.5 が使用されます。
近接検索
Lucene では、特定の距離内にある複数の語の検索がサポートされています。近接検索を実行するには、語句の末尾にチルダ記号
~
を付けます。たとえば、ドキュメント内に 10 文字以内の間隔で存在する「apache」と「jakarta」を検索するには、次の検索を使用します。"jakarta apache"~10
範囲検索
範囲クエリでは、このクエリで指定した上限と下限の範囲内にあるフィールド値を含むドキュメントを検索することができます。範囲クエリでは、上限と下限を含めることも、除外することもできます。ソートは辞書順で行われます。
mod_date:[20020101 TO 20030101]
上記の検索では、mod_date フィールドの値が 20020101 から 20030101 (各値を含む) の範囲にあるドキュメントを検索します。なお、範囲クエリは日付フィールド専用ではありません。日付以外のフィールドにも使用できます。
title:{Aida TO Carmen}
上記の検索では、title の値が「Aida」から「Carmen」の間にあるすべてのドキュメント (ただし「Aida」と「Carmen」は含まない) を検索します。
上限と下限を含むクエリは角括弧で指定し、これらを含まないクエリは中括弧で指定します。
検索語のブースト
Lucene では、見つかった語に基づいて、一致ドキュメントの関連度が示されます。特定の検索語をブーストする (優先する) には、その語の末尾にキャレット文字
^
とブースト係数 (数値) を付けます。ブースト係数が高いほど、その語の関連性は高まります。ドキュメントの検索語をブーストすることによって、ドキュメントの関連性を制御できます。たとえば、次の検索を行うとします。
jakarta apache
この中で「jakarta」という語の関連性を高めたい場合は、この語の横に
^
記号とブースト係数を付けてブーストします。たとえば、次のように入力します。jakarta^4 apache
それにより、jakarta という語を含むドキュメントの関連性が引き上げられます。また、次の例のように語句をブーストすることもできます。
"jakarta apache"^4 "jakarta lucene"
デフォルトではブースト係数は 1 です。ブースト係数は正数でなければなりませんが、1 未満 (0.2 など) も指定できます。
ブール演算子¶
ブール演算子を使用すると、論理演算子によって複数の条件を結合することができます。Lucene では、ブール演算子として AND、+、OR、NOT、および - がサポートされています (ブール演算子はすべて大文字で表記する必要があります)。
OR
OR 演算子はデフォルトの結合演算子です。つまり、2 つの項の間にブール演算子がない場合は、OR 演算子が使用されます。OR 演算子は 2 つの項を結び付け、どちらかの項が含まれるドキュメントを、一致するドキュメントとして検索します。これは 2 つの集合の和集合と同等です。OR という単語の代わりに記号
||
を使用することもできます。「jakarta apache」または「jakarta」のみを含むドキュメントを検索するには、次のクエリを使用します。
"jakarta apache" jakarta
または
"jakarta apache" OR jakarta
AND
AND 演算子は、1 つのドキュメントのテキスト内に両方の項が存在するドキュメントを検索します。これは 2 つの集合の論理積と同等です。AND という単語の代わりに記号
&&
を使用することもできます。「jakarta apache」と「jakarta lucene」の両方を含むドキュメントを検索するには、次のクエリを使用します。
"jakarta apache" AND "jakarta lucene"
+
「+」 (必要) 演算子は、「+」記号の後の項が 1 つのドキュメントのフィールドのどこかに存在しなければならないことを表します。
「jakarta」を必ず含み、「lucene」を含んでいても含んでいなくてもよいドキュメントを検索するには、次のクエリを使用します。
+jakarta apache
NOT
NOT 演算子は、NOT の後の項を含むドキュメントを除外します。これは 2 つの集合の差分と同等です。NOT という単語の代わりに記号
!
を使用することもできます。「jakarta apache」を含み、「jakarta lucene」は含まないドキュメントを検索するには、次のクエリを使用します。
"jakarta apache" NOT "jakarta lucene"
注釈
NOT 演算子は単項で使用することはできません。たとえば、次の検索は結果を返しません。
NOT "jakarta apache"
-
「-」 (禁止) 演算子は、
-
記号の後の項を含むドキュメントを除外します。「jakarta apache」を含み、「jakarta lucene」は含まないドキュメントを検索するには、次のクエリを使用します。
"jakarta apache" -"jakarta lucene"
グループ化¶
Lucene では、括弧を使用して複数の句をグループ化し、サブクエリを構成することができます。これは、クエリのブールロジックを制御したい場合に非常に便利です。
「jakarta」または「apache」を含み、かつ「Web」を含むものを検索するには、次のクエリを使用します。
(jakarta OR apache) AND Web
これにより、混乱を避け、「Web」が必ず存在しなければならないことと、「jakarta」と「apache」についてはどちらかが存在すればよいことを確実に指定できます。
フィールドへのグループ化¶
Lucene では、括弧を使用して、複数の句を単一のフィールドにグループ化することができます。
「return」という単語と「pink panther」という語句の両方を含むタイトルを検索するには、次のクエリを使用します。
title:(+return +"pink panther")
特殊文字のエスケープ¶
Lucene では、クエリ構文に含まれている特殊文字のエスケープがサポートされています。現在、以下の文字が特殊文字として使用されています。
+ - && \|\| ! ( ) { } [ ] ^ " ~ \* ? : \\
これらの文字をエスケープするには、その文字の前に \
を付加します。たとえば、 (1+1):2
を検索するには、次のクエリを使用します。
\(1\+1\)\:2