DocValuesとは?
DocValues とは、フィールドの値を内部的に記録する方法。
ソートやファセットなどの一部の目的では、従来のインデックスよりも効率的。
全文検索は 転置インデックス を使って高速な検索を行う。
転置インデックスは、ソート/ファセット/グルーピングなどの処理には不向き。
そこでDocValues。
- ドキュメントをキーに値を持つ、列指向のインデックス
- FieldCacheよりメモリ効率が上がる(?)
- ソート/ファセット/グルーピングのための検索が早くなる
- 他にも /export handler, Stream Expressions など DocValues 前提の機能が使える
- FieldCacheは最初のクエリー時に構築されるが、DocValuesはインデクシング時に構築される
- 頻繁に更新されるデータ(NRT)向き
- JVMのヒープを圧迫しないようOSのメモリを使う(ファイルに書き出される)
DocValuesの有効化
Solrでの設定方法
<field name="field123" type="string" indexed="false" stored="false" docValues="true" />
フィールドの定義やフィールドタイプの定義に docValues="true" を追加するだけ。
ただし、全データの再インデックスが必要。
本当は uninvertible=”false”
にして、必要な所で docValues="true"
することが強く推奨されている(その場合 indexed=”true” docValues="false"
だとソート/ファセット/グルーピングが出来なくなる)。
型ごとの対応状況
フィールド | multi-valuedでの重複可否 | ソート |
---|---|---|
StrField UUIDField |
重複不可(除去) | - |
BoolField | 重複不可(除去) | - |
DatePointField DoublePointField FloatPointField IntPointField LongPointField |
重複可 | single-valueの場合、ソートのためにDocValues必須 |
EnumFieldType | 重複不可(除去) | - |
CurrencyFieldType | 重複不可(除去) | - |
その他、非推奨フィールドのいくつかに対応している。
multi-valuedの場合、値はソート済みの状態で保持される。挿入順ではないので注意。
また、 *PointField
のみmulti-valuedでも値を重複して保持でき、他のフィールドタイプと挙動が異なるので注意。
その他
DocValues関連のデータはメモリとディスクに保存される(Luceneデフォルト)
docValuesFormat=Direct
で全てメモリ上に保存できる
docValuesFormat=Disk
で全てディスク上に保存できる(最小限のデータをメモリに読み込む)
Luceneはデフォルトの挙動しか保証していない。将来的に無効になる可能性はある。
DocValuesの使い方
値の保持について
useDocValuesAsStored=”true”
にすると値も保持できる(スキーマバージョン1.6以上の場合 true
がデフォルト)。
useDocValuesAsStored=”false”
の場合、
-
fl=*
にマッチしないのでレスポンスに含まれない(q=*:*
も) - フィールド指定すれば値を取得できるが、DocValuesは列指向のためコストがかかる
- multi-valuedフィールドでは値はソートされ、重複排除される(
SORTED_SET
の場合) - multi-valuedフィールドでも
stored=”true”
にすれば挿入順で取得できる(サイズ増)
パフォーマンスへの影響
docValues="true"
のフィールドのみ取得した場合、パフォーマンスが上がる可能性がある
- ディスクにアクセスせず、全てのデータをメモリから取得できるから
- メモリから落ちてる部分はディスクから取得することになりそう?
参考情報