Java实现简单的搜索引擎

一、准备工作

在开始实现搜索引擎之前,需要准备以下工作:

  1. 编译环境:需要在本地安装JDK环境,并配置好对应的环境变量。

  2. Maven管理工具:Maven是一个Java项目管理工具,能够自动下载所需的依赖库,并管理项目的编译、测试、打包等过程。

  3. Lucene搜索引擎库:Lucene是一种高效的文本搜索引擎库,它提供了全文检索、模糊搜索、分词等功能,是实现搜索引擎的核心组件。

二、创建项目

1. 引入Lucene库

<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>8.8.2</version>
</dependency>

2. 添加引用

import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

三、实现功能

1. 创建索引

将指定目录下的所有文件创建索引,其中文件名和内容会被添加到索引中。

public static void createIndex(String indexDir, String dataDir) throws IOException {Analyzer analyzer = new StandardAnalyzer(); // 创建分词器Directory dir = FSDirectory.open(Paths.get(indexDir)); // 创建索引目录IndexWriterConfig config = new IndexWriterConfig(analyzer); // 创建索引配置IndexWriter writer = new IndexWriter(dir, config); // 创建索引写入器File[] files = new File(dataDir).listFiles(); // 获取数据文件列表for (File file : files) {if (!file.isDirectory() && !file.isHidden() && file.exists() && file.canRead()) {Document doc = new Document(); // 创建文档doc.add(new StringField("filename", file.getName(), Field.Store.YES)); // 添加文件名字段doc.add(new TextField("content", new String(Files.readAllBytes(file.toPath())), Field.Store.NO)); // 添加文件内容字段writer.addDocument(doc); // 写入索引}}writer.commit(); // 提交写入writer.close(); // 关闭写入器
}

2. 搜索文件

该方法会执行搜索,并输出匹配的文件名。

public static void search(String indexDir, String queryStr, int maxHits) throws IOException, ParseException {Analyzer analyzer = new StandardAnalyzer(); // 创建分词器Directory dir = FSDirectory.open(Paths.get(indexDir)); // 创建索引目录IndexReader reader = DirectoryReader.open(dir); // 创建索引读取器IndexSearcher searcher = new IndexSearcher(reader); // 创建索引搜索器String[] fields = {"filename", "content"}; // 指定搜索字段QueryParser parser = new MultiFieldQueryParser(fields, analyzer); // 创建多字段查询解析器parser.setDefaultOperator(QueryParser.Operator.OR); // 指定搜索模式TopDocs hits = searcher.search(parser.parse(queryStr), maxHits); // 执行搜索System.out.println("Total hits: " + hits.totalHits.value); // 输出结果总数for (ScoreDoc scoreDoc : hits.scoreDocs) {Document doc = searcher.doc(scoreDoc.doc); // 获取匹配的文档System.out.println("File name: " + doc.get("filename")); // 输出匹配的文件名}
}

3. 示例说明

以下是两条实现搜索引擎的示例说明。

1. 搜索本地文件

假设我们需要搜索本地C盘下的所有txt文件,我们可以使用以下代码:

String indexDir = "C:/luceneIndex"; // 索引目录
String dataDir = "C:/data"; // 数据目录
String queryStr = "lucene"; // 查询字符串
int maxHits = 10; // 最大结果数量
createIndex(indexDir, dataDir); // 创建索引
search(indexDir, queryStr, maxHits); // 执行搜索
2. 搜索网络数据

假设我们需要从某个网站中搜索所有包含关键字的链接,我们可以使用以下代码:

String indexDir = "C:/luceneIndex"; // 索引目录
String url = "http://example.com/search?q=lucene"; // 查询链接
String queryStr = "example"; // 查询字符串
int maxHits = 10; // 最大结果数量
DocumentFetcher documentFetcher = new DocumentFetcher(url);
String data = documentFetcher.getContent();
createIndex(indexDir, data); // 创建索引
search(indexDir, queryStr, maxHits); // 执行搜索

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/476216.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

aws凭证(一)凭证存储

