ElasticSearch常用的操作 - ES搜索引擎

操作基于es7, type的相关操作逐步去除。

一:简介
1,简述

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。

2,应用举例
在这里插入图片描述
3,es和mysql的对照

mysqles
数据库(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"
              }
            }
          ]
        }
      }
    }
  }
}

③ 结果
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值