文档章节

Solr配置文件:schema.xml

一枚Sir
 一枚Sir
发布于 2014/04/14 13:55
字数 2362
阅读 1087
收藏 2

Solr配置文件:schema.xml  http://www.blogjava.net/conans/articles/379545.html


一、字段配置(schema)
    schema.xml位于solr/collection1/conf/目录下,类似于数据表配置文件,
    定义了加入索引的数据的数据类型,主要包括type、fields和其他的一些缺省设置。

    1、先来看下type节点,这里面定义FieldType子节点,包括name,class,positionIncrementGap等一些参数。
        name:就是这个FieldType的名称。
        class:指向org.apache.solr.analysis包里面对应的class名称,用来定义这个类型的行为。
        <schema name="example" version="1.2"> 
            <types> 
                <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true" /> 
                <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true" omitNorms="true" /> 
                <fieldtype name="binary" class="solr.BinaryField" /> 
                <fieldType name="int" class="solr.TrieIntField" precisionStep="0" omitNorms="true" positionIncrementGap="0" /> 
                <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" omitNorms="true" positionIncrementGap="0" /> 
                <fieldType name="long" class="solr.TrieLongField" precisionStep="0" omitNorms="true" positionIncrementGap="0" /> 
                <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" omitNorms="true" positionIncrementGap="0" /> 
                ...  
           </ types > 
           ...  
        </ schema >  

        必要的时候fieldType还需要自己定义这个类型的数据在建立索引和进行查询的时候要使用的分析器analyzer,包括分词和过滤,如下:
        <fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100"> 
            <analyzer> 
                <tokenizer class="solr.WhitespaceTokenizerFactory" /> 
            </analyzer > 
        </fieldType > 
        <fieldType name="text" class="solr.TextField" positionIncrementGap="100" > 
            <analyzer type="index" > 
                <!--
                这个分词包是空格分词,在向索引库添加text类型的索引时,Solr会首先用空格进行分词
                然后把分词结果依次使用指定的过滤器进行过滤,最后剩下的结果,才会加入到索引库中以备查询。  
                注意:Solr的analysis包并没有带支持中文的包,需要自己添加中文分词器,google下。  
                --> 
                <tokenizer class="solr.WhitespaceTokenizerFactory" /> 
                <!-- in this example, we will only use synonyms at query time  
                <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false" /> 
                --> 
                <!-- Case insensitive stop word removal.  
                  add enablePositionIncrements=true  in both the index and query  
                  analyzers to leave a 'gap' for more accurate phrase queries.  
                --> 
                <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
                <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" /> 
                <filter class="solr.LowerCaseFilterFactory" /> 
                <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt" /> 
            </analyzer > 
            <analyzer type="query" > 
                <tokenizer class="solr.WhitespaceTokenizerFactory" /> 
                <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" /> 
                <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
                <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1" /> 
                <filter class="solr.LowerCaseFilterFactory" /> 
                <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt" /> 
            </analyzer > 
        </fieldType >  


    2、再来看下fields节点内定义具体的字段(类似数据库的字段),含有以下属性:
        name:字段名
        type:之前定义过的各种FieldType
        indexed:是否被索引
        stored:是否被存储(如果不需要存储相应字段值,尽量设为false)
        multiValued:是否有多个值(对可能存在多值的字段尽量设置为true,避免建索引时抛出错误)
        <fields> 
            <field name="id" type="integer" indexed="true" stored="true" required="true" /> 
            <field name="name" type="text" indexed="true" stored="true" /> 
            <field name="summary" type="text" indexed="true" stored="true" /> 
            <field name="author" type="string" indexed="true" stored="true" /> 
            <field name="date" type="date" indexed="false" stored="true" /> 
            <field name="content" type="text" indexed="true" stored="false" /> 
            <field name="keywords" type="keyword_text" indexed="true" stored="false" multiValued="true" /> 
            <!--拷贝字段--> 
            <field name="all" type="text" indexed="true" stored="false" multiValued="true" /> 
        </fields>  

 
    3、建议建立一个拷贝字段,将所有的全文本字段复制到一个字段中,以便进行统一的检索:
        以下是拷贝设置:
        <copyField source="name" dest="all" /> 
        <copyField source="summary" dest="all" />  

    
    4、动态字段,没有具体名称的字段,用dynamicField字段
        如:name为*_i,定义它的type为int,那么在使用这个字段的时候,任务以_i结果的字段都被认为符合这个定义。如name_i, school_i
        <dynamicField name="*_i"  type="int"  indexed="true"  stored="true" /> 
        <dynamicField name="*_s"  type="string"  indexed="true"  stored="true" /> 
        <dynamicField name="*_l"  type="long"   indexed="true"  stored="true" /> 
        <dynamicField name="*_t"  type="text"  indexed="true"  stored="true" /> 
        <dynamicField name="*_b"  type="boolean" indexed="true"  stored="true" /> 
        <dynamicField name="*_f"  type="float"  indexed="true"  stored="true" /> 
        <dynamicField name="*_d"  type="double" indexed="true"  stored="true" /> 
        <dynamicField name="*_dt" type="date"  indexed="true"  stored="true" />  


        