AWS 凭证用于验证身份&#xff0c;并授权对 DynamoDB 等等 AWS 服务的访问。配置了aws凭证后&#xff0c;才可以通过编程方式或从AWS CLI连接访问AWS资源。凭证存储在哪里呢&#xff1f;有以下几个方法&#xff1a; 一、使用文件存储 1、介绍 文件存储适用于长期和多账户配置…

Win11下载和配置VSCode(详细讲解)

配置VSCode需要的工具&#xff1a; 一、MinGW-w64 二、Visual Studio Code 一、MinGW-w64下载 1、下载 MinGW官网地址&#xff1a; Downloads - MinGW-w64 直链下载&#xff1a; 下载 mingw-w64-install.exe &#xff08;MinGW-w64 - 适用于 32 位和 64 位 Windows&#…

Python简介以及解释器安装(保姆级教学)

目录 一、Python介绍 1、简介 2、特点 3、来源 4、发展 二、Python解释器的安装 1、安装包下载 2、下载完成后&#xff0c;点击安装包进入安装流程 一、Python介绍 1、简介 Python 是一门解释型、面向对象以及动态数据类型的高级程序设计语言&#xff0c;语法简洁&…

【论文速读】| RobustKV:通过键值对驱逐防御大语言模型免受越狱攻击

基本信息 原文标题&#xff1a;ROBUSTKV: DEFENDING LARGE LANGUAGE MODELS AGAINST JAILBREAK ATTACKS VIA KV EVICTION 原文作者&#xff1a;Tanqiu Jiang, Zian Wang, Jiacheng Liang, Changjiang Li, Yuhui Wang, Ting Wang 作者单位&#xff1a;Stony Brook University…

美畅物联丨智能分析,安全管控:视频汇聚平台助力智慧工地建设

随着科技的持续发展&#xff0c;建筑行业正朝着智能化的方向迅猛迈进。智慧工地作为建筑行业智能化的关键体现形式&#xff0c;借助各类先进技术来提升工地的管理效率、安全性以及生产效益。在这个过程中&#xff0c;视频汇聚平台发挥着极为重要的作用。以畅联AIoT开放云平台为…

AI赋能:PPT制作的创意革命

在现代信息社会&#xff0c;PPT已成为沟通和展示的利器。然而&#xff0c;如何快速制作出高质量的PPT&#xff0c;却是一门学问。幸运的是&#xff0c;智能生成PPT技术的出现&#xff0c;让这一切变得轻松自如。 ai生成PPT技术&#xff0c;犹如一位无形的助手&#xff0c;帮助用…

实战 | C#中使用YoloV8和OpenCvSharp实现目标检测 (步骤 + 源码)

导 读 本文主要介绍在C#中使用YoloV8实现目标检测,并给详细步骤和代码。 详细步骤 【1】环境和依赖项。 需先安装VS2022最新版,.NetFramework8.0,然后新建项目,nuget安装 YoloSharp,YoloSharp介绍: https://github.com/dme-compunet/YoloSharp 最新版6.0.1,本文…

蓝桥杯每日真题 - 第20天

题目&#xff1a;&#xff08;机房&#xff09; 题目描述&#xff08;13届 C&CG题&#xff09; 解题思路&#xff1a; 这道题目可以看作在一个无向图中查找两点之间的最短路径。题目中的 n 台电脑和 n−1 根网线形成了一棵树&#xff0c;树是一个特殊的无向图&#xff0c…

iOS应用网络安全之HTTPS

移动互联网开发中iOS应用的网络安全问题往往被大部分开发者忽略, iOS9和OS X 10.11开始Apple也默认提高了安全配置和要求. 本文以iOS平台App开发中对后台数据接口的安全通信进行解析和加固方法的分析. 1. HTTPS/SSL的基本原理 安全套接字层 (Secure Socket Layer, SSL) 是用来…

项目虚拟机配置测试环境

在企业中&#xff0c;有专门的服务器部署开发环境&#xff0c;测试环境等等 直接在虚拟机中打开虚拟机就可以 dps查看容器

