什么是Elasticsearch?
Elasticsearch是一个开源的分布式、Restful风格的搜索和数据分析引擎,它的底层是开源数据库Apache Lucene。
一个分布式的实时文档存储,每个字段可以被索引与搜索一个分布式实时分析搜索引擎能胜任上百个服务节点的扩展,并支持PB级别的结构化或者非结构化数据Elasticsearch基本概念
1)全文检索(Full-text Search) 全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结构反馈给用户的检索方式。 2)倒排索引(Inverted Index) 该索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址,由于不是由记录来确定数据值,而是由属性值来确定记录的位置,因而叫做倒排索引。Elasticsearch能够事先快速、高效的搜索功能,正式基于倒排索引原理。 3)节点&集群(Node&Cluster) Elasticsearch本质上是一个分布式数据库,允许多态服务器协同工作,每台服务器可以运行多个Elasticsearch实例。单个ElasticSearch实例称为一个节点(Node),一组节点构成一个集群(Cluster)。 4)索引(Index) Elasticsearch数据管理的顶层单位叫做索引,相当于关系型数据库里面的数据库的概念。每个Index的名字都必须是小写。 5)文档(Document) Index里面的单条记录称为Document(文档),许多条Document构成一个Index。Document使用JSON格式表示,同一个Index里面的Document,不要求有相同的结构(scheme),但是最好要保持相同,这样有利于提高搜索效率。 6)类型(Type) Document可以分组,比如employee这个Index里面,可以按照部门分组,也可以按照职级分组,它是虚拟的逻辑分组,过来过滤Document,类似关系型数据库中的数据表。 不同的Type应该有相似的结构(schema),性质完全不同的数据(如products和logs)应该存为两个Index,而不是同一个Index中的两个Type. 7) 文档元数据(Document metadata) 文档元数据为_index, _type, _id, 这三者唯一表示一个文档,_index表示文档在哪里存放,_type表示文档的对象类别,_id为文档的唯一标识 8)字段(Fields) 每个Document都类似一个JSON结构,它包含了许多字段,每个字段都有其对应的值,多个字段组成了一个Document,可以类比关系型数据库数据表中的字段。 9) Shards:创建索引库的时候需要指定分片,(spark中的RDD,Kafka中的partition)
curl -XPUT 'http://ip:port/index' -d '{"settings":{"number_of_shards":3}}' 索引库一旦创建之后,分片数就不能再次被修改10)Replicas 索引库中的副本,用于提高系统的容错性,提高查询的效率
curl -XPUT 'http://ip:port/index' -d '{"settings":{"number_of_replicas":3}}' recovery表示数据库恢复或者数据重分布,当es中有节点加入或者推出的时候,集群就会对整个节点进行负载均衡,重新分配分片。
12)gateway
es的索引持久化方式,默认的是在内存中保存的,当内存存满之后会持久化到硬盘中,当es集群重启的时候,它就会从gatway中读取数据。es中的gatway可以自定义,可以从本地文件系统,也可以是HDFS
13)discovery.zen
es的节点的自动发现机制,es本身有p2p机制的系统。 discovery.zen.ping.multicast.enabled:false配置指定的节点在es集群启动的时候将此节点注册到集群的列表中discovery.zen.ping.unicast.hosts: 【】
RestFul:它是一种软件设计架构的思想,提供了一种规范
get:获取当前对象的状态post:创建/修改对象put:创建对象delete:删除对象curl:它是一个发送请求的命令
-X:http请求的请求方式-d:需要传入的数据-H:http的请求头的信息ES的内置接口
URL描述/index/_search检索索引库下所有的数据/_aliases获取或操作索引的别名/index查看或操作索引的详情/index/type查看或操作类型的详情index.mapping查看或操作映射mappingindex/_setting查看或操作设置index/open打开索引/index/close关闭索引/index/_refresh刷新索引/index/_flush刷洗索引(调用底层lucene)刷新添加索引: put创建索引库表需要手动的指定id, post创建索引库可以不用手动指定id,系统随机一个uuid,如果想要id自增只能通过post来创建
curl \ -XPUT/POST \ -H "Content-Type:application/json" \ 'http://{ip}:{port}/{index}/{type}/{id}' -d '{json}'查询一条记录
curl \ -XGET \ 'http://{ip}:{port}/{index}/{type}/{id}'查询多条记录
curl \ -XGET \ 'http://{ip}:{port}/{index}/_search'条件查询
curl \ -XGET \ 'http://{ip}:{port}/{index}/_search?q=field:value'过滤查询结果:查询指定字段
curl \ -XGET \ 'http://{ip}:{port}/{index}/_search?q=field:value&_source=field1, field2$pretty'分页查询
curl \ -XGET \ 'http://{ip}:{port}/{index}/_search?from=n&size=m&pretty'修改索引
1,put操作修改数据是将之前的数据进行覆盖 2,post只修改局部的字段,只能使用post来完成
curl -XPOST -H \ "Content-Type:application/json" \ 'http://{ip}:{port}/{index}/{type}/${id}/_update?pretty' \ -d '{"doc":{field:value}}'删除索引
curl -XDELETE -H "Content-Type:application/json" \ 'http://{ip}:{port}/{index}/{type}/${id}'索引批量操作
curl -XPOST -H \ "Content-Type:application/json" \ 'http://{ip}:{port}/{index}/{type}/_bulk?pretty' \ --data-binary "@path"面试题(来自大数据私房菜)
1)为什么要用ElasticSearch?存进去的数据是什么格式的?怎么进行查询? 因为它是一个开源的,分布式的实时文档存储和搜索分析引擎,每个字段可以被索引和搜索,支持扩展,以及PB级别的结构和非结构化数据。支持中文检索 存储的是JSON格式的数据 支持Restful风格,通过curl和es内置的接口进行查询