**这篇是前几年的笔记, 有些在7.x用不了了**
https://www.elastic.co/guide/en/elasticsearch/reference/current/removal-of-types.html
**从6.x开始每个索引只能使用一个类型(type), 并且未来将去掉类型(type)
6.x 很多地方要加 _doc**
1. 索引
1.1 添加索引
PUT product
返回
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "product"
}
1.2 创建 mapping 映射
ES中创建一个mapping映射类似于在数据库中定义表结构,即表里面有哪些字段、字段是什么类型、字段的默认值等;也类似于solr里面的模式schema的定义
未创建索引的情况下
"type" : "text", 表示是文本类型, 会被分词
"type" : "keyword", 和text 类似, 但不会被分词, 值将作为一个整体
"index": false 表示不会被查询
PUT product
{
"mappings" : {
"properties" : {
"name" : {
"type" : "text",
"index": true
},
"desc": {
"type" : "text"
},
"price" : {
"type" : "keyword",
"index": true
},
"producer": {
"type" : "text"
},
"ssss": {
"type" : "text",
"index": false
}
}
}
}
为已存在的索引创建或创建mappings
目前6.x 不使用_doc 会报错 "reason": "Validation Failed: 1: mapping type is missing;"
POST /product/_doc/_mapping
{
"properties": {
"name": {
"type": "text",
"index": true
}
}
}
GET /hp_goods/_doc/_search
// null_value 是加默认值
PUT /hp_goods/_doc/_mapping
{
"properties": {
"isDel": {
"type": "integer",
"null_value": 0
}
}
}
1.3 mapping 增加数据
值一旦创建, 无法修改, 只能添加新值
如 tag 已经有了, 则无法修改其内容, 只能新增tags
POST /product/_doc/_mapping
{
"properties": {
"tags": {
"type": "text"
}
}
}
或者
POST /product
{
"mappings": {
"properties": {
"tags": {
"type": "text"
}
}
}
}
1.4 迁移数据
properties 里的具体值 一旦新建则无法修改
如果必须修改则要重建索引
需要新建 index 索引, 把之前的index 数据迁移到新的索引
获取当前 index 的结构
GET /product/_mapping
新建新的索引, 结构从上面复制进行修改
POST /newproduct
{
"mappings": {
"properties": {
"tags": {
"type": "text"
}
}
}
}
迁移
1.5 删除索引
DELETE product
2 文档
2.1 添加文档
PUT /product/_doc/1
{
"name" : "gaolujie yagao",
"desc" : "gaoxiao meibai",
"price" : 30,
"producer": "gaolujie producer",
"tags": [ "meibai", "fangzhu" ]
}
2.2 删除文档
DELETE /product/_doc/1
2.3 修改文档
局部修改
POST 方式 id后面跟着 /_update, 里面使用 doc 包裹数据
POST /product/_doc/1/_update
{
"doc": {
"price" : 50
}
}
// 7.4 版本, 现在是这样修改
POST /product/_update/1
{
"doc": {
"price": 50
}
}
全量修改
和添加时的代码结构是一样的, 如果数据和添加时的数据不一样, 不同的部门会删除掉
"price" : 30, 在这里就被删除了
PUT /product/_doc/1
{
"name" : "gaolujie yagao",
"desc" : "gaoxiao meibai",
"producer": "gaolujie producer",
"tags": [ "meibai", "fangzhu" ]
}
每次修改后,version会更改, 同一个文档连续多次删除, version也会累加
2.4 简单查询
2.4.1 查询全部
GET /product/_doc/_search
hits 查询到的数据信息
_score 是数据的匹配度
_source 是返回的数据的哪些字段, 默认全部(类似数据库的 * )
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 1,
"hits": [
{
"_index": "product",
"_type": "_doc",
"_id": "2",
"_score": 1,
"_source": {
"name": "gaolujie yagao",
"desc": "gaoxiao meibai",
"price": 30,
"producer": "gaolujie producer",
"tags": [
"meibai",
"fangzhu"
]
}
},
{
"_index": "product",
"_type": "_doc",
"_id": "1",
"_score": 1,
"_source": {
"name": "gaolujie yagao",
"desc": "gaoxiao meibai",
"price": 50,
"producer": "gaolujie producer",
"tags": [
"meibai",
"fangzhu"
]
}
}
]
}
}
2.4.2 判断数据是否存在
不存在返回404状态码
HEAD /product/_doc/11
存在返回200状态码
HEAD /product/_doc/1
2.4.3 定制返回的字段(_source) 多个用 , 逗号隔开
返回的_source结果只会有name,desc
GET /product/_doc/_search?_source=name,desc
3. 乐观锁并发控制
6.7 以前 使用version , 以后用 if_seq_no=2&if_primary_term=1
当给一个新增加的数据做更新操作时, 第一次更新可以完成, 因为version=1是当前版本号,
当第二次更新时, 由于版本号传还是1, 但是实际最新的已经是2了, 会报版本冲突错误.
改为最新的才会成功.
用于解决并发问题, 俩个客户端, 都传version=1, 当一个修改成功后, version为2了,
另一个就会更新失败
高版本es 把 version 换为 if_seq_no和if_primary_term
POST /product/_doc/1/_update?version=1
{
"doc": {
"price" : 51
}
}
对于if_primary_term记录的就是具体的哪个主分片,
而if_seq_no这个参数起的作用和旧版本中的_version是一样的
4. DSL 查询
4.1 term查询
term 不会把查询条件进行分词后查询, 作为一整个关键词去搜索
POST /shop/_doc/_search
{
"query":{
"term":{
"desc":"中国"
}
}
}
4.2 查询表达式分词搜索
是条件分词查询, 先把查询条件进行分词后查询
term 换成 match, 条件被分词了, 查询结果变了
POST /shop/_doc/_search
{
"query":{
"match":{
"desc":"中国"
}
}
}
4.3 多个词语匹配检索
相当于是tag标签查询, 所有带数组里其中一个词语的数据, 就会被查询到
POST /shop/_doc/_search
{
"query":{
"terms":{
"desc": ["中国", "学生"]
}
}
}
4.4 短语搜索
match_phrase的分词结果必须在text字段分词中都包含,而且顺序必须相同,而且必须且都是连续的
POST /shop/_doc/_search
{
"query" : {
"match_phrase" : {
"desc" : "导游坐飞机去海外旅游"
}
}
}
4.5 查询全部 match_all
POST /shop/_doc/_search
{
"query": {
"match_all": {}
},
"_source": ["id", "nickname", "age"]
}
4.6 使用过滤器的模糊查询
gte >=
gt >
lte <=
lt <
POST /shop/_doc/_search
{
"query" : {
"bool": {
"must": {
"match" : {
"nickname" : "飞翔"
}
},
"filter": {
"range" : {
"age" : { "gt" : 19 }
}
}
}
}
}
4.7 分页查询
from 起始查询索引
size 每次返回数量
POST /shop/_doc/_search
{
"query": {
"match_all": {}
},
"_source": [
"id",
"nickname",
"age"
],
"from": 2,
"size": 10,
"sort": ["age"]
}
4.8 match(operator)
"operator":
or:搜索内容分词后,只要存在一个词语匹配就展示结果
and:搜索内容分词后,都要满足词语匹配
POST /shop/_doc/_search
{
"query" : {
"match" : {
"desc" : {
"query": "学习慕课网",
"operator": "or"
}
}
}
}
minimum_should_match: 最低匹配精度,至少有[分词后的词语个数]x百分百,得出一个数据值取整。举个例子:当前属性设置为70,若一个用户查询检索内容分词后有10个词语,那么匹配度按照 10x70%=7,则desc中至少需要有7个词语匹配,就展示;若分词后有8个,则 8x70%=5.6,则desc中至少需要有5个词语匹配,就展示。
minimum_should_match 也能设置具体的数字,表示个数
POST /shop/_doc/_search
{
"query": {
"match": {
"desc": {
"query": "女友生日送我好玩的xbox游戏机",
"minimum_should_match": "60%"
}
}
}
}
4.9 ids查询
POST /shop/_doc/_search
{
"query": {
"ids": {
"type": "_doc",
"values": ["1001", "1010", "1008"]
}
}
}
4.10 multi_match
满足使用match在多个字段中进行查询的需求
POST /shop/_doc/_search
{
"query" : {
"multi_match" : {
"query": "慕课网",
"fields": [
"desc",
"nickname"
]
}
}
}
4.11 boost
权重, 为某个字段设置权重,权重越高,文档相关性得分就越高。通畅来说搜索商品名称要比商品简介的权重更高。
POST /shop/_doc/_search
{
"query": {
"multi_match": {
"query": "皮特帕克慕课网",
"fields": ["desc", "nickname^10"]
}
}
}
nickname^10 代表搜索提升10倍相关性,也就是说用户搜索的时候其实以这个nickname为主,desc为辅,nickname的匹配相关度当然要提高权重比例了。
- 学习地址
- MySQL
- 查询优化
- SQL优化
- 关于or、in、not in、!=等走不走索引的说明
- 千万级数据查询优化
- MySQL 深度分页问题
- 嵌套循环 Block Nested Loop 导致索引查询慢
- MySQL增加日志统计表优化各种日志表的统计功能
- MySQL单机读写QPS(性能)优化
- sqlMode 置 select 的值可以比 group 里的多
- drop、delete、truncate的区别
- 尚硅谷MySQL数据库高级学习笔记
- MySQL架构
- 事务部分
- MySQL知识点
- mysql索引
- Linux docker安装 mysql 8.0.25
- docker 安装mysql 5.7
- mysql Field ‘xxx’ doesn’t have a default value
- mysql多实例
- docker中的sql文件导入
- mysql进阶知识
- mysql字符集
- 连接的原理
- redo日志
- InnoDB存储引擎
- InnoDB的数据存储结构
- B+树索引
- 文件系统-表空间
- Buffer Pool
- 亿级数据导入到es
- MySQL数据复制
- MySQL缺少主键的表数据
- mysql update 其中更新的字段根据另一个更新字段作为条件去更新
- MySQL指定字段值排序(将指定值排在前面)
- 设置MySQL连接数、时区
- Navicat15右键删除数据刷新就又恢复了
- MySQL替换字段部分内容
- Java和MySQL统计本周本月本季和年
- 分页时order by 排序数据重复,丢失
- mysql同一张表根据某个字段删除重复数据
- mysqldump定时全量热备
- 专题总结
- 事务
- MySQL事务
- spring事务
- spring事务本类调用
- spring事务传播行为
- spring事务失效问题
- 锁和Transactional注解一块使用的问题
- 数据安全
- 敏感数据
- SQL注入
- 数据源
- XSS
- 接口设计
- 缓存设计
- 限流
- 自定义注解实现根据用户做QPS限流
- 架构
- 高可用
- Java
- Unsatisfied dependency expressed through field ‘baseMapper‘
- mybatisplus多数据源
- 单个字母前缀的java变量
- spring
- spring循环依赖解决
- 事务@Transactional
- yml 文件配置信息绑定到java工具类的静态变量上
- @Configuration @Component 区别
- springboot启动yml文件报错
- spring方法重试注解Retryable
- spring读取yml集合数据
- spring自定义注解
- 获取resource下的图片资源
- 手机号和电话号的正则验证
- 获取字符串中的数字
- mybatis
- mybatis多参数添加数据并返回主键
- 统一异常处理
- 分组校验
- Java读取Python json.dumps 函数保存的redis数据
- springboot整合springCache
- 若依mybatis值为null的字段没有返回
- 若依
- 接口白名单
- @JsonFormat时区问题
- RequestParam.value() was empty on parameter 0
- jdk8和hutool请求第三方的https报错
- springMVC
- springMVC与vue使用post传数组
- elementUI 时间组件报错问题
- vue具名插槽slot
- springboot配置maven的profiles(配置微服务多环境切换打包)
- resources 配置文件读取顺序
- Windows的cmd部署jar注意事项
- Java基础
- JUC(锁-并发-线程池)
- CAS
- Java 锁简介
- synchronized和Logk有什么区别?用新的ock有什么好处
- synchronized锁介绍
- CompletableFuture
- 多线程
- 线程池
- 集合类
- map见过的小问题
- 退出双层循环
- StringBuilder和StringBuffer核心区别
- 日志打印
- 打印log日志
- log日志文件生成配置
- 日期时间
- 时间戳转为时间
- 并发工具
- 连接池
- http调用
- 内网访问天地图
- 判等问题
- 数值计算
- null问题
- 异常处理
- 文件IO
- 序列化
- 内存溢出OOM
- 子线程的错误, 全局异常处理捕获不到
- vue同一个项目访问多个不同ip地址接口
- Autowired注解导入为null
- shiro
- UnavailableSecurityManagerException错误
- Windows服务器80端口被占用
- java图片增加水印
- springcloud
- Feign方法配置错误导致jar包启动失败
- feign调用超时
- 定时任务quartz
- JavaPOI导出Excel
- 合并行和列
- 设置样式
- 设置背景色
- docker
- Linux 安装
- docker命令
- docker网络
- docker数据卷
- dockerfile
- docker安装ping命令
- docker-compose
- docker-compose文件内容介绍
- Linux关闭docker开机启动
- jar打包为镜像
- 迁移docker容器存储位置
- Nginx
- Linux在线安装Nginx
- nginx.conf 核心配置文件
- vue 和 nginx 刷新页面会报404
- nginx 转发给三个集群的tomcat
- ServerName匹配规则
- Nginx负载均衡策略
- location 匹配规则
- Nginx 搭建前端调用后台接口的集群
- alias与root
- nginx 拦截 post 请求, 带参数转发到前端页面
- 防盗链配置
- Nginx的缓存
- 通用Nginx配置
- nginx配置文件服务器
- 后台jar包得不到正确ip,nginx代理时要处理
- 升级使用websocket协议
- 设置IP黑/白名单
- Redis
- 缓存数据一致性
- 内存淘汰策略
- Redis数据类型
- gmt6
- Linux安装GMT6
- GMT6配置中文
- GMT文件修改Windows版本到Linux版本
- 注意GMT不同字体导致符号不同的问题
- GMT绘制南海诸岛小图
- GMT生成中文图例
- elasticsearch
- 安装配置
- Linux安装配置elasticsearch7.6.2
- Linux 安装 kibana 7.6.2
- 安装7.6.2中文分词器
- docker 安装elasticsearch7.6.2
- 安装Logback7.6.2
- springboot使用
- 0. elasticsearch账号密码模式访问
- 1. 配置连接
- 2. 索引
- 3. 批量保存更新
- Result window is too large 10000
- elasticsearch 分词的字段做排序 fielddata, 设置fielddata=true 无效果
- elasticsearch 完全匹配查询(精确查询)
- 模糊搜索
- 日期区间查询
- 6.x基础知识
- 自定义词库
- elasticsearch集群
- 搜索推荐Suggester
- 查询es保存的数组
- 亿级mysql数据导入到es
- es 报错 ORBIDDEN/12/index read-only
- es核心概念
- es的分布式架构原理
- 优化大数据量时的ES查询性能
- canal
- 1. mysql的Binlog
- 2. Canal 的工作原理
- 3. canal同步es
- JVM
- 1 类的字节码
- 2. 类的加载
- JVM知识点
- Maven
- 依赖冲突
- xxl-job
- docker 安装配置 xxl-job
- idea
- springboot启动报错命令过长
- services统一启动微服务各模块
- 云服务器安装宝塔面板
- 突然出现启动或者运行特别慢
- 有导入依赖但是显示红色同时点击进去也有依赖
- Linux
- sh文件执行报错: command not found
- 使用vagrant安装虚拟机
- Linux 开启端口
- 开放端口
- 复制文件夹及其文件到另一个文件夹
- 两个服务器之间映射端口
- TCP协议
- 分层模型
- TCP概述
- 支撑 TCP 协议的基石 —— 首部字段
- 数据包大小对网络的影响 —— MTU 与 MSS 的奥秘
- 端口号
- 三次握手
- TCP 自连接
- 四次挥手
- TCP 头部时间戳
- 分布式
- 分布式脑裂问题
- 分布式事务
- 基础知识
- 实现分布式事务的方案
- 阿里分布式事务中间件seata
- 幂等性问题
- 其他工具
- webstorm git提交代码后project目录树不显示
- 消息队列
- 如何保证消费的顺序
- 数据结构
- 漫画算法:小灰的算法之旅