solr配置文件
下面介绍solr的两个主要的配置文件,先对这些配置文件提前了解以后,在使用过程中就会容易多了。
1、managed-scheme配置解释:
1.1 field节点:
字段主要表示的是一些solr库里的定义,类似MySQL等。字段名由字母数字和下划线组成,不能以数字开头。以下划线开头并且以下划线结尾的字段名是保留字段名(e.g. _version_).介绍一些重要的预置字段如下:
<field name="_version_" type="long" indexed="true" stored="false" />
该字段用于乐观锁,如果去除此字段,必须同时去掉solrconfig.xml中的update log。_version_ and update log 在SolrCloud中是必须的。
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。
两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。
<field name="_root_" type="string" indexed="true" stored="false" docValues="false" />
如果document中内嵌document,此需要此字段。用于内嵌的document指向其父document.
<uniqueKey>id</uniqueKey>
标志solr document的唯一字段。
1.2 配置field自定义字段时,需要理解几个属性:
1.3 types节点:name:属性名称,字段名
type:指定属性类型,可由fieldtype标签自定义
indexed:该属性是否被索引,若为true,则可以作为被检索区域
stored:该属性是否被存储,是否存在solr中,按实际情况配置true(如果不需要存储相应字段值,尽量设为false)
multiValued:是否有多个值(对可能存在多值的字段尽量设置为true,避免建索引时抛出错误)
required:一般用于主键。
1.4 其他的一些常用配置:一般用来配置FieldType字段,用于定义数据类型的。
name:这个FeildType的名称。
class:指向org.apache.solr.analysis包里面对应的class名称,用来定义这个类型的行为.
useSmart =true ,分词器使用智能切分策略, =false则使用细粒度切分。必要的时候fieldType还需要自己定义这个类型的数据在建立索引和进行查询的时候要使用的分析器analyzer,包括分词和过滤.
sortMissingLast: = true时,那些在该<field>上没有值的documents将被排在那些在该<field>上有值的documents之后,sortMissingFirst与之相反,两个属性是用在可以内在使用String排序的类型上。
omitNorms:设置 omitNorms=false 意味着忽略掉 field 的 norms,相当于禁用掉了 length normalization 和 索引时 boosting;length normalization:越短的文档,得分越高;boost:boost 越大,得分越高。(并不是很理解这个概念。。。)
copyField:例如’<copyField source="name" dest=“all”/>’,拷贝字段,将所有的 全文本 字段复制到一个字段中,以便进行统一的检索,比如需要搜索的字段有n个,可以将这n个字段复制到这一个字段,然后可以在查询时只查这一个字段,起到多维度搜索的效果。
<uniqueKey>id</uniqueKey>:文档的唯一标识, 必须填写这个field(除非该field被标记required="false"),否则solr建立索引报错。
<defaultSearchField>text</defaultSearchField>:如果搜索参数中没有指定具体的field,那么这是默认的域。
<solrQueryParser defaultOperator="OR" />:配置搜索参数短语间的逻辑,可以是”AND|OR”。
2、solrConfig.xml解释:
lib:<lib> 标签指令可以用来告诉 Solr 如何去加载 solr plugins(Solr 插件 ) 依赖的 jar 包,在 solrconfig.xml 配置文件的注释中有配置示例,例如:
<lib dir="./lib" regex=”lucene-\w+\.jar”/>
这里的 dir 表示一个 jar 包目录路径,该目录路径是相对于你当前 core 根目录的; regex 表示一个正则表达式,用来过滤文件名的,符合正则表达式的 jar 文件将会被加载.
dataDir parameter:用来指定一个 solr 的索引数据目录, solr 创建的索引会存放在 data\index 目录下,默认 dataDir 是相对于当前 core 目录 ( 如果 solr_home 下存在 core 的话 ) ,如果 solr_home 下不存在 core 的话,那 dataDir 默认就是相对于 solr_home 啦,不过一般 dataDir 都在 core.properties 下配置。
<dataDir>/var/data/solr</dataDir>
2.1 solrconfig.xml 中的配置项主要分以下几大块:
2.1.1. 依赖的 lucene 版本配置,这决定了你创建的 Lucene 索引结构,因为 Lucene 各版本之间的索引结构并不是完全兼容的,这个需要引起你的注意。
2.1.2. 索引创建相关的配置,如索引目录, IndexWriterConfig 类中的相关配置 ( 它决定了你的索引创建性能 ).
2.1.3 solrconfig.xml 中依赖的外部 jar 包加载路径配置.
2.1.4 缓存相关配置,缓存包括过滤器缓存,查询结果集缓存, Document 缓存,以及自定义缓存等等
2.1.5 updateHandler 配置即索引更新操作相关配置.
2.1.6 RequestHandler 相关配置,即接收客户端 HTTP 请求的处理类配置.
2.1.7 查询组件配置如 HightLight , SpellChecker 等等.
2.1.8 ResponseWriter 配置即响应数据转换器相关配置,决定了响应数据是以什么样格式返回给客户端的。
2.1.9 自定义 ValueSourceParser 配置,用来干预 Document 的权重、评分,排序.
3、managed-scheme配置示例:
<?xml version="1.0" encoding="UTF-8" ?> <schema name="example-DIH-solr" version="1.6"> <fieldtype name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/> <fieldtype name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/> <fieldType name="text_ik" class="solr.TextField"> <analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/> <analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType> <field name="id" type="long" indexed="false" stored="true" multiValued="false"/> <field name="tittle" type="text_ik" indexed="true" stored="true" multiValued="false"/> <field name="content" type="text_ik" indexed="true" stored="true" multiValued="false"/> <field name="link" type="text_ik" indexed="false" stored="false" multiValued="false"/> <field name="structerkey" type="text_ik" indexed="true" stored="true" multiValued="false"/> <field name="structerid" type="text_ik" indexed="false" stored="true" multiValued="false"/> <field name="bookname" type="text_ik" indexed="true" stored="true" multiValued="false"/> <field name="firstlevel" type="text_ik" indexed="true" stored="true" multiValued="false"/> <field name="secondlevel" type="text_ik" indexed="true" stored="true" multiValued="false"/> <field name="source" type="text_ik" indexed="true" stored="true" multiValued="false"/> <field name="img" type="text_ik" indexed="false" stored="false" multiValued="false"/> <field name="addtime" type="text_ik" indexed="false" stored="false" multiValued="false"/> <field name="searchText" type="text_ik" indexed="true" stored="true" multiValued="true"/> <field name="_version_" type="long" indexed="true" stored="true"/> <copyField source="tittle" dest="searchText"/> <copyField source="content" dest="searchText"/> <copyField source="bookname" dest="searchText"/> <uniqueKey>structerkey</uniqueKey> <!-- 这两个个字段在solr 6.6.0以后是不支持的,需要删除,并在query的时候处理 --> <defaultSearchField>searchText</defaultSearchField> <solrQueryParser defaultOperator="OR"/> </schema>