userCore
Solr 4.3 を使用しています。2 つの Solr コアをセットアップしています。mainCore
userCore
には独自のschema.xml
とsolrconfig.xml
があり、 でホストされていlocalhost:8983
ます。
mainCore
には独自の異なるschema
とsolrconfig
があり、 1 つのシャードが で実行され、SolrCloud
もう 1 つのシャードが で実行されるようにセットアップされています。localhost:8080
localhost:7574
userToMain
で定義された更新チェーンにドキュメントをポストします。この更新チェーンuserCore
は、ドキュメントにインデックスを付けてから、 の別の更新チェーンに転送しmainCore
ます。文書はここで処理されmainCore
、 に索引付けされて、完了です。
分散検索が関与するまで、これはすべてうまく機能しました。ルークを介してさまざまなコアとシャードのインデックスを照会することでわかるように、ドキュメントは正常にインデックス化されました。ただし、分散 Solr クエリはこのセットアップでは機能しませんでした。なぜなら、私の(つまり、SolrCloud がセットアップされたもの) には定義mainCore
がなかったからです。uniqueKey
そこで、これを治そうとしました。mainCore
スキーマにはすでに次のフィールドがありました。
<field name="doc-id" type="string" indexed="true" stored="true" multiValued="false" required="true"/>
スキーマで次のように指定して、これを uniqueKey として使用したかったのです。
<uniqueKey>doc-id</uniqueKey>
ドキュメントをuserCore
介して投稿すると
`java -Durl=http://localhost:8983/solr/userCore/update?update.chain=userToCoref -jar \
$(SOLR_HOME)/example/exampledocs/post.jar example/examplesdocs/test_doc0.xml`
エラーが表示される
Document is missing mandatory uniqueKey field: doc-id
だけでなくmainCore
、スキーマuniqueKey
が実際に定義されているだけでなく userCore
、そのスキーマには!の言及すらありません。 uniqueKey
具体的には、次のエラーの一部です mainCore
。
127578 [qtp1733460569-16] INFO org.apache.solr.update.processor.LogUpdateProcessor – [corefCore] webapp=/solr path=/update params={wt=javabin&version=2} {} 0 619
127579 [qtp1733460569-16] ERROR org.apache.solr.core.SolrCore – org.apache.solr.common.SolrException: Document is missing mandatory uniqueKey field: doc-id
at org.apache.solr.update.AddUpdateCommand.getHashableId(AddUpdateCommand.java:132)
at org.apache.solr.update.processor.DistributedUpdateProcessor.processAdd(DistributedUpdateProcessor.java:389)
at org.apache.solr.update.processor.LogUpdateProcessor.processAdd(LogUpdateProcessorFactory.java:100)
at org.apache.solr.update.processor.UpdateRequestProcessor.processAdd(UpdateRequestProcessor.java:51)
userCore のエラーの一部:
135506 [qtp1733460569-19] INFO org.apache.solr.update.processor.LogUpdateProcessor – [userCore] webapp=/solr path=/update params={update.chain=userToCoref} {} 0 628
135507 [qtp1733460569-19] ERROR org.apache.solr.core.SolrCore – org.apache.solr.client.solrj.impl.HttpSolrServer$RemoteSolrException: Document is missing mandatory uniqueKey field: doc-id
at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:402)
at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:180)
at org.apache.solr.client.solrj.request.AbstractUpdateRequest.process(AbstractUpdateRequest.java:117)
at org.apache.solr.client.solrj.SolrServer.add(SolrServer.java:116)
at org.apache.solr.client.solrj.SolrServer.add(SolrServer.java:102)
要約すると、私を当惑させるのは次の 2 点です。
1) doc-id
mainCore スキーマで実際に定義されたフィールドがある場合、それを指すuniqueKey
場合、および他のすべての状況でインデックスが作成される場合、Solr が文句を言うのはなぜDocument is missing mandatory uniqueKey field:doc-id
ですか???
2) このフィールドに関して mainCore に実際に何か問題があるとしても、どうして userCore もこれについて不満を言っているように見えるのですか? それらはまったく異なるサーバー上にあり、構成もまったく異なります。userCore が行うことは、この mainCore の URL で指定されているように、受信したドキュメントを mainCore に投稿することだけです。
どんな助けでも大歓迎です!
編集:コメントにいくつかの回答を提供したかったのです。に投稿された元のドキュメントuserCore
、test_doc0.xml は次のようになります。
<add><doc>
<field name="docid">docid0</field>
<field name="coref_input">Bill Clinton was the 42nd president. Clinton's wife Hillary is
currently Secretary of State. Hillary Clinton ran for president
unsuccessfully.</field>
</doc></add>
にインデックス付けされた後、関連する updateRequestProcessor の特定のロジックを介して処理するためuserCore
に に送信されます。mainCore
userToMainUpdateRequestProcessor.java
public void processAdd(AddUpdateCommand cmd) throws IOException {
SolrInputDocument userDoc = cmd.getSolrInputDocument();
SolrInputField userInputField = userDoc.getField(inputField);
if (userInputField != null) {
SolrInputField userDocIdField = userDoc.getField(docIdField);
if (userDocIdField == null || userDocIdField.getValueCount() > 1) {
throw new RuntimeException(docIdField + " must be present and single-valued");
}
}
SolrResponse response;
try {
mainServer.add(userDoc);
mainServer.commit();
} catch (SolrServerException e) {
throw new RuntimeException(e);
}
super.processAdd(cmd);
}
は次のようmainServer
に定義されUserToMainUpdateRequestProcessorFactory.java
ています。
mainServer = new HttpServer("http://localhost:8080/solr/mainCore");
したがって、userCore
にドキュメントを投稿し、一連の処理を行って、次のようなフィールドをさらに生成します (完全なドキュメントを含めることはできません)。mainCore
mainCore
Name_Data: ヒラリー・クリントン
Name_FullnameOverrides: enghillary clinton
Name_CompletedData: ヒラリー・クリントン
name-token-count: 2
doc-id: docid0
doc-language: eng
indoc-chain-id: 5
最長の言及: ヒラリー・クリントン
信頼度: 0.9443013649773926