solr配置schema.xml学习

    solr创建索引、添加数据的关键是配置schema.xml文件,该文件中主要是完成配置数据源、索引字段、数据类型等定义。同时,该文件的配置直接影响到solr搜索的效率和准确性。

一、搜索类型FileType

       name:指的是FileType的名字

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

<types> 
    <fieldType name="string" class="solr.StrField" sortMissingLast="true" />
	<fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>
	<fieldtype name="binary" class="solr.BinaryField"/>
	<fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
	<fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/>
	<fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
	<fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/>
	<fieldType name="tint" class="solr.TrieIntField" precisionStep="8" positionIncrementGap="0"/>
	<fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" positionIncrementGap="0"/>
	<fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" positionIncrementGap="0"/>
	<fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" positionIncrementGap="0"/>
	<fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>
	<fieldType name="tdate" class="solr.TrieDateField" precisionStep="6" positionIncrementGap="0"/>
	<fieldType name="pint" class="solr.IntField"/>
	<fieldType name="plong" class="solr.LongField"/>
	<fieldType name="pfloat" class="solr.FloatField"/>
	<fieldType name="pdouble" class="solr.DoubleField"/>
	<fieldType name="pdate" class="solr.DateField" sortMissingLast="true"/>
	<fieldType name="sint" class="solr.SortableIntField" sortMissingLast="true" omitNorms="true"/>
	<fieldType name="slong" class="solr.SortableLongField" sortMissingLast="true" omitNorms="true"/>
	<fieldType name="sfloat" class="solr.SortableFloatField" sortMissingLast="true" omitNorms="true"/>
	<fieldType name="sdouble" class="solr.SortableDoubleField" sortMissingLast="true" omitNorms="true"/>
	<fieldType name="random" class="solr.RandomSortField" indexed="true" />
</types> 
	
    注明了若干种搜索类型,字符串,数字,浮点,日期,布尔等。

    通常,我们对自己定义的类型建立分析器analyzer,来更好的实现对字段更加准确的搜索功能。分析器通常由分词器tokenizer和过滤器filter组成。通常只有solr.TextField 类型的fieldtype允许定制分析器。通常有一下两种方法创建分析器。

    方法一:使用任何 org.apache.lucene.analysis.Analyzer的子类进行设定。

<fieldtype name="nametext" class="solr.TextField">
	<analyzer class="org.apache.lucene.analysis.WhitespaceAnalyzer"/>
</fieldtype>

     方法二:指定一个TokenizerFactory ,后面跟一系列的TokenFilterFactories(它们将按照所列的顺序发生作用)

<fieldtype name="text" class="solrTextField">
   <analyzer>
     <tokenizer class="solr.solrStandardTokenizerFactory"/>
     <filter class="solr.solrStandardFilterFactory"/>
     <filter class="solr.solrLowerCaseFilterFactory"/>
     <filter class="solr.solrStopFilterFactory"/>
     <filter class="solr.solrPorterStemFilterFactory"/>
   </analyzer>
 </fieldtype>
    需要说明的一点是,Any Analyzer, TokenizerFactory, or TokenFilterFactory 应该用带包名的全类名进行指定,请确保它们位于Solr的classpath 路径下。对于 org.apache.solr.analysis.* 包下的类,仅仅通过solr.*就可以进行指定。
    Solr提供的TokenizerFactories,如下:

solr.LetterTokenizerFactory"I can't" "I", "can", "t"                                    
solr.WhitespaceTokenizerFactory"I can""I", "can" 
solr.LowerCaseTokenizerFactory"I can't""i", "can", "t" 
solr.StandardTokenizerFactory"I.B.M. cat's can't"
ACRONYM: "I.B.M.", APOSTROPHE:"cat's", APOSTROPHE:"can't"目前仅仅只有StandardFilter对Token 的类型是敏感的。
solr.HTMLStripWhitespaceTokenizerFactory  solr.HTMLStripWhitespaceTokenizerFactory
 solr.HTMLStripStandardTokenizerFactory   从结果中出去HTML标签,将结果交给StandardTokenizer处理
solr.PatternTokenizerFactory   按照规则表达式样式对分本进行分词

    Solr有哪些TokenFilterFactories,如下:

