什么是docValues?
docValues是一種記錄doc字段值的一種形式,在例如在結果排序和統計Facet查詢時,需要通過docid取字段值的場景下是非常高效的。
為什么要使用docValues?
這種形式比老版本中利用fieldCache來實現正排查找更加高效,更加節省內存。倒排索引將字段內存切分成一個term列表,每個term都對應着一個docid列表,這樣一種結構使得查詢能夠非常快速,因為term對應的docid是現成就有的。但是,利用它來做統計,排序,高亮操作的時候需要通過docid來找到,field的值卻變得不那么高效了。之前lucene4.0之前會利用fieldCache在實例啟動的時候預先將倒排索引的值load到內存中,問題是,如果文檔多會導致預加載耗費大量時間,還會占用寶貴的內存資源。
索引在lucene4.0之后引入了新的機制docValues,可以將這個理解為正排索引,是面向列存儲的。
DocValues和 field的存儲值(field屬性設置為stored=“true”)有什么區別?
docValues和document的stored=ture存儲的值,都是正排索引,單也是有區別的:
l 存儲方式:
DocValues是面向列的存儲方式,stored=true是面向行的存儲方式,如果通過fieldid取列的值可定是用docValues的存儲結構更高效。
l 是否分詞:
Stored=true的存儲方式是不會分詞的,會將字段原值進行保存,而docValues的保存的值會進行分詞。
DocValues的實現
docValues的類型:
查了一下lucene的源碼,發現DocValues有四種實現方式:
- Memory
l 實現類:org.apache.lucene.codecs.memory.MemoryDocValuesFormat
運行時正排數據會全部加載到內存中,這部分數據在內存中是壓縮存儲的
- Direct
l 實現類:org.apache.lucene.codecs.memory.DirectDocValuesFormat
導入到內存中不壓縮使用,這個實際使用的效果應該和老版本的fieldcache差不多吧
- SimpleText
l 實現類:org.apache.lucene.codecs.simpletext.SimpleTextDocValuesFormat
這個只是當娛樂只用,不用在環境中使用
以上三種類型定義在lucene-codecs-5.3.0.jar的META-INF/services目錄下
- Lucene50(默認使用)
l 實現類:org.apache.lucene.codecs.lucene50.Lucene50DocValuesFormat
Lucene50定義存放在lucene-core-5.3.0.jar的META-INF/services目錄下
Lucene50的實現方式和Memory的實現方式大同小異,支持的字段類型更加豐富
在lucene50中將docValues的值分成5種類型:
- Numeric
- Binary
- Sorted
- SortedSet
- SortedNumeric
類型是由Schema中的field類型決定的:
l StrField或者UUIDField
如果字段不是多值字段,則類型是SORTED
如果是多值字段,則類型是SORTED_SET
l 數值字段Trie*或者EnumField
如MultiValue=false,則NUMERIC
如MultiValued=true,則SORTED_SET
如何使用
Schema field字段設置
<field name="manu_exact"
type="string" indexed="false" stored="false"
docValues="true" />
另外可以通過fieldtype的docValuesFormat屬性來設置docValue的實現策略:
<fieldType name="string_in_mem_dv"
class="solr.StrField" docValues="true"
docValuesFormat="Memory" />
總結
如果在索引上要進行facet,gourp,highlight等查詢盡量使用docValue,這樣不用為內存開銷煩惱了。
例如:solr4.0之后都會需要在schema中設置一個_version_字段來實現對文檔的原子操作,為了節省內存,可以加上docValues:
<field name="_version_"
type="long" indexed="true" stored="true" docValues="true"/>
一個朋友分析得不錯的
http://blog.csdn.net/zteny/article/details/60633374
apache官方說明:
https://cwiki.apache.org/confluence/display/solr/DocValues
轉自:http://mozhenghua.iteye.com/blog/2275932