Java注解之Elasticsearch的案例详解

学会了技术就要使用,否则很容易忘记,因为自然界压根就不存在什么代码、变量之类的玩意,这都是一些和生活常识格格不入的东西。只能多用多练,形成肌肉记忆才行。

在一次实际的产品开发中,由于业务需求的缘故,需要使用Elasticsearch搜索引擎。搜索引擎是通过索引和文档检索数据的,索引类似于MySQL的数据库,而文档类似于MySQL的表。要想使用搜索引擎,就必须事先创建索引和文档。

有两种解决方案可以实现:

第一种方案是把创建索引和文档的语句直接集成在代码里,每次启动时都检查相应的索引、文档是否存在,不存在就创建;

第二种方案是通过脚本的形式,把每个索引和文档的创建语句都保存下来,如果有字段改动则删除,再重新创建。

考虑到开发时字段可能会经常变动,此时就必然会导致修改代码,所以采取第二种方案时既要修改代码,又要同时修改脚本,否则会报错,比较费事。而采用第一种方案,只需要删掉索引和文档再重新启动应用就可以了,不必再单独执行脚本,非常方便,也不容易忘记。综合开发进度及其他现实因素,决定采用第一种方案来解决创建索引和文档的问题。

这里不打算创建一个完整的项目,只需要演示用Java创建Elasticsearch索引相关部分就行了。

即使是这么一点内容,代码量也不少,对于初学者来说仍然有些复杂,所以决定分为两部分来讲。

今天先来准备一下「材料」。事先声明:这里的代码都是应用于本地Elasticsearch服务的,而不是云原生服务,否则代码和配置等内容会有很大不同。

首先,引入所需要的依赖:

<!-- Elasticsearch相关依赖 -->

<dependency>

    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <exclusions>

        <exclusion>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
        </exclusion>

        <exclusion>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>

    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-client</artifactId>
</dependency>

<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
</dependency>

<!-- fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.68</version>
</dependency>

<!-- apache commons -->

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
</dependency>

然后修改application.properties属性文件:

## ELASTICSEARCH

spring.elastic.rhlc.schema=http

spring.elastic.rhlc.hosts=127.0.0.1:9200

spring.elastic.rhlc.username=elastic

spring.elastic.rhlc.password=123456

spring.elastic.rhlc.connectTimeOut=5000

spring.elastic.rhlc.socketTimeOut=5000

spring.elastic.rhlc.connectionRequestTimeOut=10000

spring.elastic.rhlc.maxConnectNumber=10000

spring.elastic.rhlc.maxConnectPerRoute=8

接着,创建elasticsearch配置类:

/**
 * Elasticsearch配置类
 *
 * @author xiangwang
 */
@Configuration
public class ElasticConfiguration {
    @Value("${spring.elastic.rhlc.schema}")
    private String schema;
    @Value("${spring.elastic.rhlc.hosts}")
    private String hosts;
    @Value("${spring.elastic.rhlc.username}")
    private String username;
    @Value("${spring.elastic.rhlc.password}")
    private String password;
    @Value("${spring.elastic.rhlc.connectTimeOut}")
    private int connectTimeOut;
    @Value("${spring.elastic.rhlc.socketTimeOut}")
    private int socketTimeOut;
    @Value("${spring.elastic.rhlc.connectionRequestTimeOut}")
    private int connectionRequestTimeOut;

    @Bean
    public RestHighLevelClient client() {
        String[] hosts = this.hosts.split(",");
        HttpHost[] httpHosts = new HttpHost[hosts.length];
        for (int i = 0; i < hosts.length; i++) {
            httpHosts[i] = new HttpHost(hosts[i].split(":")[0], Integer.parseInt(hosts[i].split(":")[1]), schema);
        }
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
        RestClientBuilder builder = RestClient.builder(httpHosts).setRequestConfigCallback(requestConfigBuilder -> {
            requestConfigBuilder.setConnectTimeout(connectTimeOut);
            requestConfigBuilder.setSocketTimeout(socketTimeOut);
            requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut);
            return requestConfigBuilder;
        }).setHttpClientConfigCallback(httpClientBuilder -> {
            httpClientBuilder.disableAuthCaching();
            return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
        });
        return new RestHighLevelClient(builder);
    }
}

