初次接触solr,对其中的许多概念都模糊不清,经常是看过了转眼就忘记了,因此在这里整理一下常用的概念。数据库
Core是一个单一的索引数据,而一个索引由多个Document组成,这些Document是扁平化的,即两个Document的域彻底不一样。数组
Solr 设计多Core主要是为了解决生产环境下的以下关键需求:缓存
表示是否须要建立索引,便是否须要添加到倒排索引表中,通常用来修饰Field域的,若是你不对某个域建立索引,那么意味着你将不能根据改域的域值进行全文检索。数据结构
表示是否须要存储某个域的域值,通常表示是否须要将域值写入到磁盘上进行持久化,持久化的目的是为了查询的时候能再次获取返回给用户作展现。固然存储则意味着会增长索引文件的体积。若是你的索引目录是基于内存的,那Stored设置true仍是false都没什么意义。性能
表示是否须要对某个域的域值进行分词操做,若是你设置为不分词,那么会把域值所有内容看成一个Term存入倒排索引表。翻译
即Normalization的缩写,翻译过来就是标准化的意思。这里表示是Lucene评分机制里的标准化因子,使用标准化因子来影响文档的最终评分。设计
用于表示指定Field是不是一个多值域。咱们知道,域值通常是单个值,但有时候可能咱们的域值是一个List集合或者一个数组,这时候该如何处理域值创建索引呢?为了解决这个问题,因此设计了多值域。orm
表示是否对指定Field启用空间向量模型,当你须要使用FastVector-Hightlighter高亮器或者MoreLikeThis功能时,你就须要启用 termVectors。xml
表示是否记录Field的域值中的每一个Term的位置信息即记录当前是文档中的第几个term,前提是你必需要先启动termVectors。排序
表示记录Field的域值中的每一个Term的位置偏移量,所谓偏移量,其实就是Term在文档中的起始位置和结束位置,都是从零开始计算。好比I like Java这个字符串,其中单词Java的位置偏移量就是[7,10]。
表示当前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处于文档中同一个位置,利用这个特性能够实现同义词功能。
表示两个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是让任意一个大于零的整数便可,这样用户就不能跨多个域值搜索了,只能在多值域的单个域值内实现关键字搜索了。
通常用于数字域的范围查询,默认值是4,调整这个属性值能够提高数字域的查询性能。
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以下:
DocValues的优缺点
所谓payload其实就是提供用户传入一个额外的自定义信息,而该信息能够干预文档最终的评分。Payload信息跟term的位置(positions)信息同样,都是存储在倒排索引表中的,存储它会额外增大索引体积。