Solr: в документе отсутствует требуемая ошибка uniqueKey, несмотря на наличие поля

Я работаю с 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


person ess    schedule 02.08.2013    source источник
comment
Можете ли вы добавить, как выглядит ваш документ (test_doc0.xml), потому что это может быть связано с этим   -  person Fuxi    schedule 03.08.2013
comment
userCore регистрирует исключение REMOTE из mainCore, здесь нет ничего удивительного. Вы упомянули, что обрабатываете на userCore, а затем перенаправляете обработку на основное ядро. Как это сделать? Вы уверены, что в mainCore передается тот же самый документ? Думаю, стоит отладить обработчик обновлений в mainCore, чтобы посмотреть, что входит.   -  person lexk    schedule 04.08.2013


Ответы (1)


Ваша схема определяет doc-id, а ваш документ содержит поле с именем docid (без тире).

Эти поля должны точно совпадать.

person Mason G. Zhwiti    schedule 25.09.2013