在java项目中如何使用Lucene搜索引擎(入门篇)

2023-10-29

什么是lucene?

就是一个简单的工具包,java语言特有的,做全文检索用的!

为什么不用数据库的模糊查询?两者都什么区别

1、模糊查询只适用于结构化数据(如数据库中存储的数据);非结构化数据就是文档  图片、音频等等

2、模糊查询速度慢

3、不准确;如果用模糊查询java 会搜索到javascript;

4、会根据相关度来给结果排序;模糊查询是根据字母排序;

5、模糊查询用于小型的软件系统;lucene是用于百度的

 

怎么用

 安装Lucene

Lucene是开发全文检索功能的工具包,从官方网站下载Lucene4.10.3,并解压。

官方网站:http://archive.apache.org/dist/lucene/java/4.10.4/

版本:lucene4.10.3

Jdk要求:1.7以上

现在很多的lucene都是8.0以上的版本,建议不要用那么高的版本,因为当你下载以后,放在项目中会报错,版本太高了!

 

下载lucene4.10.3版本以后,解压缩

获取以下三个jar包;这三个jar包在不同的位置,怎么找呢?看文件的名字lucene文件夹下面core文件夹里面有lucene-core-4.10.4.jar包

 

 入门篇

新建一个javaweb项目,把这三个jar包放在Lib文件夹里面;

然后,先开始一个入门级别的项目

1、在d盘新建两个文件夹 img、index;

2、img是放要检索的文件的,这个文件夹里面可以放多个.txt文本做测试,文本里面写不同的内容

3、index文件夹是放索引的位置,这个由代码生成;不用我们管

4、这个代码的流程是这样的

4.1  、给出要检索文件的路径Im和索引要存放的路径index

4.2、然后先创建索引,在执行查询功能

demo来袭

