Solr--02.Solr中Core详解

版权声明:转载请注明原始链接 https://blog.csdn.net/sswqzx/article/details/84501215

一、Core概述

1、Core概述

在Solr中、每一个Core、代表一个索引库、里面包含索引数据及其配置信息、
Solr中可以拥有多个Core、也就是同进管理多个索契库、就像mysql中可以有多个数据库一样。

2、Core目录结构

Core中有二个重要目录:conf和data

conf目录中有两个非常重要的配置文件:schema.xml和solrconfig.xml

二、Core的配置文件  

1、core.properties

Core的属性文件,记录当前core的名称、索引位置、配置文件名称等信息,也可以不写

一般要求Core名称跟Core的文件夹名称一致!这里都是Collection1,可以手动修改这个属性,把Core的名字改成我们喜欢的。

此时重启Tomcat,可以看到core的名字已经改变!

1.1、添加多个Core

1)在solr目录下复制collection并重新命名为collection2,作为新的core目录、如下图

2)在collection2下创建conf目录和data目录,并且创建文件core.properties,添加属性:name=collection2

3)、重启Tomcat,访问管理页面

2、schema.xml

Schema.xml配置详解:Solr中会提前对文档中的字段进行定义,
并且在schema.xml中对这些字段的属性进行约束,例如:字段数据类型、字段是否索引、是否存储、是否分词等

2.1、<field>标签

<field>标签:  通过Field字段 定义字段的属性信息:

语法:

属性及含义:
		name:字段名称
		type:字段类型,指向的是本文件中的<fieldType>标签
		indexed:是否创建索引
		stored:是否被存储
		multiValued:是否可以有多个值,如果字段可以有多个值,设置为true,false为单个值。
多个值:对应JSON的数组格式。 对应java的List格式。

注意:

在本文件中,有两个字段是Solr自带的字段,绝对不要删除:_version节点、_root节点和id节点。

扩展:

•omitNorms:是否忽略掉Norm,可以节省内存空间,只有全文本field和need an index-time boost的field需要norm。
默认就是true,即忽略标准因子。如果一个域要使用得分激励因子,必须要手动的设置omitNorm= false,否则会报错。
•termVectors:当设置true,会存储 term vector。当使用MoreLikeThis,用来作为相似词的field应该存储起来。
•termPositions:存储 term vector中的地址信息,会消耗存储开销。
•termOffsets:存储 term vector 的偏移量,会消耗存储开销。

2.2、<FieldType>标签

过FieldType指定数据类型

语法:

name:字段类型的名称,可以自定义,<field>标签的type属性可以引用该字段,来指定数据类型
class:字段类型在Solr中的类。StrField可索引不可分词。TextField字段可索引,可以分词,所以需要指定分词器
<analyzer>:这个子标签用来指定分词器

扩展:

precisionStep:
用于数值范围搜索,进行分词 通过设置precisionStep的值可以提高检索速度,8是solr的推荐值。
设定一个PrecisionStep (默认4),对数值类型每次右移(n-1)* PrecisionStep 位。
每次移位后,从左边开始每7位存入一个byte,组成一个byte[],
并且在数组第0位插入一个特殊byte,标识这次的偏移量。
每个byte[]可以转成一个lexicographic sortable string。
lexicographic sortable string 的字符按字典序排列后,和偏移量,
数值的大小顺序是一致的。这个是NumericRangeQuery 范围查找的关键。

