Lucene 重建索引流程设计(草稿)

参考网站:http://blog.developers.api.sina.com.cn/?p=680


流程设计草稿,欢迎拍砖!

Lucene 重建索引流程设计

TangFulin <tangfulin@gmail.com>

一. php client 端:

1. update 与 rebuild 分开

2. update 准实时:insert,update,delete 实时调用更新索引接口(带 primery key 的update 和 delete)

3. rebuild 使用命令行或者 cron 运行,不能使用 web 页面(有运行时间限制),但可以在后台管理系统中作触发(如何防止重复触发?)

二. Java IndexServer:(接受 client 发过来的数据,输出为临时 xml 文件)

1. 日常 update 的 xml 临时文件可以考虑保存在内存文件系统中(保留最近n天的文件debug使用)

2. 更多的处理过程 log (debug 使用,日常监控使用)

3. rebuild 的 xml 临时文件一定要保存在内存文件系统中

4. xml 文件按年或月分目录

5. rebuild 的过程中,update 数据需要为新索引保留一份,等 rebuild 完成后更新新的索引(需要一个 rebuild_update 目录,等搜索切换到使用新的索引后,用该目录替换原来的 update 目录)

三. Java IndexWriter:(读取 update xml 文件,更新索引)

1. update 与 rebuild 分开,以便设置不同的合并因子等参数,以达到最快的 rebuild 速度

2. 每一个索引对应一个 update 文件目录,当索引切换的时候,update 目录跟着切换,以保证索引数据一致

四. Java IndexRebuilder:(读取 rebuild xml 文件,新建索引)

1. rebuild 过程:

a. 正常情况: client 发送 update 数据给 IndexServer ,IndexServer 将数据写入 update 目录,IndexRebuilder 定期扫描 update 目录,读取 xml 文件并更新索引

b. client 发送“重建索引开始”消息给 IndexServer,IndexServer 设置标志位,从当前开始,所有的 update xml 都抄送一份到 rebuild_update 目录。同时给 IndexRebuilder 发送 “重建索引开始” 消息。(消息中能否带有这次重建索引的大致的条目数?可以用来确定派生多少个线程)

c. client 发送重建索引数据给 IndexServer,IndexServer 将这些数据输出到 rebuild 目录下

d. IndexRebuilder 收到 “重建索引开始” 消息后,(根据大致的条目数,相应的派生线程)扫描 rebuild 目录,使用其中的 xml 文件建立索引

e. client 发送“重建索引结束”消息给 IndexServer, IndexServer 转发消息给 IndexRebuilder

f. IndexRebuilder 收到“重建索引结束”消息后,等待所有线程工作完成,然后开始使用 rebuild_update 中的数据更新新的索引

g. IndexRebuilder 更新索引到一个可用状态后(如何判定?某一次列目录发现没有新xml文件?),停止更新,开始 切换到使用新索引

2. 切换到使用新索引过程:

a. IndexRebuilder 发送“停止更新索引”消息给 IndexWriter,后者停止更新旧索引,close 打开的文件

b. IndexRebuilder 拷贝新索引,覆盖旧索引

c. IndexRebuilder 将旧的 update 目录指向 rebuild_update 目录

d. IndexRebuilder 发送“停止抄送 update xml 文件到 rebuild_update” (重建索引完成)命令给 IndexServer,并将 rebuild_update 指向新的空目录

e. IndexRebuilder 发送“重新开始更新索引”消息给 IndexWriter,后者 reopen 索引,并照常更新

f. IndexRebuilder 清除旧索引文件,等待下一次重建索引消息

3. 重建索引的加速:(初步设想)

a. 根据索引大致的条目数,预先派生线程

b. 每个线程单独建立索引,完成后再归并

c. 预先派生线程数目,以及归并策略(1次归并,或者多次,每次把n个归并成1个)需要测试

五. IndexSearch:(读取索引,响应搜索请求)

1. 同步索引:从 IndexWriter 同步到 IndexSearch 上,使用 bash 脚本,rsync

2. reopen:索引更新以后,发消息通知 IndexSearch 重新读入索引,可以使用 curl


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lucene是一个开源的全文搜索引擎库,它提供了丰富的API和功能来创建、更新和搜索索引。要更新Lucene索引,首先需要获取一个IndexWriter实例,然后通过该实例来执行索引更新操作。 更新索引的过程通常包括以下几个步骤: 1. 创建或获取一个IndexWriter实例:IndexWriter负责索引的写入和更新操作,需要确保只有一个线程能够同时操作一个IndexWriter实例。 2. 创建或获取文档对象:更新索引需要构建文档对象,可以通过Document类来创建一个文档对象,并向其添加字段。 3. 执行更新操作:可以通过IndexWriter的addDocument、updateDocument或deleteDocuments方法来执行索引的添加、更新或删除操作。 4. 提交更新:在更新索引操作完成后,需要调用IndexWriter的commit或flush方法来提交更新,使更新操作生效。 更新索引的频率取决于应用的需求,可以是实时更新,也可以是批量更新。总之,更新索引是一个重要的操作,在使用Lucene构建搜索引擎或全文检索功能时,需要根据具体的业务需求来合理地更新索引。同时,为了保证索引更新的性能和可靠性,需要注意合理地管理IndexWriter实例,确保其在适当的时候被关闭或重新打开。 总之,通过Lucene的API和功能,可以方便地进行索引的更新操作,从而保证应用的搜索功能能够及时、准确地返回符合用户需求的搜索结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值