Elasticsearch总结

Elasticsearch总结

一、基础整理

1. 安装

  • 前提:需要安装JAVA。www.java.com

  • 下载es,选择对应版本,本文为MACOS:https://www.elastic.co/cn/downloads/elasticsearch

  • 选择自己的运行路径,解压,进入解压的文件夹:

    tar -zxvf elasticsearch-7.4.0-darwin-x86_64.tar.gz
    cd elasticsearch-7.4.0

  • 运行:(后边加-d,后台启动)

    ./bin/elasticsearch

  • 检验是否运行成功(其实上步运行不报错,应该就是运行成功)

    curl http://localhost:9200/

    Elasticsearch总结_第1张图片

2. 基础

集群 cluster

  • 一个集群中有多个节点,从集群内部来说有一个主节点。
  • es是去中心化的,对集群外部来说无中心节点,在逻辑上是个整体,与任何一个节点的通信和与整个es集群通信是等价的。

节点 Node

  • 节点属于集群一部分的单个服务器

索引 index

  • elaseticsearch将数据存储在一个或多个索引中,索引就像个数据库
  • 索引:可以看出关系型数据库的库
  • 索引把一个或多个分片shards组在一起

文档 document

  • 是es的主要实体,文档由字段构成

数据路由 document routing

  • 创建document时,es需要确定这个文档放在该索引的哪个分片shard上,这个过程就是数据路由
  • 手动指定路由:PUT /index/type/id?routing=user_id
    • 手动指定可以保证某一类document在某个分片上,在后续应用级别的负载均衡以及提升批量读取的性能的时候,很有帮助。

映射 mapping

  • 文档写入索引之前都会先进行分析。由用户自定义规则

类型 type

  • 一个索引中可存储多种文档类型,并为不同文档类型提供不同映射

分片 shards

  • es把一个完整的索引分成多个分片,好处是把一个大的索引拆分,分布到不同节点上,构成分布式搜索。
  • 分片的数量只能在索引创建前指定,索引创建后不能更改
  • 5.X默认不能通过配置文件定义分片

副本 replicas

  • 代表索引副本,es可以设置多个索引的副本
  • 副本的作用是提高系统的容错性,当某个几点某个分片损坏或丢失时可以从副本中恢复
  • 二是提高es的查询效率,es会自动对搜索请求进行负载均衡
    

es集群配置

  • elasticsearch.yaml
cluster.name: test_my
node.name: node
node.master: true
node.data: true
network.host: 10.0.0.000
transport.tcp.port: 9301
http:port: 9201
discovery.zen.ping.unicast.hosts: ["10.0.0.000:9200", "10.0.0.001:9200"]
  • cluster.name:集群名字,只有节点在相同的集群,能相互发现
  • node.name:当前节点名称的标识,各个节点的名称不能重复
  • node.master:是否为主节点,false通过这台机器去查询也会得到返回结果;用默认值false即可,如果指定的master挂掉,整个集群都不能使用
  • node.data:是否为存储数据的节点,必须有一个数据节点,如果只有一个数据节点,那么没有备份分区
  • network.host:指定本机IP
  • transport.tcp.port:节点间通信端口,部署在不同机器时默认即可
  • http:port:避免冲突
  • discovery.zen.ping.unicast.hosts:集群中所有机器的地址
  • 总结:
    • 单机多节点只是提高的ES服务器的CPU利用率
    • 建议多机集群

Python连接Elaseticsearch:

  • sniff_on_start=True
    在没做任何操作之前,先进行嗅探
  • sniff_on_connection_fail=True
    节点没有响应时,进行刷新, 重新连接
  • sniffer_timeout=60
    每60秒刷新一次
创建索引

es.indices.create(inex=‘index_name’, ignore)
如果已存在,返回400

插入数据

