elasticsearch的性能表现
性能测试
最近工作中需要用elasticsearch来建立全文检索,对同时建立大量索引的性能有较大要求,于是便在公司的mac mini上做了简单的测试,测试环境如下:
所有elastcisearch的数据都保存在同一个索引和类型下
测试的时间为cpu时间
数据库中的数据保存在sqllite中
测试数据数量为30万,测试了100次
elasticsearch版本号为2.3.3在本地运行
首先在数据库创建了名为record的表,其中保存了30万条如下所示的数据
record: {"content": "Iste aut praesentium atque. Laboriosam aliqui voluptatibus dolorum fugiat veniam perferendis. Aspernatur nam ullam quibusdam sit dolorem architecto dolores.", "title": "Jessica Martinez"}
测试得到的时间:
获取数据库中的全部相对应数据并保存为指定的字典格式时间为4.272秒
在elasticsearch中建立全部索引的时间为19.7170秒
之后还测试了在elasticserch中添加一个新字段所需的时间,该字段如下所示
{data = '飓风鲍勃是一场于1985年7月影响了美国东南部的飓风,也是1985年大西洋飓风季的第2场热带风暴和首场飓风,于7月21日由墨西哥湾东部的一股东风波发展而成。系统起初向东移动,以弱热带风暴强度袭击佛罗里达州西南部,接下来转向北上并迅速增强,于7月24日达到飓风强度。次日,鲍勃在南卡罗莱纳州博福特附近登陆,成为这年飓风季吹袭美国的首场飓风。气旋在陆地上空迅速减弱,于7月26日被西弗吉尼亚州东部上空的一片锋面槽吸收。鲍勃一共间接导致5人遇难,经济损失达到2000万美元。风暴给佛罗里达州带去暴雨,降雨量最高的大沼泽地市达508毫米。不过,这些降水缓解了许多地方持续已久的干旱,所以对大部分地区都是有利的。飓风最后一次登陆是在南卡罗莱纳州,当地所受影响很小,但气旋在弗吉尼亚州催生了3场龙卷风,其中1场摧毁了两套房屋。'}
测试得到的时间
获取数据库中的全部相对应数据并保存为指定的字典格式时间的时间是4.161831秒
将新添字段数据转化到elasticsearch的保存格式的时间为22.394504秒
从上面的数据可以看出,为已存在的索引添加一个字段信息可能会比创建全部索引所花的时间还要多,这是由于elasticsearch文档的不可变性,update其实是经历了检索-修改-重建索引的过程,具体可参考elasticsearh权威指南的相关章节
下面时测试用的程序,跑了好久好久。。。
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ela.settings")
import time
from elasticsearch.helpers import bulk, reindex
from elasticsearch import Elasticsearch
from elastic.models import Record
from elasticsearch.client import IndicesClient
es = Elasticsearch()
indice = IndicesClient(es)
update_list = list()
transfer_list1 = list()
transfer_list2 = list()
elas_list = list()
map_list = list()
for count in range(1, 100):
indice.create(index='ding_test')
start_time1 = time.clock()record = Record.objects.all().iterator()actions = []for data in record: s = {'_op_type': 'create', '_type': 'million', '_index': 'ding_test', '_id': data.id, '_source': {'title': data.title, 'content': data.content}} actions.append(s)end_time1 = time.clock()if len(actions) > 0: bulk(es, actions)final_time1 = time.clock()transfer_time1 = end_time1 - start_time1elas_time1 = final_time1 - end_time1transfer_list1.append(transfer_time1)elas_list.append(elas_time1)s = {'million': {'properties': {'data': {'type': 'string'}}}}start_time2 = time.clock()res = indice.put_mapping(doc_type='million', index='ding_test', body=s)end_time2 = time.clock()map_time = end_time2 - start_time2map_list.append(map_time)start_time3 = time.clock()record = Record.objects.all().iterator()actions = []for data in record: s = {'_op_type': 'update', '_type': 'million', '_index': 'ding_test', '_id': data.id, 'doc': {'data': data.data}} actions.append(s)end_time3 = time.clock()transfer_time2 = end_time3 - start_time3transfer_list2.append(transfer_time2)start_time4 = time.clock()if len(actions) > 0: bulk(es, actions)end_time4 = time.clock()update_time = end_time4 - start_time4update_list.append(update_time)indice.delete(index='ding_test')print 'this is the %s try, fighting' % count
print 'build_index_dict_time_avg:%s' % (sum(transfer_list1)/len(transfer_list1))
print 'build_index_elas_time_avg:%s' % (sum(elas_list)/len(elas_list))
print 'elas_put_mapping_time_avg:%s' % (sum(map_list)/len(map_list))
print 'update_dict_time_avg:%s' % (sum(transfer_list2)/len(transfer_list2))
print 'update_index_elas_time_avg:%s' % (sum(update_list)/len(update_list))
为应用添加新功能的思路:
仔细研究需求,包括所要实现的功能,运行的效率要求等!!
查找能实现这个需求的轮子和实现,还是自己造个轮子
做一个简单的demo来测试(顺便可以学习怎么用这个轮子)
通过测试权衡如何将功能集成到现有代码
开始撸代码吧^-^
关键字:搜索引擎
版权声明
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!