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 dlfileentrytype
的 fileentrytypeid
列中找到此 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 不同的文件=]
我使用 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 dlfileentrytype
的 fileentrytypeid
列中找到此 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 不同的文件=]