Java实现文件检索系统的示例代码

Java实现文件检索系统的示例代码攻略

概述

本文将介绍如何使用Java实现一个文件检索系统的示例代码。该系统能够快速、效率地搜索指定文件目录中包含指定内容的文件,并将结果展示出来。

开发环境

  • JDK 1.8
  • Apache Maven 3.6.0
  • IntelliJ IDEA 2021.1

实现过程

  1. 引入依赖

使用Maven创建一个Java项目,并在pom文件中引入apache commons-io和org.apache.lucene依赖。

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

<dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-core</artifactId>
    <version>8.7.0</version>
</dependency>
  1. 创建文件搜索类

创建一个Searcher类,编写search方法用于搜索指定文件目录中包含指定内容的文件。

public class Searcher {

    private final String indexDir;

    public Searcher(String indexDir) {
        this.indexDir = indexDir;
    }

    public List<String> search(String text) throws IOException, ParseException, InvalidTokenOffsetsException {

        Directory dir = FSDirectory.open(Paths.get(indexDir));
        IndexReader reader = DirectoryReader.open(dir);
        IndexSearcher searcher = new IndexSearcher(reader);

        Analyzer analyzer = new StandardAnalyzer();
        QueryParser parser = new QueryParser("content", analyzer);
        Query query = parser.parse(text);

        TopDocs results = searcher.search(query, 100);
        ScoreDoc[] hits = results.scoreDocs;

        SimpleHTMLFormatter htmlFormatter = new SimpleHTMLFormatter();
        Highlighter highlighter = new Highlighter(htmlFormatter, new QueryScorer(query));
        Fragmenter fragmenter = new SimpleFragmenter(200);
        highlighter.setTextFragmenter(fragmenter);

        List<String> list = new ArrayList<>();
        for (ScoreDoc hit : hits) {
            int id = hit.doc;
            Document doc = searcher.doc(id);
            String path = doc.get("path");
            String title = doc.get("title");
            String content = doc.get("content");
            TokenStream tokenStream = TokenSources.getAnyTokenStream(reader, hit.doc, "content", analyzer);
            TextFragment[] frag = highlighter.getBestTextFragments(tokenStream, content, false, 3);
            StringBuilder sb = new StringBuilder();
            for (TextFragment textFragment : frag) {
                if ((textFragment != null) && (textFragment.getScore() > 0)) {
                    sb.append(textFragment.toString());
                }
            }
            String result = "<p><strong>" + title + "</strong><br/>" + sb.toString() + "<br/>" + "路径:" + path + "</p>";
            list.add(result);
        }
        reader.close();
        return list;
    }
}

该方法中使用org.apache.lucene库进行搜索操作。搜索步骤如下:
* 打开文件目录索引
* 创建IndexSearcher进行搜索
* 创建分析器和解析器
* 通过解析器构建查询语句
* 执行查询并遍历搜索结果(默认返回前100个结果)
* 使用Html Fragment对搜索结果进行高亮处理

  1. 建立文件目录索引

创建一个Indexer类,编写indexDirectory方法用于建立文件目录索引。

public class Indexer {

    private final IndexWriter writer;

    public Indexer(String indexDirectoryPath) throws IOException {
        FSDirectory dir = FSDirectory.open(Paths.get(indexDirectoryPath));
        IndexWriterConfig config = new IndexWriterConfig(new StandardAnalyzer());
        writer = new IndexWriter(dir, config);
    }

    public void indexDirectory(String dataDirPath) throws IOException {
        File[] files = new File(dataDirPath).listFiles();
        if (files != null) {
            for (File file : files) {
                indexFile(file);
            }
        }
        writer.close();
    }

    private void indexFile(File file) throws IOException {
        System.out.println("Indexing " + file.getCanonicalPath());
        Document document = new Document();
        Field pathField = new StringField("path", file.getCanonicalPath(), Field.Store.YES);
        document.add(pathField);
        Field titleField = new StringField("title", file.getName(), Field.Store.YES);
        document.add(titleField);
        Field contentField = new TextField("content", new String(Files.readAllBytes(file.toPath())), Field.Store.YES);
        document.add(contentField);
        writer.addDocument(document);
    }
}

该方法中使用org.apache.lucene库进行索引操作。索引过程如下:
* 打开文件目录索引
* 创建IndexWriter进行索引
* 遍历指定文件目录中的文件
* 为每个文件建立Documnet对象并添加Field对象
* 执行索引

  1. 创建启动类

创建一个Main类,编写main方法作为程序的入口。

public class Main {

    public static void main(String[] args) throws IOException, ParseException, InvalidTokenOffsetsException {
        String indexDir = "index";
        String dataDir = "data";

        Indexer indexer = new Indexer(indexDir);
        indexer.indexDirectory(dataDir);

        Searcher searcher = new Searcher(indexDir);
        List<String> list = searcher.search("lucene");

        System.out.println(list);
    }
}

