2013-06-25 65 views
1

我試圖在通過的QueryBuilder /查詢節點進行搜索,但它似乎並沒有很好地工作。我有以下代碼方法來搜索約6000條記錄。CQ5得到部分正確結果

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+"%"); 

,但它仍然沒有奏效,我需要的方式......

這是XPath我從result.getQueryStatement()獲取;

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

感謝所有幫助

編輯:我發現這個

searchMap.put("fulltext", "*"+search+"*"); 

作品基本上我需要的方式,但它是如此之慢,結果可能會回來的壞命令。查詢需要2-80毫秒而沒有星號,但是它們需要1-6秒。我該如何解決這個問題?

回答

2

使用下面的模式做通配符搜索被普遍認爲是慢

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

更好的避免這些類型的查詢。 在某些屬性上進行不含通配符的全文搜索通常更快。

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

您應該看看Marcel Reuteggers關於高效的內容結構和查詢的演示。有助於瞭解如何避免一些性能嚴重的查詢模式。 http://de.slideshare.net/CQCON/prsentation-marcel-reutegger

+0

謝謝你的答案,但我怎麼能更改使用的HashMap /的QueryBuilder中的XPath?我試過這個searchMap.put(「type」,「myType」);和這個searchMap.put(「property」,「myProp」);但它不起作用... – Jakolcz

+0

將諸如jcr:contains(...)之類的語句放入querybuilders謂詞映射中將不起作用。 恐怕只是優化了XPath查詢,你不會使用xpath語句創建查詢。 – Thomas

+0

我該怎麼做?我試圖尋找它,但我發現的唯一的事情是創建通過的QueryBuilder和謂語地圖不僅僅是XPath語句... – Jakolcz