CQ5得到部分正确的结果

时间:2013-06-25 12:28:27

标签: jsp xpath cq5

我正在尝试通过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秒。我该如何解决这个问题?

1 个答案:

答案 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