天天看點

mysql索引和solr差別_Solr索引詳解

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的可選屬性說明

mysql索引和solr差別_Solr索引詳解

覆寫fieldType的可選屬性說明

FieldType(字段類型)詳解

定義在索引時該如何分詞、索引、存儲字段,在查詢時該如何對查詢串分詞。

#索引時

#查詢時

FieldType 的屬性說明

mysql索引和solr差別_Solr索引詳解

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

mysql索引和solr差別_Solr索引詳解

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