Источник UrlDataSource для Solr DataImportHandler

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

Например, файл 1 может иметь

<chunks>
  <chunk url="http://localhost/chunker?start=0&stop=100" />
  <chunk url="http://localhost/chunker?start=100&stop=200" />
  <chunk url="http://localhost/chunker?start=200&stop=300" />
  <chunk url="http://localhost/chunker?start=300&stop=400" />
  <chunk url="http://localhost/chunker?start=400&stop=500" />
  <chunk url="http://localhost/chunker?start=500&stop=600" />
</chunks>

с URL-адресом каждого фрагмента, ведущим к чему-то вроде

<items>
   <item data1="info1" />
   <item data1="info2" />
   <item data1="info3" />
   <item data1="info4" />
</iems>

Я работаю с более чем 500 миллионами записей, поэтому я думаю, что данные нужно будет разбить на части, чтобы избежать проблем с памятью (с этим столкнулся при использовании SQLEntityProcessor). Я также хотел бы избежать более 500 миллионов веб-запросов, так как это может дорого обойтись, я думаю.


person Marty Trenouth    schedule 12.05.2011    source источник


Ответы (2)


Из-за отсутствия примеров в Интернете я решил опубликовать то, что в итоге использовал.

<?xml version="1.0" encoding="utf-8"?>
<result>
  <dataCollection func="chunked">
    <data info="test" info2="test" />
    <data info="test" info2="test" />
    <data info="test" info2="test" />
    <data info="test" info2="test" />
    <data info="test" info2="test" />
    <data info="test" info2="test" />
    <data hasmore="true" nexturl="http://server.domain.com/handler?start=0&amp;end=1000000000&amp;page=1&amp;pagesize=10"
  </dataCollection>
</result>

Важно отметить, что я использую указание, что на следующей странице есть еще, и предоставляю URL-адрес следующей страницы. Это соответствует документации Solr для обработчиков импорта данных. Обратите внимание, что в документации указано, что постраничный фид должен сообщать системе, что у него есть еще и где взять следующую партию.

<dataConfig>
    <dataSource name="b" type="URLDataSource" baseUrl="http://server/" encoding="UTF-8" />
    <document>
        <entity name="continue"
                dataSource="b"
                url="handler?start=${dataimport.request.startrecord}&amp;end=${dataimport.request.stoprecord}&amp;pagesize=100000"
                stream="true"
                processor="XPathEntityProcessor"
                forEach="/result/dataCollection/data"
                transformer="DateFormatTransformer"
                connectionTimeout="120000"
                readTimeout="300000"
                >
            <field column="id"  xpath="/result/dataCollection/data/@info" />
            <field column="id"  xpath="/result/dataCollection/data/@info" />
            <field column="$hasMore" xpath="/result/dataCollection/data/@hasmore" />
            <field column="$nextUrl" xpath="/result/dataCollection/data/@nexturl" />
        </entity>
    </document>

Обратите внимание на поля $hasMore и $nextUrl. Вы можете разместить с тайм-аутами. Я также рекомендую разрешить указывать размер страницы (это помогает настроить параметры для получения оптимальной скорости обработки). Я индексирую около 12,5 тыс. записей в секунду, используя многоядерный (3) экземпляр solr на одном сервере с четырехъядерным процессором Xeon и 32 ГБ оперативной памяти.

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

person Marty Trenouth    schedule 14.05.2011

Сущность может быть вложена, чтобы делать то, что вы хотели изначально. Внутренний объект может ссылаться на внешнее поле, например url="${chunk.link}", где chunk — имя внешнего объекта, а link — имя поля.

<?xml version="1.0" encoding="windows-1250"?>
<dataConfig>
  <dataSource name="b" type="URLDataSource" baseUrl="http://server/" encoding="UTF-8" />
  <document>
    <entity name="chunk"
      dataSource="b"
      url="path/to/chunk.xml"
      stream="true"
      processor="XPathEntityProcessor"
      forEach="/chunks/chunk"
      transformer="DateFormatTransformer"
      connectionTimeout="120000"
      readTimeout="300000" >
      <field column="link" xpath="/chunks/chunk/@url" />
      <entity name="item"
        dataSource="b"
        url="${chunk.link}"
        stream="true"
        processor="XPathEntityProcessor"
        forEach="/items/item"
        transformer="DateFormatTransformer"
        connectionTimeout="120000"
        readTimeout="300000" >
        <field column="info"  xpath="/items/item/@info" />
      </entity>
    </entity>
</document>
</dataConfig>
person Duy Nguyen    schedule 26.03.2012