【问题标题】:How to implement search using Query Builder API for partial search text in CQ/AEM如何在 CQ/AEM 中使用 Query Builder API 实现部分搜索文本的搜索
【发布时间】:2015-04-20 07:37:04
【问题描述】:

我需要根据部分文本匹配来获取搜索结果。例如,如果产品下有一个节点说“apple-iphone-6”并且用户在搜索框中输入“iphone”文本,我应该仍然能够获取结果。

我在 querybuilder 上尝试了以下查询,它成功了:

http://localhost:4502/bin/querybuilder.json?path=/etc/commerce/products&type=nt:unstructured&nodename=*iphone*

但是,如何以编程方式为 *iphone* 部分实现这一点?我正在使用如下谓词创建查询

        String searchTerm = "iphone";
        map.put("path", "/etc/commerce/products");
        map.put("type", "nt:unstructured");
        map.put("nodename", searchTerm);

        Query query = queryBuilder.createQuery(PredicateGroup.create(map), session);
        SearchResult result = query.getResult(); 

但我没有得到任何结果,原因是节点名称(apple-iphone-6)与搜索词(iphone)不完全匹配。 但是如果我将 * 附加到 nodename 值,然后在 querybuilder 示例中实现基于部分文本的搜索,同样的事情也可以正常工作。我应该在代码中进行哪些更改以根据部分节点名称匹配获得结果?

【问题讨论】:

    标签: aem query-builder


    【解决方案1】:

    您已经自己找到了解决方案,NodenamePredicateEvaluator 接受通配符参数,因此您需要用通配符将搜索词括起来,例如:

    String searchTerm = "iphone";
    ...
    map.put("nodename", "*" + searchTerm + "*");
    

    【讨论】:

    • 是的,我怀疑我必须进行一些修改,实际上尝试添加 * 通配符,但以不同的方式没有成功。这工作正常。感谢您的快速解决。
    【解决方案2】:

    在这种情况下,可以使用“like”操作:

    EX-> jcr:title 的局部文本搜索

        map.put("group.1_property", "fn:lower-case(@jcr:content/jcr:title)");
        map.put("group.1_property.value", "%"+fulltextSearchTerm + "%");
        map.put("group.1_property.operation", "like");
    

    【讨论】:

      【解决方案3】:

      仅对于节点名,发布的答案是正确的,但如果您也想在属性内部搜索:

      map.put("fulltext","*"+searchTetm +"*");
      map.put("fulltext.relPath","jcr:content");
      

      【讨论】:

        猜你喜欢
        • 2013-01-05
        • 2014-02-08
        • 1970-01-01
        • 2016-06-23
        • 1970-01-01
        • 1970-01-01
        • 2014-12-20
        • 2021-09-12
        • 1970-01-01
        相关资源
        最近更新 更多