专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

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集合或者一个数组,这时候该如何处理域值建立索引呢?为了解决这个问题,所以设计了多值域。

termVectors

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

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)信息一样,都是存储在倒排索引表中的,存储它会额外增大索引体积。

文章永久链接:https://tech.souyunku.com/45103

未经允许不得转载:搜云库技术团队 » Solr基本概念

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们