Elasticsearch快速入门

文章目录

Elasticsearch快速入门

核心概念

Elasticsearch是面向文档的,以json格式存储数据的NoSQL数据库,也是一个全文搜索引擎。

Elasticsearch 关系型数据库(如Mysql)
索引(Index) 数据库(Database)
类型(Type) 表(Table)
文档(Document) 行,记录(Row,Record)
字段(Field) 列,字段(Column,Field)
映射(Mapping) 约束(Schema)

注意:es中的类型在es7.x版本中已经没有,在后面的8.x版本中被彻底删除掉。

倒排索引

倒排索引(Inverted Index),是Elasticsearch中的索引工作机制。倒排索引是区别于正排索引的概念:

  • 正排索引:是以文档对象的唯一ID作为索引,以文档内容作为记录。
  • 倒排索引:指的是将文档内容中的单词作为索引,将包含该词的文档ID作为记录。

Elasticsearch的工作流程如下,因为使用倒排索引产生的文档记录要比mysql数据行少多了,所以会比较快。

基本使用

es提供了retfulAPI风格操作接口给开发者对索引、类型、文档、字段、映射等进行增删查改操作。

索引操作
创建索引

请求格式:

json 复制代码
PUT /索引名称
类型映射[了解]

相当于在mysql中创建数据表时的字段类型

json 复制代码
# 索引名称必须已经存在!
POST /索引名称/类型名称
{
    "类型名称": { // 映射的类型名称
        "properties": {  // 索引中文档的属性
            "字段名": {           // 属性名或字段名
                "type": "text"   // 属性值类型或字段类型,text表示文本,如商品标题
                "index": "analyzed",    // 索引类型
                "analyzer": "ik_smart"  // 设置使用的分词器[标准分词]
            },
            "字段名": {           // 属性名或字段名
                "type": "text"   // 属性值类型或字段类型,text表示文本,如商品标题
                "index": "analyzed",    // 索引类型
                "analyzer": "standard"  // 设置使用的分词器
            },
            "字段名": {           // 属性名或字段名
                "type": "text"   // 属性值类型或字段类型,text表示文本,如商品标题
                "index": "analyzed",    // 索引类型
                "analyzer": "standard"  // 设置使用的分词器
            }
        }
    }
}

kinana操作:

json 复制代码
POST /indexes1/goods
{
  "mapping": {
    "properties": {
      "id": {
        "type": "long"
      },
      "name": {
        "type": "text",
        "index": "analyzed",
        "analyzer": "ik_max_word"
      },
      "price":{
        "type": "float"
      },
      "created_time":{
          "type": "date",
          "format":"yyyy-MM-dd HH:mm:ss"
      }
    }
  }
}
数据类型[了解]

elasticsearch中支持的常见字段数据类型:

类型 描述
text 字符串类型,可以模糊查询, 可以分词查询,不能聚合、排序
keyword 字符串类型,只能精准查询, 不能分词查询,可以聚合、排序
long 有符号的64位整数, 范围:[−263 ~ 263-1]
Integer 有符号的32位整数, 范围: [−231 ~ 231-1]
short 有符号的16位整数, 范围: [-32768 ~ 32767]
byte 有符号的8位整数, 范围: [-128 ~ 127]
float 32位单精度浮点数
double 64位双精度浮点数
boolean 布尔类型,支持使用字符串,数字等零值表示true/false
date 日期类型,
date_nanos 日期纳秒类型,
binary 二进制类型,Base64编码字符串的二进制值
Range 范围类型,有integer_range, float_range, long_range, double_range, date_range等
array 数组类型,ES中没有专门的数组类型, 直接使用[ ]定义即可,所有的成员的值必须是同一种数据类型
object 对象类型,以json对象为结构

使用默认类型_doc代替映射的创建,es会内部自动推断字段类型。

json 复制代码
PUT /indexes2/_doc/文档ID
{
    "name": "商品的标题",
    "price": 18,
    "created_time": "2022-01-10 22:00:31"
}

_doc 就是默认类型(default type),type在8.x版本会被彻底删除,以后使用默认类型_doc替代即可。

查看索引
bash 复制代码
GET /_cat/indices      # 查看所有的索引信息
GET /索引名称           # 查看指定名称的索引信息
删除索引
json 复制代码
DELETE /索引名称
文档操作
请求方法/method uri地址 描述
PUT(创建,修改) /索引名称/_doc/文档id 创建文档(指定文档id)
POST(创建) /索引名称/_doc/文档id 创建文档,如果uri地址只是以_doc结尾,文档id是随机生成的)
POST(修改) /索引名称/_doc/文档id/_update 修改文档
DELETE(删除) /索引名称/_doc/文档id 删除文档
GET(查询) /索引名称/_doc/文档id 查询文档通过文档ID
POST(查询) /索引名称/_doc/文档id/_search 查询所有数据
添加文档
bash 复制代码
POST /索引名称/_doc
{
	"id": 1,
    "name": "华为手机",
    "category": "华为",
    "cover": "1.png",
    "price": "3999.00"
}
修改文档
bash 复制代码
POST /索引名称/_doc/1
{
    "name": "华为手机mate40",
    "price": "4999.00"
}
删除文档
bash 复制代码
DELETE /索引名称/_doc/1
查询文档

