Lucene就是这么简单(二)

简介: Lucene是apache软件基金会发布的一个开放源代码的全文检索引擎工具包,由资深全文检索专家Doug Cutting所撰写,它是一个全文检索引擎的架构,提供了完整的创建索引和查询索引,以及部分文本分析的引擎,Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎,Lucene在全文检索领域是一个经典的祖先,现在很多检索引擎都是在其基础上创建的,思想是相通的。

创建索引库的步骤:

  • 1)创建JavaBean对象
  • 2)创建Docment对象
  • 3)将JavaBean对象所有的属性值,均放到Document对象中去,属性名可以和JavaBean相同或不同
  • 4)创建IndexWriter对象
  • 5)将Document对象通过IndexWriter对象写入索引库中
  • 6)关闭IndexWriter对象


@Test
    public void createIndexDB() throws Exception {
        //把数据填充到JavaBean对象中
        User user = new User("1", "钟福成", "未来的程序员");
        //创建Document对象【导入的是Lucene包下的Document对象】
        Document document = new Document();
        //将JavaBean对象所有的属性值,均放到Document对象中去,属性名可以和JavaBean相同或不同
        /**
         * 向Document对象加入一个字段
         * 参数一:字段的关键字
         * 参数二:字符的值
         * 参数三:是否要存储到原始记录表中
         *      YES表示是
         *      NO表示否
         * 参数四:是否需要将存储的数据拆分到词汇表中
         *      ANALYZED表示拆分
         *      NOT_ANALYZED表示不拆分
         *
         * */
        document.add(new Field("id", user.getId(), Field.Store.YES, Field.Index.ANALYZED));
        document.add(new Field("userName", user.getUserName(), Field.Store.YES, Field.Index.ANALYZED));
        document.add(new Field("sal", user.getSal(), Field.Store.YES, Field.Index.ANALYZED));
        //创建IndexWriter对象
        //目录指定为E:/createIndexDB
        Directory directory = FSDirectory.open(new File("E:/createIndexDB"));
        //使用标准的分词算法对原始记录表进行拆分
        Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
        //LIMITED默认是1W个
        IndexWriter.MaxFieldLength maxFieldLength = IndexWriter.MaxFieldLength.LIMITED;
        /**
         * IndexWriter将我们的document对象写到硬盘中
         *
         * 参数一:Directory d,写到硬盘中的目录路径是什么
         * 参数二:Analyzer a, 以何种算法来对document中的原始记录表数据进行拆分成词汇表
         * 参数三:MaxFieldLength mfl 最多将文本拆分出多少个词汇
         *
         * */
        IndexWriter indexWriter = new IndexWriter(directory, analyzer, maxFieldLength);
        //将Document对象通过IndexWriter对象写入索引库中
        indexWriter.addDocument(document);
        //关闭IndexWriter对象
        indexWriter.close();
    }

44.jpg这里写图片描述

程序执行完,我们就会在硬盘中见到我们的索引库。

45.jpg这里写图片描述


那我们现在是不知道记录是否真真正正存储到索引库中的,因为我们看不见。索引库存放的数据放在cfs文件下,我们也是不能打开cfs文件的

于是,我们现在用一个关键字,把索引库的数据读取。看看读取数据是否成功。

根据关键字查询索引库中的内容:

  • 1)创建IndexSearcher对象
  • 2)创建QueryParser对象
  • 3)创建Query对象来封装关键字
  • 4)用IndexSearcher对象去索引库中查询符合条件的前100条记录,不足100条记录的以实际为准
  • 5)获取符合条件的编号
  • 6)用indexSearcher对象去索引库中查询编号对应的Document对象
  • 7)将Document对象中的所有属性取出,再封装回JavaBean对象中去,并加入到集合中保存,以备将之用


@Test
    public void findIndexDB() throws Exception {
        /**
         * 参数一: IndexSearcher(Directory path)查询以xxx目录的索引库
         *
         * */
        Directory directory = FSDirectory.open(new File("E:/createIndexDB"));
        //创建IndexSearcher对象
        IndexSearcher indexSearcher = new IndexSearcher(directory);
        //创建QueryParser对象
        /**
         * 参数一: Version matchVersion 版本号【和上面是一样的】
         * 参数二:String f,【要查询的字段】
         * 参数三:Analyzer a【使用的拆词算法】
         * */
        Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
        QueryParser queryParser = new QueryParser(Version.LUCENE_30, "userName", analyzer);
        //给出要查询的关键字
        String keyWords = "钟";
        //创建Query对象来封装关键字
        Query query = queryParser.parse(keyWords);
        //用IndexSearcher对象去索引库中查询符合条件的前100条记录,不足100条记录的以实际为准
        TopDocs topDocs = indexSearcher.search(query, 100);
        //获取符合条件的编号
        for (int i = 0; i < topDocs.scoreDocs.length; i++) {
            ScoreDoc scoreDoc = topDocs.scoreDocs[i];
            int no = scoreDoc.doc;
            //用indexSearcher对象去索引库中查询编号对应的Document对象
            Document document = indexSearcher.doc(no);
            //将Document对象中的所有属性取出,再封装回JavaBean对象中去
            String id = document.get("id");
            String userName = document.get("userName");
            String sal = document.get("sal");
            User user = new User(id, userName, sal);
            System.out.println(user);
        }

46.jpg这里写图片描述

效果:

47.png这里写图片描述



1.3进一步说明Lucene代码


我们的Lucene程序就是大概这么一个思路:将JavaBean对象封装到Document对象中,然后通过IndexWriter把document写入到索引库中。当用户需要查询的时候,就使用IndexSearcher从索引库中读取数据,找到对应的Document对象,从而解析里边的内容,再封装到JavaBean对象中让我们使用

48.jpg这里写图片描述


二、对Lucene代码优化


我们再次看回我们上一篇快速入门写过的代码,我来截取一些有代表性的:

以下代码在把数据填充到索引库,和从索引库查询数据的时候,都出现了。是重复代码

Directory directory = FSDirectory.open(new File("E:/createIndexDB"));
        //使用标准的分词算法对原始记录表进行拆分
        Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);

