目录
Solr的solrconfig.xml配置与managed.schema模式
- 目录
- Solr的solrconfig.xml配置与managed.schema模式
- solrconfig.xml(了解)
- luceneMatchVersion:指定Lucene版本
- lib:配置扩展jar包
- dataDir:索引数据路径
- directoryFactory:索引存储工厂
- codecFactory:编解码方式
- indexconfig:索引配置
- ramBufferSizeMB:内存空间
- maxBufferedDocs:最大缓冲的文档
- useCompoundFile:是否使用复合文件段
- ramPerThreadHardLimitMB:每个线程的最大内存消耗
- lockType:指定要使用的锁定
- writeLockTimeout:等待写锁的最长时间
- updateHandler:更新处理器
- query:查询相关配置
- enableLazyFieldLoading:开启懒加载Field
- useFilterForSortedQuery:为存储字段使用过滤器
- queryResultWindowSize::查询结果窗口大小
- queryResultMaxDocsCached: 查询结果的最大文档缓存数
- managed.schema(重要)
Solr的solrconfig.xml配置与managed.schema模式
solrconfig.xml(了解)
solrconfig.xml配置文件主要定义了solr的一些处理规则,包括索引数据的存放位置、更新、删除、查询的一些规则配置
可配置重要功能
(1)请求处理程序
用于处理对Solr的请求,例如:将文档添加到索引的请求或返回查询结果的请求
(2)侦听器
用于“侦听”与查询相关的特定事件的过程;侦听器可用于触发特殊代码的执行,例如调用一些常见查询以预热缓存
(3)请求分派器
用于管理HTTP通信
(4)Admin Web界面
(5)与复制和复制相关的参数
该solrconfig.xml文件位于conf/每个core集合的目录中。在server/solr/configsets/目录中可以找到一些注释良好的示例文件,这些文件演示了许多不同类型的安装的最佳实践
luceneMatchVersion:指定Lucene版本
<luceneMatchVersion>8.5.1</luceneMatchVersion>
注意:如果更改了这个设置,必须对所有已经创建的索引数据重新索引(re-index),否则可能出现无法查询的情况
lib:配置扩展jar包
<lib dir="" regex=""/>
表示solr引用包的位置,当dir对应的目录不存在时候,会忽略此属性
dataDir:索引数据路径
<dataDir>${solr.data.dir:}</dataDir>
定义了索引数据和日志文件的存放位置
directoryFactory:索引存储工厂
索引存储方案,共有以下存储方案
codecFactory:编解码方式
Lucene的默认编解码器有两种选择。编解码工厂允许使用自定义的编解码器
默认编解码器有两种选择。compressionMode选项
(1)BEST_SPEED:(默认)针对搜索速度性能进行了优化
(2)BEST_COMPRESSION:针对磁盘空间使用进行了优化
<codecFactory class="solr.SchemaCodecFactory">
<str name="compressionMode">BEST_COMPRESSION</str>
</codecFactory>
solr.SimpleTextCodecFactory
Lucene的工厂SimpleTextCodecFactory生产纯文本可读的索引格式
此编解码器切勿在生产中使用。SimpleTextCodec相对较慢,并且会占用大量磁盘空间。它的使用应仅限于教育和调试目的
<codecFactory class="solr.SimpleTextCodecFactory"/>
indexconfig:索引配置
<indexConfig>定义了Lucene索引编写器的低级行为的属性
默认情况下,这些设置在solrconfig.xmlSolr附带的示例中被注释掉,这意味着将使用默认设置。在大多数情况下,默认值就可以了
ramBufferSizeMB:内存空间
一旦累积的文档更新超过了这么大的内存空间(以兆字节为单位定义),则刷新未决的更新。这也可以创建新的细分或触发合并。使用此设置通常比更好maxBufferedDocs。如果将maxBufferedDocs和ramBufferSizeMB都设置为solrconfig.xml,则在达到任一限制时都会进行刷新。默认值为100Mb。
<ramBufferSizeMB>100</ramBufferSizeMB>
maxBufferedDocs:最大缓冲的文档
设置在刷新为新段之前要在内存中缓冲的文档更新数。这也可能触发合并。默认的Solr配置设置为按RAM使用率刷新(ramBufferSizeMB)。
<maxBufferedDocs>1000</maxBufferedDocs>
useCompoundFile:是否使用复合文件段
控制新编写(但尚未合并)的索引段是否应使用“ 复合文件段”格式。默认为false。
<useCompoundFile>false</useCompoundFile>
ramPerThreadHardLimitMB:每个线程的最大内存消耗
设置每个线程的最大内存消耗(以兆字节为单位),如果超过则触发强制刷新。给定的值必须大于0且小于2GB(2048 MB)
<ramPerThreadHardLimitMB>1945</ramPerThreadHardLimitMB>
lockType:指定要使用的锁定
LockFactory选项指定要使用的锁定实现
<lockType>native</lockType>
<lockType>${solr.lock.type:native}</lockType>
有效锁定类型选项集取决于您配置的DirectoryFactory。支持以下列出的值StandardDirectoryFactory(默认)
(1)native(默认)
使用NativeFSLockFactory指定本机OS文件锁定。如果第二个Solr进程尝试访问该目录,它将失败。当多个Solr Web应用程序试图共享一个索引时,请不要使用。另请参见Javadocs
(2)simple
使用SimpleFSLockFactory指定用于锁定的普通文件。另请参见Javadocs
(3)single(专家)
使用SingleInstanceLockFactory。用于只读索引目录的特殊情况,或者在不可能有多个进程尝试修改索引的情况下(甚至顺序地)使用。此类型将防止尝试访问同一索引的同一JVM中的多个内核。警告!如果不同JVM中的多个Solr实例修改索引,则此类型将无法防止索引损坏。另请参见Javadocs
(4)hdfs(文件系统)
使用HdfsLockFactory支持将索引和事务日志文件读写到HDFS文件系统。有关使用此功能的更多详细信息,请参阅在HDFS上运行Solr
writeLockTimeout:等待写锁的最长时间
等待IndexWriter上的写锁的最长时间。默认值为1000,以毫秒为单位
<writeLockTimeout>1000</writeLockTimeout>
updateHandler:更新处理器
query:查询相关配置
<maxBooleanClauses>1024</maxBooleanClauses>
设置boolean 查询中,最大条件数。在范围搜索或者前缀搜索时,会产生大量的 boolean 条件,如果条件数达到这个数值时,将抛出异常,限制这个条件数,可以防止条件过多查询等待时间过长
enableLazyFieldLoading:开启懒加载Field
<enableLazyFieldLoading>true</enableLazyFieldLoading>
useFilterForSortedQuery:为存储字段使用过滤器
<useFilterForSortedQuery>true</useFilterForSortedQuery>
queryResultWindowSize::查询结果窗口大小
<queryResultWindowSize>20</queryResultWindowSize>
用于queryResultCache的优化,发起查询请求时,将手机所请求数文档ID的数量集合。
例如: 搜索特定查询请求并匹配文档10-19, 并且queryWindowSize = 50, Solr将收集并缓存文档0-49
可以通过缓存实现该范围内的任何其他查询请求
queryResultMaxDocsCached: 查询结果的最大文档缓存数
<queryResultMaxDocsCached>200</queryResultMaxDocsCached>
managed.schema(重要)
schema翻译过来即模式,它是集合/内核中字段的定义。用来定义索引数据中的域的,包括域名称,域类型,域是否索引,是否分词,是否存储,是否标准化,是否存储项向量等等。
schema文件是在SolrConfig中的架构工厂定义,有两种定义模式,也就是说Solr中提供了两种方式来配置schema,但两者只能选其一
两种定义模式
(1)默认的托管模式
Solr默认使用的就是托管模式。也就是说当在solrconfig.xml配置文件中没有显式声明<schemaFactory/>时,Solr隐式地使用ManagedIndexSchemaFactory,它是默认的“mutable”,并且将模式信息保存在一个名为managed-schema文件中
<!-- 新版本默认的配置 -->
<schemaFactory class="ManagedIndexSchemaFactory">
<bool name="mutable">true</bool>
<str name="managedSchemaResourceName">managed-schema</str>
</schemaFactory>
当然,也可以显式的声明schema文件,但是,当显式的声明schema文件的时候,文件的名字不能是managed-schema也不能是schema.xml。同时schema文件的名字要与solrconfig.xml配置文件中声明的schema文件名一样
(2)经典的schema.xml模式
这种模式的配置方式是在solrconfig.xml配置文件中显式配置一个ClassicIndexSchemaFactory。
<schemaFactory class="ClassicIndexSchemaFactory"/>
ClassicIndexSchemaFactory需要使用schema.xml配置文件,并且不允许在运行时对架构进行任何编程式更改。而且该schema.xml文件必须手动编辑,编辑完后需要重载集合/内核才会生效
两种模式区别
(1)schema文件的格式形式不同
默认的托管模式下的schema文件名字必须是managed-schema
经典的schema.xml模式下的schema文件名字必须是schema.xml
(2)<schemaFactory/>声明的方式不同
默认托管模式:ManagedIndexSchemaFactory
经典schema.xml模式:ClassicIndexSchemaFactory
managed-schema配置文件的大致结构:
<?xml version="1.0" encoding="UTF-8" ?>
<schema version="1.6">
<field .../>
<dynamicField .../>
<uniqueKey>id</uniqueKey>
<copyField .../>
<fieldType ...>
<analyzer type="index">
<tokenizer .../>
<filter ... />
</analyzer>
<analyzer type="query">
<tokenizer .../>
<filter ... />
</analyzer>
</fieldType>
</schema>
field(字段)
指定建立索引和查询数据的字段
_version_节点和_root_节点是必须保留的,不能删除
如果Field中某个属性在引用的FieldType中也存在,则以Field中定义的属性为准
配置字段属性
属性 | 描述 |
---|---|
name | 字段名,对应数据源的字段名(必选) |
type | 字段的数据类型,对应 fieldType节点的name(必选) |
indexed | 是否需要建立索引。true |
stored | 表示是否需要把域值存储到硬盘上,方便后续查询时能再次提取出来原样显示给用户。默认true |
default | 该字段的缺省值 |
required | 添加文档时,该字段是否必须存在。true |
docValues | 是否需要添加一个字段的列式存储docValues域,docValues是一种记录doc字段值的 |
multiValued | 是否有多个值,如果字段可能有多个值,尽可能设为true |
sortMissingFirst、sortMissingLast | 根据该字段排序时,没有该字段值的文档是排在前面还是后面 true、false false |
omitNorms | 是否忽略标准化。notset |
omitTermFreqAndPositions | 是否忽略词项的词频和位置。noset |
omitPositions | 忽略词项的位置信息。notset |
useDocValuesAsStored | 如果字段设置了存储docValues,而字段的stored=false,可以设置该属性为true,从而可以在搜索结果中返回该字段的值(从docValues中取值)true |
large | 标识该字段的值是大尺寸的,从而对该字段值进行懒加载,只有值 < 512KB 的才会被缓存。 这个属性要求 stored=“true” and multiValued=“false”. 主要作用就是不在内存中缓存大字段。false |
在managed-schema配置文件中配置了大量的域
<field name="_version_" type="plong" indexed="false" stored="false"/>
以上配置的意思就是说配置了一个域,名字叫_version_,类型是plong类型(注意:plong是别名)
以plong为关键字继续在managed-schema配置文件中查找,很快找到它的位置
说明了名字为_version_的这个域,是LongPoint类型。从该域的配置中还可以看到indexed和stored属性明确地设置为了false,这表明该域既不索引也不存储
<field name="id" type="string" multiValued="false" indexed="true" required="true" stored="true"/>
以上配置的是id域,可以发现该域中required属性的值为true(即必须),Lucene时,id是不必须的
id就相当于数据库表中的主键id。Lucene是自己生成,类似自增长;Solr是在managed-schema配置文件中进行配置,需要自己进行指定,类似于assigned。总而言之,以后在用Solr保存一个数据的时候,一定记得要给id
dynamicField(动态字段)
为了防止以上的域依然不够用,所以才有了dynamicField(动态字段)
如果模式中有近百个字段需要定义,其中有很多字段的定义都是相同的,那么重复地定义就十分的麻烦,因此可以定一个规则,字段名以某前缀开头或结尾的是相同的定义配置,那这些重复字段就只需要配置一个,保证提交的字段名称遵守这个前缀或后缀即可,这就是动态字段
整型字段都是一样的定义,则可以定义一个如下的动态字段
<dynamicField name="*_i" type="pint" indexed="true" stored="true"/>
_i只要以_i结尾的字段都满足这个定义
注意:动态字段只能用符号通配符进行表示,且只有前缀和后缀两种方式。
其实说白了,动态字段就是不用指定具体的名称,只须定义字段名称的规则即可
例如:定义一个dynamicField,name为*_s,type为string,那么在使用这个字段的时候,任何以_s结尾的字段都被认为是符合这个定义的,比方说name_s、gender_s、school_s等。
uniqueKey(唯一主键)
Solr中默认定义唯一主键key为id域。
uniquekey节点是文档的唯一标示,相当于主键,每次更新,删除的时候都根据这个字段来进行操作。必须填写
<uniqueKey>id</uniqueKey>
Solr在删除、更新索引时使用id域进行判断,当然,也可以自定义唯一主键
例如:指定商品ID为唯一主键(类似于传统数据库的主键ID)
<!-- 指定商品ID为唯一键,类似于传统数据库的主键ID -->
<uniqueKey>productId<uniqueKey>
注意(三点)
(1)在创建索引时必须指定唯一约束
(2)这里的唯一主键是指业务主键,并不是Document的主键
(3)唯一主键字段不可以是保留字段、复制字段,且不能分词
copyField(复制字段)
允许将一个或多个字段的值填充到一个字段中
用途通常来说有两种
(1)将多个字段内容填充到一个字段,来进行搜索
(2)对同一个字段内容进行不同的分词过滤,创建一个新的可搜索字段
演示复制字段是如何定义的。比如,现在有一个需求,想要输入关键字搜索标题(title)和内容(content)。为了解决这样的需求,首先应定义如下几个名字为title、content以及text的域
通过这个节点,可以把一个字段的值复制到另一个字段中,也可以把多个字段的值同时复制到另一个字段中,这样搜索的时候都可以根据一个字段来进行搜索
然后,将title域和content域中的内容复制到text域中
这样就定义好了一个复制字段。现在根据关键字只搜索text域中的内容就相当于搜索title域和content域
复制域的作用就是将多个域中的内容复制到一个域中去,在搜索的时候,只须搜索复制域
总归:复制域。当搜索的时候,想搜两个域,把这两个域合并在一下,就搜一个域来使用
fieldType(字段类型)
fieldtype节点主要用来定义数据类型
Solr中提供的 FieldType 类,在 org.apache.solr.schema 包下
配置IK分词器
<!--ik分词器-->
<fieldType name ="text_ik" class ="solr.TextField">
<analyzer type ="index">
<tokenizer class ="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart = "false" conf ="ik.conf" />
<filter class = "solr.LowerCaseFilterFactory" />
</analyzer>
<analyzer type ="query">
<tokenizer class ="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart ="true" conf ="ik.conf" />
<filter class ="solr.LowerCaseFilterFactory" />
</analyzer>
</fieldType>
属性
属性 | 描述 |
---|---|
name | 字段类型名称,用于Field定义中的type属性引用(必须) 名称仅包含字母、数字或下划线字符,不能以数字开头 |
class | 指向org.apache.solr.analysis中定义的类型名称。存放该类型的值来进行索引的字段类名 注意,应以 *solr.*为前缀,这样solr就可以很快定位到该到哪个包中去查找类,如 solr.TextField。 如果使用的是第三方包的类,则需要用全限定名 |
fieldtype | 还可以自定义当前类型建立索引和查询数据的时候使用的查询分析器 |
tokenizer | 指定分词器 |
filter | 指定过滤器 |
positionIncrementGap | 对于多值字段,指定多个值之间的距离,这可以防止虚假词组匹配。此值相当于Lucene的短语查询设置slop值,根据经验设置为100 positionIncrementGap=100只对multiValue = true的fieldType有意义 |
autoGeneratePhraseQueries | 用于文本字段,如果设为true,solr会自动对该字段的查询生成短语查询,即使搜索文本没带“” |
synonymQueryStyle | 同义词查询分值计算方式 |
enableGraphQueries | 是否支持图表查询 |
docValuesFormat | docValues字段的存储格式化器:schema-aware codec,配置在solrconfig.xml中的 |
postingsFormat | 词条格式器:schema-aware codec,配置在solrconfig.xml中的 |
fieldType的Analyzer
对于solr.TextField或solr.SortableTextField字段类型,需要为其定义分析器
(1)直接通过class属性指定分析器类,该类必须继承org.apache.lucene.analysis.Analyzer
<fieldType name="nametext" class="solr.TextField">
<analyzer class="org.apache.lucene.analysis.core.WhitespaceAnalyzer"/>
</fieldType>
(2)可以灵活地组合分词器、过滤器
<fieldType name="nametext" class="solr.TextField">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StopFilterFactory"/>
</analyzer>
</fieldType>
如果该类型字段索引、查询时需要使用不同的分析器,则需区分配置analyzer
<fieldType name="nametext" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.KeepWordFilterFactory" words="keepwords.txt"/>
<filter class="solr.SynonymFilterFactory" synonyms="syns.txt"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
defaultSearchField:指定搜索的时候默认搜索字段的值
<defaultSearchField>text</defaultSearchField>
defaultSearchField指定搜索的时候默认搜索字段的值
solrQueryParser:指定搜索时多个词之间的关系
<solrQueryParser defaultOperator="OR"/>
solrQueryParser指定搜索时多个词之间的关系,可以是or、and两种
性能优化
1.将所有只用于搜索的,而不需要作为结果的field(特别是一些比较大的field)的stored设置为false
2.将不需要被用于搜索的,而只是作为结果返回的field的indexed设置为false
3.删除所有不必要的copyField声明为了索引字段的最小化和搜索的效率
4.将所有的 text fields的index都设置成false,然后使用copyField将他们都复制到一个总的 text field上,然后进行搜索