Java API访问ELK集群(完整代码)

本文详细介绍了如何使用Java客户端操作Elasticsearch,包括创建、更新、删除索引,批量操作,以及各种查询方式如范围查询、词条查询、模糊查询等,并展示了如何实现分页和高亮查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

完整代码连接:
链接:https://pan.baidu.com/s/18V50hRvYpcaAOr5hZbsUHw
提取码:5x20

1、导入pom

<dependencies>
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>transport</artifactId>
        <version>6.7.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.9.1</version>
    </dependency>


    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>6.14.3</version>
        <scope>test</scope>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.47</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

完整程序

2、创建索引 prepareIndex

1、创建Client

private TransportClient client = null;

    @BeforeTest
    public void test1() throws UnknownHostException {
        Settings settings = Settings.builder().put("cluster.name", "myes").build();

        TransportAddress address1 = new TransportAddress(InetAddress.getByName("node01"), 9300);
        TransportAddress address2 = new TransportAddress(InetAddress.getByName("node02"), 9300);
        TransportAddress address3 = new TransportAddress(InetAddress.getByName("node02"), 9300);
        client = new PreBuiltTransportClient(settings)
                .addTransportAddress(address1)
                .addTransportAddress(address2)
                .addTransportAddress(address3);

        System.out.println(client.toString());
    }
/**
     * 关闭连接
     */
    @AfterTest
    public void closeClient() {
        client.close();
    }

2、自己拼装json创建索引保存到myindex1索引库下面的article当中去

/**
     * 自己拼装json创建索引保存到myindex1索引库下面的article当中去
     */
    /**
     * 插入json格式的索引数据
     */
    @Test
    public void createIndex(){
        String json = "{" +
                "\"user\":\"kimchy\"," +
                "\"postDate\":\"2020-01-30\"," +
                "\"message\":\"travelying out Elasticsearch\"" +
                "}";
        IndexRequestBuilder indexRequestBuilder = client.prepareIndex("myindex1", "article", "1").setSource(json, XContentType.JSON);

        //调用get方法触发请求真正的去执行
        IndexResponse indexResponse = indexRequestBuilder.get();
    }

在这里插入图片描述

在这里插入图片描述

3、使用map创建索引

/*
    使用map创建索引
     */
    @Test
    public void createIndex2() {
        Map<String, String> map = new HashMap<String, String>();
        map.put("name", "zhangsan");
        map.put("age", "20");
        map.put("sex", "0");

        IndexRequestBuilder indexRequestBuilder = client.prepareIndex("myindex1", "article", "2").setSource(map);
        //触发请求真正的去执行
        indexRequestBuilder.get();
    }

在这里插入图片描述

4、XcontentBuilder实现创建索引

/**
     * 第三种:
     * XcontentBuilder实现创建索引
     */
    @Test
    public  void createIndex3() throws IOException {

        IndexRequestBuilder indexRequestBuilder = client.prepareIndex("myindex1", "article", "3").setSource(new XContentFactory().jsonBuilder()
                .startObject()
                .field("name", "李四")
                .field("age", "55")
                .field("address", "北京").endObject());

        //触发请求真正的去执行
        IndexResponse indexResponse = indexRequestBuilder.get();
    }

在这里插入图片描述

5、将JavaBean转换成为json格式的字符串进行创建索引

@Test
    public void objToIndex(){
        Person person = new Person();
        person.setAge(18);
        person.setId(20);
        person.setName("张三丰");
        person.setAddress("武当山");
        person.setEmail("zhangsanfeng@163.com");
        person.setPhone("18588888888");
        person.setSex(1);
        String json = JSONObject.toJSONString(person);
        System.out.println(json);
        client.prepareIndex("myindex1","article","32").setSource(json,XContentType.JSON).get();
        client.close();
    }

在这里插入图片描述

6、批量创建索引

/**
     * 批量创建索引
     * @throws IOException
     */
    @Test
    public void index4() throws IOException {
        BulkRequestBuilder bulk = client.prepareBulk();
        bulk.add(client.prepareIndex("myindex1", "article", "7")
                .setSource(new XContentFactory().jsonBuilder()
                        .startObject()
                        .field("name", "wangwu")
                        .field("age", "18")
                        .field("sex", "0")
                        .field("address", "bj")
                        .endObject()));
        bulk.add(client.prepareIndex("news", "article", "8")
                .setSource(new XContentFactory().jsonBuilder()
                        .startObject()
                        .field("name", "zhaoliu")
                        .field("age", "18")
                        .field("sex", "0")
                        .field("address", "bj")
                        .endObject()));
        BulkResponse bulkResponse = bulk.get();
        System.out.println(bulkResponse);
        client.close();
    }

在这里插入图片描述

在这里插入图片描述

3、更新索引

