`

Lucene搜索功能

阅读更多
1. 对特定项搜索

2. 查询表达式:QueryParser

3. 分页实现

New maven project ->
Create a simple project ->
    Group Id: com.andrew.lucene
    Artifact Id: Lucene03
    Version: 0.0.1-SNAPSHOT
    Packaging: jar


pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.andrew.lucene</groupId>
  <artifactId>Lucene03</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
      <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-core</artifactId>
        <version>5.3.1</version>
    </dependency>
    <dependency>
    <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-queryparser</artifactId>
        <version>5.3.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-analyzers-common</artifactId>
        <version>5.3.1</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
  </dependencies>
</project>


Indexer.java代码

package com.andrew.lucene;

import java.io.File;
import java.io.FileReader;
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.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

public class Indexer {
    private IndexWriter writer; // 写索引实例
    // 构造方法 实例化IndexWriter
    public Indexer(String indexDir) throws Exception {
        Directory dir = FSDirectory.open(Paths.get(indexDir));
        Analyzer analyzer = new StandardAnalyzer(); // 标准分词器
        IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
        writer = new IndexWriter(dir, iwc);
    }
    // 索引指定目录的所有文件
    public int index(String dataDir) throws Exception {
        File[] files = new File(dataDir).listFiles();
        for (File f : files) {
            indexFile(f);
        }
        return writer.numDocs();
    }
    // 索引指定文件
    private void indexFile(File f) throws Exception {
        System.out.println("索引文件:" + f.getCanonicalPath());
        Document doc = getDocument(f);
        writer.addDocument(doc);
    }
    // 获取文档,文档里再设置每个字段
    private Document getDocument(File f) throws Exception {
        Document doc = new Document();
        doc.add(new TextField("contents", new FileReader(f)));
        doc.add(new TextField("fileName", f.getName(), Field.Store.YES));
        doc.add(new TextField("fullPath", f.getCanonicalPath(), Field.Store.YES));
        return doc;
    }
    // 关闭写索引
    public void close() throws Exception {
        writer.close();
    }
    public static void main(String[] args) {
        String indexDir = "E:\\lucene4";
        String dataDir = "E:\\lucene4\\data";
        Indexer indexer = null;
        int numIndexed = 0;
        long start = System.currentTimeMillis();
        try {
            indexer = new Indexer(indexDir);
            numIndexed = indexer.index(dataDir);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                indexer.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        long end = System.currentTimeMillis();
        System.out.println("索引:" + numIndexed + "个文件花费了" + (end - start) + "毫秒");
    }
}

运行结果:

索引文件:E:\lucene4\data\CHANGES.txt
索引文件:E:\lucene4\data\LICENSE.txt
索引文件:E:\lucene4\data\NOTICE.txt
索引文件:E:\lucene4\data\SYSTEM_REQUIREMENTS.txt
索引:4个文件花费了6003毫秒


SearchTest.java代码

package com.andrew.lucene;

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.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
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.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class SearchTest {

    private Directory dir;
    private IndexReader reader;
    private IndexSearcher is;

    @Before
    public void setUp() throws Exception {
        dir = FSDirectory.open(Paths.get("E:\\lucene4"));
        reader = DirectoryReader.open(dir);
        is = new IndexSearcher(reader);
    }
    @After
    public void tearDown() throws Exception {
        reader.close();
    }
    // 对特定项搜索
    @Test
    public void testTermQuery() throws Exception {
        String searchField = "contents";
        String q = "particular";
        Term t = new Term(searchField, q);
        Query query = new TermQuery(t);
        TopDocs hits = is.search(query, 10);
        System.out.println("匹配 '" + q + "',总共查询到" + hits.totalHits + "个文档");
        for (ScoreDoc scoreDoc : hits.scoreDocs) {
            Document doc = is.doc(scoreDoc.doc);
            System.out.println(doc.get("fullPath"));
        }
    }

    // 解析查询表达式
    @Test
    public void testQueryParser() throws Exception {
        Analyzer analyzer = new StandardAnalyzer(); // 标准分词器
        String searchField = "contents";
        String q = "abc~";
        // String q = "particular AND benchmarks";
        QueryParser parser = new QueryParser(searchField, analyzer);
        Query query = parser.parse(q);
        TopDocs hits = is.search(query, 100);
        System.out.println("匹配 " + q + "查询到" + hits.totalHits + "个记录");
        for (ScoreDoc scoreDoc : hits.scoreDocs) {
            Document doc = is.doc(scoreDoc.doc);
            System.out.println(doc.get("fullPath"));
        }
    }
}

运行结果:

匹配 'particular',总共查询到4个文档
E:\lucene4\data\SYSTEM_REQUIREMENTS.txt
E:\lucene4\data\LICENSE.txt
E:\lucene4\data\NOTICE.txt
E:\lucene4\data\CHANGES.txt

// 匹配 particular AND benchmarks查询到1个记录
// E:\lucene4\data\SYSTEM_REQUIREMENTS.txt

匹配 abc~查询到4个记录
E:\lucene4\data\CHANGES.txt
E:\lucene4\data\NOTICE.txt
E:\lucene4\data\LICENSE.txt
E:\lucene4\data\SYSTEM_REQUIREMENTS.txt
分享到:
评论

相关推荐

    Lucene 搜索方法(多短语搜索)

    1. **DemoData.java** - 这个文件很可能是包含测试数据或者示例数据的类,用于演示Lucene搜索功能。它可能包含了创建索引所需的文档对象,以及用于搜索的关键词。 2. **MultiPhraseQueryDemo.java** - 这个文件是多...

    lucene3.5的各种包

    这些组件构成了Lucene搜索功能的基础。 3. **高亮包**: 高亮包允许开发者突出显示搜索结果中的匹配部分,提高用户体验。例如,`Highlighter`类可以提取文档中的关键词,并使用特定的标记(如 `&lt;em&gt;` 标签)来突出...

    《ajax+Lucene构建搜索引擎》源代码 for lucene 2.x

    总的来说,这个项目是学习如何在Web应用中集成Lucene搜索功能的绝佳实践,同时展示了如何适应不同版本的Lucene API。通过深入研究这个源代码,开发者可以掌握Lucene的核心概念,以及如何利用Ajax提升搜索体验。

    Lucene与SSH2搜索功能

    "Lucene与SSH2搜索功能"的主题聚焦于如何在Java Web开发环境中利用Apache Lucene库来构建强大的搜索功能,并结合Struts2、Spring和Hibernate(简称SSH2)这三大框架进行整合。下面我们将深入探讨这些技术及其相互...

    Lucene搜索引擎 JSP + JAVA

    **Lucene搜索引擎 JSP + JAVA** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,它提供了索引和搜索大量文本数据的能力。在这个项目中,Lucene被结合了JSP(JavaServer Pages)和JAVA技术,创建了一个...

    lucene搜索引擎项目

    《深入理解Lucene搜索引擎项目》 Lucene是一个高性能、全文本搜索库,它为开发者提供了在Java应用程序中实现全文检索的工具集。这个名为“lucene搜索引擎项目”的资源,旨在帮助用户更好地理解和应用Lucene来构建...

    LUCENE搜索引擎基本工作原理

    **LUCENE搜索引擎基本工作原理** Lucene是一个开源的全文搜索引擎库,被广泛应用于构建复杂的搜索引擎系统。它的设计目标是高效、灵活且可扩展。理解Lucene的工作原理有助于开发人员更好地利用这一强大的工具。 **...

    Lucene全文搜索_LuceneJava全文搜索_

    总之,Lucene作为Java全文搜索的基石,提供了强大的功能和灵活性,可以帮助开发者构建高效、精准的搜索功能,无论是简单的关键词搜索还是复杂的模糊和智能查询,都能游刃有余地应对。结合"用户管理手册.docx"的学习...

    Lucene 搜索方法(模糊搜索)

    在IT领域,搜索引擎技术是不可或缺的一部分,而Apache Lucene是...通过理解并运用`FuzzyQuery`,我们可以创建出更加用户友好的搜索功能。同时,对源码的深入学习可以帮助我们更好地优化搜索性能,适应不同的业务场景。

    lucene3.6 搜索例子

    Apache Lucene 是一个开源全文搜索引擎库,为开发者提供了在Java应用程序中实现高效、可扩展的搜索功能的工具。在本篇文章中,我们将深入探讨Lucene 3.6版本中的搜索功能,通过实例解析其核心概念和操作流程。 一、...

    lucene 高级搜索项目

    Lucene 是一个高性能、全文检索库,它提供了文本分析、索引和搜索功能,被广泛应用于各种搜索引擎的构建。在这个“Lucene 高级搜索项目”中,我们将深入探讨如何利用Lucene实现附件搜索、附件内容搜索以及全文搜索等...

    lucene .NET4.0&盘古分词dll,demo,doc

    首先,Lucene.NET 4.0是Apache Lucene项目的一个.NET版本,它实现了完整的Lucene搜索功能,包括索引、查询、排序和高亮显示等。Lucene.NET 4.0主要更新了对.NET Framework 4.0的支持,增强了性能,并引入了一些新的...

    lucene站内搜索

    它提供了丰富的文本分析、索引和搜索功能,使得开发者能够轻松地在自己的应用程序中实现复杂的全文检索功能。 ### 一、Lucene基本概念 1. **索引(Index)**: Lucene首先将文档内容转换为可搜索的结构化数据,即...

    Lucene_in_ Action.pdf

    - **集成搜索功能**:详细讲解了如何将 Lucene 的搜索功能集成到应用程序中。 - **分析器**:介绍了一系列用于文本处理的分析器,包括分词、过滤等技术。 - **高级搜索技巧**:涵盖了一些进阶搜索技巧,如布尔查询、...

    ssh+lucene搜索实例

    SSH(Secure Shell)是一种网络协议,用于在不安全的网络上提供安全的远程...以上就是关于"ssh+lucene搜索实例"的相关知识点,通过这种方式,可以有效地在分布式环境中实现全文搜索功能,提高数据检索的效率和便利性。

    Lucene搜索-引擎开发权威经典pdf+源码第二部分

    《Lucene搜索-引擎开发权威经典》是一本深入解析Apache Lucene搜索引擎库的专业书籍,它为读者提供了构建高效全文搜索引擎的全面指南。Lucene是Java领域最著名的全文检索库,被广泛应用于各种信息检索系统中,包括...

    Solr Elasticsearch lucene 搜索引擎

    Lucene作为基础库,提供了强大的搜索功能;Solr在此基础上增强了管理和集群功能,适合大型企业应用;Elasticsearch则更偏向于分布式和易于使用的解决方案,适合各种规模的企业。理解这三者的关系和特性,有助于选择...

Global site tag (gtag.js) - Google Analytics