Elasticsearch学习--基础概念、Query DSL
学习地址:
https://www.bilibili.com/video/BV1SQ4y1m7Ds?p=1
三个重要概念
1、索引
2、映射
3、文档
索引:<Index>
一个索引就是拥有几分相似特征的文档的集合。比如,你有一个商品数据的索引,一个订单数据的索引。还有一个用户数据的索引,一个索引由一个名字来表示(必须全小写字母),并且当我们对这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用这个名字
(可以近似的理解为索引就是mysql库的概念)
es常见索引类型
- 字符串类型: keyword(关键字)、text(一段文本)
→ keyword是分词的、text是不分词的
- 数字类型:integer long(长整数)
- 小数类型:float double (精度不同)
- 布尔类型:boolean
- 日期类型:date
映射:<Mapping>
映射是定义一个文档和它所包含的字段如何被存储和索引的过程。在默认配置下,es可以根据插入的数据自动创建mapping,也可以手动创建mapping。maooing中主要包括字段名、字段类型等
(近似理解为mysql中表的字段)
- 明确告诉索引可以存放哪些数据
文档<Document>
即需要存放的数据。文档是索引中存储的一条条数据。一条文档是一个可以被索引的最小单元。es中的文档采用了轻量级的JSON格式数据来表示
索引基本操作
1、查看es中有哪些 索引
GET /_cat/indices

索引名为.开头的,是不可见索引,客户端工具去连接es会用到这些临时索引,每次启动时这些索引可能都不一样,但是与es交互的时候,必须使用这些索引的支持。
GET /_cat/indices?v ##显示标题

