管理対象リソース
管理対象リソースは、Solr オブジェクトに対して作成、読み取り、更新、削除 (CRUD) 操作を実行するための REST API エンドポイントを公開します。
設定設定やデータを持つ、長寿命の Solr オブジェクトは、管理対象リソースの有力な候補です。管理対象リソースは、管理対象スキーマにフィールドを追加するための RESTful スキーマ API など、Solr でプログラムで管理可能な他のコンポーネントを補完します。
Solr-as-a-Service を提供する Web ベースの UI で、ユーザーが検索アプリケーションの初期設定プロセスの一部としてストップワードとシノニムマッピングのセットを構成する必要がある場合を考えてみましょう。このタイプのユースケースは、Solr が提供する Managed Stop Filter & Managed Synonym Graph Filter Factories を使用して、管理対象リソース REST API を介して簡単にサポートできます。
ユーザーは、独自のカスタムプラグインを作成して、同じ内部フックを利用して追加のリソースを REST 管理することもできます。
このセクションのすべての例では、「techproducts」Solr の例を実行していることを前提としています
bin/solr -e techproducts
管理対象リソースの概要
REST API を使用してストップワードとシノニムを管理するために Solr が提供するいくつかの例を見て、管理対象リソースについて学習しましょう。このセクションを読んだら、管理対象リソースが Solr にどのように実装されているかの詳細を掘り下げて、独自の実装を構築できるようになります。
ストップワードの管理
まず、ManagedStopFilterFactory を使用するフィールドタイプを定義する必要があります。次に例を示します。
<fieldType name="managed_en" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.ManagedStopFilterFactory" (1)
managed="english" /> (2)
</analyzer>
</fieldType>
このフィールドタイプの定義について、注意すべき重要な点が 2 つあります。
1 | フィルター実装クラスは solr.ManagedStopFilterFactory です。これは、REST API から管理されるストップワードのセットを使用する StopFilterFactory の特殊な実装です。 |
2 | managed="english" 属性は、管理対象ストップワードのセットに名前を付けます。この場合、ストップワードが英語テキスト用であることを示します。 |
techproducts コレクションで英語のストップワードを管理するための REST エンドポイントは、/solr/techproducts/schema/analysis/stopwords/english
です。
リソースパスの例は、ほとんど自己説明的であるはずです。ManagedStopFilterFactory 実装は、パスの /schema/analysis/stopwords
部分を決定することに注意してください。これは、スキーマによって定義された分析コンポーネントであるため、意味があります。
したがって、次のフィルターを使用するフィールドタイプ
<filter class="solr.ManagedStopFilterFactory"
managed="french" />
は、パス /solr/techproducts/schema/analysis/stopwords/french
に解決されます。
それでは、単純な GET リクエストから始めて、この API の動作を見てみましょう
curl "https://127.0.0.1:8983/solr/techproducts/schema/analysis/stopwords/english"
このリクエストを 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 には、事前に構築された一連の管理対象ストップワードが付属していますが、API を使用してのみこのファイルと対話し、直接編集しないでください。
このレスポンスで注目すべき点の1つは、単語のmanagedList
とinitArgs
が含まれていることです。これはこのフレームワークにおける重要な概念であり、管理対象リソースには通常、設定とデータがあります。ストップワードの場合、唯一の設定パラメータは、ストップワードフィルタリング中にトークンの大文字/小文字を無視するかどうかを決定するブール値(ignoreCase=true|false)です。データは単語のリストであり、レスポンスではmanagedList
という名前のJSON配列として表現されます。
次に、HTTP PUTを使用して、英語のストップワードリストに新しい単語を追加しましょう。
curl -X PUT -H 'Content-type:application/json' --data-binary '["foo"]' "https://127.0.0.1:8983/solr/techproducts/schema/analysis/stopwords/english"
ここでは、curlを使用して、単語「foo」を1つ含むJSONリストを、管理対象の英語ストップワードセットにPUTしています。リクエストが成功すると、Solrは200を返します。1回のPUTリクエストで複数の単語をPUTすることもできます。
特定の単語が存在するかどうかをテストするには、その単語に対するGETリクエストをセットの子リソースとして送信します。例えば、次のようになります。
curl "https://127.0.0.1:8983/solr/techproducts/schema/analysis/stopwords/english/foo"
このリクエストは、子リソース(foo)が存在する場合はステータスコード200を返し、管理リストに存在しない場合は404を返します。
ストップワードを削除するには、次の操作を行います。
curl -X DELETE "https://127.0.0.1:8983/solr/techproducts/schema/analysis/stopwords/english/foo"
PUT/POSTは、リスト全体を置き換えるのではなく、既存のリストに用語を追加するために使用されます。これは、リスト全体を置き換えるよりも、既存のリストに用語を追加する方が一般的であるため、APIは、特に個々の用語の削除もサポートされているため、用語を増分的に追加するというより一般的なアプローチを優先します。 |
同義語の管理
ほとんどの場合、同義語を管理するためのAPIは、ストップワードのAPIと同様に動作しますが、単語のリストを扱うのではなく、マップを使用します。マップ内の各エントリの値は、用語の同義語のセットです。ストップワードと同様に、sample_techproducts_configs
設定セットには、次のフィールドタイプ定義によってアクティブ化されるサンプルデータに適した、事前構築された同義語マッピングのセットが含まれています。
<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>
管理対象の同義語のマップを取得するには、次の場所にGETリクエストを送信します。
curl "https://127.0.0.1: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"]}' "https://127.0.0.1:8983/solr/techproducts/schema/analysis/synonyms/english"
PUTリクエストが成功した場合、APIはステータスコード200を返します。特定の用語の同義語を判別するには、子リソースに対する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"]' "https://127.0.0.1:8983/solr/techproducts/schema/analysis/synonyms/english"
展開はPUTリクエストの処理時に実行されるため、基盤となる永続的な状態は依然として管理対象のマップであることに注意してください。したがって、前のPUTリクエストを送信した後、/schema/analysis/synonyms/english/jocular
に対してGETを実行すると、["funny", "entertaining", "whimiscal"]
を含むリストが返されます。リストを使用して同義語マッピングを作成したら、各用語を個別に管理する必要があります。
最後に、管理対象のエンドポイントにDELETEリクエストを送信することにより、マッピングを削除できます。
管理対象リソースの変更の適用
このREST APIを介して管理対象リソースに加えられた変更は、Solrコレクション(またはシングルサーバーモードではSolrコア)が再読み込みされるまで、アクティブなSolrコンポーネントには適用されません。
たとえば、ストップワードを追加または削除した後は、変更が有効になる前にコア/コレクションを再読み込みする必要があります。関連するAPI:CoreAdmin APIおよびCollections API。
このアプローチは、分散モードで実行する場合に、変更がコレクション内のすべてのコアに同時に適用されるようにし、動作が一貫して予測可能になるようにするために必要です。レプリカの1つが、他のレプリカとは異なるストップワードまたは同義語のセットを使用していることを望まないのは言うまでもありません。
この再読み込み時に変更を適用するアプローチの微妙な結果の1つは、APIで変更を加えると、アクティブなデータを読み取る方法がないことです。言い換えれば、APIはAPIの観点から最新のデータを返しますが、これはSolrコンポーネントによって現在使用されているものとは異なる可能性があります。
ただし、このAPI実装の意図は、変更を行った後、短時間で再読み込みを使用して変更が適用されるようにすることであるため、APIによって返されるデータがサーバーでアクティブになっているものと異なる時間はごくわずかになることを意図しています。
ストップワードや同義語マッピングなどの変更には、インデックス作成時アナライザーで使用されている場合は、通常、既存のドキュメントの再インデックス付けが必要です。RestManagerフレームワークはこれを保護するものではありません。これは、ストップワード、同義語などのセットをプログラムで構築できるようにするだけです。ドキュメントの再インデックス付けの詳細については、「再インデックス付け」セクションを参照してください。 |
RestManagerエンドポイント
登録済みのManagedResourcesに関するメタデータは、コレクションごとに/schema/managed
エンドポイントを使用して利用できます。
上記で示したmanaged_en
フィールドタイプをスキーマで定義していると仮定すると、次のリソースにGETリクエストを送信すると、RestManagerによって管理されているスキーマ関連のリソースに関するメタデータが返されます。
curl "https://127.0.0.1:8983/solr/techproducts/schema/managed"
レスポンスボディは、/schemaルート下の管理対象リソースに関するメタデータを含むJSONドキュメントです。
{
"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"
}
]
}
これらのリソースを使用するものを何も設定する前に、適切なURLにPUT/POSTを使用して新しい管理対象リソースを作成することもできます。
たとえば、ドイツ語のストップワードのセットを作成するとします。ストップワードの追加を開始する前に、エンドポイントを作成する必要があります。
/solr/techproducts/schema/analysis/stopwords/german
このエンドポイントを作成するには、作成したいエンドポイントに次のPUT/POSTリクエストを送信します。
curl -X PUT -H 'Content-type:application/json' --data-binary \
'{"class":"org.apache.solr.rest.schema.analysis.ManagedWordSetResource"}' \
"https://127.0.0.1:8983/solr/techproducts/schema/analysis/stopwords/german"
リクエストが成功すると、Solrはステータスコード200で応答します。事実上、このアクションは、RestManagerで管理対象リソースの新しいエンドポイントを登録します。ここから、上で見たように、ドイツ語のストップワードの追加を開始できます。
curl -X PUT -H 'Content-type:application/json' --data-binary '["die"]' \
"https://127.0.0.1:8983/solr/techproducts/schema/analysis/stopwords/german"
ほとんどのユーザーにとって、このようにリソースを作成する必要は決してありません。管理対象リソースは、設定時に自動的に作成されるためです。
ただし、Solrコンポーネントで使用されなくなった場合は、管理対象リソースを明示的に削除する必要がある場合があります。
たとえば、上記で作成したドイツ語の管理対象リソースは、使用しているSolrコンポーネントがないため削除できますが、英語のストップワードの管理対象リソースは、それを使用しているスキーマで宣言されているトークンフィルターがあるため削除できません。
curl -X DELETE "https://127.0.0.1:8983/solr/techproducts/schema/analysis/stopwords/german"