设为首页 收藏本站
查看: 1368|回复: 0

[经验分享] 关于 solr schema.xml 的配置说明

[复制链接]
累计签到:6 天
连续签到:1 天
发表于 2015-7-17 07:57:54 | 显示全部楼层 |阅读模式
  schema.xml位于solr/conf/目录下,类似于数据表配置文件,
  定义了加入索引的数据的数据类型,主要包括type、fields和其他的一些缺省设置。
  
  1、先来看下type节点,这里面定义FieldType子节点,包括name,class,positionIncrementGap等一些参数。


  • name:就是这个FieldType的名称。
  • class:指向org.apache.solr.analysis包里面对应的class名称,用来定义这个类型的行为。
  



1 < schema name = "example" version = "1.2" >
2 < types >
3 < fieldType name = "string" class = "solr.StrField" sortMissingLast = "true" omitNorms = "true" />
4 < fieldType name = "boolean" class = "solr.BoolField" sortMissingLast = "true" omitNorms = "true" />
5 < fieldtype name = "binary" class = "solr.BinaryField" />
6 < fieldType name = "int" class = "solr.TrieIntField" precisionStep = "0" omitNorms = "true"
7 positionIncrementGap = "0" />
8 < fieldType name = "float" class = "solr.TrieFloatField" precisionStep = "0" omitNorms = "true"
9 positionIncrementGap = "0" />
10 < fieldType name = "long" class = "solr.TrieLongField" precisionStep = "0" omitNorms = "true"
11 positionIncrementGap = "0" />
12 < fieldType name = "double" class = "solr.TrieDoubleField" precisionStep = "0" omitNorms = "true"
13 positionIncrementGap = "0" />
14 ...
15
16 ...
17
  必要的时候fieldType还需要自己定义这个类型的数据在建立索引和进行查询的时候要使用的分析器analyzer,包括分词和过滤,如下:






view plain print ?


1 < fieldType name = "text_ws" class = "solr.TextField" positionIncrementGap = "100" >
2 < analyzer >
3 < tokenizer class = "solr.WhitespaceTokenizerFactory" />
4
5
6 < fieldType name = "text" class = "solr.TextField" positionIncrementGap = "100" >
7 < analyzer type = "index" >
8
12 < tokenizer class = "solr.WhitespaceTokenizerFactory" />
13
17
21 < filter class = "solr.StopFilterFactory"
22 ignoreCase = "true"
23 words = "stopwords.txt"
24 enablePositionIncrements = "true"
25 />
26 < filter class = "solr.WordDelimiterFilterFactory" generateWordParts = "1"
27 generateNumberParts = "1" catenateWords = "1" catenateNumbers = "1"
28 catenateAll = "0" splitOnCaseChange = "1" />
29 < filter class = "solr.LowerCaseFilterFactory" />
30 < filter class = "solr.SnowballPorterFilterFactory" language = "English"
31 protected = "protwords.txt" />
32
33 < analyzer type = "query" >
34 < tokenizer class = "solr.WhitespaceTokenizerFactory" />
35 < filter class = "solr.SynonymFilterFactory" synonyms = "synonyms.txt" ignoreCase = "true"
36 expand = "true" />
37 < filter class = "solr.StopFilterFactory"
38 ignoreCase = "true"
39 words = "stopwords.txt"
40 enablePositionIncrements = "true"
41 />
42 < filter class = "solr.WordDelimiterFilterFactory" generateWordParts = "1"
43 generateNumberParts = "1" catenateWords = "0" catenateNumbers = "0"
44 catenateAll = "0" splitOnCaseChange = "1" />
45 < filter class = "solr.LowerCaseFilterFactory" />
46 < filter class = "solr.SnowballPorterFilterFactory" language = "English"
47 protected = "protwords.txt" />
48
49
  2、再来看下fields节点内定义具体的字段(类似数据库的字段),含有以下属性:


  • name:字段名
  • type:之前定义过的各种FieldType
  • indexed:是否被索引
  • stored:是否被存储(如果不需要存储相应字段值,尽量设为false)
  • multiValued:是否有多个值(对可能存在多值的字段尽量设置为true,避免建索引时抛出错误)






