【问题标题】:How to use multiple paths in AEM search component如何在 AEM 搜索组件中使用多个路径
【发布时间】:2017-10-26 01:35:50
【问题描述】:

我正在定制 OOTB AEM 6.0 搜索组件。我需要向搜索对象传递多条路径而不是一条路径。有人已经试过了吗?此外,当我将搜索属性设置为包含“hideInNav”时,它不会正确过滤页面。换句话说,结果页面仍然包括那些在导航中设置为隐藏的页面。请让我知道如何解决这个问题。非常感谢。

【问题讨论】:

  • 嗨,欢迎来到 Stack Overflow。当他们所拥有的只是对其代码的口头描述时,我们几乎不可能帮助他们。很大程度上取决于您使用的命令的具体细节。因此,请编辑您的问题并包含您的代码(即使特别是如果它不起作用),以便人们可以弄清楚发生了什么。

标签: search aem


【解决方案1】:

您可以在“indexing_config.xml”中添加自定义索引配置来限制搜索范围。参考网址:https://helpx.adobe.com/experience-manager/kb/SearchIndexingConfig.html。你已经完成了。

当您在导航中隐藏页面时,hideInNav 的值将设置为 true。

在 search.jsp 文件中,如果 'hideInNav' = true 则可以输入条件,然后不要在搜索结果中显示相同的条件。

自定义组件 您可以编写自定义搜索组件来使用 SQL2 查询存储库,并且您可以在其中定义多个路径。

【讨论】:

    【解决方案2】:

    您可以将多字段(documentation)与一些路径字段一起使用。

    并使用 Query Builder API 处理输入的路径。 Here is example with multipath search and how to sue Query Builder Api

    或者您可以使用jcr Query interface 处理路径

    【讨论】:

      【解决方案3】:

      我们通过复制股票搜索组件代码来实现这一点,将 searchIn 路径更改为列表而不是字符串,并更新对话框以接受多个路径。我们使用了 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);
      

      实现

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多