schema.xml文档注释中的信息:
    1、为了改进性能,可以采取以下几种措施:
        将所有只用于搜索的,而不需要作为结果的field(特别是一些比较大的field)的stored设置为false
        将不需要被用于搜索的,而只是作为结果返回的field的indexed设置为false
        删除所有不必要的copyField声明
        为了索引字段的最小化和搜索的效率,将所有的 text fields的index都设置成field,然后使用copyField将他们都复制到一个总的 text field上,然后对他进行搜索。
        为了最大化搜索效率,使用java编写的客户端与solr交互(使用流通信)
        在服务器端运行JVM(省去网络通信),使用尽可能高的Log输出等级,减少日志量。
    2、<schema name="example" version="1.2">
        name:标识这个schema的名字
        version:现在版本是1.2

    3、filedType
        <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true" />
        name:标识而已。
        class和其他属性决定了这个fieldType的实际行为。(class以solr开始的,都是在org.appache.solr.analysis包下)
        可选的属性:
        sortMissingLast和sortMissingFirst两个属性是用在可以内在使用String排序的类型上(包括:string,boolean,sint,slong,sfloat,sdouble,pdate)。
        sortMissingLast="true",没有该field的数据排在有该field的数据之后,而不管请求时的排序规则。
        sortMissingFirst="true",跟上面倒过来呗。
        2个值默认是设置成false
        StrField类型不被分析,而是被逐字地索引/存储。
        StrField和TextField都有一个可选的属性“compressThreshold”,保证压缩到不小于一个大小(单位:char)
        <fieldType name="text" class="solr.TextField" positionIncrementGap="100" >
        solr.TextField 允许用户通过分析器来定制索引和查询,分析器包括一个分词器(tokenizer)和多个过滤器(filter)
        positionIncrementGap:可选属性,定义在同一个文档中此类型数据的空白间隔,避免短语匹配错误。
        name:  字段类型名 
        class:  java类名 
        indexed:  缺省true。 说明这个数据应被搜索和排序,如果数据没有indexed,则stored应是true。 
        stored:  缺省true。说明这个字段被包含在搜索结果中是合适的。如果数据没有stored,则indexed应是true。 
        sortMissingLast:  指没有该指定字段数据的document排在有该指定字段数据的document的后面 
        sortMissingFirst:  指没有该指定字段数据的document排在有该指定字段数据的document的前面 
        omitNorms:  字段的长度不影响得分和在索引时不做boost时,设置它为true。一般文本字段不设置为true。 
        termVectors:  如果字段被用来做more like this 和highlight的特性时应设置为true。 
        compressed:  字段是压缩的。这可能导致索引和搜索变慢,但会减少存储空间,只有StrField和TextField是可以压缩,这通常适合字段的长度超过200个字符。 
        multiValued:  字段多于一个值的时候,可设置为true。 
        positionIncrementGap:  和multiValued
        一起使用,设置多个值之间的虚拟空白的数量
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        空格分词,精确匹配。
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" />
        在分词和匹配时,考虑 "-"连字符,字母数字的界限,非字母数字字符,这样 "wifi"或"wi fi"都能匹配"Wi-Fi"。
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" />
        同义词 
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
        在禁用字(stopword)删除后,在短语间增加间隔
        stopword:即在建立索引过程中(建立索引和搜索)被忽略的词,比如is this等常用词。在conf/stopwords.txt维护。

    4、fields
        <field name="id" type="string" indexed="true" stored="true" required="true" />
        name:标识而已。
        type:先前定义的类型。
        indexed:是否被用来建立索引(关系到搜索和排序)
        stored:是否储存
        compressed:[false],是否使用gzip压缩(只有TextField和StrField可以压缩)
        mutiValued:是否包含多个值
        omitNorms:是否忽略掉Norm,可以节省内存空间,只有全文本field和need an index-time boost的field需要norm。(具体没看懂,注释里有矛盾)
        termVectors:[false],当设置true,会存储 term vector。当使用MoreLikeThis,用来作为相似词的field应该存储起来。
        termPositions:存储 term vector中的地址信息,会消耗存储开销。
        termOffsets:存储 term vector 的偏移量,会消耗存储开销。
        default:如果没有属性需要修改,就可以用这个标识下。
    
        <field name="text" type="text" indexed="true" stored="false" multiValued="true" />
        包罗万象(有点夸张)的field,包含所有可搜索的text fields,通过copyField实现。
        <copyField source="cat" dest="text" />
        <copyField source="name" dest="text" />
        <copyField source="manu" dest="text" />
        <copyField source="features" dest="text" />
        <copyField source="includes" dest="text" />
        在添加索引时,将所有被拷贝field(如cat)中的数据拷贝到text field中
        作用:
        将多个field的数据放在一起同时搜索,提供速度
        将一个field的数据拷贝到另一个,可以用2种不同的方式来建立索引。
        <dynamicField name="*_i" type="int" indexed="true" stored="true" />
        如果一个field的名字没有匹配到,那么就会用动态field试图匹配定义的各种模式。
        "*"只能出现在模式的最前和最后
        较长的模式会被先去做匹配
        如果2个模式同时匹配上,最先定义的优先
        <dynamicField name="*" type="ignored" multiValued=" true" />
        如果通过上面的匹配都没找到,可以定义这个,然后定义个type,当String处理。(一般不会发生)
        但若不定义,找不到匹配会报错。

    5、其他一些标签
        <uniqueKey > id </ uniqueKey >
        文档的唯一标识, 必须填写这个field(除非该field被标记required="false"),否则solr建立索引报错。
        <defaultSearchField > text </ defaultSearchField >
        如果搜索参数中没有指定具体的field,那么这是默认的域。
        <solrQueryParser defaultOperator="OR" />
        配置搜索参数短语间的逻辑,可以是"AND|OR"。