view plain print ?


1 < fields >
2 < field name = "id" type = "integer" indexed = "true" stored = "true" required = "true" />
3 < field name = "name" type = "text" indexed = "true" stored = "true" />
4 < field name = "summary" type = "text" indexed = "true" stored = "true" />
5 < field name = "author" type = "string" indexed = "true" stored = "true" />
6 < field name = "date" type = "date" indexed = "false" stored = "true" />
7 < field name = "content" type = "text" indexed = "true" stored = "false" />
8 < field name = "keywords" type = "keyword_text" indexed = "true" stored = "false" multiValued = "true" />
9
10 < field name = "all" type = "text" indexed = "true" stored = "false" multiValued = "true" />
11
  3、建议建立一个拷贝字段,将所有的 全文本 字段复制到一个字段中,以便进行统一的检索:
  以下是拷贝设置:






view plain print ?


1 < copyField source = "name" dest = "all" />
2 < copyField source = "summary" dest = "all" />
  4、动态字段,没有具体名称的字段,用dynamicField字段
  如:name为*_i,定义它的type为int,那么在使用这个字段的时候,任务以_i结果的字段都被认为符合这个定义。如name_i, school_i




view plain print ?




1 < dynamicField name = "*_i" type = "int" indexed = "true" stored = "true" />
2 < dynamicField name = "*_s" type = "string" indexed = "true" stored = "true" />
3 < dynamicField name = "*_l" type = "long" indexed = "true" stored = "true" />
4 < dynamicField name = "*_t" type = "text" indexed = "true" stored = "true" />
5 < dynamicField name = "*_b" type = "boolean" indexed = "true" stored = "true" />
6 < dynamicField name = "*_f" type = "float" indexed = "true" stored = "true" />
7 < dynamicField name = "*_d" type = "double" indexed = "true" stored = "true" />
8 < 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
  



1 < 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)



1  < 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
一起使用,设置多个值之间的虚拟空白的数量



1  < tokenizer class =" solr.WhitespaceTokenizerFactory " />
  空格分词,精确匹配。



1  < filter class =" solr.WordDelimiterFilterFactory " generateWordParts =" 1 " generateNumberParts =" 1 " catenateWords =" 1 " catenateNumbers =" 1 " catenateAll =" 0 " splitOnCaseChange =" 1 " />
  在分词和匹配时,考虑 "-"连字符,字母数字的界限,非字母数字字符,这样 "wifi"或"wi fi"都能匹配"Wi-Fi"。
  



1 < filter class =" solr.SynonymFilterFactory " synonyms =" synonyms.txt " ignoreCase =" true " expand =" true " />
  同义词



1  < filter class =" solr.StopFilterFactory " ignoreCase =" true " words =" stopwords.txt " enablePositionIncrements =" true " />
  在禁用字(stopword)删除后,在短语间增加间隔
  stopword:即在建立索引过程中(建立索引和搜索)被忽略的词,比如is this等常用词。在conf/stopwords.txt维护。
  4、fields
  



1 < 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个模式同时匹配上,最先定义的优先



1  < dynamicField name =" * " type =" ignored " multiValued=" true " />
  如果通过上面的匹配都没找到,可以定义这个,然后定义个type,当String处理。(一般不会发生)
  但若不定义,找不到匹配会报错。
  5、其他一些标签
  



1 < uniqueKey > id
  
  文档的唯一标识, 必须填写这个field(除非该field被标记required="false"),否则solr建立索引报错。



< defaultSearchField > text
  如果搜索参数中没有指定具体的field,那么这是默认的域。



1 < solrQueryParser defaultOperator =" OR " />
  配置搜索参数短语间的逻辑,可以是"AND|OR"。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-87422-1-1.html 上篇帖子: [solr] schema.xml 下篇帖子: OpenCms 集成外部Solr Server
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表