如何在AEM搜索组件中使用多个路径

时间:2015-03-16 03:21:16

标签: search cq5 aem

我正在开发自定义OOTB AEM 6.0搜索组件。我需要传入多个路径而不是一个路径到搜索对象。有没有人尝试过?此外,当我将搜索属性设置为包含'hideInNav'时,它不会正确过滤页面。换句话说,结果页面仍包括在导航中设置为隐藏的页面。请让我知道如何解决这个问题。非常感谢提前。

3 个答案:

答案 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;
}