0

すべての Cq:Page と dam:Asset でフリーテキスト検索を実行しようとしています。順序は最後に変更されています。以下のような検索用クエリを作成しました。

1_group.p.or=true
1_group.1_type=cq:Page
1_group.2_type=dam:Asset
2_group.p.or=true
2_group.1_path=/content
2_group.2_path=/content/dam
fulltext=text
p.limit=-1

ここで、最終変更に基づいて結果を並べ替える必要があります。しかし、cq:Page にはプロパティ jcr:content/cq:lastModified があり、dam:Asset にはプロパティ jcr:content/jcr:lastModified があるため、述語の orderby フィールドでどのプロパティを使用すればよいかわかりません。ソート中にページとアセットに異なるプロパティ値を使用する述語を形成する方法はありますか? 1 回のクエリでこれを達成できるかどうか教えてください。

よろしく、シャイレッシュ

4

2 に答える 2

1

これは、カスタムAbstractPredicateEvaluatorを作成し、独自のコンパレータでgetOrderByComparatorをオーバーライドすることで実行できます。次に、 registerPredicateEvaluatorを呼び出して、クエリのカスタム述語エバリュエーターを登録します。

以下の例では、プロパティに好きなものを使用できcustomSort.sortbyます。これは、コンパレータが複数の種類の並べ替えを処理する場合に役立ちます。を介して述語からこの情報を取得できますpredicate.get("sortby")

QueryBuilder builder = resourceResolver.adaptTo(QueryBuilder.class);
Map<String, String> params = new HashMap<String, String>();
params.put("1_group", "true");
params.put("1_group.1_type", "cq:Page");
params.put("1_group.2_type", "dam:Asset");
params.put("2_group.p.or", "true");
params.put("2_group.1_path", "/content");
params.put("2_group.2_path", "/content/dam");
params.put("fulltext", text);
params.put("p.limit", "-1");
params.put("customSort.sortby", "last-modified");
PredicateGroup pg = PredicateGroup.create(params);
Query query = builder.createQuery(pg, resourceResolver.adaptTo(Session.class));
query.registerPredicateEvaluator("customSort", new CustomSortPredicateEvaluator());
SearchResult result = query.getResult();
于 2015-09-15T14:46:08.920 に答える
0

それらは異なる型 (cq:lastModified & jcr:lastModified) であるため、方法はありません。このように SQL2 を使用しても (SELECT p.* FROM [nt:base] AS p WHERE ISDESCENDANTNODE(p, '/content') AND ( p.[jcr:primaryType]='dam:Asset' OR p.[jcr:primaryType]='cq:Page')) ORDER BY を使用する方法はありません。

並べ替えには Java コードを使用する必要があります。クエリを保持し、QueryResult を List に取得して Comparator Sort を実行します

于 2015-09-14T08:17:09.053 に答える