第22章 Ickle クエリー言語を使用したクエリーの構築

22.1. Ickle クエリー言語を使用したクエリーの構築

フルテキスト拡張を持つ JP-QL の軽量小型のサブセットである Ickle を使用すると、ライブラリーモードとリモートクライアントサーバーモードの両方でリレーショナルおよびフルテキストクエリーを作成することができます。Ickleは文字別ベースのクエリー言語で、以下の特徴があります。

  • Java クラスをクエリーし、Protocol Buffers をサポートします。
  • クエリーは単一のエンティティー型を対象にすることができます。
  • クエリーはコレクションを含む、埋め込みオブジェクトのプロパティーでフィルターできます。
  • 射影、集約、ソート、名前付きパラメーターをサポートします。
  • インデックス化された実行とインデックス化されていない実行をサポートします。
  • 複雑なブール式をサポートします。
  • フルテキストクエリーをサポートします。
  • user.age > sqrt(user.shoeSize+3) など、式の中での計算はサポートしません。
  • 結合をサポートしません。
  • サブクエリーをサポートしません。
  • 多くの JBoss Data Grid API でサポートされます。継続的クエリーやリスナーのイベントフィルターなど、QueryBuilder によって作成されたクエリーは許可されます。

API を使用するには、最初に QueryFactory をキャッシュで取得し、.create() メソッドを呼び出してクエリーで使用する文字列を渡します。以下に例を示します。

QueryFactory qf = Search.getQueryFactory(remoteCache);
Query q = qf.create("from sample_bank_account.Transaction where amount > 20");

Ickle を使用する場合、フルテキスト演算子と使用されるすべてのフィールドはインデックス化され、分析される必要があります。

22.2. Lucene クエリーパーサー構文との違い

Ickle は JP-QL のサブセットですが、クエリー構文に以下の違いがあります。

  • 空白は重要ではありません。
  • フィールド名のワイルドカードをサポートしません。
  • デフォルトのフィールドがないため、フィールド名またはパスを常に指定する必要があります。
  • フルテキストおよび JPA 述語では、ANDOR の代わりに &&|| が許可されます。
  • NOT の代わりに ! を使用できます。
  • 見つからないブール演算子は OR として解釈されます。
  • 文字列の単語を一重引用符または二重引用符のいずれかで囲む必要があります。
  • ファジーとブーストは任意の順番では許可されません。常にファジーが最初になります。
  • <> の代わりに != が許可されます。
  • ブーストは >>=<、および 演算子には適用できません。範囲を使用すると同じ結果を得られます

22.3. ファジークエリー

ファジークエリーを実行するには、単語の後に ~ と、単語からの距離を表す整数を追加します。例を以下に示します。

Query fuzzyQuery = qf.create("from sample_bank_account.Transaction where description : 'cofee'~2");

22.4. 範囲クエリー

範囲クエリーを実行するには、以下の例のように境界を角括弧で囲んで定義します。

Query rangeQuery = qf.create("from sample_bank_account.Transaction where amount : [20 to 50]");

22.5. フレーズクエリー

単語の組み合わせを検索するには、以下の例のように引用符で囲みます。

Query q = qf.create("from sample_bank_account.Transaction where description : 'bus fare'");

22.6. 近接クエリー

近接クエリーを実行し、特定の距離内にある 2 つの単語を見つけるには、それらの言葉の後に ~ とその距離を追加します。たとえば以下の例では、間に 3 つ以下の言葉が存在する canceling および fee を見つけます。

Query proximityQuery = qf.create("from sample_bank_account.Transaction where description : 'canceling fee'~3 ");

22.7. ワイルドカードクエリー

単一文字および複数文字のワイルドカード検索を実行できます。

  • 単一文字のワイルドカード検索には ? 文字を使用できます。
  • 複数文字のワイルドカード検索には * 文字を使用できます。

text または test を検索するには、以下のように単一文字のワイルドカード検索を使用できます。

Query wildcardQuery = qf.create("from sample_bank_account.Transaction where description : 'te?t'");

testtests、または tester を検索するには、以下のように複数文字のワイルドカード検索を使用できます。

Query wildcardQuery = qf.create("from sample_bank_account.Transaction where description : 'test*'");

22.8. 正規表現クエリー

正規表現クエリーを実行するには、/ の間にパターンを指定します。Ickle は Lucene の正規表現構文を使用するため、以下を使用して moat または boat を検索できます。

Query regExpQuery = qf.create("from sample_library.Book  where title : /[mb]oat/");

22.9. ブーストクエリー

単語の後に ^ を追加し、クエリーでの関連度を高めると、単語をブーストすることができます。ブースト係数が高いほど単語の関連度も高くなります。たとえば、beerwine が含まれる書名を検索し、beer の係数が 3 大きい場合、以下を使用できます。

Query boostedQuery = qf.create("from sample_library.Book where title : beer^3 OR wine");