Solr4.7从文件创建索引

时间:2022-12-10 20:22:34

索引数据源并不会一定来自于数据库、XML、JSON、CSV这类结构化数据,很多时候也来自于PDF、word、html、word、MP3等这类非结构化数据,从这类非结构化数据创建索引,solr也给我们提供了很好的支持,利用的是apache  tika。

下面我们来看看在solr4.7中如何从pdf文件创建索引。

一、配置文件索引库

1、  新建core

我们新建一个solr的core,用于存储文件型索引,新建core的步骤请参考:

http://blog.csdn.net/clj198606061111/article/details/21288499

2、  准备jar

我们在$solr_home下面新建一个extract文件夹,用于存放solr扩展jar包。

从colr4.7发布包中solr-4.7.0\dist拷贝solr-cell-4.7.0.jar到新建的extract文件夹下。拷贝solr4.7发布包solr-4.7.0\contrib\extraction\lib下所有jar包到extract文件夹下。

3、  配置solrconfig.xml

添加请求解析配置:

[html] view
plain
copy
  1. <requestHandler name="/update/extract" class="solr.extraction.ExtractingRequestHandler" >
  2. <lst name="defaults">
  3. <str name="fmap.content">text</str>
  4. <str name="lowernames">true</str>
  5. <str name="uprefix">attr_</str>
  6. <str name="captureAttr">true</str>
  7. </lst>
  8. </requestHandler>

指定依赖包位置:

注意,这个相对位置不是相对于配置文件所在文件夹位置,而是相对core主目录的。比如我的配置文件在solr_home\core1\conf,但是我的jar包在solr_home\ extract那么我的相对路径就是../extract而不是../../extract。

[html] view
plain
copy
  1. <lib dir="../extract" regex=".*\.jar" />

4、配置schema.xml

4.1配置索引字段的类型,也就是field类型。

其中text_general类型我们用到2个txt文件(stopwords.txt、synonyms.txt),这2个txt文件在发布包示例core里面有位置在:solr-4.7.0\example\solr\collection1\conf,复制这2个txt文件到新建的$solr_home的那个新建的core下面的conf目录下,和schema.xml一个位置。

[html] view
plain
copySolr4.7从文件创建索引Solr4.7从文件创建索引
  1. <types>
  2. <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
  3. <fieldtype name="string"  class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
  4. <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
  5. <analyzer type="index">
  6. <tokenizer class="solr.StandardTokenizerFactory"/>
  7. <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
  8. <filter class="solr.LowerCaseFilterFactory"/>
  9. </analyzer>
  10. <analyzer type="query">
  11. <tokenizer class="solr.StandardTokenizerFactory"/>
  12. <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
  13. <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
  14. <filter class="solr.LowerCaseFilterFactory"/>
  15. </analyzer>
  16. </fieldType>
  17. </types>

4.2配置索引字段,也就是field

其中有个动态类型字段,attr_*,这个是什么意思呢。也就是solr在解析文件的时候,文件本身有很多属性,具体有哪些属性是不确定的,solr全部把他解析出来以attr作为前缀加上文件本身的属性名,组合在一起就成了field的名称

[html] view
plain
copySolr4.7从文件创建索引Solr4.7从文件创建索引
  1. <field name="id"        type="string"       indexed="true"  stored="true"  multiValued="false" required="true"/>
  2. <field name="text"      type="text_general" indexed="true"  stored="true"/>
  3. <field name="_version_" type="long"         indexed="true"  stored="true"/>
  4. <dynamicField name="attr_*" type="text_general" indexed="true" stored="true" multiValued="true"/>

到这里solr服务端的配置以及完成了。

二、solrj测试

1、  需要的jar

Solr4.7从文件创建索引

Maven配置

[html] view
plain
copySolr4.7从文件创建索引Solr4.7从文件创建索引
  1. <dependency>
  2. <groupId>org.apache.solr</groupId>
  3. <artifactId>solr-solrj</artifactId>
  4. <version>4.7.0</version>
  5. <scope>test</scope>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.apache.httpcomponents</groupId>
  9. <artifactId>httpclient</artifactId>
  10. <version>4.3.2</version>
  11. <scope>test</scope>
  12. </dependency>

