如何使用查询生成器 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");
我需要根据部分文本匹配获取搜索结果。例如,如果产品下有一个节点说 "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");