Implement Indexer on an custom asset with Liferay

2019-07-03 00:41发布

i'd like to implement a index on a custom asset made for my project called "projet", i've already developped this class : (based on the liferay's bookmark indexer )

    /**
     * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
     *
     * This library is free software; you can redistribute it and/or modify it under
     * the terms of the GNU Lesser General Public License as published by the Free
     * Software Foundation; either version 2.1 of the License, or (at your option)
     * any later version.
     *
     * This library is distributed in the hope that it will be useful, but WITHOUT
     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
     * details.
     */



    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.List;
    import java.util.Locale;

    import javax.portlet.PortletURL;

    import org.apache.log4j.Logger;

    import com.liferay.portal.kernel.search.BaseIndexer;
    import com.liferay.portal.kernel.search.BooleanQuery;
    import com.liferay.portal.kernel.search.Document;
    import com.liferay.portal.kernel.search.Field;
    import com.liferay.portal.kernel.search.Indexer;
    import com.liferay.portal.kernel.search.SearchContext;
    import com.liferay.portal.kernel.search.SearchEngineUtil;
    import com.liferay.portal.kernel.search.Summary;
    import com.liferay.portal.kernel.util.GetterUtil;
    import com.liferay.portal.model.Group;
    import com.liferay.portal.service.ClassNameLocalServiceUtil;
    import com.liferay.portal.service.GroupLocalServiceUtil;
    import com.liferay.portal.util.PortletKeys;




    public class ProjetIndexer extends BaseIndexer {
    private static Logger LOGGER = Logger.getLogger(ProjetIndexer.class);

    public static final String[] CLASS_NAMES = { Projet.class.getName() };

    public String[] getClassNames() {
        return CLASS_NAMES;
    }


    public String getPortletId() {
        return Long.toString(ClassNameLocalServiceUtil.getClassNameId(Projet.class)) ;
    }

    @Override
    protected void doDelete(Object obj) throws Exception {
        LOGGER.info("doDelete");

        Projet entry = (Projet) obj;

        deleteDocument(entry.getCompanyId(), entry.getPrimaryKey());

    }

    @Override
    protected Document doGetDocument(Object obj) throws Exception {
        LOGGER.info("doGetDocument");

        Projet entry = (Projet) obj;

        Document document = getBaseModelDocument(getPortletId(), entry);

        document.addText(Field.DESCRIPTION, "test123");
        document.addText(Field.TITLE,  "test123");
        document.addKeyword(Field.TYPE, entry.getType());
        document.addKeyword(Field.COMPANY_ID, entry.getCompanyId());


        //what else ??




        return document;
    }

    @Override
    protected Summary doGetSummary(Document document, Locale locale,
            String snippet, PortletURL portletURL) throws Exception {


LOGGER.info("doGetSummary");


        String title = document.get(Field.TITLE);

        String url = document.get(Field.URL);

        String entryId = document.get(Field.ENTRY_CLASS_PK);

        // portletURL.setParameter("struts_action",
        // "/bookmarks/view_entry");TODO
        portletURL.setParameter("entryId", entryId);

        return new Summary(title, url, portletURL);

    }

    @Override
    protected void doReindex(Object obj) throws Exception {
        LOGGER.info("doReindex");

        Projet entry = (Projet) obj;

        Document document = getDocument(entry);

        SearchEngineUtil.updateDocument(entry.getCompanyId(), document);

    }

    @Override
    protected void doReindex(String className, long classPK) throws Exception {
        LOGGER.info("doReindex");

        Projet entry = ProjetLocalServiceUtil.getProjet(classPK);

        doReindex(entry);

    }

    @Override
    protected void doReindex(String[] ids) throws Exception {
        long companyId = GetterUtil.getLong(ids[0]);

        LOGGER.info("doReindex");

        // reindexFolders(companyId);
        reindexRoot(companyId);

    }

    @Override
    protected String getPortletId(SearchContext searchContext) {
        return getPortletId();
    }


    protected void reindexRoot(long companyId) throws Exception {

        LOGGER.info("reindexRoot");

        int groupCount = GroupLocalServiceUtil.getCompanyGroupsCount(companyId);

        int groupPages = groupCount / Indexer.DEFAULT_INTERVAL;

        for (int i = 0; i <= groupPages; i++) {
            int groupStart = (i * Indexer.DEFAULT_INTERVAL);
            int groupEnd = groupStart + Indexer.DEFAULT_INTERVAL;

            reindexRoot(companyId, groupStart, groupEnd);
        }
    }

    protected void reindexRoot(long companyId, int groupStart, int groupEnd)
            throws Exception {

        LOGGER.info("reindexRoot");

        List<Group> groups = GroupLocalServiceUtil.getCompanyGroups(companyId,
                groupStart, groupEnd);

        for (Group group : groups) {
            long groupId = group.getGroupId();
            // long folderId =
            // BookmarksFolderConstants.DEFAULT_PARENT_FOLDER_ID;

            int entryCount = ProjetLocalServiceUtil.getEntriesCount(groupId);

            int entryPages = entryCount / Indexer.DEFAULT_INTERVAL;

            for (int i = 0; i <= entryPages; i++) {
                int entryStart = (i * Indexer.DEFAULT_INTERVAL);
                int entryEnd = entryStart + Indexer.DEFAULT_INTERVAL;

                reindexEntries(companyId, groupId, entryStart, entryEnd);
            }
        }
    }


    protected void reindexEntries(long companyId, long groupId, int entryStart,
            int entryEnd) throws Exception {

        LOGGER.info("reindexEntries");

        List<Projet> entries = ProjetLocalServiceUtil.getEntries(groupId,
                entryStart, entryEnd);

        if (entries.isEmpty()) {
            return;
        }

        Collection<Document> documents = new ArrayList<Document>();

        for (Projet entry : entries) {
            Document document = getDocument(entry);

            documents.add(document);
        }

        SearchEngineUtil.updateDocuments(companyId, documents);
    }
}

and this is my liferay portlet.xml:

<indexer-class>path package .ProjetIndexer</indexer-class>   

but it doesnt work. search portlet (bundled with liferay 6.0) does not retrieve my custom asset

any ideas? thank

1条回答
时光不老,我们不散
2楼-- · 2019-07-03 01:21

My issue is solved by deleting data under /data/lucent/ Maybe my tests deleloppment was corrupted I've changed the method doGetDocument too, making sure that no empty field is set in the map. many thanks for your cooperation

查看更多
登录 后发表回答