solr.StandardFilterFactory仅仅作用于由StandardTokenizer产生的Token
solr.LowerCaseFilterFactory  
solr.TrimFilterFactory去掉Token两端的空白符
solr.StopFilterFactory去掉如下的通用词,多为虚词。可通过words="stopwords.txt"来指定字符集
solr.KeepWordFilterFactory作用与solr.StopFilterFactory相反,保留词的列表也可以通过”word”属性进行指定
solr.LengthFilterFactory 过滤掉长度在某个范围之外的词,有min="2" max="5"属性
solr.PorterStemFilterFactory采用Porter Stemming Algorithm算法去掉单词的后缀,例如将复数形式变成单数形式,第三人称动词变成第一人称,现在分词变成一般现在时的动词
solr.EnglishPorterFilterFactory 关于句子主干的处理,其中的"protected"指定不允许修改的词的文件
solr.SnowballPorterFilterFactory关于不同语言的词干处理
solr.WordDelimiterFilterFactory 关于分隔符的处理
solr.SynonymFilterFactory 关于同义词的处理
solr.RemoveDuplicatesTokenFilterFactory 避免重复处理

二、定义字段fields

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

    compressed(true|false):是否使用gzip压缩存储(仅适用于compressable;TextField和StrField)
    compressThreshold():保证压缩到不小于一个integer大小
    omitNorms(true|false):当为true时,字段检索时被省略相关的规范
    omitTermFreqAndPositions(true|false):当为true时,省略这一领域的长远频率,位置和有效载荷
    termVectors(true|false):当设置true,会存储 term vector。当使用MoreLikeThis,用来作为相似词的field应该存储起来。
    termPositions:存储 term vector中的地址信息,会消耗存储开销。
    termOffsets:存储 term vector 的偏移量,会消耗存储开销。

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

三、拷贝字段copyField
    将所有的 全文本 字段复制到一个字段中,以便进行统一的检索。

<copyField source="name" dest="all"/>     
<copyField source="summary" dest="all"/>   

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Solr 8.7.0版本的schema.xml模板,你可以根据自己的需求进行相应的修改。 ``` <?xml version="1.0" encoding="UTF-8"?> <schema name="example" version="1.6"> <types> <fieldType name="string" class="solr.StrField" sortMissingLast="true" /> <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory" /> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> <filter class="solr.LowerCaseFilterFactory" /> <filter class="solr.EnglishMinimalStemFilterFactory" /> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory" /> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> <filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" /> <filter class="solr.LowerCaseFilterFactory" /> <filter class="solr.EnglishMinimalStemFilterFactory" /> </analyzer> </fieldType> <fieldType name="date" class="solr.DatePointField" /> <fieldType name="int" class="solr.IntPointField" /> <fieldType name="long" class="solr.LongPointField" /> <fieldType name="float" class="solr.FloatPointField" /> <fieldType name="double" class="solr.DoublePointField" /> <fieldType name="boolean" class="solr.BoolField" /> </types> <fields> <field name="id" type="string" indexed="true" stored="true" multiValued="false" required="true" /> <field name="title" type="text_general" indexed="true" stored="true" multiValued="false" /> <field name="content" type="text_general" indexed="true" stored="true" multiValued="false" /> <field name="date" type="date" indexed="true" stored="true" multiValued="false" /> <field name="price" type="double" indexed="true" stored="true" multiValued="false" /> <field name="location" type="string" indexed="true" stored="true" multiValued="false" /> <field name="category" type="string" indexed="true" stored="true" multiValued="false" /> <field name="is_new" type="boolean" indexed="true" stored="true" multiValued="false" /> <dynamicField name="*_i" type="int" indexed="true" stored="true" multiValued="false" /> <dynamicField name="*_l" type="long" indexed="true" stored="true" multiValued="false" /> <dynamicField name="*_f" type="float" indexed="true" stored="true" multiValued="false" /> <dynamicField name="*_d" type="double" indexed="true" stored="true" multiValued="false" /> <dynamicField name="*_dt" type="date" indexed="true" stored="true" multiValued="false" /> </fields> <uniqueKey>id</uniqueKey> <defaultSearchField>content</defaultSearchField> <solrQueryParser defaultOperator="OR" /> </schema> ``` 其中,该模板定义了一些常用的字段类型,如string、text_general、date、int、long、float、double和boolean等。同时,该模板还定义了一些常用的字段,如id、title、content、date、price、location、category和is_new等,以及动态字段。你可以根据自己的需求进行相应的添加和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值