上面这些都属于常规动作,没啥好说明的。

接下来,还是按照昨天的套路进行:

先创建elasticsearch字段类型枚举:

/**
 * elastic字段类型枚举
 *
 * @author xiangwang
 */
public enum FieldType {
    Auto("auto"),
    Text("text"),
    Keyword("keyword"),
    Long("long");

    public String value;

    private FieldType(final String value) {
        this.value = value;
    }

    public static String getValue(final String value) {
        for (FieldType field : FieldType.values()) {
            if (field.getValue().equalsIgnoreCase(value)) {
                return field.value;
            }
        }
        return null;
    }

    public String getValue() {
        return value;
    }

    public void setValue(final String value) {
        this.value = value;
    }
}

然后创建elasticsearch的字段:

/**
 * elastic字段注解,定义每个elasticsearch字段上的属性
 *
 * @author xiangwang
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
@Inherited
public @interface DocField {
    @AliasFor("name")
    String value() default "";

    @AliasFor("value")
    String name() default "";

    FieldType type() default FieldType.Auto;

    boolean index() default false;

    String format() default "";

    String pattern() default "";

    boolean store() default false;

    boolean fielddata() default false;

    String searchAnalyzer() default "";

    String analyzer() default "";

    String normalizer() default "";
}

以上就是Java注解之Elasticsearch的案例详解的详细内容,更多关于Java Elasticsearch的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java面试重点中的重点之Elasticsearch核心原理

    目录 Elasticsearch简介 Elasticsearch是什么?它能干什么? 从核心概念开始 Lucence 核心数据结构 Document Index 倒排索引 FST 集群相关概念 节点 分片 总结 Elasticsearch简介 Elasticsearch是什么?它能干什么? Elasticsearch(以下称之为ES)是一款基于Lucene的分布式全文搜索引擎,擅长海量数据存储.数据分析以及全文检索查询,它是一款非常优秀的数据存储与数据分析中间件,广泛应用于日志分析以及全文检索等

  • elasticsearch java客户端action的实现简单分析

    上一篇介绍了elasticsearch的client结构,client只是一个门面,在每个方法后面都有一个action来承接相应的功能.但是action也并非是真正的功能实现者,它只是一个代理,它的真正实现者是transportAction.本篇就对action及transportAction的实现做一个简单的分析, elasticsearch中的绝大部分操作都是通过相应的action,这些action在action包中.它的结构如下图所示: 上图是action包的部分截图,这里面对应着各个功能

  • Java中Elasticsearch 实现分页方式(三种方式)

    目录 ES 简介 ES 的特点: 一.from + size 浅分页 二.scroll 深分页 scroll删除 三.search_after 深分页 ES 简介 Elasticsearch 是一个基于 Lucene 实现的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口.Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎.Elasticsearch用于云计算中,能够达到实时搜索,稳定

  • java操作elasticsearch的案例解析

    这篇文章主要介绍了java操作elasticsearch的案例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 到目前为止,我们一直都是使用RESTful风格的 API操作elasticsearch服务,但是通过我们之前的学习知道,elasticsearch提供了很多语言的客户端用于操作elasticsearch服务,例如:java.python..net.JavaScript.PHP等.而我们此次就学习如何使用java语言来操作elasti

  • java连接ElasticSearch集群操作

    我就废话不多说了,大家还是直接看代码吧~ /* *es配置类 * */ @Configuration public class ElasticSearchDataSourceConfigurer { private static final Logger LOG = LogManager.getLogger(ElasticSearchDataSourceConfigurer.class); @Bean public TransportClient getESClient() { //设置集群名称

  • Java注解之Elasticsearch的案例详解

    学会了技术就要使用,否则很容易忘记,因为自然界压根就不存在什么代码.变量之类的玩意,这都是一些和生活常识格格不入的东西.只能多用多练,形成肌肉记忆才行. 在一次实际的产品开发中,由于业务需求的缘故,需要使用Elasticsearch搜索引擎.搜索引擎是通过索引和文档检索数据的,索引类似于MySQL的数据库,而文档类似于MySQL的表.要想使用搜索引擎,就必须事先创建索引和文档. 有两种解决方案可以实现: 第一种方案是把创建索引和文档的语句直接集成在代码里,每次启动时都检查相应的索引.文档是否存在

  • Java Spring之@Async原理案例详解

    目录 前言 一.如何使用@Async 二.源码解读 总结 前言 用过Spring的人多多少少也都用过@Async注解,至于作用嘛,看注解名,大概能猜出来,就是在方法执行的时候进行异步执行. 一.如何使用@Async 使用@Async注解主要分两步: 1.在配置类上添加@EnableAsync注解 @ComponentScan(value = "com.wang") @Configuration @EnableAsync public class AppConfig { } 2.在想要异

  • Java sdk安装及配置案例详解

    1.安装Java SDK开发环境. 首先去官网下载Java SDK,http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html, 下载完成之后,开始安装. 点击下一步,安装完成. 2.配置Java SDK环境变量 单击"计算机-属性-高级系统设置",单击"环境变量".在"系统变量"栏下单击"新建",创建新的系统环境变量.

  • Java JConsole远程连接配置案例详解

    JConsole远程连接还是有一点坑的.这里记录一下配置过程,好记性不如烂笔头. 1.在远程机的tomcat的catalina.sh中加入配置: JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=192.168.202.121 -Dcom.sun.management.jmxremote" JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=12345"

  • Java System.getProperty()-获取系统参数案例详解

    因为所有在java.io中的类都是将相对路径名解释为起始于用户的当前工作目录,所以应该清楚当前的目录. 可以通过调用System.getProperty("user.dir"); 来获得. /** * java.version Java 运行时环境版本 java.vendor Java 运行时环境供应商 java.vendor.url Java 供应商的 URL java.vm.specification.version Java 虚拟机规范版本 java.vm.specificati

  • Java jvm中Code Cache案例详解

    Code Cache JVM生成的native code存放的内存空间称之为Code Cache:JIT编译.JNI等都会编译代码到native code,其中JIT生成的native code占用了Code Cache的绝大部分空间 相关参数 Codecache Size Options -XX:InitialCodeCacheSize 用于设置初始CodeCache大小 -XX:ReservedCodeCacheSize 用于设置Reserved code cache的最大大小,通常默认是2

  • Java Date类的使用案例详解

    Date类表示特定的瞬间,精确到毫秒. 有2种方法可以创建Date对象(这里不考虑已过时的构造函数) 1.public Date()--分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒). @Test public void test1() { Date date = new Date(); System.out.println(date); } Sun Oct 23 22:39:14 CST 2016 2.public Date(long date)--根据给定的毫秒值创建日

  • Java BigDecimal中divide方法案例详解

    1.首先说一下用法,BigDecimal中的divide主要就是用来做除法的运算.其中有这么一个方法. public BigDecimal divide(BigDecimal divisor,int scale, int roundingMode) 第一个参数是除数,第二个参数代表保留几位小数,第三个代表的是使用的模式. BigDecimal.ROUND_DOWN:直接省略多余的小数,比如1.28如果保留1位小数,得到的就是1.2 BigDecimal.ROUND_UP:直接进位,比如1.21如

  • Java 位运算符>>与>>>区别案例详解

    下图是java教程中对于>>和>>>区别的解释,但是介绍的并不详细,因为这两种运算符是以补码二进制进行运算的. 1.学习过计算机原理的都知道,数字是以补码的形式在计算机中存储的,那么源码,反码,补码之间的关系是如下所示: **正整数**的原码.反码和补码都一样: **负数部分**: 1.原码和反码的相互转换:符号位不变,数值位按位取反 2.原码和补码的相互转换:符号位不变,数值位按位取反,末位再加1 3.已知补码,求原码的负数的补码:符号位和数值位都取反,末位再加1 2.了解

  • java之assert关键字用法案例详解

    Java2在1.4中新增了一个关键字:assert.在程序开发过程中使用它创建一个断言(assertion).,它的语法形式有如下所示的两种形式: 1.assert condition; 这里condition是一个必须为真(true)的表达式.如果表达式的结果为true,那么断言为真,并且无任何行动 如果表达式为false,则断言失败,则会抛出一个AssertionError对象.这个AssertionError继承于Error对象, 而Error继承于Throwable,Error是和Exc

随机推荐