Lucene 索引和搜索过程核心类详解

[b][size=medium;]Lucene 索引和搜索过程核心类详解[/size]
[/b]

[size=small;][b]索引核心类[/b]
[/size]


1、IndexWriter(写索引)<br>
2、Directory(索引存放位置)<br>
3、Analyzer(分析器)<br>
4、document(文档)<br>
5、Field(域)

?

[size=small;][b]搜索核心类[/b]
[/size]
<br>
1、IndexSearcher(搜索引)<br>
2、Term(搜索功能基本单元)<br>
3、Query(查询)<br>
4、TermQuery(Query 子类 最基本查询类型)<br>
5、TopDocs(指针容器)

?

?

[b][size=medium;]IndexWriter[/size]
[/b]


????? IndexWriter是在索引过程中的中心组件。这个类创建一个新的索引并且添加文档到一个已有的索引中。<br>
它可以对索引进行添、删、更新操作,但是不能读取或搜索。<br><br>[b][size=small;]添加方法[/size]
[/b]
<br>
????? [b]addDocument[/b]
(Document)加Document使用默认的分词器<br>
????? [b]addDocument[/b]
(Document, Analyzer)加入的时候使用指定的分词器<br><br>[size=small;][b]删除方法[/b]
[/size]
<br>
???? [b]deleteDocuments[/b]
(Term);<br>
???? [b]deleteDocuments[/b]
(Term[]);<br>
???? [b]deleteDocuments[/b]
(Query);<br>
???? [b]deleteDocuments[/b]
(Query[]);<br>
???? 一般最好有个唯一索引,这样才好删,不然的话有可以会一删一大堆<br>
???? 如:writer.deleteDocument(new Term(“ID”, documentID));<br><br>[size=small;][b]更新方法[/b]
[/size]
<br>
????? 注意:更新索引也提供两个方法,其实Lucene是没有办法更新的,只有先删除了再更新,<br>
????? [b]updateDocument[/b]
(Term, Document);<br>
????? 如:writer.updateDocument(new Term(“ID”, documenteId), newDocument); <br>
????? [b]updateDocument[/b]
(Term, Document, Analyzer)

?

?

[size=medium;][b]Directory[/b]
[/size]
<br>
????? [size=small;]Directory类代表一个Lucene索引的位置。它是一个抽象类,允许它的子类(其中的两个包含在Lucene中)在合适时存储索引。在我们的Indexer示例中,我们使用一个实际文件系统目录的路径传递给IndexWriter的构造函数来获得Directory的一个实例。IndexWriter然后使用Directory的一个具体实现FSDirectory,并在文件系统的一个目录中创建索引。<br>
????? [size=x-small;]在你的应用程序中,你可能较喜欢将Lucene索引存储在磁盘上。这时可以使用FSDirectory,一个包含文件系统真实文件列表的Driectory子类,如同我们在Indexer中一样。另一个Directory的具体子类是RAMDirectory。尽管它提供了与FSDirectory相同的接口,RAMDirectory将它的所有数据加载到内存中。所以这个实现对较小索引很有用处,可以全部加载到内存中并在程序关闭时销毁。因为所有数据加载到快速存取的内存中而不是在慢速的硬盘上,RAMDirectory适合于你需要快速访问索引的情况,不管是索引或搜索。做为实例,Lucene的开发者在所有他们的单元测试中做了扩展使用:当测试运行时,快速的内存驻留索引被创建搜索,当测试结束时,索引自动销毁,不会在磁盘上留下任何残余。当然,在将文件缓存到内存的操作系统中使用时[b]RAMDirectory和FSDirectory用法[/b]
:[url=http://eryk.iteye.com/blog/1115456]http://eryk.iteye.com/blog/1115456[/url]
[/size]
[/size]


?

[size=medium;][b]Analyzer(分析器)[/b]
[/size]


????? [size=small;]在文本索前之前,它先通过Analyzer。Analyzer在IndexWriter的构造函数中指定,是指对文本内容提取关键词并除去其它的。如果要索引的内容不是普通的文本,首先要转化成文本,Analyzer是个抽象类,但是Lucene中有几个它的实现。有的处理不能用来把某个文件与其它文件区分开的常用的词);有的处理时把关键字转化为小写字母,所以这个搜索不是大小写敏感等等。Analyzer是Lucene的一个重要的部分并且不只是在输入过滤中使用。对一个将Lucene集成到应用程序中的开发者来说,对Analyzer的选择在程序设计中是重要元素。[/size]


