2012-09-07 5 views
2

검색 구현을 위해 CQ5의 SimpleSearch 클래스를 사용하고 있습니다. 내 요구 사항 중 하나는 (게으른 인증 형식의) 태그가 있는지 확인해야한다는 것입니다. 이것은 간단합니다. 문제는이 태그가 "jrc : content/cq : tags"또는 "jcr : content/metadata/cq : tags"에 있는지 확인하고 싶습니다. 그래서 나는 그렇게 할 수 없었습니다. 모든 조언을 크게 주시면 감사하겠습니다. 감사! 여러 조건을 포함하는 PredicateGroup (Predicate의 서브 클래스)를 만들 수 있습니다, 그리고를 지정할 수 있습니다, 문서 상태CQ5에서 여러 태그 검색

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

나는 SimpleSearch 메커니즘에게 자신을 사용하지 않은,하지만 : 여기

코드입니다 논리 연산자 (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 쿼리를 직접 실행할 수도 있습니다. 나는 그것이 술어를 만들고보다 QueryBuilder API을 사용하는 것보다 훨씬 간단하다는 것을 알았다.

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

0

내가 CQ에 대한 간단한 jcr query 할 것이다 : 어떤 노드의 태그 속성 값, 그래서

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

그런 다음 결과를 처리 할 수 ​​있습니다 여기에 아주 간단한 XPath를 예입니다 the containing page 또는 에셋

을 계산하려면