ElasticSearch 6.x基本操作(阿里云ES实例)

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 使用java操作elasticsearch

 服务搭建

阿里云可以1块钱包月:1元开通ELK            购买的时候要注意版本,活动什么时候结束就不知道了,配置也很简单,就不介绍了,不懂的可以评论问我

image.gifes1.png

es2.png

创建索引并指定数据结构相关解析

以下是在kibana中使用的,记住这种结构,也方便后面使用java来操作时更好理解相关代码。

###创建索引,指定数据结构
PUT /book
{
  "settings": {
  ###分片数
    "number_of_shards": 5,
  ###备份数
    "number_of_replicas": 1
  },
  ###指定数据结构
  "mappings": {
   ###类型  Type
    "novel":{
   ### Field
      "properties":{
    ###Field 属性名
        "name":{
###类型
          "type": "text",
###指定分词器
          "analyzer": "ik_max_word",
###指定当前Field可以被作为查询条件   默认值true
          "index": true,
###是否需要额外存储  默认值false
          "store": false
        },
        "author":{
          "type": "keyword"
        },
        "onSale":{
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss"
        },
        "descr":{
          "type": "text",
          "analyzer": "ik_max_word"
        }
      }
    }
  }
}

image.gif

image.gifes3.png


JAVA操作Elasticsearch

RestHighLevelClient方式

pom.xml

<!-- elasticsearch -->
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.5.4</version>
        </dependency>
        <!-- elasticsearch-rest-high-level-client -->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>6.5.4</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>compile</scope>
        </dependency>

image.gif

es4.png

ESClient

public class ESClient {
    public static RestHighLevelClient client = null;
    public static RestHighLevelClient getClient(){
        //不需要用户名和密码的认证
        //client = new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1", "9200", "http")));
        //需要用户名和密码的认证
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("账号", "密码"));
        RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost("如果使用阿里云实例,这里填公网地址", 9200, "http"))
                .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                    @Override
                    public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpAsyncClientBuilder) {
                        return httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                    }
                });
        client = new RestHighLevelClient(restClientBuilder);
        return client;
    }
}

image.gif

对索引的基本操作

在DemoOne中是对索引的一些基本操作,这里需要注意根据操作的不同,获取的request对象是不同的

import com.example.esdemo.utils.ESClient;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.admin.indices.get.GetIndexRequest;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.json.JsonXContent;
import org.junit.Test;
import java.io.IOException;
/**
 * 操作索引
 */
public class DemoOne {
    RestHighLevelClient client = ESClient.getClient();
    String index = "person";
    String type = "man";
    /**
     * 创建索引
     * @throws IOException
     */
    @Test
    public void createIndex() throws IOException {
        //准备关于索引的settings
        Settings.Builder settings = Settings.builder()
                .put("number_of_shards",3)
                .put("number_of_replicas",1);
        //准备关于索引的结构mappings
        //这里的startObject()  endObject()相当于{}   是成对出现的
        XContentBuilder mappings = JsonXContent.contentBuilder()
                .startObject()
                .startObject("properties")
                .startObject("name")
                .field("type","text")
                .endObject()
                .startObject("age")
                .field("type","integer")
                .endObject()
                .startObject("birthday")
                .field("type","date")
                .field("format","yyyy-MM-dd")
                .endObject()
                .endObject()
                .endObject();
        //把settings和mappings封装到一个Request对象中
        CreateIndexRequest request = new CreateIndexRequest(index)
                .settings(settings)
                .mapping(type,mappings);
        //通过client对象去连接es并执行创建索引
        CreateIndexResponse indexResponse = client.indices().create(request, RequestOptions.DEFAULT);
        System.out.println(indexResponse.toString());
    }
    /**
     * 检查索引是否存在
     * @throws IOException
     */
    @Test
    public void exists() throws IOException {
        //获取request对象
        GetIndexRequest request = new GetIndexRequest();
        //设置索引
        request.indices(index);
        boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
        System.out.println("是否存在:"+exists);
    }
    /**
     * 删除索引
     * @throws IOException
     */
    @Test
    public void delete() throws IOException {
        DeleteIndexRequest request = new DeleteIndexRequest();
        request.indices(index);
        AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
        System.out.println(response.isAcknowledged());
    }
}

