ユーザーが別の言語で検索している場合、ドキュメントが見つかりません
knowledge-article-header-disclaimer-how-to
knowledge-article-header-disclaimer
legacy-article
learn-legacy-article-disclaimer-text
問題
- デフォルトのポータル言語を使用して、テキスト内のキーワードでテキスト ドキュメント (PDF など) を検索すると、そのドキュメントが検索結果に表示されます。
- 言語が異なると、ドキュメントが見つかりません。
Environment
- Liferay DXP 7.0, 7.1, 7.2, 7.3
解決
- ドキュメントのテキストは、Elasticsearch 要素
content_$locale
の下でインデックス化されます。 $locale
はポータルのデフォルト言語です (例: content_en_US
)。 そのため、別の言語で検索しても結果は返されません。 詳細については、 Searching for Localized Content 参照してください。
- 回避策として、 Indexer Post ProcessorのDXP 7.0 ガイドで入手可能な BLADE サンプルを使用して DLFileEntryIndexerPostProcessor モジュールを作成します。
- DXP 7.0 のサンプル コードを開始します。
/**
* Copyright 2000-present Liferay, Inc.
*/
package com.liferay.document.library.indexerpostprocessor;
import com.liferay.document.library.kernel.model.DLFileEntry;
import com.liferay.petra.string.StringPool;
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.IndexerPostProcessor;
import com.liferay.portal.kernel.search.SearchContext;
import com.liferay.portal.kernel.search.Summary;
import com.liferay.portal.kernel.search.filter.BooleanFilter;
import com.liferay.portal.kernel.util.LocalizationUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.Validator;
import java.util.Locale;
import org.osgi.service.component.annotations.Component;
@Component(
immediate = true,
property = {
"indexer.class.name=com.liferay.document.library.kernel.model.DLFileEntry"
},
service = IndexerPostProcessor.class
)
public class DLFileEntryIndexerPostProcessor implements IndexerPostProcessor {
@Override
public void postProcessContextBooleanFilter(
BooleanFilter booleanFilter, SearchContext searchContext)
throws Exception {
}
@Override
public void postProcessContextQuery(
BooleanQuery contextQuery, SearchContext searchContext)
throws Exception {
}
@Override
public void postProcessDocument(Document document, Object obj)
throws Exception {
DLFileEntry dlFileEntry = (DLFileEntry) obj;
Locale defaultLocale = PortalUtil.getSiteDefaultLocale(dlFileEntry.getGroupId());
String localizedField = LocalizationUtil.getLocalizedName(Field.CONTENT, defaultLocale.toString());
Field localizedContentField = document.getField(localizedField);
document.addText(Field.CONTENT, localizedContentField.getValue());
}
@Override
public void postProcessFullQuery(
BooleanQuery fullQuery, SearchContext searchContext)
throws Exception {
}
@Override
public void postProcessSearchQuery(
BooleanQuery searchQuery, BooleanFilter booleanFilter,
SearchContext searchContext)
throws Exception {
}
@Override
public void postProcessSearchQuery(
BooleanQuery searchQuery, SearchContext searchContext)
throws Exception {
}
@Override
public void postProcessSummary(
Summary summary, Document document, Locale locale, String snippet) {
if (Validator.isBlank(summary.getContent())) {
String prefix = Field.SNIPPET + StringPool.UNDERLINE;
String content = document.get(prefix + Field.CONTENT, Field.CONTENT);
summary.setContent(content);
}
}
}
- DXP 7.1 の場合、このサンプルは開始点として適しています。IndexerPostProcessorに関するIndexerPostProcessorのガイドに従う必要がある場合があります。
- DXP 7.2 および DXP 7.3 では、メソッド
postProcessContextQuery(BooleanQuery contextQuery, SearchContext searchContext)
および postProcessSearchQuery(BooleanQuery searchQuery, SearchContext searchContext)
をスキップする必要があります。
-
注: 変更を有効にするには、このモジュールを展開した後にドキュメントとメディア エンティティを再インデックスする必要があります。
did-this-article-resolve-your-issue