上篇提到选择了elasticsearch ES作为专业化搜索引擎的核心,这篇讨论一下ES的基本结构和应用概念。首先,从硬结构方面来讲:ES是在一个集群(cluster)环境里运行的,所以ES应该具备高可用和高扩展特性,因为系统可以分布在机器内无数个节点(node)服务器上运行。ES的索引(index)分布在集群中各node上。ES的index又可以向下分成多个shard分片。因为ES是基于lucent的,ES的shard就是一个完整的lucent index。所以,ES index是一个shard集合,也就是lucent index集合。在定义ES index时必须指定该index的shard(primary)数量,之后不得修改。这就意味着每个ES index需要占用一个以上shard,而shard是ES index操作的最小单元,也就是说一个shard只能存放一种ES index索引文件(document)。

在ES7之前的版本表面上每个index里又分不同的document type,可以分辨不同类型的document。但因为ES index是shard集合,或者lucent index集合,而lucent index并没有document type的概念,基本上是一种nosql (schemaless)存储结构,所以ES7之后就取消了_type这层,其结果就变成每个ES index只能容许一种document操作。

很多人认为ES也是数据库系统,ES7之前普遍认识是:index -> database, type -> table, document -> row。ES7之后在某种意义上index就是table了。所以:把ES作为应用系统的数据库来使用是大大不妥的。因为应用系统由众多数据表组成关系数据库,在ES上就意味着必须构建众多的index,会出现大量的细小shard(table)分布在集群节点上,严重影响效率。

ES7是个集群体系:cluster->nodes->index->shards。shard又分primary shard和replica shard  (pshard,rshard)。一般来说pshard和rshard相互应分布在不同的node上。所有写操作由pshard负责,或者说先在pshard上执行后再把结果分发到隶属各rshard。读取操作采取就近读取策略以实现快速响应。

ES的底层操作是由lucent实现的。在lucent操作时shard又被细分一层到segment:luccent shard是由多个segment组成的,lucent的写操作先写入一块缓存(write-buffer),然后以一种提交形式再以一个segment为单元存写入shard。

ES是某种nosql数据库,但在存写数据时又对数据,特别是字符text类型的数据进行了分拆处理,所以ES存写即是更新索引indexing。从另一个角度说明:ES是一个索引容器(index container),是一个完整封闭的容器。index的构建、维护、使用等都是通过ES提供的一些工具软件以及一套HTTP-api来实现的。数据输入可以用工具(如logstash)进行批次型的indexing,实时indexing是通过HTTP-api实现的。

ES自带一套REST-api可以对index进行更新、搜索、统计、提取。

ES-REST-api的功能可以说是相当全面,但复杂、不易掌握、使用要求门槛高,且不易作为系统整合工具。为了实现ES在行业IT系统的普遍应用,应该绕过复杂的ES-REST-api,在ES之上设计一套连接ES-HTTP通道的REST-api作为ES和前端(web,mobile)的桥梁,把前端搜索条件翻译成ES JSON格式的搜索指令发送至ES,然后对搜索结果进行简化、筛选处理,以某种简洁通用的格式呈现给前端。最终目的其实是为了降低前端开发人员引用ES的技术门槛。

