<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <title>Custom Entity Indexer In Liferay 7.4 DXP Q4</title>
  <link rel="self" href="https://liferay.dev/c/message_boards/find_thread?p_l_id=119785294&amp;threadId=123526320" />
  <subtitle>Custom Entity Indexer In Liferay 7.4 DXP Q4</subtitle>
  <id>https://liferay.dev/c/message_boards/find_thread?p_l_id=119785294&amp;threadId=123526320</id>
  <updated>2026-04-06T17:11:38Z</updated>
  <dc:date>2026-04-06T17:11:38Z</dc:date>
  <entry>
    <title>Custom Entity Indexer In Liferay 7.4 DXP Q4</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=123526319" />
    <author>
      <name>Mohamed Saleem</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=123526319</id>
    <updated>2025-07-30T12:50:17Z</updated>
    <published>2025-07-30T12:50:16Z</published>
    <summary type="html">&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;I have created a custom entity and added a search indexer for it.
  After deploying the module, I can see my custom entity listed under
    &lt;em&gt;Control Panel → Search → Index Actions&lt;/em&gt;. When I perform a
  reindex, the corresponding method is called and works correctly. I
  have also verified that the indexer methods are triggered on add,
  update, and delete operations.&lt;/p&gt;
&lt;p&gt;However, when I search for any product using the search bar, it
  doesn’t return any results.&lt;/p&gt;