查询文档有三种方式:

  • 主键查询:根据文档id查询
  • 精确查询:根据关键词查询,也叫term查询 浪潮之巅 -> 浪潮之巅
  • 匹配查询:根据输入的内容先对内容进行分词,再进行分词匹配查询 浪潮 -> 浪潮之巅
准备数据
bash 复制代码
POST /indexes4/_doc/1
{
  "created_time":"2022-04-01",
  "title":"浪潮之巅",
  "content":"一部IT人非读不可,而非IT人也应该阅读的作品,讲故事的经典作品",
  "author_id": 119
}

POST /indexes4/_doc/2
{
  "post_date":"2022-03-12",
  "title":"人月神话",
  "content":"一部IT人非读不可,而非IT人也应该阅读的作品,讲人与团队关系作品",
  "author_id": 120
}

POST /indexes4/_doc/3
{
  "post_date":"2021-12-16",
  "title":"代码之髓",
  "content":"小日子过得不错的人写的作品,对代码中各种语言结构的实现进行揭秘",
  "author_id": 110
}
主键查询
bash 复制代码
# GET /索引名称/_doc/1
GET /indexes4/_doc/3
精确查询
json 复制代码
POST /索引名称/_search

{
	"query": {
		"term": {
			"字段名": {
			    "value": "字段值"
			},
			"字段名": {
			    "value": "字段值"
			}
		}
	}
}

# 如果是text格式,无法精确查询的,只能匹配查询

kibana操作:

bash 复制代码
POST /indexes4/_search
{
	"query": {
		"term": {
			"author_id": {
			    "value": 119
			}
		}
	}
}
匹配查询

查询所有

bash 复制代码
POST /索引名称/_search
{
    "query": {
        "match_all": {}
     },
     "sort": [  # 排序,注意:text无法使用排序,keyword才支持
          # {"字段名":"排序规则,asc正序, desc倒序"}
          {"title": "asc" }
     ],
      "from": 0,                       # 分页,查询起始下标
      "size": 2,                       # 指定返回结果数量
      "_source": ["title", "content"]  # 指定只返回部分字段
}

kibana操作:

bash 复制代码
POST /indexes4/_search
{
  "query": {
    "match_all": {}
  },
  "sort": {
    "author_id": "desc"
  },
  "from": 0,
  "size": 4,
  "_source": ["title"]
}

条件查询

格式:

json 复制代码
POST /索引名称/_search
{
    "query": {
        "match": {
          "字段名": "查询条件值"
        }
    }
}
bash 复制代码
POST /indexes4/_search
{
    "query": {
        "match": {
          "content": "非读不可"
        }
    }
}

若有错误与不足请指出,关注DPT一起进步吧!!!

相关推荐
老纪的技术唠嗑局7 小时前
告别OpenClaw配置丢失——Mindkeeper内测版邀测
大数据·elasticsearch·搜索引擎
Elasticsearch7 小时前
使用 Elasticsearch + Jina embeddings 进行无监督文档聚类
elasticsearch
勇哥的编程江湖10 小时前
flinkcdc streaming 同步数据到es记录过程
大数据·elasticsearch·flink·flinkcdc
曾阿伦10 小时前
Elasticsearch 7.x 常用命令备忘录
大数据·elasticsearch·搜索引擎
斯特凡今天也很帅10 小时前
Elasticsearch数据库专栏(二)DSL语句总结(更新中)
大数据·elasticsearch·搜索引擎
要记得喝水11 小时前
适用于 Git Bash 的脚本,批量提交和推送多个仓库的修改
git·elasticsearch·bash
二十七剑11 小时前
Elasticsearch的索引问题
大数据·elasticsearch·搜索引擎
A__tao19 小时前
Elasticsearch Mapping 一键生成 Java 实体类(支持嵌套 + 自动过滤注释)
java·python·elasticsearch
A__tao21 小时前
Elasticsearch Mapping 一键生成 Proto 文件(支持嵌套 + 注释过滤)
大数据·elasticsearch·jenkins
Devin~Y21 小时前
高并发电商与AI智能客服场景下的Java面试实战:从Spring Boot到RAG与向量数据库落地
java·spring boot·redis·elasticsearch·spring cloud·kafka·rag