Elesticsearch基础
Elasticsearch的核心概念
(1)Near Realtime(NRT):近实时,两个意思,从写入数据到数据可以被搜索到有一个小延迟(大概1秒);基于es执行搜索和分析可以达到秒级
(2)Cluster:集群,包含多个节点,每个节点属于哪个集群是通过一个配置(集群名称,默认是elasticsearch)来决定的,对于中小型应用来说,刚开始一个集群就一个节点很正常
(3)Node:节点,集群中的一个节点,节点也有一个名称(默认是随机分配的),节点名称很重要(在执行运维管理操作的时候),默认节点会去加入一个名称为“elasticsearch”的集群,如果直接启动一堆节点,那么它们会自动组成一个elasticsearch集群,当然一个节点也可以组成一个elasticsearch集群
(4)Document&field:文档,es中的最小数据单元,一个document可以是一条客户数据,一条商品分类数据,一条订单数据,通常用JSON数据结构表示,每个index下的type中,都可以去存储多个document。一个document里面有多个field,每个field就是一个数据字段。
(5)Index:索引,包含一堆有相似结构的文档数据,比如可以有一个客户索引,商品分类索引,订单索引,索引有一个名称。一个index包含很多document,一个index就代表了一类类似的或者相同的document。比如说建立一个product index,商品索引,里面可能就存放了所有的商品数据,所有的商品document。
(6)Type:类型,每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field,比如博客系统,有一个索引,可以定义用户数据type,博客数据type,评论数据type。
7)shard:单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。每个shard都是一个lucene index。
(8)replica:任何一个服务器随时可能故障或宕机,此时shard可能就会丢失,因此可以为每个shard创建多个replica副本。replica可以在shard故障时提供备用服务,保证数据不丢失,多个replica还可以提升搜索操作的吞吐量和性能。primary shard(建立索引时一次设置,不能修改,默认5个),replica shard(随时修改数量,默认1个),默认每个索引10个shard,5个primary shard,5个replica shard,最小的高可用配置,是2台服务器。
Elesticsearch概念
一个采用Restful API标准的高扩展性和高可用性的事实数据分析的全文搜索工具。
Elesticsearch架构
CURL命令
- 以命令的方式来执行HTTP协议的请求的工具
- 可以通过CURL操作HTTP的GET/POST/DELETE/PUT方法。
例如:
- curl www.baidu.com
- 保存网页:curl -o baidu.html www.baidu.com
- 显示http response的头信息 curl -i www.baidu.com
- 显示一次http请求的通信过程
curl -v www.baidu.com
curl --trace output.txt www.baidu.com - CURL 执行GET/POST/PUT/DELETE操作:
curl -X GET/POST/PUT/DELETE www.baidu.com 默认是GET请求
Linux启动Elasticsearch
启动命令:
./bin/elasticsearch -d (-d参数是为了让服务后台运行)
Web服务的地址
http://loccalhost:9200
Elasticsearch目录结构
Windows启动Elasticsearch
- 在bin目录下执行elasticsearch.bat 命令
- http://localhost:9200/?pretty
Windows启动Kibana
- 在bin目录下执行kibana.bat命令
- http://localhost:5601
Dev Tools使用
使用es的restful api
- 集群健康检查
进入Kibana的Dev Tools界面,在控制台输入命令进行集群的健康检查。如果想要快速检查集群的健康状况,可以使用es提供的cat api。
- green:每个索引的primary shard和replica shard都是active状态的。
- yellow:每个索引的primary shard都是active状态的,但是部分replica shard不是active状态,处于不可用的状态。
- red:不是所有索引的primary shard都是active状态的,部分索引有数据丢失了。
默认的配置是给每个index分配5个primary shard和5个replica shard,而且primary shard和replica shard不能在同一台机器上(为了容错)。
快速查看集群中有哪些索引:
GET _cat/indices?v创建索引
PUT /test_index?pretty删除索引
DELETE /text_index?prettyCRUD操作
每一次操作_version版本号都会变化(1)新增:新增文档,建立索引
PUT /index/type/id{"json数据"}例:PUT /market/product/1{"name" : "苹果","desc" : "一种水果","price" : 3,"producer" :"山东","tags": [ "甜", "好吃" ]}结果:{"_index": "market","_type": "product","_id": "1","_version": 1,"result": "created","_shards": {"total": 2,"successful": 1,"failed": 0},"created": true}
es会自动建立index和type,不需要提前创建,而且es默认会对document每个field都建立倒排索引,让其可以被搜索。
(2)查询:检索文档
GET /index/type/id例:GET /market/product/1结果:{"_index": "market","_type": "product","_id": "1","_version": 1,"found": true,"_source": {"name": "苹果","desc": "一种水果","price": 3,"producer": "山东","tags": ["甜","好吃"]}}
(3)修改:替换文档
PUT /index/type/id{"json数据"}例:PUT /market/product/1{"name" : "芒果","desc" : "一种水果","price" : 3,"producer" :"海南","tags": [ "甜", "好吃" ]}结果:{"_index": "market","_type": "product","_id": "1","_version": 2,"result": "updated","_shards": {"total": 2,"successful": 1,"failed": 0},"created": false}
替换方式有一个不好,即使必须带上所有的field,才能去进行信息的修改
(4)修改:更新文档
POST /index/type/id/_update{"doc":{"fileld":"value"}}例:POST /market/product/1/_update{"doc" : {"name" : "香蕉"}}结果:{"_index": "market","_type": "product","_id": "1","_version": 6,"result": "updated","_shards": {"total": 2,"successful": 1,"failed": 0}}
5)删除:删除文档
DELETE /index/type/id例:DELETE /market/product/1结果:{"found": true,"_index": "market","_type": "product","_id": "1","_version": 7,"result": "deleted","_shards": {"total": 2,"successful": 1,"failed": 0}}再一次查询:GET /market/product/1返回:{"_index": "market","_type": "product","_id": "1","found": false}
- 多种搜索方式
- query string search
因为search参数都是以http请求的query string来附带的
搜索全部商品:
GET /market/product/_search
结果:
{"took": 6,"timed_out": false,"_shards": {"total": 5,"successful": 5,"failed": 0},"hits": {"total": 1,"max_score": 1,"hits": [{"_index": "market","_type": "product","_id": "1","_score": 1,"_source": {"name": "苹果","desc": "一种水果","price": 3,"producer": "山东","tags": ["甜","好吃"]}}]}
}took:耗费了几毫秒
timed_out:是否超时,这里是没有
_shards:数据拆成了5个分片,所以对于搜索请求,会打到所有的primary shard(或者是它的某个replica shard也可以)
hits.total:查询结果的数量,1个document
hits.max_score:score的含义,就是document对于一个search的相关度的匹配分数,越相关,就越匹配,分数也高
hits.hits:包含了匹配搜索的document的详细数据
带条件和排序的搜索:
GET /market/product/_search?q=name:mangguo&sort=price:desc
1. name值为中文查不出来
2. 适用于临时的在命令行使用一些工具,比如curl,快速的发出请求,来检索想要的信息;但是如果查询请求很复杂,是很难去构建的
在生产环境中,几乎很少使用query string search
- query DSL
DSL:Domain Specified Language,特定领域的语言
http request body:请求体,可以用json的格式来构建查询语法,比较方便,可以构建各种复杂的语法,比query string search强大多了
更加适合生产环境的使用,可以构建复杂的查询
查询所有的商品:
GET /market/product/_search
{"query":{"match_all": {}}
}{"took": 2,"timed_out": false,"_shards": {"total": 5,"successful": 5,"failed": 0},"hits": {"total": 1,"max_score": 1,"hits": [{"_index": "market","_type": "product","_id": "2","_score": 1,"_source": {"name": "mangguo","desc": "一种水果","price": 3,"producer": "海南","tags": ["甜","好吃"]}}]}
}
按条件查询并排序:
GET /market/product/_search
{"query" : {"match" : {"name" : "mangguo"}},"sort": [{ "price": "desc" }]
}{"took": 6,"timed_out": false,"_shards": {"total": 5,"successful": 5,"failed": 0},"hits": {"total": 1,"max_score": null,"hits": [{"_index": "market","_type": "product","_id": "2","_score": null,"_source": {"name": "mangguo","desc": "一种水果","price": 3,"producer": "海南","tags": ["甜","好吃"]},"sort": [3]}]}
}
分页查询:
GET /market/product/_search
{"query":{"match_all": {}},"from": 0,"size": 1
}
指定要查询的field:
GET /market/product/_search
{"query":{"match_all": {}},"_source": ["name","price"]
}
- query filter 对数据进行过滤
GET /market/product/_search
{"query" : {"bool" : {"must" : {"match" : {"name" : "mangguo" }},"filter" : {"range" : {"price" : { "gt" : 1 } }}}}
}
- full-text search(全文检索)
GET /market/product/_search
{"query" : {"match" : {"name" : "mangguo banana"}}}
倒排索引,按照相关度排序
- phrase search(短语搜索)
跟全文检索相对应,相反,全文检索会将输入的搜索串拆解开来,去倒排索引里面去一一匹配,只要能匹配上任意一个拆解后的单词,就可以作为结果返回。
phrase search,要求输入的搜索串,必须在指定的字段文本中,完全包含一模一样的,才可以算匹配,才能作为结果返回。
GET /market/product/_search
{"query":{ "match_phrase" : {"producer" : "hainan orange"}}
}
结果:
{"took": 8,"timed_out": false,"_shards": {"total": 5,"successful": 5,"failed": 0},"hits": {"total": 1,"max_score": 1.2438203,"hits": [{"_index": "market","_type": "product","_id": "4","_score": 1.2438203,"_source": {"name": "orange","desc": "一种水果","price": 3,"producer": "hainan orange","tags": ["甜","好吃"]}}]}
- highlight search(高亮搜索结果)
匹配的结果标红了
GET /market/product/_search
{"query" : {"match" : {"producer" : "hainan"}},"highlight": {"fields" : {"producer" : {}}}
}结果:
{"took": 29,"timed_out": false,"_shards": {"total": 5,"successful": 5,"failed": 0},"hits": {"total": 2,"max_score": 0.62191015,"hits": [{"_index": "market","_type": "product","_id": "4","_score": 0.62191015,"_source": {"name": "orange","desc": "一种水果","price": 3,"producer": "hainan orange","tags": ["甜","好吃"]},"highlight": {"producer": ["<em>hainan</em> orange"]}},{"_index": "market","_type": "product","_id": "3","_score": 0.2876821,"_source": {"name": "banana","desc": "一种水果","price": 3,"producer": "hainan","tags": ["甜","好吃"]},"highlight": {"producer": ["<em>hainan</em>"]}}]}
}
- 聚合分析
分组聚合:
先将文本field的fielddata属性设置为true
PUT /market/_mapping/product{"properties": {"tags": {"type": "text","fielddata": true}}}
按照tag进行分组,返回没组document的数量
GET /market/product/_search{"aggs": {"group_by_tags": {"terms": { "field": "tags" }}}}若不想返回全部的搜索结果,可以用:GET /market/product/_search{"size": 0,"aggs": {"group_by_tags": {"terms": { "field": "tags" }}}}
带搜索的聚合分析:
GET /market/product/_search{"query": {"match": {"producer": "hainan"}},"size": 0,"aggs": {"group_by_tags": {"terms": { "field": "tags" }}}}
嵌套聚合:
先分组,再计算每组的平均值
GET /market/product/_search
{"size": 0,"aggs": {"group_by_tags": {"terms": { "field": "tags" },"aggs" : { "avg_price" : {"avg" : { "field" : "price" }}}}}
}
先分组,再计算每组的平均值,再按照平均值的大小进行排序:
GET /market/product/_search
{"size": 0,"aggs": {"group_by_tags": {"terms": { "field": "tags","order": { "avg_price": "desc" } },"aggs" : { "avg_price" : {"avg" : { "field" : "price" }}}}}
}
按照指定的价格范围区间进行分组,然后在每组内再按照tag进行分组,最后再计算每组的平均值
GET /market/product/_search
{"size": 0,"aggs": {"group_by_price": {"range": {"field": "price","ranges": [{"from": 0,"to": 1},{"from": 1,"to": 2},{"from": 2,"to": 3}]},"aggs": {"group_by_tags": {"terms": {"field": "tags"},"aggs": {"average_price": {"avg": {"field": "price"}}}}}}}
}
Elasticsearch相关插件
- Head插件
Elasticsearch 集群管理工具 - Bigdesk插件
bigdesk是elasticsearch的一个集群的监控工具,可以通过它来查看集群的各种状态,如:cpu、内存使用情况、索引数据、搜索情况,http连接数等。 - Mavel插件
Marvel是elesticsearch的一个管理监控工具,集head和bigdesk优点于一身,Marvel插件是收费的。
Elesticsearch基础相关推荐
- java入门 慕路径,Java入门基础知识总结学习教程大全【必看经典】
类型的表达式,是循环条件,表达式3是党执行了一遍循环之后,修改控制循环的变量值. ??? for语句的执行过程是这样的:首先计算表达式1,完成必要的初始化工作:然后判断表达式2的值,如果表达式的值为t ...
- 提交表单自动刷新_Web自动化测试:元素的基础操作和浏览器基础操作
上一节,我们了解了如何定位元素,其实也有涉及对于元素的操作,这一节我们就详细的介绍一下对于元素的操作和对于浏览器的一些操作 一.对于元素的基础操作: clear():清除输入框内的文本 send_ke ...
- java mybatis基础
java mybatis基础 1.1 什么是mybatis? mybatis是一个优秀的持久层框架. 避免几乎所有的JDBC代码和手动设置参数以及获取结果集的过程. 可以使用简单的xml或者注解来配置 ...
- 【J2SE】学习基础
Java基础 语法基础 OO Exception Array 基础类 I/O Stream Collection/Generic Thread TCP/UDP GUI Meta Data Regula ...
- 【Linux系统】基础总结
我不太清楚运维部门具体是做什么的,就接触过一点点运维部门! 也就是是知道他们负责管理服务器,管理网络,管理项目部署 偶尔自己需要部署,不得不接触一些linux命令.简单总结一些基础 linux系统发展 ...
- 【Java 2 Platform Enterprise Edition】基础
问题1:为什么java是无关平台? 你之前用C或者C++写的源代码,编译好后,换一种操作系统,可能就执行不了了.因为新的操作系统不识别,你需要修改你的源码,并在新的操作系统上重新编译才能运行,比如Wi ...
- SpringCloud Alibaba微服务实战(一) - 基础环境搭建
说在前面 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来 ...
- Redis概述和基础
Redis 1.NoSQL NoSQL = Not Only SQL(不仅仅是SQL) 泛指非关系型数据库的,随着web2.0互联网的诞生!传统的关系型数据库很难对付web2.0时代!尤其是超大规模的 ...
- pass基础架构分析
pass基础架构分析 Relay 和 TVM IR,包含一系列优化passes,可提高模型的性能指标,如平均推理,内存占用,或特定设备的功耗.有一套标准优化,及特定机器学习的优化,包括常量折叠,死代码 ...
最新文章
- redis命令_Redis 命令执行过程(下)
- 条件运算符?:接受三个操作数,是C#中唯一的三元运算符(转)
- Java读取String分行字符串
- CSS文件添加 @charset utf-8; 可能会引起样式在IE6下失效
- (三十)java多线程一
- Goland 这些实操技巧,你可能还不会!
- redis基本类型以及优点特性
- 一步一步带你训练自己的SSD检测算法
- 银行现在都很缺钱吗,为什么给的利息比以前高了?
- UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xbd in position 198: illegal multibyte sequence
- python 公开课_【python公开课|学好python前,必须掌握这篇Python for 循环语句,还不会就快来看看】- 环球网校...
- 为什么败者树的访问外存次数要比胜者树少_为什么说蒙地卡罗搜索树MCTS是AlphaZero的核心?[AlphaZero理论篇之三]...
- Java发送邮件(QQ邮箱)
- Django REST framework 中文文档
- 挂茶馆热血传奇私服辅助开发教程
- ANDROID仿淘宝商品浏览滑(拖)动查看详情界面
- sin函数对照表_三角函数数值对照表.pdf
- 尽量使用unity引擎的Random随机数
- 进程管理API之pid_nr/pid_vnr/pid_nr_ns
- c语言输入一元二次方程三个系数,C语言程序 一元二次方程
热门文章
- 关于Mysql的驱动(org.gjt.mm.mysql.Driver)问题
- 【LR/PS插件】胶片颗粒调色光晕视觉效果工具 Optics 2022.0.1 Win
- IOS苹果内购 PHP后端验证票据
- vmware启动报错Entering emergency mode
- php无法导出excel,PHPExcel导出Excel文件时出现错误的解决办法
- 【BZOJ3503】【Cqoi2014】和谐矩阵 高斯消元,解异或方程组
- 小白学 Python 爬虫(27):自动化测试框架 Selenium 从入门到放弃(上)
- CVPR ECCV ICCV论文汇总
- 电脑管家用户的bandizip右键解压选项启用
- 萌新问题合集:2.win10关于ftp保存了密码怎么取消?