Querybuilder ищет только один тег
Я использую Querybuilder для поиска страниц, которые помечены определенными тегами. Проблема в том, что Querybuilder создает запрос xpath, который ищет все дочерние теги тега вместе с основным тегом. Я хочу, чтобы он искал только родительский тег, а не дочерние теги. Использование PredicateGroup для объединения всех тегов:
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);
}
Если компонент настроен на поиск geometryrixx-outdoors: одежда и geometryrixx-media: теги событий; затем он также возвращает те страницы, которые помечены GeometrixX-на открытом воздухе: одежда / пальто и geometryrixx-media: события / фестивали. Как я могу заставить его искать только родительский тег, а не дочерний тег с помощью querybuilder?
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");
Если вам нужно запросить несколько идентификаторов тегов, которые должны быть OR'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.1_value","geometrixx-outdoors:apparel");
map.put("property.2_value","geometrixx-media:events");
map.put("property.3_value","mynamespace:my-tag");
Если вам нужно запросить несколько идентификаторов тегов, которые должны быть 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");
Важное замечание: я показывал запросы только по идентификатору. Если вы не хотите пропустить какие-либо потенциальные результаты, вы должны также добавить в запрос путь к тегу, о котором идет речь, чтобы выполнить запрос как к "идентификатору тега", так и к "пути тега" в рассматриваемом поле, поскольку путь тега допустимое значение для тега.