package cn.com.lucene;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class Hello {
    private static final String PATH_OF_FILE = "D:/img/";   // 待索引文件的目录
    private static final String PATH_OF_INDEX = "D:/index/"; // 存放索引文件的目录2
    /**
     * 测试时,要在D:/img/文件夹中准备几个包含内容的文件(比如txt格式的)
     * 然后先执行createIndex()方法,再执行searchFile()方法,最后观看控制台输出即可
     */
    public static void main(String[] args) {
        Hello h = new Hello();
        h.createIndex();
        h.searchFile();
    }
    private void createIndex() {
        Directory directory = null;//指定索引被保存的位置
        IndexWriter writer = null;//通过IndexWriter写索引
        Document doc = null;//我们索引的有可能是一段文本or数据库中的一张表
        try {
            // 这里是在硬盘上"D:/index/"文件夹中创建索引
            directory = FSDirectory.open(new File(PATH_OF_INDEX));
            // 这里通过IndexWriterConfig()构造方法的Version.LUCENE_41参数值指明索引所匹配的版本号,并使用了Lucene的标准分词器
            writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_41, new StandardAnalyzer(Version.LUCENE_41)));
            for (File file : new File(PATH_OF_FILE).listFiles()) {
                doc = new Document();
                doc.add(new Field("content", new FileReader(file)));
                doc.add(new Field("fileName", file.getName(), Field.Store.YES, Field.Index.NOT_ANALYZED));
                doc.add(new Field("filePath", file.getAbsolutePath(), Field.Store.YES, Field.Index.NOT_ANALYZED));
                writer.addDocument(doc);
            }
        }
        catch (Exception e) {
            System.out.println("创建索引的过程中遇到异常,堆栈轨迹如下");
            e.printStackTrace();
        }
        finally {
            if (null != writer) {
                try {
                    writer.close(); // IndexWriter在用完之后一定要关闭
                }
                catch (IOException ce) {
                    System.out.println("关闭IndexWriter时遇到异常,堆栈轨迹如下");
                    ce.printStackTrace();
                }
            }
        }
    }

    private String getContentFromFile(File myFile) {
        StringBuffer sb = new StringBuffer();
        if (!myFile.exists()) {
            return "";
        }
        try {
            BufferedReader in = new BufferedReader(new FileReader(myFile));
            String str;
            while ((str = in.readLine()) != null) {
                sb.append(str);
            }
            in.close();
        }
        catch (IOException e) {
            e.getStackTrace();
        }
        return sb.toString();
    }

    /**
     * 搜索文件
     * 
     * @see 1、创建Directory
     * @see 2、创建IndexReader
     * @see 3、根据IndexReader创建IndexSearcher
     * @see 4、创建搜索的Query
     * @see 5、根据searcher搜索并返回TopDocs
     * @see 6、根据TopDocs获取ScoreDoc对象
     * @see 7、根据searcher和ScoreDoc对象获取具体的Document对象
     * @see 8、根据Document对象获取需要的值
     * @see 9、关闭IndexReader
     */
    @SuppressWarnings("deprecation")
	private void searchFile() {
        IndexReader reader = null;
        try {
            reader = IndexReader.open(FSDirectory.open(new File(PATH_OF_INDEX)));
            IndexSearcher searcher = new IndexSearcher(reader);
            // 创建基于Parser搜索的Query,创建时需指定其"搜索的版本,默认搜索的域,分词器"....这里的域指的是创建索引时Field的名字
            QueryParser parser = new QueryParser(Version.LUCENE_41, "content", new StandardAnalyzer(Version.LUCENE_41));
            Query query = parser.parse("日本");       // 指定==>搜索域为content(即上一行代码指定的"content")中包含"java"的文档
            TopDocs tds = searcher.search(query, 10); // 第二个参数指定搜索后显示的条数,若查到5条则显示为5条,查到15条则只显示10条
            ScoreDoc[] sds = tds.scoreDocs;           // TopDocs中存放的并不是我们的文档,而是文档的ScoreDoc对象
            for (ScoreDoc sd : sds) {                   // ScoreDoc对象相当于每个文档的ID号,我们就可以通过ScoreDoc来遍历文档
                Document doc = searcher.doc(sd.doc);  // sd.doc得到的是文档的序号
                System.out.println(doc.get("fileName") + "[" + doc.get("filePath") + "]"); // 输出该文档所存储的信息
            }
        }
        catch (Exception e) {
            System.out.println("搜索文件的过程中遇到异常,堆栈轨迹如下");
            e.printStackTrace();
        }
        finally {
            if (null != reader) {
                try {
                    reader.close();
                }
                catch (IOException e) {
                    System.out.println("关闭IndexReader时遇到异常,堆栈轨迹如下");
                    e.printStackTrace();
                }
            }
        }
    }

}

 

