我正在开发自定义OOTB AEM 6.0搜索组件。我需要传入多个路径而不是一个路径到搜索对象。有没有人尝试过?此外,当我将搜索属性设置为包含'hideInNav'时,它不会正确过滤页面。换句话说,结果页面仍包括在导航中设置为隐藏的页面。请让我知道如何解决这个问题。非常感谢提前。
答案 0 :(得分:1)
您可以在“indexing_config.xml”中添加自定义索引配置以限制搜索范围。参考网址:https://helpx.adobe.com/experience-manager/kb/SearchIndexingConfig.html。你已经完成了。
当您在导航中隐藏页面时,hideInNav的值将设置为true。
在search.jsp文件中,您可以设置条件,如果' hideInNav' = true然后不要在搜索结果中显示相同内容。
自定义组件 您可以编写自定义搜索组件以使用SQL2查询存储库,并且您可以在其中定义多个路径。
答案 1 :(得分:1)
您可以使用多字段(documentation)和一些路径字段。
使用Query Builder API处理输入的路径。 Here is example with multipath search and how to sue Query Builder Api
或者您可以使用jcr Query interface
处理路径答案 2 :(得分:1)
我们通过复制股票搜索组件代码,将searchIn路径更改为List而不仅仅是String,并更新对话框以接受多个路径。我们使用了cylinder.y引用的Query Builder API示例来验证我们的查询。
dialog.xml
<searchPaths
jcr:primaryType="cq:Widget"
fieldLabel="Search Path"
name="./searchPaths"
xtype="multifield">
<fieldConfig
jcr:primaryType="nt:unstructured"
xtype="pathfield"/>
</searchPaths>
search.jsp - MultiSearch是我们的新组件
MultiSearch search = new MultiSearch(slingRequest);
String[] searchPaths = properties.get("searchPaths", new String[]{});
List<String> searchPathsList = Arrays.asList(searchPaths);
search.setSearchIn(searchPathsList);
IMPL
public SearchResult getResult() throws RepositoryException {
if (this.result == null) {
String queryString = getQuery();
if ((queryString.length() == 0) && (this.customPredicates.size() == 0)) {
return null;
}
Map<String, String> map = new HashMap();
map.put("group.p.or", "true"); //Search "or" condition on groups (paths / properties)
map.put("fulltext", queryString); //query
List<String> searchPaths = getSearchIn();
int searchPathsLen = searchPaths.size();
int searchPropertiesLen = this.searchProperties.size();
boolean typeOverwrite = false;
for (Predicate p : this.customPredicates) {
if ("type".equals(p.getName())) {
typeOverwrite = true;
break;
}
}
if (!typeOverwrite) {
map.put("type", "nt:hierarchyNode");
}
if (queryString.startsWith("related:")) {
for (int i = 0; i < searchPathsLen; i++){
String searchPath = searchPaths.get(i);
map.put("group." + i + "_path", searchPath);
}
String path = queryString.substring("related:".length());
map.put("similar", path + "/" + "jcr:content");
map.put("similar.local", "jcr:content");
} else {
for (int i = 0; i < searchPathsLen; i++){
String searchPath = searchPaths.get(i);
for (int j = 0; j < searchPropertiesLen; j++){
String prop = searchProperties.get(j);
int counter = i * searchPropertiesLen + j;
map.put("group." + counter + "_path", searchPath);
StringBuffer path = new StringBuffer();
path.append("jcr:content");
if (!prop.equals(".")) {
String[] segments = Text.explode(prop, 47);
for (int k = 0; k < segments.length; k++) {
path.append("/");
if (k == segments.length - 1) {
path.append("@");
}
path.append(segments[k]);
}
}
map.put("group." + counter + "_fulltext.relPath", path.toString());
}
}
}
Query query = this.builder.createQuery(PredicateGroup.create(map), getSession());
for (Predicate p : this.customPredicates) {
query.getPredicates().add(p);
}
query.setExcerpt(true);
query.setStart(this.start);
query.setHitsPerPage(this.hitsPerPage);
this.result = query.getResult();
}
return this.result;
}