照会の操作
SQL ステートメントの作成
SearchSQL クラスが提供するヘルパー・メソッドを使用して SQL ステートメントを作成することもできますし、既存の SQL ステートメントを SearchSQL インスタンスに渡すことも可能です。ヘルパー・メソッドは、SQL ステートメントの作成を支援するために用意されていますが、独自に作成したステートメントで達成できるレベルの仕様は提供できません。
SearchSQL メソッドの使用
SearchSQL メソッドを使用して SQL ステートメントを作成する一般的なシーケンスを以下に示します。
Java™ の例
// SearchSQL オブジェクトの作成
SearchSQL sqlObject = new SearchSQL();
// (オプション) 返されるレコードの最大数を指定。This defaults to the
// ServerCacheConfiguration.NonPagedQueryMaxSize 値の標準値
sqlObject.setMaxRecords(150);
// setSelectList メソッドを使用して SELECT リストを指定
String select = "r.Title, s.Title";
sqlObject.setSelectList(select);
// setFromClauseInitialValue メソッドを使用して FROM 節を指定
// クラスのシンボル名
String myClassName1 = "Requirement";
// 別名
String myAlias1 = "r";
// サブクラスが含まれるかどうかを指定
boolean subclassesToo = false;
sqlObject.setFromClauseInitialValue(myClassName1, myAlias1, subclassesToo);
// JOIN に対して、setFromClauseAdditionalJoin メソッドを使用して追加の FROM 節を指定
// method. クラスのシンボル名
String myClassName2 = "Specification";
// 別名
String myAlias2 = "s";
// The property on the class specified for the setFromClauseInitialValue
// method. これはベースとなる ON 節の 1 つの要素で、他の要素は、
// prop2。
String prop1 = "s.ApplicationName";
// このメソッドに指定されたクラスのプロパティー (myClassName2)。
// これは JOIN で使用されるベースの ON 節の別の要素
String prop2 = "r.ApplicationName";
// サブクラスが含まれるかどうかを指定
subclassesToo = false;
sqlObject.setFromClauseAdditionalJoin(
JoinOperator.INNER, myClassName2, myAlias2, prop1,
JoinComparison.EQUAL, prop2, subclassesToo);
// setWhereClause メソッドを使用して、WHERE 節を指定
String whereClause = "r.Title LIKE '%P8%'";
sqlObject.setWhereClause(whereClause);
// setOrderByClause メソッドを使用して、ORDER BY 節を指定
String orderClause = "r.Title";
sqlObject.setOrderByClause(orderClause);
// 作成された SQL ステートメントを確認
System.out.println("SQL: " + sqlObject.toString());
// SearchScope インスタンスを作成し、SQL ステートメントをテスト
SearchScope searchScope = new SearchScope(os);
// fetchRows を使用して、SQL ステートメントをテスト
RepositoryRowSet rowSet = searchScope.fetchRows(sqlObject, null, null, new Boolean(true));
C# の例
// SearchSQL オブジェクトの作成
SearchSQL sqlObject = new SearchSQL();
// (オプション) 返されるレコードの最大数を指定。This defaults to the
// ServerCacheConfiguration.NonPagedQueryMaxSize 値の標準値
sqlObject.SetMaxRecords(150);
// setSelectList メソッドを使用して SELECT リストを指定
string select = "r.Title, s.Title";
sqlObject.SetSelectList(select);
// setFromClauseInitialValue メソッドを使用して FROM 節を指定
// クラスのシンボル名
string myClassName1 = "Requirement";
// 別名
string myAlias1 = "r";
// サブクラスが含まれるかどうかを指定
bool subclassesToo = false;
sqlObject.SetFromClauseInitialValue(myClassName1, myAlias1, subclassesToo);
// JOIN に対して、setFromClauseAdditionalJoin メソッドを使用して追加の FROM 節を指定
// method. クラスのシンボル名
string myClassName2 = "Specification";
// 別名
string myAlias2 = "s";
// The property on the class specified for the setFromClauseInitialValue
// method. これはベースとなる ON 節の 1 つの要素で、他の要素は、
// prop2。
string prop1 = "s.ApplicationName";
// このメソッドに指定されたクラスのプロパティー (myClassName2)。
// これは JOIN で使用されるベースの ON 節の別の要素
string prop2 = "r.ApplicationName";
// サブクラスが含まれるかどうかを指定
subclassesToo = false;
sqlObject.SetFromClauseAdditionalJoin(
JoinOperator.INNER, myClassName2, myAlias2, prop1,
JoinComparison.EQUAL, prop2, subclassesToo);
// setWhereClause メソッドを使用して、WHERE 節を指定
string whereClause = "r.Title LIKE '%P8%'";
sqlObject.SetWhereClause(whereClause);
// setOrderByClause メソッドを使用して、ORDER BY 節を指定
string orderClause = "r.Title";
sqlObject.SetOrderByClause(orderClause);
// 作成された SQL ステートメントを確認
System.Console.WriteLine("SQL: " + sqlObject.ToString());
// SearchScope インスタンスを作成し、SQL ステートメントをテスト
SearchScope searchScope = new SearchScope(os);
// fetchRows を使用して、SQL ステートメントをテスト
IRepositoryRowSet rowSet = searchScope.FetchRows(sqlObject, null, null, true);
RepositoryRowSet を反復処理する方法を示したコード例については、データベース行の検索を参照してください。
SearchSQL インスタンス (sqlObject) を SearchScope パラメーター・リストに指定すると、検索を実行できます。SQL ステートメントの構文の詳細については、「SQL 構文のリファレンス」を参照してください。
独自に作成したステートメントの使用
IBM® FileNet® 標準に準拠する SQL ステートメントは、文字列形式で SearchSQL に渡すことができます。コンストラクター SearchSQL(String)、または setQueryString メソッドを使用することが可能です。
Java の例
// The SQL statement "SELECT DocumentTitle Id FROM Document WHERE DocumentTitle LIKE
// '%Acct%'" retrieves documents by ID (GUID) that have a document
// title containing the character pattern "Acct".
// この SQL ステートメントを String 変数に格納して setQueryString メソッドに渡すことができる。
// その場合、以下のように記述する。
String mySQLString = "SELECT DocumentTitle, Id FROM Document WHERE DocumentTitle LIKE '%Acct%'";
SearchSQL sqlObject = new SearchSQL();
sqlObject.setQueryString(mySQLString);
// または、以下のように SearchSQL(String) コンストラクターを使用することも可能。
// String mySQLString = "SELECT DocumentTitle, Id FROM Document WHERE DocumentTitle
// LIKE '%Acct%'";
// SearchSQL sqlObject = new SearchSQL(mySQLString);
// この後、SearchSQL インスタンス (sqlObject) SearchScope パラメーター・リストに指定すると、
// 検索を実行できる。fetchRows を使用して、SQL
// ステートメントをテスト
SearchScope searchScope = new SearchScope(os);
RepositoryRowSet rowSet = searchScope.fetchRows(sqlObject, null, null, new Boolean(true));
C# の例
// The SQL statement "SELECT DocumentTitle Id FROM Document WHERE DocumentTitle LIKE
// '%Acct%'" retrieves documents by ID (GUID) that have a document
// title containing the character pattern "Acct".
// この SQL ステートメントを String 変数に格納して setQueryString メソッドに渡すことができる。
// その場合、以下のように記述する。
String mySQLString = "SELECT DocumentTitle, Id FROM Document WHERE DocumentTitle LIKE '%Acct%'";
SearchSQL sqlObject = new SearchSQL();
sqlObject.SetQueryString(mySQLString);
// この後、SearchSQL インスタンス (sqlObject) SearchScope パラメーター・リストに指定すると、
// 検索を実行できる。fetchRows を使用して、SQL
// ステートメントをテスト
SearchScope searchScope = new SearchScope(os);
IRepositoryRowSet rowSet = searchScope.FetchRows(sqlObject, null, null, true);
RepositoryRowSet を反復処理する方法を示したコード例については、データベース行の検索を参照してください。
SQL ステートメントの構文の詳細については、「SQL 構文のリファレンス」を参照してください。
コンテンツの検索
SearchSQL ヘルパー・メソッドまたは独自に作成した SQL ステートメントを使用して作成した照会に、コンテンツ検索 (全文検索) を含めることができます。CONTAINS 関数は、コンテンツ検索機能を実行します。CONTAINS は、明示的またはあいまいなフルテキスト照会で使用され、オブジェクト上の CBR 対応のすべてのプロパティー、または CBR 対応の単一のプロパティーのコンテンツを検索できます。
詳しくは、コンテンツ検索および CBR 照会を参照してください。
SearchSQL メソッドを使用したコンテンツ検索
コンテンツ検索を指定するには、SearchSQL ヘルパー・メソッド setContainsRestriction を使用します。以下の例では、Document クラスのすべての IsCBREnabled プロパティー内の指定されたコンテンツを、setContainsRestriction を使用して検索します。
Java の例
SearchSQL sqlObject = new SearchSQL();
String myClassName = "Document";
sqlObject.setSelectList("DocumentTitle");
sqlObject.setFromClauseInitialValue(myClassName, null, false);
String containsExpression = "'FileNet'";
sqlObject.setContainsRestriction(myClassName, containsExpression);
// SQL ステートメントを表示
System.out.println("SQL: " + sqlObject.toString());
// コンテンツ・サーチを実行
SearchScope searchScope = new SearchScope(os);
RepositoryRowSet rowSet = searchScope.fetchRows(sqlObject, null, null, new Boolean(true));
C# の例
SearchSQL sqlObject = new SearchSQL();
string myClassName = "Document";
sqlObject.SetSelectList("DocumentTitle");
sqlObject.SetFromClauseInitialValue(myClassName, null, false);
string containsExpression = "'FileNet'";
sqlObject.SetContainsRestriction(myClassName, containsExpression);
// SQL ステートメントを表示
System.Console.WriteLine("SQL: " + sqlObject.ToString());
// コンテンツ・サーチを実行
SearchScope searchScope = new SearchScope(os);
IRepositoryRowSet rowSet = searchScope.FetchRows(sqlObject, null, null, true);
RepositoryRowSet を反復処理する方法を示したコード例については、データベース行の検索を参照してください。
独自に作成したステートメントを使用したコンテンツ検索
独自に作成した SQL ステートメントにコンテンツ検索を指定するには、CONTAINS 関数を WHERE 節に追加します。単一の SQL ステートメントでは、CONTAINS 関数を 1 つだけ使用できます。
以下の例では、コンテンツ検索を作成する各種の方法を示します。
単一プロパティーの検索
この例では、AccountName プロパティーのコンテンツのみが検索されます (このプロパティーの IsCBREnabled が true であると想定します)。
Java の例
String mySQLString = "SELECT DocumentTitle Id FROM Document d "
+ "INNER JOIN ContentSearch cs ON d.This = cs.QueriedObject "
+ "WHERE CONTAINS(Name, 'FileNet')";
SearchSQL sqlObject = new SearchSQL(mySQLString);
// コンテンツ・サーチを実行
SearchScope searchScope = new SearchScope(os);
RepositoryRowSet rowSet = searchScope.fetchRows(sqlObject, null, null, new Boolean(true));
C# の例
String mySQLString = "SELECT DocumentTitle Id FROM Document d "
+ "INNER JOIN ContentSearch cs ON d.This = cs.QueriedObject "
+ "WHERE CONTAINS(Name, 'FileNet')";
SearchSQL sqlObject = new SearchSQL(mySQLString);
// コンテンツ・サーチを実行
SearchScope searchScope = new SearchScope(os);
IRepositoryRowSet rowSet = searchScope.FetchRows(sqlObject, null, null, true);
すべてのプロパティーの検索
この例では、オブジェクト上のすべてのプロパティーのコンテンツで、「company」に対するセマンティック相関が検索されます (これらのすべてのプロパティーでは、IsCBREnabled が true であると想定します)。
Java の例
String mySQLString = "SELECT DocumentTitle Id FROM Document d "
+ "INNER JOIN ContentSearch cs ON d.This = cs.QueriedObject "
+ "WHERE CONTAINS(*, 'company')";
SearchSQL sqlObject = new SearchSQL(mySQLString);
// コンテンツ・サーチを実行
SearchScope searchScope = new SearchScope(os);
RepositoryRowSet rowSet = searchScope.fetchRows(sqlObject, null, null, new Boolean(true));
C# の例
String mySQLString = "SELECT DocumentTitle Id FROM Document d "
+ "INNER JOIN ContentSearch cs ON d.This = cs.QueriedObject "
+ "WHERE CONTAINS(*, 'company')";
SearchSQL sqlObject = new SearchSQL(mySQLString);
// コンテンツ・サーチを実行
SearchScope searchScope = new SearchScope(os);
IRepositoryRowSet rowSet = searchScope.FetchRows(sqlObject, null, null, true);
複数のリポジトリーの検索
どの SearchScope メソッドを使用しても、複数のリポジトリーを検索することが可能です。複数のリポジトリーを指定する一般的なシーケンスを以下に示します。
Java の例
// 最初の SearchScope パラメーターに必要な ObjectStore 配列を
// 作成。(オブジェクト・ストア・オブジェクトがあることを仮定)
ObjectStore[] osArray = new ObjectStore[]{os1,os2};
// 複数のオブジェクト・ストアと、マージ・モードを指定してコンストラクターを
// 呼び出し
SearchScope searchMultiple = new SearchScope(osArray, MergeMode.INTERSECTION);
C# の例
// 最初の SearchScope パラメーターに必要な ObjectStore 配列を
// 作成。(オブジェクト・ストア・オブジェクトがあることを仮定)
IObjectStore[] osArray = new IObjectStore[]{os1,os2};
SearchScope searchMultiple = new SearchScope(osArray, MergeMode.INTERSECTION);
マージ・モード設定の詳細については、マージ・モードを参照してください。
オブジェクトの検索
リポジトリー内のオブジェクトを検索するには、SearchScope.fetchObjects メソッドを使用します。fetchObjects メソッドは、IndependentObject オブジェクトのコレクションを戻します。オブジェクトに対して照会を実行する一般的なシーケンスを以下に示します。
Java の例
// searchSQL インスタンスを作成し、SQL ステートメントを指定
// (ヘルパー・メソッド使用)
SearchSQL sqlObject = new SearchSQL();
sqlObject.setSelectList("d.DocumentTitle, d.Id");
sqlObject.setMaxRecords(20);
sqlObject.setFromClauseInitialValue("Document", "d", false);
// Check the SQL statement.
System.out.println("SQL: " + sqlObject.toString());
// SearchScope インスタンスを作成// (オブジェクト・ストア・オブジェクトが存在すると仮定)
SearchScope search = new SearchScope(os);
// ページ・サイズ (Long) を設定し、照会の結果データのページに使用する。この値は
// pageSize パラメーターに渡される。null なら、
// ServerCacheConfiguration.QueryPageDefaultSize の値のデフォルトとなる。
Integer myPageSize = new Integer(100);
// プロパティー・フィルターを指定し、必要ならフィルター・パラメーターを使用する。
// プロパティーをフィルタリングしないなら、null でも構わない。
PropertyFilter myFilter = new PropertyFilter();
int myFilterLevel = 1;
myFilter.setMaxRecursion(myFilterLevel);
myFilter.addIncludeType(new FilterElement(null, null, null, FilteredPropertyType.ANY, null));
// 継続のパラメーターに (boolean) 値を設定。これは、結果の最初のページの
// 末尾に達したとき、後続ページ用にリクエストを反復処理するかどうかを
// 示す。null または false なら、結果の単一ページのみが
// 返される。
Boolean continuable = new Boolean(true);
// 指定したパラメーターを使用して fetchObjects メソッドを実行
IndependentObjectSet myObjects = search.fetchObjects(sqlObject, myPageSize, myFilter, continuable);
C# の例
// searchSQL インスタンスを作成し、SQL ステートメントを指定
// (ヘルパー・メソッド使用)
SearchSQL sqlObject = new SearchSQL();
sqlObject.SetSelectList("d.DocumentTitle, d.Id");
sqlObject.SetMaxRecords(20);
sqlObject.SetFromClauseInitialValue("Document", "d", false);
// Check the SQL statement.
System.Console.WriteLine("SQL: " + sqlObject.ToString());
// SearchScope インスタンスを作成// (オブジェクト・ストア・オブジェクトが存在すると仮定)
SearchScope search = new SearchScope(os);
// ページ・サイズ (Long) を設定し、照会の結果データのページに使用する。この値は
// pageSize パラメーターに渡される。null なら、
// ServerCacheConfiguration.QueryPageDefaultSize の値のデフォルトとなる。
int myPageSize = 100;
// プロパティー・フィルターを指定し、必要ならフィルター・パラメーターを使用する。
// プロパティーをフィルタリングしないなら、null でも構わない。
PropertyFilter myFilter = new PropertyFilter();
int myFilterLevel = 1;
myFilter.SetMaxRecursion(myFilterLevel);
myFilter.AddIncludeType(new FilterElement(null, null, null, FilteredPropertyType.ANY, null));
// 継続のパラメーターに (boolean) 値を設定。これは、結果の最初のページの
// 末尾に達したとき、後続ページ用にリクエストを反復処理するかどうかを
// 示す。null または false なら、結果の単一ページのみが
// 返される。
bool continuable = true;
// 指定したパラメーターを使用して fetchObjects メソッドを実行
IIndependentObjectSet myObjects = search.FetchObjects(sqlObject, myPageSize, myFilter, continuable);
一般的なシーケンスと例については、SQL ステートメントの作成を参照してください。複数のオブジェクト・ストアを検索するためのシーケンスと例については、複数のリポジトリーの検索を参照してください。
データベース行の検索
Content Engine データベースの行を検索するには、SearchScope.fetchRows メソッドを使用します。fetchRows メソッドは、RepositoryRow オブジェクトのコレクションを戻します。データベース行に対して照会を実行する一般的なシーケンスを以下に示します。
Java の例
// searchSQL インスタンスを作成し、SQL ステートメントを指定 (ヘルパー・メソッド使用)
SearchSQL sqlObject = new SearchSQL();
sqlObject.setSelectList("d.DocumentTitle, d.Id");
sqlObject.setMaxRecords(20);
sqlObject.setFromClauseInitialValue("Document", "d", false);
// Check the SQL statement.
System.out.println("SQL: " + sqlObject.toString());
// SearchScope インスタンスを作成// (オブジェクト・ストア・オブジェクトが存在すると仮定)
SearchScope search = new SearchScope(os);
// ページ・サイズ (Long) を設定し、照会の結果データのページに使用する。この値は
// pageSize パラメーターに渡される。null なら、
// ServerCacheConfiguration.QueryPageDefaultSize の値のデフォルトとなる。
Integer myPageSize = new Integer(100);
// プロパティー・フィルターを指定し、必要ならフィルター・パラメーターを使用する。
// プロパティーをフィルタリングしないなら、null でも構わない。
PropertyFilter myFilter = new PropertyFilter();
int myFilterLevel = 1;
myFilter.setMaxRecursion(myFilterLevel);
myFilter.addIncludeType(new FilterElement(null, null, null, FilteredPropertyType.ANY, null));
// 継続のパラメーターに (boolean) 値を設定。これは、結果データの
// 後続ページ用にリクエストを反復処理するかどうかを示す。
Boolean continuable = new Boolean(true);
// 指定したパラメーターを使用して fetchRows メソッドを実行
RepositoryRowSet myRows = search.fetchRows(sqlObject, myPageSize, myFilter, continuable);
// 次に行のコレクションを反復処理すると、プロパティーにアクセスできる
int rowCount = 0;
Iterator iter = myRows.iterator();
while (iter.hasNext()) {
RepositoryRow row = (RepositoryRow) iter.next();
String docTitle = row.getProperties().get("DocumentTitle").getStringValue();
Id docId = row.getProperties().get("Id").getIdValue();
rowCount++;
System.out.print(" row " + rowCount + ":");
System.out.print(" Id=" + docId.toString());
if (docTitle != null) {
System.out.print(" DocumentTitle=" + docTitle);
}
System.out.println();
}
C# の例
// searchSQL インスタンスを作成し、SQL ステートメントを指定 (ヘルパー・メソッド使用)
SearchSQL sqlObject = new SearchSQL();
sqlObject.SetSelectList("d.DocumentTitle, d.Id");
sqlObject.SetMaxRecords(20);
sqlObject.SetFromClauseInitialValue("Document", "d", false);
// Check the SQL statement.
System.Console.WriteLine("SQL: " + sqlObject.ToString());
// SearchScope インスタンスを作成// (オブジェクト・ストア・オブジェクトが存在すると仮定)
SearchScope search = new SearchScope(os);
// ページ・サイズ (Long) を設定し、照会の結果データのページに使用する。この値は
// pageSize パラメーターに渡される。null なら、
// ServerCacheConfiguration.QueryPageDefaultSize の値のデフォルトとなる。
int myPageSize = 100;
// プロパティー・フィルターを指定し、必要ならフィルター・パラメーターを使用する。
// プロパティーをフィルタリングしないなら、null でも構わない。
PropertyFilter myFilter = new PropertyFilter();
int myFilterLevel = 1;
myFilter.SetMaxRecursion(myFilterLevel);
myFilter.AddIncludeType(new FilterElement(null, null, null, FilteredPropertyType.ANY, null));
// 継続のパラメーターに (boolean) 値を設定。これは、結果データの
// 後続ページ用にリクエストを反復処理するかどうかを示す。
bool continuable = true;
// 指定したパラメーターを使用して fetchRows メソッドを実行
IRepositoryRowSet myRows = search.FetchRows(sqlObject, myPageSize, myFilter, continuable);
// 次に行のコレクションを反復処理すると、プロパティーにアクセスできる
int rowCount = 0;
foreach(IRepositoryRow row in myRows)
{
string docTitle = row.Properties.GetProperty("DocumentTitle").GetStringValue();
Id docId = row.Properties.GetProperty("Id").GetIdValue();
rowCount++;
System.Console.WriteLine(" row " + rowCount + ":");
System.Console.WriteLine(" Id=" + docId.ToString());
if (docTitle != null)
{
System.Console.WriteLine(" DocumentTitle=" + docTitle);
}
System.Console.WriteLine();
}
一般的なシーケンスと例については、SQL ステートメントの作成を参照してください。シーケンスと例については、複数のリポジトリーの検索を参照してください。
メタデータの検索
メタデータを検索するには、SearchScope.fetchSearchableClassDescriptions メソッドを使用します。fetchSearchableClassDescriptions メソッドは、ClassDescription オブジェクトのコレクションを戻します。このメソッドには、SearchSQL パラメーターはありません。メタデータに対して照会を実行する一般的なシーケンスを以下に示します。
Java の例
// SearchScope インスタンスを作成// (オブジェクト・ストア・オブジェクトが存在すると仮定)
SearchScope search = new SearchScope(os);
// 検索するメタデータを含むクラス名を指定。これは、
// 識別子 (シンボル名、表示名、またはオブジェクト ID) の、String 配列でなければならない
String[] myClassNames = new String[]{"Document", "Annotation"};
// Specify a property filter to use for the filter parameter, if needed.
// プロパティーをフィルタリングしないなら、null でも構わない。
PropertyFilter myFilter = new PropertyFilter();
int myFilterLevel = 1;
myFilter.setMaxRecursion(myFilterLevel);
myFilter.addIncludeType(new FilterElement(null, null, null, FilteredPropertyType.ANY, null));
// 指定したパラメーターを使用して fetchSearchableClassDescriptions メソッドを
// 実行
ClassDescriptionSet myMetadata = search.fetchSearchableClassDescriptions(myClassNames, myFilter);
C# の例
// SearchScope インスタンスを作成// (オブジェクト・ストア・オブジェクトが存在すると仮定)
SearchScope search = new SearchScope(os);
// 検索するメタデータを含むクラス名を指定。これは、
// 識別子 (シンボル名、表示名、またはオブジェクト ID) の、String 配列でなければならない
string[] myClassNames = new string[] { "Document", "Annotation" };
// Specify a property filter to use for the filter parameter, if needed.
// プロパティーをフィルタリングしないなら、null でも構わない。
PropertyFilter myFilter = new PropertyFilter();
int myFilterLevel = 1;
myFilter.SetMaxRecursion(myFilterLevel);
myFilter.AddIncludeType(new FilterElement(null, null, null, FilteredPropertyType.ANY, null));
// 指定したパラメーターを使用して fetchSearchableClassDescriptions メソッドを
// 実行
IClassDescriptionSet myMetadata = search.FetchSearchableClassDescriptions(myClassNames, myFilter);
シーケンスと例については、複数のリポジトリーの検索を参照してください。
保管済み検索を使用したオブジェクトの検索
保管済み検索を使用してリポジトリー内のオブジェクトを照会するには、シグニチャーの最初の引数として SearchSQL ではなく StoredSearch を指定して、SearchScope.fetchObjects メソッドを呼び出します。fetchObjects メソッドは、IndependentObject オブジェクトのコレクションを戻します。この例では、リポジトリーで終了する保管済み検索を実行します。
Java の例
// SearchScope インスタンスを作成// (オブジェクト・ストア・オブジェクトが存在すると仮定)
SearchScope search = new SearchScope(os);
// StoredSearch オブジェクトを取得
StoredSearch ss=Factory.StoredSearch.fetchInstance(os, new (Id( "{9FEC3C69-57B2-4E29-872A-0EE452881555}"), null);
// 検索パラメーターを設定。永続化された保管済み検索の実行時の変更が必要な場合のみ、検索テンプレート・パラメーターの指定が必要。
SearchTemplateParameters searchParams = new SearchTemplateParameters();
searchParams.setContent(null);
searchParams.setMaximumRecords(50);
SearchTemplateWhereProperty whereProp = new SearchTemplateWhereProperty();
whereProp.setLiteral("application/vnd.oasis.opendocument.text");
whereProp.setItemId("35");
ArrayList alWhereProps = new ArrayList();
alWhereProps.add(whereProp);
searchParams.setWhereProperties(alWhereProps);
SearchTemplateSelectProperty selectProp = new SearchTemplateSelectProperty();
selectProp.setSymbolicName ("DocumentTitle");
selectProp.setItemId("1");
selectProp.setSortLevel(0));
selectProp.setSortOrder(SortOrder.DESCENDING);
ArrayList alSelectProps = new ArrayList();
alSelectProps.add(selectProp);
searchParams.setSelectProperties(alSelectProps);
// ページ・サイズ (Long) を設定し、照会の結果データのページに使用する。この値は
// pageSize パラメーターに渡される。null なら、
// ServerCacheConfiguration.QueryPageDefaultSize の値のデフォルトとなる。
Integer myPageSize = new Integer(100);
// プロパティー・フィルターを指定し、必要ならフィルター・パラメーターを使用する。
// プロパティーをフィルタリングしないなら、null でも構わない。
PropertyFilter myFilter = new PropertyFilter();
myFilter.setMaxRecursion(1);
myFilter.addIncludeType(new FilterElement(null, null, null, FilteredPropertyType.SINGLETON_STRING, null));
// 継続のパラメーターに (boolean) 値を設定。これは、結果の最初のページの
// 末尾に達したとき、後続ページ用にリクエストを反復処理するかどうかを
// 示す。null または false なら、結果の単一ページのみが
// 返される。
Boolean continuable = Boolean.TRUE;
// 指定したパラメーターを使用して fetchObjects メソッドを実行
IndependentObjectSet myObjects = search.fetchObjects(ss, "document", searchParams, myPageSize, myFilter, continuable);
// 次にオブジェクトのコレクションを反復処理すると、プロパティーにアクセスできる
Iterator iterObjects = myObjects.iterator();
while (iterObjects.hasNext())
{
IndependentObject object = (IndependentObject) iterObjects.next();
Properties props = object.getProperties();
Iterator iterProps = props.iterator();
while (iterProps.hasNext() )
{
Property prop = (Property)iterProps.next();
System.out.print("¥nProperty: " + prop.getPropertyName() );
if ( prop.getObjectValue() != null )
System.out.print(" Value: " + prop.getObjectValue().toString() );
if (prop.getPropertyName().equalsIgnoreCase("FoldersFiledIn"))
{
if ( prop.getObjectValue() != null )
{
FolderSet fs = (FolderSet)prop.getIndependentObjectSetValue();
Iterator iterFs = fs.iterator();
while (iterFs.hasNext())
{
Folder folder = (Folder)iterFs.next();
System.out.print("¥r¥tFolder Name: " + folder.get_FolderName() +
" Folder Path: " + folder.get_PathName());
}
}
}
}
}
System.out.println("¥nFinished searchForObjects");
C# の例
// SearchScope インスタンスを作成// (オブジェクト・ストア・オブジェクトが存在すると仮定)
SearchScope search = new SearchScope(os);
// StoredSearch オブジェクトを取得
IStoredSearch ss = Factory.StoredSearch.FetchInstance(os, new Id( "{9FEC3C69-57B2-4E29-872A-0EE452881555}"), null);
// 検索パラメーターを設定。永続化された保管済み検索の実行時の変更が必要な場合のみ、検索テンプレート・パラメーターの指定が必要。
SearchTemplateParameters searchParams = new SearchTemplateParameters();
searchParams.Content=null;
searchParams.MaximumRecords=25;
SearchTemplateWhereProperty whereProp = new SearchTemplateWhereProperty();
whereProp.Literal="application/vnd.oasis.opendocument.spreadsheet";
whereProp.ItemId="35";
IList<SearchTemplateWhereProperty> ListWhereProps = new List<SearchTemplateWhereProperty>();
ListWhereProps.Add(whereProp);
searchParams.WhereProperties = ListWhereProps;
SearchTemplateSelectProperty selectProp = new SearchTemplateSelectProperty();
selectProp.SymbolicName = "DocumentTitle";
selectProp.ItemId="1";
selectProp.SortLevel=0;
selectProp.SortOrder=SortOrder.NONE;
IList<SearchTemplateSelectProperty> ListSelectProps = new List<SearchTemplateSelectProperty>();
ListSelectProps.Add(selectProp);
searchParams.SelectProperties = ListSelectProps;
// ページ・サイズ (Long) を設定し、照会の結果データのページに使用する。この値は
// pageSize パラメーターに渡される。null なら、
// ServerCacheConfiguration.QueryPageDefaultSize の値のデフォルトとなる。
int myPageSize = 100;
// プロパティー・フィルターを指定し、必要ならフィルター・パラメーターを使用する。
// プロパティーをフィルタリングしないなら、null でも構わない。
PropertyFilter myFilter = new PropertyFilter();
myFilter.SetMaxRecursion(1);
myFilter.AddIncludeType(new FilterElement(null, null, null, FilteredPropertyType.SINGLETON_STRING, null));
// 継続のパラメーターに (boolean) 値を設定。これは、結果の最初のページの
// 末尾に達したとき、後続ページ用にリクエストを反復処理するかどうかを
// 示す。null または false なら、結果の単一ページのみが
// 返される。
bool continuable = true;
// 指定したパラメーターを使用して fetchObjects メソッドを実行
IIndependentObjectSet myObjects = search.FetchObjects(ss, "document", searchParams myPageSize, myFilter, continuable);
// 次に行のコレクションを反復処理すると、プロパティーにアクセスできる
foreach (IIndependentObject obj in myObjects)
{
IProperties props = obj.Properties;
foreach (IProperty prop in props)
{
System.Console.Write("¥nProperty: " + prop.GetPropertyName());
if ( prop.GetObjectValue() != null )
System.Console.Write(" Value: " + prop.GetObjectValue().ToString());
if (prop.GetPropertyName().Equals("FoldersFiledIn"))
{
if ( prop.GetObjectValue() != null)
{
IFolderSet fs = (IFolderSet)prop.GetIndependentObjectSetValue();
foreach (IFolder folder in fs)
{
System.Console.WriteLine("¥n¥tFolder Name: " + folder.FolderName +
" Folder Path: " + folder.PathName);
}
}
}
}
}
パーティションの照会
IBM Content Search Services は、Content Engine リポジトリーにアーカイブされた E メール・メッセージなど、日付で区別されるドキュメントの大量の索引付けを処理するために、日付によるパーティション化をサポートしています。IBM Content Search Services は、特定の文字列プロパティーの特定の値を持つドキュメントのパーティション化、および日付と文字列の両方によるドキュメントのパーティション化をサポートしています。パーティション化を使用することによって、検索する必要のある IBM Content Search Services の索引数を削減できるので、照会の取得にかかる時間が短くなります。
日付によるパーティションを使用した照会
日付によるパーティション化を使用する IBM Content Search Services の索引パーティションを検索するには、照会の WHERE 節に、日付/時刻パーティション化プロパティーに対する条件が含まれている必要があります。含まれていない場合には、すべての索引またはコレクションが検索されます。例えば、ドキュメントをパーティション化する条件として「receivedDate」という名前のカスタム・プロパティーを持つクラスがあり、そのクラスが存在するオブジェクト・ストアはパーティション化プロパティーとして「receivedDate」を使用するように構成されているとします。この場合、以下の照会ステートメントを実行すると、パーティション化された索引またはコレクションに対する検索が開始します。
SELECT … FROM Document D INNER JOIN ContentSearch CS ON
D.This=CS.QueriedObject WHERE CONTAINS(*,'dog') AND
D.receivedDate >= 2008-10-26 AND D.receivedDate < 2009-03-25
上記の照会は、検索の範囲を receivedDate プロパティーで指定された値の範囲と重なり合う日付範囲を持つ索引またはコレクションのみに絞り込みます。指定された日付範囲と重なり合う索引またはコレクションがない場合、照会は結果を返しません。
検索を最適化するには、パーティション化プロパティー (上記の例では receivedDate) を参照する条件を、CONTAINS 節に続けて指定する必要があります。そうしないと、照会を構文解析した結果、CONTAINS 節で識別された CBR 索引データではなく、データベース全体をスキャンする検索となる可能性があります。
String パーティションを使用した照会
IBM Content Search Services の索引パーティションを検索するには、照会の WHERE 節に、文字列プロパティーに対する条件が含まれている必要があります。含まれていない場合は、すべての索引が検索されます。例えば、ドキュメントをパーティション化する条件として「tenant」という名前のカスタム・プロパティーを持つクラスがあり、そのクラスが存在するオブジェクト・ストアはパーティション化プロパティーとして「tenant」を使用するように構成されているとします。この場合、以下の照会ステートメントを実行すると、パーティション化された索引に対する検索が開始します。
SELECT ... FROM Document D INNER JOIN ContentSearch CS ON
D.This=CS.QueriedObject WHERE CONTAINS(*,'dog') AND
D.tenant='IBM'
検索の最良の方法
管理コンソールの使用
照会を作成したり、照会が意図したとおりに機能するかどうかを素早く検証したりするためには、Administration Console for Content Platform Engine 検索ツールを使用します。本書に記載されている照会の例を実行するときは、必ず SELECT 節にオブジェクト参照の「this」を含めてください。例えば、以下の照会を Query Builder に入力するときは、
SELECT d.Id FROM Document d WHERE d.DocumentTitle = 'MyDoc'
以下の形式を使用する必要があります。
SELECT d.this, d.Id FROM Document d WHERE d.DocumentTitle = 'MyDoc'
Administration Console for Content Platform Engineを使用した検索の詳細については、 『照会を使用したオブジェクトの検索 (Finding objects with queries)』を参照してください。
DB2® データベースの照会
DB2 テーブル・オーバーフロー・サポートがオブジェクト・ストアで使用可能になっている場合、特定の条件では DB2 データベースに対する照会は失敗します。詳細については、「DB2 テーブル・オーバーフロー・サポート: 照会の影響」を参照してください。
戻される行数の制限
特定のいくつかのプロパティーの値を設定することで、ユーザーが Content Engine サーバーへの要求を実行中に、過剰なメモリーが割り振られないようにすることができます。過剰なメモリーが割り振られると、メモリー制限が原因でサーバーの処理速度が低下する場合があります。
照会から返される行数を都合のよい行数に制限するには、その行数が戻されるように照会の行選択基準を指定します。または、ServerCacheConfiguration プロパティーの QueryPageMaxSize、QueryPageDefaultSize、および NonPagedQueryMaxSize を設定して、その行数を事前に決定しておきます。
SQL オプションの COUNT_LIMIT を使用して検索結果カウントを要求する照会の場合、ServerCacheConfiguration プロパティーの QueryCountDefaultSize および QueryCountMaxSize により、Content Engine がカウントする行数を制限します。
また、ObjectStore インターフェースには、照会で使用できる最大時間を制限するプロパティーが用意されています。DefaultQueryTimeLimit および MaxQueryTimeLimit プロパティーはクライアントからサーバーへの照会 RPC での時間制限を設定し、QueryDatabaseTimeout プロパティーはデータベース・レベルで照会実行を制限します。
索引処理されていない並べ替えおよび検索の回避
JOIN、WHERE、または ORDER BY 節では、索引処理されていない列の参照は避けてください。例えば、以下の照会は、Document.DocumentTitle (データベース列 DocVersion.xxx_documenttitle) の索引を作成することにより最適化します。
SELECT d.Id FROM Document d WHERE d.DocumentTitle = 'MyDoc'
また、検索対象列の値が索引を有効に利用できない場合、LIKE 演算子を含む WHERE 節も避けてください。 次に例を示します。
SELECT d.Id FROM Document d WHERE d.DocumentTitle LIKE '%abc'
この例では、DocumentTitle 列に対する索引が存在している場合でも、検索対象列の値の先頭にワイルドカード (「%」) があるため、照会は索引を使用できません。比較的少ない行数を返すように照会をコード化するには、ワイルドカードの前に十分な数の文字を置きます。検索ダイアログでは、ユーザーが「次の文字を含む」検索 (例: "%abc%") ではなく「次の文字から始まる」検索 (例: "abc%") を実行できるようにします。
索引を有効利用しない照会では、データベースがテーブルをロックする可能性があります。その照会の実行中は他のユーザーがテーブルを更新できなくなり、チェックインがタイムアウトになるなどの問題が発生する可能性があります。
索引処理されていない関数の大/小文字を区別しない比較の回避 (Oracle/DB2)
索引処理されていない列、または LOWER 関数を直接的にも間接的にも使用しない索引に属する列については、JOIN、WHERE、または ORDER BY 節から生じる列値の比較は避けてください。以下の状況でこの指示に従います。
- Oracle または DB2 をデータベース・エンジンとして使用するオブジェクト・ストアを操作した場合。
- ObjectStore.ForceCaseInsensitiveSearch プロパティーに true を設定して、大/小文字を区別しない検索を強制的に実行しており、Oracle または DB2 データベースが、もともと大/小文字を区別するように構成された場合 (したがって、ForceCaseInsensitiveSearch に true を設定すると、実際的な効果があります)。
DB2 の場合は、既存の列に LOWER 関数を適用して列を生成した後、生成された列の索引を作成します。Oracle の場合は、関数ベースの索引を作成します。例えば、索引 LOWER(DocVersion.xxx_documenttitle) を使用すると、以下の照会の効率が向上します。
SELECT d.Id FROM Document d WHERE d.DocumentTitle = 'MyDoc'
SELECT d.Id, d.DocumentTitle, d.Creator FROM Document d ORDER BY d.DocumentTitle
索引処理されていないプロパティー検索の回避
少なくとも 1 つの WHERE 条件プロパティーが選択可能で (返される行を制限します)、索引付けされていることを確認してください。例えば、以下の照会は、Document.DocumentTitle の索引を作成することにより最適化します。
SELECT d.Id FROM Document d WHERE d.DocumentTitle = 'MyDoc'
また、検索対象列の値が索引を有効に利用できない場合、LIKE 演算子を含む WHERE 節も避けてください。 次に例を示します。
SELECT d.Id FROM Document d WHERE d.DocumentTitle LIKE '%abc'
この例の場合、DocumentTitle 列に対する索引が存在しても、検索対象列の値の先頭にワイルドカード ("%") があるため、照会は索引を使用できません。比較的少ない行数を返すように照会をコード化するには、ワイルドカードの前に十分な数の文字を置きます。検索ダイアログでは、ユーザーが「次の文字を含む」検索 (例: "%abc%") ではなく「次の文字から始まる」検索 (例: "abc%") を実行できるようにします。
索引を有効利用しない照会では、データベースがロックをページおよびテーブル・レベルにまでエスカレートさせる可能性があります。その照会の実行中は他のユーザーがテーブルを更新できなくなり、チェックインがタイムアウトになるなど、他の関連する問題が発生する可能性があります。
不要なオブジェクト・タイプの検索の回避
サブクラス・タイプの検索が不要な場合、その検索を避けるには、EXCLUDESUBCLASSES 演算子を照会に追加します (デフォルトでは、照会には暗黙的な INCLUDESUBCLASSES 演算子が含まれています)。
例えば、暗黙的な INCLUDESUBCLASSES の結果として、以下の照会では、Document クラスに属するオブジェクトに加えて、Document サブクラスに属するオブジェクトも戻されます。
SELECT d.Id FROM Document d WHERE DocumentTitle = 'MyDoc'
Document クラスからのオブジェクトのみが必要である場合は、以下のように照会を作成するのではなく、
SELECT d.Id FROM Document d WHERE DocumentTitle = 'MyDoc' AND ISCLASS(d, Document)
以下のように EXCLUDESUBCLASSES 演算子を使用します。
SELECT d.Id FROM Document d WITH EXCLUDESUBCLASSES WHERE DocumentTitle = 'MyDoc'
EXCLUDESUBCLASSES および INCLUDESUBCLASSES 演算子の詳細については、SQL 構文のリファレンスを参照してください。
不要な列の戻りの回避
テーブルの列の一部のみが必要なときは、すべての列が戻されることを回避します。例えば、以下のようにするのではなく、
SELECT d.* FROM Document d WHERE d.DocumentTitle = 'MyDoc'
以下の例のように必要な列を指定します。
SELECT d.Id FROM Document d WHERE d.DocumentTitle = 'MyDoc'
この照会によって、ネットワーク経由で転送されるデータの量が最小限に抑えられます。また、SELECT 節のすべての列の索引を作成すると、照会のデータが直接索引から取得されるため、行に対する物理的な検索が不要になります。
複雑なテーブル・リンクの回避
照会で 3 つ以上のテーブルを参照することは避けてください。テーブル数が増えると、照会のパフォーマンスが低下し、パフォーマンス調整の作業も複雑になります。
結果行の不要な並べ替えの回避
不要な ORDER BY 節は避けてください。索引処理された検索の副次効果のため、照会が特定の順序で結果を戻すことが信頼できるときは、明示的な行の並べ替えは不要です。 例えば、以下の照会の ORDER BY 節は不要です。なぜなら、(parent_container_id, name) の Container テーブル用の複合索引が存在するからです。
SELECT f.FolderName FROM Folder f WHERE f.Parent = Object('/sub1/sub1a')
AND f.IsHiddenContainer = false ORDER BY f.FolderName
継続不可能な検索を使用する場合は、複合索引内の既存の列で ORDER BY 節または ORDER BY f.Parent, F.FolderName 節のいずれかを削除することをお勧めします。
継続可能な検索を使用する場合は、ORDER BY f.Parent, F.FolderName 節を使用することをお勧めします。そうしない場合は、ORDER BY Id が自動的に検索に追加される際に、ソート操作が必要です。
索引付けされたプロパティー OrderDate を検索のベースにしない、別の例を以下に示します。
select D.OrderDate, D.OrderNumber from Document d where d.OrderDate < ? ORDER BY D.OrderNumber
検索結果が OrderNumber でのソートを必要としない場合は、代わりに OrderDate で検索します。
select D.OrderDate, D.OrderNumber from Document d where d.OrderDate < ? ORDER BY D.OrderDate
ORDER BY 節に OrderDate を使用すると、以下のようになります。
- 照会で OrderDate 索引を使用するようになるため、照会の中でソート・ステップを使用する必要はありません。
- データベース照会オプティマイザーは OrderDate に対して索引を使用する傾向があります。
- 継続可能な検索を使用する場合、「OrderDate, Id」に対する複合索引があるときには、SORT 操作が削除されるようにするために ORDER BY D.OrderDate 節が必要です。Content Engine により、ORDER BY Id が自動的に検索に追加されます。
LIKE 演算子と「大文字小文字を区別しない検索を強制」を同時に使用するプロパティー検索の回避 (IBM DB2 for Linux, UNIX and Windows)
オブジェクト・ストアに対して「大文字小文字を区別しない検索を強制」(FCIS) を有効にすると、Content Engine の照会は、WHERE 節の文字列型の列および文字列値に対して LOWER 演算子を指定して実行されます。検索を高速に実行するためには、LOWER 関数を使用して生成される列に対して、索引を作成する必要があります。FCIS を使用する場合のプロパティーの索引付けについての説明は、大/小文字を区別しない検索でのデータベース索引の作成 (Creating database indexes for case-insensitive search) を参照してください。
ただし、DB2 for Linux, UNIX and Windows データベースでは、LIKE 演算子が使用されるときに FCIS が有効な場合、検索で索引が使用されないことに注意してください。これは、DB2 for Linux, UNIX and Windows の制限です。DB2 では、LOWER を使用する照会条件を、その列に対して生成された索引にアクセスするように書き直すことはできません。この制限により、LIKE 演算子と FCIS を使用したときの検索は低速になります。
WHERE myProperty LIKE 'abc%'
したがって、DB2 for Linux, UNIX and Windows で FCIS を指定する場合は、単一値プロパティーの検索および特に複数値プロパティーの検索に対しては、可能な限り、LIKE の使用を避けてください。
データベース・タイプやオブジェクト・ストアでの FCIS の設定に関係なく、プロパティー検索の構成が不十分な場合、取り出しのパフォーマンスが低下することに注意してください。 次に例を示します。
- 列の索引を使用できないプロパティー検索は避けてください。次の例のような、先頭にワイルドカードを指定した LIKE 演算子を使用する照会では、データベース索引は使用できません。
WHERE myListProperty LIKE '%abc%'
検索を高速化するためには次の例のようにして、LIKE の使用を回避します。WHERE 'abc' IN myListProperty
事前定義された SQL 演算子のリストを備えている IBM FileNet Workplace XT や IBM Content Navigator クライアント・アプリケーションを使用する場合は、CONTAINS 演算子の使用や LIKE 演算子で先頭にワイルドカードを指定することを避けてください。 代わりに、INCLUDES または INCLUDE ALL 演算子を使用してください。
詳細については、『索引処理されていないプロパティー検索の回避』および『索引処理されていない並べ替えおよび検索の回避』を参照してください。
- OR 演算子で区切った複数のリスト・プロパティー条件の代わりに、INTERSECTS 演算子を使用します。 「複数値プロパティーを含む照会のための INTERSECTS 演算子の使用」を参照してください。
サブクエリーの回避 (Oracle)
データベース・エンジンとして Oracle を使用するオブジェクト・ストアを照会するときは、サブ照会、およびサブ照会を間接的に生成する演算子の使用は必ず避けてください。Oracle オプティマイザーには、サブクエリー関連の潜在的な問題があります。具体的には、サブクエリーの代わりに、INNER JOIN を使用します (ただし、 『複雑なテーブル・リンクの回避』にあるガイドラインも参照してください)。例えば、以下に示す潜在的に低速な照会は、
SELECT d.Id FROM Document d WHERE d.Id IN (SELECT b.Bp8ObjectGuid FROM Bp8Attachment b)
以下に示す機能的に同等のクエリーに書き換えます。
SELECT d.Id FROM Document d INNER JOIN Bp8Attachment b ON d.Id = b.Bp8ObjectGuid
また、Content Engine は、INFOLDER 演算子を実装するためにサブクエリーを使用するため、この演算子の使用は避けてください。例えば、以下の照会は、
SELECT f.FolderName FROM Folder f WHERE f.this INFOLDER '/sub1/sub1a' AND f.IsHiddenContainer = false
以下のように書き換えます。
SELECT f.FolderName FROM Folder f WHERE f.Parent = OBJECT('/sub1/sub1a') AND f.IsHiddenContainer = false
また、以下の照会は、
SELECT d.id FROM Document d WHERE d.This INFOLDER '/sub1/sub1a'
以下のようなより効率性の高い形式に書き換えます。
SELECT d.Id FROM Document d INNER JOIN ReferentialContainmentRelationship r ON d.This = r.Head
WHERE r.Tail = OBJECT('/sub1/sub1a')
INFOLDER 演算子の詳細については、SQL 構文のリファレンスを参照してください。
複数値プロパティーを含む照会のための INTERSECTS 演算子の使用
OR 節の中に 2 つ以上の複数値プロパティー条件を含む照会は避けてください。このような照会を使用すると、データベース・エンジンが最適な照会計画を作成することが困難な場合があるため、照会のタイムアウトが発生したり、照会のパフォーマンスが許容可能な範囲を超えて低下したりする可能性があります。
例えば、次のような照会を使用しないでください。
SELECT d.Id FROM Document WHERE 'value1' IN ListPropertyString OR 'value2' IN ListPropertyString OR 'value3' IN ListPropertyString
代わりに、以下のように INTERSECTS 演算子を使用してください。これによりパフォーマンスが大幅に改善されます。
SELECT d.Id FROM Document WHERE ListPropertyString INTERSECTS ('value1', 'value2', 'value3')
詳細については、『INTERSECTS 演算子』を参照してください。
セキュリティー・フィルタリングに伴う検索遅延の回避
大きな結果セットに対し、セキュリティーのためにドキュメントをフィルタリングして少数の行に絞り込む検索は実行しないでください。
オブジェクトがデータベース・エンジンから取得された後で、Content Engine はセキュリティーをオブジェクトに適用し、オブジェクトへのユーザー・アクセス権限を削除します。検索によってデータベース内の多数 (数千行を超す) の行が検出された場合、すべての行の取得にかかる合計時間 (データベースから Content Engine へのラウンド・トリップ) がかなり長くなる可能性があります。検索が続行可能であり、セキュリティー・フィルタリングがほとんど行われない状態の場合、1 番目のページは迅速に返されますが、セキュリティー・フィルタリングによって抽出される行数が大幅に限定される場合、ページにデータを取り込むために多数の行を取得する必要があります。
このような状態を回避するため、限定プロパティーまたはその他のフィルタリング対象に対する基準 (特定のフォルダーに属していることなど) が検索基準に含まれるように、アプリケーションを設計してください。例えば、myRole などのカスタム・プロパティーを作成し、照会にこのプロパティーを追加の基準として「WHERE myProperty = 'myRole'」の形式で追加することができます。また、ドキュメントの検索範囲を特定のフォルダーに限定することもできます (例:「WHERE ... INFOLDER 'myFolder'」)。
照会構文
SQL ステートメントを作成する方法の詳細については、SQL 構文のリファレンスを参照してください。 SQL ステートメントは、IBM FileNet 標準に従っている必要があります。FileNet 標準は総じて SQL-92 に準拠しており、一部 IBM FileNet 独自の構成体に拡張があります。