摘要:在项目中使用Solr作为搜索引擎对大数据量创建索引,提供服务,本文是作者对Solr的使用总结的一点心得体会,

具体包括使用DataImportHandler从数据库中近实时同步数据、测试Solr创建索引的性能、以及测试Solr的搜索效率总结等。

具体搜索引擎概念、Solr搭建方法、数据库mysql使用方法,假设读者已有了基础。本文操作均是在linux上进行的。

1.      Solr

1.1  Solr从数据库中读取数据并创建索引速度(使用DataImportHandler)

l 一次性创建索引

在JVM内存配置为256M时,建立索引至1572865时出现Java heap异常;增加JVM内存配置至512M,设置系统环境变量:JAVA_OPTS -Xms256m -Xmx512m,能成功建立2112890条(花费2m 46s)。

平均索引创建速度为:12728/s(两个string字段,长度大约为20字符)。

l 增量创建索引

注意:近实时增量索引需要写数据库服务的时间与搜索引擎服务器时间同步(数据库服务时间先于搜索引擎服务器时间才行)。

使用默认的DIH创建增量索引速度较慢(50/s~400/s),不如全索引(1W/s),因为需要从数据库中读取多遍(1、要更新的IDs;2、每1ID去数据库中重取所有列)。

故需要更改DIH增量索引程序,以全索引的方式读数据;或采取全读出的方式,一次全读出所有列,具体文件配置如下:

<?xml version="1.0" encoding="UTF-8" ?>

<dataConfig>

<dataSource name="mysqlServer"

type="JdbcDataSource"

driver="com.mysql.jdbc.Driver"

batchSize="-1"

url="jdbc:mysql://192.103.101.110:3306/locationplatform"

user="lpuser"

password="jlitpassok"/>

<document>

<entity name="locatedentity" pk="id"

query="select id,time from locationplatform.locatedentity where isdelete=0 and my_date > '${dataimporter.last_index_time}'"

deletedPkQuery="select id from locationplatform.locatedentity where isdelete=1 and my_date > '${dataimporter.last_index_time}'"

deltaQuery="select -1 id"

deltaImportQuery="select id,time from locationplatform.locatedentity where isdelete=0 and my_date > '${dataimporter.last_index_time}'">

<field column="id" name="id"/>

<field column="time" name="time"/>

</entity>

</document>

</dataConfig>

通过这样的配置可以达到增量索引9000/s(两个string字段)(数据库里对时间建立索引,对这里的性能影响不大)。

l  注意:作者不推荐使用DataImportHandler,有其它更好更方便的实现可以使用。

1.2  Solr创建索引效率

l ConcurrentUpdateSolrServer使用http方式,embedded方式官方不推荐使用。ConcurrentUpdateSolrServer不需要commit,solrServer.add(doc)即可添加数据。SolrServer solrServer = newConcurrentUpdateSolrServer(solrUrl, 队列大小, 线程数)其需要与autoCommit、autoSoftCommit配置搭配使用,网上建议配置如下:

<autoCommit>

<maxTime>100000(1-10min)</maxTime>

<openSearcher>false</openSearcher>

</autoCommit>

<autoSoftCommit>

<maxTime>1000(1s)</maxTime>

</autoSoftCommit>

17个各种类型字段(原纯文本Size约为200B,SolrInputDocument对象Size约为930B),以只保存ID、每字段均建立索引的方式创建索引。

如需具体的测试代码可以联系本人。

l 17个字段,四核CPU,16G内存,千兆网络

数据量(W条)

线程数

队列大小

时间(s)

网络(MB/s)

速率(W条/s)

200

20

10000

88

10.0

2.27

200

20

20000

133

9.0

1.50

200

40

10000

163

10.0

1.22

200

50

10000

113

10.5

1.76

200

100

10000

120

10.5

1.67

l 速度:Solr创建索引速度与Solr机器CPU正相关,一般情况下CPU占用率能达到接近100%,内存占用率在默认情况下需达到接近100%,网络、磁盘占用率均小。因此创建索引的效率瓶颈在CPU及内存。当内存占用率维持在接近100%,索引大小达到物理内存大小时,插入新的数据容易出现OOM错误,这时需要使用ulimit –v unlimited命令更改virtual memory配置为unlimited再启动Solr便不会出现OOM错误。在64位机器系统上,官方推荐使用MMapDirectory。

l NRTCachingDirectory速度偏慢,会在某一时间索引添加停滞,Size先大后小,减小后索引添加继续。

l 大小:1亿索引大小约为13-16GB,2亿索引大小约为30GB。

1.3  Solr搜索方式

l  交集:{name:亿度 AND address:海淀} {text:海淀 AND 亿度}。

l  联集:{name:亿度 OR address:海淀} {text:海淀 OR 亿度}。

l  排除:{text:海淀 -亿度}。

l  通配符:{bank:中国*银}。

l  范围:{num:[30 TO60]}。

l  分页:start rows

l  排序:sort

l  Group 权重中文分词 ...

1.4  亿级数据搜索速度

l  本节测试是基于1.2节创建的索引上的。

l精确搜索

数据量(亿条)

字段数

字段类型

时间(ms)

1

1

long

1

1

1

double

80-1400

1

1

string

7-800

1

1

date

2-400

1

2(OR)

long

2

1

2(OR)

double

200-2400

1

2(OR)

string

500-1000

1

2(OR)

date

5-500

l 模糊搜索

数据量(亿条)

字段数

字段类型

时间(ms)

1

1

long

2000-10000

1

1

double

1000-17000

1

1

string

20-16000

1

1

date

/

1

2(OR)

long

3000-25000

1

2(OR)

double

7000-45000

1

2(OR)

string

3000-48000

1

2(OR)

date

/

l 范围搜索

