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;
}

結果は、projectIndexerのdoGetDocumentメソッドで設定したグループで参照されているグループに検索ポートレットを配置した場合の予想どおりです。

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

しかし、ポートレットを使用して別のグループから検索したいと思います。

を使用して、ポートレットにgroupIdのリストを設定しようとしました

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

しかし、それでも検索結果は得られません。

「グループ全体」を検索する方法についてのポインタはありますか?

アラン

4

1 に答える 1

1

私は自分の質問に対する答えを見つけました。のために

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

効果を得るには、searchContextの属性の1つとして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 に答える