solr索引详解

目录

Schema

managed-schema 文件详解

uniqueKey 唯一键

字段标签说明

FieldType

 FieldType 的 Analyzer

常用的Filter

schema API


Schema

   schema是集合/内核中字段的定义,让solr知道集合/内核包含哪些字段、字段的数据类型、字段该索引存储Solr中提供了两种方式来配置schema,两者只能选其一。

     1. 通过Schema API 来实时配置,模式信息存储在 内核目录的conf/managed-schema文件中。是solr的默认方式。

     2.传统的手工编辑conf/schema.xml的方式,编辑完后需重载集合/内核才会生效。(不推荐,下文将不再介绍)

     3.无schema, solr会猜测该如何索引字段 (不可用在生成环境下,下文不再介绍)

 

managed-schema 文件详解

   文件构成

<?xml version="1.0" encoding="UTF-8" ?>
<schema version="1.6">
	<field .../>  
	<dynamicField .../>
	<uniqueKey>id</uniqueKey>
	<copyField .../>
	<fieldType ...>
		<analyzer type="index">
			<tokenizer .../>
			<filter ... />
		</analyzer>
		<analyzer type="query">
			<tokenizer.../>
			<filter ... />
		</analyzer>
	</fieldType>
</schema>

 

uniqueKey 唯一键

唯一键字段不可以是保留字段、复制字段,且不能分词

<uniqueKey>id</uniqueKey>

字段标签说明

       <field name="name" type="text_general" indexed="true" stored="true"/>

      定义内核中的字段,简单来说就相当于数据库表中的字段。下表为标签内的属性。

PropertyDescription可选值默认值
indexed是否索引true or falseTRUE
stored是否存储true or falseTRUE
docValues是否为该字段创建字段的列式存储(docValues)true or falseFALSE
sortMissingFirst sortMissingLast根据该字段排序时,没有该字段值的文档是排在前面还是后面true or falseFALSE
multiValued字段是否是多值的true or falseFALSE
omitNorms是否忽略标准化。对于所有 primitive (non-analyzed) field types, such as int, float, data, bool, and string,默认是true. Only full-text fields or fields need norms.true or false*
omitTermFreqAndPositions是否忽略词项的词频和位置true or false*
omitPositions忽略词项的位置信息true or false*
termVectors termPositions termOffsets termPayloads词项向量的存储true or falseFALSE
required字段是否必需true or falseFALSE
useDocValuesAsStored如果字段设置了存储docValues,而字段的stored=false,可以设置该属性为true,从而可以在搜索结果中返回该字段的值(从docValues中取值) 。true or falseTRUE
large标识该字段的值是大尺寸的,从而对该字段值进行懒加载,只有值 < 512KB 的才会被缓存。 这个属性要求 stored="true" and multiValued="false". 主要作用就是不在内存中缓存大字段。true or falseFALSE

 

FieldType

定义在索引时该如何分词、索引、存储字段,在查询时该如何对查询串分词

<fieldType name="managed_en" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
	<tokenizer class="solr.StandardTokenizerFactory"/>
	<filter class="solr.ManagedStopFilterFactory" managed="english" />
	<filter class="solr.ManagedSynonymGraphFilterFactory" managed="english" />
	<filter class="solr.FlattenGraphFilterFactory"/>
  </analyzer>
  <analyzer type="query">
	<tokenizer class="solr.StandardTokenizerFactory"/>
	<filter class="solr.ManagedStopFilterFactory" managed="english" />
	<filter class="solr.ManagedSynonymGraphFilterFactory" managed="english" />
  </analyzer>
</fieldType>
FieldType的属性说明
PropertyDescription可选值默认值
name字段类型名,用于Field定义中type属性引用  
class存放该类型的值来进行索引的字段类名(同lucene中Field的子类)。注意,应以 solr.为前缀,这样solr就可以很快定位到该到哪个包中去查找类,如 solr.TextField 。
如果使用的是第三方包的类,则需要用全限定名。solr.TextField 的全限定名为:org.apache.solr.schema.TextField
  
