ES基础笔记

127 阅读4分钟

ES

一、简介

1、Elastic Stack

ES技术栈:

  • ElasticSearch:存数据+搜索;QL;
  • Kibana:Web可视化平台,分析。
  • LogStash:日志收集,Log4j:产生日志;log.info(xxx)
  • 。。。。

image-20220930095909877

使用场景:

  • metrics:指标监控
  • ....

2、基本概念

  • Index(索引)

    • 动词:保存(插入)
    • 名词:类似MySQL数据库,给数据
  • Type(类型)

    • 已废弃,以前类似MySQL的表
    • 现在用索引对数据分类
  • Document(文档)

    • 真正要保存的一个JSON数据

    • {
          name:"tcx"
      }
      

二、入门实战

{
  "name" : "DESKTOP-1TSVGKG",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "PFpgHGhaTZiajHD4xvRPkg",
  "version" : {
    "number" : "7.14.0",
    "build_flavor" : "default",
    "build_type" : "zip",
    "build_hash" : "dd5a0a2acaa2045ff9624f3729fc8a6f40835aa1",
    "build_date" : "2021-07-29T20:49:32.864135063Z",
    "build_snapshot" : false,
    "lucene_version" : "8.9.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

1、索引CRUD

1.创建索引

put http://localhost:9200/person

{
    "acknowledged": true, #响应结果
    "shards_acknowledged": true,  #分片
    "index": "person"   #索引名称
}

2.删除索引

delete http://localhost:9200/person

{
    "acknowledged": true
}

3.修改索引

# 在修改时,需要先删掉索引
put http://localhost:9200/person

{
    "settings": {
        "index": {
            "number_of_shards":"3"
        }
    }
}

4.查询索引

get http://localhost:9200/person

{
    "person": {
        "aliases": {},
        "mappings": {},
        "settings": {
            "index": {
                "routing": {
                    "allocation": {
                        "include": {
                            "_tier_preference": "data_content"
                        }
                    }
                },
                "number_of_shards": "3",
                "provided_name": "person",
                "creation_date": "1664357188860",
                "number_of_replicas": "1",
                "uuid": "GOyDifOJTQi8yBzKHk5zNQ",
                "version": {
                    "created": "7140099"
                }
            }
        }
    }
}

2、文档CRUD

1、保存-POST(非幂等性)

POST /person/_doc
{
  "id":"1",
  "name":"田",
  "age":"19"
}

# 结果
{
  "_index" : "person", //保存到的索引
  "_type" : "_doc", //
  "_id" : "BcKKg4MBcNCrjSmlWbAK",  //刚才那条数据的唯一id
  "_version" : 1,  //版本号
  "result" : "created", //创建了数据
  "_shards" : {  //分片工作
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,  //乐观锁机制
  "_primary_term" : 1  //乐观锁机制
}

以上是:非幂等操作

  • 幂等:同一个操作执行无数遍的结果都是一样的
    • select
    • insert: 幂等
  • 非幂等:
    • insert: 自增主键就是非幂等

2、保存-PUT(幂等性)

保存更新 二合一

PUT /person/_doc/1
{
  "id":"1",
  "name":"田",
  "age":"19"
}


PUT /person/_doc/1
{
  "id":"1",
  "name":"田",
  "age":"19",
  "note":"做个小笔记"
}

# 也可以任意扩展/缩减字段;(会覆盖)

3、POST-增量字段更新

POST person/_doc/1/_update
{
  "doc":{
    "name":"张三"
  }
}

4、查询

# 查看所有
GET /person/_search

# 根据ID查询
GET /person/_doc/ID号

5、乐观锁

CAS

三、进阶检索

#  DSL 查询条件以Json
POST person/_search
{
  "query": {
    "match_all": {}
  }
}

1、导入基本数据


POST /student/_doc/1001
{
  "name":"李白",
  "age":"18"
}

POST /student/_doc/1002
{
  "name":"诗仙",
  "age":"19"
}

POST /student/_doc/1003
{
  "name":"杜甫",
  "age":"20"
}



POST /student/_doc/1004
{
  "name":"诗圣",
  "age":"21"
}

POST /student/_doc/1005
{
  "name":"诗圣 厉害",
  "age":"21"
}

2、查询所有文档

POST /student/_search
{
  "query": {
    "match_all": {}
  }  
}


POST /student/_search
{
  "query": {
    "match_all": {}
  }  
}


{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 4,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "student",
        "_type" : "_doc",
        "_id" : "1001",
        "_score" : 1.0,
        "_source" : {
          "name" : "李白",
          "age" : "18"
        }
      },
      {
        "_index" : "student",
        "_type" : "_doc",
        "_id" : "1002",
        "_score" : 1.0,
        "_source" : {
          "name" : "诗仙",
          "age" : "19"
        }
      },
      {
        "_index" : "student",
        "_type" : "_doc",
        "_id" : "1003",
        "_score" : 1.0,
        "_source" : {
          "name" : "杜甫",
          "age" : "20"
        }
      },
      {
        "_index" : "student",
        "_type" : "_doc",
        "_id" : "1004",
        "_score" : 1.0,
        "_source" : {
          "name" : "诗圣",
          "age" : "21"
        }
      }
    ]
  }
}