标题含义(从左到右)
索引状态 索引打开状态 索引名称 索引唯一标识 主分片数 副本数 文档数 文档删除 存储大小 主分片存储大小
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
2、创建索引
PUT /productes
注意: 单节点创建出来的索引是黄色的
概念解释:
主分片: 放整个索引的数据库。
副本: 索引的备份。es在创建索引的时候,会自动给索引做备份,创建一个副本 ,
原因:单节点的es,主分片与副本放在了同一台es机器中,es认为你的备份没有意义,索引不太安全,因此展示黄色
- 创建的时候,不创建副本(危险操作)
PUT /orders { "settings": { "number_of_shards": 1, "number_of_replicas": 0 } }
3、删除索引
DELETE /products
映射基本操作
注意:无法单独创建映射,脱离了索引的映射是没意义的
es常见索引类型
- 字符串类型: keyword(关键字)、text(一段文本)
→ keyword是分词的、text是不分词的
- 数字类型:integer long(长整数)
- 小数类型:float double (精度不同)
- 布尔类型:boolean
- 日期类型:date
1、创建映射(先创建索引、后创建映射)
PUT /products { "settings": { "number_of_shards": 1, "number_of_replicas": 0 }, "mappings": { "properties": { ##指定当前映射可以有哪些字段、每个字段的类型 "id": { "type": "integer" }, "title": { "type": "keyword" }, "price": { "type": "double" }, "create_at": { "type": "date" }, "description": { "type": "text" } } } }
2、查看映射
GET /索引名/_mapping
例:
GET /products/_mapping
注意:映射同样不能删除和修改,若创建中有字段不符,只能将索引删除重新创建
文档基本操作
1、添加文档
/索引名/_doc #固定写法
- 手动生成id
POST /products/_doc/1 # 指定文档id { "id": 1, ##手动指定了id,这里最好与请求中的id保持一致 "title": "iphone13", "price": "8999.99", "create_at": "2021-09-15", "description": "iPhone 13采用6.1英寸OLED屏幕" }
- 自动生成id (不指定id,body中也不用id字段)
POST /products/_doc/ # 不指定文档id { "title": "iphone13", "price": "8999.99", "create_at": "2021-09-15", "description": "iPhone 13采用6.1英寸OLED屏幕" }
2、文档查询
GET /products/_doc/id 例: GET /products/_doc/1
3、删除文档
DELETE /products/_doc/1
4、更新文档
- 注意:
PUT /products/_doc/1 { "title": "iphone14" }
再次查询发现,原来的信息全部没有,只剩下了title
因为这种更新方法是 删除原来的doc,重新添加当前字段doc
那么,如何更新保留文档?
基于指定的字段进行更新 _update
POST /products/_doc/1/_update { "doc": { ##doc是固定写法 "title": "iphone14" } }
文档批量操作
POST /products/_doc/_bulk ##固定写法_bulk告诉es需要进行批量操作
其中:
→ index表示插入数据
→ delete表示删除数据
→ update表示更新数据
POST /products/_doc/_bulk {"index": {"_id": 2}} ##指定id {"title": "xx", "price": 15} {"index": {}} ##随机id {"title": "oo", "price": 5} {"delete": {"_id": 2}} {"update": {"_id": 1}} {"doc": {"price": 1}}
批量时不会因为一个失败全部失败,而是继续执行后续操作,在返回时按执行的状态返回。
注意:批量修改时,数据字段必须在同一行
Query DSL
es高级查询Query DSL(特殊领域语言--es专属查询语言)
利用Rest API传递JSON格式的请求体(Request Body)数据与ES进行交互,这种方式的丰富查询语法让es检索变得更强大、更简洁。
语法: # GET /索引名/_doc/_search{json格式请求体数据}
# GET /索引名/_search{json格式请求体数据} # 推荐
主要讲述:
- match_all
- term
- ranger
- prefix
- wildcard
- ids
- bool
- multi_match
- query_string
与query同级
- size
- from
- sort
- _source
match_all
返回索引全部文档
GET /products/_search { "query": { "match_all": {} } }
term
基于关键词查询
⇒ keywork类型: 需要将该类型的所有字符作为关键字进行搜索,否则无法搜索成功 #不分词
⇒ text: 英文以单个单词为关键字,中文以单个字为关键字进行搜索
⇒ integer类型: 不分词
⇒ dubbo类型: 不分词
⇒ date类型: 不分词
GET /products/_search { "query": { "term": { "descrpition": { "value": "iphone" } } } }
range
范围查询
#价格大于0小于5的doc GET /products/_search { "query": { "range": { "price": { "gte": 0, # 大于 "lte": 5 # 小于 } } } }
prefix
前缀查询:用来检索指定前缀的关键词的相关文档(可以不用完整关键词)
GET /products/_search { "query": { "prefix": { "description": { "value": "ipho" } } } }
wildcard
通配符查询 (?匹配任意一个字符,*匹配多个任意字符)
GET /products/_search
{ "query": { "wildcard": { "title": { "value": "ipho*" ##匹配ipho开头的关键词 ipho? 则为匹配ipho加任意一个字符的关键字,由于关键字为iphone 所以单用?是无法匹配到的 } } } }
ids
多id查询 (值为数组类型,用来根据一组id获取多个对应的文档)
GET /products/_search { "query": { "ids": { "values": ["1","2"] } } }
fuzzy
模糊查询(就算词语错误但也可以查询)
GET /products/_search { "query": { "fuzzy": { "title": "iphoooone" } } }
注意:
⇒ 关键字只有两个字的时候,不允许模糊
⇒ 关键字长度为3-5,允许模糊一次(允许一个词出错)(分词器分词)
⇒ 关键字长度大于5,允许模糊两次(允许两个词出错)
bool
布尔查询
## id为1并且title是iphone13 GET /products/_search { "query": { "bool": { "must": [ { "ids": { "values": [1] } }, { "term": { "title": { "value": "iphone13" } } } ] } } }
语法:
⇒ must: 相当于&&同时成立
⇒ should: 相当于||成立一个就行
⇒ must_not: 相当于! 不满足任意一个
multi_match
多字段查询 根据指定字段是否分词,结合定义的查询关键词进行查询
GET /products/_search { "query": { "multi_match": { "query": "iphone 14", "fields": ["title","descrpition"] ##检索字段 } } }
上述即在title中无法匹配关键词
但是在description中,是text类型,进行分词,其中‘iphone 14’ 分为‘iphone’和‘14’,在description中可以匹配到‘iphone’所以可以返回结果
query_string
默认字段分词查询
#查询字段分词将分词查询,不分词则不分词查询
# 即定义一个字段为分词字段,根据这个字段的分词规则去检索索引
GET /products/_search { "query": { "query_string": { "default_field": "description", "query": "屏幕真的非常不错" } } }
在description中(text类型字段),会将每个中文字拆成一个一个字进行索引,
# 与query同级
highlight
高亮查询(让符合文档中的关键词高亮)
GET /products/_search
{
"query": {
"query_string": {
"default_field": "description"
"query": "屏幕真的非常不错"
}
},
"highlight": {
# "pre_tags": [], #高亮前置标签 没有则不写,否则报错
# "post_tags": [], #高亮后置标签
"require_field_match": "false", #默认只有搜索的字段高亮,这里设为false将关闭搜索字段验证,实现全部字段高亮
"field": {
"*":{}
}
}
}
在原来的query下面加highlight(只有能分词的字段进行高亮(前后加标签))
注意:没有修改原始文档,需要原始文档出现即高亮,需要更改内容
size
返回指定条数,指定查询结果中返回指定条数,默认返回10条
GET /products/_search { "query": { "match_all": {} }, "size": 5 }
from
分页查询,指定初始位置,和size可以实现分页效果
GET /products/_search { "query": { "match_all": {} }, "size": 5, "from": 3 }
sort
指定字段进行排序
降序:desc
升序:asc
GET /products/_search { "query": { "match_all": {} }, "sort": [ { "price": { "order": "desc" ##升序为asc } } ] }
_source
索并返回指定字段 (即不讲doc的全部字段返回,只返回需要的)
# 返回“id” “title” “price”字段
GET /products/_search { "query": { "match_all": {} }, "sort": [ { "price": { "order": "desc" ##升序为asc } } ], "_source": ["id","title","price"] }

浙公网安备 33010602011771号