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のバージョンによって実装されている機能が異なります。