1、Schema介紹
schema 是什麼?
Schema:模式,是集合/核心中字段的定義,讓solr知道集合/核心包含哪些字段、字段的資料類型、字段該索引的存儲。
schema 的定義方式
solr中提供了兩種方式來配置schema,兩者隻能選其一:
預設方式,通過Schema API 來實作配置,模式資訊存儲在 核心目錄的conf/managed-schema檔案中。
傳統的手工編輯 conf/schema.xml的方式,編輯完後需要重載集合/核心才會生效。
schema 兩種配置方式切換
schema.xml 到 managed schema
隻需要将 solrconfig.xml 中的
去掉,或改為 ManagedIndexSchemaFactory。
solr重新開機時,他發現存儲 schema.xml 但不存儲在 managed-schema,他會備份 schema.xml,然後改寫 schema.xml 為 managed-schema。此後既可以通過schema API 管理schema了。
managed schema 到 schema.xml
将 managed schema 重命名為 schema.xml
将 solrconfig.xml 中 schemaFactory 的 ManagedIndexSchemaFactory 去掉(如果存在)
增加
solr還支援無模式方式,solr會猜測該如何索引字段,不可用在生産環境下。
managed-schema檔案構成
#字段
#動态字段
id #唯一key的指定
#拷貝字段
#字段存儲類型
2、字段定義詳解
字段定義示例
字段屬性說明
name:字段名,必需。字段名可以由字母、數字、下劃線構成,不能以數字開頭。以下劃線開頭和結尾的名字為保留字段名,如 version
type:字段的 fieldType名,必需。為 FieldType 定義的name屬性值。
default:預設值,如果送出的文檔中沒有該字段值,則自動會為文檔添加這個預設值。非必需(indexed,stored,termVectors等屬性)。
字段中用于覆寫fieldType的可選屬性說明
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIhJmZxIGO4UjZ2EWNvwFcvwVbvNmL1h2cuFWaq5yd3d3Lc9CX6MHc0RHaiojIsJye.jpg)
覆寫fieldType的可選屬性說明
FieldType(字段類型)詳解
定義在索引時該如何分詞、索引、存儲字段,在查詢時該如何對查詢串分詞。
#索引時
#查詢時
FieldType 的屬性說明
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIhJmZxIGO4UjZ2EWNvwFcvwVbvNmL1h2cuFWaq5yd3d3Lc9CX6MHc0RHaiojIsJye.jpg)
FieldType 的屬性說明
solr中提供的FieldType 類(class屬性),在org.apache.solr.schema 包下
FieldType 的 Analyzer
對于 solr.TextField or solr.SorttableTextField 字段類型,需要為其定義分析器。
#分析器
可以直接通過class屬性指定分析器類,必須繼承
org.apache.lucene.analysis.Analyzer
也可靈活地組合分詞器、過濾器:
#分詞器
#過濾器
org.apache.solr.analysis 包下的類可以簡寫為 solr.xxx
如果該類型字段索引、查詢時需要使用不同的分析器,則需區配置設定置analyzer
#索引
#查詢
常用Filter
Stop Filter 停用此過濾器
#停用詞過濾器
words屬性指定停用詞檔案的絕對路徑或相對 conf/ 目錄的相對路徑
停用詞定義文法:一行一個
Synonym Graph Filter 同義詞過濾器
#同義詞過濾器
#同義詞過濾器
同義詞定義文法:一類一行,=>表示标準化為後面的。
couch,sofa,divan
teh => the
huge,ginormous,humungous => large
small => tiny,teeny,weeny
內建IKAnalyzer 中文分詞器
1、在原來學習lucene內建IKAnalyzer的基礎上,為IkAnalyzer實作一個TokenizerFactory(繼承它),接收useSmart參數。
2、将這三個類打成jar,如 IKAnalyzer-lucene7.3.jar
3、将這個jar和 IKAnalyzer的jar 拷貝到web應用的lib目錄下
4、将三個配置檔案拷貝到應用(WEB_INF下)的classes目錄下
5、在schema中定義一個FieldType,使用IKAnalyzer适配類
時間字段類型特别說明
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 *] #不需要轉義
DateRangField 時間段類型特别說明
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(含)前.
時間數學表達式
Solr中還支援用 NOW +- 時間的數學表達式來靈活表示時間。
文法: NOW +- 帶機關的時間數,/ 機關 截斷。可用來表示時間段。
NOW+2MONTHS # + 兩個月
NOW-1DAY # + 一天
NOW/HOUR # 目前時間截斷到小時
NOW+6MONTHS+3DAYS/DAY # 目前時間 + 六個月 + 三天 截斷到到天
1972-05-20T17:33:18.772Z+6MONTHS+3DAYS/DAY
NOW在查詢中使用時,可為NOW指定值。
例如:
q=solr&fq=start_date:[* TO NOW]&NOW=1384387200000
沒有加粗的部分系統預設NOW為系統時間,有加粗的部分NOW就為1384387200000
注意:大括号 {} 不包含邊界時間,中括号 [] 包含邊界時間
EnumFieldType 枚舉字段類别說明
EnumFieldType 用于字段值是一個枚舉集,且排序順序可預訂的情況,如新聞分類這樣的字段,定義非常簡單:
enumsConfig:指定枚舉值的配置檔案,絕對路徑或相對 核心 conf/ 的相對路徑
enumName:指定配置檔案的枚舉名。排序順序是按配置的排序。
docValues:枚舉類型字段必須設定 true。
枚舉xml配置檔案
Not Available
Low
Medium
High
Urgent
Unknown
Very Low
Low
Medium
High
Critical
# 建立一個新聞類别的枚舉字段類别,枚舉值:時事、财經、科技、體育、娛樂、教育、汽車
時事
财經
科技
體育
娛樂
教育
汽車
fileType調用新聞類枚舉值:
dynamic Field 動态字段
問: 如果模式中有近百個字段需要定義,其中有很多字段的定義是相同,重複定義是不是很煩?
可不可以定一個規則,字段名以某字首開頭或結尾的是相同的定義配置,那這些重複的字段就隻需要配置一個,保證送出的字段名稱遵守這個字首、字尾即可。這就是動态字段。
如:整型字段都是一樣的定義,則可以定義一個動态字段如下:
#也可以是字首,如:name="i_*"
CopyField 複制字段
複制字段允許将 一個或多個 字段的值填充到一個字段中。它的用途有兩種:
1、将多個字段内容填充到一個字段,來進行搜尋
2、對同一個字段内容進行不同的分詞過濾,建立一個新的可搜尋字段
定義方式:
1、先定義一個普通字段
2、定義複制字段
複制字段時,source 可以是動态字段。
uniqueKey 唯一鍵
指定用作唯一的字段,非必需。在删除文檔的時候可以通過唯一鍵删除。
#業務id
id
唯一鍵字段不可以是保留字段、複制字段,且不能分詞。
Similarity 相關性計算類配置
如果預設的相關性計算模型 BM25Similarity 不滿足你應用的特殊需求,你可在schema中指定全局的字段類型局部相關性計算類。
text_dfr
I(F)
B
H3
900
3、Schema API介紹
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIhJmZxIGO4UjZ2EWNvwFcvwVbvNmL1h2cuFWaq5yd3d3Lc9CX6MHc0RHaiojIsJye.jpg)
Schema API
Schema 操作API總體介紹
Solr中強烈推薦使用 Schema API 來* 管理集合/核心* 的模式資訊,可以 讀、寫 模式資訊。通過API來更新模式資訊,solr将 自動重載核心 。但是請注意:模式修改并不會自動重新索引已索引的文檔,隻會對後續的文檔起作用,如果必要,你需要手動重新索引(删除原來的,重新送出文檔)
更新 Schema
發送 post 請求 /collection/schema(/集合或核心的名字/schema),以JSON格式送出資料,在json中說明你要進行的更新操作及對應的資料(一次請求可進行多個操作)。
更新操作定義
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: 删除一個複制字段規則.
V1、V2 兩個版本API說明
V1老版本的api,V2新版本的API,目前兩個版本的API都支援,将來會統一到新版本。兩個版本的API隻是請求位址上的差別,參數沒差別。
V1:
http://localhost:8983/solr/gettingstarted/schema
V2: http://localhost:8983/api/cores/gettingstarted/schema
FieldType 字段類别操作
添加一個字段類别 add-field-type
一個Analyzer
#linux 中請求方式
curl -X POST -H 'Content-type:application/json' --data-binary '{
"add-field-type" : {
"name":"myNewTxtField",
"class":"solr.TextField",
"positionIncrementGap":"100", ##避免臨近查詢,跨度查詢出錯的
"analyzer" : {
"tokenizer":{
"class":"solr.WhitespaceTokenizerFactory" },
"filters":[{
"class":"solr.WordDelimiterFilterFactory",
"preserveOriginal":"0" }]}}
}' http://localhost:8983/solr/gettingstarted/schema
兩個Analyzer
curl -X POST -H 'Content-type:application/json' --data-binary '{
"add-field-type":{
"name":"myNewTextField",
"class":"solr.TextField",
"indexAnalyzer":{
"tokenizer":{
"class":"solr.PathHierarchyTokenizerFactory",
"delimiter":"/" }},
"queryAnalyzer":{
"tokenizer":{
"class":"solr.KeywordTokenizerFactory" }}}
}' http://localhost:8983/api/cores/gettingstarted/schema
删除一個字段類别 delete-field-type
curl -X POST -H 'Content-type:application/json' --data-binary '{
"delete-field-type":{ "name":"myNewTxtField" }
}' http://localhost:8983/api/cores/gettingstarted/schema
替換一個字段類别 replace-field-type
curl -X POST -H 'Content-type:application/json' --data-binary '{
"replace-field-type":{
"name":"myNewTxtField", #根據名稱來進行替換
"class":"solr.TextField",
"positionIncrementGap":"100",
"analyzer":{
"tokenizer":{
"class":"solr.StandardTokenizerFactory" }}}
}' http://localhost:8983/api/cores/gettingstarted/schema
Field 字段操作
添加一個字段 add-field
curl -X POST -H 'Content-type:application/json' --data-binary '{
"add-field":{
"name":"sell_by",
"type":"pdate",
"stored":true }
}' http://localhost:8983/api/cores/gettingstarted/schema
删除一個字段 delete-field
curl -X POST -H 'Content-type:application/json' --data-binary '{
"delete-field" : { "name":"sell_by" }
}' http://localhost:8983/api/cores/gettingstarted/schema
替換一個字段 replace-field
curl -X POST -H 'Content-type:application/json' --data-binary '{
"replace-field":{
"name":"sell_by",
"type":"date",
"stored":false }
}' http://localhost:8983/api/cores/gettingstarted/schema
dynamicField 動态字段操作
添加一個動态字段 add-dynamic-field
curl -X POST -H 'Content-type:application/json' --data-binary '{
"add-dynamic-field":{
"name":"*_s",
"type":"string",
"stored":true }
}' http://localhost:8983/api/cores/gettingstarted/schema
删除一個動态字段 delete-dynamic-field
curl -X POST -H 'Content-type:application/json' --data-binary '{
"delete-dynamic-field":{ "name":"*_s" }
}' http://localhost:8983/api/cores/gettingstarted/schema
替換一個動态字段 replace-dynamic-field
curl -X POST -H 'Content-type:application/json' --data-binary '{
"replace-dynamic-field":{
"name":"*_s",
"type":"text_general",
"stored":false }
}' http://localhost:8983/solr/gettingstarted/schema
copyField 複制字段操作
添加複制字段 add-copy-field
curl -X POST -H 'Content-type:application/json' --data-binary '{
"add-copy-field":{
"source":"shelf",
"dest":[ "location", "catchall" ]}
}' http://localhost:8983/api/cores/gettingstarted/schema
删除複制字段 delete-copy-field
curl -X POST -H 'Content-type:application/json' --data-binary '{
"delete-copy-field":{ "source":"shelf", "dest":"location" }
}' http://localhost:8983/api/cores/gettingstarted/schema
一次請求多個操作示例
示例一
curl -X POST -H 'Content-type:application/json' --data-binary '{
"add-field-type":{ #1
"name":"myNewTxtField",
"class":"solr.TextField",
"positionIncrementGap":"100",
"analyzer":{"tokenizer":{
"class":"solr.WhitespaceTokenizerFactory" },
"filters":[{
"class":"solr.WordDelimiterFilterFactory",
"preserveOriginal":"0" }]}},
"add-field" : { #2
"name":"sell_by",
"type":"myNewTxtField",
"stored":true }
}' http://localhost:8983/solr/gettingstarted/schema
示例二
curl -X POST -H 'Content-type:application/json' --data-binary '{
"add-field":[
{ "name":"shelf", #1
"type":"myNewTxtField",
"stored":true },
{ "name":"location", #2
"type":"myNewTxtField",
"stored":true }]
}' http://localhost:8983/solr/gettingstarted/schema
擷取schema資訊
擷取整個schema
GET /collection/schema
#GET /集合或者核心名稱/schema
可以通過 wt 請求參數指定傳回的格式:json,xml,schema.xml
http://localhost:8983/api/cores/mycore/schema?wt=xml
擷取字段
GET /collection/schema/fields
GET /collection/schema/fields/fieldname
請求參數
wt:json/xml
fl:指定需要傳回的字段名,以逗号或空格間隔
showDefaults:true/false ,是否傳回字段的預設屬性
includeDynamic:true/false,在path中帶有fieldname 或指定了 fl的情況下才有用。
擷取動态字段
GET /collection/schema/dynamicfields
GET /collection/schema/dynamicfields/name
可用請求參數:wt、showDefaults
http://localhost:8983/api/cores/mycore/schema/dynamicfields?wt=xml
擷取字段類别
GET /collection/schema/fieldtypes
GET /collection/schema/fieldtypes/name
可用請求參數:wt、showDefaults
http://localhost:8983/api/cores/mycore/schema/fieldtypes?wt=xml
擷取複制字段
GET /collection/schema/copyfields
可用請求參數:wt、source.fl、dest.fl
擷取其他資訊
GET /collection/schema/name 擷取schema的name
GET /collection/schema/version 擷取schema的版本
GET /collection/schema/uniquekey 擷取唯一鍵字段
GET /collection/schema/similarity 擷取全局相關性計算類
可用請求參數:wt