ElasticSearch 基本使用
elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
1. 核心概念
ES是面向文档编程,与关系型数据库的对比
DB | ES |
---|---|
数据库(database) | 索引(indices) |
表(tables) | 类型(types) |
行(rows) | 文档(document) |
列(columns) | 字段(fields) |
索引
索引是映射类型的容器,存储了映射类型的字段和其他设置,它们被存储到各个分片上,相当于mysql的数据库
类型
一个类型过去是索引的逻辑类别/分区,允许你在同一索引中存储不同类型的文档,例如,一种类型用于用户,另一种类型用于博客文章。在索引中创建多个类型不再可能,类型的整个概念将在稍后的版本中删除。相当于sql领域中表的概念
文档
一个文档是一个可以建立索引的基本单元。文档是用JSON表示的。相当于sql领域中行的概念。
节点和分片
一个集群至少有一个节点,而一个节点就是一个ElasticSearch进程,节点可以有多个索引默认的,创建索引时默认有5个分片构成,每一个分片都会有一个副本,放到不同的集群节点上进行保存,进行数据备份
倒排索引
ElasticSearch使用的是一种称为倒排索引的结构,采用Lucene倒排索引作为底层。这种结构适用于快速的全文检索,一个索引有文档中所有不重复的列表构成,对于每一个词都有一个包含他的文档列表。
2. Rest Api
ElasticSearch支持通过http请求响应服务,因此通过curl命令,可以发送http请求,并得到json返回内容
method | url地址 | 描述 |
---|---|---|
PUT | localhost:9200/索引名称/类型名称/文档id | 创建文档(指定id) |
POST | localhost:9200/索引名称/类型名称 | 创建文档(随机id) |
POST | localhost:9200/索引名称/类型名称/文档id/_update | 修改文档 |
DELETE | localhost:9200/索引名称/类型名称/文档id | 删除文档 |
GET | localhost:9200/索引名称/类型名称/文档id | 查询文档通过文档id |
POST | localhost:9200/索引名称/类型名称/文档id/_search | 查询所有数据 |
2.1 新增文档
# POST 索引名称/类型名称/文档id
# 指定文档id
POST test1/type1/1
{
"name":"张三",
"age":18
}
# 随机文档id
POST test1/type1
{
"name":"张三",
"age":18
}
# 使用默认类型_doc, 在8.x之后将被废弃
POST test2/_doc/1
{
"name":"张三",
"age":18
}
2.2 新增文档数据类型映射
(1)字符串类型: text, keyword(不可被拆分)
(2)数字类型:
long
,integer
,short
,byte
,double
,float
,half_float
,scaled_float
(3)日期:
date
(4)日期 纳秒:
date_nanos
(5)布尔型:
boolean
如果没有进行类型映射,ES会自动进行类型推断映射
# 7.x 之前版本,无法进行全索引的映射,只能对单个类型进行映射
PUT /test2
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
},
"user": {
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer":"ik_max_word"
},
"age": {
"type": "long"
},
"birthday": {
"type": "date"
}
}
}
}
}
# # 7.x 之后版本
PUT /test2
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer":"ik_max_word"
},
"age": {
"type": "long"
},
"birthday": {
"type": "date"
}
}
}
}
# 查看数据结构
GET test2
扩展:通过名称查询ES索引情况
GET _cat/indices?v
2.3 修改文档
# PUT 索引名称/类型名称/文档id
# 对文档数据进行覆盖操作,会导致没有写的数据丢失(不推荐)
PUT test3/_doc/1
{
"name":"张三",
"age":20
}
# PUT 索引名称/类型名称/文档id/_update
# 对文档进行精确修改
POST test3/_doc/1/_update
{
"age":18
}
2.4 删除文档
#删除文档 DELETE 索引名称/类型名称/文档id
DELETE test1/type1/1
#删除索引
DELETE test1
2.5 查询文档
# 插入测试数据
# 插入查询测试数据
POST xma/user/1
{
"name": "张三",
"age": 18,
"desc": ["抽烟","喝酒","烫头"]
}
POST xma/user/2
{
"name":"李四",
"age":28,
"desc":["看电视","游戏","烫头"]
}
POST xma/user/3
{
"name": "王五",
"age": 25,
"desc": ["旅游","读书"]
}
POST xma/user/4
{
"name": "赵三",
"age": 25,
"desc": ["旅游","读书"]
}
2.5.1 过滤字段:_source
# 查询指定索引所有并过滤
GET xma/user/_search
{
"query":{
"match_all": {
}
},
"_source": ["desc"]
}
2.5.2 匹配查询:match
GET xma/user/_search
{
"query": {
"match": {
"name": "三"
}
}
}
2.5.3 精确匹配:term
# 精确匹配,只有字段为keyword才能进行匹配
GET xma/user/_search
{
"query": {
"term": {
"name.keyword": "张三"
}
}
}
2.5.4 高亮查询:highlight
GET xma/user/_search
{
"query": {
"match": {
"name": "张三"
}
},
"highlight": {
"fields": {
"name":{}
}
}
}
# 自定义高亮:pre_tags...post_tags...
GET xma/user/_search
{
"query": {
"match": {
"name": "张三"
}
},
"highlight": {
"pre_tags": "<p color='red'>",
"post_tags": "</p>",
"fields": {
"name":{}
}
}
}
2.5.5 排序操作:sort
GET xma/user/_search
{
"query": {
"match_all": {
}
},
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
2.5.6 分页操作:from…size…
GET xma/user/_search
{
"query": {
"match_all": {
}
},
"from": 0,
"size": 2
}
2.5.7 多条件连接
# 条件连接 must(and)
GET xma/user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"age": "25"
}
},
{
"match": {
"name": "王五"
}
}
]
}
}
}
# 条件连接 should(or)
GET xma/user/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"age": "25"
}
},
{
"match": {
"name": "王五"
}
}
]
}
}
}
# 条件连接 must_not(notin)
GET xma/user/_search
{
"query": {
"bool": {
"must_not": [
{
"match": {
"age": "25"
}
},
{
"match": {
"name": "王五"
}
}
]
}
}
}
# 条件连接 notin + 过滤:filter
GET xma/user/_search
{
"query": {
"bool": {
"must_not": [
{
"match": {
"age": "25"
}
},
{
"match": {
"name": "王五"
}
}
],
"filter": {
"range": {
"age": {
"gte": 20
}
}
}
}
}
}
# 单个字段多个值匹配使用空格隔开即可(in)
GET xma/user/_search
{
"query": {
"match": {
"desc": "头 电视"
}
}
}
学习地址:https://www.bilibili.com/video/BV17a4y1x7zq?p=1