Как установить тип сопоставления в Liferay DXP при индексировании документа?

У нас есть пользовательский объект в Liferay, также мы можем индексировать его в эластичном поиске. По умолчанию liferay устанавливает тип сопоставления всех проиндексированных документов как «LiferayDocumentType» в эластичном поиске, нам нужно изменить его на «PublicationType». На следующем рисунке показан наш документ в эластичном поиске, и выделенное поле — это то, что нам нужно изменить.

введите здесь описание изображения

Следующий класс — это наш класс индексатора для публикации.

@Component(
immediate = true,
property  = { "indexer.class.name=com.ctc.myct.bo.model.Publication" },
service   = Indexer.class)

public class StanlyPublicationIndexer extends BaseIndexer<Publication> {

private static final String CLASS_NAME = Publication.class.getName();
private static final String PORTLET_ID = "Corporate Portlet";
private static final Log    _log       = LogFactoryUtil.getLog(StanlyPublicationIndexer.class);
String                      example    = "This is an example";
byte[]                      bytes      = example.getBytes();

public StanlyPublicationIndexer() {
    setFilterSearch(true);
    setPermissionAware(true);
}

@Override
protected void doDelete(Publication object) throws Exception {
    Document doc = getBaseModelDocument(PORTLET_ID, object);

    IndexWriterHelperUtil.deleteDocument(this.getSearchEngineId(), object.getCompanyId(), object.getUuid(), true);
}

@Override
protected Document doGetDocument(Publication object) throws Exception {

    Document doc      = getBaseModelDocument(PORTLET_ID, object);
    User     user     = UserLocalServiceUtil.getUser(PrincipalThreadLocal.getUserId());
    long     userid   = user.getUserId();
    String   username = user.getScreenName();

    object.setUserId(userid);
    object.setUserName(username);
    doc.addKeyword(Field.USER_ID, userid);
    doc.addText(Field.USER_NAME, username);
    doc.addText("title", object.getTitle());
    doc.addText("firstName", object.getFirstName());
    doc.addText("lastName", object.getLastName());
    doc.addText("additional_Information", object.getAdditionalInformation());
    doc.addKeyword("roleId", object.getRoleId());
    doc.addNumber("publicationId", object.getPublicationId());
    doc.addNumber("articleId", object.getJournalArticleId());

    Field field = new Field("_type");

    _log.info("The document with title" + " " + object.getTitle() + " " + "and firstName" + " "
              + object.getFirstName() + " " + "has been created successfully ");

    return doc;
}

@Override
protected Summary doGetSummary(Document document, Locale locale, String snippet, PortletRequest portletRequest,
                               PortletResponse portletResponse)
        throws Exception {
    return null;
}

@Override
protected void doReindex(Publication object) throws Exception {
    _log.info("doReindex2 is  Executing");

    Document doc = this.doGetDocument(object);

    try {
        IndexWriterHelperUtil.addDocument(this.getSearchEngineId(), object.getCompanyId(), doc, true);
        IndexWriterHelperUtil.commit(this.getSearchEngineId(), object.getCompanyId());
        ;
    } catch (Exception e) {
        e.printStackTrace();
    }

    _log.info("Publication document with publicationId " + " " + object.getPublicationId() + " "
              + " has been successfully reIndexed into the elastic search");
}

@Override
protected void doReindex(String[] arg0) throws Exception {

    // TODO Auto-generated method stub
}

@Override
protected void doReindex(String arg0, long arg1) throws Exception {

    // TODO Auto-generated method stub
}

@Override
public Hits search(SearchContext searchContext) throws SearchException {
    return super.search(searchContext);
}

@Override
public String getClassName() {
    return CLASS_NAME;
}

Тип можно изменить с помощью API Java, но мы ищем решение, основанное на API Liferay Elastic. Я очень ценю ваше время и ценную информацию об этом.


person Vishnu S Kumar    schedule 15.08.2017    source источник


Ответы (1)


Невозможно изменить тип документа Elasticsearch без изменения кода модуля поиска Liferay, см.:

com/liferay/portal/search/elasticsearch/internal/util/DocumentTypes.java

com/liferay/portal/search/elasticsearch/internal/index/LiferayTypeMappingsConstants.java

Мы видим, что тип документа — это константа, используемая в вызовах API elasticsearch. Если вы измените его, изменение будет применено ко всем индексам. Я не думаю, что можно изменить его только на одну сущность, не переписывая много кода.

person Vishnu S Kumar    schedule 23.08.2017