热门标签 | 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


推荐阅读
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • 微信公众号推送模板40036问题
    返回码错误码描述说明40001invalidcredential不合法的调用凭证40002invalidgrant_type不合法的grant_type40003invalidop ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 本教程详细介绍了如何使用 Spring Boot 创建一个简单的 Hello World 应用程序。适合初学者快速上手。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 全面升级的中文PubMed——Medreading
    Medreading 是一款由科研者之家(HOME for Researchers)推出的中文版PubMed,提供强大的文献检索和分析功能,支持AI辅助全文下载。 ... [详细]
  • Python 3 Scrapy 框架执行流程详解
    本文详细介绍了如何在 Python 3 环境下安装和使用 Scrapy 框架,包括常用命令和执行流程。Scrapy 是一个强大的 Web 抓取框架,适用于数据挖掘、监控和自动化测试等多种场景。 ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文详细介绍了在CentOS 6.5 64位系统上使用阿里云ECS服务器搭建LAMP环境的具体步骤。首先,通过PuTTY工具实现远程连接至服务器。接着,检查当前系统的磁盘空间使用情况,确保有足够的空间进行后续操作,可使用 `df` 命令进行查看。此外,文章还涵盖了安装和配置Apache、MySQL和PHP的相关步骤,以及常见问题的解决方法,帮助用户顺利完成LAMP环境的搭建。 ... [详细]
  • 本文深入探讨了如何利用Maven高效管理项目中的外部依赖库。通过介绍Maven的官方依赖搜索地址(),详细讲解了依赖库的添加、版本管理和冲突解决等关键操作。此外,还提供了实用的配置示例和最佳实践,帮助开发者优化项目构建流程,提高开发效率。 ... [详细]
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社区 版权所有