positionIncrementGap用于多值字段,定义多值间的间隔,来阻止假的短语匹配  
autoGeneratePhraseQueries用于文本字段,如果设为true,solr会自动对该字段的查询生成短语查询,即使搜索文本没带“”。true/falseFALSE
synonymQueryStyle同义词查询分值计算方式as_same_term、pick_best 、as_distinct_terms as_same_term 
enableGraphQueries是否支持图表查询true/falseTRUE
docValuesFormatdocValues字段的存储格式化器:schema-aware codec,配置在solrconfig.xml中的  
postingsFormat词条格式器:schema-aware codec,配置在solrconfig.xml中的  
    
indexed是否索引true or falseTRUE
stored是否存储true or falseTRUE
docValues是否为该字段创建字段的列式存储(docValues)true or falseFALSE
sortMissingFirst sortMissingLast根据该字段排序时,没有该字段值的文档是排在前面还是后面true or falseFALSE
multiValued字段是否是多值的true or falseFALSE
omitNorms是否忽略标准化。对于所有 primitive (non-analyzed) field types, such as int, float, data, bool, and string,默认是true. Only full-text fields or fields need norms.true or false*
omitTermFreqAndPositions是否忽略词项的词频和位置true or false*
omitPositions忽略词项的位置信息true or false*
termVectors termPositions termOffsets termPayloads词项向量的存储true or falseFALSE
required字段是否必需true or falseFALSE
useDocValuesAsStored如果字段设置了存储docValues,而字段的stored=false,可以设置该属性为true,从而可以在搜索结果中返回该字段的值(从docValues中取值) 。true or falseTRUE
large标识该字段的值是大尺寸的,从而对该字段值进行懒加载,只有值 < 512KB 的才会被缓存。 这个属性要求 stored="true" and multiValued="false". 主要作用就是不在内存中缓存大字段。true or falseFALSE

 

 FieldType Analyzer

对于 solr.TextField or solr.SortableTextField 字段类型,需要为其定义分析器

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

如果该类型字段索引、查询时需要使用不同的分析器,则需区分配置analyzer

<fieldType name="nametext" class="solr.TextField">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.KeepWordFilterFactory" words="keepwords.txt"/>
    <filter class="solr.SynonymFilterFactory" synonyms="syns.txt"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

Solr中提供的tokenizer: http://lucene.apache.org/solr/guide/7_3/tokenizers.html

Solr中提供的 fiterhttp://lucene.apache.org/solr/guide/7_3/filter-descriptions.html

 

常用的Filter

Stop Filter   停用词过滤器

<analyzer>
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.StopFilterFactory" words="stopwords.txt"/>
</analyzer>

words属性指定停用词文件的绝对路径或相对 conf/目录的相对路径,停用词定义语法:一行一个

 

Synonym Graph Filter   同义词过滤器

<analyzer type="index">
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.SynonymGraphFilterFactory" synonyms="mysynonyms.txt"/>
  <filter class="solr.FlattenGraphFilterFactory"/> <!-- required on index analyzers after graph filters -->
</analyzer>
<analyzer type="query">
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.SynonymGraphFilterFactory" synonyms="mysynonyms.txt"/>
</analyzer>

同义词定义语法:一类一行, =>表示标准化为后面的

couch,sofa,divan

teh => the

huge,ginormous,humungous => large

small => tiny,teeny,weeny

 

时间字段类型

Solr中提供的时间字段类型( DatePointField, DateRangeField,废除的TrieDateField )是以时间毫秒数来存储时间的。要求字段值以ISO-8601标准格式来表示时间:YYYY-MM-DDThh:mm:ssZ

Z表示是UTC时间(注意:就没有时区了)。1999-05-20T17:33:18Z

秒上可以带小数来表示毫秒,超出精度部分会被忽略:

1972-05-20T17:33:18.772Z

1972-05-20T17:33:18.77Z

1972-05-20T17:33:18.7Z

 公元前:在前面加减号 -

9999后,在前面加加号 +

注意:查询时如果是直接的时间串,需要用转移符转义:

datefield:1972-05-20T17\:33\:18.772Z

datefield:"1972-05-20T17:33:18.772Z"

datefield:[1972-05-20T17:33:18.772Z TO *]

 

DateRangeField 时间段类型

     DateRangeField用来支持对时间段数据的索引,它遵守上一页讲到的时间格式,支持两种时间段表示方式:

