ElasticSearch重建/创建/删除索引操作 - 第501篇

历史文章(文章累计500+)
《国内最全的Spring Boot系列之一》
《国内最全的Spring Boot系列之二》
《国内最全的Spring Boot系列之三》
《国内最全的Spring Boot系列之四》
《国内最全的Spring Boot系列之五》
《国内最全的Spring Boot系列之六》
Elasticsearch可视化平台Kibana [ES系列] - 第498篇
Elasticsearch安装分词插件[ES系列] - 第499篇
ElasticSearch扫盲概念篇[ES系列] - 第500篇
导读
Hi,大家好,我是悟纤。我就是我,不一样的烟火。我就是我,与众不同的小苹果。
这一节来看看ES的索引的基本操作 – 增删改查。
一、索引操作
1.1 创建索引
格式: PUT /索引名称
索引命名规范:
·以小写英文字母命名索引
·不要使用驼峰命名法则
·如过出现多个单词的索引名称,以全小写 + 下划线分隔的方式:如test_index。
ES 索引创建成功之后,以下属性将不可修改
·索引名称
·主分片数量
·字段类型
举例说明:
#创建索引PUT /es_db

1.2查询索引
格式: GET /索引名称
#查询索引GET /es_db

1.3删除索引
格式: DELETE /索引名称
DELETE /es_db
二、设置 Settings
创建索引的时候指定 settings
<span style="color:#333333"><span style="background-color:#fafafa"><code>PUT <index_name></code><code>{</code><code> <span style="color:#dd1144">"settings"</span>: {}</code><code>}</code><code></code></span></span>
创建索引时可以设置分片数和副本数
<span style="color:#333333"><span style="background-color:#fafafa"><code><span style="color:#afafaf"><em>#创建索引es_db,指定其主分片数量为 3,每个主分片的副本数量为 2</em></span></code><code>PUT /es_db</code><code>{</code><code> <span style="color:#dd1144">"settings"</span>: {</code><code> <span style="color:#dd1144">"number_of_shards"</span>: 3,</code><code> <span style="color:#dd1144">"number_of_replicas"</span>: 2</code><code> }</code><code>}</code><code></code></span></span>
说明:
(1)静态索引设置:只能在创建索引时或在关闭状态的索引上设置。
- index.number_of_shards:索引的主分片的个数,默认为 1,此设置只能在创建索引时设置。
(2)动态索引设置:即可以使用 _setting API 在实时修改的配置项。
- index.number_of_replicas:每个主分片的副本数。默认为 1,允许配置为 0。
- index.refresh_interval:执行刷新操作的频率,默认为1s. 可以设置 -1 为禁用刷新。
- index.max_result_window:from + size 搜索此索引 的最大值,默认为 10000。
使用 _setting 只能修改允许动态修改的配置项
<span style="color:#333333"><span style="background-color:#fafafa"><code><span style="color:#afafaf"><em>#修改索引配置,把每个主分片的副本数量修改为 1</em></span></code><code>PUT /es_db/_settings</code><code>{</code><code><span style="color:#dd1144">"index"</span> : {</code><code><span style="color:#dd1144">"number_of_replicas"</span> : 1</code><code>}</code><code>}</code><code></code></span></span>
创建索引时可以指定IK分词器作为默认分词器
<span style="color:#333333"><span style="background-color:#fafafa"><code>PUT /es_db</code><code>{</code><code> <span style="color:#dd1144">"settings"</span> : {</code><code> <span style="color:#dd1144">"index"</span> : {</code><code> <span style="color:#dd1144">"analysis.analyzer.default.type"</span>: <span style="color:#dd1144">"ik_max_word"</span></code><code> }</code><code> }</code><code>}</code><code></code></span></span>
三、设置文档映射Mapping
ES 中的 mapping 有点类似与关系数据库中表结构的概念,在 MySQL 中,表结构里包含了字段名称,字段的类型还有索引信息等。在 Mapping 里也包含了一些属性,比如字段名称、类型、字段使用的分词器、是否评分、是否创建索引等属性,并且在 ES 中一个字段可以有多个类型。ES中Mapping可以分为动态映射和静态映射。
<span style="color:#333333"><span style="background-color:#fafafa"><code><span style="color:#afafaf"><em>#查看完整的索引 mapping</em></span></code><code>GET <span style="color:#dd1144">/<index_name>/_mappings</span></code><code></code><code><span style="color:#afafaf"><em>#查看索引中指定字段的 mapping</em></span></code><code>GET <span style="color:#dd1144">/<index_name>/_mappings/field/<field_name></span></code><code></code></span></span>
mapping 的使用禁忌
·ES 没有隐式类型转换
·ES 不支持类型修改
·生产环境尽可能的避免使用 动态映射(dynamic mapping)
3.1动态映射
在关系数据库中,需要事先创建数据库,然后在该数据库下创建数据表,并创建表字段、类型、长度、主键等,最后才能基于表插入数据。而Elasticsearch中不需要定义Mapping映射,在文档写入Elasticsearch时,会根据文档字段自动识别类型,这种机制称之为动态映射。