解释代码专区



 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在java项目中如何使用Lucene搜索引擎(入门篇) 的相关文章

  • Stress-ng

    介绍如何在 Linux 系统上使用 stress ng 负载测试工具 产生 CPU 内存等资源满载的状况 stress ng stress ng 与旧的 stress 都可以用来产生系统负载 但新的 stress ng 功能较丰富 所以这里
  • C++入门(2/2)

    目录 一 内联函数 二 auto关键字 C 11 三 范围for 四 nullptr 一 内联函数 C 用inline修饰的函数 会在编译时在调用内联函数的地方展开 没有了函数调用建立栈帧的开销 内联函数提升程序运行的效率 对于一个短小的函
  • ubuntu解决连不上网问题(无网关篇)

    今天用ubuntu时发现系统连不上网了 可能是之前捣鼓虚拟机作为ftp服务器导致的 windows下ipconfig命令查看到虚拟机的默认网关是空的 知道了是ubuntu默认网关没配好的原因 参考了这篇博客 如下 1条消息 虚拟机ping不
  • 1 两数之和

    题目描述 给定一个整数数组 nums 和一个目标值 target 请你在该数组中找出和为目标值的那 两个 整数 并返回他们的数组下标 你可以假设每种输入只会对应一个答案 但是 数组中同一个元素不能使用两遍 示例 给定 nums 2 7 11
  • 2-27-Exploring Cross-Image Pixel Contrast for Semantic Segmentation(arxiv2021)有代码

    原文链接 http www myzaker com article 60348715b15ec0509c7170d3 在这篇论文中 研究者提出了一种新的 全监督语义分割训练范式 像素对比学习 强调利用训练集中 跨图像的像素 像素对应关系来学
  • 找最长公共子串

    题目 小明有两个字符串 可能包含空格 小明想找出其中最长的公共连续子串 希望你能帮助他 并输出其长度 输入描述 输入为两行字符串 可能包含空格 长度均小于等于50 输出描述 输出为一个整数 表示最长公共连续子串的长度 示例1 输入 abcd
  • vue使用vue-pdf

    效果 引入vue pdf npm install save vue pdf vue版本 vue 2 6 11 vue pdf 4 3 0 1 在使用页面引入 import pdf from vue pdf components 组件 sea
  • 【概念】为什么区块链被称为分布式数据库?举例讲解分布式数据库包会教程。区块链分布式数据库到底是什么?什么是分布式数据库?一千六百字讲清楚什么事分布式数据库。

    目录 前言 区块链是什么 为什么说是分布式数据库 去中心化 分布式网络 分布式数据库 前言 随着区块链慢慢走进大众视野 大家也能发现 网上许多教程都说区块链是分布式数据库 区块链技术是基于比特币应用提出的一个概念 他是一个融合了多种技术的一
  • FairMOT yolov5s转onnx

    代码 https github com ifzhang FairMOT 论文讲解参考 https blog csdn net weixin 42398658 article details 110873083 https www 163 c
  • Gradle 系列第二讲-android studio中的四个Gradle相关文件讲解

    在android studio中 我们创建一个android项目 会自动生成以下6个gradle的相关文件或文件夹 下面我们来依次全面解析这几个文件的内容和具体的作用 android project gradlew gradlew bat
  • 创建一个子窗口,MouseMove消息一直在触发的解决方法

    条件 在主窗口中 创建 create 一个Child属性的子窗口 在子窗口中使用MouseMove消息时 发现 该消息一直被触发 在domal一个Child属性的子窗口时却没有这个问题 为什么呢 原因在CWnd Create中WS POPU
  • DDL数据库及表的创建删除与使用

    Mysql gt DDL 一 DDL操作数据库 1 1查询 1 2创建数据库 1 3删除数据库 1 4使用数据库 二 DDL操作表 2 1查询表 2 2创建表 2 3数据类型 2 4删除表 2 5修改表 三 总结 一 DDL操作数据库 1
  • 隐私计算项目评估的“偏见”

    如何评估一个项目是不是值得投资 这件事情可能VC最有专业性 本文站在一线工作者的角度 阐述目前隐私计算项目的深浅 有些东西 一定是老百姓口中说出来的可能更贴近现实 做硬件的拼技术 荷兰ASML公司是全球最大的光刻机制造商 也是全球唯一可以提
  • Android+文本的查找和替换+可以对文本进行查找替换撤销等,基本实现了PC端.txt查找替换功能

    Android 文本的查找和替换 可以对文本进行查找替换撤销等 基本实现了PC端 txt查找替换功能 最近项目用到了类似PC端记事本查找替换功能 于是自己就写了一套算法 实现起来还是比较容易理解的 基于移动开发的文本查找替换功能 基本实现了
  • 基于单步的Map-Reduce的矩阵乘法

    基于单步的Map Reduce的矩阵乘法 矩阵的乘法只有在第一个矩阵的列数 column 和第二个矩阵的行数 row 相同时才有定义 一般单指矩阵乘积时 指的便是一般矩阵乘积 若A为i r矩阵 B为r j矩阵 则他们的乘积AB 有时记做A
  • 【云计算实验】基于OpenMP、CUDA、OpenCL、GPU并行计算实验

    前言 本文是之前做云计算实验整理的内容 借博客保存一下 使用不同方法对算法加速还是很有意思的 实验题目 自选一张图片 按照实验指南说明在jetson05节点上基于OpenMP和CUDA对图片进行边缘提取实验 记录梯度向量幅度的最小值和最大值
  • 应用编排与管理

    本节课程要点 需求来源 用例解读 操作演示以及架构设计 需求来源 背景问题 首先 我们来看一下背景问题 如下图所示 如果我们直接管理集群中所有的 Pod 应用 A B C 的 Pod 其实是散乱地分布在集群中 现在有以下的问题 首先 如何保
  • python unicode 标点范围_不同语言Unicode的编码范围

    我们常常会用到判断某个字符或者字符串是否包含中文 英文 特殊符号等等 这时候可以通过判断Unicode所在区间来确定某个字符所处类型 当然可以通过直接判断Unicode码 但是鉴于习惯 以下提供的是Unicode码对应的数字区间 毕竟字符的
  • 《MySQL实战45讲》读后感 03

    收获到的知识点 事务支持是在引擎层面实现的 但是并不是所有的引擎都支持事务 比如MySQL原生的MyISAM引擎就不支持事务 这也是MyISAM被 InnoDB取代的原因之一 多个事务同时执行的时候 可能出现这3种情况 脏读 dirty r

