这篇博客并不是证明Lucene.net的性能有多强悍,实际上Lucene.net的并发能力并不让人很满意,这得看你怎么用它。

因为Lucene 本身就是一个搜索引擎的基础框架,相当于一辆车子的发动机,而你做的是怎么造出一辆车速度快的车子来。很显然你要有一个好的轮胎,和空气阻力很小的车身造型。如果你的轮子是正方形的,那么马力再强劲的发动起都带不起来,对吧。

作为一名研发工程师,我相信大多工程师都不会造出一个正方形的轮子来跑车。每个人都有使用Lucene的方式,你可以使用elasticsearch 或者solr这些基于Lucene已经二次开发好的搜索引擎框架,你也可以自己基于Lucene进行二次开发,打造属于你自己的搜索引擎。

我属于后者。这里说的Lucene性能包括两种:

1. 建索引的速度

2.搜索的速度

对于搜索引擎来说这两个性能很关键。对于用户来说搜索的速度才是他们最关心的,当然速度也只是搜索效果的一方面,因为还有排序的问题。

接下来先讨论下Lucene.net 的搜索速度:

在讨论搜索速度之前,我们可以简单了解一下Lucene是怎么搜索的,涉及到Lucene的search最重要的几个类:

表面上:

1. 你先得创建一个IndexReader  IndexReader类是提供操作索引的权限(search,write,delete,update...)所以无论是在搜索还是建索引的时候,都需要创建一个IndexReader。  IndexReader 是一个虚类,它的子类有两种:AtomicReader 和 CompositeReader  AtomicReader故名思议是原子型的IndexReader... 这后面的内容还是有点多的,足以再写一篇文章做总结了。由于不是文章的核心内容,所以放到文章的结尾里补充,如果充分利用好Lucene的IndexReader,你也可以做自己想做的事情,因为Lucene给了你自定义的权限和众多功能的api接口。

2. 创建一个IndexReader ,你需要Directory类,因为Directory是管理索引文件的类。这又是一个十分重要的类,它在Lucene.Store包中。

Directory类是Lucene操作索引目录的类,负责管理目录里的索引文件。我们知道Lucene同一时刻只允许同一个线程进行创建索引操作,经常看到索引文件里有write.lock文件,就是Directory实例创建的。I

我们常用Directory的这几个子类创建IndexReader 实例:FSDirectory,RAMDriectory 。前者表示在文件目录里也就是硬盘中操作索引,后者是加载到内存中操作索引。

而FSDirectory 的子类又有三个:MMapDirectory, NIOFSDirectory, SimpleFSDirectory。这里有必要介绍一下MMapDirectory , 它是利用虚拟内存技术实现的操作文件目录,这里暂且提一下。

于是我们通常可以这样创建一个IndexReader

FSDriectory dir = FSDirectory.Open(storage.IndexDir);
IndexReader indexReader = DirectoryReader.Open(dir);

通过FSDirectory 打开一个索引目录,再通过FSDirectory 创建一个indexReader。

3. 创建IndexSearcher  IndexSearcher 的构造函数传入一个IndexReader .IndexSearch提供了Search方法供检索索引。

IndexSearcher 有个重要的性质:线程安全。也就是多线程可以同时使用一个IndexSearch实例。

IndexSearcher luceneSearcher = new Lucene.Net.Search.IndexSearcher(IndexReader);

4. 构造Query

Lucene 的提供了很多Query方式,比如TermQuery 查询文档中某个term是否存在,PhraseQuery 查询文档中两个或多个词是否存在和设定他们之间的距离,

FuzzyQuery 模糊查询,BooleanQuery 集合子查询的查询,等等。。。

TermQuery termQuery = new TermQuery(new Term(filedName,value));
PhraseQuery phraseQuery = new PhraseQuyer();
phraseQuery.Add(new Term(filedName,value));
phraseQuery.Add(new Term(filedName,value));
phraseQuery.Slop=;
BooleanQuery booleanQuery = new BooleanQuery();
booleanQuery.Add(termQuery, Occur.Must);
booleanQuery.Add(phraseQuery,Occur.Must); luceneSearcher.search(booleanQuery,topn);

上面的只是举例,当然在实际开发中是不会一路写下来的。

代码上就完成了一个检索索引的大致过程,占的篇幅有点多而且内容简单,这肯定不是为了撑篇幅的,因为这些类的使用是比较影响搜索速度的。比如FSDirectory,RAMDirectory..的选用,IndexSearcher的使用和查询方式Query的搭配。

上面的是表面的代码,我觉得有必要对Lucene检索时候,内部的机制进行了解,这样可以解释为什么Lucene不仅是I/O操作密集型的应用,它的CPU消耗也不是开玩笑的。

现在的这个搜索流程就像一个轮子,我们改怎么去用最好的搭配,来达到最快的搜索速度呢?如果你的搜索单条记录更快,那么并发性能就越高。

不同的方法造的轮子的摩擦力是不一样的,所以我们要尽可能的减少的摩擦力。

