フィールド型の定義とプロパティ

フィールド型は、ドキュメントがインデックスに作成されたとき、またはクエリがインデックスに送信されたときに、フィールドで発生する分析を定義します。

フィールド型定義には、次の4種類の情報を含めることができます

  • フィールド型の名前(必須)。

  • 実装クラス名(必須)。

  • フィールド型が TextField の場合、フィールド型のフィールド分析の説明。

  • フィールド型プロパティ - 実装クラスによっては、必須のプロパティがある場合があります。

スキーマ内のフィールド型定義

フィールド型は、コレクションの スキーマで定義されます。各フィールド型は、fieldType 要素の間で定義されます。オプションで、types 要素内でグループ化できます。

以下は、text_general というタイプのフィールド型定義の例です

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> (1)
  <analyzer type="index"> (2)
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
    <!-- in this example, we will only use synonyms at query time
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
    -->
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>
1 上記の例の最初の行には、フィールド型の名前 text_general と、実装クラスの名前 solr.TextField が含まれています。
2 定義の残りの部分は、Solr でのドキュメント分析で説明されているフィールド分析に関するものです。

実装クラスは、フィールドが正しく処理されるようにする責任があります。クラス名では、文字列 solrorg.apache.solr.schema または org.apache.solr.analysis の省略形です。したがって、solr.TextField は実際には org.apache.solr.schema.TextField です。

フィールド型プロパティ

フィールド型の class はフィールド型の動作の大部分を決定しますが、オプションのプロパティも定義できます。たとえば、次の日付フィールド型の定義では、sortMissingLast および omitNorms という2つのプロパティを定義しています。

<fieldType name="date" class="solr.DatePointField"
           sortMissingLast="true" omitNorms="true"/>

特定のフィールド型に指定できるプロパティは、主に次の3つのカテゴリに分類されます

  • フィールド型のクラスに固有のプロパティ。

  • 一般プロパティ Solr が任意のフィールド型でサポートするもの。

  • フィールドのデフォルトプロパティ。フィールド型で指定でき、デフォルトの動作の代わりにこの型を使用するフィールドによって継承されます。

一般プロパティ

これらはフィールドの一般プロパティです

name

必須

デフォルト: なし

fieldTypeの名前です。この値は、フィールド定義の "type" 属性で使用されます。名前は英数字またはアンダースコア文字のみで構成し、数字で開始しないことを強く推奨します。これは現在、厳密には強制されていません。

class

必須

デフォルト: なし

この型のデータを保存およびインデックス化するために使用されるクラス名です。組み込みクラス名の先頭に "solr." を付けると、Solr がクラスを検索するパッケージを自動的に判断することに注意してください。例えば、solr.TextField は機能します。

サードパーティのクラスを使用する場合は、完全修飾クラス名が必要になる可能性があります。solr.TextField の完全修飾名は org.apache.solr.schema.TextField です。

positionIncrementGap

オプション

デフォルト: なし

複数値フィールドの場合、複数の値間の距離を指定します。これにより、誤ったフレーズの一致を防ぎます。

autoGeneratePhraseQueries

オプション

デフォルト: なし

テキストフィールドの場合。true の場合、Solr は隣接する用語のフレーズクエリを自動的に生成します。false の場合、フレーズとして扱われるには、用語を二重引用符で囲む必要があります。

synonymQueryStyle

オプション

デフォルト: as_same_term

重複するクエリ用語(つまり、同義語)のスコアを組み合わせるために使用されるクエリです。「青いTシャツ」の検索で、クエリ時の同義語が tshirt,tee である場合を考えます。

  • as_same_term: 用語をブレンドします。つまり、SynonymQuery(tshirt,tee) では、各用語が同じように重要であると扱われます。このオプションは、用語が真の同義語(例:「テレビ、tv」)の場合に適しています。

  • pick_best: スコアリング時に最も重要な同義語を選択します Dismax(tee,tshirt)。同義語が下位語に展開される場合 (q=jeans w/ jeans⇒jeans,pants) に、正確なものが親および兄弟の概念よりも前に来るようにする場合に使用します。

  • as_distinct_terms: スコアリングを最も重要な同義語 (pants OR slacks) に偏らせます。

    このブログ記事 Solr Synonyms and Taxonomies: Mea Culpa では、同義語の展開に関する Solr の動作について説明しています。