随机推荐

  • 2018年蓝桥杯省赛-日志统计

    题目 题目链接 题解 贪心 尺取 首先按照时间从小到大 对输入的每一组 t s ts ts和 i d id id进行排序 遍历每一对 取当
  • Vivado 使用过程中问题总结

    关注 星标公众号 及时获取更多技术分享 作者 冰茶奥利奥 微信公众号 嵌入式电子创客街 目录 情况1 在vivado进行一个行为级别仿真时 运行到simulate 步骤时 弹出了如下提示 情况2 综合时 ambiguous clock in
  • Bean name用法

    Spring的bean中有name属性 可以用来区分两个相同 部分属性不一样 的bean 最近我在做influxdb多数据源的时候用到 所以这里已influxdb为示例 仅供参考 看代码 Bean name influx1 public I
  • CSS媒体查询(@media)全面解析

    随着移动设备的快速普及 用户不再只是通过传统的电脑系来浏览 Web 内容 越来越多的用户开始使用各种尺寸的智能手机 平板电脑或者其它设备来浏览 Web 内容 为了确保使用不同设备的用户都能拥有不错的体验就需要用到媒体查询 媒体查询是 CSS
  • 【恒指早盘分析】趋势交易——看懂很简单,做到却很难!

    老子说 盖闻善执生者 陵行不辟兕虎 意思是说 善于保全生命的人 在山陵里走路不轻易干砍劈犀牛或老虎的事情 一个交易者不要轻易涉险 不要因欲望驱使而重仓或急于进场 也不要因为恐惧和疑虑而过早离场 老老实实的控制仓位 老老实实的看准行情之后再行
  • 【Flutter 1-15】Flutter手把手教程Dart语言——包管理工具Pub详解、pub get,pub cache使用

    作者 弗拉德 来源 弗拉德 公众号 fulade me 什么是Pub工具 Dart 生态系统使用包来管理共享软件 比如 库和工具 我们使用Pub包管理工具 来获取Dart包 在Pub上 可以找到公开可用的包 或者从本地文件系统或其他的位置
  • Linux性能监控 -- top命令

    文章目录 示例 参数说明及操作 信息详解 系统运行信息 任务信息 cpu运行信息 内存 swap使用情况 进程消耗资源详情 示例 参数说明及操作 按cpu使用率排序 输入top后 再输入P 按内存使用率排序 输入top后 再输入M 信息详解
  • 关于 XCode ld: library not found for -lcurl clang的解决办法

    有时候项目在自己电脑上运行正常 通过svn提交项目 再checkout下来的时候 再次运行却报错 如 Xcode出现如下错误 一般是因为缺少相关 a等库文件 如 缺少libcurl a 打开 发现少了libcurl a 只需再将相关库文件添
  • Linux学习-17-rpm查询软件包命令(-q、-qa、-i、-p、-l、-f、-R)

    7 4 Linux rpm查询软件包命令 q qa i p l f R rpm 命令还可用来对 RPM 软件包做查询操作 具体包括 查询软件包是否已安装 查询系统中所有已安装的软件包 查看软件包的详细信息 查询软件包的文件列表 查询某系统文
  • JAVA编程基础:第九章 swing类

    如何创建更好看的界面 1 导入swing包 里面有更好看的组件 2 创建各个组件的实例 然后添加到面板 import java awt import javax swing swing包中的组件是从awt包扩展而来的 这些组件更好看 知识点
  • Linux下使用apt安装mysql

    Ubuntu上安装MySQL非常简单只需要几条命令就可以完成 1 sudo apt get install mysql server 2 apt get isntall mysql client 3 sudo apt get install
  • 如何快速制作数据词典

    其实制作数据词典是一件非常麻烦费力的事情 如果有一条SQL能够帮你全都查询出来 那无疑会省力许多 今天呢我就给大家带来一条这样的SQL 源自大佬小梦想的亲笔之作 USE information schema SELECT 字段 字段说明 P
  • Wireshark 使用技巧

    一 数据包过滤 过滤需要的IP地址 ip addr 在数据包过滤的基础上过滤协议ip addr xxx xxx xxx xxx and tcp 过滤端口ip addr xxx xxx xxx xxx and http and tcp por
  • PHPExcel 学习笔记

    首先到phpexcel官网上http phpexcel codeplex com下载最新的phpexcel类 下周解压缩一个classes文件夹 里面包含了PHPExcel php和PHPExcel的文件夹 这个类文件和文件夹是我们需要的
  • 自动控制原理《传递函数》

    目录 文章目录 目录 摘要 1 传递函数的定义 2 传递函数的标准形式 3 传递函数的性质 4 传递函数的局限性 5 总结 摘要 本节主要学习自动控制原理中的传递函数相关知识 大部分内容参考西北工业大学课件 1 传递函数的定义 需要注意的是
  • JEESITE快速开发平台(五)用户-角色-部门-区域-菜单-权限表关系

    一 表关系 一共有8张表分别用来实现用户 角色 部门 区域 菜单 权限管理 详细如下 二 SQL语句 java view plain copy 一共八张表 select from sys user 用户表 select from sys m
  • Vue 打包优化之 生产环境删除 console 日志

    使用 vue cli 3 0 vue cli 脚手架构建的项目 一般在本地开发过程中 会有不少 console 调试信息 如果不处理这些日志信息 默认情况下 即使是构建生产环境的包 这些 console 打印也不会被移除 这显然是不够严谨的
  • 蓝桥杯-时间模拟

    蓝桥杯 时间模拟 引言 时间模拟 是蓝桥杯最常见的题型 我愿意把他称作小白和入门画的界限 接下来就让我来带大家入门把 一 模板 include
  • 操作系统学习提升篇——进程同步

    进程的线程共享进程资源 进程共享计算机资源 因此进程和线程一样都需要信息同步 共享内存 在某种程度上 多进程是共同使用物理内存的 由于操作系统的进程管理 进程间的内存空间是独立的 进程默认是不能访问进程空间之外的内存空间的 一个进程不能访问
  • 在java项目中如何使用Lucene搜索引擎(入门篇)

    什么是lucene 就是一个简单的工具包 java语言特有的 做全文检索用的 为什么不用数据库的模糊查询 两者都什么区别 1 模糊查询只适用于结构化数据 如数据库中存储的数据 非结构化数据就是文档 图片 音频等等 2 模糊查询速度慢 3 不