`

lucene3.0学习笔记(二)index

阅读更多
1。IndexWriter的学习

Java代码 复制代码 收藏代码
  1. IndexWriter writer = new IndexWriter(FSDirectory.open("E:\\test\\index"),   
  2.                 new StandardAnalyzer(Version.LUCENE_CURRENT), true,   
  3.                 IndexWriter.MaxFieldLength.LIMITED);  
IndexWriter writer = new IndexWriter(FSDirectory.open("E:\\test\\index"),
				new StandardAnalyzer(Version.LUCENE_CURRENT), true,
				IndexWriter.MaxFieldLength.LIMITED);


IndexWriter类的构造函数共四个参数:
(1).Directory dir:FSDirectory:表示对文件系统目录的操作;RAMDirectory:内存中的目录操作,一般FSDirectory用的较多。
(2).Analyzer a: 用来对文档进行词法分析和语言处理(StandardAnalyzer对中文分词的支持不是很好)
(3).boolean b :如果没有该索引就创建,否则覆盖原有索引
(4).

2.document的学习

    Document是lucene自己定义的一种文件格式,lucene使用docement来代替对应的物理文件或者保存在数据库中的数据。因此Document只能作为数据源在Lucene中的数据存贮的一种文件形式。
  Document只是负责收集数据源,因为不同的文件可以构建同一个Document。只要用户将不同的文件创建成Document类型的文件,Lucene就能快速找到查找并且使用他们。
  对于一个Document文件,可以同时增加多个Field。Lucene中对于每个数据源是使用Field类来表示的。多个Field组成一个Document,多个Document组成一个索引文件。

Java代码 复制代码 收藏代码
  1. Document doc = new Document();   
  2.         doc.add(new Field("contents"new FileReader(f)));   
  3.         doc.add(new Field("filename", f.getCanonicalPath(), Field.Store.YES,   
  4.                 Field.Index.ANALYZED));   
  5.         writer.addDocument(doc);  
Document doc = new Document();
		doc.add(new Field("contents", new FileReader(f)));
		doc.add(new Field("filename", f.getCanonicalPath(), Field.Store.YES,
				Field.Index.ANALYZED));
		writer.addDocument(doc);




3。
Java代码 复制代码 收藏代码
  1. int numIndexed = writer.numDocs();//当前索引中文档的个数   
  2.         writer.optimize();   
  3.         writer.close();  
int numIndexed = writer.numDocs();//当前索引中文档的个数
		writer.optimize();
		writer.close();



4。搜索

搜索过程如下:

创建IndexSearcher准备进行搜索
创建Analyer用来对查询语句进行词法分析和语言处理
创建QueryParser用来对查询语句进行语法分析
QueryParser调用parser进行语法分析,形成查询语法树,放到Query中
IndexSearcher调用search对查询语法树Query进行搜索,得到结果TopScoreDocCollector


Java代码 复制代码 收藏代码
  1. IndexSearcher is = new IndexSearcher(FSDirectory.open(indexDir), true);// read-only   
  2.         String field = "contents";   
  3.         QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, field,   
  4.                 new StandardAnalyzer(Version.LUCENE_CURRENT));   
  5.         Query query = parser.parse(q);   
  6.         TopScoreDocCollector collector = TopScoreDocCollector.create(TOP_NUM,   
  7.                 false);   
  8.         long start = new Date().getTime();// start time   
  9.         is.search(query, collector);  
IndexSearcher is = new IndexSearcher(FSDirectory.open(indexDir), true);// read-only
		String field = "contents";
		QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, field,
				new StandardAnalyzer(Version.LUCENE_CURRENT));
		Query query = parser.parse(q);
		TopScoreDocCollector collector = TopScoreDocCollector.create(TOP_NUM,
				false);
		long start = new Date().getTime();// start time
		is.search(query, collector);







附上例子:
(1)创建索引
Java代码 复制代码 收藏代码
  1. import java.io.File;   
  2. import java.io.FileReader;   
  3. import java.io.IOException;   
  4. import java.util.Date;   
  5.   
  6. import org.apache.lucene.analysis.standard.StandardAnalyzer;   
  7. import org.apache.lucene.document.Document;   
  8. import org.apache.lucene.document.Field;   
  9. import org.apache.lucene.index.IndexWriter;   
  10. import org.apache.lucene.store.FSDirectory;   
  11. import org.apache.lucene.util.Version;   
  12.   
  13. public class Indexer {   
  14.     private static String INDEX_DIR = "E:\\test\\index";// 索引存放目录   
  15.     private static String DATA_DIR = "E:\\test\\file\\";// 文件存放的目录   
  16.   
  17.     public static void main(String[] args) throws Exception {   
  18.         long start = new Date().getTime();   
  19.         int numIndexed = index(new File(INDEX_DIR), new File(DATA_DIR));// 调用index方法   
  20.         long end = new Date().getTime();   
  21.         System.out.println("Indexing " + numIndexed + " files took "  
  22.                 + (end - start) + " milliseconds");   
  23.     }   
  24.   
  25.     /**  
  26.      * 索引dataDir下的.txt文件,并储存在indexDir下,返回索引的文件数量  
  27.      * @param indexDir  
  28.      * @param dataDir  
  29.      * @return int  
  30.      * @throws IOException  
  31.      */  
  32.     public static int index(File indexDir, File dataDir) throws IOException {   
  33.         if (!dataDir.exists() || !dataDir.isDirectory()) {   
  34.             throw new IOException(dataDir   
  35.                     + " does not exist or is not a directory");   
  36.         }   
  37.         IndexWriter writer = new IndexWriter(FSDirectory.open(indexDir),   
  38.                 new StandardAnalyzer(Version.LUCENE_CURRENT), true,   
  39.                 IndexWriter.MaxFieldLength.LIMITED);   
  40.         indexDirectory(writer, dataDir);// 调用indexDirectory方法   
  41.         int numIndexed = writer.numDocs();//当前索引中文档的个数   
  42.         writer.optimize();   
  43.         writer.close();   
  44.         return numIndexed;   
  45.     }   
  46.   
  47.     /**  
  48.      * 循环遍历目录下的所有.txt文件并进行索引  
  49.      * @param writer  
  50.      * @param dir  
  51.      * @throws IOException  
  52.      */  
  53.     private static void indexDirectory(IndexWriter writer, File dir)   
  54.             throws IOException {   
  55.         File[] files = dir.listFiles();   
  56.         for (int i = 0; i < files.length; i++) {   
  57.             File f = files[i];   
  58.             if (f.isDirectory()) {   
  59.                 indexDirectory(writer, f); // recurse   
  60.             } else if (f.getName().endsWith(".txt")) {   
  61.                 indexFile(writer, f);   
  62.             }   
  63.         }   
  64.     }   
  65.   
  66.     /**  
  67.      * 对单个txt文件进行索引  
  68.      * @param writer  
  69.      * @param f  
  70.      * @throws IOException  
  71.      */  
  72.     private static void indexFile(IndexWriter writer, File f)   
  73.             throws IOException {   
  74.         if (f.isHidden() || !f.exists() || !f.canRead()) {   
  75.             return;   
  76.         }   
  77.         System.out.println("Indexing " + f.getCanonicalPath());   
  78.         Document doc = new Document();//针对参数文件建立索引文档   
  79.         doc.add(new Field("contents"new FileReader(f)));   
  80.         doc.add(new Field("filename", f.getCanonicalPath(), Field.Store.YES,   
  81.                 Field.Index.ANALYZED));   
  82.         writer.addDocument(doc);//在writer中加入此文档   
  83.     }   
  84.   
  85. }  
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Date;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

public class Indexer {
	private static String INDEX_DIR = "E:\\test\\index";// 索引存放目录
	private static String DATA_DIR = "E:\\test\\file\\";// 文件存放的目录

	public static void main(String[] args) throws Exception {
		long start = new Date().getTime();
		int numIndexed = index(new File(INDEX_DIR), new File(DATA_DIR));// 调用index方法
		long end = new Date().getTime();
		System.out.println("Indexing " + numIndexed + " files took "
				+ (end - start) + " milliseconds");
	}

	/**
	 * 索引dataDir下的.txt文件,并储存在indexDir下,返回索引的文件数量
	 * @param indexDir
	 * @param dataDir
	 * @return int
	 * @throws IOException
	 */
	public static int index(File indexDir, File dataDir) throws IOException {
		if (!dataDir.exists() || !dataDir.isDirectory()) {
			throw new IOException(dataDir
					+ " does not exist or is not a directory");
		}
		IndexWriter writer = new IndexWriter(FSDirectory.open(indexDir),
				new StandardAnalyzer(Version.LUCENE_CURRENT), true,
				IndexWriter.MaxFieldLength.LIMITED);
		indexDirectory(writer, dataDir);// 调用indexDirectory方法
		int numIndexed = writer.numDocs();//当前索引中文档的个数
		writer.optimize();
		writer.close();
		return numIndexed;
	}

	/**
	 * 循环遍历目录下的所有.txt文件并进行索引
	 * @param writer
	 * @param dir
	 * @throws IOException
	 */
	private static void indexDirectory(IndexWriter writer, File dir)
			throws IOException {
		File[] files = dir.listFiles();
		for (int i = 0; i < files.length; i++) {
			File f = files[i];
			if (f.isDirectory()) {
				indexDirectory(writer, f); // recurse
			} else if (f.getName().endsWith(".txt")) {
				indexFile(writer, f);
			}
		}
	}

	/**
	 * 对单个txt文件进行索引
	 * @param writer
	 * @param f
	 * @throws IOException
	 */
	private static void indexFile(IndexWriter writer, File f)
			throws IOException {
		if (f.isHidden() || !f.exists() || !f.canRead()) {
			return;
		}
		System.out.println("Indexing " + f.getCanonicalPath());
		Document doc = new Document();//针对参数文件建立索引文档
		doc.add(new Field("contents", new FileReader(f)));
		doc.add(new Field("filename", f.getCanonicalPath(), Field.Store.YES,
				Field.Index.ANALYZED));
		writer.addDocument(doc);//在writer中加入此文档
	}

}



2。搜索

Java代码 复制代码 收藏代码
  1. import java.io.File;   
  2. import java.util.Date;   
  3. import org.apache.lucene.analysis.standard.StandardAnalyzer;   
  4. import org.apache.lucene.document.Document;   
  5. import org.apache.lucene.queryParser.QueryParser;   
  6. import org.apache.lucene.search.IndexSearcher;   
  7. import org.apache.lucene.search.Query;   
  8. import org.apache.lucene.search.ScoreDoc;   
  9. import org.apache.lucene.search.TopScoreDocCollector;   
  10. import org.apache.lucene.store.FSDirectory;   
  11. import org.apache.lucene.util.Version;   
  12.   
  13. public class Searcher {   
  14.     private static String INDEX_DIR = "E:\\test\\index\\";// 索引所在的路径   
  15.     private static String KEYWORD = "接受";// 关键词   
  16.     private static int TOP_NUM = 100;// 显示前100条结果   
  17.   
  18.     public static void main(String[] args) throws Exception {   
  19.         File indexDir = new File(INDEX_DIR);   
  20.         if (!indexDir.exists() || !indexDir.isDirectory()) {   
  21.             throw new Exception(indexDir   
  22.                     + " does not exist or is not a directory.");   
  23.         }   
  24.         search(indexDir, KEYWORD);// 调用search方法进行查询   
  25.     }   
  26.   
  27.     /**  
  28.      * 查询  
  29.      *   
  30.      * @param indexDir  
  31.      * @param q  
  32.      * @throws Exception  
  33.      */  
  34.     public static void search(File indexDir, String q) throws Exception {   
  35.         IndexSearcher is = new IndexSearcher(FSDirectory.open(indexDir), true);// read-only   
  36.         String field = "contents";   
  37.         QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, field,   
  38.                 new StandardAnalyzer(Version.LUCENE_CURRENT));   
  39.         Query query = parser.parse(q);   
  40.         TopScoreDocCollector collector = TopScoreDocCollector.create(TOP_NUM,   
  41.                 false);   
  42.         long start = new Date().getTime();// start time   
  43.         is.search(query, collector);   
  44.         ScoreDoc[] hits = collector.topDocs().scoreDocs;   
  45.         System.out.println(hits.length);   
  46.         for (int i = 0; i < hits.length; i++) {   
  47.             Document doc = is.doc(hits[i].doc);// new method is.doc()   
  48.             System.out.println(doc.getField("filename") + "   "  
  49.                     + hits[i].toString() + " ");   
  50.         }   
  51.         long end = new Date().getTime();// end time   
  52.         System.out.println("Found " + collector.getTotalHits()   
  53.                 + " document(s) (in " + (end - start)   
  54.                 + " milliseconds) that matched query '" + q + "':");   
  55.     }   
  56. }  
分享到:
评论

相关推荐

    lucene3.0 lucene3.0

    lucene3.0 lucene3.0 lucene3.0 lucene3.0 lucene3.0

    lucene3.0学习笔记(三)与paoding整合

    《Lucene 3.0 学习笔记(三)与Paoding整合》 在深入了解Lucene 3.0的过程中,我们经常会遇到如何将其与第三方工具进行整合的问题,以提升搜索性能和用户体验。这篇学习笔记主要关注的是将Lucene 3.0与Paoding搜索...

    lucene 3.0 API 中文帮助文档 chm

    lucene 3.0 API中文帮助,学习的人懂得的

    Lucene3.0之查询类型详解

    【Lucene3.0查询类型详解】 在Lucene3.0中,查询处理是一个关键环节,涉及多种查询方式和理论模型。以下是对这些概念的详细解释: 1. **查询方式**: - **顺序查询**:是最简单的查询方式,直接遍历索引,效率较...

    lucene3.0 分词器

    lucene3.0 中文分词器, 庖丁解牛

    Lucene 3.0 原理与代码分析完整版

    通过对《Lucene 3.0 原理与代码分析完整版》的学习,开发者不仅可以理解Lucene的工作原理,还能掌握如何定制化Lucene以满足特定需求,从而在实际项目中充分利用其强大功能。这本书是深入研究和应用Lucene不可或缺的...

    lucene3.0核心jar包

    这里的"lucene3.0核心jar包"是 Lucene 的一个重要版本,发布于2009年,为当时的开发人员提供了构建全文搜索引擎的基础框架。 在 Lucene 3.0 中,以下几个关键知识点值得关注: 1. **索引结构**:Lucene 使用倒排...

    Lucene3.0全文信息检索

    **二、Lucene 3.0 的主要特性** 1. **更高效的搜索**:Lucene 3.0通过优化搜索算法和数据结构,提高了搜索速度。例如,使用了改进的位向量技术,使得布尔查询更快。 2. **多线程支持**:在3.0版本中,Lucene增强了...

    与lucene3.0兼容的庖丁jar包

    at org.apache.lucene.index.DocInverterPerField.processFields(DocInverterPerField.java:137) at org.apache.lucene.index.DocFieldProcessorPerThread.processDocument(DocFieldProcessorPerThread.java:246) ...

    lucene3.0 实例

    首先,Lucene 的核心概念包括文档(Document)、字段(Field)、索引(Index)和搜索(Search)。文档是存储信息的基本单位,可以类比为数据库中的记录,由多个字段组成。字段则定义了文档中的各个属性,比如标题、...

    lucene3.0资料包

    **正文** Lucene是一个开源全文检索库,由Apache软件基金会开发。它提供了强大的文本分析、索引和搜索功能,广泛应用于各种信息检索系统...通过深入学习和应用Lucene3.0,开发者可以构建出高效、智能的信息检索系统。

    lucene3.0使用介绍及实例

    **正文** Lucene是一个强大的全文检索库,由Apache软件基金会开发并维护,广泛应用于各种搜索引擎...通过学习和实践,开发者可以利用Lucene 3.0的强大功能,构建出高效、灵活的全文搜索引擎,满足各种应用场景的需求。

    lucene3.0庖丁+索引搜索程序

    二、庖丁解牛:Lucene3.0内部机制 1. 文档索引:Lucene通过分词器(Tokenizer)将输入的文本分解成一系列的词语(Term),并为每个词语创建一个文档频率(Document Frequency, DF)。同时,使用Term频率-逆文档频率...

    lucene3.0全文检索入门实例

    **Lucene 3.0 全文检索入门实例** Lucene 是一个开源的全文检索库,由 Apache 软件基金会开发。...通过学习和实践这个入门实例,你将能够掌握 Lucene 3.0 的基本操作,并为你的项目添加高效的全文检索功能。

    lucene3.0-highlighter.jar

    lucene3.0-highlighter.jar lucene3.0的高亮jar包,从lucene3.0源码中导出来的

    lucene 3.0 入门实例

    ### 二、Lucene 3.0 API 实例 在入门实例中,我们通常会经历以下几个步骤: 1. **创建索引(Creating an Index)**: 首先,我们需要创建一个 IndexWriter 对象,配置相应的目录(Directory)和索引设置。然后,...

    Lucene3.0分词系统.doc

    Lucene3.0分词系统的核心在于理解和应用其分词原理,无论是对于英文还是中文文本,这一过程都是构建高效搜索引擎的基础。以下是对Lucene3.0分词系统中涉及的关键知识点的深入解析。 ### 英文分词原理 英文分词相较...

Global site tag (gtag.js) - Google Analytics