2013-02-15 49 views
1

我使用一個搜索容器下面找到的項目是在給定組:如何讓我的lucene在liferay中搜索「全球」(即所有組)?

SearchContext searchContext = SearchContextFactory.getInstance(request); 
searchContext.setStart(searchContainer.getStart()); 
searchContext.setKeywords(keywords); 
searchContext.setEnd(searchContainer.getEnd()); 

results = ProjectLocalServiceUtil.getSearchedProjects(searchContext); 
total = ProjectLocalServiceUtil.getSearchedProjectsCount(searchContext); 

方法getSearchedProjects從搜索結果翻譯成的項目清單:

public List<Project> getSearchedProjects(SearchContext context) throws SearchException { 
    Indexer indexer = IndexerRegistryUtil.getIndexer(Project.class); 
    Hits results = indexer.search(context); 
    List<Project> projects = new ArrayList<Project>(); 
    for (int i = 0; i < results.getDocs().length; i++) { 
     com.liferay.portal.kernel.search.Document doc = results.doc(i); 
     long projectId=GetterUtil.getLong(doc.get(Field.ENTRY_CLASS_PK)); 
     Project project = null; 
     try { 
      project = ProjectLocalServiceUtil.getProject(projectId); 
      projects.add(project); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      continue; 
     } 
    } 
    return projects; 
} 

結果如我期望當搜索portlet被放入在我的projectIndexer的doGetDocument方法中設置的組中引用的組中時:

document.addKeyword(Field.GROUP_ID, groupId); 
document.addKeyword(Field.SCOPE_GROUP_ID, groupId); 

但我想使用portlet從另一個組搜索。

我試圖設置在portlet組id列表,使用

searchContext.setGroupIds(new long[] {projectHolder.getGroupId()}); 

,但我仍然沒有獲得在搜索的任何結果。

任何關於如何搜索'跨組'的指針?

Alain

回答

1

我找到了我的問題的答案。爲了使

searchContext.setGroupIds(new long[] {group1ID, group2Id}); 

有效的searchContext不應該有groupId作爲其屬性之一。 SearchContextFactory增加的GroupId的屬性(請參閱下面的提取物),所以調用的getInstance後,您需要從屬性中刪除的groupId:

SearchContext searchContext = SearchContextFactory.getInstance(request); 
Map<String, Serializable> attributes = searchContext.getAttributes(); 
attributes.remove("groupId"); 

希望這可以幫助別人一天。 阿蘭


下面,從SearchContextFactory.getInstance(HttpServletRequest的請求)的提取物(我相信 - 沒有調試吧)設定從參數的groupId屬性:

// Extract from SearchContextFactory.java 
Map<String, String[]> parameters = request.getParameterMap(); 
    for (Map.Entry<String, String[]> entry : parameters.entrySet()) { 
    String name = entry.getKey(); 
    String[] values = entry.getValue(); 
     if ((values != null) && (values.length > 0)) { 
     if (values.length == 1) { 
      attributes.put(name, values[0]); 
     } 
     else { 
      attributes.put(name, values); 
     } 
    } 
} 
searchContext.setAttributes(attributes);