java - 在 CQ5 中搜索多个标签

标签 java search aem

我正在使用 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);
        }
    }

最佳答案

我自己没有使用过 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

关于java - 在 CQ5 中搜索多个标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12322312/

相关文章:

java - JSF/莫贾拉 2.0.2 : ui:repeat is totally broken when updating via AJAX

带有自定义比较器的 java TreeSet 不起作用

AEM 的富文本 (RTE) 将作者域添加到链接之前?

java - 是否有类似于 GroovyConsole 的 Java 控制台/编辑器?

java - 在 Java (Android) libgdx 中,触摸时绘制/渲染动画

php - 计算搜索查询返回的行数

search - 如何(递归)搜索 Windows 7 中的所有文件内容?

algorithm - 分面搜索的算法是什么?

adobe - ClientLibraryFolder类型的embed []和dependencies []之间有什么区别?

aem - Sling 映射重写规则不会重写元标记中的路径