/**
     * 更新索引操作
     */
    @Test
    public void updateIndex(){
        HashMap<String, String> map = new HashMap<>();
        map.put("phone", "15899996666");

        UpdateResponse updateResponse = client.prepareUpdate("myindex1", "article", "7").setDoc(map).get();

    }

在这里插入图片描述

4、删除索引

4.1、按照id进行删除

/**
     * 删除索引
     */
    @Test
    public void deleteIndex(){
        client.prepareDelete("myindex1","article","7").get();
    }

4.2、删除整个索引库

/**
     * 删除整个索引库
     */
    @Test
    public void deleteIndexDB(){
        client.admin().indices().prepareDelete("myindex1").execute().actionGet();
    }

5、查询索引

5.1、初始化一批数据到索引库中准备查询

/**
     * 初始化一批数据到索引库当中去准备做查询使用
     * 注意这里初始化的时候,需要给我们的数据设置分词属性
     * @throws Exception
     */
    @Test
    public void createIndexBatch() throws Exception {
        Settings settings = Settings
                .builder()
                .put("cluster.name", "myes") //节点名称, 在es配置的时候设置
                //自动发现我们其他的es的服务器
                .put("client.transport.sniff", "true")
                .build();
        //创建客户端
        TransportClient client = new PreBuiltTransportClient(settings)
                .addTransportAddress(new TransportAddress(InetAddress.getByName("node01"), 9300));//以本机作为节点
        //创建映射
        XContentBuilder mapping = jsonBuilder()
                .startObject()
                .startObject("properties")
                //      .startObject("m_id").field("type","keyword").endObject()
                .startObject("id").field("type", "integer").endObject()
                .startObject("name").field("type", "text").field("analyzer", "ik_max_word").endObject()
                .startObject("age").field("type", "integer").endObject()
                .startObject("sex").field("type", "text").field("analyzer", "ik_max_word").endObject()
                .startObject("address").field("type", "text").field("analyzer", "ik_max_word").endObject()
                .startObject("phone").field("type", "text").endObject()
                .startObject("email").field("type", "text").endObject()
                .startObject("say").field("type", "text").field("analyzer", "ik_max_word").endObject()
                .endObject()
                .endObject();
        //pois:索引名   cxyword:类型名(可以自己定义)
        PutMappingRequest putmap = Requests.putMappingRequest("indexsearch").type("mysearch").source(mapping);
        //创建索引
        client.admin().indices().prepareCreate("indexsearch").execute().actionGet();
        //为索引添加映射
        client.admin().indices().putMapping(putmap).actionGet();


        BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();
        Person lujunyi = new Person(2, "玉麒麟卢俊义", 28, 1, "水泊梁山", "17666666666", "lujunyi@itcast.com","hello world今天天气还不错");
        Person wuyong = new Person(3, "智多星吴用", 45, 1, "水泊梁山", "17666666666", "wuyong@itcast.com","行走四方,抱打不平");
        Person gongsunsheng = new Person(4, "入云龙公孙胜", 30, 1, "水泊梁山", "17666666666", "gongsunsheng@itcast.com","走一个");
        Person guansheng = new Person(5, "大刀关胜", 42, 1, "水泊梁山", "17666666666", "wusong@itcast.com","我的大刀已经饥渴难耐");
        Person linchong = new Person(6, "豹子头林冲", 18, 1, "水泊梁山", "17666666666", "linchong@itcast.com","梁山好汉");
        Person qinming = new Person(7, "霹雳火秦明", 28, 1, "水泊梁山", "17666666666", "qinming@itcast.com","不太了解");
        Person huyanzhuo = new Person(8, "双鞭呼延灼", 25, 1, "水泊梁山", "17666666666", "huyanzhuo@itcast.com","不是很熟悉");
        Person huarong = new Person(9, "小李广花荣", 50, 1, "水泊梁山", "17666666666", "huarong@itcast.com","打酱油的");
        Person chaijin = new Person(10, "小旋风柴进", 32, 1, "水泊梁山", "17666666666", "chaijin@itcast.com","吓唬人的");
        Person zhisheng = new Person(13, "花和尚鲁智深", 15, 1, "水泊梁山", "17666666666", "luzhisheng@itcast.com","倒拔杨垂柳");
        Person wusong = new Person(14, "行者武松", 28, 1, "水泊梁山", "17666666666", "wusong@itcast.com","二营长。。。。。。");

        bulkRequestBuilder.add(client.prepareIndex("indexsearch", "mysearch", "1")
                .setSource(JSONObject.toJSONString(lujunyi), XContentType.JSON)
        );
        bulkRequestBuilder.add(client.prepareIndex("indexsearch", "mysearch", "2")
                .setSource(JSONObject.toJSONString(wuyong), XContentType.JSON)
        );
        bulkRequestBuilder.add(client.prepareIndex("indexsearch", "mysearch", "3")
                .setSource(JSONObject.toJSONString(gongsunsheng), XContentType.JSON)
        );
        bulkRequestBuilder.add(client.prepareIndex("indexsearch", "mysearch", "4")
                .setSource(JSONObject.toJSONString(guansheng), XContentType.JSON)
        );
        bulkRequestBuilder.add(client.prepareIndex("indexsearch", "mysearch", "5")
                .setSource(JSONObject.toJSONString(linchong), XContentType.JSON)
        );
        bulkRequestBuilder.add(client.prepareIndex("indexsearch", "mysearch", "6")
                .setSource(JSONObject.toJSONString(qinming), XContentType.JSON)
        );
        bulkRequestBuilder.add(client.prepareIndex("indexsearch", "mysearch", "7")
                .setSource(JSONObject.toJSONString(huyanzhuo), XContentType.JSON)
        );
        bulkRequestBuilder.add(client.prepareIndex("indexsearch", "mysearch", "8")
                .setSource(JSONObject.toJSONString(huarong), XContentType.JSON)
        );
        bulkRequestBuilder.add(client.prepareIndex("indexsearch", "mysearch", "9")
                .setSource(JSONObject.toJSONString(chaijin), XContentType.JSON)
        );
        bulkRequestBuilder.add(client.prepareIndex("indexsearch", "mysearch", "10")
                .setSource(JSONObject.toJSONString(zhisheng), XContentType.JSON)
        );
        bulkRequestBuilder.add(client.prepareIndex("indexsearch", "mysearch", "11")
                .setSource(JSONObject.toJSONString(wusong), XContentType.JSON)
        );

        bulkRequestBuilder.get();
        client.close();

    }

