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

如何在CQ/AEM中使用查询生成器API实现部分搜索文本的搜索,aem,query-builder,Aem,Query Builder,我需要根据部分文本匹配获取搜索结果。例如,如果产品下有一个节点,名为“apple-iphone-6”,用户在搜索框中输入“iphone”文本,我应该仍然能够获取结果 我在querybuilder上尝试了以下查询,结果成功了: http://localhost:4502/bin/querybuilder.json?path=/etc/commerce/products&type=nt:unstructured&nodename=*iphone* 但是,如何为*iphone*部分编

我需要根据部分文本匹配获取搜索结果。例如,如果产品下有一个节点,名为“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示例中实现部分基于文本的搜索。我应该在代码中做什么更改才能基于部分节点名称匹配获得结果

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

String searchTerm = "iphone";
...
map.put("nodename", "*" + searchTerm + "*");
在这种情况下,可以使用“like”操作:

EX->jcr的专用文本摘要:标题

    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");

是的,我怀疑我必须做一些修改,事实上我尝试添加*通配符,但以不同的方式没有成功。这很好用。谢谢你的快速解决。