Elasticsearch快速入门篇

致谢中华石杉Elasticsearch顶尖高手系列

用数据库做搜索会怎么样

  • 全表扫描,一个一个查找:每条记录的指定字段的文本,可能会很长,每条记录的指定字段的文本,可能会很长
  • 性能不好
  • 不能将搜索词拆分开来,尽可能去搜索更多的符合你的期望的结果 【生化机 -x->生化危机】

什么是全文检索和Lucene

  • 全文检索,倒排索引
    图片说明
  • lucene,就是一个jar包,里面包含了封装好的各种建立倒排索引,以及进行搜索的代码,包括各种算法。我们就用java开发的时候,引入lucene jar,然后基于lucene的api进行去进行开发就可以了。用lucene,我们就可以去将已有的数据建立索引,lucene会在本地磁盘上面,给我们组织索引的数据结构。另外的话,我们也可以用lucene提供的一些功能和api来针对磁盘上

什么是Elasticsearch

  • 图解 解决了lucene一台机器容纳不了很多的信息
    后面可以做一些基于地理位置的搜索,聚合分析的功能
    图片说明

Elasticsearch的功能

  • 分布式的搜索引擎和数据分析引擎:
    1. 搜索:百度,网站的站内搜索,IT系统的检索
    2. 数据分析:电商网站,最近某商品销量排名前10的商家有哪些;新闻网站,最近1个月访问量排名前3的新闻版块是哪些
    3. 分布式,搜索,数据分析
  • 全文检索,结构化检索,数据分析
    1. 全文检索:我想搜索商品名称包含牙膏的商品,select * from products where product_name like "%牙膏%"
    2. 结构化检索:我想搜索商品分类为日化用品的商品都有哪些,select * from products where category_id='日化用品'
      部分匹配、自动完成、搜索纠错、搜索推荐
    3. 数据分析:我们分析每一个商品分类下有多少个商品,select category_id,count(*) from products group by category_id
  • 对海量数据进行近实时的处理
    1. 分布式:ES自动可以将海量数据分散到多台服务器上去存储和检索
    2. 海联数据的处理:分布式以后,就可以采用大量的服务器去存储和检索数据,自然而然就可以实现海量数据的处理了
    3. 跟分布式/海量数据相反的:lucene,单机应用,只能在单台服务器上使用,最多只能处理单台服务器可以处理的数据量
    4. 近实时:检索个数据要花费1小时(这就不要近实时,离线批处理,batch-processing);需要在秒级别对数据进行搜索和分析才符合近实时

Elasticsearch的特点

  • 可以作为一个大型分布式集群(数百台服务器)技术,处理PB级数据,服务大公司;也可以运行在单机上,服务小公司
  • Elasticsearch不是什么新技术,主要是将全文检索、数据分析以及分布式技术,合并在了一起,才形成了独一无二的ES;lucene(全文检索),商用的数据分析软件(也是有的),分布式数据库(mycat)
  • 对用户而言,是开箱即用的,非常简单,作为中小型的应用,直接3分钟部署一下ES,就可以作为生产环境的系统来使用了,数据量不大,操作不是太复杂
  • 数据库的功能面对很多领域是不够用的(事务,还有各种联机事务型的操作);特殊的功能,比如全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理;Elasticsearch作为传统数据库的一个补充,提供了数据库所不不能提供的很多功能

lucene和elasticsearch的前世今生

  • lucene,最先进、功能最强大的搜索库,直接基于lucene开发,非常复杂,api复杂(实现一些简单的功能,写大量的java代码),需要深入理解原理(各种索引结构)
  • elasticsearch,基于lucene,隐藏复杂性,提供简单易用的restful api接口、java api接口(还有其他语言的api接口)
    (1)分布式的文档存储引擎
    (2)分布式的搜索引擎和分析引擎
    (3)分布式,支持PB级数据
    (4)开箱即用,优秀的默认参数,不需要任何额外设置,完全开源