image.gif

对文档的基本操作

这里先贴出Person类

public class Person {
    @JsonIgnore
    private Integer id;
    private String name;
    private Integer age;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date birthday;
    public Person() {
    }
    public Person(Integer id, String name, Integer age, Date birthday) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.birthday = birthday;
    }
getter()....setter()....
}

image.gif

文档的增删改

/**
 * 操作文档
 */
public class DemoTwo {
    ObjectMapper mapper = new ObjectMapper();
    RestHighLevelClient client = ESClient.getClient();
    String index = "person";
    String type = "man";
    /**
     * 创建文档
     * @throws IOException
     */
    @Test
    public void createDoc() throws IOException {
        //准备一个json数据
        Person person = new Person(1,"张三",25,new Date());
        //序列化成json字符串
        String json = mapper.writeValueAsString(person);
        //准备request对象(手动指定id)
        IndexRequest request = new IndexRequest(index,type,person.getId().toString());
        request.source(json, XContentType.JSON);
        //通过client执行添加
        IndexResponse response = client.index(request, RequestOptions.DEFAULT);
        //返回结果
        System.out.println(response.getResult().toString());
    }
    /**
     * 修改文档
     */
    @Test
    public void updateDoc() throws IOException {
        //创建一个Map,指定需要修改的内容
        Map<String,Object> doc = new HashMap<>();
        doc.put("name","李晓明");
        //在创建时指定了id是1
        String docId = "1";
        //创建request对象,封装数据
        UpdateRequest request = new UpdateRequest(index, type, docId);
        request.doc(doc);
        //通过client对象去执行
        UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
        //输出返回结果
        System.out.println(response.getResult().toString());
    }
    /**
     * 删除文档
     * @throws IOException
     */
    @Test
    public void deleteDoc() throws IOException {
        String docId = "1";
        DeleteRequest request = new DeleteRequest(index, type, docId);
        DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
        System.out.println(response.getResult().toString());
    }
}

image.gif

image.gifes5.png

但是一个一个太慢了,来看一下批量操作文档,还是在Demo2中测试

