legacy-knowledge-base
公開されました Jul. 2, 2025

ユーザーが別の言語で検索している場合、ドキュメントが見つかりません

written-by

Adam Zsolnay

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

legacy-knowledge-base