欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

ElasticSearch基础和常用命令增删改查讲解

程序员文章站 2022-03-23 20:49:01
基础概念 集群和节点 索引:含有相同属性的文档集合,索引通过名字识别,小写英文字母命名,不能中划线数字等 类似 database 分片:每个索引都有多个分片,每个分片是一个Lucene...

基础概念

集群和节点

索引:含有相同属性的文档集合,索引通过名字识别,小写英文字母命名,不能中划线数字等

类似 database

分片:每个索引都有多个分片,每个分片是一个Lucene索引

好处:提高io读写效率

分片只能在创建索引的时候指定,后期不能修改

备份:拷贝一份分片就完成了分片的备份

好处:当主分片不可用,备份即可顶替

备份可以查询,可以分摊压力

备份可以动态修改

类型:索引可以定义一个或多个类型,文档必须属于一个类型

类似 table

文档:文档是可以被索引的基本数据单位

类似 一行记录

一、索引创建:

6.0 版本中,不支持多个type创建,mappings只能添加一个。

put 127.0.0.1:9200/people
{
    "settings":{
        "number_of_shards" : 3,
        "number_of_replicas" : 1
    },
    "mappings":{
        "doc":{
            "properties":{
                "type":{
                    "type":"keyword"
                },
                "name":{
                    "type":"text"
                },
                "country":{
                    "type":"keyword"
                },
                "age":{
                    "type":"integer"
                },
                "date":{
                    "type":"date",
                    "format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
                }
            }
        }
    }
}

二、数据插入:

由于mappings只能添加一个,如何插入多个type呢? 答案是通过type字段进行标识!

put people/doc/1
{
    "type":"man",
    "name":"wxk",
    "country":"china",
    "date":"1990-02-19",
    "age":21
}
put people/doc/2
{
    "type":"woman",
    "name":"qsy",
    "country":"UK",
    "date":"1990-02-12"
}

自动产生文档id插入

post people/doc/
{
    "type":"man",
    "name":"superwxk",
    "country":"china",
    "date":"2000-02-19 01:01:01"
}

检查:

POST people/_search
{
  "query": {
    "bool": {
      "must": {
        "match": {
          "name": "wxk"
        }
      },
      "filter": {
        "match": {
          "type": "man" 
        }
      }
    }
  }
}

三、修改文档

直接修改

post 127.0.0.1:9200/people/doc/1/_update
{
    "doc":{ 
        "age":31
    }
}

通过脚本修改文档

#直接写入参数
post 127.0.0.1:9200/people/doc/1/_update
{
    "script":{
        "lang":"painless",
        #ctx 代表es上下文,_source代表当前文档
        "inline":"ctx._source.age += 10"
    }
}

#使用参数
post 127.0.0.1:9200/people/doc/1/_update
{
    "script":{
        "lang":"painless",
        #ctx 代表es上下文,_source代表当前文档
        "inline":"ctx._source.age = params.age",
        "params":{
            "age":100
        }
    }
}

四、删除文档/索引

删除文档

DELETE 127.0.0.1:9200/people/doc/1

删除索引

删除索引,索引的文档都会删掉

1、header插件可以直接删除
2、DELETE 127.0.0.1:9200/people 

五、查询

定义book
novel:
    word_count:integer
    author:keyword
    title: text
    publish_date: 三种
插入数据1,2,3,4,5,6,7

造数据:

#建索引
put 127.0.0.1:9200/book
{
    "settings":{
        "number_of_shards" : 2,
        "number_of_replicas" : 1
    },
    "mappings":{
        "novel":{
            "properties":{
                "word_count":{
                    "type":"integer"
                },
                "author":{
                    "type":"keyword"
                },
                "title":{
                    "type":"text"
                },
                "publish_date":{
                    "type":"date",
                    "format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
                }
            }
        }
    }
}
#插数据
put book/novel/1
{
    "word_count":"1000",
    "author":"wxk",
    "title":"ElasticSearch",
    "publish_date":"1990-02-19"
}
put book/novel/2
{
    "word_count":"2000",
    "author":"qsy",
    "title":"learn_学习",
    "publish_date":"1990-03-19"
}
put book/novel/3
{
    "word_count":"1000",
    "author":"panda",
    "title":"mooc",
    "publish_date":"1990-04-19"
}
put book/novel/4
{
    "word_count":"1500",
    "author":"wxk",
    "title":"ES",
    "publish_date":"1991-10-19"
}
put book/novel/5
{
    "word_count":"3000",
    "author":"wxk",
    "title":"ElasticSearch 学习",
    "publish_date":"1990-02-19"
}
put book/novel/6
{
    "word_count":"2000",
    "author":"wxk",
    "title":"python",
    "publish_date":"2000-05-01"
}
put book/novel/7
{
    "word_count":"4000",
    "author":"wxk",
    "title":"Scala和spark",
    "publish_date":"1990-06-20"
}

简单查询

GET 127.0.0.1:/book/novel/1

复杂查询

POST 127.0.0.1:/book/_search
查询所有数据
{
    "query":{
        "match_all":{}
    },
    "from":1, #指定从哪里返回
    "size":1  #指定返回几条数据
}

关键字查询,条件查询

#查询标题为 ElasticSearch ,按照出版时间倒序,字数升序查询
{
    "query":{
        "match":{
            "title":"ElasticSearch"
        }
    },
    "sort":[
        {"publish_date":{"order":"desc"}},{"word_count":{"order":"asc"}}
    ]
}
解果是默认_score 倒序,
可以通过添加"sort"关键字,对字段进行升降排序

聚合查询

#字数进行聚合,解果为字数1000的5本书
#单个分组聚合
{
    "aggs":{
        "group_by_word_count":{ #这个名字自取的
            "terms":{
                "field":"word_count"
            }
        }
    }
}

#多个分组聚合
{
    "aggs":{
        "group_by_word_count":{ #这个名字自取的
            "terms":{
                "field":"word_count"
            }
        },
        "group_by_publish_date":{
            "terms":{
                "field":"publish_date"
            }
        }
    }
}

#其他聚合函数,对某个字段进行解析计算
#注意,这里stats 只能对 data,integer进行操作,否则会报错
{
    "aggs":{
        "grades_word_count":{ #自定义
            "stats":{ #这里填写函数名:
                    如:min
                "field":"word_count"
            }
        }
    }
}

结果为:

"aggregations": {
    "grades_word_count": {
        "count": 7,
        "min": 1000,
        "max": 4000,
        "avg": 2071.4285714285716,
        "sum": 14500
    }
}

高级查询将在下篇记录