29. 实现 (1/8)
IndexRebuilder
搜索管理后台
发出开始重建索引命令 IndexReceiver
cron 发送重建数据
Rebuild
xml data
端口
1986
Update
xml data IndexUpdater
DAL 数据更新 配置文件
同步通知搜索
Searcher
搜索客户端调用
Searcher 的 API 端口
1985
30. 实现 (2/8)IndexReceiver
IndexRebuilder
搜索管理后台 IndexReceiver
发出开始重建索引命令
cron 发送重建数据
Rebuild
xml data
端口
1986
Update
xml data IndexUpdater
DAL 数据更新 配置文件
同步通知搜索
Searcher
搜索客户端调用
Searcher 的 API 端口
1985
32. 实现 (3/8)IndexUpdater
IndexRebuilder
搜索管理后台
发出开始重建索引命令
cron 发送重建数据
Rebuild
xml data
端口
1986
Update
IndexUpdater
xml data
DAL 数据更新 配置文件
同步通知搜索
Searcher
搜索客户端调用
Searcher 的 API 端口
1985
34. 实现 (4/8)IndexRebuilder
IndexRebuilder
搜索管理后台
发出开始重建索引命令
cron 发送重建数据
Rebuild
xml data
端口
1986
Update
xml data
DAL 数据更新 配置文件
同步通知搜索
Searcher
搜索客户端调用
Searcher 的 API 端口
1985
37. 实现 (6/8)Transfer
搜索管理后台
发出开始重建索引命令
cron 发送重建数据
Rebuild
xml data
端口
1986
Update
xml data
DAL 数据更新 配置文件
同步通知搜索
Searcher Transfer
搜索客户端调用
Searcher 的 API 端口
1985
39. 实现 (7/8)Searcher
搜索管理后台
发出开始重建索引命令
cron 发送重建数据
Rebuild
xml data
端口
1986
Update
xml data
DAL 数据更新 配置文件
同步通知搜索
Searcher
搜索客户端调用
Searcher 的 API 端口
1985
54. 开发中的一些收获 (1/5)
FileChannel.transferTo 拷贝文件失败:
Fewer than the requested number of bytes are transferred if the
target channel is non-blocking and it has fewer than count bytes
free in its output buffer.
解决: check copied size ,断点续传
根据 lucene 索引文件更新的特性 ( 每次更新一个新版本的时
候,都会新建一个全新的文件 ) ,使用 cp -l 链接替代真实的
大文件拷贝动作
55. 开发中的一些收获 (2/5)
Kill 的问题
Never kill smart frog, don't kill 9
Java use Runtime.getRuntime().addShutdownHook to do the cleaning
things
Lucene IndexWriter need close!
server 程序,都应该考虑信号捕捉和处理的问题( java 程序容易忽
略这个问题)
61. Lucene 3
Lucene 2.9
• Searchable.search(Weight, Filter, Collector): collector 终于可用了
• Added new MultiReaderHitCollector: 解决 group by
• near real-time search via IndexWriter.getReader(): 单机方案
Lucene 3.0
• Del deprecated apis: 大版本升级要谨慎
• Port to Java5: 应该会有性能的提升
Lucene 3.1
• Near Realtime Search (using a built in RAMDirectory): 还是单机方案
• Complete overhaul of FieldCache API/Implementation: 等到花儿也谢了
62. 定制功能
在某些情况下作为数据库的替代数据源
类似淘宝搜索,按多个字段筛选,过滤,排序
当前解决方案:使用 sql 从数据库中选取数据
问题:数据可能因为业务逻辑的设计而分散在多个不同的
库,表中,联表查询问题,并发压力问题
难点:非典型的复杂的查询条件,如 group by