zoukankan      html  css  js  c++  java
  • es实战一:基本概念

    基本概念

    可以对照数关系型据库来理解Elasticsearch的有关概念。

    Relational DB Elasticsearch
    Databases Indices
    Tables Types
    Rows Documents
    Columns Fields

    在ES中,存储结构主要有四种,与传统的关系型数据库对比如下:

    • index(Indices)相当于一个database
    • type相当于一个table
    • document相当于一个row
    • properties(Fields)相当于一个column

    关于type

    6.*版本中type已过时,并且当前版本只能建一个type

    7.*版本将删除type,所以在开发过程中弱化type的概念

    索引的CRUD

    创建索引

    索引创建包括2个部分:

    1. mappings定义field字段的名称和类型。
    2. settings定义索引的分片和副本数量。

    Mappings

    https://www.elastic.co/guide/cn/elasticsearch/guide/current/mapping-intro.html

    没有设置mapping, 则默认为文本,对其进行分词,

    Mapping,就是对索引库中索引的字段名称及其数据类型进行定义,类似于mysql中的表结构信息。不过es的mapping比数据库灵活很多,它可以动态识别字段。一般不需要指定mapping都可以,因为es会自动根据数据格式识别它的类型,如果你需要对某些字段添加特殊属性(如:定义使用其它分词器、是否分词、是否存储等),就必须手动添加mapping。

    mappings映射示例如下:

    {
      "mappings": {
        "radware": {
          "properties": {
            "sourceIp": {
              "type": "ip"
            },
            "destinationIp": {
              "type": "ip"
            },
            "natIp": {
              "type": "ip"
            },
            "deviceIp": {
              "type": "ip"
            },
            "interfaceIp": {
              "type": "ip"
            },
            "receiveTime": {
              "type": "date",
              "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
            },
            "startTime": {
              "type": "date",
              "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
            },
            "endTime": {
              "type": "date",
              "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
            },
            "sourcePort": {
              "type": "keyword"
            },
            "destinationPort": {
              "type": "keyword"
            }
          }
        }
      }
    }
    

    自动检测及动态映射Dynamic Mapping

    动态映射编辑

    当 Elasticsearch 遇到文档中以前 未遇到的字段,它用 dynamic mapping 来确定字段的数据类型并自动把新的字段添加到类型映射。

    有时这是想要的行为有时又不希望这样。通常没有人知道以后会有什么新字段加到文档,但是又希望这些字段被自动的索引。也许你只想忽略它们。如果Elasticsearch是作为重要的数据存储,可能就会期望遇到新字段就会抛出异常,这样能及时发现问题。

    幸运的是可以用 dynamic 配置来控制这种行为 ,可接受的选项如下:

    true

    动态添加新的字段--缺省

    false

    忽略新的字段

    strict

    如果遇到新字段抛出异常

    此外还可以自定义动态映射,定义动态模板

    Settings

    settings是修改分片和副本数的。

    settings修改索引库默认配置

      例如:分片数量,副本数量

      查看:curl -XGET http://192.168.80.10:9200/zhouls/_settings?pretty

      操作不存在索引:

    curl -XPUT '192.168.80.10:9200/liuch/' -d
    '{"settings":{"number_of_shards":3,"number_of_replicas":0}}'
    

      操作已存在索引:

    curl -XPUT '192.168.80.10:9200/zhouls/_settings' -d
    '{"index":{"number_of_replicas":1}}'
    

    总结:就是,不存在索引时,可以指定副本和分片,如果已经存在,则只能修改副本。

      在创建新的索引库时,可以指定索引分片的副本数。默认是1,这个很简单

    关于分片和副本,后续将展开讲。es默认分片为5,副本为1。分片如果插入数据后,分片不能修改,副本数量可以修改。

    关于Fields, 插入数据后,原有Fields不能修改,但可以新增Fields。

    插入数据

    curl -XPOST 'localhost:9200/customer/external?pretty' -d' {"name": "Jane Doe" }'
    

    删除索引

    DELETE xz-logs-10
    

    更新索引

    ES同样支持更新,但是更新的方式是通过一个提供的脚本进行的。ES的做法是,通过index找到相应的存放记录的节点,然后执行脚本,执行完之后,返回新的索引。实际上执行的是一个get和reindex的过程

    get,reindex的含义是,ES先取出这条记录,然后根据新数据生成新记录,然后在把新记录放回到ES中(并不会覆盖老的记录)。

    Documents in Elasticsearch are immutable; we cannot change them. Instead, if we need to update an existing document, we reindex or replace it.

    PUT /website/blog/123
    {
      "title": "My first blog entry",
      "text":  "I am starting to get the hang of this...",
      "date":  "2014/01/02"
    }
    
    
    {
      "_index" :   "website",
      "_type" :    "blog",
      "_id" :      "123",
      "_version" : 2,
      "created":   false 
    }
    
    • 对于海量增长的数据,数据只要求保存有限的时间,es推荐按日期建索引,如果某段时间数据不需要保存,则删除对应时间的索引。以前的timestamp+ttl的方式已经不推荐了。

    查询索引

    GET /megacorp/employee/1
    
    GET /megacorp/employee/_search?q=last_name:Smith
    
    GET /megacorp/employee/_search
    {
        "query" : {
            "match" : {
                "last_name" : "Smith"
            }
        }
    }
    

    多索引查询

    /_search
    在所有的索引中搜索所有的类型

    /gb/_search
    在 gb 索引中搜索所有的类型

    /gb,us/_search
    在 gb 和 us 索引中搜索所有的文档

    /g,u/_search
    在任何以 g 或者 u 开头的索引中搜索所有的类型

    /gb/user/_search
    在 gb 索引中搜索 user 类型

    /gb,us/user,tweet/_search
    在 gb 和 us 索引中搜索 user 和 tweet 类型

    /_all/user,tweet/_search
    在所有的索引中搜索 user 和 tweet 类型

    Filed类型

    往es写入时,有默认类型。在不同的应用场景,需显示定义类型,具体类型如下图所示:
    iamge

    Text vs. keyword

    ElasticSearch数据类型--string类型已死, 字符串数据永生

    ElasticSearch对字符串拥有两种完全不同的搜索方式. 你可以按照整个文本进行匹配, 即关键词搜索(keyword search), 也可以按单个字符匹配, 即全文搜索(full-text search). 对ElasticSearch稍有了解的人都知道, 前者的字符串被称为not-analyzed字符, 而后者被称作analyzed字符串.

    text用于全文搜索的, 而keyword用于关键词搜索.

    如果想做类似于sql中的like查询,可定义为keyword并使用通配符wildcard方式查询。

    字符串将默认被同时映射成text和keyword类型

    {
        "foo": {
            "type": "text",
            "fields": {
                "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                }
            }
        }
    }
    
    

    基于这个映射你即可以在foo字段上进行全文搜索, 也可以通过foo.keyword字段实现关键词搜索及数据聚合.

    禁用这个特性也很方便: 你只需要在定义mapping时显式声明字符串字段的类型或者使用一个动态模板(dynamic template)来匹配你所有的字符串字段即可. 例如通过下面的dynamic template就可以恢复到在ElasticSearch 2.x中使用的dynamic template的效果:

    {
    "match_mapping_type": "string",
    "mapping": {
    "type": "text"
    }
    }

    date

    将字段定义为date类型,可自定义时间格式,此字段可按时间范围进行查询。

    插件使用

    kibana console

    kibana的console,是验证restapi唯一选择。不推荐使用head插件的复合查询,因为其查询有误,但是head插件的其他功能还是可以使用。

    elasticsearch-head

    head插件提供如下功能:

    1. 集群状态:包括index占用空间/分片的状态
    2. 显示index中的数据
    3. 基本查询
    4. 复合查询(强烈不推荐使用)

    参考文献

  • 相关阅读:
    农场灌溉问题(回溯)
    六数码问题(广搜_队列)
    求图像周长(回溯)
    六数码问题(回溯)
    花生米(四)
    活动安排(贪心算法)
    自我介绍
    三位老师
    培训期间
    工作十个月感触
  • 原文地址:https://www.cnblogs.com/small-k/p/8516629.html
Copyright © 2011-2022 走看看