Elasticsearch: java客户端之AdminClient

简介: Elasticsearch: java客户端之AdminClient

 Elasticsearch版本

    • elasticsearch-5.4.3.jar

    指定 ip地址创建client

    private TransportClient client = null;
        /**
         *指定 ip地址创建client
         */
        @Before
        public void init() throws Exception {
            //设置集群名称
            Settings settings = Settings.builder().put("cluster.name", "my-es").build();
            //创建client
            client = new PreBuiltTransportClient(settings).addTransportAddresses(
                    new InetSocketTransportAddress(InetAddress.getByName("192.168.100.211"), 9300),
                    new InetSocketTransportAddress(InetAddress.getByName("192.168.100.212"), 9300),
                    new InetSocketTransportAddress(InetAddress.getByName("192.168.100.213"), 9300));
        }

    image.gif

    创建索引,并配置一些分区和副本的数量

    /**
         * 创建索引,并配置一些分区和副本的数量
         */
        @Test
        public void createIndexWithSettings() {
            //获取Admin的API
            AdminClient admin = client.admin();
            //使用Admin API对索引进行操作
            IndicesAdminClient indices = admin.indices();
            //准备创建索引
            indices.prepareCreate("gamelog")
                    //配置索引参数
                    .setSettings(
                            //参数配置器
                            Settings.builder()//指定索引分区的数量
                            .put("index.number_of_shards", 4)
                                    //指定索引副本的数量(注意:不包括本身,如果设置数据存储副本为2,实际上数据存储了3份)
                            .put("index.number_of_replicas", 2)
                    )
                    //真正执行
                    .get();
        }

    image.gif

    给索引添加mapping信息

    /**
         * 给索引添加mapping信息(类似给表添加schema信息)
         */
        @Test
        public void putMapping() {
            //创建索引
            client.admin().indices().prepareCreate("twitter")
                    //创建一个type,并指定type中属性的名字和类型
                    .addMapping("tweet",
                            "{\n" +
                                    "    \"tweet\": {\n" +
                                    "      \"properties\": {\n" +
                                    "        \"message\": {\n" +
                                    "          \"type\": \"string\"\n" +
                                    "        }\n" +
                                    "      }\n" +
                                    "    }\n" +
                                    "  }")
                    .get();
        }

    image.gif

    设置字段索引,分词,是否存储

    /**
         * 设置字段索引,分词,是否存储
         */
        @Test
        public void testSettingsMappings() throws IOException {
            //1:settings
            HashMap<String, Object> settings_map = new HashMap<String, Object>(2);
            //指定索引分区的数量
            settings_map.put("number_of_shards", 3);
            //指定索引副本的数量
            settings_map.put("number_of_replicas", 2);
            //2:mappings(映射、schema)
            XContentBuilder builder = XContentFactory.jsonBuilder()
                    .startObject()
                    /**
                     *
                     * 你可以通过dynamic设置来控制这一行为,它能够接受以下的选项:
                     * true:默认值。动态添加字段
                     * false:忽略新字段
                     * strict:如果碰到陌生字段,抛出异常
                     */
                        .field("dynamic", "true")
                        //设置type中的属性
                    .startObject("properties")
                            //id属性
                            .startObject("num")
                                //类型是integer
                                .field("type", "integer")
                                //不分词,但是建索引
                                /**
                                 * index这个属性,no代表不建索引
                                 * not_analyzed,建索引不分词
                                 * analyzed 即分词,又建立索引
                                 * expected [no], [not_analyzed] or [analyzed]
                                 */
                                .field("index", "not_analyzed")
                                //在文档中存储
                                .field("store", "yes")
                            .endObject()
                            //name属性
                            .startObject("name")
                                //string类型
                                .field("type", "string")
                                //在文档中存储
                                .field("store", "yes")
                                //建立索引
                                .field("index", "analyzed")
                                //使用ik_smart进行分词
                                .field("analyzer", "ik_smart")
                            .endObject()
                        .endObject()
                    .endObject();
            CreateIndexRequestBuilder prepareCreate = client.admin().indices().prepareCreate("user_info");
            //管理索引(user_info)然后关联type(user)
            prepareCreate.setSettings(settings_map).addMapping("user", builder).get();
        }

    image.gif


    相关实践学习
    使用阿里云Elasticsearch体验信息检索加速
    通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
    ElasticSearch 入门精讲
    ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
    目录
    打赏
    0
    0
    0
    0
    3331
    分享
    相关文章
    Elasticsearch: java客户端之AdminClient
    Elasticsearch: java客户端之AdminClient
    178 0
    |
    15天前
    |
    【Java并发】【线程池】带你从0-1入门线程池
    欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
    138 60
    【Java并发】【线程池】带你从0-1入门线程池
    Java网络编程,多线程,IO流综合小项目一一ChatBoxes
    **项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
    53 23
    |
    11天前
    |
    【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
    当我们创建一个`ThreadPoolExecutor`的时候,你是否会好奇🤔,它到底发生了什么?比如:我传的拒绝策略、线程工厂是啥时候被使用的? 核心线程数是个啥?最大线程数和它又有什么关系?线程池,它是怎么调度,我们传入的线程?...不要着急,小手手点上关注、点赞、收藏。主播马上从源码的角度带你们探索神秘线程池的世界...
    77 0
    【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
    Java社招面试题:一个线程运行时发生异常会怎样?
    大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
    102 14
    Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
    大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
    57 13
    【JAVA】封装多线程原理
    Java 中的多线程封装旨在简化使用、提高安全性和增强可维护性。通过抽象和隐藏底层细节,提供简洁接口。常见封装方式包括基于 Runnable 和 Callable 接口的任务封装,以及线程池的封装。Runnable 适用于无返回值任务,Callable 支持有返回值任务。线程池(如 ExecutorService)则用于管理和复用线程,减少性能开销。示例代码展示了如何实现这些封装,使多线程编程更加高效和安全。
    |
    2月前
    |
    java异步判断线程池所有任务是否执行完
    通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
    125 17
    |
    3月前
    |
    Java—多线程实现生产消费者
    本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
    Java—多线程实现生产消费者
    Java 多线程 面试题
    Java 多线程 相关基础面试题

    热门文章

    最新文章