5.2 通过数据id使用prepareGet来查询索引

/**
     * 通过每条数据的系统id来进行查询
     */
    @Test
    public void getBySystemId(){
        //通过系统id来进行查询,调用prepareGet方法,传入三个参数
        GetRequestBuilder getRequestBuilder = client.prepareGet("indexsearch", "mysearch", "11");
        //获取到查询的数据结果
        GetResponse getResponse = getRequestBuilder.get();
        String id = getResponse.getId();//获取系统id为多少
        System.out.println("系统id为"+ id);
        String sourceAsString = getResponse.getSourceAsString();//将结果转换成为json格式的字符串
        System.out.println(sourceAsString);
    }

在这里插入图片描述

5.3 查询索引库当中的所有数据

/**
     * 查询索引库当中所有的数据
     */
    @Test
    public void queryAll(){
        SearchResponse searchResponse = client
                .prepareSearch("indexsearch")//指定我们查询的索引库
                .setTypes("mysearch")  //指定我们需要查询哪个类型
                .setQuery(QueryBuilders.matchAllQuery())  //指定我们查询的条件
                .get();  //调用get方法,触发我们的请求真正的去执行

        SearchHits hits = searchResponse.getHits();
        SearchHit[] hitsAll = hits.getHits();
        //每一个searchHit封装完了我们的一条数据
        for (SearchHit searchHit : hitsAll) {

            String id = searchHit.getId();
            System.out.println("系统id为" +  id);
            String sourceAsString = searchHit.getSourceAsString();
            System.out.println(sourceAsString);
        }

    }

在这里插入图片描述

5.4 RangeQuery范围值查询

/**
     * 年龄范围值查询
     * 查询年龄是18到28的数据
     */
    @Test
    public void rangeQuery(){
        SearchResponse searchResponse = client.prepareSearch("indexsearch").setTypes("mysearch").setQuery(QueryBuilders.rangeQuery("age").gt(18).lte(28)).get();
        SearchHits hits = searchResponse.getHits();
        SearchHit[] hitsAll = hits.getHits();
        for (SearchHit searchHit : hitsAll) {
            System.out.println(searchHit.getId());
            System.out.println(searchHit.getSourceAsString());
        }
    }

在这里插入图片描述

5.5 termQuery词条查询

/**
     * 按照词条进行查询
     */
    @Test
    public void termQuery(){
        SearchResponse searchResponse = client.prepareSearch("indexsearch").setTypes("mysearch").setQuery(QueryBuilders.termQuery("say", "熟悉")).get();

        SearchHits hits = searchResponse.getHits();
        SearchHit[] hits1 = hits.getHits();
        for (SearchHit searchHit : hits1) {
            System.out.println(searchHit.getId());
            System.out.println(searchHit.getSourceAsString());
        }
    }

在这里插入图片描述

5.6 fuzzyQuery模糊查询

