Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Lucene实践

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.
Avatar for cxfksword cxfksword
February 09, 2013

 Lucene实践

Lucene实践

Avatar for cxfksword

cxfksword

February 09, 2013
Tweet

More Decks by cxfksword

Other Decks in Technology

Transcript

  1. 目录 Lucene简介  Lucene.Net简介  开源项目和应用案例 Lucene基础  Lucene全文搜索处理流程 

    建立索引  查询索引 Lucene在布啦中的实践  旧布啦搜索存在的问题  新搜索方案  分词组件选择  近实时搜索
  2. 目录 Lucene简介  Lucene.Net简介  开源项目和应用案例 Lucene基础  Lucene全文搜索处理流程 

    建立索引  查询索引 Lucene在布啦中的实践  旧布啦搜索存在的问题  新搜索方案  分词组件选择  近实时搜索
  3. 开源项目和应用案例 • Solr – 面向企业基于Lucene的全文搜索方案,支持pdf、 word等文档内容搜索 • indextank-engine – Linkedin收购IndexTank公司后开源的全文搜索项目,

    支持实时,自动完成和一个推荐相关的特性 • StackOverflow – 全球最大的编程问答站点,基于lucene.net的全文 搜索成功案例
  4. 目录 Lucene简介  Lucene.Net简介  开源项目和应用案例 Lucene基础  Lucene全文搜索处理流程 

    建立索引  查询索引 Lucene在布啦中的实践  旧布啦搜索存在的问题  新搜索方案  分词组件选择  近实时搜索
  5. 建立索引 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(); }
  6. 索引存储方式的差别 • RAMDirectory – 把所有内容保存到内存中 • SimpleFSDirectory – 保存到磁盘中,并发读使用lock来实现,并发性能不好 •

    NIOFSDirectory – 保存到磁盘中,不用使用lock就能支持多线程读,不支 持windows • MMapDirectory – 通过内存映射(memory-mapped)来访问索引文件,不用 使用lock支持多线程读,映射索引需要同等大小的内存, 因为内存碎片的原因很容易导致OutOfMemory异常
  7. 查询索引 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();
  8. 目录 Lucene简介  Lucene.Net简介  开源项目和应用案例 Lucene基础  Lucene全文搜索处理流程 

    建立索引  查询索引 Lucene在布啦中的实践  旧布啦搜索存在的问题  新搜索方案  分词组件选择  近实时搜索
  9. 分词组件性能测试 方案组合 分词效率 星级 说明 盘古分词 +Lucene.Net 2.9.2 400KB/s ★★

    比较慢 IKVM+IKAnalyzer+L ucene 3.5.0(.net版) 1305KB/s ★★★★ 速度不错 IKAnalyzer.Net+Luc ene 2.9.2(.net版) 1305KB/s ★★★★ 速度不错,但竟然 和使用IKVM一 样。。。 IKAnalyzer+Lucene 3.5.0(JAVA版) 1700KB/s ★★★★★ 非常快