Elasticsearch: java客户端之AdminClient

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 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可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
    目录
    相关文章
    |
    存储 自然语言处理 Java
    Elasticsearch: java客户端之AdminClient
    Elasticsearch: java客户端之AdminClient
    160 0
    |
    2天前
    |
    安全 Java 测试技术
    Java并行流陷阱:为什么指定线程池可能是个坏主意
    本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
    |
    11天前
    |
    安全 Java
    java 中 i++ 到底是否线程安全?
    本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
    java 中 i++ 到底是否线程安全?
    |
    2天前
    |
    存储 安全 Java
    Java多线程编程的艺术:从基础到实践####
    本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####
    |
    2天前
    |
    Java
    JAVA多线程通信:为何wait()与notify()如此重要?
    在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是实现线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件满足时被唤醒,从而确保数据一致性和同步。相比其他通信方式,如忙等待,这些方法更高效灵活。 示例代码展示了如何在生产者-消费者模型中使用这些方法实现线程间的协调和同步。
    9 3
    |
    21小时前
    |
    安全 Java
    Java多线程集合类
    本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
    |
    1天前
    |
    Java
    java小知识—进程和线程
    进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
    7 1
    |
    2天前
    |
    Java UED
    Java中的多线程编程基础与实践
    【10月更文挑战第35天】在Java的世界中,多线程是提升应用性能和响应性的利器。本文将深入浅出地介绍如何在Java中创建和管理线程,以及如何利用同步机制确保数据一致性。我们将从简单的“Hello, World!”线程示例出发,逐步探索线程池的高效使用,并讨论常见的多线程问题。无论你是Java新手还是希望深化理解,这篇文章都将为你打开多线程的大门。
    |
    2天前
    |
    安全 Java 编译器
    Java多线程编程的陷阱与最佳实践####
    【10月更文挑战第29天】 本文深入探讨了Java多线程编程中的常见陷阱,如竞态条件、死锁、内存一致性错误等,并通过实例分析揭示了这些陷阱的成因。同时,文章也分享了一系列最佳实践,包括使用volatile关键字、原子类、线程安全集合以及并发框架(如java.util.concurrent包下的工具类),帮助开发者有效避免多线程编程中的问题,提升应用的稳定性和性能。 ####
    19 1
    |
    6天前
    |
    存储 设计模式 分布式计算
    Java中的多线程编程:并发与并行的深度解析####
    在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####
    下一篇
    无影云桌面