• ElasticSearch学习七 ES简单操作


    7.1、Restful

    rest是Representational State Transfer三个单词的缩写,表现层状态转移,或者表述性状态转移。

    Rest是web服务的一种架构风格,一种设计风格,是一种思想;同时Rest不是针对某一种编程语言的。

    以webService为例通俗解释。

    非Rest设计,以往我们都会这么写:

    http://localhost:8080/admin/getUser (查询用户)
    http://localhost:8080/admin/addUser (新增用户)
    http://localhost:8080/admin/updateUser (更新用户)
    http://localhost:8080/admin/deleteUser (删除用户)

    以不同的URL(主要为使用动词)进行不同的操作。

     

    Rest架构:

    GET http://localhost:8080/admin/user (查询用户)
    POST http://localhost:8080/admin/user (新增用户)
    PUT http://localhost:8080/admin/user (更新用户)
    DELETE http://localhost:8080/admin/user (删除用户)

    URL只指定资源,以HTTP方法动词进行不同的操作。用HTTP STATUS/CODE定义操作结果。

    7.2、操作索引

    操作语法

    PUT|GET|POST|DELETE http://ip:port/索引名称

    以"_"开头的表示内置的一些命令或者内置的一些属性,例如每个索引都有mappings、settings等,可以采用以下的语法访问内置的属性。

    例如:http://ip:port/索引名称/_mappings ,表示查询某个索引下的mappings属性的值。

    http://ip:port/_all ,表示查询所有的索引

    添加索引

    PUT http://ip:port/索引名称

    添加所以在ES中是Put请求,并非Post请求。下面是添加索引的操作

    查询索引

    GET http://ip:port/索引名称

    在ES的操作中,GET请求是查询索引,用GET请求查询刚才创建的索引

    GET http://192.168.2.135:9200/goods_index

    返回结果

    {
        "goods_index": {
            "aliases": {},
            "mappings": {},
            "settings": {
                "index": {
                    "creation_date": "1651392797166",
                    "number_of_shards": "1",
                    "number_of_replicas": "1",
                    "uuid": "qPbYkcIGTyKsFi0dI0JLEg",
                    "version": {
                        "created": "7040299"
                    },
                    "provided_name": "goods_index"
                }
            }
        }
    }

    删除索引

    DELETE http://ip:port/索引名称

    在ES的操作中,DELETE是删除索引

    DELETE http://192.168.2.135:9200/goods_index

    {
        "acknowledged": true
    }

    关闭索引

    POST http://ip:port/索引名称/_close

    在ES的操作中,POST请求是修改,关闭索引其实是修改索引,用POST请求。

    POST http://192.168.2.135:9200/goods_index/_close

    返回结果

    {
        "acknowledged": true,
        "shards_acknowledged": true,
        "indices": {
            "goods_index": {
                "closed": true
            }
        }
    }

     

    注意:在ES中,以"_"为开头的命令都是ES内置的命令,例如_close、_open、_all

     

    打开索引

    POST http://ip:port/索引名称/_open

    在ES的操作中,POST请求是修改,关闭索引其实是修改索引,用POST请求。

    POST http://192.168.2.135:9200/goods_index/_open

    返回结果

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

     

    7.3、映射Mappings

    ES的mapping非常类似于静态语言中的数据类型:声明一个变量为int类型的变量, 以后这个变量都只能存储int类型的数据。

    同样的, 一个number类型的mapping字段只能存储number类型的数据。

    同静态语言的数据类型相比,mapping还有一些其他的含义,mapping不仅告诉ES一个field中是什么类型的值, 它还告诉ES如何索引数据以及数据是否能被搜索到。

    mapping中字段类型一旦设定后 禁止直接修改。因为lucene实现的倒排索引生成后不允许修改。除非重建索引映射,然后做reindex操作。

    mapping字段类型

    Field datatypes 字段的数据类型

    • 核心数据类型

      • 字符串类型: text(分词),keyword(不分词)一个用于全文检索,一个用于聚合和排序。

      • 数值型: long,integer,short,byte,double,float,half_float,scaled_float

      • 日期:date

      • 布尔:boolean

      • 二进制:binary

      • 范围类型:integer_range,float_range,long_range,double_range,date_range

    • 复杂数据类型

      • 数组 array

      • 嵌套类型 nested object

      • PUT test_index
        {
          "mappings": {
            "doc": {
              "properties": {
                "man":{            #设置man字段为nested类型
                  "type": "nested",  
                  "properties": {
                    "age":{
                      "type":"integer"
                     },
                    "name":{
                      "type":"text"
                    }
                  }}}}}}}
        PUT test_index/doc/1
        {
          "man":[
            {
              "name":"alice white",
              "age":34
            },
            {
              "name":"peter brown",
              "age":26
            }
            ]
        }
        # 嵌套类型的字段的查询和聚合:
        GET test_index/_search
        {
          "query": {       #查询
            "nested": {         #关键字
              "path": "man", 
              "query": {
                "match": {
                  "man.name": "peter"  
                }
              }
            }
          },
          "size": 0, 
          "aggs": {
            "man": {   
              "nested": {    #聚合关键字
                "path": "man"
              },
              "aggs": {
                "avg_age": {
                  "avg": {
                    "field": "man.age"
                  }
                }
              }}}}

         

      • 对象 object

      • PUT test_index
        {
          "mappings": {
            "doc": {
              "properties": {
                "obj":{              #obect类型字段
                  "properties": {
                    "age":{
                      "type":"integer"
                     },
                    "name":{
                      "type":"text"
                    }
                  }
                }
              }
            }
          }
        }
        PUT test_index/doc/1
        {
          "obj":[
            {
              "name":"alice white",
              "age":34
            },
            {
              "name":"peter brown",
              "age":26
            }
            ]
        }
        GET test_index/_search
        {
          "query": {
            "match": {
              "obj.name": "peter"
              }
          }
        }
        ​

     

    • 地理类型

      • geo_point

      • geo_shape

    • 专用类型

      • 记录ip地址 ip

      • 实现自动补全 completion

      • 记录分词数 token_count

      • 记录字符串hash值 murmur3

      • percolator

      • join

    mapping参数

    • dynamic 参数动态添加新字段

      • -true 允许自动将检测到的新字段加到映射中(默认的)

      • -false 不允许自动新增字段,文档可以写入,但无法对字段进行搜索等操作。不会添加在映射中。且在kibana上面看到的新字段上会显示一个黄色感叹号,刷新index pattern也无效。

      • -strict 文档不能写入,写入会报错

    • analyzer 指定分词器

    • ignore_above 超过ignore_above的字符串将不会被索引或存储

    PUT test_index
    {
      "mappings": {
        "doc":{
          "properties": {
            "message":{
              "type": "keyword",
              "ignore_above": 20  #字段值超过20个字符的字符串不会被索引或者存储
            }
          }
        }
      }
    }
    POST test_index/doc/_bulk
    {"index":{"_id":1}}
    {"message":"test message"}
    {"index":{"_id":2}}
    {"message":"test message  with some long stacktrace messages test test"}
    ​
    GET test_index/_search
    {
      "size": 0, 
      "aggs": {
        "message": {
          "terms": {
            "field": "message",
            "size": 10
          }
        }
      }
    }----------------------->只能得到第一个桶
          "buckets": [
            {
              "key": "test message",
              "doc_count": 1
            }
          ]
    ​
    GET test_index/_search    
    {
      "query": {
        "query_string": {
          "default_field": "message",
          "query": "*message*"
        }
      }
    }
    ------------->只能搜索到id为1的文档
      "hits": {
        "total": 1,
        "max_score": 1,
        "hits": [
          {
            "_index": "test_index",
            "_type": "doc",
            "_id": "1",
            "_score": 1,
            "_source": {
              "message": "test message"
            }
          }
        ]
    • index true | false 控制字段是否被索引,默认为true。

    • doc_values 本质是一个序列化的列式存储 。列式存储适用于聚合,排序,脚本操作。

      • true 默认对除了analyzed strings以外的所有字段开启。

      • false 不能用于聚合、排序和脚本操作

    • fields 对同一字段采用不同类型配置。比如string字段映射为text做全文搜索,映射为keyword做聚合和排序

    PUT test_index
    {
      "mappings": {
        "doc":{
          "properties": {
            "name":{
              "type": "text",     #text类型,用于全文检索
              "fields": {
                "keyword":{    #name.keyword
                  "type": "keyword"   #keyword类型,用于排序和聚合
                }
              }
            }
          }
        }
      }
    }
    PUT test_index/doc/1
    {
      "name":"Jack smis"
    }
    PUT test_index/doc/2
    {
      "name":"Jack"
    }
    GET test_index/_search
    {
      "query": {
        "match": {
          "name": "jack"      #text类型字段
        }
      },
      "sort": [
        {
          "name.keyword": {    #keyword类型字段
            "order": "desc"
          }
        }
      ],
      "aggs": {
        "name_count": {
          "value_count": {
            "field": "name.keyword"   #keyword类型字段
          }
        }
      }
    }
    • properties object字段或nested字段包含子字段,称为properties。properties可以是任何数据类型

    • PUT test_index
      {
        "mappings": {
          "doc": {
            "properties": {
              "dev":{                #object类型字段
                "properties": {
                  "name":{
                    "type":"text"
                  },
                  "age":{
                    "type":"integer"
                  }
                }
              },
              "rel":{
                "type": "nested",    #nested类型字段
                "properties": {
                  "age":{
                    "type":"integer"
                  },
                  "name":{
                    "type":"text"
                  }
                }
              }
            }
          }
        }
      }
      PUT test_index/doc/1
      {
        "dev":{
          "name":"john smith",
          "age":23
        },
        "rel":[
          {
            "name":"alice white",
            "age":34
          },
          {
            "name":"peter brown",
            "age":26
          }
          ]
      }
    • norms 时间评分因子,如果不关心评分可以禁用

    mapping操作

    映射创建完成之后,ES是不允许直接修改字段名字或者删除映射。因为后面需要对字段进行检索或者查询。

    操作语法

    PUT|GET http://ip:port/索引/_mapping

    添加映射

    创建完索引之后添加映射

    PUT http://192.168.2.128:9200/person/_mappings  
    {
      "properties": {
        "name": {
          "type": "keyword"
        },
        "age": {
          "type": "integer"
        }
      }
    }

    创建索引时添加映射

    PUT http://192.168.2.128:9200/person
    {
        "mappings":{
            "properties":{
                "name":{
                    "type":"keyword"
                },
                "age":{
                    "type":"integer"
                }
            }
        }
    }

     

    查询映射

    PUT http://192.168.2.128:9200/person/_mapping
    ​
    //返回的结果如下
    ​
    {
        "person": {
            "aliases": {},
            // 下面的mappings就是添加的索引
            "mappings": {
                "properties": {
                    "age": {
                        "type": "integer"
                    },
                    "name": {
                        "type": "keyword"
                    }
                }
            },
            "settings": {
                "index": {
                    "creation_date": "1651547517051",
                    "number_of_shards": "1",
                    "number_of_replicas": "1",
                    "uuid": "t979BGXtS52FtEi7rGy7jg",
                    "version": {
                        "created": "7040299"
                    },
                    "provided_name": "person"
                }
            }
        }
    }

     

    添加字段

    为已经存在的索引添加字段

    put http://192.168.2.135:9200/person/_mappings
    {
        "properties":{
               "address":{
                   "type":"text"
               }
            }
    }

    7.4、操作文档

    添加文档

    语法

    从es7之后,就没有类型了,所有的类型都是默认为_doc

    put|post http://ip:port/索引名称/_doc/id

    指定id

    指定id可以用put请求,也可以用post请求

    put http://192.168.2.135:9200/person/_doc/1
    {
        "name":"张三",
        "age":20,
        "address":"杭州市萧山区"
    }
    ​
    // 运行结果
    {
        "_index": "person",
        "_type": "_doc",
        "_id": "1",
        "_version": 1,
        "result": "created",
        "_shards": {
            "total": 2,
            "successful": 2,
            "failed": 0
        },
        "_seq_no": 0,
        "_primary_term": 1
    }
    不指定id

    不指定id,只能用post请求

    post http://192.168.2.135:9200/person/_doc/
    {
        "name":"李四",
        "age":30,
        "address":"杭州市滨江区"
    }
    ​
    // 运行结果
    {
        "_index": "person",
        "_type": "_doc",
        "_id": "ijEGiIABZy4G6iwbrBf2", //此是id是随机生成
        "_version": 1,
        "result": "created",
        "_shards": {
            "total": 2,
            "successful": 2,
            "failed": 0
        },
        "_seq_no": 1,
        "_primary_term": 1
    }

     

    查询文档

    指定Id的方式查询文档

    get http://192.168.2.135:9200/person/_doc/1
    ​
    //运行结果
    {
        "_index": "person",
        "_type": "_doc",
        "_id": "1",
        "_version": 1,
        "_seq_no": 0,
        "_primary_term": 1,
        "found": true,
        "_source": {
            "name": "张三",
            "age": 20,
            "address": "杭州市萧山区"
        }
    }

     

    查询所有的文档

    get http://192.168.2.135:9200/person/_search
    ​
    {
        "took": 65,
        "timed_out": false,
        "_shards": {
            "total": 1,
            "successful": 1,
            "skipped": 0,
            "failed": 0
        },
        "hits": {
            "total": {
                "value": 2,
                "relation": "eq"
            },
            "max_score": 1.0,
            "hits": [
                {
                    "_index": "person",
                    "_type": "_doc",
                    "_id": "1",
                    "_score": 1.0,
                    "_source": {
                        "name": "张三",
                        "age": 20,
                        "address": "杭州市萧山区"
                    }
                },
                {
                    "_index": "person",
                    "_type": "_doc",
                    "_id": "ijEGiIABZy4G6iwbrBf2",
                    "_score": 1.0,
                    "_source": {
                        "name": "李四",
                        "age": 30,
                        "address": "杭州市滨江区"
                    }
                }
            ]
        }
    }

     

    修改文档

    修改文档与添加文档一样,如果id存在就是修改,如果id不存在就是添加

    put http://192.168.2.135:9200/person/_doc/1
    {
        "name":"张三",
        "age":30,
        "address":"杭州市滨江区"
    }
    ​
    ​
    //运行结果
    {
        "_index": "person",
        "_type": "_doc",
        "_id": "1",
        "_version": 2,
        "result": "updated",//修改操作
        "_shards": {
            "total": 2,
            "successful": 2,
            "failed": 0
        },
        "_seq_no": 5,
        "_primary_term": 1
    }

     

    删除文档

    delete http://192.168.2.135:9200/person/_doc/1
    ​
    //运行结果
    {
        "_index": "person",
        "_type": "_doc",
        "_id": "1",
        "_version": 2,
        "result": "deleted",
        "_shards": {
            "total": 2,
            "successful": 2,
            "failed": 0
        },
        "_seq_no": 2,
        "_primary_term": 1
    }
  • 相关阅读:
    利用Event和MapFile进程共享信息
    基于不可靠数据报的文件传输
    Simple .NET code and memory profiler
    一步一步Asp.Net MVC系列_权限管理之权限控制
    新的起点,新的开始
    找工作的你需要了解和准备的东西
    我的大学读书生涯
    一步一步Asp.Net MVC系列_权限管理数据库与ViewModel篇
    一步一步asp.net_日志导航
    一步一步Asp.Net MVC系列_权限管理总结(附MVC权限管理系统源码)
  • 原文地址:https://www.cnblogs.com/cplinux/p/16243694.html
Copyright © 2020-2023  润新知