ElasticSearch分布式搜索引擎简介及其增删改查那些事

ElasticSearch分布式搜索引擎简介及其增删改查那些事

Elasticsearch也是基于Lucene的全文检索库,本质也是存储数据,很多概念与MySQL类似的

如果你之前学过SOLR,那么学习ElasticSearch应该会比较简单了

如果没学过SOLR,那么肯定学过MYSQL吧,我们可以将MYSQL的概念类推到ElasticSearch

以下是ElasticSearch的几个关键角色

索引(indices)--------------------------------Databases 数据库

​类型(type)-----------------------------Table 数据表~~

文档(Document)----------------Row 行

字段(Field)-------------------Columns 列

详细说明:

概念 说明
索引库(indices) indices是index的复数,代表许多的索引,
类型(type) 类型是模拟mysql中的table概念,一个索引库下可以有不同类型的索引,比如商品索引,订单索引,其数据格式不同。不过这会导致索引库混乱,因此在6.0版本后被弃用
文档(document) 存入索引库原始的数据。比如每一条商品信息,就是一个文档
字段(field) 文档中的属性
映射配置(mappings) 字段的数据类型、属性、是否索引、是否存储等特性

另外,在SolrCloud中,有一些集群相关的概念,在Elasticsearch也有类似的:

  • 索引集(Indices,index的复数):逻辑上的完整索引 collection1
  • 分片(shard):数据拆分后的各个部分
  • 副本(replica):每个分片的复制

官方介绍:

An index can potentially store a large amount of data that can exceed the hardware limits of a single node. For example, a single index of a billion documents taking up 1TB of disk space may not fit on the disk of a single node or may be too slow to serve search requests from a single node alone.

To solve this problem, Elasticsearch provides the ability to subdivide your index into multiple pieces called shards. When you create an index, you can simply define the number of shards that you want. Each shard is in itself a fully-functional and independent “index” that can be hosted on any node in the cluster.

索引可能存储大量数据,这些数据可能超出单个节点的硬件限制。例如,占用1TB磁盘空间的十亿个文档的单个索引可能不适用于单个节点的磁盘,或者速度太慢,无法单独为单个节点的搜索请求提供服务。为了解决这个问题,Elasticsearch提供了将索引细分为多个碎片的功能。在创建索引时,可以简单地定义所需的碎片数量。每个shard本身都是一个功能齐全且独立的“索引”,可以托管在集群中的任何节点上。

要注意的是:Elasticsearch本身就是分布式的,因此即便你只有一个节点,Elasticsearch默认也会对你的数据进行分片和副本操作,当你向集群添加新数据时,数据也会在新加入的节点中进行平衡

索引的增删改查

Elasticsearch采用Rest风格API,因此其API就是一次http请求,你可以用任何工具发起http请求

建议使用ElasticSearch提供的管理工具Kibana进行操作

新建索引

例子

Put  testindex511
{
    "settings": {
        "number_of_shards": 3,   //分片数量
        "number_of_replicas": 2  //副本数量
      }
}

查看索引

GET /索引库名

可以查看索引的配置

GET  * 

可以查看全部索引的配置

删除索引

DELETE /索引库名

映射配置

索引有了,接下来肯定是添加数据。但是,在添加数据之前必须定义映射

什么是映射?

字段的数据类型、属性、是否索引、是否存储、是否分词等特性

创建映射

PUT /索引库名/_mapping/类型名称
{
  "properties": {
    "字段名": {
      "type": "类型",
      "index": true"store": true"analyzer": "分词器"
    }
  }
}
  • 类型名称:就是前面将的type的概念,类似于数据库中的不同表
    字段名:任意填写 ,可以指定许多属性,例如:
  • type:类型,可以是text、long、short、date、integer、object等
  • index:是否索引,默认为true
  • store:是否存储,默认为false
  • analyzer:分词器,这里的ik_max_word即使用ik分词器

示例:

PUT testindex511/_mapping/goods
{
  "properties": {
    "title": {
      "type": "text",
      "analyzer": "ik_max_word"
    },
    "images": {
      "type": "keyword",
      "index": "false"
    },
    "price": {
      "type": "float"
    }
  }
}

