`
刘小小尘
  • 浏览: 66079 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

lucene使用教程7 --lucene实例代码

 
阅读更多

废话不说了,直接上实例代码,如果你看过前面几篇文章,这些代码对你来说都是小case了,理解最重要

下面两个代码是一个工程:

IndexDocument.java

package baseSample;

import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.LockObtainFailedException;

public class IndexDocument {

	public static Directory getIndexDirectory(Directory directory,
			Analyzer analyzer) throws CorruptIndexException,
			LockObtainFailedException, IOException {
		IndexWriter iwriter = new IndexWriter(directory, analyzer, true,
				new IndexWriter.MaxFieldLength(25000));
		// 索引过程的调优
//		iwriter.setMergeFactor(10); // 激励因子
//		iwriter.setMaxMergeDocs(2000); // segment最大文档数量
//		iwriter.setMaxBufferedDocs(1); // 内存文档数量
		// news Fields
		Field newsId = null;
		Field newsName = null;
		Field publishDate = null;
		Field newsSource = null;
		Field newssummay = null;
		// 第1篇新闻
		Document doc1 = new Document();
		newsId = new Field("newsId", "aaaa", Field.Store.YES,
				Field.Index.NOT_ANALYZED);
		newsName = new Field("newsName", "江苏常州曝疫苗造假大案7人被捕超百万人受害",
				Field.Store.YES, Field.Index.ANALYZED);
		publishDate = new Field("publishDate", "2010/3/30", Field.Store.YES,
				Field.Index.NOT_ANALYZED);
		newsSource = new Field("newsSource", "网易新闻频道", Field.Store.YES,
				Field.Index.ANALYZED);
		newssummay = new Field(
				"newssummay",
				"据香港明报报道,江苏常州爆出疫苗造假大案。当地著名疫苗生产商江苏延申生物科技股份有限公司(简称“江苏延申”)被国家药监局查实在疫苗生产过程中长期故意造假,导致大量问题疫苗流向市场,受害者最少超过100万人。",
				Field.Store.YES, Field.Index.ANALYZED);
		doc1.add(newsId);
		doc1.add(newsName);
		doc1.add(publishDate);
		doc1.add(newsSource);
		doc1.add(newssummay);

		iwriter.addDocument(doc1);
		// 第2篇新闻
		Document doc2 = new Document();
		newsId = new Field("newsId", "bbbb", Field.Store.YES,
				Field.Index.NOT_ANALYZED);
		newsName = new Field("newsName", "一月内发生三起坠楼案", Field.Store.YES,
				Field.Index.ANALYZED);
		publishDate = new Field("publishDate", "2010/3/30", Field.Store.YES,
				Field.Index.NOT_ANALYZED);
		newsSource = new Field("newsSource", "广州日报", Field.Store.YES,
				Field.Index.ANALYZED);
		newssummay = new Field("newssummay",
				"昨日凌晨3时左右,科技集团龙华厂区的一名23岁湖南籍男性员工从宿舍楼上坠下,当场死亡",
				Field.Store.YES, Field.Index.ANALYZED);
		doc2.add(newsId);
		doc2.add(newsName);
		doc2.add(publishDate);
		doc2.add(newsSource);
		doc2.add(newssummay);
		iwriter.addDocument(doc2);

		// 第3篇新闻
		Document doc3 = new Document();
		newsId = new Field("newsId", "cccc", Field.Store.YES,
				Field.Index.NOT_ANALYZED);
		newsName = new Field("newsName", "普京称要消灭掉制造地铁爆炸案恐怖分子", Field.Store.YES,
				Field.Index.ANALYZED);
		publishDate = new Field("publishDate", "2010/3/30", Field.Store.YES,
				Field.Index.NOT_ANALYZED);
		newsSource = new Field("newsSource", "网易新闻频道", Field.Store.YES,
				Field.Index.ANALYZED);
		newssummay = new Field("newssummay",
				"据外电报道,俄罗斯总理普京29日表示,当天制造莫斯科地铁连环爆炸案的恐怖分子一定会被抓到,并被消灭掉。",
				Field.Store.YES, Field.Index.ANALYZED);
		doc3.add(newsId);
		doc3.add(newsName);
		doc3.add(publishDate);
		doc3.add(newsSource);
		doc3.add(newssummay);
		// doc3.setBoost(2);
		iwriter.addDocument(doc3);

		// 第4篇新闻
		Document doc4 = new Document();
		newsId = new Field("newsId", "cccc", Field.Store.YES,
				Field.Index.NOT_ANALYZED);
		newsName = new Field("newsName", "最天使", Field.Store.YES,
				Field.Index.ANALYZED);
		publishDate = new Field("publishDate", "2009/3/30", Field.Store.YES,
				Field.Index.NOT_ANALYZED);
		newsSource = new Field("newsSource", "易", Field.Store.YES,
				Field.Index.ANALYZED);
		newssummay = new Field("newssummay", "长肥了", Field.Store.YES,
				Field.Index.ANALYZED);
		doc4.add(newsId);
		doc4.add(newsName);
		doc4.add(publishDate);
		doc4.add(newsSource);
		doc4.add(newssummay);
		iwriter.addDocument(doc4);

		iwriter.close();

		return directory;
	}

}

SampleSearch.java

package baseSample;

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

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
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.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.util.Version;

public class SampleSearch{
	public static void main(String arg[]) throws CorruptIndexException, LockObtainFailedException, IOException, ParseException{
		
		//Store the index in memory:
//		Directory directory  = new RAMDirectory();
		//To store an index on disk, use this instead:
		File file = new File("D:/mapreduce-out/lucenetmp/cache.txt") ;
		if(file.exists()) {
			System.out.println("文件已存在,删除掉");
			file.delete() ;
		}
	    Directory directory = FSDirectory.open(file);
		Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
		analyzer = new CJKAnalyzer(Version.LUCENE_30);
		//Now search the index 这一步同时也写入了lucene的cache文件
		IndexSearcher isearcher = new IndexSearcher(IndexDocument.getIndexDirectory(directory, analyzer), true);
		
		/**
		 * IndexSearcher 的主要检索方法   
		 * isearcher.search(Query query, Collector results);
		 * isearcher.search(Query query,int n);
		 * isearcher.search(Query query, Filter filter, Collector results); 
		 */
		//Term 是查询的基本单位
		//1.termQuery
		Query termQuery = new TermQuery(new Term("newsSource","网易"));
		System.out.println("--- termQuery : "+termQuery.toString());
		
		//2.BooleanQuery ,类似还提供RangeQuery范围搜索; PrefixQuery 前缀搜索 ;FuzzyQuery 模糊搜索 ..etc
		Query a = new TermQuery(new Term("newsSource", "网"));
		Query b = new TermQuery(new Term("newsSource", "易"));
		BooleanQuery booleanQuery = new BooleanQuery();
		booleanQuery.add(a, BooleanClause.Occur.MUST);
		booleanQuery.add(b, BooleanClause.Occur.MUST);
		System.out.println("--- booleanQuery :"+ booleanQuery.toString());
		
		//3.用QueryParser 切词出 query
		System.out.println("lucene的当前版本 : " + Version.LUCENE_CURRENT);
		QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, "newsSource", analyzer);
		parser.setDefaultOperator(QueryParser.AND_OPERATOR);//默认term之间是or关系
		Query parserQuery = parser.parse("java lucene");
		System.out.println("--- parserQuery : "+parserQuery.toString());
		
		//4.利用MultiFieldQueryParser实现对多Field查询
		String[] fields = {"newsName","newsSource"};
		MultiFieldQueryParser mparser = new MultiFieldQueryParser(Version.LUCENE_CURRENT, fields, analyzer);
		Query mQuery = mparser.parse("江苏");
		System.out.println("---- mQuery :"+mQuery);
		
		ScoreDoc[] docs = isearcher.search(termQuery, 10).scoreDocs;
		for (int i = 0; i < docs.length; i++){   
        	System.out.println(docs[i].doc);
        	System.out.println("searcher score :" + docs[i].score);
            Document hitDoc = isearcher.doc(docs[i].doc);
            System.out.println("--- explain : "+isearcher.explain(termQuery, docs[i].doc));
            System.out.println("boost:" + hitDoc.getBoost());
            System.out.println("newsId:" + hitDoc.get("newsId"));
            System.out.println("newsName:" + hitDoc.get("newsName"));
            System.out.println("publishDate:" + hitDoc.get("publishDate"));
            System.out.println("newsSource:" + hitDoc.get("newsSource"));
            System.out.println("newssummay:" + hitDoc.get("newssummay"));
            System.out.println("------------------------------------------");
		 }   
	}

}

下面两个代码,是一起的

TextFileIndexer.java

package lighter.javaeye.com;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;

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.index.IndexWriter;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

public class TextFileIndexer {
	public static void main(String[] args) throws IOException {
		//致命要索引文件夹的位置
		File fileDir = new File("D:/mapreduce-out/lucenetmp/demo1") ;
		
		//这里放索引文件的位置
		File indexDir = new File("D:/mapreduce-out/lucenetmp/demo2") ;
		//此处的indexDir应该是放置生成缓存的文件夹
		Directory docx = FSDirectory.open(indexDir);
		Analyzer luceneAnalyzer = new StandardAnalyzer(Version.LUCENE_CURRENT) ;
		IndexWriter.MaxFieldLength mf = new MaxFieldLength(100);
		IndexWriter indexWriter = new IndexWriter(docx, luceneAnalyzer, mf) ;
		File[] textFiles = fileDir.listFiles();
		long startTime = new Date().getTime();
		
		for(int i=0;i<textFiles.length;i++) {
			if(textFiles[i].isFile() && textFiles[i].getName().endsWith(".txt")) {
				System.out.println("文件 " + textFiles[i].getCanonicalPath() + "正在呗索引") ;
				String temp = fileReaderAll(textFiles[i].getCanonicalPath(), "GBK") ;
				System.out.println("temp = " + temp);
				Document document = new Document();
				Field fieldPath = new Field("path", textFiles[i].getPath(),Field.Store.YES, Field.Index.NO) ;
				Field fieldBody = new Field("body", temp, Field.Store.YES, Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS) ;
				document.add(fieldPath);
				document.add(fieldBody);
				indexWriter.addDocument(document);
			}
		}
		
		//optimize()方法是对索引进行优化  
		indexWriter.optimize();
		indexWriter.close();
		
		long endTime = new Date().getTime();   
		System.out.println("这花费了" + (endTime - startTime) + " 毫秒来把文档增加到索引里面去!" + fileDir.getPath()); 
	}
	
	public static String fileReaderAll(String fileName, String charset) throws IOException {
		BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName),charset));
		
		String line = new String() ;
		String temp = new String() ;
		while((line = reader.readLine()) != null) {
			temp += line ;
		}
		reader.close();
		return temp ;
	}
}




TestQuery.java

package lighter.javaeye.com;

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.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

public class TestQuery {
	public static void main(String[] args) throws IOException {
		TopDocs topDoc = null ;
		String queryString = "中华" ;
		Query query = null ;
		Directory directory = FSDirectory.open(new File("D:/mapreduce-out/lucenetmp/demo2"));
		IndexSearcher search = new IndexSearcher(directory) ;
		
		Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT);
		
		try {
			QueryParser qp = new QueryParser(Version.LUCENE_CURRENT, "body", analyzer) ;
			query = qp.parse(queryString);
		} catch (ParseException e) {
			e.printStackTrace() ;
		}
		if(search != null) {
			topDoc = search.search(query, 100);
			if (topDoc.getMaxScore() > 0) {
				System.out.println("topDoc.totalHits" + topDoc.totalHits);
				System.out.println("topDoc.getMaxScore()" + topDoc.getMaxScore());
				System.out.println("topDoc.toString()" + topDoc.toString());
			} else {
				System.out.println("没有查询到结果");
			}
		}
		
	}
}




分享到:
评论

相关推荐

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

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

    lucene第一步---5.中文分词IKAnalyzer和高亮highlighter的使用

    使用IKAnalyzer首先需要将其加入到项目依赖中,然后在创建Analyzer实例时指定使用IKAnalyzer。接着,在索引和搜索阶段,Lucene会使用该分词器对中文文本进行处理。 6. **高亮器的配置与使用** 高亮器的配置涉及...

    最新全文检索 lucene-5.2.1 入门经典实例

    本篇文章将深入探讨Lucene-5.2.1的关键知识点,通过实例解析其工作原理和使用方法。 1. **Lucene核心组件** - **Analyzer**:文本分析器是Lucene处理文本的第一步,它负责将输入的字符串分解为一系列的词项...

    lucene全文搜素实例 java lucene 实例

    这个实例将深入讲解如何在 Java 中使用 Lucene 来创建索引并执行各种搜索操作。 ### 一、Lucene 基本概念 1. **索引(Index)**:Lucene 的核心功能是建立索引,它将非结构化的文本数据转换成可供快速搜索的数据...

    lucene 4.8 实例

    在 lucene48.docx 文件中,我们可以找到关于如何使用 Lucene 4.8 创建、索引和搜索文档的实例代码。以下是一个简单的步骤概述: 1. 创建索引:首先,我们需要创建一个 IndexWriter 对象,设置相应的目录和配置。...

    经典的lucene实例代码及详细解析以及lucene结构流程介绍

    经典的Lucene实例代码及详细解析以及Lucene结构流程介绍 Lucene是一个功能强大且灵活的开源搜索引擎库,它提供了一个简单易用的API,允许开发者快速构建搜索应用程序。下面将对Lucene的实例代码和结构流程进行详细...

    Lucene.net-4.8.0 -new Bate.rar

    1. **创建索引**:首先,你需要创建一个Analyzer实例,如PanguAnalyzer,然后使用IndexWriter创建索引。 2. **添加文档**:使用Document对象表示待索引的信息,并将其添加到IndexWriter中。 3. **查询**:使用...

    lucene-4.2.1-src.tgz

    10. **分布式搜索**:虽然单个Lucene实例可以处理大量数据,但当数据量更大时,可以通过Solr或Elasticsearch等基于Lucene的项目实现分布式搜索。 通过研究`lucene-4.2.1-src.tgz`中的源代码,开发者不仅可以理解...

    MMAnalyzer 分词jar包(lucene-core-2.4.1.jar je-analysis-1.5.3.jar)

    在Java环境中,Apache Lucene是一个广泛使用的全文搜索引擎库,它提供了丰富的文本处理工具,包括分词功能。 标题提到的"MMAnalyzer 分词jar包"是基于Lucene的一个中文分词组件,名为Jeasy Analysis,具体版本为...

    lucene-highlighter-3.4.0.jar

    在实际开发中,开发者可以使用Lucene Highlighter来增强搜索引擎的结果展示,例如,在新闻网站的搜索功能中,当用户输入关键词后,返回的新闻摘要将自动高亮显示关键词,使用户能够快速了解新闻内容。 总结,Lucene...

    Lucene索引器实例

    doc.add(new Field("content", "这是关于Lucene索引器的一个实例教程。", Field.Store.YES, Field.Index.ANALYZED)); // 添加文档 indexWriter.addDocument(doc); // 关闭索引器 indexWriter.close(); } }...

    lucene-inmemory-index:使用Lucene在内存中搜索索引

    《使用Lucene构建内存搜索索引的深度解析》 在当今大数据时代,高效的数据检索技术变得至关重要。Apache Lucene作为一款强大的开源全文搜索引擎库,被广泛应用于各种信息检索场景。本文将深入探讨如何利用Lucene在...

    一步一步跟我学习lucene(11)---lucene搜索之高亮显示highlighter

    以上代码展示了如何在Lucene中使用Highlighter组件进行高亮显示。请注意,实际应用中可能需要对错误处理、性能优化等方面进行更多的定制。 通过这个系列教程,你可以逐步了解并掌握如何在Lucene中实现搜索结果的...

    Lucene3.1使用教程

    **Lucene 3.1 使用教程** Lucene 是一个高性能、全文检索库,由Apache软件基金会开发并维护。它提供了一个简单但功能强大的API,使得开发者可以轻松地在应用程序中集成全文检索功能。本教程主要关注的是Lucene 3.1...

    lucene-highlighter-4.4.0.jar

    本文将深入探讨Lucene 4.4.0版本中的Highlighter模块,了解其工作原理和使用方法。 首先,Highlighter模块的核心任务是高亮显示搜索匹配的部分。在搜索过程中,用户可能输入了多个关键词或短语,Highlighter会找出...

    lucene实例

    这个"lucene实例"的压缩包文件很可能是为了演示或教学如何使用Lucene进行文本检索和分析。Lucene的核心功能包括文档索引、搜索、排序以及相关性评分等,它被广泛应用于各种信息检索系统中,如网站搜索、企业内部信息...

    lucene专题教程代码

    在本教程中,我们将深入探讨Lucene的核心概念、使用方法以及如何通过实例代码来理解其工作原理。教程链接:,其中包含了丰富的案例代码供学习者参考。 首先,我们需要了解Lucene的基本架构。Lucene由几个关键组件...

    ssh+lucene搜索实例

    在这个"ssh+lucene搜索实例"中,我们可以理解为结合了SSH和Lucene两个技术,以实现远程服务器上的全文检索功能。例如,可能有一个需求是在多个远程服务器上存储大量数据,而这些数据需要通过关键词进行快速搜索。在...

    lucene3 例子

    【标题】:“Lucene3 实例解析” 在深入探讨Lucene3这个主题之前,我们先来了解一下Lucene是什么。Lucene是一个开源的全文检索库,由Apache软件基金会开发,广泛应用于各种信息检索系统中,包括搜索引擎、内容管理...

    lucene-core-4.9.3,开源jar包

    《Apache Lucene 4.9.3:核心搜索库详解》 Apache Lucene是一个高性能、全文本搜索引擎库,被广泛应用于各种项目和产品中,提供强大的文本分析和索引功能。这里的“lucene-core-4.9.3.jar”正是这个开源项目的最新...

Global site tag (gtag.js) - Google Analytics