本家ドキュメント:http://lucene.apache.org/java/2_3_2/queryparsersyntax.html
目次
* Overview
* Terms
* Fields
* Term Modifiers
o Wildcard Searches
o Fuzzy Searches
o Proximity Searches
o Range Searches
o Boosting a Term
* Boolean Operators
o
o AND
o +
o NOT
o -
* Grouping
* Field Grouping
* Escaping Special Characters
■Overvier
LuceneはAPIで検索機能を提供している。Query Parserを通じて豊富な検索機能を実現している。
このページは、Lucene-1.9のQuery Parserの構文について説明する。
#古いな・・・・
Luceneが期待する挙動を示さない場合は、あなたが使用しているバージョンで分配されたdocs/queryparsersyntax.htmlを参照してください。
1.QueryParserに問い合わせるクエリをプログラムで生成している場合は、直接LuceneAPIに問い合わせたほうがいい。というのも、QueryParserは機械的に生成された文字列を解析するというよりは、人間が作成した文字列を解析するように作られているから
2.トークナイズ化(分かち書き)されたいないフィールドは、QueryParserを経由しなくても検索できる。
繰り返すが、QueryParserの分析器は、人間が作成した文字列を解析する為のもので、日付やキーワードといった機械生成されたものは、クエリも機械生成させたほうがいい
3.一般的なテキストの場合は、QueryParserを使うべき
日付の範囲、キーワードなどのすべての他のものが質問API直接を通して加えられるほうがよいです。
日付とかは、プルダウンなどで選択できるようにするのがいい
■Terms
クエリは、operatorとtermに分けられます。
termは二種類あり、ただ一語の用語(「テスト」とか「こんにちわ」とか) と 文節 ("hello dolly" - ダブルコーテーションでかこまれた複数の言葉)
より複雑な質問を形成するために論理演算子と共に複数の用語を結合できます(以下を見てください)。
■Fields
検索を行う際には、fieldを指定できます。fieldを指定しない場合は、デフォルトのfieldで検索します。
fieldを指定する為には、「:」を使います。
例) 二つのfieldが定義されていて、titleとtextです。textがデフォルトのfieldとします。
1)「title:"The Right Way" AND text:go」
2)「title:"Do it right" AND right」
3)「title:Do it right」
→注意)「Do」のみがフィールド:titleを検索して、「it」と「right」は、フィールド:text(デフォルトフィールド)を検索
■検索オプション
・Wildcard Searcher
?:一文字のワイルドカード
*:複数文字のワイルドカード
あいまい検索。Levenshtein DistanceやEdit Distanceといったアルゴリズムを使っている
・Proximity Searcher
二つの言葉の距離を指定しての検索。
「"jakarta apache"~10」:jakarta と apache が10語以内にある文章を検索
・Range Searcher
「mod_date:[20020101 TO 20030101]」:mod_dateフィールドに、20020101から20030101の値が入ってる文章がヒットする。こちらは、20020101と20030101が含まれる。
「title:{Aida TO Charmen」:titleフィールドにAidaとCharmenの間の語句が含まれる。ただし、AidaとCharmenは含まれない。
※AidaからCharmenの範囲指定って何を含むのだろう・・・・・Bから始まる言葉とかかしら
[]:範囲検索で、指定のクエリを含む
{}:は含まれない
・Boosting a Term
「jakarta apache」:Boosting無し
「jakarta^4 apache」:jakartaが入っている文章は4倍→Boosting
^をつけるとその語句がはいっている文章が検索上位にきます。
「"jakarta apache"^4 "Apache Lucene"」
上記のように「フレーズ」ごとにブーストすることも可能
■Boolean Operator
Luceneでは、「OR」「AND」「NOT」「+」「-」の操作子をつけることで、複雑な条件を指定することができます。
・OR
「"jakarta apache" jakarta」
「"jakarta apache" OR jakarta」
"jakarta apache"か"jakarta」が含まれる文章を検索して、結果を戻します。
・AND
「"jakarta apache" AND "Apache Lucene"」
"jakarta apache" と "Apache Lucene"を含むドキュメントを検索して、返します。
・+
「+jakarta lucene」
"jakarta"を必ず含んで、luceneを含むかもしれない文章を検索して、返します。
・NOT
「"jakarta apache" NOT "Apache Lucene"」
"jakarta apache"を含んで"Apache Lucene"を含まない文章を検索して、返します。
ひとつの語句だけにNOTはつかえない。
(例)「NOT "Apache Lucene"」→結果を返さない
・-
NOTと一緒
■Grouping
()を使う。
「(jakarta OR apache) AND website」
正規表現と一緒とおもわれます。
jakarta か apacheを含み、websiteを含むドキュメントを検索して、返します。
■Field Grouping
検索するfieldを指定して、Groupingします。
「title:(+return +"pink panther")」
titleというフィールドに"return"と"pink panther"を含むドキュメントを検索して、返します。
■特殊文字のエスケープ
特殊文字は「+ - && || ! ( ) { } [ ] ^ " ~ * ? : \」で、こちらをエスケープするためには、これらの文字の前に「/(\)」をつけます。
「\(1\+1\)\:2」
→(1+1):2 というクエリを発行する
===========================================================================
あるフィールドにある場合(たとえば、ブログタイトル)、検索の上位に表示したい場合、
「title:渋谷^10 OR 渋谷」
見たいな感じにすればいいかも。
目次
* Overview
* Terms
* Fields
* Term Modifiers
o Wildcard Searches
o Fuzzy Searches
o Proximity Searches
o Range Searches
o Boosting a Term
* Boolean Operators
o
o AND
o +
o NOT
o -
* Grouping
* Field Grouping
* Escaping Special Characters
■Overvier
LuceneはAPIで検索機能を提供している。Query Parserを通じて豊富な検索機能を実現している。
このページは、Lucene-1.9のQuery Parserの構文について説明する。
#古いな・・・・
Luceneが期待する挙動を示さない場合は、あなたが使用しているバージョンで分配されたdocs/queryparsersyntax.htmlを参照してください。
1.QueryParserに問い合わせるクエリをプログラムで生成している場合は、直接LuceneAPIに問い合わせたほうがいい。というのも、QueryParserは機械的に生成された文字列を解析するというよりは、人間が作成した文字列を解析するように作られているから
2.トークナイズ化(分かち書き)されたいないフィールドは、QueryParserを経由しなくても検索できる。
繰り返すが、QueryParserの分析器は、人間が作成した文字列を解析する為のもので、日付やキーワードといった機械生成されたものは、クエリも機械生成させたほうがいい
3.一般的なテキストの場合は、QueryParserを使うべき
日付の範囲、キーワードなどのすべての他のものが質問API直接を通して加えられるほうがよいです。
日付とかは、プルダウンなどで選択できるようにするのがいい
■Terms
クエリは、operatorとtermに分けられます。
termは二種類あり、ただ一語の用語(「テスト」とか「こんにちわ」とか) と 文節 ("hello dolly" - ダブルコーテーションでかこまれた複数の言葉)
より複雑な質問を形成するために論理演算子と共に複数の用語を結合できます(以下を見てください)。
■Fields
検索を行う際には、fieldを指定できます。fieldを指定しない場合は、デフォルトのfieldで検索します。
fieldを指定する為には、「:」を使います。
例) 二つのfieldが定義されていて、titleとtextです。textがデフォルトのfieldとします。
1)「title:"The Right Way" AND text:go」
2)「title:"Do it right" AND right」
3)「title:Do it right」
→注意)「Do」のみがフィールド:titleを検索して、「it」と「right」は、フィールド:text(デフォルトフィールド)を検索
■検索オプション
・Wildcard Searcher
?:一文字のワイルドカード
*:複数文字のワイルドカード
「te?t」:text, testとかがマッチ・Fuzzy Searcher
「text*」:text, texts とかマッチ
「t*xt」:taxt, taaaxtとかまっち
ただし、「*」や「?」は、最初の文字には使えない(NG: *st)
あいまい検索。Levenshtein DistanceやEdit Distanceといったアルゴリズムを使っている
「roam~」:foamやroams等がマッチ
・Proximity Searcher
二つの言葉の距離を指定しての検索。
「"jakarta apache"~10」:jakarta と apache が10語以内にある文章を検索
・Range Searcher
「mod_date:[20020101 TO 20030101]」:mod_dateフィールドに、20020101から20030101の値が入ってる文章がヒットする。こちらは、20020101と20030101が含まれる。
「title:{Aida TO Charmen」:titleフィールドにAidaとCharmenの間の語句が含まれる。ただし、AidaとCharmenは含まれない。
※AidaからCharmenの範囲指定って何を含むのだろう・・・・・Bから始まる言葉とかかしら
[]:範囲検索で、指定のクエリを含む
{}:は含まれない
・Boosting a Term
「jakarta apache」:Boosting無し
「jakarta^4 apache」:jakartaが入っている文章は4倍→Boosting
^をつけるとその語句がはいっている文章が検索上位にきます。
「"jakarta apache"^4 "Apache Lucene"」
上記のように「フレーズ」ごとにブーストすることも可能
■Boolean Operator
Luceneでは、「OR」「AND」「NOT」「+」「-」の操作子をつけることで、複雑な条件を指定することができます。
・OR
「"jakarta apache" jakarta」
「"jakarta apache" OR jakarta」
"jakarta apache"か"jakarta」が含まれる文章を検索して、結果を戻します。
・AND
「"jakarta apache" AND "Apache Lucene"」
"jakarta apache" と "Apache Lucene"を含むドキュメントを検索して、返します。
・+
「+jakarta lucene」
"jakarta"を必ず含んで、luceneを含むかもしれない文章を検索して、返します。
・NOT
「"jakarta apache" NOT "Apache Lucene"」
"jakarta apache"を含んで"Apache Lucene"を含まない文章を検索して、返します。
ひとつの語句だけにNOTはつかえない。
(例)「NOT "Apache Lucene"」→結果を返さない
・-
NOTと一緒
■Grouping
()を使う。
「(jakarta OR apache) AND website」
正規表現と一緒とおもわれます。
jakarta か apacheを含み、websiteを含むドキュメントを検索して、返します。
■Field Grouping
検索するfieldを指定して、Groupingします。
「title:(+return +"pink panther")」
titleというフィールドに"return"と"pink panther"を含むドキュメントを検索して、返します。
■特殊文字のエスケープ
特殊文字は「+ - && || ! ( ) { } [ ] ^ " ~ * ? : \」で、こちらをエスケープするためには、これらの文字の前に「/(\)」をつけます。
「\(1\+1\)\:2」
→(1+1):2 というクエリを発行する
===========================================================================
あるフィールドにある場合(たとえば、ブログタイトル)、検索の上位に表示したい場合、
「title:渋谷^10 OR 渋谷」
見たいな感じにすればいいかも。