1.7.1: 创建索引

/**
* 创建索引
* */
@Test
public void createIndex(){
// 创建索引
CreateIndexResponse blog2 = client.admin().indices().prepareCreate("blog2").get();
System.out.println(blog2.toString()); }

默认创建好索引,mappings为空

1.7.2: 删除索引

/**
* 删除索引
* */
@Test
public void deleteIndex(){
// 删除索引
client.admin().indices().prepareDelete("blog2").get();
}

1.7.3:索引的映射操作

为什么要进行手动的映射?

在实际生产中经常会出现精度损失的现象,往往就是因为没有进行正确的索引映射或者压根就没进行索引映射
Elasticsearch最开始索引文档A,其中的一个字段是一个数字,是整数;通过自动类型猜测,并设置类型为整型(integer)或者长整型;
然后在索引另一个文档B,B文档在同一个字段中存储的是浮点型;那么这个时候elasticsearch就会把B文档中的小数删除,保留整数部分;
这样就会导致数据的不准确!

如果你习惯SQL数据库,或许知道,在存入数据前,需要创建模式来描述数据(schmal);尽管elasticsearch是一个无模式的搜索引擎,可以即时算出数据结构;

但是我们仍然认为由自己控制并定义结构是更好的;而且在实际的生产中,我们也是自己创建映射;

注意:注意创建mapping的时候,索引必须提前存在

{
"settings":{
"nshards":3,
"number_of_repli umber_of_cas":1
},
"mappings":{
"dahan":{
"dynamic":"strict",
"properties":{
"studentNo":{"type": "string", "store": true},
"name":{"type": "string","store": true,"index" : "analyzed","analyzer": "ik_max_word"},
"male":{"type": "string","store": true},
"age":{"type": "integer","store": true},
"birthday":{"type": "string","store": true},
"classNo":{"type": "string","store": true},
"address":{"type": "string","store": true,"index" : "analyzed","analyzer": "ik_max_word"},
"isLeader": {"type": "boolean", "index": "not_analyzed"}
}
}
}

1):创建索引

/**
* 创建索引
* */
@Test
public void createIndex(){
   
   CreateIndexResponse blog2 = client.admin().indices().prepareCreate("sanguo").get();
   System.out.println(blog2.toString());

}

2):通过代码创建索引配置信息(有错的情况)

/**
* Created by angel;
*/
public class CreateMappings {
   public static void main(String[] args) throws UnknownHostException {
       TransportClient client = null;
       Map<String, Integer> map = new HashMap<String, Integer>();
       map.put("number_of_shards", 3);
       map.put("number_of_replicas", 1);
       Settings settings = Settings.builder()
              .put("cluster.name", "cluster")
              .build();
       client = new PreBuiltTransportClient(settings)
              .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("hadoop01"), 9300));
       System.out.println("========连接成功=============");


       XContentBuilder builder = null;
       try {
           builder = jsonBuilder()
                  .startObject()
                  .startObject("dahan").field("dynamic", "true")
                  .startObject("properties")
                  .startObject("studentNo").field("type", "string").field("store", "yes").endObject()
                  .startObject("name").field("type", "string").field("store", "yes").field("analyzer", "ik_max_word").endObject()//.field("analyzer", "ik")
                  .startObject("male").field("type", "string").field("store", "yes").endObject()//.field("analyzer", "ik")
                  .startObject("age").field("type", "integer").field("store", "yes").endObject()
                  .startObject("birthday").field("type", "string").field("store", "yes").endObject()
                  .startObject("classNo").field("type", "string").field("store", "yes").endObject()
                  .startObject("address").field("type", "string").field("store", "yes").field("analyzer", "ik_max_word").endObject()
                  .startObject("isLeader").field("type", "boolean").field("store", "yes").field("index", "not_analyzed").endObject()
                  .endObject()
                  .endObject()
                  .endObject();
           PutMappingRequest mapping = Requests.putMappingRequest("sanguo")
                  .type("dahan")
                  .source(builder);
           UpdateSettingsRequest updateSettingsRequest = new UpdateSettingsRequest();
           updateSettingsRequest.settings(map);
           client.admin().indices().updateSettings(updateSettingsRequest).actionGet();
           client.admin().indices().putMapping(mapping).get();
      } catch (Exception e) {
           e.printStackTrace();
      }
  }
}

如果有同学学习的比较扎实,那么会记住以下内容:

当索引不存在的时候,可以指定副本数和分片数

当索引存在的时候,只能指定副本数

所以,我们在构建索引的时候就要指定确定的分片和副本:

1):创建索引的时候直接指定索引的shard数和副本数

/**
* 创建索引
* */
@Test
public void createIndex(){
   // 创建索引
   Map<String, Integer> map = new HashMap<String, Integer>();
   map.put("number_of_shards", 3);
   map.put("number_of_replicas", 1);
   CreateIndexResponse blog2 = client.admin().indices().prepareCreate("sanguo").setSettings(map).get();
   System.out.println(blog2.toString());

}

2):然后在创建映射信息的时候,就可以忽略掉分片数和副本数了。直接进行索引的映射:

