我正在尝试通过QueryBuilder / Query在节点中搜索,但它似乎没有正常工作。我有以下代码方法来搜索大约6000条记录。
public String searchRows(String search, int start, int length){
Map<String, String> searchMap = new HashMap<String, String>();
searchMap.put("path", this.path);
searchMap.put("fulltext", search);
Query query = this.builder.createQuery(PredicateGroup.create(searchMap), this.session);
query.setStart(start);
query.setHitsPerPage(length);
SearchResult result = query.getResult();
//return result.getQueryStatement();
StringBuilder sb = this.createBasicInfo(result.getTotalMatches());
sb.append(this.toaaData(result));
sb.append("}");
return sb.toString();
}
我希望得到的结果只是部分匹配。例如,我有节点具有这些属性
Company "My Drugstore Abc"
City "My City"
Street "Some Street"
如果我尝试搜索“Abc”,我会得到正确的结果,但如果我尝试搜索“药店”或“我的”,我什么也得不到。此外,如果我尝试搜索“城市”或“街道”,我什么也得不到......我怎么能解决这个问题呢?我试图像这样编辑搜索词
searchMap.put("fulltext", "*"+search+"*");
和这个
searchMap.put("fulltext", "%"+search+"%");
但它仍然没有按我需要的方式工作......
这是我从result.getQueryStatement();
获得的Xpath/jcr:root/my/path//*[jcr:contains(., 'city')]
感谢您的帮助
编辑:我发现了这个
searchMap.put("fulltext", "*"+search+"*");
基本上按照我需要的方式工作,但速度很慢,结果可能会以错误的顺序返回。查询需要2-80毫秒没有星号,但是它们是1-6秒。我该如何解决这个问题?
答案 0 :(得分:2)
使用以下模式进行通配符搜索通常被认为是缓慢的
/jcr:root/my/path//*[jcr:contains(., '*searchterm*')]
最好避免这类查询。 在某些属性上进行没有通配符的全文搜索通常会更快。
Doing jcr:contains(@jcr:PropertyName, 'searchterm')
您应该了解有关高效内容结构和查询的Marcel Reuteggers演示文稿。有助于了解如何避免一些性能关键的查询模式。 http://de.slideshare.net/CQCON/prsentation-marcel-reutegger