我正在使用 Solr 4.3 我设置了两个 Solr 核心:userCore
和mainCore
userCore
有自己的schema.xml
andsolrconfig.xml
并且托管在localhost:8983
.
mainCore
有自己不同的schema
and 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>
现在,当我将文档发布到userCore
via
`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