3、match-全文索引精确查询

POST /student/_search
{
  "query": {
    "match": {
      "name.keyword": "诗圣"
    }
  }
}

multi_match-多个字段查询

POST /student/_search
{
  "query": {
    "multi_match": {
      "query": "诗圣",
      "fields": ["name"]
    }
  }
}

4、term-精确查询

POST /student/_search
{
  "query": {
    "term": {
      "name": {
        "value": "shixian"
      }
    }
  }
}

5、terms-查询

# 查询age是2018的
POST /student/_search
{
  "query": {
    "terms": {
      "age": [
        "20",
        "18"
      ]
    }
  }
}

6、多个字段查询

7、查询部分字段

POST /student/_search
{
  "query": {
    "match": {
      "name": "诗圣"
    }
  },
  "_source": ["name"]  
}

8、区间查询

POST /student/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 18,
        "lte": 20
      }
    }
  }
}

9、复合查询

# must 

POST /student/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "age": {
              "gte": 18,
              "lte": 20
            }
          }
        },{
          "match": {
            "name": "诗圣"
          }
        }
      ]
    }
  }
}

must和filter执行的结果是一样的,但是must会有分数,filter没有分数

10、过滤查询


POST /student/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "age": {
              "gte": 18,
              "lte": 20
            }
          }
        },{
          "match": {
            "name": "诗圣"
          }
        }
      ]
    }
  }
}

  • 模糊匹配用match
  • 精确查询用term
  • 多条件组合是bool
  • must,filter相配合
  • should非强制要求

11、判断文档是否存在

#判断文档是否存在
HEAD /student/_doc/1001

12、exists查询


POST /student/_search
{
  "query": {
    "exists": {
      "field": "hello"
    }
  }
}

# 找到有hello属性的文档
{
  "took" : 739,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "student",
        "_type" : "_doc",
        "_id" : "1006",
        "_score" : 1.0,
        "_source" : {
          "name" : "白居易",
          "hello" : "word"
        }
      }
    ]
  }
}

13、批量


#批量查询ID

POST student/_doc/_mget
{
  "ids":["1001","1002"]
}


image-20221008112207118

image-20221008112346329

四、其他功能

1、排序

POST student/_search
{
  "query": {
    "match_all": {
      
    }
  },
  "sort": [
    {
      "age": {
        "order": "asc"
      }
    }
  ]
}

2、高亮

#高亮
GET student/_search
{
  "query": {
    "match": {
      "age": "21"
    }
  },
 "highlight": {
    "fields": {
      "age": {
        "pre_tags": "<span style='color:res'>",
        "post_tags": "</span>"
      }
    }
  }
}

3、_source-部分字段

POST /student/_search
{
  "query": {
    "match": {
      "name": "诗圣"
    }
  },
  "_source": ["name"]  
}

4、分页

#分页

POST student/_search
{
  "query": {
    "match_all": {
    
    }
  },
  "from": 0,
  "size": 2
}

聚合

image-20221008115217531

谢谢你的阅读,由于作者水平有限,难免有不足之处,若读者发现问题,还请批评,在留言区留言或者私信告知,我一定会尽快修改的。若各位大佬有什么好的解法,或者有意义的解法都可以在评论区展示额,万分谢谢。 写作不易,望各位老板点点赞,加个关注!