2、 测试类CreateIndexFromPDF.java

Solrj4.7里面ContentStreamUpdateRequest的addFile方法多了一个contentType参数,指明内容类型。ContentType请参看:http://baike.baidu.com/link?url=panQQa04z0gc4-gQRnIoUhwOQPABfG6unIqE1-7SEe5ZMygYxWT2lkvoKlQmTEYIZDNhntB4T9aGQM5KhevKDa

[java] view
plain
copySolr4.7从文件创建索引Solr4.7从文件创建索引
  1. package com.clj.test.solr.solrj;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import org.apache.solr.client.solrj.SolrQuery;
  5. import org.apache.solr.client.solrj.SolrServer;
  6. import org.apache.solr.client.solrj.SolrServerException;
  7. import org.apache.solr.client.solrj.impl.HttpSolrServer;
  8. import org.apache.solr.client.solrj.request.AbstractUpdateRequest;
  9. import org.apache.solr.client.solrj.request.ContentStreamUpdateRequest;
  10. import org.apache.solr.client.solrj.response.QueryResponse;
  11. /**
  12. * 从PDF创建索引
  13. * <功能详细描述>
  14. *
  15. * @author  Administrator
  16. * @version  [版本号, 2014年3月18日]
  17. * @see  [相关类/方法]
  18. * @since  [产品/模块版本]
  19. */
  20. public class CreateIndexFromPDF
  21. {
  22. public static void main(String[] args)
  23. {
  24. String fileName = "e:/MyBatis3用户指南中文版.pdf";
  25. String solrId = "MyBatis3用户指南中文版.pdf";
  26. try
  27. {
  28. indexFilesSolrCell(fileName, solrId);
  29. }
  30. catch (IOException e)
  31. {
  32. e.printStackTrace();
  33. }
  34. catch (SolrServerException e)
  35. {
  36. e.printStackTrace();
  37. }
  38. }
  39. /** 从文件创建索引
  40. * <功能详细描述>
  41. * @param fileName
  42. * @param solrId
  43. * @see [类、类#方法、类#成员]
  44. */
  45. public static void indexFilesSolrCell(String fileName, String solrId)
  46. throws IOException, SolrServerException
  47. {
  48. String urlString = "http://localhost:8080/solr/core1";
  49. SolrServer solr = new HttpSolrServer(urlString);
  50. ContentStreamUpdateRequest up = new ContentStreamUpdateRequest("/update/extract");
  51. String contentType="application/pdf";
  52. up.addFile(new File(fileName), contentType);
  53. up.setParam("literal.id", solrId);
  54. up.setParam("uprefix", "attr_");
  55. up.setParam("fmap.content", "attr_content");
  56. up.setAction(AbstractUpdateRequest.ACTION.COMMIT, true, true);
  57. solr.request(up);
  58. QueryResponse rsp = solr.query(new SolrQuery("*:*"));
  59. System.out.println(rsp);
  60. }
  61. }

执行上面代码,便把我们的pdf文件上传到solr服务器,解析、创建索引,后面的solr.query是执行一个查询,查询解析索引后结果。解析后pdf就变成了纯文本的内容,在控制台可以看到很多文档其他信息。

Solr解析完pdf、创建索引后,我们也可以在solr的管理界面查看索引结果。Core1s就是我们新建的文件索引库。如下图。

Solr4.7从文件创建索引

