intra-mart Accel Documents プログラミングガイド 第7版 2018-04-01

文書の検索

概要

検索機能について記載します。

サンプルプログラム

名前属性と更新日時属性の値を指定して文書を検索するコードのサンプルです。

// 文書の名前属性の検索条件に指定する値を定義します。
String documentName = "documentA";

// 文書の更新日時の検索条件に指定する値を定義します。
Calendar cal = Calendar.getInstance();
cal.add (Calendar.MONTH, -1);
Date lastMonth = cal.getTime();

// 文書クラスのクラス識別子を定義します。
ClassId documentClassId = KnSystemSchemas.DOCUMENT_CLASS_ID;

// 名前属性の属性識別子を定義します。
AttributeId nameAttrId = KnSystemSchemas.OBJECT_NAME_ATTRIBUTE_ID;

// 更新日時属性の属性識別子を定義します。
AttributeId modifiedDateAttrId = KnSystemSchemas.MODIFIED_DATE_ATTRIBUTE_ID;

// 検索対象クラスの情報をSetで用意します。
Set<ClassId> documentClassIds = new HashSet();
documentClassIds.add(documentClassId);

// フェッチしてくる属性の情報をSetで用意します。
Set<AttributeId> fetchAttributeIds = new HashSet();
fetchAttributeIds.add(nameAttrId);

// フェッチ条件を生成します。
KnFetch fetch = new KnFetch(fetchAttributeIds, false, false);

// 名前属性の検索条件を生成します。
AttributeCondition<String> nameCondition =
   new AttributeCondition<String>(QueryUtil.value(nameAttrId), QueryUtil.eq(documentName));

// 更新日時の検索条件を生成します。(ge : ~以降)
AttributeCondition<Date> modifiedDateCondition =
   new AttributeCondition<Date>(QueryUtil.value(modifiedDateAttrId), QueryUtil.ge(lastMonth));

// 名前属性と更新日時属性のAND条件を生成します。
List<Term<QueryCondition>> conditions = new ArrayList<Term<QueryCondition>>();
conditions.add(nameCondition);
conditions.add(modifiedDateCondition);
KnQuery query = new KnQuery(QueryUtil.and(conditions), documentClassIds, null, null);

 // 名前によるソート条件を生成します。
 AttributeSortOrder attrSortOrder = new AttributeSortOrder(nameAttrId, Direction.ASCEND);
 List<SortOrder> sortOrders = new ArrayList<SortOrder>();
 sortOrders.add(attrSortOrder);
 SortOrderList sortOrderList = new SortOrderList(sortOrders, null);

// 検索を実行します。
KnLimitedIterable<KnSearchResult> resultIterable =
             session.searchObjects(query, fetch, SortOrderList.EMPTY, 1000);

// 検索結果を標準出力に書き出します。
try {
   for (KnSearchResult result : resultIterable) {
      KnObject object = result.getObject();
      System.out.println(object.getName());
   }
} finally {
   resultIterable.close();
}

以上のコードで1ヶ月前以降に更新された文書を名前の完全一致で検索した結果が取得できます。

なお、検索結果は名前の昇順で並んでいます。

コラム

KnLimitedIterableなどのイテラブルは、不要になったら、必ずクローズするようにします。