其中,data目录为搜索的文件目录,我们可以将需要搜索的文件放到该目录下,index目录为文件目录的索引文件目录。

示例说明

以下是两个Searcher类的示例,用于搜索包含指定内容的文件。

示例1:搜索包含“hello”的文件

Searcher searcher = new Searcher(indexDir);
List<String> list = searcher.search("hello");
System.out.println(list);

执行结果:

[<p><strong>file1.txt</strong><br/>hello world<br/>路径:data/file1.txt</p>, <p><strong>file2.txt</strong><br/>this is a test<br/>路径:data/file2.txt</p>]

示例2:搜索包含“test”的文件

Searcher searcher = new Searcher(indexDir);
List<String> list = searcher.search("test");
System.out.println(list);

执行结果:

[<p><strong>file2.txt</strong><br/>this is a test<br/>路径:data/file2.txt</p>, <p><strong>file3.txt</strong><br/>test<br/>路径:data/file3.txt</p>]

结论

本文介绍了如何使用Java实现文件检索系统,并给出了示例代码,可用于快速搜索指定文件目录中包含指定内容的文件。使用Lucene库可快速完成索引和搜索的操作,提升搜索性能和效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现文件检索系统的示例代码 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • java的io操作(将字符串写入到txt文件中)

    下面我将详细讲解“Java的IO操作(将字符串写入到txt文件中)”的完整攻略。 IO操作简介 在Java中,IO(Input/Output)操作是非常重要的一个主题。对于Java开发者来说,IO操作是必不可少的。在Java中,提供了java.io包和java.nio包分别供我们进行IO操作。 其中,java.io包位于Java1.0版本中,提供了非常丰富的…

    Java 2023年5月19日
    00
  • Java实现万年历效果

    下面是“Java实现万年历效果”的完整攻略。 准备工作 在实现万年历之前,需要先了解一些基本知识: Java 的日期类 Date、Calendar 和 LocalDate Java 的输入输出流,包括 Scanner 和 System.out Java 的字符串拼接和格式化输出 模块化编程及测试方法 实现步骤 接下来就可以开始实现万年历了。 步骤1:获取用户…

    Java 2023年5月19日
    00
  • Spring Security自定义登录原理及实现详解

    针对 “Spring Security自定义登录原理及实现详解” 这个主题,我来给你讲一下完整的攻略。 1. 理解Spring Security的认证流程 认证流程是Spring Security中非常重要的概念。在用户登录时,Spring Security需要进行一系列步骤来验证用户身份。下面是Spring Security认证流程的核心步骤: 用户在登录…

    Java 2023年5月20日
    00
  • Java 中的 print() 和 println()

    当我们在编写 Java 代码时,常常要向控制台输出文本信息,Java 中的 print() 和 println() 方法可以帮助我们达到这个目的。 print() 和 println() 方法的区别 Java 中的 print() 和 println() 方法都可以向控制台输出文本信息,但它们的区别在于: print() 方法不会在输出信息后自动换行,输出的…

    Java 2023年5月26日
    00
  • spring-boot 如何实现单次执行程序

    Spring Boot 如何实现单次执行程序 在本文中,我们将详细讲解如何使用Spring Boot实现单次执行程序。我们将介绍两种不同的方法来实现这个目标,并提供示例来说明如何使用这些方法。 方法一:使用CommandLineRunner接口 Spring Boot提供了CommandLineRunner接口,它可以在Spring Boot应用程序启动时执…

    Java 2023年5月18日
    00
  • 基于centos自己构建一个tomcat镜像的实现

    要在CentOS上构建自己的Tomcat镜像,可以按照以下步骤: 步骤1:安装Docker Docker是一种容器化平台,我们需要使用它来构建我们的Tomcat镜像。在CentOS上安装Docker的方法可以参考Docker的官方文档。 步骤2:创建一个Dockerfile 在本地创建一个文件夹,用于存储Dockerfile和相关文件,例如: $ mkdir…

    Java 2023年5月19日
    00
  • js创建jsonArray传输至后台及后台全面解析

    请看下面的攻略: 客户端(js)创建jsonArray并传输至服务端 创建jsonArray 1.定义一个空的jsonArray: var jsonArray = []; 2.向jsonArray中添加数据: var jsonArray = []; for (var i = 0; i < 3; i++) { var jsonObj = { name: …

    Java 2023年5月26日
    00
  • Spring boot security权限管理集成cas单点登录功能的实现

    关于“Spring Boot Security权限管理集成CAS单点登录功能的实现”的攻略,我从以下几个方面来讲解: 环境搭建 CAS Server的配置和部署 Spring Boot的集成与配置 认证和授权的实现 案例演示 环境搭建 这一步骤需要我们准备好以下的工具和环境: JDK 1.8 或以上版本 Maven 3.x CAS Server 5.x Sp…

    Java 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部