DocValues

DocValues は、ソートやファセットなど、従来のインデクシングよりも一部の用途で効率的な、フィールド値を内部的に記録する方法です。

DocValuesを使用する理由

Solrがインデックスを構築する標準的な方法は、*転置インデックス*を使用することです。この方法では、インデックス内のすべてのドキュメントで見つかった用語のリストを作成し、各用語の隣に、その用語が出現するドキュメントのリスト(およびそのドキュメントにその用語が何回出現するか)を配置します。ユーザーは用語で検索するため、用語とドキュメントの値のリストを用意しておくことで、クエリプロセスが高速化されます。

現在検索に関連付けられているソート、ファセット、強調表示などの他の機能では、このアプローチはあまり効率的ではありません。たとえば、ファセットエンジンは、結果セットを構成する各ドキュメントに出現する各用語を検索し、ファセットリストを作成するためにドキュメントIDを取得する必要があります。Solrでは、これはメモリに保持されており、読み込みに時間がかかる場合があります(ドキュメントの数、用語の数などに依存します)。

Lucene 4.0では、新しいアプローチが導入されました。DocValueフィールドは、インデックス時に構築されたドキュメントと値のマッピングを持つ、列指向のフィールドになりました。このアプローチは、fieldCacheのメモリ要件の一部を軽減し、ファセット、ソート、グループ化の検索をはるかに高速化することを約束します。

DocValuesの有効化

docValuesを使用するには、使用するフィールドで有効にするだけです。すべてのスキーマ設計と同様に、フィールドタイプを定義し、docValuesを有効にしたそのタイプのフィールドを定義する必要があります。これらのすべてのアクションは、スキーマで行われます。

docValuesのフィールドを有効にするには、Solrの `sample_techproducts_configs` 設定セットのこの例のように、フィールド(またはフィールドタイプ)定義に `docValues="true"` を追加するだけです。

<field name="manu_exact" type="string" indexed="false" stored="false" docValues="true" />
Solrインデックスにすでにデータをインデックス化している場合は、docValuesを正常に使用するには、スキーマでフィールド定義を変更した後、コンテンツを完全に再インデックス化する必要があります。

DocValuesは、特定のフィールドタイプでのみ使用できます。選択されたタイプによって、使用される基になるLucene docValueタイプが決まります。使用可能なSolrフィールドタイプは次のとおりです。

  • `StrField`、および`UUIDField`

    • フィールドが単一値の場合(つまり、複数値がfalseの場合)、Luceneは`SORTED`タイプを使用します。

    • フィールドが複数値の場合、Luceneは`SORTED_SET`タイプを使用します。エントリはソート順に保持され、重複は削除されます。

  • `BoolField`:

    • フィールドが単一値の場合(つまり、複数値がfalseの場合)、Luceneは`SORTED`タイプを使用します。

    • フィールドが複数値の場合、Luceneは`SORTED_SET`タイプを使用します。エントリはソート順に保持され、重複は削除されます。

  • 任意の`*PointField`数値または日付フィールド、`EnumFieldType`、および`CurrencyFieldType`

    • フィールドが単一値の場合(つまり、複数値がfalseの場合)、Luceneは`NUMERIC`タイプを使用します。

    • フィールドが複数値の場合、Luceneは`SORTED_NUMERIC`タイプを使用します。エントリはソート順に保持され、重複は保持されます。

  • 非推奨の`Trie*`数値または日付フィールド、`EnumField`、および`CurrencyField`のいずれか

    • フィールドが単一値の場合(つまり、複数値がfalseの場合)、Luceneは`NUMERIC`タイプを使用します。

    • フィールドが複数値の場合、Luceneは`SORTED_SET`タイプを使用します。エントリはソート順に保持され、重複は削除されます。

これらのLuceneタイプは、値がどのようにソートおよび格納されるかに関連しています。

追加の設定オプションとして、フィールドタイプで使用される`docValuesFormat`を変更することができます。デフォルトの実装では、一部のものをメモリにロードし、一部をディスクに保持する方法が採用されています。ただし、場合によっては、代替のDocValuesFormat実装を指定することもできます。たとえば、フィールドタイプで`docValuesFormat="Direct"`を指定することで、すべてをメモリに保持することを選択できます。

<fieldType name="string_in_mem_dv" class="solr.StrField" docValues="true" docValuesFormat="Direct" />

`docValuesFormat`オプションは、将来のリリースで変更される可能性があることに注意してください。

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

DocValuesの使用

ソート、ファセット、関数

フィールドでdocValues="true"が設定されている場合、フィールドがソートファセット、または関数クエリに使用される場合は常に、DocValuesが自動的に使用されます。

検索クエリ中に取得されるフィールド値は、通常、格納された値から返されます。ただし、すべてのフィールド(またはパターンマッチンググロブ)が検索クエリで返されるように指定されている場合(例:「fl=*」)、格納されていないdocValuesフィールドも他の格納されたフィールドと共に返されます。これは、各フィールドのuseDocValuesAsStoredパラメータの有効値によって異なります。スキーマバージョン1.6以降では、暗黙のデフォルトはuseDocValuesAsStored="true"です。詳細については、フィールドタイプの定義とプロパティおよびフィールドを参照してください。

useDocValuesAsStored="false"の場合、格納されていないDocValuesフィールドは、flパラメータで名前を明示的に指定することで要求できますが、グロブパターン("*")には一致しません。

クエリ時に「通常の」格納フィールドと共にDocValuesを返すことには、格納フィールドにはないパフォーマンスへの影響があります。DocValuesは列指向であるため、返される各ドキュメントの取得に追加のコストがかかる可能性があるからです。

DocValuesから格納されていないフィールドを返す場合、複数値フィールドの値は、挿入順ではなくソート順で返され、重複が削除される場合があります(上記参照)。複数値フィールドを元の挿入順序で返す必要がある場合は、複数値フィールドを格納済みとして設定してください(このような変更には再インデックスが必要です)。

クエリがdocValuesフィールド*のみ*を返す場合、パフォーマンスが向上する可能性があります。格納フィールドを返すにはディスクの読み取りと解凍が必要ですが、flリストのdocValuesフィールドを返すにはメモリへのアクセスのみが必要になるためです。

docValues形式からフィールドを取得する場合(`/export`ハンドラストリーミング式を使用する場合、またはフィールドがflパラメータで要求されている場合など)、通常の格納フィールドとdocValuesフィールドの2つの重要な違いを理解する必要があります。

  1. 順序は*保持されません*。格納フィールドを取得する場合、挿入順序が戻り順序になります。docValuesの場合、*ソート*順序になります。

  2. SORTED_SETを使用するフィールドタイプの場合(上記参照)、複数の同一のエントリは単一の値に折りたたまれます。したがって、値4、5、2、4、1が挿入された場合、返される値は1、2、4、5になります。