elasticsearch初体验

 

1.    安装配置

安装比较简单,以下内容是针对Linux系统的设置,从官网下载压缩包解压,配置一下Java环境变量就能启动(需要安装Java  jdk),一个很重要的点是elasticsearch的安全机制是很简单的,所有的操作都可以通过restful API进行,要删除一个索引只需要发送一个delete请求就行,而且还支持通配符,这就很可怕了,要在内网里面使用,不要让外网访问到,不然轻则数据被修改,严重的所有数据都会被删光。

配置文件在elasticsearch-5.6.9/config目录下的elasticsearch.yml一般有需要修改的配置有日志文件位置,数据文件位置,还有备份文件的位置,端口号等,可以参考这个重要配置的修改 | Elasticsearch: 权威指南 | Elastic

path.repo:/data/backups,/data2/backups  #可以配置多个备份仓库目录

path.data: data/es_data,/data2/es_data,/data3/es_data #可以配置多个数据目录

http.cors.enabled: true

http.cors.allow-origin:"*"

network.bind_host:0.0.0.0

network.host: 0.0.0.0 #外网访问

http.port: 9200

elasticsearch是内存型应用,内存大对性能提升很有好处,但配置给elasticsearch jvm内存最好只给物理内存的一半就好,因为它的底层是Lucene,这个会利用操作系统的缓存机制来做缓存,然后虚拟机的最大和最小内存设置成一样的数值,避免虚拟机内存调整。官方建议不要使用高配置机器,内存32G的就够了,服务器配置太高性价比会很低,

把操作系统的ulimit设置成一个足够大的值,然后关闭系统的内存交换,因为elasticsearch会有大量的文件操作,需要很多文件描述符,系统默认的设置小的可怜。具体设置百度一下就行,要设置成永久性的,而不是只在当前回话窗口生效。数据目录如果有多个数据盘的话分布在不同的盘可以提高io性能。启动的话是到安装目录的bin目录下 ./elasticsearch –d 以后台方式运行(Linux环境下)

2.    初次使用

刚开始使用时需要将很多数据导入到elasticsearch,这个过程可以使用Java 也可以使用python进行,在导入的时候尽量选择配置好一点的服务器,主要是cpu,内存,磁盘(推荐ssd),最近我用python导了1.6T的数据到elasticsearch里面,单台服务器要导入这么多数据需要很长的时间,一个可选的方案是开一批云服务器每台导一些数据,然后备份出来到生产服务器上恢复,导入数据的速度相对备份恢复来说特别缓慢。

Elasticsearch有批量插入数据的接口_bulk,使用这个接口可以一次性插入几千条数据(主要看每条的数据大小,不要太大,5M可能是一个比较合适的大小),导入之前一定要先确定好导入的数据类型(mapping),数据类型错误在导入之后是没法更改的,只能通过重建索引修改,这是很耗时的过程。在开始之前可以把mappings 设置为允许动态添加 "dynamic":"strict",然后这个简单的mapping新建索引,插入几条数据复制出mapping进行修改,然后用修改过的mapping开始导入数据。

在mapping中需要设置一些导入的参数,主要是分片数,段合并限流等,分片数设置为1,段合并限制 "indices.store.throttle.type": "none",这样可以加快导入速度。

下面贴一段python插入elasticseach的代码

fromelasticsearch import Elasticsearch

fromelasticsearch.helpers import bulk

importlogging

defbulkInsert(records,param):

    es = Elasticsearch(param['host'])

    es_index = param['es_index']

    es_type = param['es_type']

    actions = []

    for r in records:

        action = {

            "_index": es_index,

            "_type": es_type,

            "_id":r['asin'],

            "_source": json.dumps(r)

        }

        actions.append(action)

    success, _ = bulk(es, actions,index=es_index,request_timeout=100, raise_on_error=True)

print('insert result:'),success

es常用操作命令:

curl -XPUT 'http://localhost:9200/_snapshot/lostdata' -d '{"type": "fs","settings": {    "location":"/data/backups/lostdata",  "max_snapshot_bytes_per_sec" : "200mb", "max_restore_bytes_per_sec" : "200mb",    "compress": true    }}'  新建仓库

