Индексный pdf-файл с использованием Apache Solr

Я использую расширение php для Solr для взаимодействия с Apache Solr. Я индексирую данные из базы данных. Я хотел также индексировать содержимое внешних файлов (например, PDF-файлов, PPTX).

Логика для индексирования: Предположим, что schema.xml имеет следующие поля:

 <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> <field name="created" type="tlong" indexed="true" stored="true" /> <field name="name" type="text_general" indexed="true" stored="true"/> <field name="filepath" type="text_general" indexed="false" stored="true"/> <field name="filecontent" type="text_general" indexed="false" stored="true"/> 

В одной записи базы данных может / не может быть сохранен файл.

Следовательно, следующий мой код для индексирования:

 $post = stdclass object having the database content $doc = new SolrInputDocument(); $doc->addField('id', $post->id); $doc->addField('name', $post->name); .... .... $res = $client->addDocument($doc); $client->commit(); 

Затем я хочу добавить содержимое файла PDF в тот же самый файл solr, что и выше.

Это код curl :

 $ch = curl_init(' http://localhost:8010/solr/update/extract?'); curl_setopt ($ch, CURLOPT_POST, 1); curl_setopt ($ch, CURLOPT_POSTFIELDS, array('myfile'=>'@'.$post->filepath)); $result= curl_exec ($ch); 

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

EDIT # 1 : Если я попытаюсь установить literal.id=xyz в запросе curl, он создаст новый файл solr, имеющий id=xyz . Я не хочу создавать новый solr-документ. Я хочу, чтобы содержимое pdf было проиндексировано и сохранено как поле в ранее создаваемом solr-документе.

 $doc = new SolrInputDocument();//Solr document is created $doc->addField('id', 98765);//The solr document created above is assigned an id=`98765` .... .... $ch = curl_init(' http://localhost:8010/solr/update/extract?literal.id=1&literal.name=Name&commit=true'); curl_setopt ($ch, CURLOPT_POST, 1); curl_setopt ($ch, CURLOPT_POSTFIELDS, array('myfile'=>'@'.$post->filepath)); $result= curl_exec ($ch); 

Я хочу, чтобы в вышеупомянутом файле solr ( id = 98765 ) было поле, в котором содержимое pdf было проиндексировано и сохранено.

Но запрос cURL (как указано выше) создает еще один новый документ (с id = 1 ). Я не хочу этого.

Solr с Apache Tika обрабатывает извлечение содержимого Rich Documents и добавление его обратно в документ Solr.

Документация : –

Вы можете заметить, что, хотя вы можете выполнять поиск по любому из текста в образце документа, вы не сможете увидеть этот текст при извлечении документа. Это просто потому, что поле «контент», созданное Tika, отображается в поле Solr, называемое «text», которое индексируется, но не сохраняется. Это делается с помощью правила карты по умолчанию в обработчике / update / extract в файле solrconfig.xml и может быть легко изменено или переопределено. Например, чтобы хранить и видеть все метаданные и содержимое, выполните следующие действия:

Значение по умолчанию schema.xml: –

 <!-- Main body of document extracted by SolrCell. NOTE: This field is not indexed by default, since it is also copied to "text" using copyField below. This is to save space. Use this field for returning and highlighting document content. Use the "text" field to search the content. --> <field name="content" type="text_general" indexed="false" stored="true" multiValued="true"/> 

Если вы определяете другой атрибут для поддержания содержимого файла, переопределите значение по умолчанию с помощью fmap.content=filecontent в самом файле solrconfig.xml.

Параметр fmap.content = attr_content переопределяет текст fmap.content = по умолчанию, в результате чего содержимое будет добавлено в поле attr_content.

Если вы хотите проиндексировать его в одном документе, используйте литеральный префикс, например literal.id=1&literal.name=Name с атрибутами

 $ch = curl_init(' http://localhost:8010/solr/update/extract?literal.id=1&literal.name=Name&commit=true'); curl_setopt ($ch, CURLOPT_POST, 1); curl_setopt ($ch, CURLOPT_POSTFIELDS, array('myfile'=>'@'.$post->filepath)); $result= curl_exec ($ch);