2015-04-20 22 views
3

我有一個基於部分文本匹配獲取搜索結果的需求。例如,如果產品下有一個節點說「apple-iphone-6」,並且用戶在搜索框中輸入了「iphone」文本,我仍然可以獲取結果。如何在CQ/AEM中使用查詢生成器API實現部分搜索文本的搜索

我試過的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(); 

創建一個查詢,但我沒有得到任何結果,原因是,從節點名稱(蘋果iphone-6)不完全搜索詞(iphone)相匹配。 但是,如果我將*附加到nodename值,然後在querybuilder示例中實現部分基於文本的搜索,同樣的事情就可以正常工作。我應該在代碼中做些什麼改變以獲得基於部分節點名稱匹配的結果?

回答

6

你已經找到了自己的解決方案中,NodenamePredicateEvaluator接受通配符參數,所以你需要圍繞帶通配符搜索詞,例如像這樣:

String searchTerm = "iphone"; 
... 
map.put("nodename", "*" + searchTerm + "*"); 
+0

是啊,我懷疑我必須做一些修改和INFACT嘗試添加t條他*通配符,但以不同的方式解決問題。這工作正常。感謝您的快速解決方案。 –

3
在這種情況下

「喜歡」調度研究可用於:

的JCR

EX->(ε2)文本檢索算法:標題

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