Solr4.7从文件创建索引的更多相关文章

  1. Solr 从文件创建索引

    http://blog.csdn.net/clj198606061111/article/details/21492457 http://wiki.apache.org/solr/Extracting ...

  2. lucene 建立索引的不同方式

    1.创建一个简单的索引: package lia.meetlucene; import java.io.File; import org.apache.lucene.document.Document ...

  3. Lucene&period;Net无障碍学习和使用:索引篇

    一.简单认识索引 Lucene.Net的应用相对比较简单.一段时间以来,我最多只是在项目中写点代码,利用一下它的类库而已,对很多名词术语不是很清晰,甚至理解 可能还有偏差.从我过去的博客你也可以看出, ...

  4. windows索引服务

        windows索引服务是windows操作系统提供的桌面搜索引擎,通过预先创建索引来提高对硬盘上文件内容的搜索速度.以windows服务程序的方式运行. 一.工作方式 1.对指定路径下的文件创 ...

  5. Linux下的压缩和解压缩命令——jar

    原文链接:http://blog.chinaunix.net/uid-692788-id-2681136.htmlJAR包是Java中所特有一种压缩文档,其实大家就可以把它理解为.zip包.当然也是有 ...

  6. MongoDB常用命令

    本文整理了一年多以来我常用的MongoDB操作,涉及mongo-shell.pymongo,既有运维层面也有应用层面,内容有浅有深,这也就是我从零到熟练的历程. MongoDB的使用之前也分享过一篇, ...

  7. jar命令的用法详解

    本文详细讲述了JAR命令的用法,对于大家学习和总结jar命令的使用有一定的帮助作用.具体如下: JAR包是Java中所特有一种压缩文档,其实大家就可以把它理解为.zip包.当然也是有区别的,JAR包中 ...

  8. &period;bat文件和Jar包的生成及运行

    .bat文件和Jar包的生成及运行 1.Jar包简单介绍 Jar包是Java中所特有的一种压缩文档,有点类似于zip包,区别在于Jar包中有一个META-INF\MANIFEST.MF文件(在生成Ja ...

  9. MongoDB使用小结:一些常用操作分享

    本文整理了一年多以来我常用的MongoDB操作,涉及mongo-shell.pymongo,既有运维层面也有应用层面,内容有浅有深,这也就是我从零到熟练的历程. MongoDB的使用之前也分享过一篇, ...

随机推荐

  1. 影响google PageRank的因素

    1 与pr高的网站做链接: 2 内容质量高的网站链接 3 加入搜索引擎分类目录 4 加入免费开源目录 5 你的链接出现在流量大.知名度高.频繁更新的重要网站上 6 google对PDF格式的文件比较看 ...

  2. Html做三个平台原生APP啦

    DeviceOne之前介绍过了,现在来介绍一下DeviceOne快速开发到什么程度 使用js只需要5分钟就可以打出垮Android.ios.windows三大平台的纯原生UI的安装包. 只需要6个小时 ...

  3. 提升效率&lpar;时间准确性&rpar;,减少时间和资源的消耗——由89C52&sol;89C51的定时器中断引出的一些问题

    尽量用最少的文字描述清楚问题. 事情起因是这样的: 要做遥控小车的平台迁移,STM32开发板无法方便地供电,因此又拿出了尘封的51(STC89C52RC),搭配上最小系统板就可以用排针加杜邦线供电了. ...

  4. LNMP安装了哪些软件?安装目录在哪?

    LNMP官网:http://lnmp.org/faq/lnmp-software-list.html LNMP一键安装包除去安装所必须的依赖包,还会默认安装以下软件: Nginx.MySQL/Mari ...

  5. yii中的自定义组件

    yii中的自定义组件(组件就是一些自定义的公用类) 1.在项目目录中的protected/components/Xxxx.php 2.在Xxxx.php中定义一个类,类名必须与文件名相同 3.控制器中 ...

  6. linux学习笔记之IO

    一.基础知识. 1:普通IO类型. 1,非阻塞IO:发出open/read/write等IO操作,并使这些操作不会永远阻塞.当不能完成时,会立即出错返回. 1)非阻塞的两种标志方式:指定标志:O_NO ...

  7. Python map多线程

    import os import PIL from multiprocessing import Pool from PIL import Image SIZE = (75,75) SAVE_DIRE ...

  8. (转)python中的&ast;args和&ast;&ast;kw到底是个啥。看下面的例子就会懂了

    先来看个例子: def foo(*args, **kwargs): print 'args = ', args print 'kwargs = ', kwargs print '----------- ...

  9. 关于Java中String类的hashCode方法

    首先来看一下String中hashCode方法的实现源码 public int hashCode() { int h = hash; if (h == 0 && value.lengt ...

  10. 转 What is Redis and what do I use it for&quest;

    原文: http://*.com/questions/7888880/what-is-redis-and-what-do-i-use-it-for Redis = Remote ...