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

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

written-by

Adam Zsolnay

How To articles are not official guidelines or officially supported documentation. They are community-contributed content and may not always reflect the latest updates to Liferay DXP. We welcome your feedback to improve How To articles!

While we make every effort to ensure this Knowledge Base is accurate, it may not always reflect the most recent updates or official guidelines.We appreciate your understanding and encourage you to reach out with any feedback or concerns.

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