`

Lucene 第一个Lucene例子

 
阅读更多

第一个Lucene例子,使用lucene-4.0.0,中文查询没有结果

1.创建索引

package lucene.index;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

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.LongField;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.index.Term;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

/**
 * 创建文档索引
 * 步骤1:创建Lucene Index Writer
 * 步骤2:索引文档
 */
public class Indexer {
	/*
	 * 创建索引的目录
	 */
	private String indexDir = "F:/project/Lucene/index";
	/*
	 * 文档目录
	 */
	private String dataDir = "F:/project/Lucene/docs";
	/*
	 * 是否第一次创建索引
	 */
	private boolean create = true;

	/*
	 * 这个类负责创建索引或打开已有索引,以及向索引中添加、删除或更新被索引文档的信息。 提供针对索引文件的写入操作,但不能读取或搜索索引。
	 */
	private IndexWriter writer;

	/**
	 * 创建Lucene Index Writer
	 * 步骤1:Directory创建索引存放的位置
	 * 步骤2:创建分析器Analyzer
	 * 步骤3:配置IndexWriterConfig,使用分析器Analyzer
	 * 步骤4:创建IndexWriter,使用Directory和IndexWriterConfig
	 */
	public Indexer() throws IOException {
		/*
		 * 它是一个抽象类,它的子类负责具体指定索引的存储路径。
		 */
		Directory dir = FSDirectory.open(new File(indexDir));
		/*
		 * 分析器,它负责从被索引文本文件中提取语汇单元,并剔除剩下的无用信息。
		 */
		Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_40);
		IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_40, analyzer);
		if (create) {
			iwc.setOpenMode(OpenMode.CREATE);
		} else {
			iwc.setOpenMode(OpenMode.CREATE_OR_APPEND);
		}
		iwc.setInfoStream(System.out);
		writer = new IndexWriter(dir, iwc);
	}

	/**
	 * 关闭Lucene Index Writer
	 */
	public void close() throws IOException {
		writer.close();
	}

	/**
	 * 索引文档
	 * 步骤1:找到文档目录下所有文件
	 * 步骤2:循环每个文档,如果是txt文档则步骤3,否则继续循环,或到步骤6
	 * 步骤3:文档作为输入流FileInputStream,创建Document,为Document添加多个域
	 * 步骤4:创建或更新索引文档
	 * 步骤5:关闭输入流
	 * 步骤6:返回索引文档的数目
	 */
	public int index() throws Exception {
		File[] files = new File(dataDir).listFiles();
		for (File f : files) {
			FileInputStream fis = null;
			try {
				/*
				 * 只索引目录下所有txt文档
				 */
				if (!f.isDirectory() && !f.isHidden() && f.exists() && f.canRead() && f.getName().toLowerCase().endsWith(".txt")) {
					System.out.println("Indexing " + f.getCanonicalPath());

					fis = new FileInputStream(f);
					/*
					 * Document对象代表Field的集合。文档的Field代表文档或文档相关的一些元数据。
					 */
					Document doc = new Document();
					/*
					 * TextField、StringField、LongField等Field是包含能被索引的文本内容的类。每个Field包含一个名称和值,以及一组选项来控制Lucene索引操作各个域值。
					 */
					doc.add(new TextField("contents", new BufferedReader(new InputStreamReader(fis, "UTF-8"))));
					doc.add(new StringField("filename", f.getName(), Field.Store.YES));
					doc.add(new StringField("fullpath", f.getCanonicalPath(), Field.Store.YES));
					doc.add(new LongField("modified", f.lastModified(), Field.Store.NO));
					if (writer.getConfig().getOpenMode() == OpenMode.CREATE) {
						System.out.println("adding " + f);
						writer.addDocument(doc);
					} else {
						System.out.println("updating " + f);
						writer.updateDocument(new Term("path", f.getPath()), doc);
					}
				}
			} finally {
				if (fis != null) {
					fis.close();
				}
			}
		}
		return writer.numDocs();
	}

	public static void main(String[] args) throws Exception {
		Indexer indexer = null;
		int numIndexed;

		long start = System.currentTimeMillis();
		try {
			indexer = new Indexer();
			numIndexed = indexer.index();
		} finally {
			if (indexer != null) {
				indexer.close();
			}
		}
		long end = System.currentTimeMillis();

		System.out.println("Indexing " + numIndexed + " files took " + (end - start) + " milliseconds");
	}
}

 

2.搜索

package lucene.index;

import java.io.File;
import java.io.IOException;

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.ParseException;
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.apache.lucene.util.Version;

/**
 * 搜索文档
 * 步骤1:创建IndexReader
 * 步骤2:创建IndexSearcher
 * 步骤3:创建Query
 * 步骤4:搜索searcher.search
 */
public class Searcher {

	/*
	 * 索引存放目录
	 */
	private String indexDir = "F:/project/Lucene/index";

	/**
	 * 搜索
	 * 
	 * @param 搜索的域名
	 *            ,如contents或filename
	 * @param 搜索的值
	 */
	public void search(String where, String q) throws IOException, ParseException {

		IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(indexDir)));
		/*
		 * 用于搜索由IndexWriter类创建的索引
		 */
		IndexSearcher searcher = new IndexSearcher(reader);

		/*
		 * Query 方法一
		 */
		Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_40);
		QueryParser parser = new QueryParser(Version.LUCENE_40, where, analyzer);
		/*
		 * Lucene含有许多具体的Query子类,TermQuery、BooleanQuery、PhraseQuery、PrefixQuery、PhrasePrefixQuery、TermRangeQuery、NumericRangeQuery、FilteredQuery和SpanQuery
		 * 
		 */
		Query query1 = parser.parse(q);
		/*
		 * Query 方法二
		 */
		/*
		 * TermQuery是Lucene提供的最基本的查询类型,也是简单查询类型之一。用来匹配指定域中包含特定项的文档。
		 */
		Query query2 = new TermQuery(new Term(where, q));

		long start = System.currentTimeMillis();
		/*
		 * 一个简单的指针容器,指向前N个排名的搜索结果。
		 */
		TopDocs hits = searcher.search(query1, null, 10);
		long end = System.currentTimeMillis();

		System.err.println("Found " + hits.totalHits + " document(s) (in " + (end - start) + " milliseconds) that matched query '" + q + "':");

		for (ScoreDoc scoreDoc : hits.scoreDocs) {
			Document doc = searcher.doc(scoreDoc.doc);
			System.out.println(doc.get("fullpath"));
			System.out.println(doc.get("filename"));
		}
	}

	public static void main(String[] args) throws IOException, ParseException {
		Searcher searcher = new Searcher();
		searcher.search("filename", "b.txt");
		searcher.search("contents", "abc");
	}
}

 

分享到:
评论

相关推荐

    第一个lucene程序

    1. **创建索引**:这是Lucene工作的第一步,它会把文档内容解析成一系列的术语(tokens),然后为每个术语建立倒排索引。倒排索引是一种数据结构,它允许快速查找包含特定术语的文档。 2. **索引写入**:在创建索引...

    LUCENE的搜索引擎例子

    1. **索引创建**:这是搜索引擎的第一步,我们需要遍历要索引的数据源(例如文件系统、数据库等),读取内容,并使用Lucene的Analyzer进行分词,然后创建Term(词项)和Document(文档)。Analyzer是负责文本分析的...

    lucene检索小例子

    总之,"lucene检索小例子"是一个实用的教程,通过它你可以学习到如何利用Lucene这一强大的全文搜索引擎库,实现高效、精准的文本检索功能。无论是在网站、数据库还是其他任何需要搜索功能的应用中,Lucene都是一个...

    lucene_demo例子

    《Lucene实战(第2版) PDF高清中文版.pdf》这本书是关于Apache Lucene的一本经典教程,适合初学者入门。Lucene是一个全文搜索引擎库,它提供了强大的文本搜索功能,被广泛应用于各种信息检索系统中。这本书详细介绍了...

    Lucene5+HanLP分词例子

    首先,`Lucene5`是一个强大的全文搜索引擎库,由Apache软件基金会开发。它提供了核心的搜索功能,如索引、查询解析、评分和排序,被广泛应用于各种项目中。在`Lucene5`中,文本预处理是非常关键的步骤,其中包括分词...

    lucene in action 书中例子源码

    《Lucene in Action》是一本深受开发者喜爱的书籍,它深入浅出地介绍了Apache Lucene这个全文搜索引擎库的使用和实现细节。这本书的实例代码涵盖了Lucene的核心功能和高级用法,是学习Lucene不可或缺的参考资料。...

    Lucene使用代码实例之搜索文档

    Lucene是一个高性能、全文检索库,它提供了强大的文本分析和索引功能,广泛应用于搜索引擎开发和其他需要高效文本处理的场景。本篇文章主要面向初学者,通过实例详细解释如何使用Lucene进行文档搜索。 首先,我们...

    一个例子教你学懂搜索引擎(lucene)

    分词是搜索引擎处理文本的第一步,Lucene内置了多种分词器,如StandardAnalyzer,它可以根据语言特性对文本进行切分。分词后,Lucene会统计每个词在文档中的出现频率,形成词频信息。然后,Lucene会构建倒排索引,将...

    lucene 3.4基本应用

    在Lucene中,建立索引是搜索的第一步。首先,我们需要创建一个`IndexWriter`实例,这是负责写入索引的主要类。`IndexWriter`配置包括分词器(Tokenizer)、分析器(Analyzer)和目录(Directory)。分词器将文档内容...

    lucene2.9.1所有最新开发包及源码及文档

    ★2) 块由若干文档(Document)组成: 一个文件映射成一个文档。数据库表中的一条记录映射成一个文档。 ★3) 文档由若干域(Field)组成:文件的属性(文件路径,文件的内容)映射成一个域。记录的某个字段映射成一个域。...

    Lucene3.0创建索引

    // 第一个参数是存储目录 // 第二个参数是分析器(用于分析文档内容) // 第三个参数表示是否为新建索引(true新建,false追加) // 第四个参数是字段长度限制 IndexWriter indexWriter = new IndexWriter(dir, new ...

    Lucene in action 2nd edition

    《Lucene in Action》第二版是一本全面介绍Apache Lucene 3.0的书籍,它被誉为是美国大学搜索引擎课程的标准教材之一。本书由Michael McCandless、Erik Hatcher和Otis Gospodnetic三位作者共同编写,并得到了Apache ...

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

    1. **索引构建**:Lucene的核心功能之一是创建倒排索引,这是一种高效的数据结构,用于快速查找文档中包含特定词项的信息。这部分可能会讲解如何使用Lucene API来添加文档、分词、创建倒排索引以及优化索引过程。 2...

    \Lucene Nutch和安装说明文旦

    描述中的“LuceneChapter12 光盘使用说明.DOC”可能是指一份包含第12章内容的文档,这部分可能详细解释了如何在实际操作中运用Lucene和Nutch,尤其是光盘中的资源如何被利用。 **Lucene详解** Apache Lucene是一个...

    Annotated Lucene 中文版 Lucene源码剖析

    - 创建一个简单的索引,并进行基本的查询操作,这是入门Lucene的第一步。 - **Lucene Roadmap**: - 了解Lucene的发展历程及其未来规划对于开发者来说非常重要。 #### 索引文件结构 - **索引数据术语和约定**:...

    Lucene In Action second edition

    ##### 3.1 第一部分:入门篇 这部分内容旨在帮助读者快速了解 Lucene 的基本概念和工作原理。包括但不限于: - **第 1 章:简介**:介绍 Lucene 的历史和发展现状,解释为什么选择使用 Lucene。 - **第 2 章:快速...

    Lucene in Action 2nd Edition

    当Lucene的第一次打五年前的场景,这是令人惊叹的。通过使用这个开源的,高度可扩展,超快速的搜索引擎,开发人员可以集成到应用程序的搜索快速,高效。已经改变了很多,因为当时搜索到大多数企业应用程序中不可或缺...

    Lucene_in_ Action

    在第一部分“Core Lucene”中,作者首先介绍了Lucene的基本概念和用途,帮助读者理解Lucene的核心功能。这部分可能包括以下几个关键知识点: 1. **Lucene简介**:Lucene作为一个高性能的全文检索库,它的主要功能是...

    Lucene搜索引擎开发权威经典

    在书中,作者首先从第1章开始介绍Lucene的基础,包括Lucene的起源、核心概念,如索引、文档、字段和分词,以及如何构建一个简单的Lucene应用程序。这为读者提供了对Lucene搜索引擎的基本认识,并建立起对后续章节...

Global site tag (gtag.js) - Google Analytics