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
}

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号