真实环境中,创建一个索引要根据需求来修改配置。主要就是配置schema.xml和solrconfig.xml两个文件。
schema.xml文件中,主要配置有关于域(字段)和分析器(分词+过滤等)的相关信息。
solrconfig.xml文件中配置的东西比较多,比如常用的搜索默认值、高亮配置等,还有solr性能优化相关的东西。
这些东西比较细,记几个觉得比较好的链接:
mseaspring的《Solr学习之三 solr配置说明之一》
http://www.cnblogs.com/seaspring/p/5381715.html;
mseaspring的《Solr学习之四-Solr配置说明之二》
http://www.cnblogs.com/seaspring/p/5387559.html;
这两篇分别比较详细的介绍了两个配置文件。
贴一个网上找到的schema.xml文件上来:
<?xml version="1.0" encoding="UTF-8" ?>
<!--
版权说明。。.
-->
<!--
这是solr的chema 文件,这个文件应该被重命名为"schema.xml",而且他应该放在solrhome/core/conf文件下面。
获取你也能在solr webapp 的classload下面找到他.
更多的信息可以查看
http://wiki.apache.org/solr/SchemaXml
性能说明:可以如下来提高性能。
- 设置 stored="false" 对那些只需要搜索,无需返回的字段.
- 设置 indexed="false" 对于那些只用于返回无需进行搜索的字段.
- 删除所有不需要 copyfiled字段的声明
- 为了最好的索引大小与索引性能,设置所有一般的文本字段index=false,使用copyfile将他们copy到一个字段上,然后使用它进行搜索。
- 运行jvm服务器模式,并使用较高的日志级别,避免记录每一个请求。
-->
<schema name="example-data-driven-schema" version="1.6">
<!-- 该配置名称与版本说明.
-->
<!-- 字段的有效属性:
name:属性的名称,这里有个特殊的属性“_version_”是必须添加的。
type:字段的数据结构类型,所用到的类型需要在fieldType中设置。
default:默认值。
indexed:是否创建索引
stored:是否存储原始数据(如果不需要存储相应字段值,尽量设为false)
docValues:表示此域是否需要添加一个 docValues 域,这对 facet 查询, group 分组,排序, function 查询有好处,尽管这个属性不是必须的,但他能加快索引数据加载,对 NRT 近实时搜索比较友好,且更节省内存,但它也有一些限制,比如当前docValues 域只支持 strField,UUIDField,Trie*Field 等域,且要求域的域值是单值不能是多值域
solrMissingFirst/solrMissingLast:查询结果排序的过程中,如果发现这个字段的值不存在,则排在前面/后面,忽略排序的条件
multValued:是否有多个值,比如说一个用户的所有好友id。(对可能存在多值的字段尽量设置为true,避免建索引时抛出错误)
omitNorms:此属性若设置为 true ,即表示将忽略域值的长度标准化,忽略在索引过程中对当前域的权重设置,且会节省内存。只有全文本域或者你需要在索引创建过程中设置域的权重时才需要把这个值设为 false, 对于基本数据类型且不分词的域如intFeild,longField,Stre, 否则默认就是 false.
required:添加文档时,该字段必须存在,类似mysql的not null
termVectors: 设置为 true 即表示需要为该 field 存储项向量信息,当你需要MoreLikeThis 功能时,则需要将此属性值设为 true ,这样会带来一些性能提升。
termPositions: 是否存储 Term 的起始位置信息,这会增大索引的体积,但高亮功能需要依赖此项设置,否则无法高亮
termOffsets: 表示是否存储索引的位置偏移量,高亮功能需要此项配置,当你使用SpanQuery 时,此项配置会影响匹配的结果集
-->
<!--字段名称应该包含字母数字或下划线字符,不以一个数字开始。这是目前没有严格执行,但其他字段名称将不会有来自所有组件的第一类支持和背部的兼容性没有保证。领导和的名字下划线(如_version_)保留。-->
<!--
在这data_driven_schema_configs configset,下面三个字段是必须的:
id、_version_,和_text_。所有其他字段都是可以删除修改的,并根据需要手动添加
在xml。
请注意,许多动态字段也被定义-您可以使用它们来指定一个
字段的类型通过字段命名约定-见下文。
警告:本_text_catch所字段将会显著地提高索引的大小。
如果你不需要,考虑删除它和相应的copyfield指令。-->
<field name="id" type="long" indexed="true" stored="true" required="true"/>
<!-- 常规字段->
<field name="informer_id" type="long" indexed="true" stored="false"/>
<field name="phone_number" type="string" indexed="true" stored="false"/>
<field name="title" type="string" indexed="true" stored="true" />
<field name="content" type="string" indexed="true" stored="true" />
<field name="latitude" type="string" indexed="true" stored="true" />
<field name="longitude" type="string" indexed="true" stored="true" />
<field name="attachment" type="string" indexed="true" stored="true" />
<field name="clue_status" type="int" indexed="true" stored="true" />
<field name="del_flag" type="int" indexed="true" stored="true" />
<field name="gmt_create" type="date" indexed="true" stored="true" />
<field name="create_uid" type="long" indexed="true" stored="true" />
<field name="gmt_modified" type="date" indexed="true" stored="true" />
<field name="modified_uid" type="long" indexed="true" stored="true" />
<!--预留字段 -->
<!--<field name="id" type="string" indexed="true" stored="true" multiValued="false" />-->
<field name="_version_" type="long" indexed="true" stored="false"/>
<field name="_root_" type="string" indexed="true" stored="false" docValues="false" />
<field name="_text_" type="text_general" indexed="true" stored="false" multiValued="true"/>
<!--复制字段-->
<!--建议建立一个拷贝字段,将所有的 全文本 字段复制到一个字段中,以便进行统一的检索
要注意的是,如果你只是复制单个域,那么如果你被复制域本身就是多值域,那么目标域也是多值域,这毋庸置疑,那如果你复制的是多个域,只要其中有一个域是多值域,那么目标域就一定是多值域,这点一定要谨记
-->
<copyField source="*" dest="_text_"/>
<!--动态字段-->
<!-- 动态字段 属性配置上与常规字段没啥区别,最大的区别是name的属性上可以进行通配,比如说name="*_i",那么只要是后面带i的字段都是符合的。这样就不怕一些字段无法匹配无法写入 -->
<dynamicField name="*_i" type="int" indexed="true" stored="true"/>
<dynamicField name="*_is" type="ints" indexed="true" stored="true"/>
<dynamicField name="*_s" type="string" indexed="true" stored="true" />
<dynamicField name="*_ss" type="strings" indexed="true" stored="true"/>
<dynamicField name="*_l" type="long" indexed="true" stored="true"/>
<dynamicField name="*_ls" type="longs" indexed="true" stored="true"/>
<dynamicField name="*_t" type="text_general" indexed="true" stored="true"/>
<dynamicField name="*_txt" type="text_general" indexed="true" stored="true"/>
<dynamicField name="*_b" type="boolean" indexed="true" stored="true"/>
<dynamicField name="*_bs" type="booleans" indexed="true" stored="true"/>
<dynamicField name="*_f" type="float" indexed="true" stored="true"/>
<dynamicField name="*_fs" type="floats" indexed="true" stored="true"/>
<dynamicField name="*_d" type="double" indexed="true" stored="true"/>
<dynamicField name="*_ds" type="doubles" indexed="true" stored="true"/>
<!-- 字段类型 -->
<!--
StrField: 这是一个不分词的字符串域,它支持 docValues 域,但当为其添加了docValues 域,则要求只能是单值域且该域必须存在或者该域有默认值
BoolField : boolean 域,对应 true/false
TrieIntField, TrieFloatField, TrieLongField, TrieDoubleField 这几个都是默认的数字域, precisionStep 属性一般用于数字范围查询, precisionStep 值越小,则索引时该域的域值分出的 token 个数越多,会增大硬盘上索引的体积,但它会加快数字范围检索的响应速度, positionIncrementGap 属性表示如果当前域是多值域时,多个值之间的间距,单值域,设置此项无意义。
TrieDateField :显然这是一个日期域类型,不过遗憾的是它支持 1995-12-31T23:59:59Z 这种格式的日期,比较坑爹,为此我自定义了一个 TrieCNDateField 域类型,用于支持国人比较喜欢的 yyyy-MM-dd HH:mm:ss 格式的日期。源码请参见我的上一篇博客。
BinaryField :经过 base64 编码的字符串域类型,即你需要把 binary 数据进行base64 编码才能被 solr 进行索引。
RandomSortField :随机排序域类型,当你需要实现伪随机排序时,请使用此域类型。
TextField :是用的最多的一种域类型,它需要进行分词,所以它一般需要配置分词器。至于具体它如何配置 IK 分词器,这里就不展开了-->
<fieldType name="string" class="solr.StrField" sortMissingLast="true" docValues="true" />
<fieldType name="strings" class="solr.StrField"