positionIncrementGap:
一个doc中的属性有多个值时候,设置每个属性之间的增量值和multiValued属性配合使用(避免错误匹配)。
其作用就是在对Multivalue Field进行处理的时候,给两个field中相隔的词人为的插入一段固定的distance
然后在使用Lucene/Solr做Phrase query的时候,如果没有指定Slop(对slop的介绍,可以参
考:http://blog.csdn.net/rick_123/article/details/6708527),会默认Slop为0,即查询的短语之间应该紧紧挨着,
这样对很多情况下都得不到用户想要的结果。解决的办法就是使用phrase query,同时设置一个适当的Slop值,

然后为了不让lucene的搜索跨越多个Field Value,
设置一个远大于slop的positionIncrementGap,就可以达到目标。

sortMissingLast:设置成true没有该field的数据排在有该field的数据之后,而不管请求时的排序规则, 默认是true。
sortMissingFirst:跟sortMissingLast相反。默认是false。

analyzer:字段类型指定的分词器。
type:当前分词器用于分词的操作。index 代表生成索引时使用的分词器。query 代表在查询时使用的分词器。
tokenizer:分词器使用具体的分词器类。

2.3、<uniqueKey>标签

唯一主键
Lucene中本来是没有主键的。删除和修改都需要根据词条进行匹配。
而Solr却可以设置一个字段为唯一主键,这样增删改操作都可以根据主键来进行!

2.4、<dynamicField>标签

动态字段

2.5、引入IK分词器

(1)、引入依赖、	在schemal.xml中自定义fieldType,引入IK分词器

(2)、让字段使用我们的自定义数据类型,引入IK分词器

 

2.6、schema.xml简化

<?xml version="1.0" encoding="UTF-8" ?>

<schema name="example" version="1.5">
    
  <!-- ========================1 不能删除字段=========================== -->

   <!-- If you remove this field, you must _also_ disable the update log in solrconfig.xml
      or Solr won't start. _version_ and update log are required for SolrCloud
   --> 
   <field name="_version_" type="long" indexed="true" stored="true"/>
   
   <!-- points to the root document of a block of nested documents. Required for nested
      document support, may be removed otherwise
   -->
   <field name="_root_" type="string" indexed="true" stored="false"/>

   <!-- Only remove the "id" field if you have a very good reason to. While not strictly
     required, it is highly recommended. A <uniqueKey> is present in almost all Solr 
     installations. See the <uniqueKey> declaration below where <uniqueKey> is set to "id".
   -->   
   <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
        
  <!-- Field to use to determine and enforce document uniqueness. 
      Unless this field is marked with required="false", it will be a required field
   -->
  <uniqueKey>id</uniqueKey>

 
 <!-- ===================不能删除字段============================ -->  
  

 <!-- =========================2 索引库业务字段============================ -->
 
	<field name="title" type="text_ik" indexed="true" stored="true" multiValued="false"/>
	<field name="content" type="text_ik" indexed="true" stored="true"/>
   
    <field name="text" type="text_ik" indexed="true" stored="false" multiValued="false"/>
    <field name="price"  type="float" indexed="true" stored="true"/>  
 <!-- ====================索引库业务字段============================= -->
   
  

 
 <!-- =======================3 索引库业务扩展字段============================= -->
   <dynamicField name="*_s"  type="string"  indexed="true"  stored="true" />
   
   <copyField source="title" dest="text"/>
   <copyField source="content" dest="text"/>
<!-- =====================索引库业务扩展字段=========================== -->
   


 
 <!-- ======================4 字段类型定义============================== -->
    
	<!-- IK分词器 -->
	 <fieldType name="text_ik" class="solr.TextField">
			<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer" />
	</fieldType>
	
    <fieldType name="string" class="solr.StrField" sortMissingLast="true" />

  
    <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/>


    <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
			
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>
 <!-- ==========================字段类型定义======================== -->
     

</schema>

3、solrconfig.xml

solrconfig.xml:这个配置文件主要配置跟索引库和请求处理相关的配置。solr服务的优化主要通过这个配置文件进行:

3.1、索引库的相关配置

<lib/>标签:

•用途:配置插件依赖的jar包 
•注意事项:
            o如果引入多个jar包,要注意包和包的依赖关系,被依赖的包配置在前面
            o这里的jar包目录如果是相对路径,那么是相对于core所在目录、如下图

我们发现这些配置是在找两个文件夹下的jar包:contrib和dist。这两个文件夹其实在Solr的安装目录中有

而<lib dir=””>标签中的dir是相对目录,默认相对于core目录。
我们的core在D:\\test\\solr\\core1位置,我们把这两个文件夹复制到solr下

然后修改相对路径,只留下一个 ../  即可

3.2、请求处理相关的配置

  <requestHandler/> 标签:

•用途:配置Solr处理各种请求(搜索/select、更新索引/update、等)的各种参数
•主要参数:
            o name:请求类型,例如:select、query、get、update
            o class:处理请求的类
            o initParams:可选。引用<initParams>标签中的配置
            o <lst name="defaults">:定义各种缺省的配置,比如缺省的parser、缺省返回条数

例子:负责搜索请求的Handler

这里有一个默认选项:rows=10 ,就是设置默认查10条数据
<str name=”df”> text</str> 这个是设置默认搜索的字段为:text,我们可以设置为title,因为我们没有text字段

 <initParams/>标签:

•用途:为一些requestHandlers定义通用的配置,以便在一个地方修改后,所有地方都生效
•主要参数:
        o path:指明该配置应用于哪些请求路径,多个 的话用逗号分开,可以用通配符(*表示一层子路径,**表示无限层)
        o name:如果不指定path,可以指定一个name,然后在<requestHander>配置中可以引用这个name。

例子: (配置一个缺省的df)

<initParams path="/update/**,/query,/select,/tvrh,/elevate,/spell,/browse">    
    <lst name="defaults">     
        <str name="df">_text_</str>    
    </lst>  
</initParams>

<updateHandler/>标签:

•	用途:定义一些更新索引相关的参数,比如定义commit的时机
•	主要参数:
    o	autoCommit:定义自动commit的触发条件。如果没配置这个参数,则每次都必须手动commit
        	maxDocs
        	maxTime(毫秒)
        	openSearcher:autoCommit结束后,是否开启一个新的searcher让更改生效。缺省为false
    o	autoSoftCommit:定义自动softCommit的触发条件。相关参数同autoCommit
    o	listener:配置事件监听器
        	event:监听哪个事件,比如:event="postCommit", event="postOptimize"
        	class:处理的类,可以是自己的实现类。如果是RunExecutableListener,可以配置下面的参数:
        	exe:可执行文件,包括Solr Home的相对路径和文件名
        	dir:工作目录,缺省是“.”
        	wait: 调用者是否等待可执行文件执行结束,缺省是true
        	args:传递给可执行文件的参数
        	env:其他所需要的环境变量
    o	updateLog:配置log的保存路径、等
        	dir:保存路径
        	numRecordsToKeep:一个log保存的记录数,缺省为100
        	maxNumLogsToKeep:log的数量,缺省为10
        	numversionBuckets:追踪max version的bucket数量(?),缺省为65535

配置这些参数要考虑到搜索的准确度和性能的平衡。
注:commit和softCommit:
•	commit:正式提交、对索引的修改会被保存到永久存储中(比如磁盘),会比较耗时
•	softCommit:软提交,对索引的修改会被立即应用到工作中的索引中,即立即生效,但没有保存进磁盘

 <query/>标签:

•	用途:配置Solr如何处理和返回搜索的相关参数
•	主要参数:
    o	filterCache:当搜索带有“fq”参数时,使用这个配置,它保存未经过排序的所有文档
        	class:实现类,有三种:solr.search.LRUCache, solr.search.FastLRUCache, solr.search.LFUCache
        	size:最大保存的记录数量
        	initialSize:初始数量
        	autowarmCount:新Index Searcher启动的时候从旧的Index Searcher缓存拷贝过来的数据量
    o	queryResultCache:存储最终的搜索结果(排序后的、有范围的文档id)
        	class:实现类,有三种:solr.search.LRUCache, solr.search.FastLRUCache, solr.search.LFUCache
        	size:最大保存的记录数量
        	initialSize:初始数量
        	autowarmCount:新Index Searcher启动的时候从旧的Index Searcher缓存拷贝过来的数据量
        	maxRamMB:最大分配的容量(兆)
    o	documentCache:缓存Lucene Document对象(就是每个文档的fields)
        	class:实现类,有三种:solr.search.LRUCache, solr.search.FastLRUCache, solr.search.LFUCache
        	size:最大保存的记录数量
        	initialSize:初始数量
        	autowarmCount:因为Lucene的内部文档 id 是临时的,所以这个缓存不应该被auto-warm,这个值应该为“0”
    o	cache:配置自定义的缓存,通过SolrIndexSearcher类的getCache()方法和name参数调用这个缓存
        	name:被调用时的标识
        	其他参数同上
    o	maxBooleanClauses:BooleanQuery的最大子句数量
    o	enableLazyFieldLoading:没有知道被请求的field是否懒加载,true/false
    o	useFilterForSortedQuery:如果不是按照score排序,是否从filterCache中获取数据
    o	queryResultWindowsize:配合queryResultCache使用,缓存一个超集。如果搜索请求第10到19条记录,
而这个参数是50,那么会缓存0到49条记录
    o	queryResultMaxDocsCached:queryResultCache缓存的最大文档数量
    o	useColdSearcher:但一个新searcher正在warm-up的时候,新请求是使用旧是searcher(true)还是等待新的search(false)
    o	maxWarmingSearchers:定义同时在warm-up的searcher的最大数量
    o	listener:监听一些事件并指定处理的类,比如在solr启动时加载一些数据到缓存中,相关参数:
        	event:被监听的事件,比如:firstSearcher是第一个searcher启动、
            也就是solr启动的事件,newSearcher是当已经有searcher在运行的时候有新searcher启动的事件
        	class:处理类
        	name:="queries"就是需要处理的是query
        	lst, name:针对哪些搜索条件需要处理

扩展:

缓存的清空策略一共有三种:
LRU(Least Recently Used):最近最少使用
LFU(Leats Frequently Uesd):最不经常使用
FIFO(First in First Out):先进先出

<requestDispatcher/>标签:

•用途:控制Solr HTTP RequestDispatche r响应请求的方式,比如:是否处理/select url、
是否支持对流的处理、上传文件的大小、如何处理带有cache头的HTTP请求、等等
•主要参数:
    o handleSelect:true/false,如果是false,则由requestHandler来处理/select请求。
因为现在的requestHandler中/select是标配,所以这里应该填false
    o requestParsers:
         enableRemoteStreaming:是否接受流格式的内容,缺省为ture
         multipartUploadLimitInKB:multi-part POST请求,上传文件的大小上限(K)
         formdataUploadLimitInKB:HTTP POST的form data大小上限(K)
         addHttpRequestToContext:原始的HttpServletRequest对象是否应该被包含在
SolrQueryRequest的httpRequest中……一般自定义的插件使用这个参数……
    o httpCaching:如何处理带有cache control头的HTTP请求
         nerver304:如果设为true(开发阶段),则就算所请求的内容没被修改,也不会返回304,并且下面两个参数会失效
         lastModFrom:最后修改时间的计算方式,openTime:Searcher启动的时刻;dirLastMod:索引更新的时刻
         etagSeed:HTTP返回的ETag头内容
         cacheControl:HTTP返回的Cache-Control头内容

<updateProcessor/>和<updateProcessorChain/>标签:

•	用途:配置处理update请求的处理器、处理器链。如果不配置的话,Solr会使用缺省的三个处理器:
    o	LogUpdateProcessorFactory:追踪和记录日志
    o	DistributedUpdateProcessorFactory:分流update请求到不同的node,
比如SolrCloud的情况下把请求分配给一个shard的leader,然后把更新应用到所有replica中
    o	RunUpdateProcessorFactory:调用Solr的内部API执行update操作
•	如果需要自定义update处理器:
    o	updateProcessor:
        	class:负责处理的类
        	name:名字,给updateProcessorChain引用是使用
    o	updateProcessorChain:
        	name:自己的名字标记
        	processor:指定updateProcessor的name,多个的话用逗号“,”分开

猜你喜欢

转载自blog.csdn.net/sswqzx/article/details/84501215