以下的代码其实就是将JavaBean的数据封装到Document对象中,我们是可以通过反射来对其进行封装….如果不封装的话,我们如果有很多JavaBean都要添加到Document对象中,就会出现很多类似的代码。

document.add(new Field("id", user.getId(), Field.Store.YES, Field.Index.ANALYZED));
        document.add(new Field("userName", user.getUserName(), Field.Store.YES, Field.Index.ANALYZED));
        document.add(new Field("sal", user.getSal(), Field.Store.YES, Field.Index.ANALYZED));

以下代码就是从Document对象中把数据取出来,封装到JavaBean去。如果JavaBean中有很多属性,也是需要我们写很多次类似代码….

//将Document对象中的所有属性取出,再封装回JavaBean对象中去
            String id = document.get("id");
            String userName = document.get("userName");
            String sal = document.get("sal");
             User user = new User(id, userName, sal);
目录
相关文章
|
分布式计算 Java Apache
Flink问题之本地集群报错如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
300 1
|
6月前
|
Linux 数据库
【赵渝强老师】达梦数据库的目录结构
本文介绍了达梦数据库(DM 8)安装成功后的目录结构查看方法,通过Linux的`tree`命令展示各目录功能,如`bin`存放可执行文件、`data`为数据库实例目录等。还提供了视频讲解及`data`目录下具体文件示例,帮助用户深入了解数据库文件组成与作用。
187 23
|
5月前
|
小程序 数据挖掘 索引
服务器数据恢复—双循环RAID5多盘掉线,数据恢复有妙招
一台服务器上共有10块硬盘,其中的7块硬盘组建了一组raid5磁盘阵列,另外3块硬盘是没有拔掉的掉线磁盘。 服务器raid5阵列中硬盘出现物理故障掉线,服务器崩溃。
|
9月前
|
SQL DataWorks 数据可视化
阿里云DataWorks评测:大数据开发治理平台的卓越表现
阿里云DataWorks是一款集数据集成、开发、分析与管理于一体的大数据平台,支持多种数据源无缝整合,提供可视化ETL工具和灵活的任务调度机制。其内置的安全体系和丰富的插件生态,确保了数据处理的高效性和安全性。通过实际测试,DataWorks展现了强大的计算能力和稳定性,适用于中小企业快速搭建稳定高效的BI系统。未来,DataWorks将继续优化功能,降低使用门槛,并推出更多灵活的定价方案,助力企业实现数据价值最大化。
|
7月前
|
缓存 NoSQL Linux
Linux系统内存使用优化技巧
交换空间(Swap)的优化 禁用 Swap sudo swapoff -a 作用:这个命令会禁用系统中所有的 Swap 空间。swapoff 命令用于关闭 Swap 空间,-a 参数表示关闭 /etc/fstab 文件中配置的所有 Swap 空间。 使用场景:在高性能应用场景下,比如数据库服务器或高性能计算服务器,禁用 Swap 可以减少磁盘 I/O,提高系统性能。
289 3
|
9月前
|
消息中间件 存储 安全
分布式系统架构3:服务容错
分布式系统因其复杂性,故障几乎是必然的。那么如何让系统在不可避免的故障中依然保持稳定?本文详细介绍了分布式架构中7种核心的服务容错策略,包括故障转移、快速失败、安全失败等,以及它们在实际业务场景中的应用。无论是支付场景的快速失败,还是日志采集的安全失败,每种策略都有自己的适用领域和优缺点。此外,文章还为技术面试提供了解题思路,助你在关键时刻脱颖而出。掌握这些策略,不仅能提升系统健壮性,还能让你的技术栈更上一层楼!快来深入学习,走向架构师之路吧!
225 12
|
测试技术 UED 开发者
软件测试的艺术与科学
在软件开发的舞台上,测试是确保质量的重要角色。它不仅需要严谨的科学方法,还蕴含着艺术般的创造力。本文将带你走进软件测试的世界,探索如何通过创造性思维和系统化方法来提升测试效果,保障软件产品的稳定性和可靠性。
113 27
|
缓存 NoSQL 数据库
Web服务器与数据库优化:提升系统性能的最佳实践
【8月更文第28天】在现代的Web应用中,Web服务器与后端数据库之间的交互是至关重要的部分。优化这些组件及其相互作用可以显著提高系统的响应速度、吞吐量和可扩展性。本文将探讨几种常见的优化策略,并提供一些具体的代码示例。
333 1
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之如何将STRING类型转换为DATETIME类型
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
244 1
|
机器学习/深度学习 自然语言处理 算法
面向电商家居行业3D室内场景合成中的空间感知(1)
面向电商家居行业3D室内场景合成中的空间感知
358 9