- 手动模式:之前几个章节已经阐述,完全通过手动修改schema.xml文件来修改。不支持运行时修改,需要修改后重新load core或者重启solr server。
- schema api模式:支持运行时修改
<!--solrconfig.xml中配置ManagedIndexSchemaFactory-->
<schemaFactory class="ManagedIndexSchemaFactory">
<bool name="mutable">true</bool>
<str name="managedSchemaResourceName">managed-schema</str>
</schemaFactory>
- mutable:控制是否允许运行时修改schema信息,如果你想要启用schema api,mutable必须设置为true,如果设置为false,即表示所致schema文件禁止修改
- managedSchemaResourceName:定义ManagedIndexSchemaFactory管理的schema配置文件名称,若不指定默认是managed-schema。若<schemaFactory/>没有在solrconfig.xml中显示指定,solr会隐式的使用ManagedIndexSchemaFactory。
I. Schema API入口点:
Schema API接口的baseURL:http://<host>:<port>/solr/<collection_name>
-
/schema
查询或更新schema信息,比如添加删除替换域、动态域、复制域、域类型。wt参数可以是json/xml/schema.xml
eg. GET http://localhost:8080/solr/gettingstarted/schema?wt=json -
/schema/fields
获取schema.xml中定义的所有域的信息或者回去指定域的信息。
- wt:string类型参数,响应结果输出格式,可选值json/xml
- fl:string类型参数,返回那些域的信息,多个域名称用逗号分隔
- includeDynamic:boolean类型参数,响应结果集里是否包含动态域
- showDefaults:boolean类型参数,响应是否包含域的默认属性信息
eg. GET http://localhost:8080/solr/gettingstarted/schema/fields
GET http://localhost:8080/solr/gettingstarted/schema/fields/fieldname
3)/schema/dynamicfields
获取schema.xml中定义的所有动态域的信息或者获取指定动态域的信息
- wt:string类型参数,响应结果输出格式,可选json/xml
- showDefaults:boolean类型参数,响应结果集里是否包含动态域的默认属性信息
eg. GET http://localhost:8080/solr/gettingstarted/schema/dynamicfields
GET http://localhost:8080/solr/gettingstarted/schema/dynamicfields/fieldname
4) /schema/fieldtypes
获取schema.xml中定义的所有域类型的信息或者获取指定域类型的信息
- wt:string类型参数,响应结果输出格式,可选json/xml
- showDefaults:boolean类型参数,响应结果集里是否包含动态域的默认属性
eg. GET http://localhost:8080/solr/gettingstarted/schema/fieldtypes
GET http://localhost:8080/solr/gettingstarted/schema/fieldtypes/fieldtypename
5)/schema/copyfields
获取schema.xml中定义的所有复制域信息
- wt:string类型参数,响应结果输出格式,可选json/xml
- source.fl:string类型参数,返回哪些source域的信息,多个域名称用逗号分隔
- dest.fl:string类型参数,返回哪些dest域的信息,多个域名称用逗号分隔
eg. GET http://localhost:8080/solr/gettingstarted/schema/copyfields
-
/schema/name
获取schema.xml中定义的name信息
eg. GET http://localhost:8080/solr/gettingstarted/schema/name -
/schema/version
获取schema.xml的版本号 -
/schema/uniquekey
获取schema.xml中定义的uniqueKey信息 -
/schema/solrquerypareser/defaultoperator
获取solrqueryparser的默认操作符
II.修改Schema接口
POST /collection/schema
1)add-field
添加一个域到schema配置文件中,如果域名称重复,则抛出异常。
{
"add-field":{
"name":"sell-by",
"type":"tdate",
"stored":true}
}
-
delete-field
删除一个域,如果该域不存在,或者该域是复制域的source域或dest域,则抛出异常。
{"delete-field":{"name":"sell-by"}} -
replace-field
使用新的配置替换一个已存在域的旧配置信息,如果该域不存在,则抛出异常。
{"replace-field":{
"name":"sell-by",
"type":"date",
"stored":false
}} -
add-dynamic-field
添加一个动态域到schema配置文件中,如果动态域名称重复,则抛出异常。
{
"add-dynamic-field":
{
"name":"*_s",
"type":"string",
"stored":true
}} -
delete-dynamic-field
删除一个动态域,如果该动态域不存在,或者该动态域是复制域的source或dest域,则抛出异常。
{"delete-dynamic-field":{"name":"*_s"}} -
replace-dynamic-field
使用新配置替换一个已存在的动态域的旧配置信息,如果该动态域不存在,则抛出异常。
{
"replace-dynamic-field":
{
"name":"*_s",
"type":"text_general",
"stored":false
}
} -
add-field-type
添加一个域类型到schema配置文件中,如果域类型名称重复了,则抛出异常。
{
"add-field-type": {
"name":"myNewTxtField",
"class":"solr.TextField",
"positionIncrementGap":"100",
"analyzer": {
"charFilters":[{
"class":"solr.PatternReplaceCharFilterFactory",
"replacement":"1",
"pattern":"([a-zA-Z])\\1+"}],
"tokenizer":{
"class":"solr.WhitespaceTokenizerFactory",
"filters":[{
"class":"solr.WordDelimierFilterFactory",
"preserveOriginal":"0"}]}}}} -
delete-field-type
删除一个域类型,如果该域类型不存在,或者存在任何普通域或者动态域引用了该域,则抛出异常。
{"delete-field-type":{"name":"myNewTxtField"}} -
replace-field-type
使用新的配置替换一个已存在域类型的旧配置信息,如果该域类型不存在,则抛出异常。
{
"replace-field-type":{
"name":"myNewTxtField",
"class":"solr.TextField",
"positionIncrementGap":"100",
"analyzer":{
"tokenizer":{
"class":"solr.StandardTikenizerFactory"}}}
} -
add-copy-field
添加一个复制域到schema配置文件中
{
"add-copy-field":{
"source":"shelf",
"dest":["location","catchall"].
"maxChars":"150"
}
} -
delete-copy-field
删除一个复制域,如果该复制域不存在,则抛出异常
{
"delete-copy-field":{"source":"shelf","dest":"location"}
}
当使用schema API修改schema信息是,solr core会自动重新加载以便schema信息的改变能立即应用于后续添加的文档,对schema修改前添加的文档无效,需要重新索引。
多个操作能够叠加使用,且具有原子性,其中一个执行失败整个操作集合失败,且应当注意顺序。
{
"add-field-type": {
"name":"myNewTxtField",
"class":"solr.TextField",
"positionIncrementGap":"100",
"analyzer": {
"charFilters":[{
"class":"solr.PatternReplaceCharFilterFactory",
"replacement":"1",
"pattern":"([a-zA-Z])\\1+"}],
"tokenizer":{
"class":"solr.WhitespaceTokenizerFactory",
"filters":[{
"class":"solr.WordDelimierFilterFactory",
"preserveOriginal":"0"}]}}},
"add-field":{
"name":"myNewTxtField",
"type":"tdate",
"stored":true}
}
同样的重复操作也可以有如下两种方式:
- (1)
{
"add-field":{
"name":"myNewTxtField",
"type":"tdate",
"stored":true},
"add-field":{
"name":"myNewTxtField2",
"type":"tdate",
"stored":true},
"add-field":{
"name":"myNewTxtField3",
"type":"tdate",
"stored":true}
}
- (2)
{
"add-field":[
{
"name":"myNewTxtField3",
"type":"tdate",
"stored":true
},"add-field":{
"name":"myNewTxtField2",
"type":"tdate",
"stored":true},
"add-field":{
"name":"myNewTxtField",
"type":"tdate",
"stored":true}
]
}
- 无schema模式
通过索引数据构造高效的schema,而不需要手动修改。
- 配置schemaless mode
<!--solrconfig.xml-->
<schemaFactory class="ManagedIndexSchemaFactory">
<bool name="mutable">true</bool>
<str name="managedSchemaResourceName">managed-schema.xml</str>
</schemaFactory>
- 配置UpdateRequestProcessorChain
<!--solrconfig.xml-->
<updateRequestProcessorChain name="add-unknown-fields-to-the-schema">
<processor class="solr.UUIDUpdateProcessorFactory"/>
<processor class="solr.LogUpdateProcessorFactory"/>
<processor class="solr.DistributedUpdateProcessorFactory"/>
<processor class="solr.RemoveBlankFieldUpdateProcessorFactory"/>
<processor class="solr.FieldNameMutatingUpdateProcessorFactory">
<!--若域名称里包含正则表达匹配的字符,那么就将其替换成replacment-->
<str name="pattern">[^\w-\.]</str>
<str name="replacement">_</str>
</processor>
<processor class="solr.ParseBooleanFieldUpdateProcessorFactory"/>
<processor class="solr.ParseLongFieldUpdateProcessorFactory"/>
<processor class="solr.ParseDoubleFieldUpdateProcessorFactory/"><processor class="solr.ParseDateFieldUpdateProcessorFactory">
<arr name="format">
<str>yyyy-MM-dd'T' HH:mm:ss.SSSZ</str>
<str>yyyy-MM-dd'T' HH:mm:ss,SSSZ</str>
<str>yyyy-MM-dd'T' HH:mm:ss.SSS</str>
<str>yyyy-MM-dd'T' HH:mm:ss,SSSZ</str>
<str>yyyy-MM-dd'T' HH:mm:ssZ</str>
<str>yyyy-MM-dd'T' HH:mm:ss</str>
<str>yyyy-MM-dd'T' HH:mmZ</str>
<str>yyyy-MM-dd'T' HH:mm</str>
<str>yyyy-MM-dd HH:mm:ss.SSSZ</str>
<str>yyyy-MM-dd HH:mm:ss,SSSZ</str>
<str>yyyy-MM-dd HH:mm:ss.SSS</str>
<str>yyyy-MM-dd HH:mm:ss,SSS</str>
<str>yyyy-MM-dd HH:mm:ssZ</str>
<str>yyyy-MM-dd HH:mm:ss</str>
<str>yyyy-MM-dd HH:mmZ</str>
<str>yyyy-MM-dd HH:mm</str>
<str>yyyy-MM-dd</str>
</arr>
</processor>
<processor class="solr.AddSchemaFieldsUpsateProcessorFactory">
<str name="defaultFieldType">strings</str>
<lst name="typeMapping">
<str name="valueClass">java.lang.Boolean</str>
<str name="fieldType">booleans</str>
</lst>
<lst name="typeMapping">
<str name="valueClass">java.util.Date</str>
<str name="fieldType">tdates</str>
</lst>
<lst name="typeMapping">
<str name="valueClass">java.lang.Long</str>
<str name="fieldType">tlongs</str>
</lst>
<lst name="typeMapping">
<str name="valueClass">java.lang.Number</str>
<str name="fieldType">tdoubles</str>
</lst>
</processor>
<process class="solr.RunUpdateProcessorFactory"/>
</updateRequestProcessorChain>
updateRequestProcessorChain允许solr去猜测域值的类型,需要预先定义默认的域类型,已经FieldType与Java数据类型之间的映射关系,即配置的ParseXXXFieldUpdateProcessorFactory的作用,然后自动添加域是AddSchemaFieldsUpdateProcessorFactory的作用。
-创建索引
URL: POST http://localhost:8080/solr/gettingstarted/update?commit=true
content-type:application/csv
//csv 数据
id,Artist,Album,Released,Rating,FromDistributor,Sold
44C,Old Shews,Mead for Walking,198800813,0.01,14,0
网友评论