文章目录
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位整数, 范围:[−2^63^ ~ 2^63^-1] |
Integer | 有符号的32位整数, 范围: [−2^31^ ~ 2^31^-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一起进步吧!!!