Solr4.4 docValues解析和性能測試

索引基本信息

服務器IP:192.168.100.48

 

schema.xml基本配置(簡單列下,還有其他屬性)

數據字段

類型

存儲

索引

分詞

docValues

eventid

string

yes

yes

no

 

securityobjectid

string

yes

yes

no

 

eventname

string

yes

yes

yes

 

message

text

yes

yes

yes

 

receivetime

long

yes

yes

no

測試項

 

分詞器:IKAnalyzer

 

數據量:15,000,000 條

 

平均索引1w條索引耗時:3.5s

查詢測試

1、     receivetime屬性設置docValues=”true”

查詢條件:message:permitted  receivetime desc

耗時:0.8s

2、     receivetime屬性不設置docValues=”true”

查詢條件:message:permitted  receivetime desc

耗時:0.9s

 

千萬級別的數據差別不是很大。

 

 解析docValues屬性

原文地址http://wiki.apache.org/solr/DocValues

DocValues從Lucene4.2和Solr4.2開始加入,通過建立字段的正排索引,提升sorting, faceting, grouping, function queries等性能。

介紹

在Solr的配置文件(schema.xml)中,如果需要爲一個Filed建立倒排索引,可以通過配置(indexed=”true”)來實現,DocValues是一種正排索引方式,通過設置(DocValues=”true”)來實現。

1、docvalues的特性

近實時索引:在每一個索引段裏面都會有一個docvalues數據結構,這個結構與索引同時建立,並且能夠快速更新、生效;

基本的查詢和過濾支持:你可以做基本的詞、範圍等基本查詢,但是不參與評分,並且速度較慢,如果你對速度和評分排序有要求,你可以講該字段設置爲(indexed=”true”)

更好的壓縮比: Docvalues fields 的壓縮效果比 fieldcache好,但不強調做到極致。

節約內存:你可以定義一個fieldType的 docValuesFormat (docValuesFormat="Disk"),這樣的只有一小部分數據加載到內存,其它部分保留在磁盤上。

 

2、docvalues不能實現的

不能用來代替存儲字段:這和字段存儲完全不同,只是一些便於(sort/facet/group/join/scoring)檢索的數據存儲結構。

對於靜態索引不是最有選擇:如果你有一個完全不更新的索引,docvalues看起來不會很吸引你。另一方面如果你需要和fieldcache對比,繼續往下看。

風險較大:這個功能在4.2版本整合到Solr,非常新,可能仍有一些未知的bug!

 

Lucene的 DocValues 格式

Lucene有四個基礎字段類型可以使用docvalues。目前Solr使用了其中三種:

 

NUMERIC:每一個文檔裏面只有一個這樣類型的單值字段。這就像在整個索引裏有一個很大的long[],數據基於實際使用的值經過壓縮的。

例如,假設有3個這樣的文檔:
doc[0] = 1005
doc[1] = 1006
doc[2] = 1005

在這個例子中,每個文檔僅需要一個bit。

 

SORTED:每一個文檔裏面有一個這樣類型的單值字段。這就像在整個索引裏有一個很大的String[], 但用的是不同的尋址方式。.每一個唯一的value被賦予一個數字代表其順序。所以每個文檔只是記錄一個壓縮後的整數,有字典來還原他們原來的詞。

例如,假設有3個這樣的文檔:
doc[0] = “aardvark”
doc[1] = “beaver”
doc[2] = “aardvark”

值 “aardvark” 被映射成0,”beaver”映射成1, 建立兩個數據結構如下:
doc[0] = 0
doc[1] = 1
doc[2] = 0

term[0] = “aardvark”
term[1] = “beaver”

SORTED_SET: 每個文檔裏面有一個string類型的多值字段。這個和SORTED類型比較相似,每個文檔有一個value的”set”。(按照遞增存儲)。 這裏刻意的去除了重複的value,並且忽略了原有value的排序。

例如,假設有3個這樣的文檔:
doc[0] = “cat”, “aardvark”, “beaver”, “aardvark”
doc[1] =
doc[2] = “cat”

值 “aardvark” 被映射成0,”beaver”映射成1, “cat”映射成2,建立兩個數據結構如下:

doc[0] = [0, 1, 2]
doc[1] = []
doc[2] = [2]

term[0] = “aardvark”
term[1] = “beaver”
term[2] = “cat”

BINARY: 每個文檔存在一個 byte[] array。這個編碼及數據結構可以由用戶自定義。

Solr的 DocValues 類型

StrField (multiValued=false):這個背後實際上是由SORTED實現。對於要排序的字段,這是一個不錯的選擇。
例子:
<field name=”manu_exact” type=”str” indexed=”false” stored=”false” docValues=”true” default=”"/>
StrField (multiValued=true):這個背後實際上是由SORTED_SET實現。
例子:
<field name=”productCategories” type=”str” indexed=”false” stored=”false” multiValued=”true” docValues=”true”/>

TrieXXXField (multiValued=false):這個背後實際上是由NUMERIC實現。這個對於排序字段或者用function queries打分的字段比較有益。
例子:
<field name=”popularity” type=”int” indexed=”false” stored=”false” docValues=”true” default=”0″/>

TrieXXXField (multiValued=true):這個背後實際上是由SORTED_SET實現,數字編碼的值由基礎反推出原始的數字,可以用於排序。
例子:
<field name=”specialCodes” type=”int” indexed=”false” stored=”false” multiValued=”true” docValues=”true”/>

 

 

配置不同的 Codec 實現

 

你可以通過設置fieldType的docValuesFormat屬性來選擇不同的實現。

要啓用 per-field DocValues 格式, 必須在solrconfig.xml裏面設置SchemaCodecFactory:

<codecFactory class=”solr.SchemaCodecFactory”/>
schema.xml下面的配置:

 

  • docValuesFormat="Lucene42": 這是默認設置,所有數據會被加載到堆內存中。
  • docValuesFormat="Disk": 這是另外一個實現,將部分數據存儲在磁盤上。
  • docValuesFormat="SimpleText": 文本格式,非常慢,用於學習。

 




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章