© 著作权归作者所有

一枚Sir
粉丝 119
博文 209
码字总数 350904
作品 0
朝阳
架构师
私信 提问
Nutch+solr+mmseg4j集成

第一章 安装配置solr4.2 #下载solr4.2.0版本 [root@nutch nutch2]# wget http://archive.apache.org/dist/lucene/solr/4.2.0/solr-4.2.0.tgz #解压solr4.2.0文件 [root@nutch nutch2]# tar -......

hiqj
2014/04/18
43
0
全文检索可视化动态管理(二)--solr二次开发和solrj扩展

要完成solr的索引动态配置,需要solr提供动态新建、修改配置等的接口。solr虽提供core的添加删除,但不提供schema.xml修改新建接口,并且如果添加一个新core,也要将另一个core的conf配置文件...

hxt168
2016/07/12
270
0
Solr安装部署好,添加IK分词器时不显示collection1了!

Solr安装部署好,添加IK分词器时出了问题。 1.加包》2.添加....扩展字典/停用字典/配置文件到classes。IKAnalyzer.cfg.xml配置文件到这一步还正常, solr界面还有collection1 为什么solrhom...

石头2008
03/23
140
1
Import data from a database into Solr.

Data Import This tutorial uses Mysql database import data into Solr。 Create table node table: node table has tens of thousands of records, test uses only 300. Full-Import Cre......

Nathans
2016/09/13
39
0
Solr的安装部署及简单使用

由于demo项目使用的是maven构建,maven仓库用的是oschina的,此时solr的最新版本是5.4,而oschina中的solrj最新版本是5.3.1,所以我们为了保持一致性,也将下载5.3.1的solr作为演示 一、下载...

Fraud
2016/01/05
9.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

500行代码,教你用python写个微信飞机大战

这几天在重温微信小游戏的飞机大战,玩着玩着就在思考人生了,这飞机大战怎么就可以做的那么好,操作简单,简单上手。 帮助蹲厕族、YP族、饭圈女孩在无聊之余可以有一样东西让他们振作起来!...

上海小胖
今天
8
0
关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
今天
7
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
6
0
Docker容器实战(七) - 容器中进程视野下的文件系统

前两文中,讲了Linux容器最基础的两种技术 Namespace 作用是“隔离”,它让应用进程只能看到该Namespace内的“世界” Cgroups 作用是“限制”,它给这个“世界”围上了一圈看不见的墙 这么一...

JavaEdge
今天
8
0
文件访问和共享的方法介绍

在上一篇文章中,你了解到文件有三个不同的权限集。拥有该文件的用户有一个集合,拥有该文件的组的成员有一个集合,然后最终一个集合适用于其他所有人。在长列表(ls -l)中这些权限使用符号...

老孟的Linux私房菜
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部