SITECORE MANIA 開発者向け技術ブログ

インデックス検索

渡部

渡部

Sitecoreの絵文字をSolrに登録・取得する方法

Sitecoreのフィールドに登録された絵文字をSolrに正しくインデックスし、取得・表示できるようにする方法を紹介します。

通常、Single-Line Textなどのフィールドに絵文字を含む値を登録した場合、Solrにインデックスされる際に絵文字が除外されてしまいます。これは、既定の設定ではSingle-Line TextフィールドがSolrでは text_general 型として登録されることが多く、トークナイズの過程で絵文字などの一部の文字が除外されてしまうためです。

そのため、絵文字を含む文字列を正確に保持したい場合は、Solrの string 型(トークナイズされない StrField)としてインデックスする必要があります。Solrから値を取得して出力しようとすると、元のフィールドに登録された内容と異なり、絵文字が欠落した状態で表示されてしまいます。

この問題を回避するために、本記事では、Solrにインデックスされる前にフィールドの値をエンコードし、Solrから取得した後にデコードすることで、絵文字を含む値も正しく保持・表示できるようにする手法を紹介します。

フィールド登録処理

public class EncodeTitleField : IComputedIndexField
{
    public string FieldName { get; set; }
    public string ReturnType { get; set; } = "string";
    public object ComputeFieldValue(IIndexable indexable)
    {
        if (indexable is SitecoreIndexableItem indexableItem)
        {
    // Titleにはフィールド名が入る
            string text = indexableItem.Item["Title"];
            if (!string.IsNullOrEmpty(text))
            {
                // UTF-8エンコード
                byte[] encodedBytes = Encoding.UTF8.GetBytes(text);
                // Base64エンコード
                return Convert.ToBase64String(encodedBytes);
            }
        }
        return null;
    }
}

configでフィールドの追加


  namespace + クラス名, プロジェクト名

上記コードを反映し、インデックスの再構築を行った結果下記のようなフィールドが追加されます。

このままではエンコードされた値のため、取得時に下記処理でデコードを行うます。

デコード処理

// inputにはencode_fieldの値が入る
public static string FieldValueDecode(string input)
{
    if (string.IsNullOrEmpty(input)) return string.Empty;
    byte[] decodedBytes = System.Convert.FromBase64String(input);
    string decodedValue = System.Text.Encoding.UTF8.GetString(decodedBytes);
    return decodedValue;
}

以上になります。



※エントリーの内容・画像等は、公開時点での情報に基づきます。
※Sitecoreのバージョンによって実装されている機能が異なります。

この記事を読んだ人はこちらの記事も読んでます

Sitecore導入に関するご相談・資料ダウンロード

導入をご検討・ご依頼の方や、サービスについてご不明点がございましたらお気軽にお問い合わせください。

Sitecoreの運用問題を解決する

既にSitecoreを導入しているお客様向けサービス