lucene DocValues——本質是為通過docID查找某field的值


什么是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有四種實現方式:

  1. Memory

l  實現類:org.apache.lucene.codecs.memory.MemoryDocValuesFormat

運行時正排數據會全部加載到內存中,這部分數據在內存中是壓縮存儲的

 

  1. Direct

l  實現類:org.apache.lucene.codecs.memory.DirectDocValuesFormat

導入到內存中不壓縮使用,這個實際使用的效果應該和老版本的fieldcache差不多吧

  1. SimpleText

l  實現類:org.apache.lucene.codecs.simpletext.SimpleTextDocValuesFormat

這個只是當娛樂只用,不用在環境中使用

以上三種類型定義在lucene-codecs-5.3.0.jar的META-INF/services目錄下

 

  1. Lucene50(默認使用)

l  實現類:org.apache.lucene.codecs.lucene50.Lucene50DocValuesFormat

Lucene50定義存放在lucene-core-5.3.0.jar的META-INF/services目錄下

Lucene50的實現方式和Memory的實現方式大同小異,支持的字段類型更加豐富

 

在lucene50中將docValues的值分成5種類型:

  1. Numeric
  2. Binary
  3. Sorted
  4. SortedSet
  5. 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM