热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Lucene介绍与简单应用

(一)数据相关1.1数据分类可以将数据大致分为两种:结构化数据和非结构化数据。结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。非结构化数据:

(一)数据相关

1.1数据分类

可以将数据大致分为两种:结构化数据和非结构化数据。

结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。
非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等磁盘上的文件。

1.2非结构化数据查询方法

关于非结构化数据查询方法,这里主要介绍两种:顺序扫描法与全文检索算法。

顺序扫描法(Serial Scanning)

比如要查找内容是包含某一字符串的文件,会查看所有文档,对于每一个文档,从头到尾进行比对,如果此文档包含此字符串,则该文档为我们要找的文件。接着看下一个文件,直到扫描完所有的文件,这种方式的查找方法使用的就是顺序扫描算法。比如平时我们使用的windows 搜索,只要搜索的文件存在一定会搜索到,只是速度相当慢。

全文检索(Full-text Search)

将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。这部分从非结构化数据中提取出的然后重新组织的信息,称之索引。这种先建立索引,再对索引进行搜索的过程就叫全文检索。

(二)Lucene 登场

2.1Lucene 简介

Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache 下的一个开源项目。也是目前最为流行的基于 Java 开源全文检索工具包。
Lucene 的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能。

Lucene 采用的是一种称为反向索引(inverted index)的机制。反向索引就是说我们维护了一个词 / 短语表,对于这个表中的每个词 / 短语,都有一个链表描述了有哪些文档包含了这个词 / 短语。这样在用户输入查询条件的时候,就能非常快的得到搜索结果。

2.2Lucene 应用场景

  • 互联网检索引擎。比如百度、Google 等。
  • 站内全文检索引擎。比如淘宝、京东等。

2.3搜索流程和创建索引
这里写图片描述

获取原始内容的目的是为了创建索引,在索引前需要将原始内容创建成文档(Document),文档中包括一个一个的域(Field),域中存储内容。每个Document可以有多个Field,不同的Document 可以有不同的Field,同一个Document 可以有相同的Field(域名和域值都相同)。
这里写图片描述
将原始内容创建为包含域(Field)的文档(document),需要再对域中的内容进行分析,分析的过程是经过对原始文档提取单词、将字母转为小写、去除标点符号、去除停用词等过程生成最终的语汇单元,可以将语汇单元理解为简单的单词。

每个单词叫做一个Term,不同的域中拆分出来的相同的单词是不同的Term。Term中包含两部分:一部分是文档的域名,另一部分是单词的内容。

对所有文档分析得出的语汇单元进行索引,索引的目的是为了搜索,最终要实现只搜索被索引的语汇单元,从而找到对应Document(文档)。

对原始内容建立好索引后,就可以在这些索引上面进行搜索了。搜索引擎首先会对搜索的关键词进行解析,然后在建立好的索引库上面进行查找,最终返回和用户输入的关键词相关联的文档。

(三)Lucene 简单使用

3.1环境准备

这里我使用了Lucene 最新版本7.× 的jar 包,随着Lucene 版本的更新,其中一些类的使用方法也发生了变化,这里就不作具体介绍了。推荐一篇博文:从Lucene 4.10.3到Lucene 7.1.0:带你了解版本之间的些许差异,讲述了一些版本上的变化差异,有兴趣的话可以点击查看。

使用jar 包截图:
这里写图片描述
要搜索的文件:
这里写图片描述

Lucene 各个版本下载地址:http://archive.apache.org/dist/lucene/java/
使用jar 包下载地址:http://download.csdn.net/download/codejas/10272440

3.2代码实现

indexCreateTest()方法创建索引

    @Test
    public void indexCreateTest() throws Exception{
        // 创建文档列表,保存多个Docuemnt
        List docList = new ArrayList<>();
        // 指定文件所在目录
        File dir = new File("E:\\lucene\\test");

        // 循环文件夹取出文件
        for(File file : dir.listFiles()){
            // 获取文件名称
            String fileName = file.getName();
            // 获取文件内容
            String fileCOntext= FileUtils.readFileToString(file);
            // 获取文件大小
            Long fileSize = FileUtils.sizeOf(file);
            // 创建文档对象,文件系统中的一个文件就是一个Docuemnt对象
            Document doc = new Document();
            // 第一个参数:域名;第二个参数:域值;第三个参数:是否存储
            TextField nameFiled = new TextField("fileName", fileName, Store.YES);
            TextField cOntextFiled= new TextField("fileContext", fileContext, Store.YES);
            TextField sizeFiled = new TextField("fileSize", fileSize.toString(), Store.YES);

            // 将所有的域都存入文档中
            doc.add(nameFiled);
            doc.add(contextFiled);
            doc.add(sizeFiled);

            // 将文档存入文档集合中
            docList.add(doc);
        }

        File file = new File("E:\\lucene\\index");
        // 指定索引和文档存储的目录
        FSDirectory directory = FSDirectory.open(file.toPath());
        // 创建写对象的初始化对象
        IndexWriterConfig cOnfig= new IndexWriterConfig();
        // 创建索引和文档写对象
        IndexWriter indexWriter = new IndexWriter(directory, config);

        // 将文档加入到索引和文档的写对象中
        for(Document doc : docList){
            indexWriter.addDocument(doc);
        }

        // 提交
        indexWriter.commit();
        // 关闭流
        indexWriter.close();
    }

执行后,在本地磁盘的E:\lucene\index目录下,会有一些文件,包含了索引和对应文档存储。
这里写图片描述
indexSearchTest()方法查询索引

    @Test
    public void indexSearchTest() throws Exception{
        // 创建分词器(创建索引和所有时所用的分词器必须一致,创建索引默认使用的是StandardAnalyzer)
        Analyzer analyzer = new StandardAnalyzer();
        // 创建查询对象,第一个参数:默认搜索域, 第二个参数:分词器
        // 默认搜索域作用:如果搜索语法中指定域名从指定域中搜索,当搜索时只写了查询关键字,则从默认搜索域中进行搜索
        QueryParser queryParser = new QueryParser("fileContext", analyzer);
        // 查询语法=域名:搜索的关键字
        Query query = queryParser.parse("fileName:java");
        File file = new File("E:\\lucene\\index");
        // 指定索引和文档的目录
        Directory dir = FSDirectory.open(file.toPath());
        // 索引和文档的读取对象
        IndexReader indexReader = StandardDirectoryReader.open(dir);
        // 创建索引的搜索对象
        IndexSearcher indexSearcher = new IndexSearcher(indexReader);
        // 搜索:第一个参数为查询语句对象, 第二个参数:指定显示多少条
        TopDocs topdocs = indexSearcher.search(query, 5);
        // 从搜索结果对象中获取结果集
        ScoreDoc[] scoreDocs = topdocs.scoreDocs;

        // 一共搜索到多少条记录
        System.out.println("=====count = " + topdocs.totalHits +"=====");

        for(ScoreDoc scoreDoc : scoreDocs){
            // 获取docID
            int docID = scoreDoc.doc;
            // 通过文档ID从硬盘中读取出对应的文档
            Document document = indexReader.document(docID);
            // get域名可以取出值 打印
            System.out.println("fileName:" + document.get("fileName"));
            System.out.println("fileSize:" + document.get("fileSize"));
            System.out.println("=====================================");
        }
    }

     /** * 输出 * =====count = 3===== * fileName:Java GUC.txt * fileSize:1331 * ===================================== * fileName:Java NIO.txt * fileSize:1634 * ===================================== * fileName:Java 8.txt * fileSize:191 * ===================================== */

(四)总结

这篇博文主要介绍了Lucene 的一些相关的基本概念以及其创建索引与搜索过程,并通过一个简单的例子体会到了Lucene 的强大之处。希望这篇博文能够为学习 Lucene 的读者提供帮助。

参考博文:
https://www.ibm.com/developerworks/cn/java/j-lo-lucene1/index.html


推荐阅读
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • Jboss的EJB部署描述符standardjaws.xml配置步骤详解
    本文详细介绍了Jboss的EJB部署描述符standardjaws.xml的配置步骤,包括映射CMP实体EJB、数据源连接池的获取以及数据库配置等内容。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • 使用freemaker生成Java代码的步骤及示例代码
    本文介绍了使用freemaker这个jar包生成Java代码的步骤,通过提前编辑好的模板,可以避免写重复代码。首先需要在springboot的pom.xml文件中加入freemaker的依赖包。然后编写模板,定义要生成的Java类的属性和方法。最后编写生成代码的类,通过加载模板文件和数据模型,生成Java代码文件。本文提供了示例代码,并展示了文件目录结构。 ... [详细]
  • android ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • Maven构建Hadoop,
    Maven构建Hadoop工程阅读目录序Maven安装构建示例下载系列索引 序  上一篇,我们编写了第一个MapReduce,并且成功的运行了Job,Hadoop1.x是通过ant ... [详细]
  • 在工作中,遇到需要将excel表中的特定数据提取出来,并将数据以键值对的形式存储到map集合中。因为我用的是maven管理的jar包,所 ... [详细]
author-avatar
Eva绫波_772
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有