W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
Solr托管資源公開了一個REST API端點(diǎn),用于在Solr對象上執(zhí)行Create-Read-Update-Delete(CRUD)操作。
具有配置設(shè)置或數(shù)據(jù)的任何長期存在的Solr對象都是被管理資源的好候選。托管資源是對Solr中其他可編程管理的組件的補(bǔ)充,例如用于將字段添加到托管模式的RESTful模式API。
請考慮一個基于web的用戶界面,該UI提供"Solr"服務(wù),用戶需要配置一組停用詞和同義詞映射作為其搜索應(yīng)用程序的初始設(shè)置過程的一部分。使用Solr提供的托管停止過濾器和托管的同義詞圖過濾器工廠,可以通過托管資源REST API輕松地支持此類用例。
用戶也可以編寫自己的自定義插件,利用相同的內(nèi)部鉤子來管理額外的資源REST。
本節(jié)中的所有示例都假設(shè)您正在運(yùn)行“techproducts”Solr示例:
bin/solr -e techproducts
我們通過查看Solr提供的幾個示例來開始學(xué)習(xí)托管資源,以使用REST API管理停用詞和同義詞的示例。閱讀本節(jié)后,您將準(zhǔn)備好深入了解如何在Solr中實(shí)施托管資源的細(xì)節(jié),以便您可以開始構(gòu)建自己的實(shí)施。
首先,您需要定義一個使用ManagedStopFilterFactory的字段類型,例如:
<fieldType name="managed_en" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.ManagedStopFilterFactory"
managed="english" />
</analyzer>
</fieldType>
關(guān)于這個字段類型的定義,有兩個重要的事情要注意:
managed=”english”
屬性給出了一組管理停用詞的名稱,在這種情況下表示停用詞是英文文本。用于管理 techproducts 集合中英文stop詞的REST端點(diǎn)是:
/solr/techproducts/schema/analysis/stopwords/english。
示例資源路徑應(yīng)該大多是不言自明的。應(yīng)該注意的是,ManagedStopFilterFactory實(shí)現(xiàn)確定了/schema/analysis/stopwords路徑的一部分,這是合理的,因為這是一個由架構(gòu)定義的分析組件。
接下來是使用以下過濾器的字段類型:
<filter class="solr.ManagedStopFilterFactory"
managed="french" />
將會解決路徑:
/solr/techproducts/schema/analysis/stopwords/french
所以現(xiàn)在讓我們看一下這個API,從一個簡單的GET請求開始:
curl "http://localhost:8983/solr/techproducts/schema/analysis/stopwords/english"
假設(shè)您將此請求發(fā)送到Solr,則響應(yīng)正文是一個JSON文檔:
{
"responseHeader":{
"status":0,
"QTime":1
},
"wordSet":{
"initArgs":{"ignoreCase":true},
"initializedOn":"2014-03-28T20:53:53.058Z",
"managedList":[
"a",
"an",
"and",
"are",
]
}
}
該sample_techproducts_configs configset附帶了一組預(yù)置的托管stop詞,但是您應(yīng)該只使用此文件中使用API進(jìn)行交互,而不是直接進(jìn)行編輯。
在這個回應(yīng)中應(yīng)該突出的一件事:它包含了一些詞匯的managedList以及initArgs。這是這個框架中的一個重要概念 - 被管理的資源通常具有配置和數(shù)據(jù)。對于stop詞,唯一的配置參數(shù)是一個布爾值,用于決定是否在stop詞過濾期間忽略標(biāo)記的大小寫(ignoreCase = true | false)。數(shù)據(jù)是一個單詞列表,它表示為響應(yīng)中名為 managedList 的 JSON 數(shù)組。
現(xiàn)在,我們使用HTTP PUT為英stop詞列表添加一個新詞:
curl -X PUT -H 'Content-type:application/json' --data-binary '["foo"]' "http://localhost:8983/solr/techproducts/schema/analysis/stopwords/english"
在這里,我們使用curl將一個包含單個單詞“foo”的JSON列表放到托管英語stop詞集中。如果請求成功,Solr將返回200。您也可以將多個單詞放在一個PUT請求中。
您可以通過發(fā)送該單詞的GET請求作為該集的子資源來測試是否存在特定的單詞,例如:
curl "http://localhost:8983/solr/techproducts/schema/analysis/stopwords/english/foo"
如果子資源(foo)存在,此請求將返回狀態(tài)碼200;如果不存在托管列表,則返回404。
要刪除一個停止詞,您需要這樣做:
curl -X DELETE "http://localhost:8983/solr/techproducts/schema/analysis/stopwords/english/foo"
放置/POST 用于將術(shù)語添加到現(xiàn)有列表中, 而不是完全替換該列表。這是因為在現(xiàn)有列表中添加一個術(shù)語比完全替換一個列表更常見, 因此 API 更傾向于遞增地添加術(shù)語, 特別是因為也支持刪除各個術(shù)語。
PUT/POST用于將詞添加到現(xiàn)有列表,而不是完全替換列表。這是因為向現(xiàn)有列表添加一個詞比將其全部替換為一個列表更為常見,因此 API 更傾向于遞增地添加術(shù)語,特別是由于刪除單個詞也是受支持的。
大多數(shù)情況下,用于管理同義詞的API的行為類似于用于stop詞的API,除了使用單詞列表之外,它也使用映射,其中映射中每個條目的值都是一個詞的一組同義詞。與 stop 詞一樣,sample_techproducts_configs configset包含一組預(yù)先構(gòu)建的同義映射集,這些映射集適用于由schema.xml中的以下字段類型定義激活的示例數(shù)據(jù):
<fieldType name="managed_en" 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"/> <!-- required on index analyzers after graph filters -->
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.ManagedStopFilterFactory" managed="english" />
<filter class="solr.ManagedSynonymGraphFilterFactory" managed="english" />
</analyzer>
</fieldType>
要獲取受管同義詞的映射,請發(fā)送一個GET請求到:
curl "http://localhost:8983/solr/techproducts/schema/analysis/synonyms/english"
此請求將返回如下所示的響應(yīng):
{
"responseHeader":{
"status":0,
"QTime":3},
"synonymMappings":{
"initArgs":{
"ignoreCase":true,
"format":"solr"},
"initializedOn":"2014-12-16T22:44:05.33Z",
"managedMap":{
"GB":
["GiB",
"Gigabyte"],
"TV":
["Television"],
"happy":
["glad",
"joyful"]}}}
托管的同義詞在managedMap屬性下返回,其中包含一個JSON映射,其中每個條目的值是一個詞的一組同義詞,例如上面的示例中的“happy”具有同義詞“glad”和“joyful”。
要添加一個新的同義詞映射,您可以PUT / POST一個映射,如:
curl -X PUT -H 'Content-type:application/json' --data-binary '{"mad":["angry","upset"]}' "http://localhost:8983/solr/techproducts/schema/analysis/synonyms/english"
如果PUT請求成功,API將返回狀態(tài)碼200。要確定特定詞的同義詞,請對子資源發(fā)送GET請求,例如:/schema/analysis/synonyms/english/mad,將返回["angry","upset"]。
您也可以PUT一個對稱同義詞列表,它將被擴(kuò)展成列表中每個詞的映射。例如,可以使用 JSON 列表語法而不是映射來PUT下面的對稱同義詞列表:
curl -X PUT -H 'Content-type:application/json' --data-binary '["funny", "entertaining", "whimiscal", "jocular"]' "http://localhost:8983/solr/techproducts/schema/analysis/synonyms/english"
請注意,擴(kuò)展是在處理PUT請求時執(zhí)行的,因此基礎(chǔ)持久化狀態(tài)仍然是托管映射。因此,如果在發(fā)送先前的PUT請求之后,您做了GET /schema/analysis/synonyms/english/jocular,那么您將收到一個包含["funny", "entertaining", "whimiscal"]的列表。一旦使用列表創(chuàng)建同義詞映射,每個詞都必須單獨(dú)管理。
最后,您可以通過向托管端點(diǎn)發(fā)送DELETE請求來刪除映射。
在Solr集合(或單一服務(wù)器模式下的Solr核心)重新加載之前,通過此REST API對受管資源所做的更改不會應(yīng)用于活動的Solr組件。
例如:在添加或刪除stop詞之后,必須在更改變?yōu)榛顒訝顟B(tài)之前重新加載核心/集合;相關(guān)的API:CoreAdmin API和Collections API。
在分布式模式下運(yùn)行時,這種方法是必需的,這樣我們才能確保同時對集合中的所有內(nèi)核進(jìn)行更改,從而保證行為的一致性和可預(yù)測性。不言而喻,您不希望您的一個副本使用不同于其他的stop詞或同義詞組。
這個apply-changes-at-reload方法的一個細(xì)微結(jié)果就是,一旦您對API進(jìn)行了修改,就無法讀取活動的數(shù)據(jù)。換句話說,API從API的角度返回最新的數(shù)據(jù),這可能與當(dāng)前Solr組件使用的數(shù)據(jù)不同。
然而,這個API實(shí)現(xiàn)的目的是在做出更改之后,在短時間內(nèi)使用重新加載來應(yīng)用這些更改,以使API返回的數(shù)據(jù)與服務(wù)器中的活動不同的時間可以忽略不計。
注意:更改諸如 stop 字詞和同義詞映射之類的內(nèi)容通常需要索引現(xiàn)有文檔 (如果被索引時間分析器使用)。RestManager 框架并沒有保護(hù)你, 它只是使得有可能以編程方式建立一組stop字、同義詞等。
關(guān)于注冊的ManagedResources的元數(shù)據(jù)可以使用每個集合的/schema/managed端點(diǎn)。
假設(shè)您有managed_enschema.xml中定義的字段類型,那么向以下資源發(fā)送GET請求將返回關(guān)于RestManager管理哪些與模式相關(guān)的資源的元數(shù)據(jù):
curl "http://localhost:8983/solr/techproducts/schema/managed"
響應(yīng)正文是一個JSON文檔,其中包含有關(guān)/schema根目錄下的受管資源的元數(shù)據(jù):
{
"responseHeader":{
"status":0,
"QTime":3
},
"managedResources":[
{
"resourceId":"/schema/analysis/stopwords/english",
"class":"org.apache.solr.rest.schema.analysis.ManagedWordSetResource",
"numObservers":"1"
},
{
"resourceId":"/schema/analysis/synonyms/english",
"class":"org.apache.solr.rest.schema.analysis.ManagedSynonymGraphFilterFactory$SynonymManager",
"numObservers":"1"
}
]
}
您還可以在配置使用這些資源的任何內(nèi)容之前,使用PUT/POST創(chuàng)建新的托管資源到相應(yīng)的URL。
例如,假設(shè)我們想要建立一組德語停用詞。在我們開始添加停用詞之前,我們需要創(chuàng)建端點(diǎn):
/solr/techproducts/schema/analysis/stopwords/german
要創(chuàng)建此端點(diǎn),請將以下PUT/POST請求發(fā)送給我們希望創(chuàng)建的端點(diǎn):
curl -X PUT -H 'Content-type:application/json' --data-binary \
'{"class":"org.apache.solr.rest.schema.analysis.ManagedWordSetResource"}' \
"http://localhost:8983/solr/techproducts/schema/analysis/stopwords/german"
如果請求成功,Solr將以狀態(tài)碼200回應(yīng)。實(shí)際上,此操作在RestManager中為托管資源注冊新端點(diǎn)。從這里開始,您可以開始添加德語停用詞,如上所述:
curl -X PUT -H 'Content-type:application/json' --data-binary '["die"]' \
"http://localhost:8983/solr/techproducts/schema/analysis/stopwords/german"
對于大多數(shù)用戶來說,以這種方式創(chuàng)建資源不應(yīng)該是必需的,因為托管資源是在配置時自動創(chuàng)建的。
但是,如果受管資源不再由Solr組件使用,則可能需要顯式刪除受管資源。
例如,我們上面創(chuàng)建的德語的托管資源可以被刪除,因為沒有使用它的Solr組件,而英語停用詞的托管資源不能被刪除,因為在schema.xml中聲明了一個標(biāo)記過濾器使用它。
curl -X DELETE "http://localhost:8983/solr/techproducts/schema/analysis/stopwords/german"
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: