Solr4.2 新特性 DocValues

2019-03-27 01:27|来源: 网路

原文地址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": 文本格式,非常慢,用于学习。

转自:http://www.solr.cc/blog/?p=1340

相关问答

更多
  • jdk1.6新特性[2022-04-21]

    一:Desktop类和SystemTray类 在JDK6中 ,AWT新增加了两个类:Desktop和SystemTray。 前者可以用来打开系统默认浏览器浏览指定的URL,打开系统默认邮件客户端给指定的邮箱发邮件,用默认应用程序打开或编辑文件(比如,用记事本打开以txt为后缀名的文件),用系统默认的打印机打印文档;后者可以用来在系统托盘区创建一个托盘程序. 二:使用JAXB2来实现对象与XML之间的映射 JAXB是Java Architecture for XML Binding的缩写,可以将一个Java对 ...
  • jdk1.6新特性[2023-04-13]

    一:Desktop类和SystemTray类 在JDK6中 ,AWT新增加了两个类:Desktop和SystemTray。 前者可以用来打开系统默认浏览器浏览指定的URL,打开系统默认邮件客户端给指定的邮箱发邮件,用默认应用程序打开或编辑文件(比如,用记事本打开以txt为后缀名的文件),用系统默认的打印机打印文档;后者可以用来在系统托盘区创建一个托盘程序. 二:使用JAXB2来实现对象与XML之间的映射 JAXB是Java Architecture for XML Binding的缩写,可以将一个Java对 ...
  • java1.6新特性[2022-03-29]

    1.Desktop类和SystemTray类   前者可以用来打开系统默认浏览器浏览指定的URL,打开系统默认邮件客户端给指定的邮箱发邮件,用默认应用程序打开或编辑文件(比如,用记事本打开以txt为后缀名的文件), 用系统默认的打印机打印文档;后者可以用来在系统托盘区创建一个托盘程序。   2.使用JAXB2来实现对象与XML之间的映射   JAXB是Java Architecture for XML Binding的缩写,可以将一个Java对象转变成为XML格式,反之亦然。    我们把对象与关系数据库之 ...
  • 1、离线缓存。可以在关闭浏览器后再次打开时恢复数据,以减少网络流量。 2、音频视频自由嵌入,多媒体形式更为灵活。 3、地理定位。地理位置定位,让定位和导航不再专属导航软件,地图也不用下载非常大的地图包,可以通过缓存来解决,到哪儿下哪儿,更灵活。 4、Canvas绘图,提升移动平台的绘图能力。使用Canvas API可以简单绘制热点图收集用户体验资料,支持图片的移动、旋转、缩放等常规编辑。 5、丰富的交互方式。提升互动能力:拖拽、撤销历史操作、文本选择等。 6、开发及维护成本低,这个相对于原生APP开发来说。 ...
  • 就是你安装完了后,跳出一个记事本文件来说明这个软件最新的功能什么的。更新的东西。如果是初次安装可以看看。不选择也可以。没什么的。
  • 您需要告诉DSE将内容重新索引到Solr,查看文档以获取详细信息,但通常会是这样的: curl "http://localhost:8983/solr/admin/cores?action=RELOAD&name=stacko.test1&reindex=true&deleteAll=true" you need to tell DSE to reindex the content into Solr, look up the doc for details, but typically would be ...
  • 您需要定义自定义FieldType因为您使用的DoubleField构造函数不存储docvalues。 例如: private static final FieldType DOUBLE_FIELD_TYPE_STORED_SORTED = new FieldType(); static { DOUBLE_FIELD_TYPE_STORED_SORTED.setTokenized(true); DOUBLE_FIELD_TYPE_STORED_SORTED.setOmitNorms(true ...
  • 您需要单独添加SortedDocValuesField以利用Lucene 5中新的更快排序。编制索引时,将email字段添加到文档中,如下所示: doc.add(new StringField("email", email, Field.Store.YES)); doc.add(new SortedDocValuesField("email", new BytesRef(email))); 此外,如果您在搜索中尝试使用电子邮件查找所有文档,最好使用new FieldValueQuery("email")而 ...
  • 我试图用schema.xml创建一个Solr核心并且工作得很好。 我已经创建了一个github项目,只是尝试克隆它 git clone https://github.com/freedev/mailstore 并从此邮件存储配置创建新核心。 bin/solr create -c mailstore -d /path/to/github/mailstore/conf I've tried to create a Solr core with your schema.xml and works pret ...
  • 显然这应该足够了。 根据docValues上的官方Solr文档: 要使用docValues,您只需要为将要使用它的字段启用它。 另请注意: 如果已将数据索引到Solr索引中,则需要在schema.xml中更改字段定义后完全重新索引内容,以便成功使用docValues。 顺便说一句,我还想确保你的schema.xml 100%明确: ... type="TrieDateField" 。 我假设它应该是... type="date"而不是... type="date" ( date是预定义的fieldType, ...