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