W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
這些 Solr 功能都是通過(guò) solrconfig.xml 方式控制的:
無(wú)架構(gòu)模式的三個(gè)特性是在 Solr 分配的 _default 配置集中預(yù)先配置的。要使用這些配置啟動(dòng) Solr 的示例實(shí)例,請(qǐng)運(yùn)行以下命令:
bin/solr start -e schemaless
這將啟動(dòng)一個(gè) Solr 的服務(wù)器,并自動(dòng)創(chuàng)建一個(gè)集合(名為 “gettingstarted 只包含三個(gè)初始架構(gòu)字段”):id、_version_ 和 _text_。
你可以使用 /schema/fields Schema API 來(lái)確認(rèn):curl http://localhost:8983/solr/gettingstarted/schema/fields 輸出:
{
"responseHeader":{
"status":0,
"QTime":1},
"fields":[{
"name":"_text_",
"type":"text_general",
"multiValued":true,
"indexed":true,
"stored":false},
{
"name":"_version_",
"type":"long",
"indexed":true,
"stored":true},
{
"name":"id",
"type":"string",
"multiValued":false,
"indexed":true,
"required":true,
"stored":true,
"uniqueKey":true}]}
如上所述,有三種配置元素需要在無(wú)架構(gòu)模式下使用 Solr。在 _defaultSolr 包含的配置集中,這些已經(jīng)配置好了。但是,如果您想自己實(shí)現(xiàn)無(wú)架構(gòu),則應(yīng)進(jìn)行以下更改。
如 SolrConfig 中的 Schema Factory Definition 一節(jié)所述,除非您的配置指定 ClassicIndexSchemaFactory 應(yīng)該使用 Managed Schema 支持,否則默認(rèn)情況下啟用 Managed Schema 支持。
您可以通過(guò)添加顯式 <schemaFactory/> (如下所示) 來(lái)配置 ManagedIndexSchemaFactory (并控制所使用的資源文件,或禁用將來(lái)的修改),請(qǐng)參閱 SolrConfig中的架構(gòu)工廠定義以獲取有關(guān)可用選項(xiàng)的更多詳細(xì)信息。
<schemaFactory class="ManagedIndexSchemaFactory">
<bool name="mutable">true</bool>
<str name="managedSchemaResourceName">managed-schema</str>
</schemaFactory>
在 Solr 中,UpdateRequestProcessorChain 定義了一系列插件,這些插件在索引之前或索引時(shí)應(yīng)用于文檔。
Solr 的無(wú)架構(gòu)模式的字段猜測(cè)方面使用專(zhuān)門(mén)定義的允許 Solr 猜測(cè)字段類(lèi)型的 UpdateRequestProcessorChain。您還可以定義要使用的默認(rèn)字段類(lèi)型類(lèi)。
首先,您應(yīng)該如下定義它(更新處理器工廠文檔,請(qǐng)參閱下面的 javadoc 鏈接):
<updateProcessor class="solr.UUIDUpdateProcessorFactory" name="uuid"/>
<updateProcessor class="solr.RemoveBlankFieldUpdateProcessorFactory" name="remove-blank"/>
<updateProcessor class="solr.FieldNameMutatingUpdateProcessorFactory" name="field-name-mutating"> 【1】
<str name="pattern">[^\w-\.]</str>
<str name="replacement">_</str>
</updateProcessor>
<updateProcessor class="solr.ParseBooleanFieldUpdateProcessorFactory" name="parse-boolean"/> 【2】
<updateProcessor class="solr.ParseLongFieldUpdateProcessorFactory" name="parse-long"/>
<updateProcessor class="solr.ParseDoubleFieldUpdateProcessorFactory" name="parse-double"/>
<updateProcessor class="solr.ParseDateFieldUpdateProcessorFactory" name="parse-date">
<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,SSS</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>
</updateProcessor>
<updateProcessor class="solr.AddSchemaFieldsUpdateProcessorFactory" name="add-schema-fields"> 【3】
<lst name="typeMapping">
<str name="valueClass">java.lang.String</str> 【4】
<str name="fieldType">text_general</str>
<lst name="copyField"> 【5】
<str name="dest">*_str</str>
<int name="maxChars">256</int>
</lst>
<!-- Use as default mapping instead of defaultFieldType -->
<bool name="default">true</bool>
</lst>
<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">pdates</str>
</lst>
<lst name="typeMapping">
<str name="valueClass">java.lang.Long</str> 【6】
<str name="valueClass">java.lang.Integer</str>
<str name="fieldType">plongs</str>
</lst>
<lst name="typeMapping">
<str name="valueClass">java.lang.Number</str>
<str name="fieldType">pdoubles</str>
</lst>
</updateProcessor>
<!-- The update.autoCreateFields property can be turned to false to disable schemaless mode -->
<updateRequestProcessorChain name="add-unknown-fields-to-the-schema" default="${update.autoCreateFields:true}"
processor="uuid,remove-blank,field-name-mutating,parse-boolean,parse-long,parse-double,parse-date,add-schema-fields"> 【7】
<processor class="solr.LogUpdateProcessorFactory"/>
<processor class="solr.DistributedUpdateProcessorFactory"/>
<processor class="solr.RunUpdateProcessorFactory"/>
</updateRequestProcessorChain>
這條鏈上定義了很多東西。我們來(lái)看看其中的一些:
<processor>
元素包括一個(gè)name
。這些名稱(chēng)將在本例末尾的最后一個(gè)鏈定義中使用。Long
或Integer
字段解析器中的任何一個(gè)識(shí)別出字段時(shí),它們應(yīng)該將它們的字段映射到 plongs 字段類(lèi)型。此鏈定義將為要從相應(yīng)的文本字段創(chuàng)建的字符串字段建立多個(gè)復(fù)制字段規(guī)則。如果您的數(shù)據(jù)導(dǎo)致您最終使用了大量的復(fù)制字段規(guī)則,則索引可能會(huì)明顯減慢,并且索引大小將會(huì)更大。為了控制這些問(wèn)題,建議您查看創(chuàng)建的復(fù)制字段規(guī)則,并刪除不需要的 faceting、排序、突出顯示等。
一旦定義了 UpdateRequestProcessorChain,你必須指示你的 UpdateRequestHandlers 在處理索引更新時(shí)使用它(即添加、刪除、替換文檔)。
有兩種方法可以做到這一點(diǎn)。上面顯示的更新鏈有一個(gè)、default=true、屬性,將用于任何更新處理程序。
另一種更明確的方法是使用 InitParams 來(lái)設(shè)置所有/update請(qǐng)求處理程序的默認(rèn)值:
<initParams path="/update/**">
<lst name="defaults">
<str name="update.chain">add-unknown-fields-to-the-schema</str>
</lst>
</initParams>
Tip:完成所有這些更改后,應(yīng)重新啟動(dòng) Solr 或重新加載內(nèi)核。
使用 update.autoCreateFields 屬性可以禁用自動(dòng)字段創(chuàng)建。要做到這一點(diǎn),您可以使用 Config API 和命令,例如:
curl http://host:8983/solr/mycollection/config -d '{"set-user-property": {"update.autoCreateFields":"false"}}'
一旦啟用了無(wú)架構(gòu)模式(無(wú)論是手動(dòng)配置模式還是使用 _defaultconfigset),包含未在架構(gòu)中定義的字段的文檔將使用自動(dòng)添加到架構(gòu)的猜測(cè)字段類(lèi)型進(jìn)行索引。
例如,添加一個(gè) CSV 文檔會(huì)導(dǎo)致未知的字段被添加,字段類(lèi)型基于值:
curl "http://localhost:8983/solr/gettingstarted/update?commit=true" -H "Content-type:application/csv" -d '
id,Artist,Album,Released,Rating,FromDistributor,Sold
44C,Old Shews,Mead for Walking,1988-08-13,0.01,14,0'
輸出指示成功:
<response>
<lst name="responseHeader"><int name="status">0</int><int name="QTime">106</int></lst>
</response>
架構(gòu)中的字段(輸出自:curl http://localhost:8983/solr/gettingstarted/schema/fields):
{
"responseHeader":{
"status":0,
"QTime":2},
"fields":[{
"name":"Album",
"type":"text_general"},
{
"name":"Artist",
"type":"text_general"},
{
"name":"FromDistributor",
"type":"plongs"},
{
"name":"Rating",
"type":"pdoubles"},
{
"name":"Released",
"type":"pdates"},
{
"name":"Sold",
"type":"plongs"},
{
"name":"_root_", ...},
{
"name":"_text_", ...},
{
"name":"_version_", ...},
{
"name":"id", ...}
]}
另外字符串版本的文本字段被索引,使用 copyFields 到 *_str 動(dòng)態(tài)字段:(輸出:curl http://localhost:8983/solr/gettingstarted/schema/copyfields):
{
"responseHeader":{
"status":0,
"QTime":0},
"copyFields":[{
"source":"Artist",
"dest":"Artist_str",
"maxChars":256},
{
"source":"Album",
"dest":"Album_str",
"maxChars":256}]}
您仍然可以顯式:即使您希望對(duì)大多數(shù)字段使用無(wú)架構(gòu)模式,您仍然可以使用架構(gòu) API 在索引使用它們的文檔之前先用創(chuàng)建的類(lèi)型先行創(chuàng)建一些字段。
在內(nèi)部,架構(gòu) API 和架構(gòu)更新處理器都使用相同的托管架構(gòu)功能。
此外,如果不需要文本字段的 * _str 版本,則可以從自動(dòng)生成的架構(gòu)中刪除 copyField 定義,并且由于現(xiàn)在定義了原始字段,因此不會(huì)重新添加。
curl "http://localhost:8983/solr/gettingstarted/update?commit=true" -H "Content-type:application/csv" -d '
id,Description,Sold
19F,Cassettes by the pound,4.93'
此文檔將失敗,如以下輸出所示:
<response>
<lst name="responseHeader">
<int name="status">400</int>
<int name="QTime">7</int>
</lst>
<lst name="error">
<str name="msg">ERROR: [doc=19F] Error adding field 'Sold'='4.93' msg=For input string: "4.93"</str>
<int name="code">400</int>
</lst>
</response>
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: