`
zhcheng
  • 浏览: 164307 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Luence 初探

 
阅读更多
/**
 * lucene-core-3.3.0
 * lucene-highlighter-3.3.0
 */
public class LuceneIndex {

	//分词器
	private Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_33);
	//索引文件存放位置
	private final String indexPath = "/home/zhanghc/luence/index/";

	/**
	 * 创建索引 
	 */
	public boolean createIndex() throws IOException {

		Directory directory = FSDirectory.open(new File(indexPath));
		IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_33, analyzer);
		config.setOpenMode(OpenMode.CREATE_OR_APPEND);
		IndexWriter writer = new IndexWriter(directory, config);
		String [] array_content = {"在泽州县彤康食品有限公司", "屠宰加工项目建成投产", "比如肉制品均来自双汇", "雨润等大型肉类生产商"};
		String [] array_name = {"泽州", "屠宰", "肉制品", "肉类生产商"};
		for (int i = 0; i < 4; i++) {
			Document document = new Document();
			document.add(new Field("id", String.valueOf(i), Field.Store.YES, Field.Index.NOT_ANALYZED, Field.TermVector.YES));
			document.add(new Field("name", array_name[i], Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES));
			document.add(new Field("content", array_content[i], Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES));
			writer.addDocument(document);
		}
		writer.optimize();
		writer.close();
		
		return true;
	}
	
	/**
	 * 删除索引 
	 * @throws ParseException 
	 */
	public void deletes() throws IOException, ParseException{
		
		Directory directory = FSDirectory.open(new File(indexPath));
		IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_33, analyzer);
		config.setOpenMode(OpenMode.CREATE_OR_APPEND);
		IndexWriter writer = new IndexWriter(directory, config);
		Term term = new Term("id", "0");
		writer.deleteDocuments(term);
//		Query query = new QueryParser(Version.LUCENE_33, "id", new StandardAnalyzer(Version.LUCENE_33)).parse("2");
//		writer.deleteDocuments(query);
		writer.optimize();
		System.out.println(writer.numDocs());
		writer.close();
	}
	
	/**
	 * 更新索引 
	 * @throws IOException 
	 */
	public void updates() throws IOException{
		
		Directory directory = FSDirectory.open(new File(indexPath));
		IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_33, analyzer);
		config.setOpenMode(OpenMode.CREATE_OR_APPEND);
		IndexWriter writer = new IndexWriter(directory, config);
		String [] array_content = {"索引的删除,纠结了很久,看到一篇总结不错的文章,转载过来好好学习", "即使在不关闭IndexReader的情况下"};
		String [] array_name = {"索引", "关闭"};
		for (int i = 0; i < 2; i++) {
			Document document = new Document();
			Term term = new Term("id", String.valueOf(i));
			document.add(new Field("id", String.valueOf(i), Field.Store.YES, Field.Index.NOT_ANALYZED, Field.TermVector.YES));
			document.add(new Field("name", array_name[i], Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES));
			document.add(new Field("content", array_content[i], Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES));
			writer.updateDocument(term, document);
			//Updates a document by first deleting the document(s) containing term and then adding the new document. The delete and then add are atomic as seen by a reader on the same index (flush may happen only after the add).
		}
		System.out.println(writer.numDocs());
		writer.optimize();
		writer.close();
	}
	
	/**
	 * 单条件查询
	 */
	public void search(String val) throws CorruptIndexException, IOException, ParseException{
		
		IndexSearcher search = new IndexSearcher(FSDirectory.open(new File(indexPath)), true);
		final String field = "name";
		QueryParser queryParser = new QueryParser(Version.LUCENE_33, field, analyzer);
		Query query = queryParser.parse(val);
		//设置高亮显示
		//设置高亮显示格式
		SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<font><strong>", "</strong></font>");
		//语法高亮显示设置
		Highlighter highlighter = new Highlighter(formatter, new QueryScorer(query));
		
		highlighter.setTextFragmenter(new SimpleFragmenter(100));//100似乎是表示最终输出字的个数
		
		
		TopDocs result = search.search(query, 10);// 10是显示队列的Size
		System.out.println("搜索结果,搜索条数为:" + result.totalHits);
		for (ScoreDoc item : result.scoreDocs) {
			Document document = search.doc(item.doc);
			String out = document.get(field);
			//搜索结果
			TokenStream tream = analyzer.tokenStream(field, new StringReader(out));
			try {
				System.out.println(highlighter.getBestFragment(tream, out));
			} catch (InvalidTokenOffsetsException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		search.close();
	}
	
	/**
	 * 多条件查询 
	 * @throws IOException 
	 * @throws CorruptIndexException 
	 * @throws ParseException 
	 */
	public void mutilSearch(String val) throws CorruptIndexException, IOException, ParseException{

		IndexSearcher search = new IndexSearcher(FSDirectory.open(new File(indexPath)), true);
		BooleanClause.Occur [] clauses = {BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD};
		//BooleanClause.Occur [] 表示多个条件之间的关系,
		//BooleanClause.Occur.MUST表示必须含有
		//BooleanClause.Occur.MUST_NOT表示不含有
		//BooleanClause.Occur.SHOULDb表示含不含有均可
		final String [] fields = {"name", "content"};
		//根据 name content两个属性查询
		Query query = MultiFieldQueryParser.parse(Version.LUCENE_33, val, fields, clauses, analyzer);
		
		//设置高亮显示
		//设置高亮显示格式
		SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<font><strong>", "</strong></font>");
		//语法高亮显示设置
		Highlighter highlighter = new Highlighter(formatter, new QueryScorer(query));
		highlighter.setTextFragmenter(new SimpleFragmenter(100));//100是高亮范围
		
		TopDocs result = search.search(query, 10);// 10是显示队列的Size
		System.out.println("搜索结果,搜索条数为:" + result.totalHits);
		for (ScoreDoc item : result.scoreDocs) {
			Document document = search.doc(item.doc);
			String out_name = document.get("name");
			String out_content = document.get("content");
			//搜索结果
			TokenStream tream_name = analyzer.tokenStream("name", new StringReader(out_name));
			TokenStream tream_content = analyzer.tokenStream("content", new StringReader(out_content));
			try {
				String name = highlighter.getBestFragment(tream_name, out_name);
				String content = highlighter.getBestFragment(tream_content, out_content);
				if(name == null)
					name = out_name;
				if(content == null)
					content = out_content;
				System.out.println(name);
				System.out.println(content);
				System.out.println("---------------");
			} catch (InvalidTokenOffsetsException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		search.close();
	}
	
	/**
	 * 多条件查询
	 * @throws IOException 
	 * @throws CorruptIndexException 
	 * @throws ParseException 
	 */
	public void mutilSearch_2(String val) throws CorruptIndexException, IOException, ParseException{
			
			IndexSearcher search = new IndexSearcher(FSDirectory.open(new File(indexPath)), true);
			BooleanQuery booleanQuery = new BooleanQuery();
			
			final String field = "name";
			QueryParser queryParser = new QueryParser(Version.LUCENE_33, field, analyzer);
			Query query = queryParser.parse(val);
			booleanQuery.add(query, Occur.MUST_NOT);
			
			final String field_2 = "content";
			QueryParser queryParser_2 = new QueryParser(Version.LUCENE_33, field_2, analyzer);
			Query query_2 = queryParser_2.parse(val);
			booleanQuery.add(query_2, Occur.MUST);
			
			//设置高亮显示
			//设置高亮显示格式
			SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<font><strong>", "</strong></font>");
			//语法高亮显示设置
			Highlighter highlighter = new Highlighter(formatter, new QueryScorer(query));
			
			highlighter.setTextFragmenter(new SimpleFragmenter(100));//100似乎是表示最终输出字的个数
			
			
			TopDocs result = search.search(booleanQuery, 10);// 10是显示队列的Size
			System.out.println("搜索结果,搜索条数为:" + result.totalHits);
			for (ScoreDoc item : result.scoreDocs) {
				Document document = search.doc(item.doc);
				String out_name = document.get("name");
				String out_content = document.get("content");
				//搜索结果
				TokenStream tream_name = analyzer.tokenStream("name", new StringReader(out_name));
				TokenStream tream_content = analyzer.tokenStream("content", new StringReader(out_content));
				try {
					String name = highlighter.getBestFragment(tream_name, out_name);
					String content = highlighter.getBestFragment(tream_content, out_content);
					if(name == null)
						name = out_name;
					if(content == null)
						content = out_content;
					System.out.println(name);
					System.out.println(content);
					System.out.println("---------------");
				} catch (InvalidTokenOffsetsException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			search.close();
		}
	
}
分享到:
评论

相关推荐

    luence客户端测试软件luke

    "luence客户端测试软件luke" 指的是一个名为"Luke"的工具,它是针对Apache Lucene(一个流行的全文搜索引擎库)的客户端测试和分析工具。Luence可能是“Lucene”的拼写错误,但在这里我们假设指的是Lucene。 **描述...

    Luence.net搜索小程序

    《Luence.net搜索小程序深度解析》 在信息技术日益发达的今天,搜索引擎已成为数据挖掘与信息检索的重要工具。本文将深入探讨一款基于.NET平台的搜索引擎——Luence.net,它以其高效、灵活的特点,为开发者提供了...

    Luence搜索Demo

    《Luence搜索Demo详解》 在信息技术领域,搜索引擎已经成为数据检索不可或缺的一部分,而Luence作为一款高性能、可扩展的全文搜索引擎库,深受开发者喜爱。本文将深入探讨基于.NET平台的Luence.Net搜索Demo,帮助...

    Luence原理及源码分析

    lucene 原理与分析,底层源码解析,应用场景及实践,相关配置

    Luence和ElasticSearch面试准备.docx

    《Luence和ElasticSearch面试准备》 Lucene和ElasticSearch是两个在全文搜索引擎领域中广泛使用的开源工具。Lucene是一个高性能、全文本搜索库,而Elasticsearch则是在Lucene的基础上构建的一个分布式、RESTful风格...

    IKAnalyzer和luence压缩包大全

    IKAnalyzer和Lucene是两个在中文处理领域广泛应用的开源项目。IKAnalyzer是一个专门针对中文的分词工具,而Lucene则是一个全文检索框架。这里我们深入探讨这两个组件以及它们的关联。 **IKAnalyzer** 是一个高性能...

    获取全部Luence数据

    ### 获取全部Luence数据 #### 知识点详解 **Lucene** 是一个高性能、全功能的文本搜索引擎库。在本文档中,我们将探讨如何通过Lucene获取索引中的所有文档,包括创建索引、查询索引以及遍历所有文档的具体步骤。 ...

    luence4.6例子

    5. **luence46**: 这个压缩包可能包含了Lucene 4.6版本的源代码,源码提供了深入了解其内部工作原理的机会。你可以通过阅读和分析源代码,学习如何实现自己的搜索功能,或者优化现有系统的搜索性能。 通过对...

    前后端分离的使用spring Mvc、 mybatis、 luence、 spring 开发的开源知识库系统的所有后端端源码

    在IT行业中,前后端分离是一种常见的软件开发模式,它将应用程序分为两个主要部分:前端(用户界面)和后端(服务器逻辑)。这种架构允许前端和后端开发人员独立工作,提高了开发效率,并提供了更好的可维护性和扩展...

    Luence in Action 中英文pdf 版

    《Lucene in Action》是一本深入探讨Apache Lucene的权威指南,这本书的中英文PDF版本提供了全面了解和学习这个搜索引擎库的机会。Lucene是Java开发的一款高性能、全文本搜索库,广泛应用于各种需要强大搜索功能的...

    luence搜索

    《深入理解Lucene搜索引擎》 Lucene,作为一个开源的全文搜索引擎库,被广泛应用于各种信息检索系统中。它提供了一套高效、灵活的文本搜索解决方案,使得开发者能够快速地在大量数据中实现高效的全文检索功能。...

    Luence简单实例

    在"Luence简单实例"中,我们可能会看到以下步骤的Java代码实现: 1. **创建索引**: 首先,需要创建一个`IndexWriter`对象,设置好索引目录和分析器。接着,通过`Document`对象添加字段,如`add(new Field("content...

    luence索引例子

    标题 "luence索引例子" 暗示我们要探讨的是Lucene,一个广泛使用的全文搜索引擎库,它在处理大量文本数据时提供了高效的检索能力。在这个例子中,我们将深入理解如何利用Lucene创建索引来优化数据库记录的搜索性能。...

    Luence的与盘古分词的使用软件

    总之,“Luence的与盘古分词的使用软件”是将Lucene.NET和盘古分词相结合,利用C# .NET技术在VS2013环境下构建的一款文本处理应用。它实现了对用户输入句子的分词,以及基于分词结果的索引查询,从而在大量文本数据...

    Luence+Ikanalyzer+stopword+dic

    在搜索引擎和信息检索领域,Lucene是一个非常重要的开源全文搜索引擎库。它提供了高效的文本索引和搜索功能,被广泛应用于各种信息系统的后台。在Lucene中,为了提高搜索的准确性和效率,通常会使用到一些优化技术,...

    前后端分离项目使用的spring Mvc、 mybatis、 luence、 spring 开发的开源知识库系统的所有后端端源码.zip

    前后端分离项目使用的spring Mvc、 mybatis、 luence、 spring 开发的开源知识库系统的所有后端端源码。 下载可运行。 使用前后端分离架构, 使用springMvc 、 spring、 mybatis、 luence等技术开发的开源知识库所有...

    VerticalSearcher:基本的垂直搜索引擎,实现了基本的网络爬虫功能以及用Luence实现检索

    《构建垂直搜索引擎:VerticalSearcher与Lucene的实践》 在信息技术日新月异的今天,搜索引擎已经成为我们获取信息的重要工具。垂直搜索引擎是相对于通用搜索引擎而言的,它专注于某一特定领域,如科技、医疗或教育...

    Lucene 索引图形化界面工具 LukeAll 3.5~4.0

    **Lucene 索引图形化界面工具 LukeAll 3.5~4.0** Lucene 是一个开源的全文搜索引擎库,它提供了强大的文本搜索功能,但其本身的接口设计是命令行或者编程式的,对于非开发人员或者在调试索引时可能会显得不太友好。...

    luence in action

    正在上传: 上传速度: 已用时: 预计剩余时间: 上传文件大小: 已上传大小: 0% 用过的tag 企业crm(1) 项目代码(1) java(1) luncene(1) 方法有图(1)

Global site tag (gtag.js) - Google Analytics