使用Apache Solr索引pdf文件内容

时间:2013-07-12 07:27:57

标签: php solr apache-tika

我正在使用Solr的php extension与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();

接下来,我想在与上面相同的solr文档中添加PDF文件的内容。

这是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,但我找不到检索文件内容的方法,然后将其添加到field: filecontent

中的现有solr文档中

编辑#1 : 如果我尝试在curl请求中设置literal.id=xyz,则会创建一个包含id=xyz的新solr文档。我不想创建新的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的内容被编入索引&amp;存储

但是cURL请求(如上所述)创建了另一个新文档(id = 1)。我不希望这样。

1 个答案:

答案 0 :(得分:2)

使用Apache Tika的Solr处理提取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"/>

如果要定义另一个用于维护文件内容的属性,请在solrconfig.xml本身中覆盖默认值fmap.content=filecontent

  

fmap.content = attr_content参数会覆盖默认值   fmap.content = text,用于将内容添加到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);