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 字段中使用哪个属性。有没有办法形成一个谓词,在排序期间对页面和资产使用不同的属性值。请让我知道我们是否可以在单个查询中实现这一目标。

问候, Shailesh

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 列出并进行比较器排序

于 2015-09-14T08:17:09.053 回答