跟益达学Solr5之Schema.xml详解ITeye - 亚美娱乐

跟益达学Solr5之Schema.xml详解ITeye

2019-01-12 19:01:03 | 作者: 向松 | 标签: 需求,装备,表明 | 浏览: 1928

       schema.xml是用来界说索引数据中的域的,包括域称号,域类型,域是否索引,是否分词,是否存储,是否标准化即Norms,是否存储项向量等等。

     schema.xml装备文件的根元素就是schema,有个name特点,name特点值能够随意配,根元素没什么好说的,schema元素下主要有两个标签元素即field和fieldType,field表明域,用来界说域,fieldType用来界说域类型。

     field元素有许多特点能够装备,我逐个做个解说:

   name: 表明域的称号,是强制有必要有的特点

     type: 域类型的称号,与fieldType元素的name特点值对应,也是强制有必要有的特点,不行省

      required: 表明这个域是否是有必要要在document中存在,默许值为false,假如此装备项设为true,则你的document中有必要要增加此域,不然你创立索引时会抛反常,例如:Document is missing mandatory field:xxx之类的反常,因为lucene的索引结构是扁平化的,所以一般除了id主键域你能够设置为仅有域,其他域required主张坚持默许值false即可

     indexed: true即表明需求对该域进行索引,一般假如你需求在该域上进行查询或排序时,则需求装备为true,默许值为false

     stored: 表明是否需求把域值存储到硬盘上,便利你后续查询时能再次提取出来原样显现给用户

     docValues: 表明此域是否需求增加一个docValues域,这对facet查询,group分组,排序,function查询有优点,虽然这个特点不是有必要的,但他能加速索引数据加载,对NRT近实时查找比较友爱,且更节约内存,但它也有一些约束,比方当时docValues域只支撑strField,UUIDField,Trie*Field等域,且要求域的域值是单值不能是多值域

     multiValued: 表明这个域是否能够存储多个值,若设置为true,即表明这是一个多值域

     omitNorms: 此特点若设置为true,即表明将疏忽域值的长度标准化,疏忽在索引过程中对当时域的权重设置,且会节约内存。只需全文本域或许你需求在索引创立过程中设置域的权重时才需求把这个值设为false,关于根本数据类型且不分词的域如intFeild,longField,StrField等默许此特点值就是true,不然默许就是false.

     termVectors: 设置为true即表明需求为该field存储项向量信息,当你需求MoreLikeThis功用时,则需求将此特点值设为true,这样会带来一些功用提高。

     termPositions: 是否存储Term的开始方位信息,这会增大索引的体积,但高亮功用需求依靠此项设置,不然无法高亮

     termOffsets: 表明是否存储索引的方位偏移量,高亮功用需求此项装备,当你运用SpanQuery时,此项装备会影响匹配的成果集

     field里还有两个比较难了解的域,是Solr扩展的,在Lucene中没有的概念,即dynamicField动态域和copyField仿制域:

     动态域的特点装备跟一般的field差不多就不多说了,仅有有点差异就是name的特点值,能够用通配符,这样就能够含糊匹配多个域啦,这样规划的意图就是不必频频的去修正咱们的schema.xml中的field装备去增加field域啦,比方之前有个link_s域,某一天你想再增加一个url_s域,那你就需求去修正schema.xml装备文件,因为schema.xml修正往后需求重启tomcat才干收效,重启即意味着程序的中止,这往往是不行承受的。所以引进动态域来防止频频增加修正域,但条件是你的域需求契合你提早界说的动态域的域称号命名规矩哦。

     仿制域即表明把某个域的值仿制到一个方针域上面,那假如把多个域的值仿制到一个方针域上面呢,你能够进行屡次仿制,表现到XML装备上就是相似这样的装备:

     copyField source="title" dest="text"/

      copyField source="body" dest="text"/

     如上装备就表明把title和body这两个域的值悉数仿制到text这个新域上面,仅有要注意的是,假如你仅仅仿制单个域,那么假如你被仿制域自身就是多值域,那么方针域也是多值域,这毋庸置疑,那假如你仿制的是多个域,只需其中有一个域是多值域,那么方针域就一定是多值域,这点一定要谨记。

     field说完了,接着说说fieldType元素,它用来界说域类型,solr内置的域类型有StrField,BoolField,TrieIntField,TrieFloatField,TrieLongField,TrieDoubleField,TrieDateField,BinaryField,RandomSortField,TextField等,其他更多域类型请自己查阅Solr API文档。

     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分词器,留到后续再说,这儿就不展开了。

     

      最终需求说的就是uniqueKey元素,它用来装备document的仅有标识域,即solr是用此域来决议增量导入时是否重复导入,假如id相同,则不会重复导入,或许当你更新索引时,你能够依据指定的uniqueKey域,来断定一个document,然后对该document进行更新。总归,它是用来仅有断定一个document的,跟数据库表里的主键id概念相似,条件是你uniqueKey里装备的域称号你需求提早运用field元素进行界说。

      fieldType元素还有一些额定的特点也需求注意下,比方sortMissingFirst,sortMissingLast等: 

      sortMissingLast表明假如域值为null,在依据当时域进行排序时,把包括null值的document排在最终一位,

      sortMissingFirst:与sortMissingLast对应的,不言自明了,你应该懂的。

      docValues:表明是否为docValues域,一般排序,group,facet时会用到docValues域。

 

      OK,schema.xml装备就说这么多了,打完收工!!!都是一些理论性的东西,没有什么代码,会比较单调,但看到许多小伙伴们在问,所以觉得仍是有必要拿出来说一说,希望能帮到你们!

     

      假如你还有什么问题请加我Q-Q:7-3-6-0-3-1-3-0-5,

或许加裙
一同交流学习!

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表亚美娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1

    Redis的耐久化机制ITeye

    耐久,方法,内存
  • 2
  • 3

    记一次线程池的运用ITeye

    线程,运用,行列
  • 4
  • 5
  • 6
  • 7
  • 8

    Digester 解析XMLITeye

    元素,参数,解析
  • 9

    运用文件体系ITeye

    目录,读取,是否
  • 10