示例:
<span style="color:#333333"><span style="background-color:#fafafa"><code><span style="color:#afafaf"><em>#删除原索引</em></span></code><code><span style="color:#ca7d37">DELETE</span> /<span style="color:#ca7d37">user</span></code><code></code><code><span style="color:#afafaf"><em>#创建文档(ES根据数据类型, 会自动创建映射)</em></span></code><code>PUT /<span style="color:#ca7d37">user</span>/_doc/<span style="color:#0e9ce5">1</span></code><code>{</code><code> <span style="color:#dd1144">"name"</span>: <span style="color:#dd1144">"fox"</span>,</code><code> <span style="color:#dd1144">"age"</span>: <span style="color:#0e9ce5">32</span>,</code><code> <span style="color:#dd1144">"address"</span>:<span style="color:#dd1144">"长沙麓谷"</span></code><code>}</code><code></code><code><span style="color:#afafaf"><em>#获取文档映射</em></span></code><code><span style="color:#ca7d37">GET</span> /<span style="color:#ca7d37">user</span>/_mapping</code><code></code></span></span>

3.2静态映射
静态映射也叫做显式映射,即:在索引文档写入之前,人为创建索引并且指定索引中每个字段类型、分词器等参数。
<span style="color:#333333"><span style="background-color:#fafafa"><code>PUT /user</code><code>{</code><code> <span style="color:#dd1144">"settings"</span>: {</code><code> <span style="color:#dd1144">"number_of_shards"</span>: <span style="color:#dd1144">"1"</span>,</code><code> <span style="color:#dd1144">"number_of_replicas"</span>: <span style="color:#dd1144">"1"</span></code><code> },</code><code> <span style="color:#dd1144">"mappings"</span>: {</code><code> <span style="color:#dd1144">"properties"</span>: {</code><code> <span style="color:#dd1144">"name"</span>: {</code><code> <span style="color:#dd1144">"type"</span>: <span style="color:#dd1144">"keyword"</span></code><code> },</code><code> <span style="color:#dd1144">"age"</span> : {</code><code> <span style="color:#dd1144">"type"</span> : <span style="color:#dd1144">"long"</span></code><code> },</code><code> <span style="color:#dd1144">"address"</span> : {</code><code> <span style="color:#dd1144">"type"</span> : <span style="color:#dd1144">"text"</span></code><code> }</code><code> }</code><code> }</code><code>}</code><code></code></span></span>

