Elasticsearch提供了Rest风格http请求接口。可以使用可发起Http请求的工具如Postman进行操作或者Kibana可视化工具操作。

API文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。本质也是一个存储数据库,很多概念与Mysql数据库类似

Elasticsearch

MySql

索引库(indexes)

Databases 数据库

类型(type)

Table 数据表

文档(Document)

Row 行

字段(Field)

Columns 列

映射配置(mappings)

表结构

对比方便理解

1、操作索引库 indexes

添加:PUT /my_index (还可以传递参数settings进行索引库设置,后续学到再说)

查看:GET /my_index

删除:DELETE /my_index

2、操作类型及映射 type&mappings

索引库相当于数据库,有了索引库就可以建立类型,相当于数据库中的表。建立数据库表需要字段和字段约束,这种数据表-字段-字段约束的关系在es中即字段映射mappings。

本次学习基于es7.2版本,与之前版本发生变化

ES数据存储结构变化:去除了Type
es6时,官方就提到了es7会删除type,并且es6时已经规定每一个index只能有一个type。在es7中使用默认的_doc作为type,官方说在8.x版本会彻底移除type。
api请求方式也发送变化,如获得某索引的某ID的文档:GET index/_doc/id其中index和id为具体的值


2.1 版本6.x创建类型和映射(需要先创建索引库)

语法:

PUT /索引库名/_mapping/类型名称 或 索引库名/类型名称/_mapping
{
  "properties": {
    "字段名": {
      "type": "类型",
      "index": true,
      "store": true,
      "analyzer": "分词器"
    }
  }
}

# 解释如下:
类型名称:type名,类似于数据库中的表
字段名:表中的字段,下面指定字段的许多属性,例如:
	type:数据类型,可以是text、long、short、date、integer、object等
	index:是否索引,默认为true  
	store:是否存储,默认为false
	analyzer:分词器,后续学习

# 举例,建立用户表user,有用户名username和密码password两个字段

PUT /my_index/_mapping/user
{
  "properties": {
    "username": {
      "type": "text"
    },
    "password": {
      "type": "keyword",
      "index": false
    }
  }
}
2.2 版本7.x之后创建映射(需要先创建索引库)

7.x版本取消了type,统一为_doc

PUT /索引库名/_mapping
{
  "properties": {
    "字段名": {
      "type": "类型",
      "index": true,
      "store": true,
      "analyzer": "分词器"
    }
  }
}

所以上述user表可直接写为:

PUT /user

PUT /user/_mapping
{
  "properties": {
    "username": {
      "type": "text"
    },
    "password": {
      "type": "keyword",
      "index": false
    }
  }
}
2.3 映射属性详解

这里查找了几种常用的属性,后续遇到其他的了再补充

type 数据类型

总结几个常用的:

  • String类型:分为两种:
  • text:可分词,不可参与聚合
  • keyword:不可分词,数据会作为完整字段进行匹配,可以参与聚合
  • 数值类型
  • 基本数据类型:long、interger、short、byte、double、float、half_float
  • 浮点数的高精度类型:scaled_float
  • 需要指定一个精度因子,比如10或100。elasticsearch会把真实值乘以这个因子后存储,取出时再还原。
  • 日期类型
    可以格式化为字符串存储,但是项目中存储为毫秒值了,存储为long,节省空间?
  • Array数组类型
  • Object对象
index 是否索引
  • true:字段会被索引,则可以用来进行搜索。默认值就是true
  • false:字段不会被索引,不能用来搜索
store 是否独立储存

原始的文本会存储在_source里面,默认情况下其他提取出来的字段都不是独立存储的,是从_source里面提取出来的。当然你也可以独立的存储某个字段,只要设置store:true即可,获取独立存储的字段要比从_source中解析快得多,但是也会占用更多的空间,所以要根据实际业务需求来设置,默认为false。

analyzer 分词器

