Solr托管資源

2018-12-15 15:00 更新

Solr托管資源公開了一個REST API端點,用于在Solr對象上執(zhí)行Create-Read-Update-Delete(CRUD)操作。

具有配置設置或數(shù)據(jù)的任何長期存在的Solr對象都是被管理資源的好候選。托管資源是對Solr中其他可編程管理的組件的補充,例如用于將字段添加到托管模式的RESTful模式API。

請考慮一個基于web的用戶界面,該UI提供"Solr"服務,用戶需要配置一組停用詞和同義詞映射作為其搜索應用程序的初始設置過程的一部分。使用Solr提供的托管停止過濾器和托管的同義詞圖過濾器工廠,可以通過托管資源REST API輕松地支持此類用例。

用戶也可以編寫自己的自定義插件,利用相同的內(nèi)部鉤子來管理額外的資源REST。

本節(jié)中的所有示例都假設您正在運行“techproducts”Solr示例:

bin/solr -e techproducts

托管資源概述

我們通過查看Solr提供的幾個示例來開始學習托管資源,以使用REST API管理停用詞和同義詞的示例。閱讀本節(jié)后,您將準備好深入了解如何在Solr中實施托管資源的細節(jié),以便您可以開始構建自己的實施。

管理停用詞

首先,您需要定義一個使用ManagedStopFilterFactory的字段類型,例如:

<fieldType name="managed_en" positionIncrementGap="100">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.ManagedStopFilterFactory" 
            managed="english" /> 
  </analyzer>
</fieldType>

關于這個字段類型的定義,有兩個重要的事情要注意:

  1. 過濾器實現(xiàn)類是 solr.ManagedStopFilterFactory ,這是StopFilterFactory的一個特殊實現(xiàn),它使用一組從REST API管理的停用詞。
  2. managed=”english”屬性給出了一組管理停用詞的名稱,在這種情況下表示停用詞是英文文本。

用于管理 techproducts 集合中英文stop詞的REST端點是:

/solr/techproducts/schema/analysis/stopwords/english。

示例資源路徑應該大多是不言自明的。應該注意的是,ManagedStopFilterFactory實現(xiàn)確定了/schema/analysis/stopwords路徑的一部分,這是合理的,因為這是一個由架構定義的分析組件。

接下來是使用以下過濾器的字段類型:

<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"

假設您將此請求發(fā)送到Solr,則響應正文是一個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附帶了一組預置的托管stop詞,但是您應該只使用此文件中使用API進行交互,而不是直接進行編輯。

在這個回應中應該突出的一件事:它包含了一些詞匯的managedList以及initArgs。這是這個框架中的一個重要概念 - 被管理的資源通常具有配置和數(shù)據(jù)。對于stop詞,唯一的配置參數(shù)是一個布爾值,用于決定是否在stop詞過濾期間忽略標記的大小寫(ignoreCase = true | false)。數(shù)據(jù)是一個單詞列表,它表示為響應中名為 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 用于將術語添加到現(xiàn)有列表中, 而不是完全替換該列表。這是因為在現(xiàn)有列表中添加一個術語比完全替換一個列表更常見, 因此 API 更傾向于遞增地添加術語, 特別是因為也支持刪除各個術語。

PUT/POST用于將詞添加到現(xiàn)有列表,而不是完全替換列表。這是因為向現(xiàn)有列表添加一個詞比將其全部替換為一個列表更為常見,因此 API 更傾向于遞增地添加術語,特別是由于刪除單個詞也是受支持的。

管理同義詞

大多數(shù)情況下,用于管理同義詞的API的行為類似于用于stop詞的API,除了使用單詞列表之外,它也使用映射,其中映射中每個條目的值都是一個詞的一組同義詞。與 stop 詞一樣,sample_techproducts_configs configset包含一組預先構建的同義映射集,這些映射集適用于由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"

此請求將返回如下所示的響應:

{
  "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一個對稱同義詞列表,它將被擴展成列表中每個詞的映射。例如,可以使用 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"

請注意,擴展是在處理PUT請求時執(zhí)行的,因此基礎持久化狀態(tài)仍然是托管映射。因此,如果在發(fā)送先前的PUT請求之后,您做了GET /schema/analysis/synonyms/english/jocular,那么您將收到一個包含["funny", "entertaining", "whimiscal"]的列表。一旦使用列表創(chuàng)建同義詞映射,每個詞都必須單獨管理。

最后,您可以通過向托管端點發(fā)送DELETE請求來刪除映射。

應用托管資源更改

在Solr集合(或單一服務器模式下的Solr核心)重新加載之前,通過此REST API對受管資源所做的更改不會應用于活動的Solr組件。

例如:在添加或刪除stop詞之后,必須在更改變?yōu)榛顒訝顟B(tài)之前重新加載核心/集合;相關的API:CoreAdmin API和Collections API。

在分布式模式下運行時,這種方法是必需的,這樣我們才能確保同時對集合中的所有內(nèi)核進行更改,從而保證行為的一致性和可預測性。不言而喻,您不希望您的一個副本使用不同于其他的stop詞或同義詞組。

這個apply-changes-at-reload方法的一個細微結果就是,一旦您對API進行了修改,就無法讀取活動的數(shù)據(jù)。換句話說,API從API的角度返回最新的數(shù)據(jù),這可能與當前Solr組件使用的數(shù)據(jù)不同。

然而,這個API實現(xiàn)的目的是在做出更改之后,在短時間內(nèi)使用重新加載來應用這些更改,以使API返回的數(shù)據(jù)與服務器中的活動不同的時間可以忽略不計。

注意:更改諸如 stop 字詞和同義詞映射之類的內(nèi)容通常需要索引現(xiàn)有文檔 (如果被索引時間分析器使用)。RestManager 框架并沒有保護你, 它只是使得有可能以編程方式建立一組stop字、同義詞等。

RestManager端點

關于注冊的ManagedResources的元數(shù)據(jù)可以使用每個集合的/schema/managed端點。

假設您有managed_enschema.xml中定義的字段類型,那么向以下資源發(fā)送GET請求將返回關于RestManager管理哪些與模式相關的資源的元數(shù)據(jù):

curl "http://localhost:8983/solr/techproducts/schema/managed"

響應正文是一個JSON文檔,其中包含有關/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)建新的托管資源到相應的URL。

例如,假設我們想要建立一組德語停用詞。在我們開始添加停用詞之前,我們需要創(chuàng)建端點:

/solr/techproducts/schema/analysis/stopwords/german

要創(chuàng)建此端點,請將以下PUT/POST請求發(fā)送給我們希望創(chuàng)建的端點:

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回應。實際上,此操作在RestManager中為托管資源注冊新端點。從這里開始,您可以開始添加德語停用詞,如上所述:

curl -X PUT -H 'Content-type:application/json' --data-binary '["die"]' \
"http://localhost:8983/solr/techproducts/schema/analysis/stopwords/german"

對于大多數(shù)用戶來說,以這種方式創(chuàng)建資源不應該是必需的,因為托管資源是在配置時自動創(chuàng)建的。

但是,如果受管資源不再由Solr組件使用,則可能需要顯式刪除受管資源。

例如,我們上面創(chuàng)建的德語的托管資源可以被刪除,因為沒有使用它的Solr組件,而英語停用詞的托管資源不能被刪除,因為在schema.xml中聲明了一個標記過濾器使用它。

curl -X DELETE "http://localhost:8983/solr/techproducts/schema/analysis/stopwords/german"
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號