このトピックでは、WebLogic Portal Expression 言語で高度なコンテンツ クエリを構築する方法について説明します。高度なクエリ構築ウィンドウは、コンテンツに関連する JSP タグ内、またはプレースホルダ、キャンペーン、コンテンツ セレクタのクエリ作成時に使用できます。
ジャンプ先 : 複合クエリのガイドライン | クエリのサンプル
クエリとは
クエリは以下の 3 つの部分に分かれています。
クエリの基本的なロジックを次に示します。まず、BEA 仮想コンテンツ リポジトリで、コンテンツ プロパティとユーザが入力した値とが比較されます。比較結果が true の場合、値が一致するすべてのコンテンツ項目が取得されます。以下に例を示します。
employee_type == 'manager' | このクエリでは、プロパティ「employee_type」の中で、文字列「manager」に完全一致 (==) する文字列を含むすべてのコンテンツ項目が BEA 仮想コンテンツ リポジトリから取得される。 |
クエリは多くの場合、「and」および「or」ロジックを使った複数の句で構成されます。以下に例を示します。
(genre == 'rock' || genre == 'alternative') && platinum_records > 2 |
このクエリでは、プロパティ「genre」の値が「rock」 または (||) 「alternative」 かつ (&&) プロパティ「platinum_records」の値が「2」より大きいすべてのコンテンツ項目が取得される。クエリの各セクションを括弧で分けることにより、評価される順序を制御する。 |
コンテンツにはユーザ定義コンテンツ プロパティと明示的 (システム) コンテンツ プロパティの 2 種類があり、どちらもクエリで使用できます。
ユーザ定義コンテンツ プロパティは、WebLogic Administration Portal で定義されたタイプ セットに格納されます。たとえば、「Book」(本) というタイプを作成して、「title」(タイトル)、「author」(著者)、「pub_date」(出版日)、「isbn」(ISBN) などのプロパティを追加することができます。
明示的なコンテンツ プロパティは、コンテンツ項目をコンテンツ リポジトリに追加したときにすべてのコンテンツ項目に自動的に関連付けられ、コンテンツ項目の値も自動的に割り当てられます。明示的なコンテンツ プロパティの一覧を以下に示します。これらのプロパティは com.bea.content.expression.Search クラスにも含まれています。
プロパティ | API | 説明 |
cm_uid | Node.id.uid | コンテンツ項目のユニークな ID。コンテンツ項目のユニークな ID を参照するには、WebLogic Administration Portal でコンテンツ項目を選択し、[コンテンツの編集] ウィンドウの説明を表示する。 |
cm_createdDate | Node.createDate | コンテンツ項目の作成日。コンテンツ項目の作成日情報を参照するには、WebLogic Administration Portal でコンテンツ フォルダを選択し、[子を参照] ページを選択する。 |
cm_createdBy | Node.createdBy | コンテンツ項目の作成者。コンテンツ項目の作成者情報を参照するには、WebLogic Administration Portal でコンテンツ フォルダを選択し、[子を参照] ページを選択する。 |
cm_modifiedDate | Node.modifiedDate | コンテンツ項目の最終変更日。コンテンツ項目の変更日情報を参照するには、WebLogic Administration Portal でコンテンツ フォルダを選択し、[子を参照] ページを選択する。 |
cm_nodeName | Node.name | WebLogic Administration Portal に表示するコンテンツ項目名。 |
cm_path | Node.path | 仮想コンテンツ リポジトリのコンテンツ項目へのパス。たとえば、次のように入力する。 '/BEA Repository/juvenilebooks/TheCrazyAdventure' |
cm_isHierarchy | Node.type == Node.HIERARCHY | コンテンツ項目ではなく、コンテンツ フォルダを識別する。コンテンツ フォルダにはコンテンツ項目と子コンテンツ フォルダを含めることができる。このプロパティをクエリに使用する場合は、true または false のブール値で比較する。 |
cm_isContent | Node.type == Node.CONTENT | コンテンツ フォルダではなく、コンテンツ項目を識別する。コンテンツ項目には、関連付けられたタイプのプロパティが含まれる。このプロパティをクエリに使用する場合は、true または false のブール値で比較する。 |
cm_objectClass | Node.objectClass.name | コンテンツ項目に関連付けられたコンテンツ タイプ。コンテンツ項目のタイプ情報を参照するには、WebLogic Administration Portal でコンテンツ フォルダを選択し、[子を参照] ページを選択するか、コンテンツ項目を選択して [コンテンツの編集] ページのヘッダ行を表示する。 |
cm_contentType | BinaryValue.contentType | コンテンツ項目のバイナリ プロパティの MIME タイプ。たとえば、'image/jpeg' がある。コンテンツ項目の MIME タイプを参照するには、WebLogic Administration Portal で MIME タイプを選択し、バイナリ プロパティ情報を表示する。 |
cm_binarySize | BinaryValue.size (ノード プロパティの場合) |
コンテンツ項目のバイナリ値のサイズ。コンテンツ項目のバイナリ値のサイズを参照するには、WebLogic Administration Portal でコンテンツ項目を選択し、バイナリ プロパティの [Download File] をクリックし、表示されたバイナリ ファイルを右クリックしてファイルのプロパティを表示する。 このプロパティをクエリで使用する場合は、バイナリ サイズをバイト単位で指定する。 |
cm_binaryName | BinaryValue.name (ノード プロパティの場合) |
コンテンツ項目のバイナリ値のファイル名。コンテンツ項目のバイナリ値の名前を参照するには、WebLogic Administration Portal でコンテンツ項目を選択し、[ファイル名] の値を表示する。 |
クエリにプロパティ名を指定する場合、引用符を付ける必要はありません。
たとえば、title <比較演算子> <値> のように指定します。
ただし、プロパティ名にスペース、二重引用符、ダッシュが含まれている場合は、toProperty() フォーマット内のプロパティ名を引用符で囲む必要があります。
たとえば、toProperty('Favorite Author') <比較演算子> <値> のように指定します。
このクエリでは、すべてのコンテンツ タイプのプロパティ名が検索対象となり、コンテンツ項目がクエリの条件を満たしていれば、指定したプロパティ値を持つすべてのコンテンツ項目が返されます。これに対して、指定したタイプのプロパティのみを抽出することもできます。たとえば、タイプ「books」とタイプ「articles」があり、どちらにも「title」プロパティがある場合、タイプ「books」のみから特定の「title」を持つコンテンツ項目を取り出すことができます。それには cm_objectClass プロパティを使用します。
たとえば、title likeignorecase '*Adventure' && cm_objectClass = 'books' のように指定します。
比較演算子は、クエリのプロパティとユーザが入力した値とを比較するロジックです。クエリの条件を満たしているコンテンツ項目が返されます。クエリで使用できる比較演算子を以下に示します。
比較演算子 | 解説 (比較演算子で操作可能なプロパティ フォーマット) |
= または == | リストを持つ単値を含む単値プロパティが、大文字/小文字の区別も含めてユーザの入力値と完全に一致しているかどうかを確認する (Boolean、Date/Time、Numeric、String の値)。例を参照。 |
!= | リストを持つ単値を含む単値プロパティが、大文字/小文字の区別も含めてユーザの入力値と不一致であるかどうかを確認する (Boolean、Date/Time、Numeric、String の値)。例を参照。 |
> | 単値プロパティがユーザの入力値より大きいかどうかを確認する (Date/Time および Numeric の値)。 例を参照。 |
< | 単値プロパティがユーザの入力値より小さいかどうかを確認する (Date/Time および Numeric の値)。 例を参照。 |
>= | 単値プロパティがユーザの入力値以上であるかどうかを確認する (Date/Time および Numeric の値)。例を参照。 |
<= | 単値プロパティがユーザの入力値以下であるかどうかを確認する (Date/Time および Numeric の値)。例を参照。 |
like | 単値プロパティが、大文字/小文字の区別も含めてユーザの入力値に似ているかどうかを確認する。ワイルドカード文字 * (1 文字以上の場合) または ? (1 文字の場合) を使用できる (String の値)。例を参照。 |
likeignorecase | 単値プロパティが、ユーザの入力値に似ているかどうかを確認する。ワイルドカード文字 * または ? を使用できる。大文字/小文字は区別されない (String の値)。例を参照。 |
contains | 多値プロパティに、ユーザが入力した単値と一致する値があるかどうかを確認する (Date/Time、Numeric、String の値)。例を参照。 実装方法によっては、この比較演算子を単値プロパティに対して使用することもできる。 |
containsall | 多値プロパティに、ユーザが入力したすべての値があるかどうかを確認する (Date/Time、Numeric、String の値)。例を参照。 実装方法によっては、この比較演算子を単値プロパティに対して使用することもできる。 |
containsany | 多値プロパティに、ユーザが入力した値のいずれかがあるかどうかを確認する (Date/Time、Numeric、String の値)。例を参照。 実装方法によっては、この比較演算子を単値プロパティに対して使用することもできる。 |
in | 単値プロパティに、ユーザの入力値のいずれかが含まれているかどうかを確認する。入力した値が候補値リストでなければ (単値であれば)、「in」は「=」または「==」と同義 (Date/Time、Numeric、String の値)。例を参照。 |
値はクエリから取得するコンテンツを表します。クエリに値を指定することにより、コンテンツ項目に格納されている値に基づいて取得または無視するコンテンツをクエリに指示します。
たとえば、コンテンツ タイプ「book」にプロパティ「title」がある場合、「book」に関連付けられたすべてのコンテンツ項目に「title」フィールドが存在します。各「title」の値はユニークであるため、クエリにユニークな値を入力すれば、使用する比較演算子に応じて特定のコンテンツ項目が取得または無視されます。
値の入力は、クエリにハード コーディングする方法と、ユーザ プロファイルなどのプロパティ セット (セッションおよびリクエスト) から値を取得する方法の 2 種類があります。
値をハード コーディングする場合は取得するコンテンツを特定できるため、クエリ結果を予測できます。
値をユーザ プロファイル、セッション、またはリクエスト のプロパティ セットから作成する場合、指定した各ユーザ プロファイル、セッション、またはリクエストのプロパティの値がプログラム的にクエリに挿入されるため、現在のユーザのプリファレンスあるいは現在のセッションまたはリクエストに基づいてパーソナライズされたクエリを作成できます。たとえば、クエリのコンテンツ プロパティが「author」の場合、ユーザの「FavoriteAuthor」プロファイルのプロパティ値を取得してその値をクエリに指定すると、ユーザの好きな著者に関連付けられたコンテンツを取得できます。
クエリに値を指定する場合のガイドラインを以下に示します。
複数の独立したクエリ句を and (&&) や or (||) ロジックで結合し、代数式の評価順序を括弧で制御することができます。これにより複雑なクエリが作成可能になります。括弧でグループ化した句の前に感嘆符を付けて、複合クエリに「not」ロジック (!) を指定することもできます。このトピックのクエリのサンプルに複合クエリの例を示します。「not」ロジックの使用例も示しています。
次の図は、BEA の仮想コンテンツ リポジトリに格納されているグラフィックのプロパティ セットを示しています。
図の後のクエリ例は、このサンプル コンテンツ項目のプロパティを使って記述されています。また、各サンプル クエリの解説では、クエリでコンテンツ項目が取得されるかどうかを示しています。
クエリ | サンプル取得の有無 | 説明 |
あり | genre プロパティの値が fantasy のコンテンツ項目を取得する。値は大文字と小文字が区別される。 | |
will_visit_schools == true | あり | will_visit_schools プロパティが true に設定されているすべてのコンテンツ項目を取得する。 |
|
あり | genre プロパティの値が大文字と小文字の区別も含めて mystery ではないコンテンツ項目を取得する。 |
あり | pub_date プロパティが 2000 年 1 月 2 日以降に設定されているコンテンツ項目を取得する。 | |
books in series < 3 | なし | プロパティ名にスペースが含まれているため、次の例に示すように toProperty() を使用する必要がある。 |
あり | books in series プロパティの値が 3 より小さいすべてのコンテンツ項目を取得する。 | |
toProperty('books in series') >= 3 | なし | books in series プロパティの値が 3 以上のすべてのコンテンツ項目を取得する。このサンプル コンテンツ項目のプロパティ値は 1。 |
toProperty('books in series') <= 3 | あり | books in series プロパティの値が 3 以下のすべてのコンテンツ項目を取得する。 |
あり | author プロパティの値が Penman や Panmen など、「P」と「n」の間に 1 文字入り、「m」の後に任意の文字数の文字が続くすべてのコンテンツを取得する。大文字と小文字は区別される。 注意 : プロパティ値 Penman の後にテキストが続くため、末尾のアスタリスクがない場合、コンテンツ項目は取得されません。 |
|
あり | author の値が penman、Penman、Penfield など、pen で始まるすべてのコンテンツを取得する。大文字と小文字は区別されない。 | |
あり | genre の値に fantasy が含まれるすべてのコンテンツを取得する。 | |
genre contains 'child*' | なし | 比較演算子 contains ではワイルドカード文字は使用できない。 |
あり | genre プロパティの値に fantasy と children が含まれるすべてのコンテンツを取得する。 | |
genre containsall ('fantasy', 'children', 'scifi') |
なし | genre プロパティの値に fantasy、children、および scifi が含まれるすべてのコンテンツを取得する。サンプル コンテンツ項目には fantasy と children は含まれているが、scifi は含まれていない。 |
genre containsany ('fantasy', 'children', 'scifi') | あり | genre プロパティの値に fantasy、children、または scifi が含まれるすべてのコンテンツを取得する。 |
isbn in ('pending', 'not_available') | あり | isbn プロパティの値に pending または not_available が含まれるすべてのコンテンツを取得する。 |
複合クエリ | ||
toProperty('books in series') >= 3 && pub_date > toDate('MM-yyyy','1-2000') |
なし | 2000 年 1 月以降に出版された 3 巻本の一部となる本を取得する。 |
(genre contains 'children' || keywords like '*children*') && will_visit_schools == true | あり | genre の値が children に設定されているか、keyword の値が *children* であり、著者の学校訪問が可能な本を取得する。 |
((genre contains 'children' || keywords like '*children*') && will_visit_schools == true) && isbn != 'pending' | なし | genre の値が children に設定されているか、keyword の値が *children* であり、著者の学校訪問が可能で、isbn の値が pending (まだ出版されていないという意味) ではない本を取得する。 括弧のネストで評価順序を制御する。 |
(title likeignorecase '*adventure' || genre contains 'fantasy') && (pub_date >= toDate('MM-yyyy', '01-2004') || isbn == 'pending') | あり | title に *adventure が含まれるか、genre に fantasy が含まれ、pub_date が 2004 年 1 月以降または isbn が pending (まだ出版されていない) の本を取得する。 |
(genre containsany userProperty('userpreferences', 'BookGenre') && (keywords likeignorecase '*pixies')) || author likeignorecase userProperty('userpreferences', 'FavoriteAuthor') |
設定により異なる | このクエリでは、ユーザ プロファイルのプロパティを読み取り、特定のプロパティ値でクエリの値を指定する。ユーザ プリファレンスに基づいてコンテンツを取得するため、パーソナライズされたコンテンツ検索が可能。 たとえば、現在のユーザの BookGenre プロパティが mystery に設定され、FavoriteAuthor が Penman、Piper に設定されている場合、このクエリを実行すると、最初の句の BookGenre の値は一致しなくても、OR (||) で結合された 2 番目の句の FavoriteAuthor が一致するため、サンプル コンテンツが返される。 注意 : WebLogic Workshop でプロパティ セットを作成せずに、プロパティ コントロールまたは setProperty JSP タグでユーザ プロパティ セットおよび各種プロパティをプログラム的に設定しても、クエリに userProperty() を使用できる。 |
その他の便利なクエリ (サンプル コンテンツには関連がない) |
||
language == userProperty('userpreferences', 'userPreferredLang') | この方法では、プロパティ セットに格納されているユーザの言語プリファレンス (userPreferredLang) に基づいて、各ユーザに適した言語でコンテンツが表示される。sessionProperty() でセッションから言語プリファレンスを取得したり、requestProperty('DefaultRequestPropertySet', 'Locale') で en-US などのユーザのロケール文字列を取得したりすることもできる。 | |
UserAge > 35 && !(colors contains 'black')) && mimeType == 'text/html') && toProperty('Launch Date') < now && !(expireDate > toDate('MM-yyyy', '12-2004')) |
このクエリでは !(colors contains 'black') 句に見られるように、「not」ロジックが使用されている。 |