简介
ES=elaticsearch简写, Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。 本质上是一个分布式nosql数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)。
概念介绍
关系数据库(mysql) ⇒ 数据库 ⇒ 表 ⇒ 行 ⇒ 列(Columns)
Elasticsearch ⇒ 索引 ⇒ 类型 ⇒ 文档 ⇒ 字段(Fields)
index: es里的index相当于一个数据库,每个 Index (即数据库)的名字必须是小写。
type: 相当于数据库里的一个表。
id: 唯一,相当于主键,PUT数据的时候需要指定id。
node:节点是es实例,一台机器可以运行多个实例,但是同一台机器上的实例在配置文件中要确保http和tcp端口不同。
cluster:代表一个集群,集群中有多个节点,其中有一个会被选为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。
shards:代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上,构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。
replicas:代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当个某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。
mapping : 在 Elasticsearch 中的作用就是约束,类似于mysql中的表的约束。
端口
ElasticSearch 客户端程序除了Java 使用TCP的方式连接ES集群以外,其他的语言基本上都是使用的Http的方式。众所周知,ES 客户端默认的TCP端口为9300,而HTTP默认端口为9200。elasticsearch-hadoop 使用的就是HTTP的方式连接的ES集群。
域数据类型:
mapping
Mapping)相当于数据表的表结构。ElasticSearch中的映射(Mapping)用来定义一个文档,可以定义所包含的字段以及字段的类型、分词器及属性等等,映射可以分为动态映射和静态映射。
(1)动态映射
我们知道,在关系数据库中,需要事先创建数据库,然后在该数据库实例下创建数据表,然后才能在该数据表中插入数据。而ElasticSearch中不需要事先定义映射(Mapping),文档写入ElasticSearch时,会根据文档字段自动识别类型,这种机制称之为动态映射。
(2)静态映射
当然,在ElasticSearch中也可以事先定义好映射,包含文档的各个字段及其类型等,这种方式称之为静态映射。
ES 6.3 mapping 参数说明
"type" : "text", #是数据类型一般文本使用text(可分词进行模糊查询);keyword无法被分词(不需要执行分词器),用于精确查找
"format" : "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" ,#格式化 此参数代表可接受的时间格式 3种都接受
"analyzer" : "ik_max_word", #指定分词器,一般使用最大分词:ik_max_word
"index" : true, #该字段是否会被索引和可查询 默认true 不分词是:not_analyzed ,设置成 no,字段将不会被索引
"store" : true, #默认情况false,其实并不是真没有存储,_source字段里会保存一份原始文档。
# 在某些情况下,store参数有意义,比如一个文档里面有title、date和超大的content字段,如果只想获取title和date
"boost" : 1.5, #字段权重;用于查询时评分,关键字段的权重就会高一些,默认都是1;另外查询时可临时指定权重
"normalizer" : "normalizer_name", #字段标准化规则;如把所有字符转为小写;具体如下举例
"coerce" : true, #清理脏数据:1,字符串会被强制转换为整数 2,浮点数被强制转换为整数;默认为true
更新mapping
es中创建后的mapping不可修改,但是可以添加新字段
添加新字段:
赋值:
pretty
在任意的查询字符串中增加pretty参数,会让Elasticsearch美化输出(pretty-print)JSON响应以便更加容易阅读。
_source字段不会被美化,它的样子与我们输入的一致。
ES数据结构
index定义字段的分析类型以及检索方式
- 如果是no,则无法通过检索查询到该字段;
- 如果设置为not_analyzed则会将整个字段存储为关键词,常用于汉字短语、邮箱等复杂的字符串;
- 如果设置为analyzed则将会通过默认的standard分析器进行分析
store定义了字段是否存储
在ES中原始的文本会存储在_source里面(除非你关闭了它)。默认情况下其他提取出来的字段都不是独立存储的,是从_source里面提取出来的。当然你也可以独立的存储某个字段,只要设置store:true即可。独立存储某个字段,在频繁使用某个特殊字段时很常用。而且获取独立存储的字段要比从_source中解析快得多,而且额外你还需要从_source中解析出来这个字段,尤其是_source特别大的时候。不过需要注意的是,独立存储的字段越多,那么索引就越大;索引越大,索引和检索的过程就会越慢....
string
字符串类型,es中最常用的类类型: 注意:5.X以上版本没有string类型了,换成了text
把string字段设置为了过时字段,引入text,keyword字段,这两个字段都可以存储字符串使用,但建立索引和搜索的时候是不太一样的
keyword:存储数据时候,不会分词建立索引
text:存储数据时候自动分词并生成索引(这是智能的,但在有些字段里面是没用的,所以对于有些字段使用text则浪费了空间)
store存储
true 独立存储 false(默认)不存储,从_source中解析
Numeric
数值类型,注意numeric并不是一个类型,它包括多种类型,比如:long,integer,short,byte,double,float,每种的存储空间都是不一样的,一般默认推荐integer和float。官方文档参考
重要的参数:
index分析 not_analyzed(默认) ,设置为该值可以保证该字段能通过检索查询到
store存储 true 独立存储 false(默认)不存储,从_source中解析
date
日期类型,该类型可以接受一些常见的日期表达方式,官方文档参考。
重要的参数:
index分析 not_analyzed(默认) ,设置为该值可以保证该字段能通过检索查询到
store存储 true 独立存储 false(默认)不存储,从_source中解析
format格式化
strict_date_optional_time||epoch_millis(默认)
你也可以自定义格式化内容,比如
"date": {
"type": "date",
"format": "yyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
boolean
布尔类型,所有的类型都可以标识布尔类型,参考官方文档
False: 表示该值的有:false, "false", "off", "no", "0", "" (empty string), 0, 0.0
True: 所有非False的都是true
重要的参数:
index分析 not_analyzed(默认) ,设置为该值可以保证该字段能通过检索查询到
store存储 true 独立存储 false(默认)不存储,从_source中解析
指令总结
我讲从索引(数据库)→类型(表)→文档(行)→属性(字段)一一介绍相关的指令
请求类型
Http请求内容:
PUT /customer?pretty
GET /_cat/indices?v
Curl命令
curl -XPUT ‘localhost:9200/customer?pretty&pretty’
curl -XGET ‘localhost:9200/_cat/indices?v&pretty’
POST和PUT的区别
POST不用加具体的id,它是作用在一个集合资源之上的(/uri),而PUT操作是作用在一个具体资源之上的(/uri/xxx)。
在ES中,如果不确定document的ID(documents具体含义见下),那么直接使用POST对应uri( “POST /website/blog” ),ES可以自己生成不会发生碰撞的UUID当做ID;如果确定document的ID,即自己设置的ID,使用PUT即可,比如 “PUT /website/blog/123”,那么执行创建或修改(修改时_version版本号提高1)
1.每个 Index 所包含的 Type
curl -H "Content-Type: application/json" 'localhost:9200/_mapping?pretty=true'
2.创建一个索引
curl -XPUT 'localhost:9200/sqlcommand?pretty'
或 5.5 以后尽量使用下面的方式
curl -XPUT -H 'Content-Type: application/json' 'localhost:9200/megacorp?pretty'(5.5以后版本)
返回信息 代表创建成功
3.显示所有索引
curl -XGET -H 'Content-Type: application/json' 'localhost:9200/_cat/indices?v'
4.删除索引
curl -XDELETE 'localhost:9200/sqlcommand?pretty'
5.在对应的索引中创建文档和type已经定义mapping
导入数据
注意:PUT一定要大写 -d之前,必需要空格
查看索引的type
curl -X GET 'localhost:9200/sql_command/_mapping'
6.检索文档
普通检索
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/1'
轻量检索
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_search'
检索部分内容
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/1?_source=first_name,last_name'
只得到源的内容
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/1?_source'
按条件搜索
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_search?q=last_name:Smith'
Q =表示匹配全部文档 * 排序=年龄表示按照年龄信息排序 ASC表示升序
可以不加参数,查询全部文档
curl -XGET 'localhost:9200/megacorp/_search?pretty'
使用检索表达式
复杂检索
批量检索(multi-get或者mget API)
mget API要求有一个docs数组作为参数,每个元素包含需要检索文档的元数据,包括_index,_type和_id。如果你想检索一个或者多个特定的字段,那么你可以通过_source参数来指定这些字段的名字:
如果想检索的数据都在相同的_index中(甚至相同的_type中),则可以在URL中指定默认的/ _index或者默认的
文档是否存在
curl -i -XHEAD -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/4'
删除文档
curl -XDELETE -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/4'
成功返回200,找不到是404,版本会加1(即使是虚假),_版本值仍然会增加。这是Elasticsearch内部记录本的一部分,用来确保这些改变在跨多节点时以正确的顺序执行)