ElasticSearch(3)-基本操作-查询

50 阅读4分钟

文档

www.elastic.co/guide/en/el…

思维导图

基本要素

ES是一个文档型数据库,在与传统的关系型数据库上,存在着一定的差异。下面将ES里面涉及到的元素与关系型数据库进行一一对应。

ElasticSearch索引(index)类型(type)文档(document)字段(field)
MySQL数据库(database)数据表(table)数据行(row)数据列(column)

索引操作

1. 创建索引
PUT test0526

返回
{
  "acknowledged": true,//响应结果
  "shards_acknowledged": true,//分片结果
  "index": "shopping"//索引名称
}
2. 查询索引
{
  "test0525": {//索引名
    "aliases": {},//别名
    "mappings": {//映射
      "doc": {
        "dynamic_templates": [
          {
            "message_full": {
              "match_mapping_type": "string",
              "mapping": {
                "fields": {
                  "keyword": {
                    "ignore_above": 256,
                    "type": "keyword"
                  }
                },
                "type": "text"
              }
            }
          },
          {
            "message_long_as_double": {
              "match": "member*",
              "match_mapping_type": "long",
              "mapping": {
                "type": "double"
              }
            }
          }
        ],
        "properties": {
          "category": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "group": {
            "type": "long"
          },
          "title": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    },
    "settings": {//设置
      "index": {
        "refresh_interval": "10s",
        "number_of_shards": "5",
        "provided_name": "test0525",
        "creation_date": "1684985637599",
        "number_of_replicas": "1",
        "uuid": "F3t6BIqeRrqFt7ZsP4UdUA",
        "version": {
          "created": "6040399"
        }
      }
    }
  }
}
3. 查看所有索引
GET _cat/indices
4. 删除索引
DELETE test0526
5. 文档创建/添加数据
POST test0525/doc
{
  "title": "小米手机2",
  "category": "小米",
  "group":[12]
}

返回
{
  "_index": "test0525",//索引
  "_type": "doc",//类型-文档
  "_id": "PT12UogBOGgFZNxa0wAZ",//唯一标识,可以类比为 MySQL 中的主键,随机生成
  "_version": 1,//版本
  "result": "created",//结果,这里的 create 表示创建成功
  "_shards": {
    "total": 2,//分片 - 总数
    "successful": 2,//分片 - 总数
    "failed": 0//分片 - 总数
  },
  "_seq_no": 1,
  "_primary_term": 1
}
6. 自定义插入id
POST test0525/doc/user_72
{
  "title": "小米手机2",
  "category": "小米",
  "group":[1,2]
}

{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "test0525",
        "_type": "doc",
        "_id": "user_72",//自定义的id
        "_score": 1,
        "_source": {
          "title": "小米手机2",
          "category": "小米",
          "group": [
            1,
            2
          ]
        }
      }
    ]
  }
}
7. 通过唯一标识查询
GET test0525/doc/user_72

{
  "_index": "test0525",
  "_type": "doc",
  "_id": "user_72",
  "_version": 2,
  "found": true,
  "_source": {
    "title": "小米手机2",
    "category": "小米",
    "group": [
      1,
      2
    ]
  }
}
8. 查询关系
- `must` 表示查询结果必须满足该条件,类似于“AND”操作符。
- `should` 表示查询结果应该满足该条件,但不是必须,类似于“OR”操作符。
- `must_not` 表示查询结果必须不满足该条件,相当于取反操作。
9. 查询关键字
`match`:查询文本包含指定关键词的文档
`term`:查询指定字段包含指定值的文档
`range`:查询指定字段在指定范围内的文档
`exists`:查询指定字段存在的文档
`bool`:组合多个查询条件,支持 `must``should``must_not` 条件关系
`wildcard`:通配符查询
`prefix`:前缀查询
`regexp`:正则表达式查询
`fuzzy`:模糊查询
`match_phrase`:查询文本包含指定关键词短语的文档
`query_string`:查询字符串查询,支持关键词查询和 Lucene 查询语法
10. 计算
`sum`:计算指定字段的和
`avg`:计算指定字段的平均值
`max`:计算指定字段的最大值
`min`:计算指定字段的最小值
`cardinality`:计算指定字段的基数(不重复值的数量)
`percentiles`:计算指定字段值的百分位数
`stats`:计算指定字段的统计信息,包括 count、minmax、avg、sum 等
`extended_stats`:在 `stats` 基础上,还计算字段的标准差、方差、标准误差等
`geo_bounds`:计算指定地理坐标字段的边界框
`geo_centroid`:计算指定地理坐标字段的质心坐标
11. 复杂查询(请求体查询)
11.1. 任意字符匹配 match
GET test0525/_search
{
  "query": {
    "match": {
      "title": "荣耀"
    }
  }
}

//查询结果包含"荣"或者"耀"
11.2. 完全字符匹配
GET test0525/_search
{
  "query": {
    "match_phrase": {
      "title": "荣耀"
    }
  }
}
//查询结果包含"荣耀"
11.3. 查询所有
GET test0525/_search
{
  "query": {
    "match_all": {
      
    }
  }
}
11.4. 分页查询&排序
GET test0525/_search
{
  "query": {
    "match_all": {}
  },
  "size": 2,
  "from": 0,
  "sort": [
    {
      "_id": {
        "order": "desc"
      }
    }
  ]
}
11.5. 多条件查询
GET test0525/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "category": "华为"
          }
        },
        {
          "match_phrase": {
            "title": "荣耀"
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "category": "小米"
          }
        }
      ]
    }
  }
}
11.6. 范围查询
## gt 大于 gte 大于等于 lt 小于 lte 小于等于

GET test0525/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "age": {
              "gte": 5,
              "lt": 7
            }
          }
        }
      ]
    }
  }
}
11.7. 分组查询
//同时包含2 和 3的
GET test0525/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "group": 3
            
          }
        },
        {
          "term": {
            "group": 2
            
          }
        }
      ]
    }
  }
}

//任意包含
GET test0525/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "group": [
              2,
              3
            ]
          }
        }
      ]
    }
  }
}
11.8. 计算-平均值/最大值/最小值
GET test0525/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "group": [
              2
            ]
          }
        }
      ]
    }
  },
  "aggs": {
    "avg_age": {//自定义显示名称
      "avg": {//计算类型 avg 平均值 min 最小值 max最大值
        "field": "age"
      }
    }
  }
}
11.9. 字段存在
GET test0525/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "exists": {
            "field": "age"
          }
        }
      ]
    }
  }
}
11.10. 模糊查询
GET test0525/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "wildcard": {
            "title.keyword": "*小米*"//不带keyword会对查询条件进行分词查询,获取结果不准确
          }
        }
      ]
    }
  }
}
12. 删除文档
DELETE test0526/doc/1
13. 文档更新
13.1. 全量修改
POST test0525/doc/user_72
{
  "title": "小米手机8",
  "category": "小米",
  "group":[1,2]
}
13.2. 局部更新
POST test0525/doc/user_72
{
  "category": "小米8",
}