如何使用Query Builder API在CQ/AEM中实现部分搜索文本的搜索

Sur*_*dra 3 query-builder aem

我需要根据部分文本匹配来获取搜索结果.例如,如果产品中有一个节点说"apple-iphone-6"并且用户在搜索框中输入"iphone"文本,我仍然可以获取结果.

我在querybuilder上尝试了以下查询,它有效:

http://localhost:4502/bin/querybuilder.json?path=/etc/commerce/products&type=nt:unstructured&nodename=*iphone*
Run Code Online (Sandbox Code Playgroud)

但是,如何以编程方式实现此*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(); 
Run Code Online (Sandbox Code Playgroud)

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

小智 6

您已经找到了自己的解决方案,NodenamePredicateEvaluator接受通配符参数,因此您需要使用通配符包围搜索项,例如:

String searchTerm = "iphone";
...
map.put("nodename", "*" + searchTerm + "*");
Run Code Online (Sandbox Code Playgroud)