操作基于es7, type的相关操作逐步去除。
一:简介
1,简述
Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。
2,应用举例
3,es和mysql的对照
mysql | es |
---|---|
数据库(database) | 索引(index) |
表(table) | 类型(type) |
行(row) | 文档(document) |
表结构(schema) | 映射(mapping) |
索引 | 全文检索 |
二:实操
1, 索引和映射操作
● 创建索引
● 查询索引
● 删除索引
● 查询映射
● 添加映射
● 创建索引并添加映射
● 修改映射
# 创建索引
PUT student
# 查询索引
GET student
# 删除索引
DELETE student
# 查询映射(在索引student存在的情况下)
GET student/_mapping
# 添加映射(在索引student存在的情况下)
PUT student/_mapping
{
"properties":{
"name":{
"type":"keyword"
},
"age":{
"type":"integer"
}
}
}
# 创建索引并添加映射(在索引student不存在的情况下)
PUT student
{
"mappings": {
"properties": {
"name":{
"type": "keyword"
},
"age":{
"type":"integer"
}
}
}
}
# 索引库中添加字段(在索引student存在的情况下,添加index中没有的字段)
PUT student/_mapping
{
"properties":{
"address":{
"type":"text"
}
}
}
2,文档(数据)操作
• 添加文档
• 查询文档
• 修改文档
• 删除文档
# 确保有student索引的情况下,对student索引的文档操作
# 添加文档,指定id
PUT student/_doc/1
{
"name":"张三",
"age":12,
"address":"北京"
}
# 查询文档
GET student/_doc/1
# 添加文档,不指定id(给一个随机id)
# 必须使用POST
POST student/_doc/
{
"name":"李四",
"age":20,
"address":"深圳"
}
# 查询文档
GET student/_doc/u8b2QHUBCR3n8iTZ8-Vk
# 查询所有文档
GET student/_search
# 删除文档
DELETE student/_doc/1
# 修改文档 根据id,id存在就是修改,id不存在就是添加
PUT student/_doc/2
{
"name":"zs",
"age":20,
"address":"上海"
}
3,查询
3.1 全文查询-match查询(模糊匹配,先分词再查询)
全文查询会分析查询条件,先将查询条件进行分词,然后查询,结果是其并集。
GET student/_search
{
"query":{
"match": {
"address": "北京"
}
}
}
3.2 查询文档-term查询(精确匹配,查询条件不经过分词处理)
词条查询不会分析查询条件,只有当词条和查询字符串完全匹配时才匹配搜索
GET student/_search
{
"query":{
"term": {
"address": {
"value": "北京"
}
}
}
}
3.3 查询索引中的全部数据
GET student/_search
3.4 关键字搜索数据
GET student/_search?q=name:zs
3.5 DSL查询(先清空索引插入测试数据)
# 删除索引
DELETE student
# 重建索引和映射
PUT student
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
},
"address":{
"type":"text"
},
"sex":{
"type":"keyword"
}
}
}
}
# 插入新数据
PUT student/_doc/1001
{
"id":"1001",
"name":"张三",
"age":20,
"sex":"男"
}
PUT student/_doc/1002
{
"id":"1002",
"name":"李四",
"age":25,
"sex":"女"
}
PUT student/_doc/1003
{
"id":"1003",
"name":"王五",
"age":30,
"sex":"女"
}
PUT student/_doc/1004
{
"id":"1004",
"name":"赵六",
"age":30,
"sex":"男"
}
# 查询所有数据
GET student/_search
3.5.1 根据年龄查询
GET student/_doc/_search
{
"query":{
"match":{
"age":20
}
}
}
3.5.2
引用:
https://blog.csdn.net/qq_24365213/article/details/79224630?ops_request_misc=&request_id=&biz_id=102&utm_term=bool%20filter%20must%20match&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-6-79224630.pc_search_result_no_baidu_js
# bool组合查询
# filter:过滤,不参与打分
# must:如果有多个条件,这些条件都必须满足 and与
# should:如果有多个条件,满足一个或多个即可 or或
# must_not:和must相反,必须都不满足条件才可以匹配到 !非
查询年龄大于20岁的女性用户
GET student/_search
{
"query":{
"bool":{
"filter": {
"range": {
"age": {
"gt": 20
}
}
},
"must": [
{
"match":{
"sex":"女"
}
}
]
}
}
}
3.5.3 nested 复合检索
为什么需要使用nested检索:在复合结构中,如果内部结构又有关系,那么在检索时,如果不做类型处理,es会当作并集进行检索,结果就可能和我们预期的不一样。如下例演示:
#创建索引
PUT movie
{
"mappings": {
"properties": {
"actors": {
"properties": {
"firstname": {
"type": "keyword"
},
"lastname": {
"type": "keyword"
}
}
}
}
}
}
#插入数据
PUT movie/_doc/1
{
"actors":[
{
"firstname":"zhang",
"lastname":"san"
},
{
"firstname":"wang",
"lastname":"wu"
}
]
}
#普通查询(两条数据分别为zhang san 和 wang wu 但是查询 zhang wu 的结果也查询出来了数据)
GET movie/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"actors.firstname": "zhang"
}
},
{
"match": {
"actors.lastname": "wu"
}
}
]
}
}
}
3.5.4 nested 复合检索解决此问题
① 删除索引重新建立索引
②nested 复合检索
GET movie/_search
{
"query": {
"nested": {
"path": "actors",
"query": {
"bool": {
"must": [
{
"match": {
"actors.firstname": "zhang"
}
},
{
"match": {
"actors.lastname": "wu"
}
}
]
}
}
}
}
}
③ 结果