2

CQ5のSimpleSearchクラスを使用して検索を実装しています。私の要件の1つは、タグが存在するかどうかを確認する必要があることです(遅延形式の認証の場合)。これは簡単です。問題は、このタグが「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);
        }
    }
4

2 に答える 2

4

SimpleSearch私自身はこのメカニズムを使用していませんが、ドキュメントには、複数の述語を含むPredicateGroup(のサブクラスPredicate) を作成でき、 を呼び出すことで論理演算子 (AND/OR) を指定できると記載されていsetAllRequired()ます。

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 クエリを直接ビルドして実行することもできます。Predicate を作成して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

于 2012-09-11T20:21:54.903 に答える
0

どのノードの cq:tags プロパティ値に対しても単純なjcr クエリを実行するので、

//element(*, nt:unstructured)[@cq:tags=COOKIEVALUE]

その後、結果を処理して、含まれているページまたはアセットを計算できます。

于 2014-12-11T17:16:23.723 に答える