`
86asm
  • 浏览: 203781 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Lucene快速入门(二)

阅读更多

三、lucene入门实例:搜索索引

搜索索引作为Lucene两大基本操作之一,涉及到很多具体的搜索设置,这里先用一个简单的搜索实例来展示lucene的搜索功能,代码如下: 

public void query() throws ParseException, CorruptIndexException, IOException {
	String queryStr = "lucene"; // 要查询的文本
	// 1.把查询文本解析成Query对象
	String[] fields = { "fileName", "fileContent" };
	QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_30, fields, analyzer);
	Query query = queryParser.parse(queryStr);
	System.out.println("Query对象格式:" + query);
	// 2.开始查询
	long start = System.currentTimeMillis();
	IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File(indexDir)));
	TopDocs topDocs = searcher.search(query, 10000);
	System.out.println("共计查询到:" + topDocs.totalHits + " 条结果,用时" + (System.currentTimeMillis() - start)+ "毫秒");
	for (ScoreDoc scoreDoc : topDocs.scoreDocs) {// 打印查询结果
		int docSN = scoreDoc.doc; // 文档内部编号
		Document doc = searcher.doc(docSN); // 根据文档内部编号取出文档
	System.out.println("fileName=" + doc.get("fileName") + "\t fileSize=" + doc.get("fileSize")+ "\t fileContent=" +doc.get("fileContent") + "\t filePath=" + doc.get("filePath"));
	}
}

 

简析IndexSearcher作用就是完成对索引的搜索,但是搜索前必须传递一个Query对象。为什么要传递Query对象而不是传递一个字串直接进行搜索,首先要明确lucene创建索引中用到了字段域,其次要明确一份文档可能有很多字段域组成,搜索时不可能对每个字段域都进行搜索,最后要明确Query对象实质就是字段域信息(打印Query对象可以看出),即是说把搜索字串和字段域的名称相结合构造了字段域。明确了以上三点就不难理解Query对象的创建。搜索结果集TopDocs对象,此对象持有两个重要信息:一是查询到的总记录数,二是查询到记录数的集合(Document对象的集合),类似于数据库查询结果的封装。需要特别说明的是ScoreDoc对象并不是一个真正Document对象,它只是记录了文档对象的编号,要想获取Document对象,还需使用IndexSearcher类的doc方法来查出对应的Document对象。得到了Document对象,就可以获取字段域及查询到的信息。

总结查询三个关键对象:Query对象、IndexWriter对象、TopDocs对象

 

四、分词器

1.词的定义

词是经过分词器处理后的字串,更具体地说词是经过分词器以下四大操作而形成的字串:

1)关键词切分:对于英文来说每个单词就是一个关键词,而中文分词会根据一个词典来对关键词进行切分,不同的分词器对词的切分可能不同。

2)去除停用词:停用词是指一些出现频率较高,但是没有实际意义的词,比如英文中的“a an the”等,中文中的“的了着”等。

3)词形还原:主要是指把英文中的单词进行去尾操作,如现在分词、过去分词还原成词根形式,复数单词转为单数形式。

4)转为小写:把所有英文字母全部转成小写字母。

经过以上4步操作后得到的结果称为词元(Token),这些词元共同构成了词。

2.分词结果

为了能看清分词器分词后的效果,我们可以使用如下代码来测试。

public class AnalyzerTest {
	String enText = "Look, This's my first test about Lucene,Thanks.";
	String zhText = "瞧,这是我第一次lucene相关的练习,谢谢。";
	String zhText2 = "这是我的第一次关于lucene的练习。";
	Analyzer an = new StandardAnalyzer(Version.LUCENE_30);
Analyzer an2 = new CJKAnalyzer(Version.LUCENE_30);
// 二分法分词器:如“大家好啊”分词结果为:大家、家好、好啊
Analyzer an3 = new IKAnalyzer(); 
// IK分词器作者JE博客地址:linliangyi2007.iteye.com

	@Test
	public void testAnaly() throws IOException {
		printAnalyzerResult(an, enText);
		printAnalyzerResult(an2, zhText);
		printAnalyzerResult(an3, zhText);
		printAnalyzerResult(an3, zhText2);
	}

	public void printAnalyzerResult(Analyzer analyzer, String text) throws IOException {
System.out.println("分词器:" + analyzer.getClass().getName());
		Reader reader = new StringReader(text);
		TokenStream ts = analyzer.tokenStream("result", reader);	
		while (ts.incrementToken()) {
			System.out.println("词元信息:"+ts);
		}
	}
}

 

简析:TokenStream是词元的集合(A TokenStream enumerates the sequence of tokens),即是说它包含分词后的所有结果词元。我们也可根据TokenStream来构建一个字段域Field对象,如:Field field = new Field("result",ts); 从分词结果中打印的词元信息我们可以验证“分词器对词进行的四大操作”。

3.由分词引发的问题

1)使用相同分词器:创建索引时使用的分词器要和搜索时构建Query对象使用分词器相同。(2)在查询时英文字母还原为小写,这一步通常我们不需要关注,因为再把把查询文本解析成Query对象时,分词器会帮我们完成。(3)分词器的选择应以业务而定,也可以根据业务来实现特定的分词器。

3
1
分享到:
评论

相关推荐

    lucene 入门

    以上就是Lucene的基础知识和使用方法,通过这个入门资料,你可以快速上手并构建自己的全文搜索引擎。在实际应用中,还可以深入学习更高级的主题,如多字段搜索、评分策略、倒排索引优化等,以满足更复杂的需求。

    Lucene-入门

    **标题:“Lucene-入门”** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发并维护。它是Java编写的一个开源项目,被广泛应用于构建搜索引擎或者在大型数据集上进行全文检索。Lucene提供了丰富的搜索...

    Lucene快速入门

    这是一份Lncene快速入门的文档,文档里包括入门的代码实例以及工作原理和查询设置等一些常用到的Lucene知识

    Lucene2.4入门总结

    本文将重点介绍 Lucene 2.4 版本的基本概念和使用方法,帮助初学者快速入门。 ### 一、Lucene 概述 1. **核心概念**:Lucene 的主要组件包括索引(Index)、文档(Document)、字段(Field)和查询(Query)。索引...

    lucene3.0.0 入门DEMO

    总的来说,Lucene 3.0.0入门DEMO是一个很好的起点,它可以帮助新手快速了解和实践Lucene的基本用法。通过实际操作,你可以更好地掌握Lucene的索引构建和搜索机制,从而在自己的项目中灵活运用。

    Lucene 的入门 实例 代码

    【Lucene 入门教程】 Lucene 是一个由Apache软件基金会开发的开源...通过掌握这些知识,开发者可以快速入门并开始构建自己的全文检索应用。Lucene 的强大功能和灵活性使其成为开发高效、可扩展的搜索功能的理想选择。

    lucene 3.0 入门实例

    在这个过程中,Lucene 分析文本,创建倒排索引,使得对大量文档的搜索变得快速。 2. **文档(Document)**: 在 Lucene 中,一个文档是由多个字段(Field)组成的,每个字段都有一个名称和值,例如标题、内容等。 3...

    lucene3.6入门实例教程

    《Lucene 3.6 入门实例教程》是一份专为初学者设计的指南,旨在帮助用户快速掌握Apache Lucene 3.6版本的基本概念和应用。Lucene是一个高性能、全文检索库,广泛用于构建搜索功能强大的应用程序。这份教程通过完整的...

    lucene.net+完全入门教程

    **正文** Lucene.Net是一个基于Apache Lucene的开源全文搜索引擎库,它被移植到...教程可能涵盖从安装步骤、基本概念介绍,到实战案例的详细讲解,帮助初学者快速入门并熟练运用Lucene.Net进行全文搜索引擎的开发。

    lucene入门小例子

    Lucene通过分析文本,创建倒排索引,使得搜索过程能够快速定位到包含特定词的文档。 文档是Lucene处理的基本单位,可以看作是存储信息的对象,比如一篇文章或者一封电子邮件。每个文档由多个字段组成,每个字段有...

    lucene学习入门程序

    **Lucene学习入门程序** Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发并维护。它是Java编写,可以被集成到各种应用中,提供强大的文本检索功能。本程序是针对初学者设计的,旨在帮助开发者快速理解并...

    Lucene3.0入门实例含jar包

    **Lucene 3.0 入门实例及关键知识点** Lucene 是一个开源的全文搜索引擎库,由 Apache 软件基金会开发。它为开发者提供了在应用程序中实现文本搜索功能的强大工具。本实例主要针对 Lucene 3.0 版本,这个版本虽然...

    lucene 入门资料包

    ### 二、Lucene核心组件 1. **IndexWriter**: 用于创建或更新索引,可以添加、删除或修改文档。 2. **Directory**: 存储索引的容器,可以是文件系统、内存或分布式存储。 3. **IndexReader**: 用于读取索引,获取...

    Lucene 3.0完成入门

    - **索引**:Lucene 的核心是索引,它是一种预处理步骤,将文档内容转换为便于快速搜索的数据结构。 - **分词**:Lucene 使用分词器(Tokenizer)将文档拆分为单独的词汇项(Tokens),这是建立索引的基础。 - **...

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

    这些案例可以帮助初学者快速理解和应用Lucene-5.2.1的核心功能。通过实践,你可以更深入地了解Lucene的工作流程,为构建自己的全文检索系统打下坚实的基础。 总之,Lucene-5.2.1是一个强大而灵活的全文检索框架,...

    Lucene入门学习文档

    **Lucene入门学习文档** **一、什么是Lucene** Lucene是Apache软件基金会下的一个开源全文检索库,它提供了一个高性能、可扩展的信息检索服务。Lucene最初由Doug Cutting开发,现在已经成为Java社区中事实上的标准...

Global site tag (gtag.js) - Google Analytics