7.跟我学solr---对文件数据添加索引


简介

solr可以对文件数据进行解析,提取可索引内容进行建立索引,底层实现是依赖apache Tika的,Tika利用现有的解析类库,从不同格式的文档中(例如HTML,PDF,Doc),侦测和提取出元数据和结构化内容,然后交由solr建立索引。

添加文件数据索引例子

首先要保证你的solr版本在1.4以上,然后进入到进入到文件所在的目录,然后使用curl命令,把文件数据添加到solr中即可。

cd site/html
curl "http://localhost:8080/solr/update/extract?literal.id=doc1&commit=true" -F "myfile=@tutorial.html"
从发送的请求中我们可以看到请求的uri为/update/extract,回顾一下前面讲解提到的SolrRequestHandler,我们从solrconfig.xml文件中找到如下配置。

喜欢钻研的同学就可以看看ExtractingRequestHandler实现。

  <requestHandler name="/update/extract" 
                  startup="lazy"
                  class="solr.extraction.ExtractingRequestHandler" >
    <lst name="defaults">
      <str name="lowernames">true</str>
      <str name="uprefix">ignored_</str>

      <!-- capture link hrefs but ignore div attributes -->
      <str name="captureAttr">true</str>
      <str name="fmap.a">links</str>
      <str name="fmap.div">ignored_</str>
    </lst>
  </requestHandler>
另外,细心的同学可以看到提交的url中还有一个参数commit=ture。这个参数是用来告诉solr,是否提交索引,如果你是批量文件数据,应该等所有的文件都上传了再传这个commit=ture的参数,一起更新索引。

现在你就可以使用http://localhost:8080/solr/select?q=tutorial来搜索刚才提交的数据了。

添加的过程中,可能会报错:lazy loading error,这个报错是由于SOLR_HOME/collection1\confs/olrconfig.xml文件的如下配置没有找到对应的lib目录

  <lib dir="../../../contrib/extraction/lib" regex=".*\.jar" />
  <lib dir="../../../dist/" regex="solr-cell-\d.*\.jar" />

  <lib dir="../../../contrib/clustering/lib/" regex=".*\.jar" />
  <lib dir="../../../dist/" regex="solr-clustering-\d.*\.jar" />

  <lib dir="../../../contrib/langid/lib/" regex=".*\.jar" />
  <lib dir="../../../dist/" regex="solr-langid-\d.*\.jar" />

  <lib dir="../../../contrib/velocity/lib" regex=".*\.jar" />
  <lib dir="../../../dist/" regex="solr-velocity-\d.*\.jar" />
把需要的lib文件目录拷贝到这个相对路径下即可,或者直接指定绝对路径也可以,这些lib目录可以在solr解压的包的根目录下找到。

使用solrj添加

当然,在平时开发中我们比较少使用命令的方式提交数据,下面为大家讲解一下怎么使用solrj提交文件数据。沿用上面的例子,代码非常简单,server对象的说明请参考前面的章节。

		ContentStreamUpdateRequest up = new ContentStreamUpdateRequest("/update/extract");
		up.addFile(new File("tutorial.html"),"text/html");
		up.setParam("literal.id", "testSolrHtml001");
		up.setAction(org.apache.solr.client.solrj.request.AbstractUpdateRequest.ACTION.COMMIT, true, true);
		NamedList<Object> result = server.request(up);




相关内容