初始ArkUI

一. 什么是ArkUI ArkUI基于方舟UI框架为应用的UI开发提供了完整的基础设施&#xff0c;UI语法更加简洁&#xff0c;丰富的UI功能&#xff08;组件、布局、动画以及交互事件&#xff09;&#xff0c;以及实现界面预览工具等&#xff0c;可以支持开发者进行可视化界面开发。 &a…

【PCIE常见面试问题-1】

PCIE常见面试问题-1 1 PCIE概述1.1 PCI为何发展开PCIE&#xff1f;1.2 什么是Root Complex(RC)1.3 什么是EP&#xff1f;1.4 什么是Swith1.5 PCIE协议如何组织通信的&#xff1f;1.6 简要介绍一下PCIE的分层结构&#xff0c;为什么需要分层&#xff1f;1.7 PCIE的事务类型有哪些…

用pyspark把kafka主题数据经过etl导入另一个主题中的有关报错

首先看一下我们的示例代码 import os from pyspark.sql import SparkSession import pyspark.sql.functions as F """ ------------------------------------------Description : TODO&#xff1a;SourceFile : etl_stream_kafkaAuthor : zxxDate : 2024/11/…

什么是反向 DNS 查找以及它的作用是什么?

反向DNS查询&#xff08;rDNS&#xff09;是一种技术&#xff0c;用于确定与某个IP地址对应的域名。当我们对一个IP地址进行反向DNS查询时&#xff0c;实际上是向域名系统&#xff08;DNS&#xff09;的特殊部分请求信息&#xff0c;这部分被称为PTR记录。PTR记录会返回与这个I…

HarmonyOS鸿蒙系统上File文件常用操作

HarmonyOS鸿蒙系统上&#xff0c;file文件常用操作记录 1.创建文件 createFile(fileName: string, content: string): string {// 获取应用文件路径let context getContext(this) as common.UIAbilityContext;let filesDirPath context.filesDir / fileName;// 新建并打开…

音视频pts/dts

现在的视频流有两个非常重要的时间戳&#xff0c;pts和dts&#xff0c;其中pts是显示的时候用&#xff0c;dts在解码的时候用。 pts很好理解&#xff0c;按照pts的顺序以及duration不间断的display就可以了。 dts在解码的时候用&#xff0c;那么这句话怎么理解&#xff0c;解…

输出比较简介

输出比较简介 主要是用来输出PWM波形&#xff0c;这个波形是驱动电机的&#xff08;智能车和机器人等&#xff09;必要条件 OC&#xff08;Output Compare&#xff09;输出比较&#xff0c;还有IC&#xff0c;全称是Input Capture&#xff0c;意为输入捕获&#xff0c;还有CC…

揭秘AIGC下的数字时代:交互设计的隐秘力量与未来革命

在当今数字化时代&#xff0c;交互设计已经成为我们日常生活中不可或缺的一部分。它不仅仅是关于产品或服务的界面设计&#xff0c;更是关于如何通过这些界面与人进行有效的沟通和互动。本文将探讨交互设计的深层含义、面临的挑战以及其对未来科技发展的影响。 文章来源&#x…

使用node-addon-api实现从c到nodejs模块全流程

目录 1 前言 2 安装nodejs 3 安装开发工具链 3.1 安装node-gyp 3.2 安装编译工具链&#xff08;C/C 编译器&#xff09; 4 初始化 Node.js 项目 4.1 创建项目目录 4.2 初始化 package.json 4.3 安装必要的库 5 编写代码 5.1 创建项目结构 5.2 编写动态库代码 5.3 编…

Python3.11.9+selenium,获取图片验证码以及输入验证码数字

Python3.11.9+selenium,获取图片验证码以及输入验证码数字 1、遇到问题:登录或修改密码需要验证码 2、解决办法: 2.1、安装ddddocr pip install ddddocr 2.2、解析验证码函数 import ddddocr def get_capcha_text():#获取验证码图片ele_pic = driver.find_element(By.XPAT…