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
}

 

posted @ 2022-05-07 18:22  阿瞒123  阅读(203)  评论(0编辑  收藏  举报