目录
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"/>
定义内核中的字段,简单来说就相当于数据库表中的字段。下表为标签内的属性。
Property | Description | 可选值 | 默认值 |
indexed | 是否索引 | true or false | TRUE |
stored | 是否存储 | true or false | TRUE |
docValues | 是否为该字段创建字段的列式存储(docValues) | true or false | FALSE |
sortMissingFirst sortMissingLast | 根据该字段排序时,没有该字段值的文档是排在前面还是后面 | true or false | FALSE |
multiValued | 字段是否是多值的 | true or false | FALSE |
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 false | FALSE |
required | 字段是否必需 | true or false | FALSE |
useDocValuesAsStored | 如果字段设置了存储docValues,而字段的stored=false,可以设置该属性为true,从而可以在搜索结果中返回该字段的值(从docValues中取值) 。 | true or false | TRUE |
large | 标识该字段的值是大尺寸的,从而对该字段值进行懒加载,只有值 < 512KB 的才会被缓存。 这个属性要求 stored="true" and multiValued="false". 主要作用就是不在内存中缓存大字段。 | true or false | FALSE |
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的属性说明 | |||
Property | Description | 可选值 | 默认值 |
name | 字段类型名,用于Field定义中type属性引用 | ||
class | 存放该类型的值来进行索引的字段类名(同lucene中Field的子类)。注意,应以 solr.为前缀,这样solr就可以很快定位到该到哪个包中去查找类,如 solr.TextField 。 如果使用的是第三方包的类,则需要用全限定名。solr.TextField 的全限定名为:org.apache.solr.schema.TextField | ||
positionIncrementGap | 用于多值字段,定义多值间的间隔,来阻止假的短语匹配 | ||
autoGeneratePhraseQueries | 用于文本字段,如果设为true,solr会自动对该字段的查询生成短语查询,即使搜索文本没带“”。 | true/false | FALSE |
synonymQueryStyle | 同义词查询分值计算方式 | as_same_term、pick_best 、as_distinct_terms | as_same_term |
enableGraphQueries | 是否支持图表查询 | true/false | TRUE |
docValuesFormat | docValues字段的存储格式化器:schema-aware codec,配置在solrconfig.xml中的 | ||
postingsFormat | 词条格式器:schema-aware codec,配置在solrconfig.xml中的 | ||
indexed | 是否索引 | true or false | TRUE |
stored | 是否存储 | true or false | TRUE |
docValues | 是否为该字段创建字段的列式存储(docValues) | true or false | FALSE |
sortMissingFirst sortMissingLast | 根据该字段排序时,没有该字段值的文档是排在前面还是后面 | true or false | FALSE |
multiValued | 字段是否是多值的 | true or false | FALSE |
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 false | FALSE |
required | 字段是否必需 | true or false | FALSE |
useDocValuesAsStored | 如果字段设置了存储docValues,而字段的stored=false,可以设置该属性为true,从而可以在搜索结果中返回该字段的值(从docValues中取值) 。 | true or false | TRUE |
large | 标识该字段的值是大尺寸的,从而对该字段值进行懒加载,只有值 < 512KB 的才会被缓存。 这个属性要求 stored="true" and multiValued="false". 主要作用就是不在内存中缓存大字段。 | true or false | FALSE |
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中提供的 fiter:http://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 | 删除一个复制字段规则. |