0

userCoreSolr 4.3 を使用しています。2 つの Solr コアをセットアップしています。mainCore

userCoreには独自のschema.xmlsolrconfig.xmlがあり、 でホストされていlocalhost:8983ます。

mainCoreには独自の異なるschemasolrconfigがあり、 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

4

1 に答える 1

2

スキーマが定義doc-idし、ドキュメントにdocid(ダッシュなし) という名前のフィールドが含まれています。

これらのフィールドは正確に一致する必要があります。

于 2013-09-25T18:53:59.250 に答える