方式一:截断日期,它表示整个日期跨度的精确指示。

方式二:范围语法 [ TO ]   { TO }

2000-11        表示2000年11月整个月.

2000-11T13      表示200年11月每天的13点这一个小时

-0009           公元前10年,0000是公元前1年。

[2000-11-01 TO 2014-12-01]   日到日

[2014 TO 2014-12-01]   2014年开始到2014-12-01止.

[* TO 2014-12-01]   2014-12-01(含)前.

 

EnumFieldType 枚举字段

     EnumFieldType  用于字段值是一个枚举集,且排序顺序可预定的情况,如新闻分类这样的字段。定义非常简单:

<fieldType name="priorityLevel" class="solr.EnumFieldType"
    docValues="true" enumsConfig="enumsConfig.xml" enumName="priority"/>

enumsConfig:指定枚举值的配置文件,绝对路径或相对 内核conf/的相对路径

enumName:指定配置文件的枚举名。排序顺序是按配置的顺序。

docValues : 枚举类型字段必须设置 true;

  枚举配置示例

<?xml version="1.0" ?>
<enumsConfig>
  <enum name="priority">
    <value>Not Available</value>
    <value>Low</value>
    <value>Medium</value>
    <value>High</value>
    <value>Urgent</value>
  </enum>
  <enum name="risk">
    <value>Unknown</value>
    <value>Very Low</value>
    <value>Low</value>
    <value>Medium</value>
    <value>High</value>
    <value>Critical</value>
  </enum>
</enumsConfig>

 

dynamic Field  动态字段

   如果模式中有近百个字段需要定义,其中有很多字段的定义是相同,重复地定义是不是很烦?

可不可以定一个规则,字段名以某前缀开头或结尾的是相同的定义配置,那这些重复字段就只需要配置一个,保证提交的字段名称遵守这个前缀、后缀即可。

这就是动态字段

如:整型字段都是一样的定义,则可以定义一个动态字段如下:

<dynamicField name="*_i" type=“my_int" indexed="true" stored="true"/>
<dynamicField name="i_*" type=“my_int" indexed="true" stored="true"/>

CopyField

复制字段允许将一个或多个字段的值填充到一个字段中。它的用途有两种:

1、将多个字段内容填充到一个字段,来进行搜索

2、对同一个字段内容进行不同的分词过滤,创建一个新的可搜索字段

定义方式:

1、先定义一个普通字段

<field name="cc_all" type="zh_CN_text" indexed="true" stored="false" multiValued="false" />

2、定义复制字段

<copyField source="cat" dest="cc_all"/>
<copyField source="name" dest="cc_all"/>

 

schema API

   Solr中强烈推荐使用Schema API来管理集合/内核的模式信息,可以读、写模式信息。通过API来更新模式信息,solr将自动重载内核。但是请注意:模式修改并不会自动重索引已索引的文档,只会对后续的文档起作用,如果必要,你需要手动重索引(删除原来的,重新提交文档)

  发送 post请求到 /collection/schema  ,以JSON格式提交数据,在json中说明你要进行的更新操作及对应的数据(一次请求可进行多个操作),

 

URL:{IP}/api/cores/chiyfcore/schema
{
    "add-field-type": {
        "name": "myNewTxtField",
        "class": "solr.TextField",
        "positionIncrementGap": "100",
        "analyzer": {
            "tokenizer": {
                "class": "solr.WhitespaceTokenizerFactory"
            },
            "filters": [
                {
                    "class": "solr.WordDelimiterFilterFactory",
                    "preserveOriginal": "0"
                }
            ]
        }
    },
    "add-field": {
        "name": "sell_by",
        "type": "myNewTxtField",
        "stored": true
    }
}

 

add-field 添加一个新字段.
delete-field 删除一个字段.
replace-field 替换一个字段,修改.
add-dynamic-field 添加一个新动态字段.
delete-dynamic-field 删除一个动态字段
replace-dynamic-field 替换一个已存在的动态字段
add-field-type 添加一个fieldType.
delete-field-type 删除一个fieldType.
replace-field-type 更新一个存在的fieldType
add-copy-field 添加一个复制字段规则.
delete-copy-field 删除一个复制字段规则.

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值