Your SlideShare is downloading. ×
0
Lucene实践
Lucene实践
Lucene实践
Lucene实践
Lucene实践
Lucene实践
Lucene实践
Lucene实践
Lucene实践
Lucene实践
Lucene实践
Lucene实践
Lucene实践
Lucene实践
Lucene实践
Lucene实践
Lucene实践
Lucene实践
Lucene实践
Lucene实践
Lucene实践
Lucene实践
Lucene实践
Lucene实践
Lucene实践
Lucene实践
Lucene实践
Lucene实践
Lucene实践
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Lucene实践

1,586

Published on

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,586
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
19
Comments
0
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Lucene实践[lu:si:n]陈晓锋 / GT-0
  • 2. 目录Lucene简介  Lucene.Net简介  开源项目和应用案例Lucene基础  Lucene全文搜索处理流程  建立索引  查询索引Lucene在布啦中的实践  旧布啦搜索存在的问题  新搜索方案  分词组件选择  近实时搜索
  • 3. 目录Lucene简介  Lucene.Net简介  开源项目和应用案例Lucene基础  Lucene全文搜索处理流程  建立索引  查询索引Lucene在布啦中的实践  旧布啦搜索存在的问题  新搜索方案  分词组件选择  近实时搜索
  • 4. Lucene简介• 由Doug Cutting开发和开源,于2001年贡献 给Apache基金会维护• 基于java的全文搜索组件• 不需依赖其他组件• 扩展性好,可以基于接口实现第三方的分 词组件• 最新到3.5版
  • 5. Lucene.Net介绍• 基于java版lucene移植• 因为维护不活跃,已被Apache基金会放回 孵化器中• 最新稳定版到2.9.2
  • 6. 开源项目和应用案例• Solr – 面向企业基于Lucene的全文搜索方案,支持pdf、 word等文档内容搜索• indextank-engine – Linkedin收购IndexTank公司后开源的全文搜索项目, 支持实时,自动完成和一个推荐相关的特性• StackOverflow – 全球最大的编程问答站点,基于lucene.net的全文 搜索成功案例
  • 7. 目录Lucene简介  Lucene.Net简介  开源项目和应用案例Lucene基础  Lucene全文搜索处理流程  建立索引  查询索引Lucene在布啦中的实践  旧布啦搜索存在的问题  新搜索方案  分词组件选择  近实时搜索
  • 8. Lucene全文搜索处理流程
  • 9. 建立索引static void Main(string[] args) { var ramDir = new RAMDirectory(); //内存存储 var analyzer = new SimpleAnalyzer(); //分析器 var writer = new IndexWriter(ramDir, analyzer, true); //创建 IndexWrite类 //加入文档 var document = new Document(); document.Add(new Field("title", "建立索引测试 ", Field.Store.YES, Field.Index.ANALYZED)); document.Add(new Field("content", "测试 demo", Field.Store.NO, Field.Index.ANALYZED)); writer.AddDocument(document); //关闭IndexWrite writer.Close();}
  • 10. 索引存储方式的差别• RAMDirectory – 把所有内容保存到内存中• SimpleFSDirectory – 保存到磁盘中,并发读使用lock来实现,并发性能不好• NIOFSDirectory – 保存到磁盘中,不用使用lock就能支持多线程读,不支 持windows• MMapDirectory – 通过内存映射(memory-mapped)来访问索引文件,不用 使用lock支持多线程读,映射索引需要同等大小的内存, 因为内存碎片的原因很容易导致OutOfMemory异常
  • 11. 索引存储方式的选择• Windows平台直接使用SimpleFSDirectory, 系统会用空闲的内存作为I/O缓存,读取过 的内容会存到内存中,速度也很快。假如 索引不大,也可以使用MMapDirectory• Linux平台使用NIOFSDiretory• 平时测试可以使用RAMDirectory
  • 12. Lucene建立索引的特点• IndexWrite只有调用close方法后,新的索引 内容才真正写到索引文件中• Lucene通过加锁的方式,限定同一时间只能 有一条线程可以写索引• 新更新的索引内容需重新打开(reopen)才能 搜索得到• 不能更新索引内容,需删除再添加• 每个Document对象会分配唯一的DocID做主 键
  • 13. 查询索引static void Main(string[] args){ var ramDir = new RAMDirectory(); //这里假设是之前写入内容的内存对象 var analyzer = new SimpleAnalyzer(); //分析器 IndexReader reader = IndexReader.Open(ramDir); IndexSearcher searcher = new IndexSearcher(reader); //创建IndexSearcher QueryParser parser = new QueryParser(Version.LUCENE_29, "title", analyzer); Query query = parser.Parse("测试"); Hits hits = searcher.Search(query); //搜索 //输出结果 for (int i = 0; i < hits.Length(); i++) { Document doc = hits.Doc(i); Console.WriteLine(string.Format("title:{0}", doc.Get("title"))); } //关闭搜索 searcher.Close();
  • 14. 查询索引的特点• 当用IndexReader打开索引后,新更新到索 引中的内容对当前reader是不可见的,只有 重新打开reopen索引,新更新到索引的内容 才能生效并被检索到• 自Lucene2.9后,提供的IndexReader.reopen() 可以高效的重新打开索引• Lucene3.5中的openIfChanged()可以用来检 测索引是否有新的内容需要重新打开
  • 15. 目录Lucene简介  Lucene.Net简介  开源项目和应用案例Lucene基础  Lucene全文搜索处理流程  建立索引  查询索引Lucene在布啦中的实践  旧布啦搜索存在的问题  新搜索方案  分词组件选择  近实时搜索
  • 16. 旧布啦搜索存在的问题• 索引大,查询很慢,有时要10多秒才能返 回结果• 中文分词弱• 有时导致OutOfMemory异常
  • 17. 新搜索方案• 微博内容只索引,不存储,减少索引大小• 使用开源的IKAnalyzer中文分词组件• 改为使用SimpleFSFactory存储方式• 使用新的SearcherManager和NRTManager类 实现近实时搜索• Lucene使用了IKVM+Lucene3.5,方便实现实 时搜索
  • 18. .Net平台中文分词组件盘古分词 – 项目地址:http://pangusegment.codeplex.com/ – 原生C#中文分词组件,人名检测算法好,效率一般SharpICTCLAS – 项目地址: http://www.cnblogs.com/zhenyulu/archive/2007/04/ 18/718383.html/ – 基于免费版ICTCLAS移植的分词库,速度快,分词 准确
  • 19. JAVA平台中文分词组件庖丁解牛分词 – 项目地址:http://code.google.com/p/paoding/ – 高效率,高扩展性,完全面向对象设计IKAnalyzer – 项目地址:http://code.google.com/p/ik- analyzer/ – 轻量级,效率高
  • 20. 分词组件性能测试方案组合 分词效率 星级 说明盘古分词 400KB/s ★★ 比较慢+Lucene.Net 2.9.2IKVM+IKAnalyzer+L 1305KB/s ★★★★ 速度不错ucene 3.5.0(.net版)IKAnalyzer.Net+Luc 1305KB/s ★★★★ 速度不错,但竟然ene 2.9.2(.net版) 和使用IKVM一 样。。。IKAnalyzer+Lucene 1700KB/s ★★★★★ 非常快3.5.0(JAVA版)
  • 21. 分词准备性测试阮一峰买了一张三角桌子• 盘古分词 – 阮一峰/买/了/一张/三角/桌子• IKAnalyzer – 阮/一/峰/买了/一张/一/张三/张/三角/三/角/桌 子
  • 22. 分词准备性测试结婚的和尚未结婚的• 盘古分词 – 结婚/的/和/尚未/结婚/的• IKAnalyzer – 结婚/的/和尚/尚未/未结/结婚/的
  • 23. 分词准备性测试方案组合 准确性 说明盘古分词 ★★★★ 人名非常准确,歧义词拆 分非常准确IKAnalyzer ★★★ 人名和歧义词识别不准
  • 24. 近实时搜索难点• 为了能检索新内容,要重新打开索引,经 常打开影响性能• 重新打开新的IndexReader后,旧的 IndexReader不能直接关闭,因为可能有搜 索还在使用
  • 25. Lucene3.5中的解决方案• SearcherManager简化多线程打开索引处理• IndexReader提供有引用计数,当引用计数 为0时,自动关闭• NRTManager用来管理什么时间需要重新打 开索引
  • 26. 布啦中的使用方式
  • 27. 布啦中的使用方式
  • 28. 参考资料• 《Lucene In Action》• http://blog.mikemccandless.com/2011/09/luc enes-searchermanager-simplifies.html• http://www.slideshare.net/zhu02/lucene- beta-1778084• http://www.chedong.com/tech/lucene.html• https://github.com/cxfksword/IKAnalyzer.Net
  • 29. Thank You!!

×