这篇博客并不是证明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. MySQL学习5 - 数据类型二.md

    一 字符类型 二 枚举类型和集合类型 一 字符类型 #官网:https://dev.mysql.com/doc/refman/5.7/en/char.html #注意:char和varchar括号内的 ...

  2. 【译】索引进阶(六):SQL SERVER索引书签

    [译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正] 原文链接:传送门. 在之前的章节,我们把索引看做一组有序条目的集合,每行数据对应一个索引条目.我们解释了很多关于索引逻辑方面的内容, ...

  3. O2O、B2B、C2C(通俗讲解)

    你在地摊买东西,C2C你去超市买东西,B2C超市找经销商进货,B2B超市出租柜台给经销商卖东西,B2B2C你在网上下载个优惠券去KFC消费,O2O 一:O2O 1.概念: O2O即Online To ...

  4. IIS 一键安装及卸载

    IIS6:适用于win server 2003:: ******************* :: * 安装 :: ******************* :Install Cls @echo. &am ...

  5. 学习pano2vr制作html5全景笔记

    demo截图: demo下载: 百度网盘:http://pan.baidu.com/s/1o8yBwIA 密码:nf62(启服务端查看); 我制作是全屏定点360的全景页面,使用pano2vr软件制作 ...

  6. PHP实用工具类

    2018年10月25日 20:21:09 组装SQL语句 适用MySQL, 链式调用, 组装后可传参选择是否查询数据库 项目地址: 码云 生成数据字典 适用MySQL, 链式调用, 可生成word, ...

  7. 关于button去掉自带阴影效果的方法

    在button的属性设置里加上: style=”?android:attr/borderlessButtonStyle” 即: <Button android:layout_width=&quo ...

  8. Haystack-全文搜索框架

    Haystack 1.什么是Haystack Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询,使用全文检索的效率更高 ),该框架支持Solr,Elasticsear ...

  9. Python--map()函数

    map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. 例如,对于list [1, 2 ...

  10. niagara Workbench module import IntelliJ

    1. 在整个网络布线中使用一种布线方式,但是两端都有RJ-45 plug  的网络连线,无论是采用方式A还是方式B 端接的方式都是试用的.网络都是通用的,双绞线的顺序与RJ-45偶的引脚序号一一对应, ...