Sitecore Search - PDF の取り扱い

公開日 :

Sitecore Search は HTML 以外にもドキュメントに関しても検索をすることができます。今回は、PDF のファイルを対象にする手順を紹介していきます。

Attribute の確認

すでに以前の記事で、この SDK を活用するにあたって Attribute として以下の2つの項目を追加していました。

  • File Type

  • Parent_url

これを利用して、PDF のファイルに対しては PDF の属性をつけていきたいと思います。

クローラーの設定

対象ドメインを追加する

sitecore.com で PDF を提供するにあたって、PDF ファイルは別のドメインを利用しています。例えば以下のページが該当します。

PDF ファイルの URL は https://wwwsitecorecom.azureedge.net/-/media/sitecoresite/files/home/customers/technology/canon/2020-canon-jp.pdf?md=20200622T142037Z となっており、CDN を経由してダウンロードができるようになっています。このドメインは現在のクローラーでは対象に入れていないため、まずこれを追加する必要があります。

このため、クロールしているソースの設定に、ドメインを追加します。

Max Depth の設定

この項目は、ページに含まれているリンクに対してどれくらいリンクを辿って Index 化をするかを設定することができます。この設定に関しては以下のページに記載されていますが、

デフォルトでは、sitemap および sitemap index を選択している時は 0、そうではない場合は 2 となっています。今回は sitemap を利用しているため、この値を 1 にする必要があります。

random desc

これで、クロールにあわせて PDF ファイルもリンクされていればクロールしてインデックス化ができるようになりました。とはいえ、PDF だけを検索したい、とするために、以下の処理を追加しています。

Document Extractor で PDF の処理を追加する

これまでクローラーが取得したデータに関しては、1つの Document Extractor の処理で済ませていましたが、今回は PDF に関して、それ以外という形で処理をしていきたいと思います。

まず Document Extractor の処理として PDF の処理を追加します。追加する内容は以下のようにします。

  • 名前を PDF とします

  • 処理は JavaScript を選択します

  • URLs to Match は、Glob Expression を選択、 **/*.pdf* を設定して拡張子が PDF の場合のみ処理をするとします。

    • Sitecore の Media Library を参照する際には .pdf の後ろにキーが追加されるため、上記のようになりますが、.pdf で終わる場合は後ろの * は不要です

  • 処理をする順番はすでにある JS の処理よりも前に配置します

random desc

Add tagger をクリックして、JavaScript としては以下の処理を追加してください。

function extract(request, response) {
    const translate_re = /&(nbsp|amp|quot|lt|gt);/g;

    function decodeEntities(encodedString) {
        return encodedString.replace(translate_re, function(match, entity) {
            return translate[entity];
        }).replace(/&#(\d+);/gi, function(match, numStr) {
            const num = parseInt(numStr, 10);
            return String.fromCharCode(num);
        });
    }

    function sanitize(text) {
        return text ? decodeEntities(String(text).trim()) : text;
    }

    $ = response.body;
    url = request.url;
    id = url.replace(/[.:/&?=%]/g, '_');
    title = sanitize($('title').text());
    description = $('body').text().substring(0, 7000);

    $p = request.context.parent.response.body;

    if (title.length <= 4 && $p) {
        title = $p('title').text();
    }

    parentUrl = request.context.parent.request.url;
    type = request.context.parent.documents[0].data.type;
    last_modified = request.context.parent.documents[0].data.last_modified;

    return [{
        'id': id,
        'file_type': 'pdf',
        'type': type,
        'last_modified': last_modified,
        'title': title,
        'description': description,
        'parent_url': parentUrl
    }];
}

Localized に関してもチェックして以下のような画面になっていればクロールの標準設定は完了です。

random desc

PDF ファイルに関しても Locale を設定しますが、PDF ファイル自体の URL にはロケールが含まれていません。そこで、Parent_url を利用して、リンクしている下のページのローケルを利用して各言語に対して格納しています。コードは以下のような形です。

function extract(request, response) {
    parentUrl = request.context.parent.request.url;
    locales = ['zh-cn','de-de','ja-jp','da']; 
    for (idx in locales) {
        locale = locales[idx];
        if (parentUrl.indexOf('/' + locale + '/') >= 0) {
            if (locale == 'da')
                locale = 'da-dk';
            return locale.toLowerCase().replace('-','_');
        }
    }
    return "en_us";
}

設定後の画面は以下のようになります。

random desc

最後に、Request Extractor で PDF に関する処理を追加します。PDF に関しては標準ではクロールしない形となっているため、この追加処理をする必要があるためです。

javascript function extract(request, response) { const $ = response.body; const regex = /.*\.pdf(?:\?.*)?$/; return $('a') .toArray() .map((a) => $(a).attr('href')) .filter((url) => regex.test(url)) .map((url) => ({ url })); }

random desc

Document Extractor および Locale Extractor の設定がソースに対して設定されていれば以下のような画面となります。

random desc

Publish をクリックして、新しい設定でクロールを実行します(今回は対象のコンテンツを 6000 まで増やしました)。

コンテンツの確認

実際に完成できたコンテンツを確認していきます。管理画面のコンテンツからクロールができているコンテンツ一覧から、対象のソース、およびファイルタイプを指定すると、PDF ファイルの一覧が表示されます。合わせてコンテンツの属性を確認すると PDF が設定されているのがわかります。

random desc

まとめ

今回は PDF もクロールの対象に追加して、コンテンツ一覧で PDF のファイルとしてファイルタイプを利用できることを確認しました。