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

时间:2015-04-20 07:37:05

标签: cq5 aem query-builder

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

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

EX-> jcr:title

的patial text serach
    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");