1

我在搜索容器中使用以下内容来查找给定组中的项目:

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 中设置 groupIds 列表,使用

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

但我仍然没有在搜索中得到任何结果。

关于如何搜索“跨组”的任何指示?

阿兰

4

1 回答 1

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 request) 的摘录(我相信 - 没有调试它)从参数中设置 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);
于 2013-02-17T20:19:31.143 回答