/**
     * 批量创建文档
     */
    @Test
    public void bulkCreateDoc() throws IOException {
        //准备数据
        Person p1 = new Person(1,"李四",23,new Date());
        Person p2 = new Person(2,"王五",24,new Date());
        Person p3 = new Person(3,"麻溜",25,new Date());
        ArrayList<Person> list = new ArrayList<>();
        list.add(p1);
        list.add(p2);
        list.add(p3);
        //创建request,把准备好的数据封装进去
        BulkRequest bulkRequest = new BulkRequest();
        list.forEach(item -> {
            try {
                String json = mapper.writeValueAsString(item);
                bulkRequest.add(new IndexRequest(index,type,item.getId().toString()).source(json,XContentType.JSON));
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        });
        //用client执行
        BulkResponse response = client.bulk(bulkRequest, RequestOptions.DEFAULT);
        //输出返回结果
        System.out.println(response.toString());
    }
 /**
     * 批量删除文档
     * @throws IOException
     */
    @Test
    public void bulkDeleteDoc() throws IOException {
        BulkRequest bulkRequest = new BulkRequest();
        bulkRequest.add(new DeleteRequest(index,type,"1"));
        bulkRequest.add(new DeleteRequest(index,type,"2"));
        BulkResponse response = client.bulk(bulkRequest, RequestOptions.DEFAULT);
        System.out.println(response.toString());
    }

image.gif

image.gifes6.png


ElasticSearch的各种查询  单独放在下一篇记录

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
8天前
|
存储 弹性计算 编解码
阿里云服务器通用型g8a实例最新收费标准与性能介绍
阿里云ECS通用型g8a服务器采用阿里云全新CIPU架构,可提供稳定的算力输出、更强劲的I/O引擎以及芯片级的安全加固。ECS通用型g8a实例支持开启或关闭超线程配置,单台g8a实例最高支持100万IOPS。阿里云ECS通用型g8a实例CPU采用AMD EPYCTM Genoa处理器,主频2.7 GHz,睿频最高3.7 GHz,计算性能稳定。本文为大家介绍通用型g8a实例最新收费标准及性能。
阿里云服务器通用型g8a实例最新收费标准与性能介绍
|
6天前
|
存储 缓存 网络协议
阿里云服务器通用型g7与通用型g8y实例深度对比及选择参考
在阿里云提供的各种通用型实例规格中,通用型g7和通用型g8y实例因其出色的性能与广泛的适用性而备受关注,对于想要购买2核8G、4核16G、8核32G等处理器与内存比为1:4配置的云服务器用户来说,这两个实例规格通常是选择比较多的,它们都主要适用于中小型数据库系统、缓存、搜索集群等各种类型的企业级应用等场景,本文将对通用型g7和通用型g8y实例进行对比,包括其架构、处理器、存储与网络能力、适用场景、指标数据、收费标准以及最新活动价格,以供参考和选择。
阿里云服务器通用型g7与通用型g8y实例深度对比及选择参考
|
9天前
|
存储 弹性计算 NoSQL
阿里云服务器企业级实例购买及变配常见问题及解答
阿里云服务器企业级实例具有高性能、稳定计算能力和平衡网络性能的特点,因为具有独享且稳定的计算、存储、网络资源,这些实例规格族非常适合对业务稳定性具有高要求的企业场景。企业级云服务器拥有完全的云服务器cpu、内存使用资源,不与他人共享云服务器资源。有些新手用户不知道什么是企业级实例与共享型实例有何区别,在使用过程中需要注意些什么,下面是小编整理的几个阿里云企业级云服务器实例常见问题及解答,以供大家了解。
阿里云服务器企业级实例购买及变配常见问题及解答
|
14天前
|
存储 弹性计算 安全
阿里云服务器2核4G、4核8G、8核16G实例选型指南:经济型、通用算力型和计算型选择参考
2核4G/4核8G/8核16G配置的云服务器在阿里云目前的活动中有经济型e、通用算力型u1和计算型c7、计算型c8y、计算型c7a等计算型实例可选,虽然配置相同,但是这些实例规格之间的性能和价格差别是很大的,因此,我们有必要弄清楚他们之间的差别,这样才能根据自己的需求选择最适合自己的实例。
阿里云服务器2核4G、4核8G、8核16G实例选型指南:经济型、通用算力型和计算型选择参考
|
8天前
|
存储 弹性计算 网络协议
阿里云高性能计算HPC优化实例商业化发布详解
基于云的高性能计算(Cloud HPC),与传统HPC相比更加灵活、高效。
|
12天前
|
存储 网络协议 安全
阿里云hpc8ae实例商业化发布详解
近日,全球领先的云计算厂商阿里云宣布最新HPC优化实例hpc8ae的正式商业化,该实例依托阿里云自研的「飞天+CIPU」架构体系,搭载第四代AMD EPYC处理器,专为高性能计算应用优化,特别适用于计算流体、有限元分析、多物理场模拟等仿真类应用,CAE场景下的性价比最少提升50%。
|
10天前
|
弹性计算 固态存储 JavaScript
阿里云4核8g服务器多少钱?云服务器u1实例700元1年
阿里云4核8G ECS u1实例,支持约30个并发用户,适合日均1万IP访问。当前优惠价为700元/年。配置包括Intel Xeon处理器,4核8GB内存,1.5Gbps带宽,最高25万连接数,云盘IOPS达2万。公网带宽和应用效率影响并发数,3M带宽理论可支撑12个用户同时访问。系统盘为20-40GB ESSD Entry。
|
1月前
|
Java Maven 开发工具
【ElasticSearch 】IK 分词器安装
【ElasticSearch 】IK 分词器安装
44 1
|
13天前
Elasticsearch安装配置文件
Elasticsearch安装配置文件
15 0
|
1月前
|
存储 数据可视化 数据挖掘
【ElasticSearch】ElasticSearch安装
【ElasticSearch】ElasticSearch安装
38 2

热门文章

最新文章