数据量(亿条)

字段数

字段类型

时间(ms)

1

1

long

6-46000

1

1

double

80-11000

1

1

string

7-3000

1

1

date

1000-2000

1

2(OR)

long

100-13000

1

2(OR)

double

100-60000

1

2(OR)

string

3000-13000

1

2(OR)

date

7000-10000

l 结论:

范围越大,结果数据越多,搜索花费时间越长。

第一次搜索较慢,后来时间花费较少。

关于Solr的使用总结的心得体会的更多相关文章

  1. 加快FineReport报表设计的几个心得体会

    加快FineReport报表设计的几个心得体会 一.从远程服务器大批量取数进行表样设计时,最好按“列顺序”取一个“空的SQL语句”,这样可提高设计速度.否则每次设计时模板均要从远程读取数据,速度相当慢 ...

  2. 十天来学习java的心得体会

    有关学习java是几天来的心得体会: 十天学习java遇到很多问题,每个问题都是经过反复的看书本以及上网查找资料来解决的,发现这一点真的需要自己来而不是去遇到什么问题就去依靠他人(师兄.同学).在其中 ...

  3. Git的基本使用方法和安装&心得体会

    1. git的安装和github的注册.代码托管.创建organization.邀请member. (1)git的安装 因为我电脑是windows系统,所以下载的是git for windows.在官 ...

  4. "琳琅满屋"调查问卷 心得体会及结果分析

    ·关于心得体会       当时小组提出这个校园二手交易市场的时候,就确定了对象范围,仅仅是面向在校大学生,而且在我们之前就已经有了很多成功的商品交易的例子可以让我们去借鉴,再加上我们或多或少的有过网 ...

  5. 关于多本小说站的SEO—从”易读中文网”获得的心得体会

    从目前国内的网站流量来说,电影站,小说站,游戏站等的流量占总流量的比例还是很高的,许多站长把目光投入到了这几个方面,本文就着重来说对于小说站,尤其是多本小说站的SEO心得体会! 对于小说站来说,只要排 ...

  6. AngularJS心得体会

    AngularJS早些时候有过了解,知道这是一个JS的MVC框架,同类型的框架还有Backbone等.这次是由于项目需要,学习了两天的Angular后开始着手改之前的项目代码,这里大概说一下这一周学习 ...

  7. 关于Dropdownlist使用的心得体会

    2013-07-23关于Dropdownlist使用的心得体会: Dropdownlist使用最多的几个属性: 一.Dropdownlist.Items,负责包含所有选项的容器 DropDownLis ...

  8. xp硬盘安装Fedora14 过程记录及心得体会(fedora14 live版本680M 和fedora14 DVD版本3.2G的选择)

    这次电脑奔溃了,奇怪的是直接ghost覆盖c盘竟然不中.之前电脑上硬盘安装的fedora14操作系统,也是双系统.不知道是不是这个问题,记得同学说过,在硬盘装fedora之后,要手动修改c盘隐藏的那个 ...

  9. 使用Webbrowser的一点心得体会

    原文:使用Webbrowser的一点心得体会 自从用上VS2005后,发现多了个WebBrowser控件(.net 2003中不带),为图方便吧,有好多小工具就用这个写的,慢慢也有点体会了,总结一下, ...

随机推荐

  1. Struts2返回json格式数据踩坑记录

    事件起因 昨天提测修改冻结/解冻银行卡样式的功能,微姐测试过程中发现调用ajax请求耗时过长,今天来排查,发现浏览器请求/finance/ajax/freeze/ajaxGetShopLists时,对 ...

  2. iOS组件化思路 <转>

    随着应用需求逐步迭代,应用的代码体积将会越来越大,为了更好的管理应用工程,我们开始借助CocoaPods版本管理工具对原有应用工程进行拆分.但是仅仅完成代码拆分还不足以解决业务之间的代码耦合,为了更好 ...

  3. bat脚本参数 if goto choice for使用的学习笔记。

    写过几次bat脚本,但一直没有总结,最近找到一个网页介绍bat,总结得很好,转自 http://www.jb51.net/article/49627.htm: 本文只总结我不会的,全面的看原网页就可以 ...

  4. Android常用组件之ListView

    使用ListAdapter是ListView的适配器. 使用ListView.setAdapter()方法来设置ListView的适配器. 简单的使用 adapter = new ArrayAdapt ...

  5. 用swing也可以做出好看的界面

    用Swing做出的例子:JavaFX做出的界面:后来又做出了自己编写的一套基于Synth的L&F,其与直接在代码中重绘某个组件不同,最大优点是具有可插拔性,即在不改变原有程序代码的情况下,用户 ...

  6. Mysql安装及主从复制配置

    1.下载 mysql数据库 wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.9-linux-glibc2.5-x86_64.ta ...

  7. ROW_NUMBER()与PARTITION BY 实例

    环境:SQL Server 2008 R2 数据表结构 SELECT A.* FROM [tbiz_AssScoreWeidu] A SELECT A.* ,ROW_NUMBER() OVER ( P ...

  8. java问题排查总结

    前些天发现:http://hellojava.info/这个站点,关于java问题排查分析总结线上故障总结其实是最有价值的,好的总结就是一个系统演进历史,是团队难得的积累沉淀. 花了不少时间看了下,顺 ...

  9. linux du和df

    df.du和fdisk这三个常用命令:df用于检查文件系统磁盘占用情况,du检查磁盘空间占用情况,而fdisk用于磁盘分区. du,disk usage,是通过搜索文件来计算每个文件的大小然后累加,d ...

  10. java 基础导航

    ecplise 常用快捷键 java notepad++ java封装好处和原则 java1 基本概述和java环境变量配置 java2 基本概念介绍和基本关键字.基本数据类型 java3 基本流程语 ...