Solr基本概念

前言

初次接触solr,对其中的许多概念都模糊不清,经常是看过了转眼就忘记了,因此在这里整理一下常用的概念。数据库

基本概念

index(索引)

  • 在Lucene中一个索引是放在一个文件夹中的,一个索引就是多个Document的集合
  • 同一个索引目录中的全部文件构成一个Lucene索引。
  • 一个索引其实就是多个Document集合。

Document(文档)

  • 文档是咱们构建索引的基本单位,索引中的每一个Document就比如数据库表中的每一条记录Record,虽然不是一个概念,可是能够这样去理解。
  • 新增长的文档是单独保存在一个新生成的段文件中。

Field(域)

  • 一个Document其实就是一个Field的集合,每一个Field就比如数据库表中的每一个字段column。
  • 不一样Field能够分别存储不一样信息,以及拥有各自不一样的存储方式。

Segment(段)

  • 当添加一个新文档就会生成一个新的段,而且也会触发段文件合并。
  • 一个索引能够包含多个段文件,段与段质检是相互独立的。
  • 合并段文件有助于提高建立索引的性能。
  • 段文件里记录了索引中包含多少个段,每一个段包含多少个文档。
  • 索引能够由多个子索引构成。这个子索引便叫作段。

Term(词)

  • 每一个Field的域值通过分词器处理后获得的每一项称做Term
  • Term是索引中的最小单元。
  • 在两个不一样Field中的同一个字符串被认为是不一样的term。
  • Field的域值通过序列化(tokenized)成Terms集合(Terms)。

core

Core是一个单一的索引数据,而一个索引由多个Document组成,这些Document是扁平化的,即两个Document的域彻底不一样。数组

Solr 设计多Core主要是为了解决生产环境下的以下关键需求:缓存

  1. 重建索引
  2. 配置变动影响最小化
  3. 索引合并和分裂
  4. Core热交换

Indexed

表示是否须要建立索引,便是否须要添加到倒排索引表中,通常用来修饰Field域的,若是你不对某个域建立索引,那么意味着你将不能根据改域的域值进行全文检索。数据结构

Stored

表示是否须要存储某个域的域值,通常表示是否须要将域值写入到磁盘上进行持久化,持久化的目的是为了查询的时候能再次获取返回给用户作展现。固然存储则意味着会增长索引文件的体积。若是你的索引目录是基于内存的,那Stored设置true仍是false都没什么意义。性能

Tokenized

表示是否须要对某个域的域值进行分词操做,若是你设置为不分词,那么会把域值所有内容看成一个Term存入倒排索引表。翻译

Norms

即Normalization的缩写,翻译过来就是标准化的意思。这里表示是Lucene评分机制里的标准化因子,使用标准化因子来影响文档的最终评分。设计

multiValued

用于表示指定Field是不是一个多值域。咱们知道,域值通常是单个值,但有时候可能咱们的域值是一个List集合或者一个数组,这时候该如何处理域值创建索引呢?为了解决这个问题,因此设计了多值域。orm

termVectors

表示是否对指定Field启用空间向量模型,当你须要使用FastVector-Hightlighter高亮器或者MoreLikeThis功能时,你就须要启用 termVectors。xml

termPositions

表示是否记录Field的域值中的每一个Term的位置信息即记录当前是文档中的第几个term,前提是你必需要先启动termVectors。排序

termOffsets

表示记录Field的域值中的每一个Term的位置偏移量,所谓偏移量,其实就是Term在文档中的起始位置和结束位置,都是从零开始计算。好比I like Java这个字符串,其中单词Java的位置偏移量就是[7,10]。

PositionIncrement

表示当前Term的位置与前一个term的位置之间的差值即位置增量,好比I like the girl with short hair(是的!!),这里girl与like之间的位置增量为2,由于like的position=1,girl的position=3。但若是考虑停用词的状况,吗么like和girl之间的the是停用词,the会被剔除掉,此时girl与like之间的位置增量为1。加入两个term之间的positionincrement=0,那么说明两个Term处于文档中同一个位置,利用这个特性能够实现同义词功能。

PositionIncrementGap

表示两个Term之间的间隙,这是Solr Schema.xml里field的配置属性,通常用于解决多值域查询phrase query的。好比你有个多值域,它有2个域值:author:John Doe;author:Bob Smith。对于多值域而言,默认PositoinIncrementGap=0,也就意味着默认多值域的域值是直接拼接在一块儿的,即john doe bob smith,也就是说若是你输入doe bob也是能够搜索到该文档的,若是你不但愿用户输入doe bob能搜索到,那么你能够设置PositionIncrementGap=N,N是让任意一个大于零的整数便可,这样用户就不能跨多个域值搜索了,只能在多值域的单个域值内实现关键字搜索了。

precisionStep

通常用于数字域的范围查询,默认值是4,调整这个属性值能够提高数字域的查询性能。

DocValues

Lucene索引的存储方式通常都是以倒排索引的方式(term-doc),即Term到Document的一个映射。可是在搜索相关功能处理的时候,如排序、高亮,须要经过文档docid找到相应的term值、term的位置信息等。为此,在Lucene4.0中,引入了一个新字段类型DocValue,即在索引的时候创建文档到值(document-to-value)的映射。这个方法保证减轻了一些字段缓存的内存要求,而且使得Sorting、Faceting、Grouping、Fuction Query的响应速度更快。但开启DocValues须要额外保存索引信息,所以会增大索引体积。

DocValues只适用于部分FieldType,这些FieldType底层实际又是使用的Lucene的DocValues Type。DocValues适用的FieldType以下:

  • StrField 和 UUIDField
    • 若是这个FieldType是单值域(即multi-value=false),那么底层Lucene会使用SORTED类型。
    • 若是这个FieldType是多值域(即multi-value=true),那么底层Lucene会使用SORTED_SET类型。
  • 全部以Trie开头的数字域,date域,EnmuField
    • 若是这个FieldType是单值域(即multi-value=false),那么底层Lucene会使用NUMERIC类型。
    • 若是这个FieldType是多值域(即multi-value=true),那么底层Lucene会使用SORTED_SET类型。

DocValues的优缺点

  1. 近实时索引:在每个索引段里面都会有一个docvalues数据结构,这个结构与所 win同时创建,而且可以快速更新、生效;
  2. 基本的查询和过滤支持:你能够作基本的词、范围等基本查询,可是不窜域评分,而且速度较慢,若是你对速度和评分排序有要求,你能够将该字段设置为(indexed=“true”);
  3. 更好的压缩比:Docvalues fields的压缩效果比fieldcache好,但不强调作到极致;
  4. 节约内存:你能够定义一个fieldType的docValuesFormat(docValuesFormat=“Disk”),这样的只有一小部分数据加载到内存,其余部分保留在磁盘上。

Payload

所谓payload其实就是提供用户传入一个额外的自定义信息,而该信息能够干预文档最终的评分。Payload信息跟term的位置(positions)信息同样,都是存储在倒排索引表中的,存储它会额外增大索引体积。

相关文章
相关标签/搜索