Elasticsearch基本使用

一、基本概念

1、全文检索

全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。

全文检索的方法主要分为按字检索和按词检索两种。

简单理解,全文检索是指:

  • 通过一个程序扫描文本中的每一个单词,针对单词建立索引,并保存该单词在文本中的位置、以及出现的次数
  • 用户查询时,通过之前建立好的索引来查询,将索引中单词对应的文本位置、出现的次数返回给用户,因为有了具体文本的位置,所以就可以将具体内容读取出来了。

2、正排索引和倒排索引

正排索引:通过主键定位到某条数据。

倒排索引:通过搜索关键词定位到主键,然后再通过主键获取完整数据。与正排索引刚好相反。

ES底层在检索时使用的就是倒排索引。

3、ElasticSearch基本概念

3.1 Index - 索引

ES中的索引并非传统索引的含义,ES中的索引是存放数据的地方,是 ES中的一个概念词汇。

一个索引(Index)就是一个拥有几分相似特征的文档的集合。

索引类似于我们 Mysql里面的一个数据库 ,好比是一个索引库。

3.1 Type - 类型

类型是用来定义数据结构的。

从 7.0版本开始,一个索引只能创建一个 type = “_doc”,好比数据库里面的一张表,描述每个字段的类型。

3.3 Document - 文档

Elasticsearch是面向文档的,文档是所有可搜索数据的最小单位。

文档会被序列化成JSON格式,保存在Elasticsearch中。

文档就是最终的数据了,可以认为一个文档好比关系型数据库中表里面的一条记录数据。

3.3.1 文档元数据
GET /db_idx2/_doc/2

#结果
{
  "_index" : "db_idx2",
  "_type" : "_doc",
  "_id" : "2",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "name" : "赵云2",
    "sex" : 1,
    "desc" : "打野位"
  }
}

元数据,用于标注文档的相关信息:

  • _index:文档所属的索引名
  • _type:文档所属的类型名
  • _id:文档唯—ld
  • _source:文档的原始 Json数据
  • _version:文档的版本号,修改删除操作_version都会自增1
  • _seq_no:和_version一样,一旦数据发生更改,数据也一直是累计的。
    Shard级别严格递增,保证后写入的 Doc的_seq_no大于先写入的 Doc的_seq_no。
  • _primary_term:主要是用来恢复数据时处理当多个文档的 _seq_no一样时的冲突,避免 Primary Shard上的写入被覆盖。每当 Primary Shard 发生重新分配时,比如:重启,Primary选举等,_primary_term会递增 1。

3.4 Field - 字段

一个 document有一个或者多个 field组成。

字段好比关系型数据库中列的概念。

3.5 shard - 分片

一台服务器,无法存储大量的数据,ES把一个 index里面的数据,分为多个 shard,分布式的存储在各个服务器上面。

3.6 replica - 副本

一个分布式的集群,难免会有一台或者多台服务器宕机,如果我们没有副本这个概念。就会造成我们的 shard发生故障,无法提供正常服务。
为了保证数据的安全,ES引入了 replica的概念,可以保证我们数据的安全。

在 ES集群中,我们一模一样的数据有多份,能正常提供查询和插入的分片我们叫做 primary shard(主分片),其余的我们就管他们叫做 replica shard(备份的分片) 。

  • 在默认情况下,我们创建一个索引库的时候,默认会帮我们创建 5个主分片(primary shrad)和 5个副分片(replica shard),所以说正常情况下是有 10个分片的。
  • 同一个节点上面,副本和主分片是一定不会在一台机器上面的,就是拥有相同数据的分片,是不会在同一个节点上面的。

所以当你有一个节点的时候,这个分片是不会把副本存在这仅有的一个节点上的,当你新加入了一台节点,ES会自动的给你在新机器上创建一个之前分片的副本。

二、基本操作

1、索引操作

1.1 创建索引

基本格式:PUT /索引名称

注意:索引命名必须全部小写,不能以下划线开头。

#创建索引 
PUT /db_idx1

#创建索引:设置分片数和副本数 
PUT /db_idx2 
{
    "settings":{
        "number_of_shards":3,
        "number_of_replicas":2
    }
}

1.2 查询索引

基本格式:GET /索引名称/参数

  • 可以一次获取一个或者多个索引(以逗号间隔) ,获取所有索引时使用 _all 或 用通配符 *。
  • 参数可选,比如:_mapping,_settings

Elasticsearch基本使用_第1张图片

#查看索引详情
GET /db_idx1

