Как настроить solr с помощью db-data-config.xml для индексации документов из нескольких источников

Я пытаюсь индексировать несколько баз данных в один индекс solr. Я читал solr wiki по нескольким источникам данных и пытался возиться с разными настройками, но не смог получить желаемого результата.

Моя конфигурация выглядит так:

<dataConfig>
  <!-- Has 10000 items -->
  <dataSource name="ds1" driver="org.h2.Driver" url="jdbc:h2:file:/path/to/first" />
  <!-- Has ~7000 items -->
  <dataSource name="ds2" driver="org.h2.Driver" url="jdbc:h2:file:/path/to/second" />

  <document name="myDocName">
    <entity name="firstEntity" rootEntity="true" 
            dataSource="ds1" query="SELECT * FROM BLAH"  
            transformer="my.Transformer" threads="4">
      ... <!-- field configuration here -->
    </entity>

    <entity name="secondEntity" rootEntity="true"  
            dataSource="ds2" query="SELECT * FROM BLAH"  
            transformer="my.Transformer" threads="4">
      ... <!-- field configuration here -->
    </entity>
  </document>
</dataConfig>

Сейчас мы работаем с тестовыми данными, поэтому я знаю, сколько записей есть в каждой базе данных, первая содержит ~ 7000, а вторая 10000. Когда я запускаю индексацию, я получаю информационное сообщение о том, что есть ~ 17000 добавлений:

INFO: {deleteByQuery=*:*,add=[5, 1, 2, 6, 7, 4, 8, 3, ... (17069 adds)],commit=} 0

Однако, когда я запускаю запрос * : * в веб-интерфейсе, я получаю только 10000 результатов (что точно соответствует количеству элементов в самой большой базе данных. Кажется, это говорит о том, что 7096 документов должны содержать сущности, а остальные только один.

Я попытался документировать элементы в файле конфигурации, но в результате был импортирован только один (вероятно, потому, что они имеют одинаковое имя, т.е. имя документа = "myDocName" было настроено одинаково для двух элементов документа).

На данный момент я застрял и не знаю, как правильно настроить это. Единственное, что я могу дополнительно придумать, это то, что мне нужно индексировать обе базы данных по отдельности, но рабочий процесс для этого мне тоже не совсем ясен. Любая помощь будет оценена по достоинству.

Обновление 1: я попытался дать обоим объектам разные имена (что в любом случае требуется в соответствии с документацией), но это приводит к следующему поведению. Сначала добавляются документы из первой БД, затем первые N существующих документов перезаписываются документами из второй БД, где N — количество записей во второй БД. Очевидно, это не то, что мне нужно, я хочу N дополнительных документов. Добавление второго элемента документа в конфигурацию тоже не работает.

Обновление 2: Согласно комментариям в этом отчете об ошибке: https://issues.apache.org/jira/browse/SOLR-895, корневые сущности в теге документа должны привести к созданию новых документов для этих сущностей. Это не то, что происходит для меня. Явная установка rootEntity="true" для каждого тега объекта также ничего не меняет. Результат по-прежнему таков, что после импорта у меня есть только 10000 документов вместо ожидаемых 17000.


person Bertjan Broeksema    schedule 06.11.2012    source источник


Ответы (1)


Я полагаю, у вас есть конфликты уникальных ключей. У вас одинаковые идентификаторы в двух разных базах данных? Попробуйте изменить запросы на

 - ds1 - "SELECT "ds1" || id AS id, field1, field2 FROM table1"
 - ds2 - "SELECT "ds2" || id AS id, field1, field2 FROM table2"

Я бы удалил опцию многопоточности (threads="4"), так как нет действительно значительного улучшения производительности по сравнению с однопоточным случаем, и она не очень стабильна (она была удалена в выпуске 4.0).

person Alexey Serba    schedule 06.11.2012
comment
Да, это было именно так. Спасибо за указание на это. Есть две разные базы данных, созданные с помощью инструмента, который у нас есть, и поле id было просто автоматически увеличено для обеих баз данных, так что действительно перекрывающиеся идентификаторы. Исправлено с помощью другого поля в базе данных, которое действительно уникально для двух баз данных. - person Bertjan Broeksema; 06.11.2012