Lucene.net 的性能探究--Lucene.net 的并发处理能力到底有多强?的更多相关文章

  1. Lucene学习总结之七:Lucene搜索过程解析

    一.Lucene搜索过程总论 搜索的过程总的来说就是将词典及倒排表信息从索引中读出来,根据用户输入的查询语句合并倒排表,得到结果文档集并对文档进行打分的过程. 其可用如下图示: 总共包括以下几个过程: ...

  2. Lucene学习总结之三:Lucene的索引文件格式(1)

    Lucene的索引里面存了些什么,如何存放的,也即Lucene的索引文件格式,是读懂Lucene源代码的一把钥匙. 当我们真正进入到Lucene源代码之中的时候,我们会发现: Lucene的索引过程, ...

  3. Lucene系列六:Lucene搜索详解(Lucene搜索流程详解、搜索核心API详解、基本查询详解、QueryParser详解)

    一.搜索流程详解 1. 先看一下Lucene的架构图 由图可知搜索的过程如下: 用户输入搜索的关键字.对关键字进行分词.根据分词结果去索引库里面找到对应的文章id.根据文章id找到对应的文章 2. L ...

  4. Lucene学习总结之七:Lucene搜索过程解析 2014-06-25 14:23 863人阅读 评论(1) 收藏

    一.Lucene搜索过程总论 搜索的过程总的来说就是将词典及倒排表信息从索引中读出来,根据用户输入的查询语句合并倒排表,得到结果文档集并对文档进行打分的过程. 其可用如下图示: 总共包括以下几个过程: ...

  5. Lucene学习总结之三:Lucene的索引文件格式(1) 2014-06-25 14:15 1124人阅读 评论(0) 收藏

    Lucene的索引里面存了些什么,如何存放的,也即Lucene的索引文件格式,是读懂Lucene源代码的一把钥匙. 当我们真正进入到Lucene源代码之中的时候,我们会发现: Lucene的索引过程, ...

  6. Lucene学习之一:使用lucene为数据库表创建索引,并按关键字查询

    最近项目中要用到模糊查询,开始研究lucene,期间走了好多弯路,总算实现了一个简单的demo. 使用的lucene jar包是3.6版本. 一:建立数据库表,并加上测试数据.数据库表:UserInf ...

  7. Lucene学习总结之六:Lucene打分公式的数学推导

    在进行Lucene的搜索过程解析之前,有必要单独的一张把Lucene score公式的推导,各部分的意义阐述一下.因为Lucene的搜索过程,很重要的一个步骤就是逐步的计算各部分的分数. Lucene ...

  8. Lucene学习之二:Lucene的总体架构

    本文转载自:http://www.cnblogs.com/forfuture1978/archive/2009/12/14/1623596.html Lucene总的来说是: 一个高效的,可扩展的,全 ...

  9. Lucene学习总结之六:Lucene打分公式的数学推导 2014-06-25 14:20 384人阅读 评论(0) 收藏

    在进行Lucene的搜索过程解析之前,有必要单独的一张把Lucene score公式的推导,各部分的意义阐述一下.因为Lucene的搜索过程,很重要的一个步骤就是逐步的计算各部分的分数. Lucene ...

随机推荐

  1. Java(4)switch选择结构

    一.switch结构(开关语句)的语法 switch(表达式 ){--->类型为int.char case  常量1 :--->case 结构可以有多个 //语句块1 break;---& ...

  2. 2.5 elif

    elif 想一想: if能完成当xxx时做事情 if-else能完成当xxx时做事情1,否则做事情2 如果有这样一种情况:当xxx1满足时做事情1:当xxx1不满足.xxx2满足时做事情2:当xxx2 ...

  3. JAVA进阶13

    间歇性混吃等死,持续性踌躇满志系列-------------第13天 1.查看线程的运行状态 package code0327; class Demo01 implements Runnable { ...

  4. 【归纳】正则表达式及Python中的正则库

    正则表达式 正则表达式30分钟入门教程 runoob正则式教程 正则表达式练习题集(附答案) 元字符\b代表单词的分界处,在英文中指空格,标点符号或换行 例子:\bhi\b可以用来匹配hi这个单词,且 ...

  5. docker时间和本地时间不一致的问题

    前言: 在本地执行date 和登录docker后的date显示的时间不一致,差一天多,不是8个小时 参考:戳这儿 先重启,查看后发现差8个小时 用里面cp localtime 再重启还是差8个小时 试 ...

  6. xheditor编辑器上传图片

    之前在用csdn的时候,觉得他们家的编辑器挺好用,精美,简洁,大方,功能强大.最近自己的项目也要用到编辑器,我就想起了xheditor. 好多大网站都用到它~好棒! 我把xheditor用于文章模块, ...

  7. Redis 如何实现持久化

    1.RDB 持久化,将 Redis 在内存中的的状态保存到硬盘中,相当于备份数据库状态. 2.AOF 持久化(Append-Only-File),AOF 持久化是通过保存 Redis 服务器锁执行的写 ...

  8. ES进阶--02

    第11节深度探秘搜索技术_案例实战基于dis_max实现best fields策略进行多字段搜索 课程大纲 1.为帖子数据增加content字段 POST /forum/article/_bulk{ ...

  9. Android Camera MSM HAL

    高通新的camera驱动架构设计发生了一些变化,借用互联网上常用的一种结构,大致的原理如此:将camera的所有功能划分为不同的模块,让模块自己来决定自己的事情(高内聚,低耦合),模块需要有统一的接口 ...

  10. RDay1-Problem 1 A

    题目描述 给定一个长度为n的正整数序列a[i],计算出有多少个i<j的数对,a[i]+a[j]为二的次幂,也就是说存在一个正整数x满足a[i]+a[j]==2^x. 输入 输入文件A.in. 第 ...