索引基本信息
服務器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": 文本格式,非常慢,用於學習。