在做一个站内的搜索引擎, 仅有数据库的一些字符串匹配的函数是不够的, 往往需要从数据库(离线地)或从用户当前的输入(在线地,或短间隔地)把一条一条的数据记录(以下称为Entry)读出建索引并适时的进行优化(IndexWriter.optimize()). 上面说的也就是要做好三个工作:离线全局索引,在线索引,适时的优化索引.
在说设计之前需要先介绍一下Lucene的索引读写的特征:1) Lucene的索引写入时会对写入的速度做优化,会牺牲index的查找(读)速度, 为提高index的查找,需要进行优化( IndexWriter.optimize ) 2) 对同一个index目录, lucene的写操作不能同进行 3) lucene的读写操作可同时进行, 但读的是"上一次写完的index"
结合lucene IndexWriter现有的特征,索引器需要做到:
1) 优化时不重建索引, 重建索引时不优化
2) 重建索引可以与 在线索引同时进行, 但是,需要做一次index的拷贝, 在拷贝上重建, 在重建过程中在线索引仍在进行, 但不能添加到当前索引目录, 应添加到一个temp index目录上. 在重建索引读完数据库后, 应当将temp index合并到重建的索引上, 合并的过程不允许在线索引进行写入. 合并完后,在线index变成重建的这个index.
3) 优化index和在线索引的关系 与 重建索引和在线索引的关系一样.
在线的写入的索引项放入一个池中, 系统的在线索引线程会定时地到池子中取出所有的东东写入索引.
系统的简单静态示意图如下:

modificationPool就是在线记录池, 定时的会被QueryIndexer写入当前索引中. reconstructDBIndex()是重建索引, 而优化这里没有体现.
在说设计之前需要先介绍一下Lucene的索引读写的特征:1) Lucene的索引写入时会对写入的速度做优化,会牺牲index的查找(读)速度, 为提高index的查找,需要进行优化( IndexWriter.optimize ) 2) 对同一个index目录, lucene的写操作不能同进行 3) lucene的读写操作可同时进行, 但读的是"上一次写完的index"
结合lucene IndexWriter现有的特征,索引器需要做到:
1) 优化时不重建索引, 重建索引时不优化
2) 重建索引可以与 在线索引同时进行, 但是,需要做一次index的拷贝, 在拷贝上重建, 在重建过程中在线索引仍在进行, 但不能添加到当前索引目录, 应添加到一个temp index目录上. 在重建索引读完数据库后, 应当将temp index合并到重建的索引上, 合并的过程不允许在线索引进行写入. 合并完后,在线index变成重建的这个index.
3) 优化index和在线索引的关系 与 重建索引和在线索引的关系一样.
在线的写入的索引项放入一个池中, 系统的在线索引线程会定时地到池子中取出所有的东东写入索引.
系统的简单静态示意图如下:

modificationPool就是在线记录池, 定时的会被QueryIndexer写入当前索引中. reconstructDBIndex()是重建索引, 而优化这里没有体现.