3.3常用Mapping参数配置
| 参数名称 | 释义 |
| analyzer | 指定分析器,只有 text 类型字段支持。 |
| copy_to | 该参数允许将多个字段的值复制到组字段中,然后可以将其作为单个字段进行查询 |
| dynamic | 控制是否可以动态添加新字段,支持以下四个选项: true:(默认)允许动态映射 false:忽略新字段。这些字段不会被索引或搜索,但仍会出现在_source返回的命中字段中。这些字段不会添加到映射中,必须显式添加新字段。 runtime:新字段作为运行时字段添加到索引中,这些字段没有索引,是_source在查询时加载的。 strict:如果检测到新字段,则会抛出异常并拒绝文档。必须将新字段显式添加到映射中。 |
| doc_values | 为了提升排序和聚合效率,默认true,如果确定不需要对字段进行排序或聚合,也不需要通过脚本访问字段值,则可以禁用doc值以节省磁盘空间(不支持 text 和 annotated_text) |
| eager_global_ordinals | 用于聚合的字段上,优化聚合性能。 |
| enabled | 是否创建倒排索引,可以对字段操作,也可以对索引操作,如果不创建索引,任然可以检索并在_source元数据中展示,谨慎使用,该状态无法修改。 |
| fielddata | 查询时内存数据结构,在首次用当前字段聚合、排序或者在脚本中使用时,需要字段为fielddata数据结构,并且创建倒排索引保存到堆中 |
| fields | 给 field 创建多字段,用于不同目的(全文检索或者聚合分析排序) |
| format | 用于格式化代码,如 "data":{ "type": "data", "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" } |
| index | 是否对创建对当前字段创建倒排索引,默认 true,如果不创建索引,该字段不会通过索引被搜索到,但是仍然会在 source 元数据中展示。 |
| norms | 是否禁用评分(在filter和聚合字段上应该禁用) |
| null_value | 为 null 值设置默认值 |
| search_analyzer | 设置单独的查询时分析器 |
示例:
- index: 控制当前字段是否被索引,默认为true。如果设置为false,该字段不可被搜索
<span style="color:#333333"><span style="background-color:#fafafa"><code><span style="color:#ca7d37">DELETE</span> /<span style="color:#ca7d37">user</span></code><code>PUT /<span style="color:#ca7d37">user</span></code><code>{</code><code> <span style="color:#dd1144">"mappings"</span> : {</code><code> <span style="color:#dd1144">"properties"</span> : {</code><code> <span style="color:#dd1144">"address"</span> : {</code><code> <span style="color:#dd1144">"type"</span> : <span style="color:#dd1144">"text"</span>,</code><code> <span style="color:#dd1144">"index"</span>: <span style="color:#0e9ce5">false</span></code><code> },</code><code> <span style="color:#dd1144">"age"</span> : {</code><code> <span style="color:#dd1144">"type"</span> : <span style="color:#dd1144">"long"</span></code><code> },</code><code> <span style="color:#dd1144">"name"</span> : {</code><code> <span style="color:#dd1144">"type"</span> : <span style="color:#dd1144">"text"</span></code><code> }</code><code> }</code><code> }</code><code>}</code><code></code><code>PUT /<span style="color:#ca7d37">user</span>/_doc/<span style="color:#0e9ce5">1</span></code><code>{</code><code> <span style="color:#dd1144">"name"</span>:<span style="color:#dd1144">"fox"</span>,</code><code> <span style="color:#dd1144">"address"</span>:<span style="color:#dd1144">"广州白云山公园"</span>,</code><code> <span style="color:#dd1144">"age"</span>:<span style="color:#0e9ce5">30</span></code><code>}</code><code></code><code><span style="color:#ca7d37">GET</span> /<span style="color:#ca7d37">user</span></code><code></code><code><span style="color:#ca7d37">GET</span> /<span style="color:#ca7d37">user</span>/_search</code><code>{</code><code> <span style="color:#dd1144">"query"</span>: {</code><code> <span style="color:#dd1144">"match"</span>: {</code><code> <span style="color:#dd1144">"address"</span>: <span style="color:#dd1144">"广州"</span></code><code> }</code><code> }</code><code>}</code><code></code></span></span>

