我正在使用CQ5的SimpleSearch类来进行搜索实现。我的一个要求是我必须检查标签是否存在(对于一种懒惰的身份验证形式)。这很简单。问题在于我希望检查这个标签是否在“jrc:content / cq:tags”或“jcr:content / metadata / cq:tags”中。因为我一直无法这样做。任何建议将不胜感激。谢谢!
以下是代码:
Predicate tagPredicate;
Cookie[] tagsFromCookie = slingRequest.getCookies();
tagPredicate = new Predicate("tags", "tagid");
tagPredicate.set("property", "jcr:content/cq:tags");
for (Cookie cookie : tagsFromCookie) {
if (cookie.getName().contains(CREDENTIALS)) {
tagPredicate.set("tagid",
(cookie.getValue().replaceAll("---", ":")));
search.addPredicate(tagPredicate);
}
}
答案 0 :(得分:4)
我自己没有使用过SimpleSearch
机制,但是,文档说明你可以创建一个包含多个谓词的PredicateGroup
(Predicate
的子类),并且可以指定逻辑通过调用setAllRequired()
来运算符(AND / OR)。
http://dev.day.com/docs/en/cq/5-3/javadoc/com/day/cq/search/PredicateGroup.html
也许你可以试试:
PredicateGroup group = new PredicateGroup("tags");
// This will set operator between each predicate to OR
group.setAllRequired(false);
Predicate tagPredicate = new Predicate("tags");
tagPredicate.set(JcrPropertyPredicateEvaluator.OPERATION, JcrPropertyPredicateEvaluator.OP_LIKE);
tagPredicate.set(JcrPropertyPredicateEvaluator.PROPERTY, "./jcr:content/cq:tags");
tagPredicate.set(JcrPropertyPredicateEvaluator.VALUE, cookieValue);
group.add(tagPredicate);
Predicate metaTagPredicate = new Predicate("metatags");
metaTagPredicate.set(JcrPropertyPredicateEvaluator.OPERATION, JcrPropertyPredicateEvaluator.OP_LIKE);
metaTagPredicate.set(JcrPropertyPredicateEvaluator.PROPERTY, "./jcr:content/metadata/cq:tags");
metaTagPredicate.set(JcrPropertyPredicateEvaluator.VALUE, cookieValue);
group.add(metaTagPredicate);
search.addPredicate(group);
// To debug and view your predicate tree you can invoke toString() on your predicate group
编辑:忘记提及JcrPropertyPredicateEvaluator
,您可以执行与jcr:like()
类似的操作。对于jcr:contains()
,您可能希望使用全文评估程序。
或者,您可以直接构建并执行JCR查询。我发现它比创建谓词和使用QueryBuilder API
要简单得多。这是一个非常简单的XPath示例:
StringBuilder queryBuilder = new StringBuilder();
queryBuilder.append("/jcr:root//*[jcr:contains(@cq:tags,");
queryBuilder.append(cookieValue);
queryBuilder.append(")] OR [jcr:contains(@metadata/cq:tags,");
queryBuilder.append(cookieValue);
queryBuilder.append(")]);
QueryManager manager = session.getWorkspace().getQueryManager();
Query query = manager.createQuery(queryBuilder.toString(), "xpath");
QueryResult result = query.execute();
// From the result you can then retrieve a NodeIterator to loop through the result set
http://www.day.com/maven/jsr170/javadocs/jcr-2.0/javax/jcr/query/Query.html
答案 1 :(得分:0)
我会为cq:tags做一个简单的jcr query任何节点的属性值,所以
//element(*, nt:unstructured)[@cq:tags=COOKIEVALUE]
然后,您可以处理结果以计算the containing page或资产