elasticsearch的核心概念

  • Near Realtime(NRT):近实时,从写入数据到数据可以被搜索到有一个小延迟(大概1秒);基于es执行搜索和分析可以达到秒级
    图片说明
  • Cluster:集群,包含多个节点,每个节点属于哪个集群是通过一个配置(集群名称,默认是elasticsearch)来决定的,对于中小型应用来说,刚开始一个集群就一个节点很正常
  • Node:节点,集群中的一个节点,节点也有一个名称(默认是随机分配的),节点名称很重要(在执行运维管理操作的时候),默认节点会去加入一个名称为“elasticsearch”的集群,如果直接启动一堆节点,那么它们会自动组成一个elasticsearch集群,当然一个节点也可以组成一个elasticsearch集群
  • Document&field:文档,es中的最小数据单元,一个document可以是一条客户数据,一条商品分类数据,一条订单数据,通常用JSON数据结构表示,每个index下的type中,都可以去存储多个document。一个document里面有多个field,每个field就是一个数据字段。
    product document #一个document单元
    {
    "product_id": "1",   # field
    "product_name": "高露洁牙膏",  # field
    "product_desc": "高效美白",  # field
    "category_id": "2",   # field
    "category_name": "日化用品"  # field
    } 
  • Index:索引,包含一堆有相似结构的文档数据,比如可以有一个客户索引,商品分类索引,订单索引,索引有一个名称。一个index包含很多document,一个index就代表了一类类似的或者相同的document。比如说建立一个product index,商品索引,里面可能就存放了所有的商品数据,所有的商品document。
  • Type:类型,每个索引Index里都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field,比如博客系统,有一个索引,可以定义用户数据type,博客数据type,评论数据type。不同type 不同field;
    type,日化商品type,电器商品type,生鲜商品type
    每一个type里面,都会包含一堆document
  • shard:单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。每个shard都是一个lucene index。
  • replica:任何一个服务器随时可能故障或宕机,此时shard可能就会丢失,因此可以为每个shard创建多个replica副本。replica可以在shard故障时提供备用服务,保证数据不丢失,多个replica还可以提升搜索操作的吞吐量和性能。primary shard(建立索引时一次设置,不能修改,默认5个),replica shard(随时修改数量,默认1个),默认每个索引10个shard,5个primary shard,5个replica shard,最小的高可用配置,是2台服务器。【互为主备】
    图片说明

elasticsearch核心概念 vs. 数据库核心概念

Elasticsearch <----> 数据库


Document <------------> 行
Type <-------------------> 表
Index <------------------> 库

启动Elasticsearch

  • bin\elasticsearch.bat
    图片说明
  • 检查ES是否启动成功:http://localhost:9200/?pretty
    name: node名称
    cluster_name: 集群名称(默认的集群名称就是elasticsearch)
    version.number: 5.2.0,es版本号
    图片说明
  • 修改集群名称:elasticsearch.yml
    # ---------------------------------- Cluster -----------------------------------
    #
    # Use a descriptive name for your cluster:
    #
    #cluster.name: my-application
  • 下载和解压缩Kibana安装包,使用里面的开发界面,去操作elasticsearch,作为我们学习es知识点的一个主要的界面入口
  • 启动Kibana:bin\kibana.bat
    图片说明
  • 进入Dev Tools界面 :http://localhost:5601
  • 利用kibana发送GET _cluster/health
    {
    "cluster_name": "elasticsearch",
    "status": "yellow",
    "timed_out": false,
    "number_of_nodes": 1,
    "number_of_data_nodes": 1,
    "active_primary_shards": 1,
    "active_shards": 1,
    "relocating_shards": 0,
    "initializing_shards": 0,
    "unassigned_shards": 1,
    "delayed_unassigned_shards": 0,
    "number_of_pending_tasks": 0,
    "number_of_in_flight_fetch": 0,
    "task_max_waiting_in_queue_millis": 0,
    "active_shards_percent_as_number": 50
    }
全部评论

相关推荐

M_bao:换个排版吧哥们,看着费劲
点赞 评论 收藏
分享
10-11 17:30
湖南大学 C++
我已成为0offer的糕手:羡慕
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务