17-Elasticsearch与关系数据库的对比(索引 Indices的理解,主要概念的理解)
2018-02-13 21:40
981 查看
1. 谈谈Elasticsearch 和 传统关系型数据库的 对比?那些是相似的,那些是不同的
ElasticSearch与关系型数据库的相似:名称 | 概念 | 概念 | 概念 | 概念 |
---|---|---|---|---|
Relational DB | Databases | Tables | Rows | Columns |
关系型数据库 | 数据库 | 表 | 行 | 列 |
ElasticSearch | Indices | Types | Documents | Fields |
ElasticSearch | 索引 | 类型 | 文档 | 字段 |
面向对象 | 对象 | 字段 |
2. 操作演示
2.1 建索引—-建索引
PUT /my_index { "settings":{ "number_of_shards":3, "number_of_replicas":0 #因为是单机,这里要设置没有副本,不然会集群黄色 } }
这里相当于建立了一个索引
my_index(可以理解为 MySQL数据库my_index),因为是单机,这里要设置没有副本,不然会集群黄色
2.2 建立表?使用mapping
这个mapping有点类似我们定义MySQL的数据库表结构的时候,需要指定每个字段的名字,其数据类型一样。当然,这个定义过程,也指明了这个表结构一共含有多少个字段了。
对于ES而言,就相当于指定了一个document有多少field,每个field的数据类型,注意,这个比MySQL定义表过程,还多了一个有用的操作,就是指定每个字段可用的分析器(analyzer). 当然,不指定的话,就是采用默认的standard analyzer,当然你也可以指定某个字段不需要分析器(not_analyzed).
PUT /my_index { "mappings": { "mytable": { # 表名称 "properties": { "name": { # name字段 "type": "text", # 类型text "analyzer": "standard" # 这个字段使用的分析器是标准分析器 }, "age": { # age年龄字段 "type": "text", # 类型text "analyzer": "standard" # 这个字段使用的分析器是标准分析器 } } } } }
这里报错
{ "error": { "root_cause": [ { "type": "resource_already_exists_exception", "reason": "index [my_index/niotLCjpTmCIjCsTivAMcg] already exists", "index_uuid": "niotLCjpTmCIjCsTivAMcg", "index": "my_index" } ], "type": "resource_already_exists_exception", "reason": "index [my_index/niotLCjpTmCIjCsTivAMcg] already exists", "index_uuid": "niotLCjpTmCIjCsTivAMcg", "index": "my_index" }, "status": 400 }
刚刚开始在这里出现好几个问题,其中最多的是
"type": "mapper_parsing_exception", "reason": "No handler for type [string] declared on field [name]"
原因是字段类型,不支持string了,我这个版本是6.2.x
2.3 版本6.2.x的字段类型
这里参考官网https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html
字段数据类型
Elasticsearch为文档中的字段支持许多不同的数据类型:
2.3.1 核心数据类型
字符串string类型取消了
text和
keyword
1. keyword:存储数据时候,不会分词建立索引
2. text:存储数据时候,会自动分词,并生成索引(这是很智能的,但在有些字段里面是没用的,所以对于有些字段使用text则浪费了空间)。
数字数据类型
long,
integer,
short,
byte,
double,
float,
half_float,
scaled_float
日期数据类型
date
布尔数据类型
boolean
二进制数据类型
binary
范围数据类型
integer_range,
float_range,
long_range,
double_range,
date_range
复杂的数据类型,这里不罗列,去官网看
2.4 解决2.2的问题(建索引的时候建立映射(类比mysql建立数据库的同时建表))
这样新建(新建数据库中的表)会出错,是不是建立index的时候,就要建立表呢?DELETE /my_index PUT /my_index { "settings":{ "number_of_shards":3, "number_of_replicas":0 }, "mappings":{ "student":{ "properties":{ "name":{ "type":"text", "analyzer": "standard" }, "age":{ "type":"text", "analyzer": "standard" } } } } }
这样做果然成功了,
{ "acknowledged": true, "shards_acknowledged": true, "index": "my_index" }
2.5 添加数据
我们尝试添加数据POST /my_index/student/1 { "name" : "John", "age" : "20" }
添加成功
{ "_index": "my_index", "_type": "student", "_id": "1", "_version": 1, "result": "created", "_shards": { "total": 1, "successful": 1, "failed": 0 }, "_seq_no": 0, "_primary_term": 1 }
2.6 删除数据
DELETE /my_index/student/1
2.7 删除type
删除type有两种选择:重新设置index。
删除type下的所有数据。
从6开始一个索引只能有一个type
下个版本会移除type
2.8 删除索引
DELETE /my_index
3. 总结
3.1 settings和mappings总结
1.settings是修改分片和副本数的。2.mappings是修改字段和类型的。
2.1 ES的mapping如何用?什么时候需要手动,什么时候需要自动?
Mapping,就是对索引库中索引的字段名称及其数据类型进行定义,类似于mysql中的表结构信息。不过es的mapping比数据库灵活很多,它可以动态识别字段。一般不需要指定mapping都可以,因为es会自动根据数据格式识别它的类型,如果你需要对某些字段添加特殊属性(如:定义使用其它分词器、是否分词、是否存储等),就必须手动添加mapping。
我们在es中添加索引数据时不需要指定数据类型,es中有自动影射机制,字符串映射为text,数字映射为long。通过mappings可以指定数据类型是否存储等属性。
2.2 我们不给index指定mapping或不进行settings设置,其实在很多时候也工作的很好。但是,对于操作的数据对象,我们自己了解的信息一定不会比ES系统猜测的信息全和准确。所以,我们自己在工程应用中,最好还是要自己给自己的索引做settings和mappings的设置。
3.2 模板
PUT /my_index # 索引名称 相当于mysql数据库 { "settings": { "number_of_shards":3, # 配置主分片 "number_of_replicas":0, # 配置副分片,单机请设置为0 "analysis": { "analyzer": { #配置分析器 "csh_analyzer": { #分析器的名字是csh_analyer,这个是系统没有的,我自己定义的一个,可以取一个不和已有的分析器重名的名字 "type": "standard", #这个分析器的类型是基于系统自带的标准的standard分析器 "stopwords": "_english_" #禁用词,或者说无效词范围定义来自_english_列表 } } } }, "mappings": { "user_table": { #定义test索引下的一个type为user_table,相当于msql表名 "properties": { #开始定义这个type的属性值(也可以用fields) "first_name": { #字段名为first_name "type": "string", #数据类型为string "index": "not_analyzed" #属性控制怎样索引字符结合属性analyzer,取值 analyzed(默认) not_analyzed no 参考:https://elasticsearch.cn/book/elasticsearch_definitive_guide_2.x/mapping-intro.html "analyzer": "standard" #分析器用系统默认的standard }, "last_name": { #字段名字为last_name "type": "string", #字段类型为string "analyzer": "csh_analyzer" #分析器为自定义的csh_analyzer }, "age": { #字段名字为age年龄 "type": "string", #字段类型 "analyzer": "csh_analyzer" #分析器为自定义的csh_analyzer } } } } }
https://elasticsearch.cn/book/elasticsearch_definitive_guide_2.x/_finding_your_feet.html
相关文章推荐
- 数据库的索引、视图、触发器、存储过程、游标等概念的理解
- 数据库的索引、视图、触发器、存储过程、游标等概念的理解
- 数据库的索引、视图、触发器、存储过程、游标等概念的理解
- ElasticSearch中,集群(Cluster),节点(Node),分片(Shard),Indices(索引),replicas(备份)之间的关系
- 数据库的索引、视图、触发器、存储过程、游标等概念的理解
- ElasticSearch:集群(Cluster),节点(Node),分片(Shard),Indices(索引),replicas(备份)之间关系
- cocos2dx主要概念及关系详解(个人理解总结)
- 索引,索引的优缺点,普通索引,唯一索引,主键索引,联合主键,复合主键---数据库中的几个概念的理解。
- ElasticSearch中Cluster,Node,Shard,Indices,replicas的基本概念与关系
- 数据库的几个概念:主键,外键,索引,唯一索引
- 理解超键、候选键、主键概念及关系
- 数据库中的关系、范式、索引
- FFMPEG理解一个偶然遇到了ffmpeg,看起来不多,而且通用性很强,算是一个扎实的技术。 研究了两天了,万事开头难啊。 主要是新手学习一个东西的时候,没有宏观的概念,如果猛地往某个细节去钻,往往碰
- 数据库系统概念(第六版)习题答案——第二章关系模型介绍
- 数据库系统概念(机械工业出版社,第六版)复习——第二章:关系模型简介
- liunx中(mysql 索引住主外键关系对数据库的操作深入学习)
- 看图理解Oracle实例与用户、数据库关系
- 关系数据库的基本概念
- 数据库中Schema(模式)概念的理解
- 关系数据库范式(1NF, 2NF, 3NF, BCNF)基本概念