0

我正在使用 Solr 4.3 我设置了两个 Solr 核心:userCoremainCore

userCore有自己的schema.xmlandsolrconfig.xml并且托管在localhost:8983.

mainCore有自己不同的schemaand solrconfig,并且有一个SolrCloud设置,一个分片在运行localhost:8080,另一个在localhost:7574

我将文档发布到 中userToMain定义的更新链userCore,它为文档编制索引,然后将其转发到 中的另一个更新链mainCore。文档在这里处理并索引到mainCore中,然后我们就完成了。

在涉及分布式搜索之前,所有这一切都运行良好:文档已成功编入索引,我可以通过 Luke 查询不同核心和分片的索引来判断。但是,分布式 Solr 查询不适用于此设置,因为当它变成 otu 时,我的mainCore(即设置了 SolrCloud 的那个)没有uniqueKey定义。

所以我试图解决这个问题。我已经在mainCore架构中有以下字段:

<field name="doc-id" type="string" indexed="true" stored="true" multiValued="false" required="true"/>

我希望通过在架构中指定将其用作 uniqueKey:

<uniqueKey>doc-id</uniqueKey>

现在,当我将文档发布到userCorevia

`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在其模式中甚至没有提到 a 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)

总之,让我感到困惑的是两方面

1)为什么,当我实际上doc-id在我的 mainCore 模式中定义了字段时,当我指向uniqueKey它时,当它所有其他情况下被索引时,Solr 会抱怨吗Document is missing mandatory uniqueKey field:doc-id???

2)即使 mainCore 在这个领域确实有问题,为什么 userCore 似乎也在抱怨这个?它们位于完全不同的服务器上,具有完全不同的配置。userCore 所做的只是将它接收到的文档发布到 mainCore,由该 mainCore 的 URL 指定。

任何帮助将非常感激!

编辑:我想为评论提供一些答案。发布到 test_doc0.xml 的原始文档userCore如下所示:

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

在它被索引到 之后userCore,它被发送到mainCore通过相关 updateRequestProcessor 中的这个特定逻辑进行处理,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:
hillary clinton Name_FullnameOverrides: enghillary clinton
Name_CompletedData: hillary clinton
name-token-count: 2
doc-id: docid0
doc-language: eng
indoc-chain-id: 5
最长提及: Hillary Clinton
信心: 0.9443013649773926

4

1 回答 1

2

您的架构定义doc-id并且您的文档包含一个名为docid(无破折号)的字段。

这些字段需要完全匹配。

于 2013-09-25T18:53:59.250 回答