Liferay 弹性搜索查询:搜索具有自定义文档类型的 DLFileEntries

Liferay Elastic Search Query: Search for DLFileEntries that have a Custom Document Type

我使用 Liferay 7.2,我需要进行 Elasticsearch 查询以查找文档类型为“XY”的 als DLFileEntries。目前我需要在 Postman 中执行此操作。

我已经能够找到所有 DLFileEntry:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "entryClassName": "com.liferay.document.library.kernel.model.DLFileEntry"
          }
        }
      ]
    }
  }
}

但我只需要找到文档类型为“XY”的这些 DLFileEntry。

我该怎么做?

您可以简单地向字段 fileEntryTypeId 添加另一个 match,其值必须等于创建的文档类型 ID。您可以在 table dlfileentrytypefileentrytypeid 列中找到此 ID。考虑到 id 等于 37105,查询将是这样的

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "entryClassName": "com.liferay.document.library.kernel.model.DLFileEntry"
          }
        },
        {
          "match": {
            "fileEntryTypeId": "37105"
          }
        }
      ]
    }
  }
}

编辑:针对您关于如何通过 DLFileEntryType 名称搜索 DLFileEntry 的评论,没有直接的方法可以做到这一点,因为 DLFileEntryType 没有在 Elastic 上建立索引默认搜索。它也可能需要子查询来实现这一点,而 Elastic Search 不支持子查询。

考虑到这一点,我能想到的最简单的方法是自定义 DLFileEntry 在 Elastic Search 上的索引方式,添加字段 fileEntryTypeName。为此,您只需要为 DLFileEntry 实现一个 ModelDocumentContributor 并将 fileEntryTypeName 字段添加到文档中。

基本上,你只需要像这样创建一个class:

package com.test.liferay.override;

import com.liferay.document.library.kernel.model.DLFileEntry;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.search.Document;
import com.liferay.portal.search.spi.model.index.contributor.ModelDocumentContributor;
import org.osgi.service.component.annotations.Component;

@Component(
        immediate = true,
        property = "indexer.class.name=com.liferay.document.library.kernel.model.DLFileEntry",
        service = ModelDocumentContributor.class
)
public class DLFileEntryModelDocumentContributor
        implements ModelDocumentContributor<DLFileEntry> {

    @Override
    public void contribute(Document document, DLFileEntry dlFileEntry) {
        try {
            document.addText(
                    "fileEntryTypeName", dlFileEntry.getDLFileEntryType().getName());
        } catch (PortalException e) {
            // handle error
        }
    }
}


由于 DLFileEntryType 名称是 localized,您应该将其索引为本地化值:

package com.test.liferay.override;

import com.liferay.document.library.kernel.model.DLFileEntry;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.search.Document;
import com.liferay.portal.kernel.search.Field;
import com.liferay.portal.kernel.util.LocaleUtil;
import com.liferay.portal.search.spi.model.index.contributor.ModelDocumentContributor;
import org.osgi.service.component.annotations.Component;

import java.util.Locale;

@Component(
        immediate = true,
        property = "indexer.class.name=com.liferay.document.library.kernel.model.DLFileEntry",
        service = ModelDocumentContributor.class
)
public class DLFileEntryModelDocumentContributor
        implements ModelDocumentContributor<DLFileEntry> {

    @Override
    public void contribute(Document document, DLFileEntry dlFileEntry) {
        try {
            Locale siteDefaultLocale = LocaleUtil.getSiteDefault();

            String localizedName = dlFileEntry
                    .getDLFileEntryType().getName(siteDefaultLocale);
            String localizedField = Field.getLocalizedName(
                    siteDefaultLocale, "fileEntryTypeName");

            document.addText(localizedField, localizedName);
        } catch (PortalException e) {
            // handle error
        }
    }
}

现在您的查询将是这样的:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "entryClassName": "com.liferay.document.library.kernel.model.DLFileEntry"
          }
        },
        {
          "match": {
            "fileEntryTypeName_en_US": "XY"
          }
        }
      ]
    }
  }
}

名称 fileEntryTypeName_en_US 取决于您站点的默认区域设置。例如,如果它是 pt_BR,则名称将是 fileEntryTypeName_pt_BR.

Obs.: fileEntryType 名称字段不是唯一的,因为它是本地化的,因此您可能会发现 fileEntryType 名称相同但 fileEntryType.[=30 不同的文件=]