/**
     * 模糊查询,自动纠正拼写错误单词,最大纠正次数是两次
     * 查询  say   helol
     */
    @Test
    public void fuzzyQuery(){
        //通过模糊查询,查询helol这个单词
        FuzzyQueryBuilder fuzziness = QueryBuilders.fuzzyQuery("say", "helol").fuzziness(Fuzziness.TWO);
        SearchResponse searchResponse = client.prepareSearch("indexsearch").setTypes("mysearch").setQuery(fuzziness).get();
        SearchHits hits = searchResponse.getHits();
        SearchHit[] hits1 = hits.getHits();
        for (SearchHit searchHit : hits1) {
            System.out.println(searchHit.getId());
            System.out.println(searchHit.getSourceAsString());
        }
    }

5.7 wildCardQuery通配符查询

/**
     * 通配符查询
     *  *  表示匹配任意多个字符
     *  ?  表示匹配一个字符
     */
    @Test
    public void  wildCardQuery(){
        WildcardQueryBuilder wildcardQuery = QueryBuilders.wildcardQuery("say", "hell?");
        SearchResponse searchResponse = client.prepareSearch("indexsearch").setTypes("mysearch").setQuery(wildcardQuery).get();

        SearchHits hits = searchResponse.getHits();
        SearchHit[] hits1 = hits.getHits();
        for (SearchHit searchHit : hits1) {
            System.out.println(searchHit.getId());
            System.out.println(searchHit.getSourceAsString());
        }

    }

5.8 boolQuery 多条件组合查询

/**
     * 使用booleanQuery实现多条件组合查询
     * 查询年龄是18到28范围内且性别是男性的,第一个条件  里面包含两部分  年龄和性别  且的关系
     * 或者id范围在10到13范围内的  第二个条件
     * 第一个条件与第二个条件是一个或的关系
     */
    @Test
    public void booleanQuery(){
        //年龄范围的条件
        RangeQueryBuilder age = QueryBuilders.rangeQuery("age").gt(17).lt(29);
        //性别的条件
        TermQueryBuilder sex = QueryBuilders.termQuery("sex", "1");
        //数据id的条件
        RangeQueryBuilder id = QueryBuilders.rangeQuery("id").gt("9").lt("14");
        //使用booleanQuery组合我们多个查询条件
        BoolQueryBuilder should = QueryBuilders.boolQuery()
                .should(id).should(QueryBuilders.boolQuery().must(sex).must(age));

        SearchResponse searchResponse = client.prepareSearch("indexsearch").setTypes("mysearch").setQuery(
                should
        ).get();

        SearchHits hits = searchResponse.getHits();
        SearchHit[] hits1 = hits.getHits();
        for (SearchHit searchHit : hits1) {
            System.out.println(searchHit.getId());
            System.out.println(searchHit.getSourceAsString());
        }


    }

5.9 分页与高亮查询

1、分页查询

/**
     * 分页查询
     */
    @Test
    public void pageQuery(){

        int pageSize  = 5 ;
        int pageNum =2;

        //计算起始的数据
        int startNum = (pageNum - 1 ) * pageSize;

        SearchResponse searchResponse = client.prepareSearch("indexsearch").setTypes("mysearch").setQuery(QueryBuilders.matchAllQuery())
                .addSort("id", SortOrder.ASC)
                .setFrom(startNum)
                .setSize(pageSize)
                .get();

        SearchHits hits = searchResponse.getHits();
        SearchHit[] hits1 = hits.getHits();
        for (SearchHit searchHit : hits1) {
            System.out.println(searchHit.getId());
            System.out.println(searchHit.getSourceAsString());
        }


    }

2、高亮查询

在这里插入图片描述

3、高亮显示的html分析

通过开发者工具查看高亮数据的html代码实现:

在这里插入图片描述

ElasticSearch可以对查询出的内容中关键字部分进行标签和样式的设置,但是你需要告诉ElasticSearch使用什么标签对高亮关键字进行包裹

4、高亮显示代码实现

/**
     * 高亮显示,对我们查询出来的say   hello
     * 这个字段进行高亮显示
     */
    @Test
    public void highLighter(){

        SearchRequestBuilder searchRequestBuilder = client.prepareSearch("indexsearch").setTypes("mysearch").setQuery(QueryBuilders.termQuery("say", "hello"));
        //通过HighlightBuilder 来定义我们对哪个字段进行高亮显示,以及设置高亮的前缀和后缀
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.field("say").preTags("<font style='color:red'>").postTags("</font>");
        //通过SearchRequestBuilder 来设置高亮显示
        SearchResponse searchResponse = searchRequestBuilder.highlighter(highlightBuilder).get();
        //获取高亮结果
        SearchHits hits = searchResponse.getHits();
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
            Text[] says = hit.getHighlightFields().get("say").getFragments();
            for (Text say : says) {
                System.out.println(say);
            }
        }
    }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值