2013-07-12 3 views
2

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

Логика для индексирования: Пусть 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); 

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

EDIT # 1: Если я пытаюсь установить literal.id=xyz в curl request, он создает новый файл 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). Я не хочу этого.

ответ

2

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

Documentation: -

Вы можете заметить, что, хотя вы можете осуществлять поиск по любому из текста документа образца, вы не можете быть в состоянии видеть, что текст, когда документа извлекаются. Это просто потому, что поле «контент» , сгенерированное Tika, отображается в поле Solr под названием «текст», которое является индексированным, но не сохраненным. Это делается с помощью правила карты по умолчанию в обработчике/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); 
+0

Вы не поняли мой вопрос. Я сделаю индексацию. Поиск также успешный. При выполнении команды curl, указанной в вики, она добавляет ее как «новый» Solr Document. 'curl" http: // localhost: 8983/solr/update/extract? literal.id = doc1 & commit = true "-F" [email protected] "' -> эта команда добавляет новый файл solr doc, имеющий 'id = doc1 ', индексирует содержимое из' tutorial.html' и фиксирует его. Я хочу добавить содержимое html/pdf в качестве поля в ранее определенном solr doc, так что «новый» документ не создается, но поле добавляется к существующему. – xan

+0

Вы хотите добавить несколько богатых документов в один документ Solr? Solr не позволяет нескольким богатым документам с одним документом, но вы можете закрепить документы вместе и подать их на solr. Проверьте SOLR-2332. Также вы можете проверить частичные обновления Solr для подачи документа в solr, который добавляется в многозначное поле. – Jayendra

+0

№ Не много документов. '$ doc = new SolrInputDocument()' создает новый файл solr. Затем я добавляю к нему поля ('id',' name', 'title' и т. Д.). Только в этом документе я хочу добавить содержимое файла pdf. Но когда я запускаю запрос cURL (как в приведенном выше коде), он создает другой новый документ solr со своими собственными полями. – xan