enableGraphQueries

オプション

デフォルト: true

テキストフィールドの場合、sow=false(デフォルト)でクエリを実行する場合に適用されます。グラフ対応のフィルター(例:Synonym Graph FilterWord Delimiter Graph Filter)を含むクエリアナライザーを持つフィールドタイプの場合は、true を使用します。

一部のトークンが欠落している場合にドキュメントを照合できるフィルターを含むクエリアナライザーを持つフィールドタイプの場合は、false を使用します(例:Shingle Filter)。

docValuesFormat

オプション

デフォルト: なし

このタイプのフィールドに使用するカスタム DocValuesFormat を定義します。これには、Schema Codec Factory などのスキーマ対応コーデックを使用する必要があります。

postingsFormat

オプション

デフォルト: なし

このタイプのフィールドに使用するカスタム PostingsFormat を定義します。これには、Schema Codec Factory などのスキーマ対応コーデックを使用する必要があります。

Lucene インデックスの後方互換性は、デフォルトのコーデックでのみサポートされています。スキーマで postingsFormat または docValuesFormat をカスタマイズする場合は、将来のバージョンの Solr にアップグレードする際に、アップグレード前にデフォルトのコーデックに戻してインデックスを最適化してデフォルトのコーデックに書き換えるか、アップグレード後にインデックス全体を最初から再構築する必要がある場合があります。

フィールドのデフォルトプロパティ

これらは、フィールドタイプで指定することも、個々のフィールドで指定してフィールドタイプによって提供される値をオーバーライドすることもできるプロパティです。

各プロパティのデフォルト値は、基になる FieldType クラスによって異なり、それは <schema/>version 属性によって異なります。以下の表には、version="1.6" を宣言するスキーマを想定して、Solr が提供するほとんどの FieldType 実装のデフォルト値が含まれています。

プロパティ 説明 暗黙的なデフォルト

indexed

true の場合、フィールドの値は、一致するドキュメントを取得するためのクエリで使用できます。

true

stored

true の場合、フィールドの実際の値はクエリで取得できます。

true

docValues

true の場合、フィールドの値は列指向の DocValues 構造に格納されます。

false

sortMissingFirst, sortMissingLast

ソートフィールドが存在しない場合のドキュメントの配置を制御します。

false

multiValued

true の場合、単一のドキュメントにこのフィールドタイプの複数の値が含まれる可能性があることを示します。

false

uninvertible

true の場合、indexed="true" docValues="false" フィールドは、クエリ時に「反転」して、DocValues の代わりに機能する大規模なインメモリデータ構造を構築できることを示します。歴史的な理由により、デフォルトは true ですが、安定性のために false に設定し、必要に応じて docValues="true" を使用することを強く推奨します。

true

omitNorms

true の場合、このフィールドに関連付けられているノルムを省略します(これにより、フィールドの長さの正規化が無効になり、メモリが節約されます)。int、float、data、bool、string などのすべてのプリミティブ(非分析)フィールドタイプでは、デフォルトは true です。フルテキストフィールド、またはインデックス時のブーストが必要なフィールドのみがノルムを必要とします。

*

omitTermFreqAndPositions

true の場合、このフィールドのポスティングから、用語の頻度、位置、およびペイロードを省略します。これにより、その情報を必要としないフィールドのパフォーマンスが向上します。また、インデックスに必要なストレージスペースも削減されます。このオプションが指定されたフィールドに対して発行された位置に依存するクエリは、ドキュメントを見つけることができずに失敗します。このプロパティは、テキストフィールドではないすべてのフィールドタイプでデフォルトで true になります。

*

omitPositions

omitTermFreqAndPositions と似ていますが、用語の頻度情報を保持します。

*

termVectors, termPositions, termOffsets, termPayloads

