Solr:尽管存在字段,但文档缺失需要uniqueKey错误

时间:2013-08-02 22:03:39

标签: solr solr4 solrcloud

我正在使用Solr 4.3 我有一个包含两个Solr Core的设置:userCoremainCore

userCore有自己的schema.xmlsolrconfig.xml,并托管在localhost:8983上。

mainCore有自己不同的schemasolrconfig,并设置SolrCloud,其中一个分片在localhost:8080运行,另一个分片在{{} 1}}

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

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

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

mainCore

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

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

现在,当我通过

将文档发布到<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

userCore的部分错误

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)

总之,令我困惑的是双重

1)为什么,当我在mainCore架构中实际定义了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) 字段时,当我指向doc-id时,以及当 在其他所有模式下编入索引时Solr抱怨uniqueKey ???

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

非常感谢任何帮助!

编辑:我想提供一些评论的答案。 发布到Document is missing mandatory uniqueKey field:doc-id的原始文档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>后,会通过相关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会进行一系列处理以生成更多这样的字段(我不能包含完整文档):

Name_Data:希拉里克林顿 Name_FullnameOverrides:enghillary clinton
Name_CompletedData:希拉里克林顿 name-token-count:2
doc-id:docid0
doc-language:eng
indoc-chain-id:5
最长的一点:希拉里克林顿 信心:0.9443013649773926

1 个答案:

答案 0 :(得分:2)

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

这些字段需要完全匹配。