es.index(index=‘index_name’, doc_type=‘doc_name’, id=‘id_value’, body={“test”: “test”}

获取数据
  • get 或search

res = es.get(index=‘index_name’, doc_type=‘doc_name’, id=‘id_value’)

删除
  • 删除

es.delete(index=‘index_name’, doc_tye=‘doc_name’, id=‘id_value’)

  • 条件删除

query = {‘query’: {‘match’: {‘test’: 'test}}}
es.delete_by_query(index=‘index_name’, body=query, doc_type=‘doc_name’)

更新

update_by_query

批量写入、删除、更新

todo

搜索所有数据

es.search(index=‘index_name’, doc_type=‘doc_name’)


body = {
	'query': {
		'match_all': {}
	}
}
es.search(index='index_name', doc_type='type_name', body=body)
  • term与terms

term:
body = {‘query’: {‘term’: {‘test’: ‘test’}}}
es.search(index=‘index_name’, doc_type=‘doc_name’, body=body)
terms:
body = {‘query’: {‘terms’: {'test: [‘test’, ‘a’]}}}
es.search(index=‘index_name’, doc_type=‘doc_name’, body=body)

  • match与multi_match

match:
body = {‘query’: {'match’: {‘test’: 'test}}}
es.search(index=‘index_name’, ‘doc_type’: ‘doc_name’, body=body)
multi_match:
body = {‘query’: {‘multi_match’: {‘query’: ‘test’, ‘fields’: [‘test’]}}}
es.search(index=‘index_name’, doc_type=‘doc_name’, body=body)

  • ids

body = {‘query’: {‘ids’: {‘type’: ‘doc_type’, ‘values’: [‘test’]}}}
es.search(index=‘index_name’, doc_type=‘doc_name’, body=body)

  • 复合查询bool
body = {
	'query': {
		'bool': {
			'must': [
				{
					'term': {
						'test': 'test'
					}
				},
				{
					'term': {
						'name': 'python'
					}
				}
			]
		}
	}
}
有时候会出现匹配不到,可以换term为match

es.search(index=‘index_name’, doc_type=‘doc_name’, body=body)

  • 切片式查询
body = {
	'query': {
		'match_all': {}
		}
	'form': 2
	'size': 4
}

es.search(index=‘index_name’, doc_type=‘doc_name’, body=body)

  • 范围查询
body = {
	'query': {
		'range': {
			'age': {
				'gte': 18,
				'lte': 30
			}
		}
	}
}

# 查询年龄大于等于18, 小于等于30的
es.search(index=‘index_name’, doc_type=‘doc_name’, body=‘body’)

  • 前缀查询

body = {‘query’: {‘prefix’: {‘test’: ‘te’}}}
es.search(index=‘index_name’, doc_type=‘doc_name’, body=‘body’)

  • 通配符查询

body = {‘query’: {‘wildcard’: {‘test’: ‘*st’}}}
es.search(index=‘index_name’, doc_type=‘doc_name’, body=‘body’)

  • 排序
body = {
	'query': {
		'match_all': {}
		}
	'sort': {
		'age': {				# 根据age字段升序拍讯
			'order': 'asc'		# asc升序,desc降序
		}
	}
}

es.search(index=‘index_name’, doc_type=‘doc_name’, body=‘body’)

  • 响应过滤

只获取_id数据,多个条件用都会隔开
es.search(index=‘index_name’, doc_type=‘doc_name’, filter_path=[‘hits.hits._id’])
获取所有数据
es.search(index=‘index_name’, doc_type=‘doc_name’, filter_path=[‘hits.hits.*’])

  • count

es.count(index=‘index_name’, doc_type=‘doc_name’)

  • 度量类聚合
# 获取最小值
body = {
	'query': {'match_all': {}
	},
	'aggs': {						# 聚合查询
		'min_age': {				# 最小值的key
			'min': {				# 最小
				'field': 'age'		# 查询age的最小值
			}
		}
	}
}

查询所有数据,并获取age的最小值
es.search(index=‘index_name’, doc_type=‘doc_name’, body=‘body’)

# 获取最大值
body = {
	'query': {'match_all': {}
	},
	'aggs': {						# 聚合查询
		'max_age': {				# 最大值的key
			'max': {				# 最大
				'field': 'age'		# 查询age的最大值
			}
		}
	}
}

查询所有数据,并获取age的最大值
es.search(index=‘index_name’, doc_type=‘doc_name’, body=‘body’)

  • 获取和
body = {
	'query': {
		'match_all': {}
	},
	'aggs': {						# 聚合查询
		'sum_age': {				# 和的key
			'sum': {				# 和
				'files': 'age'		# 获取所有age的和
			}
		}
	}
}

搜索所有的数据,并获取age的和
es.search(index=‘index_name’, doc_type=‘doc_name’, body=‘body’)

  • 获取平均值
body = {
	'query': {
		'match_all': {}
	},
	'aggs': {						# 聚合查询
		'avg_age': {				# 平均值的key
			'avg': {				# 平均值
				'files': 'age'		# 获取所有age的平均值
			}
		}
	}
}

搜索所有的数据,并获取age的平均值
es.search(index=‘index_name’, doc_type=‘doc_name’, body=‘body’)

3. 通过curl进行交互

1) http方法:get、post、put、head、delete

  1. 更新时:
    • put会将新的json值替换旧的,
    • 而post方式只会更新相同字段的值,其他字段不变,新提交的字段不存在时增加
  2. 快速建表(创建索引):
    • curl -XPUT ‘http://localhost:9200/test_table’
  3. 计算集群中文档数量

curl -XGET ‘http://localhost:9200/_count?pretty’ -d ’
{
“query”: {“match_all”: {}}
}

二、其他

1. es时间

  • 通过Python处理,插入带有时区信息的日期字符串
import datetime
import time

ts = time.time()
dt = datetime.datetime.fromtimestamp(int(ts), pytz.timezone("Asia/Shanghai"))
dt.isoformat()

2. 启动es,可能出现的异常

1

max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
  • 解决方法,修改/etc/sysctl.conf文件配置

    sudo vim /etc/sysctl.conf

  • 添加如下配置

    vm.max_map_count=655360

  • 使配置生效

    source /etc/sysctl.conf

参考:
ElasticSearch教程——基本概念及核心配置文件详解
Python-ElasticSearch,python对ES进行写入、更新、删除、搜索

你可能感兴趣的:(大数据,数据分析,分布式)