我正在使用Solr 4.3
我有一个包含两个Solr Core的设置:userCore
和mainCore
userCore
有自己的schema.xml
和solrconfig.xml
,并托管在localhost:8983
上。
mainCore
有自己不同的schema
和solrconfig
,并设置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
答案 0 :(得分:2)
您的架构定义了doc-id
,您的文档包含一个名为docid
的字段(无破折号)。
这些字段需要完全匹配。