&lt;p&gt;Can anyone help me understand what might be causing this issue?&lt;/p&gt;
&lt;p&gt;below are my classes&lt;/p&gt;
&lt;p&gt;@Component(immediate = true, service = Indexer.class)&lt;/p&gt;
&lt;p&gt;public class ProductsIndexer extends BaseIndexer&amp;lt;Products&amp;gt; {&lt;/p&gt;
&lt;p&gt;public static final String CLASS_NAME = Products.class.getName();&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;public ProductsIndexer() {&lt;/p&gt;
&lt;p&gt;setDefaultSelectedFieldNames(&amp;quot;productName&amp;quot;, Field.UID);&lt;/p&gt;
&lt;p&gt;setPermissionAware(true);&lt;/p&gt;
&lt;p&gt;setFilterSearch(true);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;@Override&lt;/p&gt;
&lt;p&gt;public boolean hasPermission(PermissionChecker permissionChecker,
  String entryClassName, long entryClassPK,&lt;/p&gt;
&lt;p&gt;String actionId) throws Exception {&lt;/p&gt;
&lt;p&gt;System.out.println(&amp;quot;bool Value
  ----&amp;quot;+hasPermission(permissionChecker, entryClassName,
  entryClassPK, ActionKeys.VIEW));&lt;/p&gt;
&lt;p&gt;return super.hasPermission(permissionChecker, entryClassName,
  entryClassPK, ActionKeys.VIEW);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;@Override&lt;/p&gt;
&lt;p&gt;public String getClassName() {&lt;/p&gt;
&lt;p&gt;// TODO Auto-generated method stub&lt;/p&gt;
&lt;p&gt;return CLASS_NAME;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;@Override&lt;/p&gt;
&lt;p&gt;protected void doDelete(Products object) throws Exception {&lt;/p&gt;
&lt;p&gt;System.out.println(&amp;quot;method invoked In&amp;quot;);&lt;/p&gt;
&lt;p&gt;deleteDocument(object.getCompanyId(), object.getPrimaryKey());&lt;/p&gt;
&lt;p&gt;System.out.println(&amp;quot;method invoked Last&amp;quot;);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;@Override&lt;/p&gt;
&lt;p&gt;protected Document doGetDocument(Products object) throws Exception {&lt;/p&gt;
&lt;p&gt;Document document = getBaseModelDocument(Products.class.getName(), object);&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;// Add column to be indexed&lt;/p&gt;
&lt;p&gt;System.out.println(&amp;quot;Method In---&amp;quot;+object);&lt;/p&gt;
&lt;p&gt;document.addText(&amp;quot;productName&amp;quot;, object.getProductName());&lt;/p&gt;
&lt;p&gt;/*&lt;/p&gt;
&lt;p&gt;* document.addKeyword(Field.ENTRY_CLASS_NAME, getClassName());&lt;/p&gt;
&lt;p&gt;* document.addKeyword(Field.ENTRY_CLASS_PK, object.getPrimaryKey());&lt;/p&gt;
&lt;p&gt;*/&lt;/p&gt;
&lt;p&gt;document.addKeyword(Field.UID,
  PortalUtil.getClassName(PortalUtil.getClassNameId(Products.class)) +
  &amp;quot;#&amp;quot; + object.getPrimaryKey());&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;return document;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;@Override&lt;/p&gt;
&lt;p&gt;protected Summary doGetSummary(Document document, Locale locale,
  String snippet, PortletRequest portletRequest,&lt;/p&gt;
&lt;p&gt;PortletResponse portletResponse) throws Exception {&lt;/p&gt;
&lt;p&gt;Summary summary = createSummary(document);&lt;/p&gt;
&lt;p&gt;System.out.println(&amp;quot;summarysummary-----&amp;quot;+summary);&lt;/p&gt;
&lt;p&gt;summary.setMaxContentLength(200);&lt;/p&gt;
&lt;p&gt;return summary;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;@Override&lt;/p&gt;
&lt;p&gt;protected void doReindex(String className, long classPK) throws
  Exception {&lt;/p&gt;
&lt;p&gt;Products products = ProductsLocalServiceUtil.getProducts(classPK);&lt;/p&gt;
&lt;p&gt;doReindex(products);&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;@Override&lt;/p&gt;
&lt;p&gt;protected void doReindex(String[] ids) throws Exception {&lt;/p&gt;
&lt;p&gt;long companyId = GetterUtil.getLong(ids[0]);&lt;/p&gt;
&lt;p&gt;for (Products product : ProductsLocalServiceUtil.getProductses(-1,
  -1)) {&lt;/p&gt;
&lt;p&gt;if (CompanyThreadLocal.getCompanyId() == companyId) {&lt;/p&gt;
&lt;p&gt;System.out.println(companyId + &amp;quot;----------CompanyId----&amp;quot; + CompanyThreadLocal.getCompanyId());&lt;/p&gt;
&lt;p&gt;doReindex(product);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;@Override&lt;/p&gt;
&lt;p&gt;protected void doReindex(Products object) throws Exception {&lt;/p&gt;
&lt;p&gt;Document document = getDocument(object);&lt;/p&gt;
&lt;p&gt;System.out.println(&amp;quot;print document ----&amp;gt;&amp;quot;+document);&lt;/p&gt;
&lt;p&gt;indexWriterHelper.updateDocument(object.getCompanyId(), document);&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;@Reference&lt;/p&gt;
&lt;p&gt;IndexWriterHelper indexWriterHelper;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;@Component(&lt;/p&gt;
&lt;p&gt;immediate = true,&lt;/p&gt;
&lt;p&gt;property = &amp;quot;indexer.class.name=common.service.model.Products&amp;quot;,&lt;/p&gt;
&lt;p&gt;service = ModelDocumentContributor.class&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;public class ProductsDocumentContributor implements
  ModelDocumentContributor&amp;lt;Products&amp;gt; {&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;@Override&lt;/p&gt;
&lt;p&gt;public void contribute(Document document, Products baseModel) {&lt;/p&gt;
&lt;p&gt;document.addText(&amp;quot;productName&amp;quot;, baseModel.getProductName());&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;@Component(immediate = true, property =
  &amp;quot;indexer.class.name=common.service.model.Products&amp;quot;, service
  = ModelIndexerWriterContributor.class)&lt;/p&gt;
&lt;p&gt;public class ProductsIndexerWriterContributor implements
  ModelIndexerWriterContributor&amp;lt;Products&amp;gt; {&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;@Override&lt;/p&gt;
&lt;p&gt;public void customize(BatchIndexingActionable batchIndexingActionable,&lt;/p&gt;
&lt;p&gt;ModelIndexerWriterDocumentHelper modelIndexerWriterDocumentHelper) {&lt;/p&gt;
&lt;p&gt;batchIndexingActionable.setPerformActionMethod((Products entity)
  -&amp;gt; {&lt;/p&gt;
&lt;p&gt;Document document = modelIndexerWriterDocumentHelper.getDocument(entity);&lt;/p&gt;
&lt;p&gt;batchIndexingActionable.addDocuments(document);&lt;/p&gt;
&lt;p&gt;});&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;@Override&lt;/p&gt;
&lt;p&gt;public BatchIndexingActionable getBatchIndexingActionable() {&lt;/p&gt;
&lt;p&gt;return _batchIndexingHelper&lt;/p&gt;
&lt;p&gt;.getBatchIndexingActionable(_productsLocalService.getIndexableActionableDynamicQuery());&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;@Override&lt;/p&gt;
&lt;p&gt;public long getCompanyId(Products baseModel) {&lt;/p&gt;
&lt;p&gt;// TODO Auto-generated method stub&lt;/p&gt;
&lt;p&gt;return baseModel.getCompanyId();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;@Reference&lt;/p&gt;
&lt;p&gt;private DynamicQueryBatchIndexingActionableFactory _batchIndexingHelper;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;@Reference&lt;/p&gt;
&lt;p&gt;private ProductsLocalService _productsLocalService;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;When i am searching Results are not coming.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</summary>
    <dc:creator>Mohamed Saleem</dc:creator>
    <dc:date>2025-07-30T12:50:16Z</dc:date>
  </entry>
</feed>
