2016-09-30 97 views
1

我正在使用Querybuilder搜索使用特定標記標記的頁面。問題是,Querybuilder正在創建一個xpath查詢,該查詢沿着主標籤搜索標籤的所有子標籤。我希望它僅搜索父標記而不搜索子標記。服裝和geometrixx媒體:使用PredicateGroup如果組件配置爲搜索geometrixx,戶外所有tags--Querybuilder僅搜索單個標記

map.put("path", searchPath); 
map.put("type", "cq:Page"); 
map.put("orderby", "@jcr:content/cq:lastModified"); 
PredicateGroup tagsPredicateGroup = new PredicateGroup(); 
PredicateGroup searchGroup = PredicateGroup.create(map); 
PredicateGroup tagsPredicateGroup = new PredicateGroup(); 
     tagsPredicateGroup.setAllRequired(false); 
     if (tagsArray != null && tagsArray.length > 0) { 
      for (Tag tag : tagsArray) { 
       tagsPredicateGroup.add(createSingleTagPredicate(tag)); 
      } 
     } 
searchGroup.add(tagsPredicateGroup); 
Query query = queryBuilder.createQuery(searchGroup, session); 
query.setHitsPerPage(10); 
query.setStart(0); 

private PredicateGroup createSingleTagPredicate(Tag tag) { 
     Map<String, String> tagMap = new HashMap<String, String>(); 
     tagMap.put("tagid.property", "jcr:content/cq:tags"); 
     tagMap.put("tagid", tag.getTagID()); 
     return PredicateGroup.create(tagMap); 
    } 

結合事件標籤;那麼它還會返回那些標記爲geometrixx-outdoors的頁面:服裝/大衣和geometrixx-media:活動/節日。我如何才能使用querybuilder僅搜索父標記而不搜索子標記?

+0

我會考慮使用TagManager對象https://docs.adobe.com/docs/en/cq/5-6-1/javadoc/com/day/cq/tagging/TagManager.html find(java。 lang.String,java.lang.String [])獲取與特定路徑下的tagID相匹配的所有頁面 – bfitzpatrick

回答

1

標記謂詞被設計用於獲取子標記,它是第二種形式(基於路徑)。如果你不想要這個,你想要一個完全匹配,你需要查詢它像一個普通的屬性。你的查詢地圖應該看起來與此類似。

map.put("path","/content/geometrixx-outdoors"); 
map.put("type","cq:Page"); 
map.put("property","jcr:content/cq:tags"); 
map.put("property.value","geometrixx-outdoors:apparel"); 

如果您需要查詢多個標籤ID的應或運算=>( 「A」 或 「B」 或 「C」)

map.put("path","/content/geometrixx-outdoors"); 
map.put("type","cq:Page"); 
map.put("property","jcr:content/cq:tags"); 
map.put("property.1_value","geometrixx-outdoors:apparel"); 
map.put("property.2_value","geometrixx-media:events"); 
map.put("property.3_value","mynamespace:my-tag"); 

如果需要查詢多標籤的ID應該是AND'd =>( 「A」 和 「B」 和 「C」)

map.put("path","/content/geometrixx-outdoors"); 
map.put("type","cq:Page"); 
map.put("property","jcr:content/cq:tags"); 
map.put("property.and","true"); 
map.put("property.1_value","geometrixx-outdoors:apparel"); 
map.put("property.2_value","geometrixx-media:events"); 
map.put("property.3_value","mynamespace:my-tag"); 

重要事項,我只顯示在僅標識的查詢。如果您不想錯過任何潛在的結果,則還應該將有問題標記的路徑添加到查詢中,以便您在問題字段內同時查詢「標記ID」和「標記路徑」,因爲標記路徑爲「標記」的有效值。