Analyzer(分词器)的作用是把一段文本中的词按规则取出所包含的所有词。对应的是Analyzer类,这是一个抽象类,切分词的具体规则是由子类实现的,所以对于不同的语言(规则),要用不同的分词器。

后续学习使用

2.4 查看映射

6.x版本语法:GET /索引库名/_mapping/类型名

7.x版本语法:GET /索引库名/_mapping

3、操作文档 Document

操作文档就是操作索引库中的数据,类似于操作一行数据

3.1 新增文档
  • 插入并生成随机ID
POST /索引库名/_doc
{
	"字段": "值"
}

例如插入user:zs,123456

POST /user/_doc
{
  "username" : "zs",
  "password" : "123456"
}

返回:

{
  "_index" : "user",
  "_type" : "_doc",
  "_id" : "zyQGinkBe_0ijyU9FhjG",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}
  • 插入并使用自定ID
POST /索引库名/_doc/ID
{
	"字段": "值"
}

例如插入user:ls,123456,id指定为1

POST /user/_doc/1
{
  "username" : "ls",
  "password" : "123456"
}

返回:

{
  "_index" : "user",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 1,
  "_primary_term" : 1
}

如果id重复则为更新:

返回:

{
  "_index" : "user",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 2,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 8,
  "_primary_term" : 1
}
3.2 修改文档
  • 将POST修改为PUT即为修改操作,当表中有id相符的数据时,执行修改,没有时,执行添加
  • 根据条件更新某一字段(后续学习完高级查询后就能更熟练的使用了吧)
POST /user/_update_by_query
{
  "script": {
    "source": "ctx._source['username'] = 'lss'"
  },
  "query": { 
    "term" : {
      "_id" : 1
    }
  }
}
3.3 删除文档
  • 根据ID删除
DELETE /索引库名/_doc/ID
  • 根据条件删除
POST  /索引库名/_delete_by_query
{
  "query": { 
    "match": {
      "字段名": "搜索关键字"
    }
  }
}
例如删除全部:
POST  索引库名/_delete_by_query
{
  "query": { 
    "match_all": {}
  }
}
  • 根据查询条件来查询,后续学习完高级查询后就能更熟练的使用了吧
3.4 查询文档

查询基本语法:

POST /索引库名/_search
{
    "query":{
        "查询类型":{
            "查询条件":"查询条件值"
        }
    }
}

这里query里面可以有不同的查询属性,下一篇学习es的高级查询语法,这里先写几个简单的查询

  • match_all 查询所有
POST /user/_search
{
  "query": {
    "match_all": {}
  }
}
  • term 词条匹配

用于精确值匹配,这些精确值可能是数字、时间、布尔或者那些未分词的字符串,类似于mysql的=

POST /user/_search
{
  "query": {
    "term": {
      "username": "zw"
    }
  }
}
  • terms 多词条匹配

类似于mysql的in语句

POST /user/_search
{
  "query": {
    "terms": {
      "_id": [1,2]
    }
  }
}
  • match 匹配查询

类似于mysql的like语句,但并不是’%值%'的模糊查询模式。
当配置了分词器时,会先分词然后按照分词进行查询,多个词条之间是’or’的关系.
现在我没有配置分词器,使用效果就相当于=。

POST /user/_search
{
  "query": {
    "match": {
      "username": "加油努力奋斗"
    }
  }
}

or关系变为and关系:

POST /user/_search
{
  "query": {
    "match": {
      "username": {
        "query": "加油努力奋斗",
        "operator": "and"
      }
    }
  }
}
  • multi_match 多字段匹配查询
    与match效果类似,不同的是它可以在多个字段中查询
POST /user/_search
{
  "query": {
    "multi_match": {
      "query": "加油努力奋斗",
      "fields": ["username","passwor"]
    }
  }
}

后续学习更多的查询类型,高级查询(组合查询、范围查询等)、结果过滤、排序等

此处一个预留的超链接