Lucene 4.X 倒排索引原理与实现: (1) 词典的设计 词典的格式设计词典中所保存的信息主要是三部分:Term字符串Term的统计信息,比如文档频率(Document Frequency)倒排表的位置信息其中Term字符串如何保存是一个很大的问题,根据上一章基本原理的表述中,我们知道,写入文件的Term是按照字典顺序排好序的,那么如何将这些排好序的Term保存起来呢?1. 顺序列表式一个直观的想法就是顺序列...
Hadoop学习总结之二:HDFS读写过程解析 一、文件的打开 1.1、客户端 HDFS打开一个文件,需要在客户端调用DistributedFileSystem.open(Path f, int bufferSize),其实现为: public FSDataInputStream open(Path f, int bufferSize) throws IOException { return new DFSClient.D...
面向连接的Socket Server的简单实现 一、基本原理 有时候我们需要实现一个公共的模块,需要对多个其他的模块提供服务,最常用的方式就是实现一个Socket Server,接受客户的请求,并返回给客户结果。 这经常涉及到如果管理多个连接及如何多线程的提供服务的问题,常用的方式就是连接池和线程池,基本流程如下: 首先服务器端有一个监听线程,不断监听来自客户端的连接。 当一个客户端连接到监听线程后,便建立了一个新的连接。 监听线...
有关Lucene的问题(8):用Lucene构建实时索引的文档更新问题 在有关Lucene的问题(7),讨论了使用Lucene内存索引和硬盘索引构建实时索引的问题。 然而有的读者提到,如果涉及到文档的删除及更新,那么如何构建实时的索引呢?本节来讨论这个问题。 1、Lucene删除文档的几种方式 IndexReader.deleteDocument(int docID)是用 IndexReader 按文档号删除。 IndexReader.delete...
Lucene学习总结之十:Lucene的分词器Analyzer 1、抽象类Analyzer 其主要包含两个接口,用于生成TokenStream: TokenStream tokenStream(String fieldName, Reader reader); TokenStream reusableTokenStream(String fieldName, Reader reader) ; 所谓TokenStream,后面我们会讲到,是一个由...
Lucene学习总结之九:Lucene的查询对象(3) 6、FilteredQuery FilteredQuery包含两个成员变量: Query query:查询对象 Filter filter:其有一个函数DocIdSet getDocIdSet(IndexReader reader) 得到一个文档号集合,结果文档必须出自此文档集合,注此处的过滤器所包含的文档号并不是要过滤掉的文档号,而是过滤后需要的文档号。 FilterQuery...
Lucene学习总结之八:Lucene的查询语法,JavaCC及QueryParser(1) 一、Lucene的查询语法Lucene所支持的查询语法可见http://lucene.apache.org/java/3_0_1/queryparsersyntax.html(1) 语法关键字+ - && || ! ( ) { } [ ] ^ " ~ * ? : \如果所要查询的查询词中本身包含关键字,则需要用\进行转义(2) 查询词(Term)L...
Lucene 4.X 倒排索引原理与实现: (3) Term Dictionary和Index文件 (FST详细解析) 我们来看最复杂的部分,就是Term Dictionary和Term Index文件,Term Dictionary文件的后缀名为tim,Term Index文件的后缀名是tip,格式如图所示。Term Dictionary文件首先是一个Header,接下来是PostingsHeader,这两个的格式一致,但是保存的是不同的信息。SkipInterval是跳跃表的跳的幅度,M...
高级Linux程序设计第五章:进程间通信 五种进程间通信的方式: 共享内存(shared memory):其允许多个进程通过读写同一块内存地址来相互通信。 内存映射(Mapped memory):其和共享内存相似,然而它是和文件系统上的一个文件相关联的。 管道(Pipe):其允许一个进程到另一个相关进程的顺序通信。 先入先出队列(FIFO):和管道类似,然而因为其对应于文件系统上的文件名,可以在两个不相关的进程...
Lucene 4.X 倒排索引原理与实现: (2) 倒排表的格式设计 1. 定长编码最容易想到的方式就是常用的普通二进制编码,每个数值占用的长度相同,都占用最大的数值所占用的位数,如图所示。这里有一个文档ID列表,254,507,756,1007,如果按照二进制定长编码,需要按照最大值1007所占用的位数10位进行编码,每个数字都占用10位。和词典的格式设计中顺序列表方式遇到的问题一样,首先的问题就是空间的浪费,本来254这个数值8位...
高级Linux程序设计第四章:线程 要想使用POSIX标准线程API(pthreads),需要连接libpthread.so库到程序中。 1、创建线程 进程中的每个线程都有一个线程号,类型为pthread_t。 用pthread_self函数可以返回当前线程的线程号。 线程号之间的比较可以用函数pthread_equal。 if (!pthread_equal (pthread_self (), o...
高级Linux程序设计第三章:进程 每个进程都有一个唯一的进程号。 每个进程都有一个父进程。 系统中的进程以树的形式组织,init进程(进程号为1)作为根。 进程0是调度进程,没有程序与之对应,是内核的一部分。 进程1是init进程,是在系统启动的阶段由内核启动的,对应/sbin/init程序,是普通的用户进程。 程序中可以通过getpid()得到进程号,通过getppid()得到父进程的进程号。 ...
Lucene 原理与代码分析完整版 Lucene 原理与代码分析系列文章已经基本告一段落,可能问题篇还会有新的更新。完整版pdf可由以下链接下载。Lucene 原理与代码分析完整版目录如下:目录目录第一篇:原理篇第一章:全文检索的基本原理一、总论二、索引里面究竟存些什么三、如何创建索引第一步:一些要索引的原文档(Document)。第二步:将原文档传给分次组件(Tokenizer)。第三步:将得到的词元(Tok...
有关Lucene的问题(7):用Lucene构建实时的索引 由于前一章所述的Lucene的事务性,使得Lucene可以增量的添加一个段,我们知道,倒排索引是有一定的格式的,而这个格式一旦写入是非常难以改变的,那么如何能够增量建索引呢?Lucene使用段这个概念解决了这个问题,对于每个已经生成的段,其倒排索引结构不会再改变,而增量添加的文档添加到新的段中,段之间在一定的时刻进行合并,从而形成新的倒排索引结构。 然而也正因为Lucene的事务性,使得...
高级Linux程序设计第二章:编写良好的Linux软件 1、同运行环境交互1.1、命令行当一个程序从shell启动的时候,其参数列表包括程序名称及所有的命令行参数% ls -s /其参数列表包含三项:第一项是程序名称ls,第二项和第三项分别是两个命令行参数,-s和/main函数可以通过argc和argv两个参数来访问命令行参数列表:argc是命令行参数的个数,argv是命令行参数字符串指针所组成...
有关Lucene的问题(6):Lucene的事务性 所谓事务性,本多指数据库的属性,包括ACID四个基本要素:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。 我们这里主要讨论隔离性,Lucene的IndexReader和IndexWriter具有隔离性。 当IndexReader.open打开一个索引的时候,相对于给当前索引进行了一次snapshot,此...
Lucene学习总结之七:Lucene搜索过程解析 本系列文章将详细描述几乎最新版本的Lucene的基本原理和代码分析。其中总体架构和索引文件格式是Lucene 2.9的,索引过程分析是Lucene 3.0的。鉴于索引文件格式没有太大变化,因而原文没有更新,原理和架构的文章中引用了前辈的一些图,可能属于早期的Lucene,但不影响对原理和架构的理解。本系列文章尚在撰写之中,将会有Java CC, 分词器,QueryParser...
Lucene学习总结之七:Lucene搜索过程解析(3) 2.3、QueryParser解析查询语句生成查询对象代码为:QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, "contents", new StandardAnalyzer(Version.LUCENE_CURRENT)); Query query = parser.parse("+(...
Lucene学习总结之九:Lucene的查询对象 Lucene学习总结之九:Lucene的查询对象(1)http://www.cnblogs.com/forfuture1978/archive/2010/05/19/1738803.htmlLucene学习总结之九:Lucene的查询对象(2)http://www.cnblogs.com/forfuture1978/archive/2010/05/19/1738804.htmlLucen...
Lucene学习总结之九:Lucene的查询对象(2) 5、SpanQuery 所谓SpanQuery也即在查询过程中需要考虑进Term的位置信息的查询对象。 SpanQuery中最基本的是SpanTermQuery,其只包含一个Term,与TermQuery所不同的是,其提供一个函数来得到位置信息: public Spans getSpans(final IndexReader reader) throws IOException...