Я работаю с Solr 4.3. У меня есть два ядра Solr: userCore
и mainCore
.
userCore
имеет свои собственные schema.xml
и solrconfig.xml
и размещается на localhost:8983
.
mainCore
имеет свои собственные разные schema
и solrconfig
, и имеет SolrCloud
настроенный с одним шардом, работающим на localhost:8080
, другим на localhost:7574
Я отправляю документы в цепочку обновлений userToMain
, определенную в userCore
, которая индексирует документ, а затем пересылает его в другую цепочку обновлений в mainCore
. Документы обрабатываются здесь и индексируются в mainCore
, после чего все готово.
Все это работало хорошо, пока не был задействован распределенный поиск: документы были успешно проиндексированы, как я мог убедиться, запросив индексы различных ядер и сегментов через Luke. Однако распределенный запрос Solr не работал для этой настройки, потому что, как оказалось, мой mainCore
(то есть тот, у которого настроен SolrCloud) не имел определенного 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)
Подводя итог, могу сказать, что меня озадачивает двоякий вопрос:
1) Почему, когда у меня на самом деле есть поле doc-id
, определенное в моей схеме mainCore, когда я указываю на него uniqueKey
и когда оно действительно индексируется при всех других обстоятельствах, Solr жалуется, что Document is missing mandatory uniqueKey field:doc-id
???
2) Даже если что-то действительно не так с mainCore с точки зрения этого поля, почему, почему userCore также жалуется на это? Они на совершенно разных серверах, с совершенно разными конфигами. Все, что делает userCore, — это отправляет полученные им документы в mainCore, как указано в URL-адресе этого mainCore.
Любая помощь приветствуется!
EDIT: я хотел дать несколько ответов на комментарии. Исходный документ, размещенный на 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>
После того, как он проиндексирован в 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: Хиллари Клинтон
Name_FullnameOverrides: enghillary clinton
Name_CompletedData: Хиллари Клинтон
name-token-count: 2
doc-id: docid0
doc-language: eng
indoc-chain -id: 5
самое длинное упоминание: Хиллари Клинтон
достоверность: 0,9443013649773926