`
longgangbai
  • 浏览: 7330957 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SpringLuence的学习总结(一)

阅读更多

          在最近,看了一下SpringLuence的源代码,学习关于搜索引擎的设计思路:

    首先关于搜索引擎的两个主要操作为:

    1.建立索引文档

    2.搜索查找信息

 创建索引文档,必须针对不同的文档,获取各种文档的内容,建立文档的信息。

关于建立索引文档的方法请看Luence的基础。

这里主要说一下关于Luence设计的思路。

无论任何文档都可以转换为输入流对象,然后获取文件的内容。

关于文档处理器的接口设计如下:

DocumentHandler

 

源代码如下:

public interface DocumentHandler {

 /**
  * Return whether or not this object can create a document from an
  * instance of the given class. 检测一个对象是否可以创建一个索引文档对象
  */
 boolean supports(Class clazz);
 
 /**
  * This method indexes an object and specifies some additional
  * properties on the Lucene document basing the description parameter.
  *
  * The object to index can be either a POJO or a stream on a resource.
  *
  * @param description the description of the resource to index  Map中存储索引文档的中索引的字段用于建立索引文档时使用
  * @param inputStream the input stream which will be used to index  此处的Object可以时POJO或stream
  */
 Document getDocument(Map description, Object object) throws Exception;
}

 

Document getDocument(Map description, Object object) throws Exception;

此处设置此方法中Object目的为创建索引文档的几种对象不同而设置:

 

 

在SpringLuence中创建索引文档的方式由三种:

1.根据一个流对象创建一个索引文档

2.根据数据库中的对象创建一个索引文档。

3.根据一个类使用反射创建一个索引文档。

 

 

关于一个流创建索引文档的:

其中在各种文档创建文档中,所有的文档处理类继承自抽象输入类文档处理器:AbstractInputStreamDocumentHandler

 

创建一个抽象的类的AbstractInputStreamDocumentHandler用于处理各种文件类型的的

处理器:AbstractTypeFileDocumentHandler

//用于获取文档的独享

 public final Document doGetDocumentWithInputStream(Map description, InputStream inputStream) throws IOException {


  Document document = new Document();
//获取文档的对象

  String text = extractText(inputStream);
  if( text!=null && text.length()>0 ) {
   //The text is analyzed and indexed but not stored
   document.add(new Field("contents", text, Field.Store.NO, Field.Index.TOKENIZED));
  }
  if( description.get(AbstractInputStreamDocumentHandler.FILENAME)!=null ) {
   document.add(new Field("type", "file", Field.Store.YES, Field.Index.UN_TOKENIZED));
   document.add(new Field("filename", (String)description.get(AbstractInputStreamDocumentHandler.FILENAME), Field.Store.YES, Field.Index.UN_TOKENIZED));
  }
  return document;
 }

 

 

 以下各种处理器用于处理各种类型的文档

其中txt文件类型时Luence 默认的 文件处理类型,可以直接得到文档的内容。

 

(1)关于txt文本文件处理方式如下:

protected Document doGetDocumentWithInputStream(Map description,InputStream inputStream) {
//创建一个索引文档对象  

Document document = new Document();

 //将文本文件的内容放入一个context的文档域中在使用可以根据索引域的名称获取文本文件的内容
  document.add(new Field("contents", new InputStreamReader(inputStream)));


  if( description.get(FILENAME)!=null ) {
  //添加文件类型的索引域

   document.add(new Field("type", "file", Field.Store.YES, Field.Index.UN_TOKENIZED));

   document.add(new Field("filename", (String)description.get(FILENAME), Field.Store.YES,  Field.Index.UN_TOKENIZED));


  }
  return document;
 }

 

有Luence基础可以知道在创建索引文档中索引域时必须采用适当的域对象,不然效率可能很低,o(∩_∩)o...哈哈。

 

(2)关于RTF格式的富文本文档。

RTF不可以直接使用输入流对象必须进行处理。方可以得到RTF中内容信息。

由Java Swing 编程的开发人员一般知道一个简便处理RTF富文本类型的工具:

使用SWing中DefaultStyledDocument,RTFEditorKit类轻易解决问题。

 

处理方法如下:先将rtf文档转换为输入流inputstream,使用SWing工具处理。

 //创建样式文档对象

DefaultStyledDocument styledDoc = new DefaultStyledDocument();
 //RTF编辑工具处理文件的内容

new RTFEditorKit().read(inputStream, styledDoc, 0);

   //获取文档的内容信息
String rtfContext=styledDoc.getText(0, styledDoc.getLength());

 

(3)关于Excel的处理方式比较多:使用开源组件处理如Jxl,POI等处理,即可

这里采用的jxl处理的方式:

使用jxl代码如下:

 //创建一个工作簿对象

Workbook workbook=Workbook.getWorkbook(inputStream);

 //获取并遍历每一个工作单中
   for(int cpt = 0; cpt<workbook.getNumberOfSheets(); cpt++) {
    Sheet sheet = workbook.getSheet(cpt);

         //获取遍历每行中信息

          for(int cptRow = 0; cptRow<sheet.getRows(); cptRow++) {

                //获取并遍历每列中的信息
   for(int cptColumn = 0; cptColumn<sheet.getColumns(); cptColumn++) {

  //获取每列的信息
    Cell cell = sheet.getCell(cptColumn,cptRow);
    String cellText = cell.getContents();
    if( cellText!=null && cellText.length()>0 ) {
     appendText(text, cellText);
    }
   }
  }

(4) PDF文档的处理器设计:

针对PDF的处理器,最好使用PDFBox这个组件,因为这个组件中封装累了关于索引文档对象。如果使用POI,就需要非很
     多时间了。

采用PDFBox的LucenePDFDocument对象即可如下:

Document doc=LucenePDFDocument.getDocument(inputStream);

 

 

(5)WORD的文档的处理方式:使用textmining的组件即可 tx-extractors.jar解析或者使用POI解析都比较简单。

使用 tx-extractors.jar解析如下:

将doc文档设置成流对象从流中读取信息。

 WordExtractor wordDocument = new WordExtractor();
  String text = wordDocument.extractText(inputStream);

 

 

分享到:
评论

相关推荐

    基于Springboot的实验报告系统源码数据库文档.zip

    基于Springboot的实验报告系统源码数据库文档.zip

    ERA5_Climate_Single_Month.txt

    GEE训练教程——Landsat5、8和Sentinel-2、DEM和各2哦想指数下载

    基于springboot智能健康饮食系统源码数据库文档.zip

    基于springboot智能健康饮食系统源码数据库文档.zip

    基于SpringBoot的校园服务系统源码数据库文档.zip

    基于SpringBoot的校园服务系统源码数据库文档.zip

    史上最全IXIA测试仪配置使用指导手册(含IxNetwork,图文并茂超详细!).zip

    内容概要: IXIA测试仪的基本配置.doc ixia测试仪基础使用示例.doc IxNetwork如何进行抓包回放-V1.0.pdf IxNetwork如何自定义报文-V2.0.pdf ixia构造ip分片方法.txt IxNetwork使用简介.pdf 适用人群:网络协议造包、打流相关的测试工程技术人员,想要学习的同学可以下载哈 使用场景:构造pcap包,打流 Ixia简介 IXIA使用的是Server-client模式,Server端在测试仪表的主机上,在开机后会随着主机内的操作系统的启动而自动启动,一般情况下不需要人为的手工启动。因此在通常不需要为主机配置专用的显示器和键盘。 client端包括两个测试软件: Ixia Explorer和ScriptMate。这两个软件一般安装在测试用计算机上,在仪表自带的主机中也有这两个软件。根据测试项目的不同来选择使用不同的软件。Ixia Explorer主要提供数据流的测试,针对设备的功能进行测试; ScriptMate提供各种性能测试窗口,针对设备的性能进行测试。 Auto:自动分配;

    基于Python+Django花卉商城系统源码数据库文档.zip

    基于Python+Django花卉商城系统源码数据库文档.zip

    Umi-OCR-main.zip

    Umi-OCR-main.zip

    微信小程序源码-促销抽奖.zip

    基于微信小程序开发的促销抽奖小工具源码,适用于初学者了解小程序开发过程以及简单抽奖工具的实现。

    Sen2_median.txt

    GEE训练教程——Landsat5、8和Sentinel-2、DEM和各2哦想指数下载

    springboot的概要介绍与分析

    以下是一个关于Spring Boot设计的资源描述及项目源码的简要概述: Spring Boot设计资源描述 Spring Boot是一个为基于Spring的应用提供快速开发工具的框架,其设计旨在简化Spring应用的初始搭建和开发过程。以下是一些关键资源: Spring Boot官方文档:详细阐述了Spring Boot的核心特性、自动配置原理、起步依赖、内嵌式服务器等关键概念。这是学习和掌握Spring Boot设计的首选资源。 在线教程与视频:各大在线教育平台提供了丰富的Spring Boot教程和视频课程,从基础入门到高级应用,帮助开发者全面了解和掌握Spring Boot设计。 书籍与电子资料:许多技术书籍和在线电子资料深入讲解了Spring Boot的设计原理、最佳实践和项目案例,为开发者提供了宝贵的学习资源。 项目源码示例 以下是一个简单的Spring Boot项目源码示例,用于演示Spring Boot的基本结构和自动配置功能: java // 引入Spring Boot依赖 @SpringBootApplication public class MySpri

    基于springboot美妆领域管理系统源码数据库文档.zip

    基于springboot美妆领域管理系统源码数据库文档.zip

    tables-3.7.0+gpl-cp37-cp37m-win_amd64.whl

    tables-3.7.0+gpl-cp37-cp37m-win_amd64.whl

    算法实现的概要介绍与分析

    算法是计算机科学的核心,它们在解决各种问题时发挥着关键作用。一个好的算法不仅可以提高程序的效率,还可以简化复杂的问题。下面我将通过一个具体的例子——快速排序算法(Quick Sort)——来展示算法的实现过程,包括资源描述和项目源码。 ### 快速排序算法简介 快速排序是一种高效的排序算法,采用分治法的思想。其基本步骤如下: 1. 从数列中挑出一个元素,称为“基准”(pivot)。 2. 重新排序数列,所有比基准值小的元素放到基准前面,所有比基准值大的元素放到基准后面(相同的数可以到任一边)。在这个分割结束之后,该基准就处于数列的中间位置。这个称为分割(partition)操作。 3. 递归地(recursive)把小于基准值的子数列和大于基准值的子数列排序。 ### 资源描述 快速排序算法因其高效性和简洁性,在实际应用中非常受欢迎。它的时间复杂度平均为 O(n log n),最坏情况下为 O(n^2),但这种情况很少发生。快速排序的空间复杂度为 O(log n),因为它使用了递归来实现。 快速排序的一个典型应用场景是在数据库系统中对大量数据进行排序。由于它的高效性,快速排序

    基于springboot农场投入品运营线上管理系统源码数据库文档.zip

    基于springboot农场投入品运营线上管理系统源码数据库文档.zip

    基于springboot个性化影院推荐系统源码数据库文档.zip

    基于springboot个性化影院推荐系统源码数据库文档.zip

    linux基础进阶笔记

    linux基础进阶笔记,配套视频:https://www.bilibili.com/list/474327672?sid=4493093&spm_id_from=333.999.0.0&desc=1

    微信自动抢红包动态库.zip程序资源学习资料参考

    小程序 微信自动抢红包动态库.zip程序资源学习资料参考

    iOS版微信抢红包插件(支持后台抢红包).zip

    小程序 iOS版微信抢红包插件(支持后台抢红包).zip

    经典-FPGA时序约束教程

    经典-FPGA时序约束教程

    基于springboot的智慧点餐系统源码数据库文档.zip

    基于springboot的智慧点餐系统源码数据库文档.zip

Global site tag (gtag.js) - Google Analytics