我正在尝试对所有Cq:Page和dam进行自由文本搜索:资产的排序是最后一次修改。 我创建了搜索查询,如下所示:
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
答案 0 :(得分: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
答案 1 :(得分:0)
这可以通过创建自定义AbstractPredicateEvaluator并使用您自己的比较器覆盖getOrderByComparator来完成。然后,您可以通过调用Query为您的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();