2014-03-19 43 views
1

我想搜索整個內容樹,但沒有搜索基於「不搜索」屬性的特定發行版。如何在查詢生成器查詢中添加'哪裏不是'

Query Builder API頁面除AND和OR外沒有任何引用。

是否可以從搜索中排除路徑,或者我可以只顯式包含路徑?

前三行是「/ content AND/content/path/es」。我想「/內容,而不是(/內容/路/ ES)」

map.put("group.1_path", "/content"); 
map.put("group.2_path", "/content/path/es"); 
map.put("group.p.or","false"); 

我已經嘗試了未來兩年都真假,他們沒有任何效果。

map.put("group.2_path.p.not", "true"); 
map.put("group.2_path.not", "true"); 
map.put("group.2_path", "not('/content/path/es')"); 

我找不到任何其他文件提到'不'或'!'可能會被用來代替。

回答

3

是的,這是可能的。但不完全如你所想。

您可以使用屬性謂詞評估程序排除具有某些屬性的頁面。

例如,如果要排除具有屬性「donotsearch」在JCR網頁:內容節點,那麼你可以使用屬性操作存在

map.put("path", "/content/geometrixx/en/toolbar"); 
map.put("type", "cq:Page"); 
/* Relative path to the property to check for */ 
map.put("property", "jcr:content/donotsearch"); 
/* Operation to perform on the value of the prop, in this case existence check */ 
map.put("property.operation", "exists"); 
/* Value for the prop, false = not, by default it is true */ 
map.put("property.value", "false"); 

這將導致以下XPath查詢

進行查詢
/jcr:root/content/geometrixx/en/toolbar//element(*, cq:Page) 
[ 
not(jcr:content/@donotsearch) 
] 

,但如果你想排除與該屬性donotsearch一定值頁面,則可以更改上面的查詢如下圖所示

map.put("property", "jcr:content/donotsearch"); //the property to check for 
map.put("property.operation", "equals"); // or unequals or like etc.. 
map.put("property.value", "/*the value of the property*/"); 

您可以參考docs找到許多關於查詢的其他信息。

+0

是有辦法排除基於單個網頁屬性整支?我的主要目標是搜索除特定分支以外的整個樹。在我的例子中,「content/path/es」有屬性,所以我想跳過整個分支。 – Reafexus

+0

據我所知,我不認爲這是可能的。也許你可能需要執行兩個單獨的查詢來實現這一點。 – rakhi4110

+0

這是相當不幸和一個奇怪的疏忽。謝謝。 – Reafexus

2

我不確定您使用的是什麼版本的CQ(鏈接到5.4文檔),但是在5.5和更高版本中,PredicateGroup類有一個setNegated方法來排除可以匹配定義的組的結果。

你不能設置一個單獨的謂詞否定,但有什麼可以阻止你只謂詞創建一組要否定:

Predicate pathPredicate = new Predicate("path").set("path", "/content/path/es"); 
PredicateGroup doNotSearchGroup = new PredicateGroup(); 

doNotSearchGroup.setNegated(true); 
doNotSearchGroup.add(pathPredicate); 

Query query = queryBuilder.createQuery(doNotSearchGroup); 

編輯:只是爲了更新您的評論,您應該能夠將PredicateGroup添加到另一個PredicateGroup(因爲PredicateGroupPredicate的子類)。所以一旦你有你的否定組,將它與路徑搜索結合起來:

Predicate pathPredicate = new Predicate("path"); 
pathPredicate.set("path", "/content"); 

PredicateGroup combinedPredicate = new PredicateGroup(); 
combinedPredicate.add(pathPredicate); 
combinedPredicate.add(doNotSearchGroup); 

Query query - queryBuilder.createQuery(combinedPredicate); 
+0

這個問題是我需要做兩個查詢。一個否定,一個不是,他們加入(或差異)他們,我有同樣的麻煩找到一種方法來加入兩個查詢,因爲我發現如何否定謂詞。 – Reafexus

+0

您應該可以將這些組合並在一個超級組中 - 請參閱上面的編輯。 – anotherdave

1

這是非常簡單的實現。 使用

map.put("group.p.not",true) 
map.put("group.1_path","/path1/where/you/donot/want/to/search") 
map.put("group.2_path","/path2/where/you/donot/want/to/search") 
0

我碰到了同樣的問題,雖然我不能完全解決這個問題,我能夠拿出使用組解決方法和不平等的運營商。例如:

path=/var/xxx 

1_property=jcr:primaryType 
1_property.value=rep:ACL 
1_property.operation=unequals 

2_property=jcr:primaryType 
2_property.value=rep:GrantACE 
2_property.operation=unequals 

btw,map.put(「group.p.not」,true)不適用於我。

該鏈接有很多有用的信息:https://hashimkhan.in/2015/12/02/query-builder/