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 对象数组排序

    Java对象数组排序攻略 在Java中,有时会使用对象数组来存储多个对象,对这些对象按照某个属性进行排序是很常见的需求。本攻略将介绍如何对Java对象数组进行排序。 一、对象数组排序的准备 首先,我们需要定义一个Java类来表示我们要排序的对象。这个Java类至少需要包含一个我们希望排序的属性,并实现Comparable接口。该接口有一个compareTo方…

    Java 2023年5月26日
    00
  • Java实现一个简单的文件上传案例示例代码

    下面是详细的讲解“Java实现一个简单的文件上传案例示例代码”的完整攻略。 1. 确定文件上传方式 在Java中实现文件上传,有多种方法可以选择,比如使用Java Servlet,使用Spring MVC等。本攻略选择使用Java Servlet实现简单的文件上传。 2. 创建HTML表单 为了上传文件,需要创建一个HTML表单用于提交文件。表单的必要元素如…

    Java 2023年6月15日
    00
  • 鼠标焦点离开文本框时验证的js代码

    当用户在网页中填写表单时,我们常常需要验证用户输入的数据是否合法。而当用户在输入框输入完内容后,离开这个输入框,我们需要验证这个输入框中的内容是否符合我们的要求,这时候我们就需要使用JavaScript代码来验证用户的输入。以下是实现鼠标焦点离开文本框时验证的js代码的完整攻略。 1. 绑定事件 我们需要先为输入框绑定一个事件,当输入框失去焦点时触发这个事件…

    Java 2023年6月15日
    00
  • kaptcha验证码组件使用简介解析

    首先给出一份包含标题、正文内容和示例代码的markdown文本: Kaptcha验证码组件使用简介解析 Kaptcha是一款Java语言编写的验证码组件,可以非常方便地为Web应用添加验证码保护。它支持自定义验证码样式,包括验证码字符、字体、大小、颜色、背景等,同时还具备多语言支持、音频验证码功能以及代码简单等优点。 在下面的示例中,我们将详细讲解如何使用K…

    Java 2023年6月15日
    00
  • 什么是脚本的简单解释

    脚本,是指由计算机程序员编写的一种轻量级的程序,通常以文本的形式存在,能被计算机识别并执行。脚本可以用于各种应用场景,比如自动化处理数据、网站交互动画和游戏等等。 脚本按照不同的编程语言分类,比较有代表性的包括JavaScript、Python、PHP、Ruby等等。 对于开发者来说,脚本的优势主要在于快速开发和代码的易维护性。由于脚本缺乏编译过程,代码开发…

    Java 2023年6月15日
    00
  • 详解jvm对象的创建和分配

    我来为你详细讲解“详解jvm对象的创建和分配”的完整攻略。 什么是JVM? 首先,让我们来了解一下JVM是什么。JVM全称为Java Virtual Machine,即Java虚拟机,是Java程序的运行环境。JVM是Java应用程序与操作系统之间的一层抽象,负责管理程序的运行、内存分配等工作。 JVM对象的创建 在Java语言中,对象是通过new关键字来创…

    Java 2023年5月26日
    00
  • Spring Bean是如何初始化的详解

    当Spring应用启动时,Spring容器会初始化所有由用户定义的bean(也就是Spring应用上下文中的bean),并映射它们之间的依赖关系。那么Spring Bean是如何初始化的呢?下面详细介绍一下Spring Bean的初始化过程。 1. Spring Bean的加载 首先,Spring容器会扫描Bean配置文件,找到所有的Bean定义,并将其保存…

    Java 2023年5月27日
    00
  • Java编译错误信息提示java.lang.ExceptionInInitializer解决

    当在Java程序中执行某些任务时,可能会出现以下类型的错误信息提示之一:“java.lang.ExceptionInInitializerError”。通常,该错误信息提示表明在执行静态初始化期间发生了异常。 为了解决Java编译错误信息提示“java.lang.ExceptionInInitializerError”,可以遵循以下步骤: 检查错误的详细信息…

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