/**
* Created by angel;
*/
public class CreateMappings {
   public static void main(String[] args) throws UnknownHostException {
       TransportClient client = null;
       Settings settings = Settings.builder()
              .put("cluster.name", "cluster")
              .build();
       client = new PreBuiltTransportClient(settings)
              .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("hadoop01"), 9300));
       System.out.println("========连接成功=============");


       XContentBuilder builder = null;
       try {
           builder = jsonBuilder()
                  .startObject()
                  .startObject("dahan").field("dynamic", "true")
                  .startObject("properties")
                  .startObject("studentNo").field("type", "string").field("store", "yes").endObject()
                  .startObject("name").field("type", "string").field("store", "yes").field("analyzer", "ik_max_word").endObject()//.field("analyzer", "ik")
                  .startObject("male").field("type", "string").field("store", "yes").endObject()//.field("analyzer", "ik")
                  .startObject("age").field("type", "integer").field("store", "yes").endObject()
                  .startObject("birthday").field("type", "string").field("store", "yes").endObject()
                  .startObject("classNo").field("type", "string").field("store", "yes").endObject()
                  .startObject("address").field("type", "string").field("store", "yes").field("analyzer", "ik_max_word").endObject()
                  .startObject("isLeader").field("type", "boolean").field("store", "yes").field("index", "not_analyzed").endObject()
                  .endObject()
                  .endObject()
                  .endObject();
           PutMappingRequest mapping = Requests.putMappingRequest("sanguo")
                  .type("dahan")
                  .source(builder);
           client.admin().indices().putMapping(mapping).get();
      } catch (Exception e) {
           e.printStackTrace();
      }
  }
}

es之java索引操作的更多相关文章

  1. ES入门三部曲:索引操作,映射操作,文档操作

    ES入门三部曲:索引操作,映射操作,文档操作 一.索引操作 1.创建索引库 #语法 PUT /索引名称 { "settings": { "属性名": " ...

  2. 008-elasticsearch5.4.3【二】ES使用、ES客户端、索引操作【增加、删除】、文档操作【crud】

    一.ES使用,以及客户端 1.pom引用 <dependency> <groupId>org.elasticsearch.client</groupId> < ...

  3. es之java分页操作

    按照一般的查询流程来说,如果我想查询前10条数据: · 1 客户端请求发给某个节点 · 2 节点转发给个个分片,查询每个分片上的前10条 · 3 结果返回给节点,整合数据,提取前10条 · 4 返回给 ...

  4. elasticsearch java 索引操作

    1.添加maven依赖 <dependency> <groupId>org.elasticsearch</groupId> <artifactId>el ...

  5. ElasticSearch 获取es信息以及索引操作

    检查集群的健康情况 GET /_cat/health?v green:每个索引的primary shard和replica shard都是active状态的yellow:每个索引的primary sh ...

  6. Elasticsearch必知必会的干货知识二:ES索引操作技巧

    该系列上一篇文章<Elasticsearch必知必会的干货知识一:ES索引文档的CRUD> 讲了如何进行index的增删改查,本篇则侧重讲解说明如何对index进行创建.更改.迁移.查询配 ...

  7. ElasticSearch+Kibana 索引操作

    ElasticSearch+Kibana 索引操作 一 前言 ElasticiSearch 简介 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引 ...

  8. ES系列十五、ES常用Java Client API

    一.简介 1.先看ES的架构图 二.ES支持的客户端连接方式 1.REST API http请求,例如,浏览器请求get方法:利用Postman等工具发起REST请求:java 发起httpClien ...

  9. 【ELK】4.spring boot 2.X集成ES spring-data-ES 进行CRUD操作 完整版+kibana管理ES的index操作

    spring boot 2.X集成ES 进行CRUD操作  完整版 内容包括: ============================================================ ...

随机推荐

  1. 函数 FUNCTION

    函数 FUNCTION 定义: 带名字的代码块,用于执行具体任务. 注意: 应给函数指定描述性名称,只是用小写字母和下划线. 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 (). 任何 ...

  2. stringstream istringstream ostringstream 三者的区别

    stringstream istringstream ostringstream 三者的区别 说明 ostringstream : 用于执行C风格字符串的输出操作. istringstream : 用 ...

  3. HTTP报文结构和内容(转)

    HTTP请求报文格式就如下图所示: 1. 请求报文 一个HTTP请求报文由请求行(request line).请求头部(header).空行和请求数据4个部分组成. 大致结构是这样的: <req ...

  4. C#多线程下更新UI的几种方法

    1. 使用UI线程的SynchronizationContext的Post/Send方法,这种情况一般在窗体构造函数或者FormLoad中获取同步上下文: 范例: public partial cla ...

  5. linux中文件权限格式与chmod命令以及用户和用户组的管理

    简单了解一下linux中的文件权限格式与chmod命令 chmod命令:改变文件或者目录的权限 格式:chmod [参数] [<权限范围><符号><权限代码>] - ...

  6. Cookie&Session笔记

    # 今日内容     1. 会话技术         1. Cookie         2. Session     2. JSP:入门学习 ## 会话技术     1. 会话:一次会话中包含多次请 ...

  7. mv - 移动 (改名) 文件

    摘要 mv [选项]... 源文件 目标文件 mv [选项]... 源文件... 目录 mv [选项]... --target-directory=DIRECTORY SOURCE... 描述 改“源 ...

  8. CSRF拦截

    CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF. 事实上 ...

  9. 小程序里的自定义组件:组件的外部样式externalClasses的使用

    启用外部样式: 自定义组件: v-tag 在html 引入 在组件写外部样式的css : .ex-tag { background-color: #fffbdd ; } 在组件使用该外部的样式 这个时 ...

  10. redis面试题集錦

    1为什么Redis需要把所有数据放到内存中? Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘.所以Redis具有快速和数据持久化的特性.如果不将数据放到内存中,磁盘 ...