curl -XPUT 'http://localhost:9200/_snapshot/201801/full' -d '{  "indices": "i_selection_*_201801*"  }  ' #新建一个备份
curl -xput 'http://139.219.15.161:9200/_snapshot/backups/us01'  '{"indices": "t_selection_in_20180428,t_selection_in_20180505"}' #备份索引(不加数据会备份所有的索引)
curl -XPUT 'http://localhost:9200/_snapshot/backups/othercountries'  #备份所有索引
cur -XGET 'http://18.191.217.107:9200/_snapshot/201801/full/_status' #查看备份进度
curl XPUT 'http://42.159.81.24:9200/_snapshot/backups/othercountries/_restore' #恢复备份
cur -XGET 'http://18.191.217.107:9200/_recovery' #查看恢复进度 
curl XPOST 'http://42.159.81.24:9200/_reindex'  -d '{  "source": {    "index": "t_selection_au_20180106"  },  "dest": {    "index": "au_test"  } }' #重建索引
#日语切词(加入到mapping中的带有text的字段中
"product_name": {  "type": "text", "analyzer": "kuromoji" }

GET /_cat/nodes?v#使用类Unix的cat功能查看 加上?help可以获取使用帮助

http://xxx.xx.x.xx.x:9200/_cluster/stats #查看集群状态

GET my_index,another_index/_stats #索引状态查看(注意可以通过逗号分隔多个索引)

GET _cluster/pending_tasks #可以查看集群中的待执行

POST /_snapshot/my_backup/snapshot_1/_restore?wait_for_completion=true
{
    "indices": "index_1", 
    "rename_pattern": "index_(.+)", 
    "rename_replacement": "restored_index_$1" 


    PUT /my_index/_settings
{
    "index.search.slowlog.threshold.query.warn" : "10s", 
    "index.search.slowlog.threshold.fetch.debug": "500ms", 
    "index.indexing.slowlog.threshold.index.info": "5s" ,
    "refresh_interval": "30s"
}

PUT /my_logs/_settings
{ "refresh_interval": -1 } 


PUT /_cluster/settings
{
    "transient" : {
        "logger.index.search.slowlog" : "DEBUG", 
        "logger.index.indexing.slowlog" : "WARN" 
    }
}
 

 

《餐馆点餐管理系统——基于Java和MySQL的课程设计解析》 在信息技术日益发达的今天,餐饮行业的数字化管理已经成为一种趋势。本次课程设计的主题是“餐馆点餐管理系统”,它结合了编程语言Java和数据库管理系统MySQL,旨在帮助初学者理解如何构建一个实际的、具有基本功能的餐饮管理软件。下面,我们将深入探讨这个系统的实现细节及其所涉及的关键知识点。 我们要关注的是数据库设计。在“res_db.sql”文件中,我们可以看到数据库的结构,可能包括菜品表、订单表、顾客信息表等。在MySQL中,我们需要创建这些表格并定义相应的字段,如菜品ID、名称、价格、库存等。此外,还要设置主键、外键来保证数据的一致性和完整性。例如,菜品ID作为主键,确保每个菜品的唯一性;订单表中的顾客ID和菜品ID则作为外键,与顾客信息表和菜品表关联,形成数据间的联系。 接下来,我们来看Java部分。在这个系统中,Java主要负责前端界面的展示和后端逻辑的处理。使用Java Swing或JavaFX库可以创建用户友好的图形用户界面(GUI),让顾客能够方便地浏览菜单、下单。同时,Java还负责与MySQL数据库进行交互,通过JDBC(Java Database Connectivity)API实现数据的增删查改操作。在程序中,我们需要编写SQL语句,比如INSERT用于添加新的菜品信息,SELECT用于查询所有菜品,UPDATE用于更新菜品的价格,DELETE用于删除不再提供的菜品。 在系统设计中,我们还需要考虑一些关键功能的实现。例如,“新增菜品和价格”的功能,需要用户输入菜品信息,然后通过Java程序将这些信息存储到数据库中。在显示所有菜品的功能上,程序需要从数据库获取所有菜品数据,然后在界面上动态生成列表或者表格展示。同时,为了提高用户体验,可能还需要实现搜索和排序功能,允许用户根据菜品名称或价格进行筛选。 另外,安全性也是系统设计的重要一环。在连接数据库时,要避免SQL注入攻击,可以通过预编译的PreparedStatement对象来执行SQL命令。对于用户输入的数据,需要进行验证和过滤,防止非法字符和异常值。 这个“餐馆点餐管理系统”项目涵盖了Java编程、数据库设计与管理、用户界面设计等多个方面,是一个很好的学习实践平台。通过这个项目,初学者不仅可以提升编程技能,还能对数据库管理和软件工程有更深入的理解。在实际开发过程中,还会遇到调试、测试、优化等挑战,这些都是成长为专业开发者不可或缺的经验积累
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值