カスタム・フィールド型用のインターフェイス

CustomFieldTypeインターフェイスは、Apache Solrカスタム・フィールド型にマークを付け、それらが実際に格納されるフィールド型を提供しています。

DSE Searchは、Apache Solrカスタム・フィールド型にマークを付け、それらが実際に格納されるフィールド型を提供するCustomFieldTypeインターフェイスを実装しています。カスタム・フィールド型は整数トライ・フィールドを、コンマで区切られた整数値のリストを表す文字列として格納します。インデックスの作成時に、文字列はその整数値に分かれ、それぞれがトライ整数フィールドとしてインデックスが作成されます。このクラスは、文字列表現に基づいて複数値のフィールドを効率よく実装します。

CustomFieldTypeは、このメソッドをオーバーライドして、フィールドのtoObject()を呼び出すかどうかを決定するときに確認するバイナリー応答ライターのFieldTypeを提供します。これにより、バイナリー応答ライターは、たとえばTrieDateFieldを拡張するCustomFieldTypeのテキストの代わりにjava.util.Dateを返すことができるようになります。

カスタム・フィールド型によってそれらのシリアライズされた値を制御するには、以下を使用します。
public Class<? extends FieldType> getKnownType() 
   {
   return getClass();
   }
リファレンス実装例を参照してください。

手順

CustomFieldTypeインターフェイスを使用するには:
  1. 以下のリファレンス実装のようなカスタム・フィールド型クラスを実装します。
  2. クラスをJARにエクスポートし、そのJARをこの場所に配置します。
    • パッケージ・インストール: /usr/share/dse/solr/libusr/share/dse
    • tarボール・インストール: install-location/resources/solr/libinstallation_location/resources/dse/lib
    JARは自動的にCLASSPATHに追加されます。

リファレンス実装

カスタム・フィールド型クラスの例を以下に示します。

package com.datastax.bdp.search.solr.functional;
    
    import com.datastax.bdp.search.solr.CustomFieldType;
    import java.util.ArrayList;
    import java.util.List;
    import org.apache.lucene.index.IndexableField;
    import org.apache.solr.schema.FieldType;
    import org.apache.solr.schema.SchemaField;
    import org.apache.solr.schema.StrField;
    import org.apache.solr.schema.TrieField;
    
    public class CustomTestField extends TrieField implements CustomFieldType
    {
    public CustomTestField()
    {
    this.type = TrieField.TrieTypes.INTEGER;
    }
    
    @Override
    public FieldType getStoredFieldType()
    {
    return new StrField();
    }
    
    @Override
    public boolean multiValuedFieldCache()
    {
    return true;
    }
    
    @Override
    public ListIndexableField createFields(SchemaField sf, Object value)
    {
    String[] values = ((String) value).split(" ");
    ListIndexableField fields = new ArrayListIndexableField();
    for (String v : values)
    {
    fields.add(createField(sf, v));
    }
    return fields;
    }
    
    @Override
    public String toInternal(String value)
    {
    return value;
    }
    
    @Override
    public String toExternal(IndexableField f)
    {
    return f.stringValue();
    } 
    
    public Class<? extends FieldType> getKnownType() 
    {
    return TrieField.class;
    }
    
    }