search(1)- elasticsearch结构概念的更多相关文章

  1. ElasticSearch 全文检索— ElasticSearch 核心概念

    ElasticSearch核心概念-Cluster 1)代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的.es的一个概念就是去中心化,字 ...

  2. Elasticsearch入门教程(二):Elasticsearch核心概念

    原文:Elasticsearch入门教程(二):Elasticsearch核心概念 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:ht ...

  3. ElasticSearch 核心概念

    ElasticSearch核心概念-Cluster ElasticSearch核心概念-shards ElasticSearch核心概念-replicas ElasticSearch核心概念-reco ...

  4. ELK 学习笔记之 elasticsearch基本概念和CRUD

    elasticsearch基本概念和CRUD: 基本概念: CRUD: 创建索引: curl -XPUT 'http://192.168.1.151:9200/library/' -d '{" ...

  5. 【ElasticSearch】概念

    小史是一个非科班的程序员,虽然学的是电子专业,但是通过自己的努力成功通过了面试,现在要开始迎接新生活了. 对小史面试情况感兴趣的同学可以观看面试现场系列. 随着央视诗词大会的热播,小史开始对诗词感兴趣 ...

  6. Elasticsearch基本概念和使用

    Elasticsearch基本概念和使用 1.操作索引 1.1.基本概念 Elasticsearch也是基于Lucene的全文检索库,本质也是存储数据,很多概念与MySQL类似的. 对比关系: 索引( ...

  7. Elasticsearch核心概念

    Elasticsearch 核心概念 Cluster 代表一个集群, 集群中有多个节点, 其中一个为主节点, 该节点可以通过选举产生.(主从节点只针对于集群内部) 去中心化: 对于集群外来说无中心节点 ...

  8. ElasticSearch 基本概念 and 索引操作 and 文档操作 and 批量操作 and 结构化查询 and 过滤查询

    基本概念 索引: 类似于MySQL的表.索引的结构为全文搜索作准备,不存储原始的数据. 索引可以做分布式.每一个索引有一个或者多个分片 shard.每一个分片可以有多个副本 replica. 文档: ...

  9. elasticsearch基本概念与查询语法

    序言 后面有大量类似于mysql的sum, group by查询 elk === elk总体架构 https://www.elastic.co/cn/products Beat 基于go语言写的轻量型 ...

随机推荐

  1. 基于ci框架 修改出来了一个带农历的万年历。

    1这里没有写model:代码一看就懂,没什么负杂地方,就是麻烦一点. 直接control模块的代码: <?php if ( ! defined('BASEPATH')) exit('No dir ...

  2. svn使用3 (转)

    接下来,试试用TortoiseSVN修改文件,添加文件,删除文件,以及如何解决冲突等. 添加文件 在检出的工作副本中添加一个Readme.txt文本文件,这时候这个文本文件会显示为没有版本控制的状态, ...

  3. git获取公钥和私钥以及常用的命令

    Git简单生成公钥和私钥的方法 Git安装完之后,需做最后一步配置.打开git bash,分别执行以下两句命令 git config --global user.name “用户名” git conf ...

  4. vue使用日记

    使用vue-cli生成单页应用框架, npm run serve之后即可开始修改src目录下面的js css文件(index.html可以保持不动), 自动热部署 , 前端框架就已经搭起来了. web ...

  5. 瑞星发布Linux系统安全报告:Linux病毒或将大面积爆发

    近半年来,由于中央推荐使用国产Linux操作系统,国产Linux操作系统开始受到政府机关及大型企事业机关单位的高度重视.很多人都认为,以Linux系统为基础的国产操作系统最符合国家.政府和企业信息安全 ...

  6. python3下应用pymysql(第二卷)

    上一卷讲述的是单条插入数据,现在要多条插入数据: 随意定义了一批数据 去数据库查询一下: 下面试一下查询语句: 获取游标里的数据,结果如下: 下面更改下返回数据类型,如果想用字典类型: 结果如下: 在 ...

  7. java 使用poi导入Excel通用方法

    需要的jar: [XML] 纯文本查看 复制代码 ? 1 2 3 4 5 <dependency>             <groupId>org.apache.poi< ...

  8. php--判断是否是手机端

    function is_mobile_request(){ $_SERVER['ALL_HTTP'] = isset($_SERVER['ALL_HTTP']) ? $_SERVER['ALL_HTT ...

  9. TCP并发、GIL全局锁、多线程讨论

    TCP实现并发 #client客户端 import socket client = socket.socket() client.connect(('127.0.0.1',8080)) while T ...

  10. 斐波那契数列的第N项

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1242 题目: 斐波那契数列的定义如下:   F(0) = 0 ...