userCoreSolr 4.3 を使用しています。2 つの Solr コアをセットアップしています。mainCore
userCoreには独自のschema.xmlとsolrconfig.xmlがあり、 でホストされていlocalhost:8983ます。
mainCoreには独自の異なるschemaとsolrconfigがあり、 1 つのシャードが で実行され、SolrCloudもう 1 つのシャードが で実行されるようにセットアップされています。localhost:8080localhost: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-idmainCore スキーマで実際に定義されたフィールドがある場合、それを指す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に に送信されます。mainCoreuserToMainUpdateRequestProcessor.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にドキュメントを投稿し、一連の処理を行って、次のようなフィールドをさらに生成します (完全なドキュメントを含めることはできません)。mainCoremainCore
Name_Data: ヒラリー・クリントン
Name_FullnameOverrides: enghillary clinton
Name_CompletedData: ヒラリー・クリントン
name-token-count: 2
doc-id: docid0
doc-language: eng
indoc-chain-id: 5
最長の言及: ヒラリー・クリントン
信頼度: 0.9443013649773926