简介
什么是ElasticSearch
ElasticSearch
简称 ES
,是基于Apache Lucene
构建的开源搜索引擎
,是当前最流行的企业级搜索引擎
。Lucene本身就可以被认为迄今为止性能最好的一款开源搜索引擎工具包
,但是lucene的API相对复杂,需要深厚的搜索理论。很难集成到实际的应用中去。ES是采用java语言编写,提供了简单易用的RestFul API,开发者可以使用其简单的RestFul API,开发相关的搜索功能,从而避免lucene的复杂性
。
核心概念
索引
一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个商品数据的索引,一个订单数据的索引,还有一个用户数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。
映射
映射是定义一个文档和它所包含的字段如何被存储和索引的过程。在默认配置下,ES可以根据插入的数据自动地创建mapping,也可以手动创建mapping。 mapping中主要包括字段名、字段类型等
文档
文档是索引中存储的一条条数据。一条文档是一个可被索引的最小单元。ES中的文档采用了轻量级的JSON格式数据来表示。
基本操作
索引
- ES中的索引存在健康状态:
green
(健康)、yellow
(索引可用,存在风险)、red
(索引不可用) - 默认ES在创建索引时会为索引创建1个备份索引和一个
primary
索引
创建
1.创建索引
PUT /索引名
⚠️注意:
- 默认ES在创建索引时会为索引创建1个备份索引和一个
primary
索引 - 默认是
yellow
2.创建索引 进行索引分片的配置
PUT /goods
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
}
}
- 此时索引状态就是green
⚠️Notice:
ElasticSearch5.x以上版本使用text和keyword作为字符串类型取代之前版本的string类型。
- 字符串 - text:用于全文索引,该类型的字段将通过分词器进行分词,最终用于构建索引
- 字符串 - keyword:不分词,只能搜索该字段的完整的值,只用于 filtering
如果创建了索引但是没设置映射结果,然后插入了一条字符串类型的文档,字段将默认被同时映射成text
和keyword
类型
POST /test/_doc
{
"name":"黄凯宇"
}
ElasticSearch将会为你默认创建映射
{
"test" : {
"mappings" : {
"properties" : {
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
基于这个映射你即可以在Filed
字段上进行全文搜索, 也可以通过Filed.keyword
字段实现不分词的关键词搜索及数据聚合.
查询
GET /_cat/indices?v
删除
DELETE /索引名
DELETE /* # *代表通配符,代表所有索引
映射
指定索引中字段名和字段类型,一般真实开发环境中都是手动创建映射,更加符合业务场景
创建
- 字符串类型:keyword(关键字,关键字)、text(一段文本)
- 数字类型: integer long
- 小数类型:float double
- 布尔类型:boolean
- 日期类型:date
PUT /products
{
"settings": {
"number_of_replicas": 0,
"number_of_shards": 1
},
"mappings": {
"properties": {
"id":{
"type": "integer"
},
"title":{
"type": "keyword"
},
"price":{
"type": "double"
},
"create_at":{
"type": "date"
},
"description":{
"type": "text"
}
}
}
}
查询
查询某个索引的映射
GET /索引名/_mapping
文档
添加
添加文档操作_—_手动指定 _id
POST /products/_doc/1
{
"id":1,
"title":"小浣熊",
"price":0.5,
"created_at":"2022-04-08",
"description":"小浣熊真好吃"
}
自动生成_id
#添加文档操作 自动生成id pD5UB4ABiB8dDekOnyy9
POST /products/_doc/
{
"id":2,
"title":"猪猪侠",
"price":0.5,
"created_at":"2022-04-08",
"description":"5毛钱一包"
}
查看
基于id查询
GET /索引名/_doc/id
删除
基于id删除
DELETE /索引名/_doc/id
更新
删除原始文档 再重新添加(更新完就只剩更新的字段了)
PUT /索引名/_doc/id
{
"字段名":"更新后值"
}
在原来的基础上更新文档
POST /索引名/_doc/id/_update
{
"doc":{
"字段名":"更新后值"
}
}
批量操作
- 需要注意的是文档的内容不管多复杂都得在一行,不能换行
批量增加
POST /products/_doc/_bulk
{"index":{"_id":2}}
{"id":2,"title":"泡面","price":4,"created_at":"2022-04-08","description":"泡面真难吃"}
{"index":{"_id":3}}
{"id":3,"title":"玉米肠","price":5,"created_at":"2022-04-08","description":"玉米肠真好吃"}
批量 添加/更新/删除
POST /products/_doc/_bulk
{"index":{"_id":4}}
{"id":4,"title":"沙拉","price":6,"created_at":"2022-04-09","description":"不错不错"}
{"update":{"_id":3}}
{"doc":{"title":"玉米肠+蛋"}}
{"delete":{"_id":2}}