これらのオプションは、Solr に各ドキュメントの完全なタームベクターを保持するように指示し、オプションで、それらのベクター内の各用語の出現箇所に関する位置、オフセット、およびペイロード情報を含めます。これらは、強調表示やその他の補助機能を高速化するために使用できますが、インデックスサイズの点でかなりのコストがかかります。Solr の一般的な使用では必須ではありません。

false

required

Solr に、このフィールドの値を持たないドキュメントを追加しようとする試みを拒否するように指示します。このプロパティのデフォルトは false です。

false

useDocValuesAsStored

フィールドで DocValues が有効になっている場合、これを true に設定すると、fl パラメータ で「*」に一致するときに、(stored=false であっても)フィールドが格納されたフィールドであるかのように返されるようになります。

true

large

大きいフィールドは常に遅延ロードされ、実際の値が 512KB 未満の場合にのみドキュメントキャッシュ内のスペースを占有します。このオプションには stored="true" および multiValued="false" が必要です。非常に大きな値を持つ可能性があり、メモリにキャッシュされないようにするためのフィールドを対象としています。

false

適切な数値タイプの選択

一般的な数値ニーズには、予期される特定の値に応じて、IntPointFieldLongPointFieldFloatPointField、または DoublePointField クラスのいずれかを使用することを検討してください。これらの「次元ポイント」ベースの数値クラスは、使用する範囲のサイズに関係なく、効率的な範囲クエリをサポートするために特別にエンコードされたデータ構造を使用します。ソートやファセットに必要な場合は、これらのフィールドで DocValues を有効にしてください。

一部の Solr 機能はまだ「次元ポイント」では機能しない場合があり、その場合は、同等の TrieIntFieldTrieLongFieldTrieFloatField、および TrieDoubleField クラスを検討することもできます。これらのフィールドタイプは非推奨であり、将来の主要な Solr リリースで削除される可能性がありますが、必要に応じて引き続き使用できます。インデックスサイズを最小限に抑えたい場合は precisionStep="0" を設定しますが、ユーザーが数値型に対して頻繁に範囲クエリを実行すると予想される場合は、デフォルトの precisionStep(指定しない)を使用するか、precisionStep="8"(デフォルト)として指定します。これにより、インデックスサイズが増加する代わりに、範囲クエリの速度が向上します。

テキストの操作

テキストを適切に処理することで、テキスト検索で可能な限り最良の結果をユーザーに提供し、ユーザーを満足させることができます。

1つの手法は、キーワード検索の受け皿としてテキストフィールドを使用することです。ほとんどのユーザーは検索に精通しておらず、最も一般的な検索は単純なキーワード検索になる可能性があります。copyField を使用して、さまざまなフィールドを取り込み、キーワード検索用の単一のテキストフィールドにすべてまとめて入れることができます。

Solr に付属の「techproducts」の例のスキーマでは、copyField 宣言を使用して、catnamemanufeatures、および includes の内容を単一のフィールド text にダンプしています。さらに、ユーザーが製品番号をキーワード検索に渡して特定の製品を検索したい場合に備えて、IDtext にコピーすることも良い考えです。

もう1つの手法は、copyField を使用して同じフィールドをさまざまな方法で使用することです。次のような著者のリストであるフィールドがあるとします。

Schildt, Herbert; Wolpert, Lewis; Davies, P.

著者で検索するには、フィールドをトークン化し、小文字に変換し、句読点を削除します。

schildt / herbert / wolpert / lewis / davies / p

ソートの場合、句読点を削除した小文字に変換された、トークン化されていないフィールドを使用します。

schildt herbert wolpert lewis davies p

最後に、ファセットの場合、StrField を介して主要な著者のみを使用します。

Schildt, Herbert

フィールドタイプの類似性

フィールドタイプは、オプションで、コレクションの「グローバル」類似性が許容する場合に、このタイプのフィールドを参照するドキュメントをスコアリングするときに使用される <similarity/> を指定できます。

デフォルトでは、類似性を定義しないフィールドタイプは、BM25Similarity を使用します。グローバルとタイプごとの類似性の両方を構成する方法の詳細と例については、類似性を参照してください。