zoukankan      html  css  js  c++  java
  • Solr4.2 新特性 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": 文本格式,非常慢,用于学习。
  • 相关阅读:
    第一章-实例7-猴子吃桃问题
    第一章-实例6-判断是否为闰年
    第一章-实例3-计算变量所占字节数
    IDEA学习笔记
    spring boot学习概要(尚硅谷)
    JSP动态WEB开发技术--第一章
    学习前端的准备任务
    cmd优化
    软件测试基础概念
    软件工程理论
  • 原文地址:https://www.cnblogs.com/huangfox/p/4181404.html
Copyright © 2011-2022 走看看