06 2010 档案

摘要: 在有关Lucene的问题(7),讨论了使用Lucene内存索引和硬盘索引构建实时索引的问题。 然而有的读者提到,如果涉及到文档的删除及更新,那么如何构建实时的索引呢?本节来讨论这个问题。 1、Lucene删除文档的几种方式 IndexReader.deleteDocument(int docID)是用 IndexReader 按文档号删除。 IndexReader.deleteDocuments(Term term)是用 IndexReader 删除包含此词(Term)的文档。 IndexWriter.deleteDocuments(Term term)是用 IndexWriter 删除包..阅读全文
posted @ 2010-06-27 14:17 刘超觉先 阅读(12889) | 评论 (7) 编辑
摘要: Lucene 原理与代码分析系列文章已经基本告一段落,可能问题篇还会有新的更新。完整版pdf可由以下链接下载。Lucene 原理与代码分析完整版目录如下:目录目录第一篇:原理篇第一章:全文检索的基本原理一、总论二、索引里面究竟存些什么三、如何创建索引第一步:一些要索引的原文档(Document)。第二步:将原文档传给分次组件(Tokenizer)。第三步:将得到的词元(Token)传给语言处理组件(Linguistic Processor)。第四步:将得到的词(Term)传给索引组件(Indexer)。1.利用得到的词(Term)创建一个字典。2.对字典按字母顺序进行排序。3.合并相同的词(T阅读全文
posted @ 2010-06-13 01:52 刘超觉先 阅读(46060) | 评论 (81) 编辑
摘要: 由于前一章所述的Lucene的事务性,使得Lucene可以增量的添加一个段,我们知道,倒排索引是有一定的格式的,而这个格式一旦写入是非常难以改变的,那么如何能够增量建索引呢?Lucene使用段这个概念解决了这个问题,对于每个已经生成的段,其倒排索引结构不会再改变,而增量添加的文档添加到新的段中,段之间在一定的时刻进行合并,从而形成新的倒排索引结构。 然而也正因为Lucene的事务性,使得Lucene的索引不够实时,如果想Lucene实时,则必须新添加的文档后IndexWriter需要commit,在搜索的时候IndexReader需要重新的打开,然而当索引在硬盘上的时候,尤其是索引非常大的时候阅读全文
posted @ 2010-06-08 01:59 刘超觉先 阅读(11041) | 评论 (8) 编辑
摘要: 所谓事务性,本多指数据库的属性,包括ACID四个基本要素:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。 我们这里主要讨论隔离性,Lucene的IndexReader和IndexWriter具有隔离性。 当IndexReader.open打开一个索引的时候,相对于给当前索引进行了一次snapshot,此后的任何修改都不会被看到。 仅当IndexReader.open打开一个索引后,才有可能看到从上次打开后对索引的修改。 当IndexWriter没有调用Commit的时候,其修改的内容是不能够被看到的,哪怕...阅读全文
posted @ 2010-06-07 01:39 刘超觉先 阅读(5513) | 评论 (0) 编辑
摘要: 1、抽象类Analyzer 其主要包含两个接口,用于生成TokenStream: TokenStream tokenStream(String fieldName, Reader reader); TokenStream reusableTokenStream(String fieldName, Reader reader) ; 所谓TokenStream,后面我们会讲到,是一个由分词后的Token结果组成的流,能够不断的得到下一个分成的Token。 为了提高性能,使得在同一个线程中无需再生成新的TokenStream对象,老的可以被重用,所以有reusableTokenStream一说...阅读全文
posted @ 2010-06-06 22:14 刘超觉先 阅读(32966) | 评论 (0) 编辑