elasticsearch的性能表现

性能测试

最近工作中需要用elasticsearch来建立全文检索,对同时建立大量索引的性能有较大要求,于是便在公司的mac mini上做了简单的测试,测试环境如下:

  1. 所有elastcisearch的数据都保存在同一个索引和类型下

  2. 测试的时间为cpu时间

  3. 数据库中的数据保存在sqllite中

  4. 测试数据数量为30万,测试了100次

  5. 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_time1
    elas_time1 = final_time1 - end_time1
    transfer_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_time2
    map_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_time3
    transfer_list2.append(transfer_time2)

    start_time4 = time.clock()
    if len(actions) > 0:
        bulk(es, actions)
    end_time4 = time.clock()
    update_time = end_time4 - start_time4
    update_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))

为应用添加新功能的思路:

  1. 仔细研究需求,包括所要实现的功能,运行的效率要求等!!

  2. 查找能实现这个需求的轮子和实现,还是自己造个轮子

  3. 做一个简单的demo来测试(顺便可以学习怎么用这个轮子)

  4. 通过测试权衡如何将功能集成到现有代码

  5. 开始撸代码吧^-^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值