查看映射

GET testindex511/_mapping

字段属性

type

Elasticsearch中支持的数据类型非常丰富:

  • String类型,又分两种:

    • text:可分词不可参与聚合(聚合是什么后面讲)
    • keyword:不可分词,数据会作为完整字段进行匹配,可以参与聚合
  • Numerical:数值类型,分两类

    • 基本数据类型:long、interger、short、byte、double、float、half_float
    • 浮点数的高精度类型:scaled_float
      • 需要指定一个精度因子,比如10或100。elasticsearch会把真实值乘以这个因子后存储,取出时再还原。
  • Date:日期类型

    elasticsearch可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节省空间

index

index影响字段的索引情况。

  • true:字段会被索引,则可以用来进行搜索。默认值就是true
  • false:字段不会被索引,不能用来搜索

index的默认值就是true,也就是说你不进行任何配置,所有字段都会被索引。

但是有些字段是我们不希望被索引的,比如商品的图片信息,就需要手动设置index为false

store

是否将数据进行额外存储。

在学习lucene和solr时,我们知道如果一个字段的store设置为false,那么在文档列表中就不会有这个字段的值,用户的搜索结果中不会显示出来。

但是在Elasticsearch中,即便store设置为false,也可以搜索到结果。

原因是Elasticsearch在创建文档索引时,会将文档中的原始数据备份,保存到一个叫做_source的属性中。而且我们可以通过过滤_source来选择哪些要显示,哪些不显示。

而如果设置store为true,就会在_source以外额外存储一份数据,多余,因此一般我们都会将store设置为false,事实上,store的默认值就是false

数据的增删改查

数据添加

通过POST请求,可以向一个已经存在的索引库中添加数据

POST /索引库名/类型名
{
    "key":"value"
}

示例:

POST /testindex511/goods/
{
    "title":"小米手机",
    "images":"http://image.com/12479122.jpg",
    "price":2699.00
}

响应:

{
  "_index": "testindex511",
  "_type": "goods",
  "_id": "ezzYAnIBL2UUkbPHEN9K",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 3,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 0,
  "_primary_term": 1
}

如果我们想要自己新增的时候指定id,可以这么做:

POST /索引库名/类型/id值
{
    ...
}

在学习Solr时我们发现,我们在新增数据时,只能使用提前配置好映射属性的字段,否则就会报错。

不过在Elasticsearch中并没有这样的规定。

事实上Elasticsearch非常智能,你不需要给索引库设置任何mapping映射,它也可以根据你输入的数据来判断类型,动态添加数据映射。

POST /testindex511/goods/
{
    "title":"小米手机",
    "images":"http://image.com/12479122.jpg",
    "price":2699.00,
    "stock":200
}

我们额外添加了stock库存,但是事前并没有指定映射

返回结果:

{
  "_index": "testindex511",
  "_type": "goods",
  "_id": "fTzbAnIBL2UUkbPHjt8u",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 3,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 0,
  "_primary_term": 1
}

查看映射关系,看elasticserach帮我们映射了什么玩意

GET testindex511/_mapping

返回结果:

{
  "testindex511": {
    "mappings": {
      "goods": {
        "properties": {
          "images": {
            "type": "keyword",
            "index": false
          },
          "price": {
            "type": "float"
          },
          "stock": {
            "type": "long"
          },
          "title": {
            "type": "text",
            "analyzer": "ik_max_word"
          }
        }
      }
    }
  }
}

由图可知elasticseach帮我们自动映射stock为long类型

数据修改

把刚才新增的请求方式改为PUT,就是修改了。不过修改必须指定id

关于文档id

  • id对应文档存在,则修改
  • id对应文档不存在,则新增

数据删除

删除使用DELETE请求,同样,需要根据id进行删除:

DELETE /索引库名/类型名/id值
原创文章 208 获赞 165 访问量 14万+

猜你喜欢

转载自blog.csdn.net/JunSIrhl/article/details/106057477