?

?

<h3>
[url=http://grunt1223.iteye.com/blog/969197]深入浅出Lucene Analyzer[/url]
</h3>
<h3>
[url=http://wangwanbao.iteye.com/blog/328090]Lucene中Analyzer处理过程详解[/url]
</h3>
<h3><br></h3>
[size=medium;][b]Document [/b]
[/size]
<br>
????? [size=small;]一个Document代表字段的集合。你可以把它想象为以后可获取的虚拟文档—一块数据,如一个网页、一个邮件消息或一个文本文件。一个文档的字段代表这个文档或与这个文档相关的元数据。文档数据的最初来源(如一条数据库记录、一个Word文档、一本书的某一章等等)与Lucene无关。元数据如作者、标题、主题、修改日期等等,分别做为文档的字段索引和存储。[/size]
<br>[size=small;][b]注意[/b]
[/size]
当我们在本书中提到一个文档,我们指一个Microsoft Word、RTF、PDF或其它文档类型;我们不是谈论Lucene的Document类。注意大小写和字体的区别。<br>
????? Lucene只用来处理文本。Lucene的核心只能用来处理java.lang.String和java.io.Reader。尽管很多文档类型都能被索引并使之可搜索,处理它们并不像处理可以简单地转化为java的String或Reader类型的纯文本内容那样直接。在我们的Indexer中,我们处理文本文件,所以对我们找出的每个文本文件,创建一个Document类的实例,用Field(字段)组装它,并把这个Document添加到索引中,完成对这个文件的索引。

?

?

[size=medium;][b]Field[/b]
[/size]
<br>
??? 在索引中的每个Document含有一个或多个字段,具体化为Field类。每个字段相应于数据的一个片段,将在搜索时查询或从索引中重新获取。

<br>[size=small;]Lucene提供四个不同的字段类型,你可以从中做出选择:[/size]
<br>[b]1、Keyword不被分析,但是被索引并逐字存储到索引中。[/b]
<br>
????? 这个类型适合于原始值需要保持原样的字段,如URL、文件系统路径、日期、个人名称、社会安全号码、电话号码等等。例如,我们在Indexer(列表1.1)中把文件系统路径作为Keyword字段。

<br>[b]2、UnIndexed—不被分析也不被索引,但是它的值存储到索引中。[/b]
<br>
????? 这个类型适合于你需要和搜索结果一起显示的字段(如URL或数据库主键),但是你从不直接搜索它的值。因为这种类型字段的原始值存储在索引中,这种类型不适合于存放比较巨大的值,如果索引大小是个问题的话。

<br>[b]3、UnStored—和UnIndexed相反。[/b]
<br>
????? 这个字段类型被分析并索引但是不存储在索引中。它适合于索引大量的文本而不需要以原始形式重新获得它。例如网页的主体或任休其它类型的文本文档。

<br>[b]4、Text—被分析并索引。[/b]
<br>
????? 这就意味着这种类型的字段可以被搜索,但是要小心字段大小。如果要索引的数据是一个String,它也被存储;但如果数据(如我们的Indexer例子)是来自一个Reader,它就不会被存储。这通常是混乱的来源,所以在使用Field.Text时要注意这个区别。<br><br>
所有字段由名称和值组成。你要使用哪种字段类型取决于你要如何使用这个字段和它的值。严格来说,Lucene只有一个字段类型:以各自特征来区分的字段。有些是被分析的,有些不是;有些是被索引,然面有些被逐字地存储等等。<br>
表1.2提供了不同字段特征的总结,显示了字段如何创建以及基本使用示例。<br>
表1.2 不同字段类型的特征和使用方法<br>
Fied method/type Analyzed Indexed Stored Example usage<br>
Field.Keyword(String,String)<br>
Field.Keyword(String,Date) ? ? Telephone and Social Security numbers, URLs, personal names, Dates<br>
Field.UnIndexed(String,String) ? Document type (PDF, HTML, and so on), if not used as search criteria<br>
Field.UnStored(String,String) ? ? Document titles and content<br>
Field.Text(String,String) ? ? ? Document titles and content<br>
Field.Text(String,Reader) ? ? Document titles and content<br><br>[size=small;][b]注意[/b]
[/size]
所有字段类型都能用代表字段名称和它的值的两个String来构建。<br>
另外,一个Keyword字段可以接受一个String和一个Date对象,Text字段接受一个String和一个Reader对象。<br>
在所有情况下,这些值在被索引之前都先被转化成Reader,这些附加方法的存在可以提供比较友好的API。<br>
注意 注意Field.Text(String, String)和Field.Text(String, Reader)之间的区别。String变量存储字段数据,而Reader变量不存储。为索引一个String而又不想存储它,可以用Field.UnStored(String, String)。<br>
最后,UnStored和Text字段能够用来创建词向量。为了让Lucene针对指定的UnStored或Text字段创建词向量,你可以使用Field.UnStored(String, String, true),Field.Text(String, String, true)或Field.Text(String, Reader, true)。

?

?

[size=small;][b]//==========搜索核心类=======[/b]
[/size]


?

[size=medium;][b]IndexSearcher[/b]
[/size]
<br>
????? IndexSearcher用来搜索而IndexWriter用来索引:暴露几个搜索方法的索引的主要链接。你可以IndexSearcher想象为以只读方式打开索引的一个类。它提供几个搜索方法,其中一些在抽象基类Searcher中实现;最简单的接受单个Query对象做为参数并返回一个Hits对象。这个方法的典型应用类似这样:<br>
IndexSearcher is = new IndexSearcher(<br>
FSDirectory.getDirectory(“/tmp/index”, false));<br>
Query q = new TermQuery(new Term(“contents”, “lucene”));<br>
Hits hits = is.search(q);

<h3 class="title pre fs1">
<a href="http://xucqjob.blog.163.com/blog/static/9822021420114138943477/"><span class="tcnt">lucene3.0_IndexSearcher的基础使用及注意事项</span>
? </a>
<br>
</h3>
?

[size=medium;][b]Term[/b]
[/size]
<br>
????? Term是搜索的基本单元。与Field对象类似,它由一对字符串元素组成:字段的名称和字段的值。注意Term对象也和索引过程有关。但是它们是由Lucene内部生成,所以在索引时你一般不必考虑它们。在搜索时,你可能创建Term对象并TermQuery同时使用。

<br>[b]Query q = new TermQuery(new Term(“contents”, “lucene”));<br>
Hits hits = is.search(q);[/b]
<br>
这段代码使Lucene找出在contents字段中含有单词lucene的所有文档。因为TermQuery对象继承自它的抽象父类Query,你可以在等式的左边用Query类型

?

?

?

[size=medium;][b]Query[/b]
[/size]
<br>
?????? Lucene中包含一些Query的具体子类。到目前为止,在本章中我们仅提到过最基本的Lucene Query:TermQuery。其它Query类型有BooleanQuery,PhraseQuery, PrefixQuery, PhrasePrefixQuery, RangeQuery, FilteredQuery和SpanQuery。

<a href="http://blog.sina.com.cn/s/blog_4efddaed0100bsa8.html">[size=medium;][b]构建各种Lucene Query[/b]
[/size]
</a>


?

[size=medium;][b]TermQuery[/b]
[/size]
<br>
?????? TermQuery是Lucene支持的最基本的查询类型,并且它也是最原始的查询类型之一。它用来匹配含有指定值的字段的文档,这在前几段只已经看到。

?

[size=medium;][b]TopDocs[/b]
[/size]
<br>
搜索结果的容器。TopFieldDocs是其派生类,也是存放搜索结果的容器<br><br>[url=http://www.7-sun.com/doc/Lucene3.03/org/apache/lucene/search/class-use/TopDocs.html]类 org.apache.lucene.search.TopDocs的使用[/url]
<br>[url=http://www.7-sun.com/doc/Lucene3.03/org/apache/lucene/search/class-use/TopDocs.html]http://www.7-sun.com/doc/Lucene3.03/org/apache/lucene/search/class-use/TopDocs.html[/url]


?

?

?

?

<h3>
[url=/admin/blog/1280379]Lucene 笔记一(是什么?,能做什么?,怎么做?)[/url]
</h3>
?

<h1 class="postTitle">
<a id="ctl03_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/ibook360/archive/2011/10/18/2216631.html">Apache Lucene 3.x推荐教程</a>
</h1>



[size=18pt;][b]</strong>
[/size]


<h1 class="postTitle">
</h1>
<div class="postBody">
<div id="cnblogs_post_body">
[/size]
[/b]
</span>


?

?

?

?

?

?

?

?

?

?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值