1

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

4

1 回答 1

2

使用以下模式进行通配符搜索通常被认为很慢

/jcr:root/my/path//*[jcr:contains(., '*searchterm*')]

最好避免这类查询。在某些属性上不使用通配符进行全文搜索通常更快。

Doing jcr:contains(@jcr:PropertyName, 'searchterm')

您应该查看 Marcel Reuteggers 关于高效内容结构和查询的演示文稿。有助于了解如何避免某些性能关键的查询模式。 http://de.slideshare.net/CQCON/prsentation-marcel-reutegger

于 2013-06-26T07:55:56.750 回答