如何使用查询生成器 API 对 CQ/AEM 中的部分搜索文本实施搜索

How to implement search using Query Builder API for partial search text in CQ/AEM

我需要根据部分文本匹配获取搜索结果。例如,如果产品下有一个节点说 "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) 不完全匹配。 但是如果我将 * 附加到节点名值,然后在查询生成器示例中实现部分基于文本的搜索,同样的事情也能正常工作。我应该在代码中做哪些更改才能根据部分节点名称匹配获得结果?

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

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

此时可以使用"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");

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

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