我想搜索整个内容树,但不是搜索在其基础上具有“请勿搜索”属性的特定发辫。
Query Builder API页面除了AND和OR之外没有引用任何内容。
是否可以从搜索中排除路径,还是只能显式包含路径?
前三行是“/ content AND / content / path / es”。我想要“/ content AND NOT(/ content / path / 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')");
我找不到任何提及“不”或“!”的其他名称的文档。可能会改为使用。
答案 0 :(得分:3)
是的,这是可能的。但不完全是你尝试的方式。
您可以使用属性谓词评估程序排除具有某些属性的页面。
对于前。如果要在其jcr:content节点中排除具有“donotsearch”属性的页面,则可以使用属性操作查询它,因为存在
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找到很多关于查询的其他信息。
答案 1 :(得分: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(因为PredicateGroup
是Predicate
的子类)。所以,一旦你有了被否定的群体,将它与路径搜索结合起来:
Predicate pathPredicate = new Predicate("path");
pathPredicate.set("path", "/content");
PredicateGroup combinedPredicate = new PredicateGroup();
combinedPredicate.add(pathPredicate);
combinedPredicate.add(doNotSearchGroup);
Query query - queryBuilder.createQuery(combinedPredicate);
答案 2 :(得分: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")
答案 3 :(得分: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
顺便说一下,map.put(" group.p.not",true)对我没用。
此链接包含许多有用信息:https://hashimkhan.in/2015/12/02/query-builder/