Solr4.4 docValues解析和性能测试

来源:互联网 发布:全球最贵的十大域名 编辑:程序博客网 时间:2024/06/06 18:12

索引基本信息

服务器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": 文本格式,非常慢,用于学习。

 




0 0
原创粉丝点击