ES (Elasticsearch)入门指南

版权声明:原创文章 欢迎参考 请勿抄袭 https://blog.csdn.net/aA518189/article/details/86064737

 

简介

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不可修改,但是可以添加新字段
添加新字段:

PUT /my_index/_mapping/my_type
{
  "properties": {
       "new_field_name": {
           "type":     "string"
       }
   }
}

赋值:

POST my_index/_update_by_query
{
  "script": {
    "lang": "painless",
    "inline": "ctx._source.new_field_name= '02'"
  }
}

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以后版本)

返回信息 代表创建成功

{
  "acknowledged" : true,
  "shards_acknowledged" : true
}

3.显示所有索引

curl -XGET -H 'Content-Type: application/json' 'localhost:9200/_cat/indices?v'

4.删除索引

curl -XDELETE 'localhost:9200/sqlcommand?pretty'

5.在对应的索引中创建文档和type已经定义mapping

curl -H "Content-Type: application/json" -PUT  "http://127.0.0.1:9200/sqltest/infotest/_mapping?pretty" -d ' 
{
    "infotest": { 
             "properties": {
                          "application_id": {
                    "type": "keyword"
                },
                           "session_id": {
                    "type": "keyword"
                },
                         "user_ip_address": {
                    "type": "keyword"
                },
                         "logger_type": {
                    "type": "keyword"
                },
                         "mryxblg_command_monitoring": {
                    "type": "keyword"
                }
              }
            }
    }'

导入数据

curl -H "Content-Type: application/json" -XPOST   'http://127.0.0.1:9200/productx/product/1' -d '
{
  "title": "物品",
  "description": "电脑",
  "price": 89.0
  "onSale": true
  "type": 2
  "createDate": 2018
}' 

注意: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'
{
  "took" : 5,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : null,
    "hits" : [
      {
        "_index" : "customer",
        "_type" : "external",
        "_id" : "1",
        "_score" : null,
        "_source" : {
          "name" : "Zhao1"
        },
        "sort" : [
          9223372036854775807
        ]
      }
    ]
  }
}

使用检索表达式

curl -XGET  -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_search?pretty' -d '
{
    "query" : {
        "match" : {
            "last_name" : "Smith"
        }
    }
}'

复杂检索

curl -XGET  -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_search?pretty' -d '
{
    "query" : {
        "bool": {
            "must": {
                "match" : {
                    "last_name" : "smith" 
                }
            },
            "filter": {
                "range" : {
                    "age" : { "gt" : 30 } 
                }
            }
        }
    }
}'

批量检索(multi-get或者mget API)

mget API要求有一个docs数组作为参数,每个元素包含需要检索文档的元数据,包括_index,_type和_id。如果你想检索一个或者多个特定的字段,那么你可以通过_source参数来指定这些字段的名字:

curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/_mget?pretty' -d '
{
   "docs" : [
      {
         "_index" : "megacorp",
         "_type" :  "employee",
         "_id" :    2
      },
      {
         "_index" : "megacorp",
         "_type" :  "employee",
         "_id" :    1
      }
   ]
}'

如果想检索的数据都在相同的_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内部记录本的一部分,用来确保这些改变在跨多节点时以正确的顺序执行)

删除全部文档

curl -XPOST -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_delete_by_query?conflicts=proceed' -d '
{
  "query": {
    "match_all": {}
  }
}'


 

猜你喜欢

转载自blog.csdn.net/aA518189/article/details/86064737