四、使用ReIndex重建索引
具体方法:
具体方法:
1)如果要推倒现有的映射, 你得重新建立一个静态索引
2)然后把之前索引里的数据导入到新的索引里
3)删除原创建的索引
4)为新索引起个别名, 为原索引名
通过这几个步骤可以实现了索引的平滑过渡,并且是零停机
<span style="color:#333333"><span style="background-color:#fafafa"><code><span style="color:#afafaf"><em># 1. 重新建立一个静态索引</em></span></code><code>PUT /user2</code><code>{</code><code> <span style="color:#dd1144">"mappings"</span>: {</code><code> <span style="color:#dd1144">"properties"</span>: {</code><code> <span style="color:#dd1144">"name"</span>: {</code><code> <span style="color:#dd1144">"type"</span>: <span style="color:#dd1144">"text"</span></code><code> },</code><code> <span style="color:#dd1144">"address"</span>: {</code><code> <span style="color:#dd1144">"type"</span>: <span style="color:#dd1144">"text"</span>,</code><code> <span style="color:#dd1144">"analyzer"</span>: <span style="color:#dd1144">"ik_max_word"</span></code><code> }</code><code> }</code><code> }</code><code>}</code><code></code><code><span style="color:#afafaf"><em># 2. 把之前索引里的数据导入到新的索引里</em></span></code><code>POST _reindex</code><code>{</code><code> <span style="color:#dd1144">"source"</span>: {</code><code> <span style="color:#dd1144">"index"</span>: <span style="color:#dd1144">"user"</span></code><code> },</code><code> <span style="color:#dd1144">"dest"</span>: {</code><code> <span style="color:#dd1144">"index"</span>: <span style="color:#dd1144">"user2"</span></code><code> }</code><code>}</code><code><span style="color:#afafaf"><em># 3. 删除原创建的索引</em></span></code><code>DELETE /user</code><code><span style="color:#afafaf"><em># 4. 为新索引起个别名, 为原索引名</em></span></code><code>PUT /user2/_alias/user</code><code></code><code>GET /user</code><code></code></span></span>
我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。
à悟纤学院:https://t.cn/Rg3fKJD
学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!
SpringBoot视频:http://t.cn/A6ZagYTi
SpringBoot交流平台:https://t.cn/R3QDhU0
SpringSecurity5.0视频:http://t.cn/A6ZadMBe
ShardingJDBC分库分表:http://t.cn/A6ZarrqS
分布式事务解决方案:http://t.cn/A6ZaBnIr
JVM内存模型调优实战:http://t.cn/A6wWMVqG
Spring入门到精通:https://t.cn/A6bFcDh4
大话设计模式之爱你:https://dwz.cn/wqO0MAy7
相关文章:
ElasticSearch重建/创建/删除索引操作 - 第501篇
历史文章(文章累计500) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 E…...
数据写入HBase(scala)
package sourceimport org.apache.hadoop.hbase.{HBaseConfiguration, TableName} import org.apache.hadoop.hbase.client.{ConnectionFactory, Put} import org.apache.hadoop.hbase.util.Bytesobject ffff {def main(args: Array[String]): Unit {//hbase连接配置val conf …...
Codeforces Round 799 (Div. 4)
目录 A. Marathon B. All Distinct C. Where’s the Bishop? D. The Clock E. Binary Deque F. 3SUM G. 2^Sort H. Gambling A. Marathon 直接模拟 void solve() {int ans0;for(int i1;i<4;i) {cin>>a[i];if(i>1&&a[i]>a[1]) ans;}cout<&l…...
为什么要用云手机养tiktok账号
在拓展海外电商市场的过程中,许多用户选择采用tiktok短视频平台引流的策略,以提升在电商平台上的流量,吸引更多消费者。而要进行tiktok引流,养号是必不可少的一个环节。tiktok云手机成为实现国内跨境养号的一种有效方式࿰…...
vue pc端网页实现自适应
一、基本原理 pc端做自适应可以用rem来实现,啥是rem,自己百度 二、新建rem.ts文件 // rem等比适配配置文件 // 基准大小 const baseSize 14 // 设置 rem 函数 function setRem () {// 当前页面宽度相对于 1920宽的缩放比例,可根据自己需要…...
Android 13以上版本读写SD卡权限适配
如题,最近工作上处理的问题,把解决方案简单逻列出来,供有需要的朋友参考之 解决方案: 1、配置权限 <uses-permission android:name"android.permission.READ_MEDIA_IMAGES" /><uses-permission android:name&q…...
并查集模板:食物链详解
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public class Main {static int N 50010;static int n,m; //n个动物,m局判断static int[] p new int[N]; //p[i]是i的根节点static int[] d new int[N]; //d[i]表示i到…...
使用WAF防御网络上的隐蔽威胁之反序列化攻击
什么是反序列化 反序列化是将数据结构或对象状态从某种格式转换回对象的过程。这种格式通常是二进制流或者字符串(如JSON、XML),它是对象序列化(即对象转换为可存储或可传输格式)的逆过程。 反序列化的安全风险 反…...
05. 交换机的基本配置
文章目录 一. 初识交换机1.1. 交换机的概述1.2. Ethernet_ll格式1.3. MAC分类1.4. 冲突域1.5. 广播域1.6. 交换机的原理1.7. 交换机的3种转发行为 二. 初识ARP2.1. ARP概述2.2. ARP报文格式2.3. ARP的分类2.4. 免费ARP的作用 三. 实验专题3.1. 实验1:交换机的基本原…...
yolo将标签数据打到原图上形成目标框
第一章 目标:为了查看自己在标注标签时是否准确,写了这段代码来将标注的框打到原图上 第二章 步骤:进行反归一化得到坐标画出矩形框 第二行是目标图片对应的txt,第三行是目标图片 第三章 全部代码如下: import cv2 import …...
002-00-02【大红ai源码】dolphinscheduler3.2.0 源码环境搭建------by孤山村头王大爷家女儿大红
【ai阅读源码-dolphinscheduler】 DolphinScheduler 开发手册1、软件要求2、克隆代码库3、编译打包4、代码风格5、新建数据库,导入元数据。6, 启动后端6.1 启动api-server 6.2 启动master-server6.3 启动worker-server 7 启动前端 DolphinScheduler 开发…...
python-自动化篇-运维-监控-如何使⽤Python处理和解析⽇志⽂件?-实操记录
文章目录 1. 选择日志文件格式: 确定要处理的日志文件的格式。不同的日志文件可能具有不同的格式,如文本日志、CSV、JSON、XML等。了解日志文件的格式对解析⾮常重要。2. 打开日志文件: 使⽤Python的文件操作功能打开日志文件,以便…...
代码随想录算法训练营DAY6 | 哈希表(1)
DAY5休息一天,今天重启~ 哈希表理论基础:代码随想录 Java hash实现 :java 哈希表-CSDN博客 一、LeetCode 242 有效的字母异位词 题目链接:242.有效的字母异位词 思路:设置字典 class Solution {public boolean isAnag…...
【嵌入式学习】C++QT-Day3-C++基础
笔记 见我的博客:https://lingjun.life/wiki/EmbeddedNote/19Cpp 作业 设计一个Per类,类中包含私有成员:姓名、年龄、指针成员身高、体重,再设计一个Stu类,类中包含私有成员:成绩、Per类对象p1,设计这两个类的构造函…...
表贴式PMSM的直接转矩控制(DTC)MATLAB仿真模型
微❤关注“电气仔推送”获得资料(专享优惠) 模型简介 表贴式PMSM的直接转矩控制(DTC),直接使用滞环控制对转矩和磁链进行控制,相对于传统的FOC控制而言,其不需要进行解耦变换,在此次的有以下几点需要注意:…...
详解OpenHarmony各部分文件在XR806上的编译顺序
大家好,今天我们来谈一谈编程时一个很有趣的话题——编译顺序。我知道,一提到编译可能大家会感到有点儿头疼,但请放心,我不会让大家头疼的。我们要明白,在开始写代码之前,了解整个程序的编译路径是十分有必…...
【美团】无人机-大数据开发工程师
更新时间:2024/01/29 工作地点:北京市 事业群:到家事业群 工作经验:3年 部门介绍 为了更好地提升城市即时配送的效率与体验,美团于2017年启动了无人机配送服务的探索,通过科技创新推动履约工具变革&#x…...
微服务系统设计:横向扩展和纵向扩展的对比
微服务扩展性:水平扩展 vs 垂直扩展 特点水平扩展垂直扩展扩展单位增加微服务实例增加单个实例的资源 (CPU,内存)方向向外,增加节点向上,增加单个节点的资源复杂性随着实例数量的增加,管理难度更大管理更简单…...
Java基于SpringBoot+Vue的网上超市管理系统
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
HTTP中POST、GET、PUT、DELETE方式的区别
GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改、增加数据,不会影响资源的内容,即该请求不会产生副作用。无论进行多少次操作&#x…...
Vue3-DateTime-Picker:如何构建现代化的Vue 3日期时间选择器解决方案?
Vue3-DateTime-Picker:如何构建现代化的Vue 3日期时间选择器解决方案? 【免费下载链接】vue3-date-time-picker Datepicker component for Vue 3 项目地址: https://gitcode.com/gh_mirrors/vu/vue3-date-time-picker Vue3-DateTime-Picker作为基…...
使用Proteus进行电路仿真:为HunyuanVideo-Foley生成电子音效提供灵感
使用Proteus进行电路仿真:为HunyuanVideo-Foley生成电子音效提供灵感 1. 引言:当电路仿真遇上AI音效生成 想象一下,你正在为一款科幻游戏设计音效。传统的音效库已经用腻了,想要一些真正独特、带有"电路感"的声音效果…...
Visio网络拓扑图绘制实战:从基础操作到高级定制
1. Visio网络拓扑图绘制入门指南 第一次接触Visio画网络拓扑图时,我也被那些复杂的图标和连接线搞得头晕眼花。但用顺手后发现,这玩意儿比PS简单多了,就像用Word画图一样自然。先说说最基础的准备工作:安装Visio时记得勾选"网…...
为什么 CFO 总在年底为固定资产失眠?一位 IT 运维的亲历复盘
上个月,我作为外部顾问,去一家年营收5亿的科技公司做系统健康检查。刚进机房,IT主管就苦笑:“我们的 ERP 里有 1200 台设备,但仓库扫码只扫出 780 台——剩下的,要么‘失踪’,要么重复录入了三次…...
STEP3-VL-10B真实案例分享:数学题图解、文档OCR、GUI定位全演示
STEP3-VL-10B真实案例分享:数学题图解、文档OCR、GUI定位全演示 1. 模型简介与核心能力 STEP3-VL-10B是阶跃星辰(StepFun)开源的轻量级多模态基础模型,拥有10B参数量,在视觉感知、复杂推理和人类对齐能力方面表现出色…...
别再手动配环境了!用Docker Compose一键部署GeoServer,5分钟搞定TIF影像发布
5分钟极速部署GeoServer:Docker Compose全自动化实战指南 每次新项目启动都要重复配置GeoServer?还在为环境变量和端口冲突头疼?GIS开发中最耗时的从来不是业务逻辑,而是这些本该自动化的基础设施搭建。今天我们就用Docker Compo…...
顶会新趋势!GNN结合因果推断,发一区轻轻松松!
因果推断与图神经网络的协同融合,正成为破解图模型可靠性不足、提升泛化能力的核心方向,在图表示学习、企业决策、社交网络分析等领域快速崛起。GNN擅长建模图结构关联,却多聚焦统计关系,难以捕捉真实因果逻辑、易受混杂因素影响&…...
OpenClaw+Qwen3.5-4B-Claude:3个提升开发效率的自动化技巧
OpenClawQwen3.5-4B-Claude:3个提升开发效率的自动化技巧 1. 为什么开发者需要OpenClaw? 作为一名长期奋战在代码一线的开发者,我一直在寻找能够真正减轻重复劳动的工具。直到遇到OpenClaw与Qwen3.5-4B-Claude的组合,才发现原来…...
解决Mac视频预览难题:QuickLookVideo工具的创新方案
解决Mac视频预览难题:QuickLookVideo工具的创新方案 【免费下载链接】QuickLookVideo This package allows macOS Finder to display thumbnails, static QuickLook previews, cover art and metadata for most types of video files. 项目地址: https://gitcode.…...
3个终极窗口隐藏技巧:如何用Boss-Key打造你的数字隐身衣
3个终极窗口隐藏技巧:如何用Boss-Key打造你的数字隐身衣 【免费下载链接】Boss-Key 老板来了?快用Boss-Key老板键一键隐藏静音当前窗口!上班摸鱼必备神器 项目地址: https://gitcode.com/gh_mirrors/bo/Boss-Key 你有没有经历过这样的…...