#结果
{
  "db_idx1" : {
    "aliases" : { },
    "mappings" : { },
    "settings" : {
      "index" : {
        "routing" : {
          "allocation" : {
            "include" : {
              "_tier_preference" : "data_content"
            }
          }
        },
        "number_of_shards" : "1",
        "provided_name" : "db_idx1",
        "creation_date" : "1655285175682",
        "number_of_replicas" : "1",
        "uuid" : "tY-2ukPPRVOcKER2WsPiCw",
        "version" : {
          "created" : "7170499"
        }
      }
    }
  }
}

GET /_all
GET /*
#查看索引是否存在
HEAD /db_idx3

#结果
{"statusCode":404,"error":"Not Found","message":"404 - Not Found"}

1.3 修改索引配置

基本格式:
PUT /_settings 更新所有索引的。
PUT {index}/_settings 更新一个或多个索引的settings。

索引的设置信息分为静态信息和动态信息两部分。静态信息不可更改,如索引的分片数。动态信息可以修改。
设置项请参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules.html#index-modules-settings

#修改索引配置
PUT /db_idx1/_settings
{
    "index":{
        "number_of_replicas":2
    }
}

1.4 删除索引

基本格式:DELETE /索引名称

  • 可以一次删除一个或者多个索引(以逗号间隔), 删除所有索引时使用 _all 或 通配符 * 。
#删除索引
DELETE /db_idx1

#结果
{
  "acknowledged" : true
}

2、文档操作

2.1 添加文档

基本格式:POST /索引名称/[_doc | _create ]/id

  • id:主键
  • _doc:起到创建/更新的作用,如果不指定 id值,ES会生成 id。如果 id已存在,则会全量修改。
  • _create:起到创建的作用,如果不指定 id值或者 id已存在,则会报错。
#创建文档,指定id
POST /db_idx2/_doc/1
{
  "name":"赵云",
  "sex":1,
  "desc":"打野位"
}

POST /db_idx2/_create/2
{
  "name":"赵云2",
  "sex":1,
  "desc":"打野位"
}

#创建文档,ES生成id
POST /db_idx2/_doc/
{
  "name":"刘备",
  "sex":1,
  "desc":"射手打野"
}

2.2 查看文档

1)根据 id查询

基本格式: GET /索引名称/_doc/id

GET /db_idx2/_doc/2

#结果
{
  "_index" : "db_idx2",
  "_type" : "_doc",
  "_id" : "2",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "name" : "赵云2",
    "sex" : 1,
    "desc" : "打野位"
  }
}

2)条件查询 _search

基本格式: GET /索引名称/_doc/_search

#查询sex等于1GET /db_idx2/_doc/_search?q=sex:1

#查询 db_idx2下的所有文档数据
GET /db_idx2/_doc/_search?version=true

更过复杂查询后面单独了解。

2.3 删除文档

基本格式:DELETE /索引名称/_doc/id

#KQPOZoEB_wUaJOnPq3hT为上面添加文档时,ES生成的id。或者使用我们指定的id
DELETE /db_idx2/_doc/KQPOZoEB_wUaJOnPq3hT

2.4 修改文档

1)全量更新:整个json都会替换

基本格式:PUT /索引名称/_doc/id

  • 如果id文档存在,现有文档会被删除,新的文档会被创建,即覆盖旧文档。
  • 如果id文档不存在,则会创建。
#全量修改 id=1 文档
PUT /db_idx2/_doc/1
{
  "name":"赵子龙",
  "sex":1,
  "age":18,
  "desc":"常山"
}

2)部分更新:使用_update部分更新

基本格式:POST /索引名称/_update/id

  • 文档必须已经存在,
  • 更新只会对相应字段做增量修改
#增量修改 id=1 文档
POST /db_idx2/_update/1
{
  "doc": {
    "name":"赵子龙",
    "sex":1,
    "age":20,
    "desc":"常山DD",
    "otherdd":"dddd"
  }
}

3)根据条件更新文档

使用 _update_by_query 条件更新文档。更多条件更新文档后面了解。

下面示例一个简单的:

# sex=1的文档,更新age=55
POST /db_idx2/_update_by_query
{
  "query": {
    "match": {
      "sex": "1"
    }
  },
  "script": {
    "source": "ctx._source.age = 55"
  }
}

注意:POST和PUT都能起到创建/更新的作用

  • PUT:针对一个具体的资源进行操作,即需要指定 id才能进行更新/创建。
  • POST:针对整个资源集合进行操作的,如果不写id就由ES生成一个唯一id进行创建新文档,如果填了id那就针对这个id的文档进行创建/更新。

– 求知若饥,虚心若愚。

你可能感兴趣的:(#,Elasticsearch,ES基本使用)