Java 操作Elasticsearch Demo

环境:

安装elasticsearch-6.2.4
安装kibana-6.2.4
安装ik分词器并将ik分词器解压到Elasticsearch目录的plugins目录中

配置运行:

第一步:进入Elasticsearch安装目录下的config目录,修改elasticsearch.yml文件.在文件的末尾加入以下代码:

http.cors.enabled: true 
http.cors.allow-origin: "*"
node.master: true
node.data: true

然后去掉network.host: 192.168.0.1的注释符号(#)并改为network.host: 0.0.0.0
去掉http.port的注释符号(#)
在这里插入图片描述
去掉cluster.name,node.name的注释符号(#)
在这里插入图片描述

启动elasticsearch-6.2.4和kibana-6.2.4。

构建maven项目
  • 1.pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.blj</groupId>
    <artifactId>elasicsearch-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>6.2.4</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

    </dependencies>


</project>
  • 2.创建测试类
package com.blj.test;

import org.elasticsearch.action.ActionFuture;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.get.MultiGetItemResponse;
import org.elasticsearch.action.get.MultiGetRequestBuilder;
import org.elasticsearch.action.get.MultiGetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.mapper.RangeFieldMapper;
import org.elasticsearch.index.query.*;
import org.elasticsearch.index.reindex.BulkByScrollResponse;
import org.elasticsearch.index.reindex.DeleteByQueryAction;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.bucket.filter.Filter;
import org.elasticsearch.search.aggregations.bucket.filter.FilterAggregationBuilder;
import org.elasticsearch.search.aggregations.bucket.filter.Filters;
import org.elasticsearch.search.aggregations.bucket.filter.FiltersAggregator;
import org.elasticsearch.search.aggregations.bucket.range.Range;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.avg.Avg;
import org.elasticsearch.search.aggregations.metrics.cardinality.Cardinality;
import org.elasticsearch.search.aggregations.metrics.cardinality.CardinalityAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.max.Max;
import org.elasticsearch.search.aggregations.metrics.max.MaxAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.min.Min;
import org.elasticsearch.search.aggregations.metrics.min.MinAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.sum.Sum;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.Test;

import javax.management.Query;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Map;
import java.util.Set;

/**
 * es Demo
 *
 * @author BaiLiJun on 2019/11/3 0003
 */
public class EsDemo {

    /**
     * Get 查询
     */
    @Test
    public void testGetQuery() throws UnknownHostException {
        TransportClient client = getClient();
        //数据查询
        GetResponse response = client.prepareGet("test_index", "test_type", "25")
                .execute().actionGet();
        //得到查询的数据
        System.out.println("response.getSourceAsString() = " + response.getSourceAsString());

        client.close();
    }

    private TransportClient getClient() throws UnknownHostException {
        //指定es集群
        Settings settings = Settings.builder().put("cluster.name", "my-application").build();
        //创建es客户端
        return new PreBuiltTransportClient(settings).addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
    }


    /*
    *添加文档
    *"{"+
    "\"id\":\"1\"," +
    "\ "title\":\ "Java设计模式之装饰模式\"," +
    "\ "content\":\ "在不必改变原类文件和使用继承的情况下,动态地扩展-一个对象的功能。\"," +
    "\ "postdate\":\"2019-11-03\","+
    "\"ur1\":\"csdn.net/ 79239072\"" +
    "}"
    */
    @Test
    public void testAddDoc() throws Exception {
        TransportClient client = getClient();
        //文档内容
        XContentBuilder doc = XContentFactory.jsonBuilder().startObject()
                .field("id", "1")
                .field("title", "Java设计模式之装饰模式")
                .field("content", "在不必改变原类文件和使用继承的情况下,动态地扩展-一个对象的功能")
                .field("postdate", "2019-11-03")
                .field("url", "csdn.net/79239072")
                .endObject();
        //添加文档
        IndexResponse response = client.prepareIndex("index1", "blog", "10")
                .setSource(doc).get();
        System.out.println("response.status() = " + response.status());
    }


    /**
     * 删除文档
     */
    @Test
    public void testDelete() throws Exception {
        TransportClient client = getClient();
        DeleteResponse response = client.prepareDelete("index1", "blog", "10").get();
        System.out.println("response.status() = " + response.status());

    }


    /**
     * 更新文档(局部更新)
     */
    @Test
    public void testUpdate() throws Exception {
        TransportClient client = getClient();
        UpdateRequest request = new UpdateRequest();
        request.index("index1").type("blog").id("10").doc(
                XContentFactory.jsonBuilder().startObject()
                        .field("title", "单例模式")
                        .field("postdate", "2019-11-05")
                        .endObject()
        );
        UpdateResponse response = client.update(request).get();
        System.out.println("response.status() = " + response.status());
    }

    /**
     * upset 更新操作:不存在就创建,存在就更新
     */
    @Test
    public void testUpset() throws Exception {
        TransportClient client = getClient();
        IndexRequest request1 = new IndexRequest("index1", "blog", "8")
                .source(
                        XContentFactory.jsonBuilder().startObject()
                                .field("id", "2")
                                .field("title", "工厂模式")
                                .field("content", "静态工厂,实例工厂")
                                .field("postdate", "2019-11-05")
                                .field("url", "csdn.net/79239072")
                                .endObject()
                );

        UpdateRequest request2 = new UpdateRequest("index1", "blog", "8").doc(
                XContentFactory.jsonBuilder().startObject()
                        .field("title", "设计模式")
                        .endObject()
        ).upsert(request1);

        UpdateResponse response = client.update(request2).get();
        System.out.println("response.status() = " + response.status());
    }

    /**
     * mget用法:批量查询
     */
    @Test
    public void testMultiGet() throws Exception {
        TransportClient client = getClient();
        MultiGetResponse response = client.prepareMultiGet()
                .add("index1", "blog", "8", "10")
                .add("test_index", "test_type", "22", "24")
                .get();
        for (MultiGetItemResponse itemResponse : response) {
            GetResponse response1 = itemResponse.getResponse();
            if (response1 != null && response1.isExists()) {
                System.out.println("response1.getSourceAsString() = " + response1.getSourceAsString());
            }
        }
    }

    /**
     * bulk 批量增删改操作
     */
    @Test
    public void testBulk() throws Exception {
        TransportClient client = getClient();
        BulkRequestBuilder requestBuilder = client.prepareBulk();
        requestBuilder.add(client.prepareIndex("index1", "blog", "9").setSource(
                XContentFactory.jsonBuilder().startObject()
                        .field("id", "3")
                        .field("title", "bulk 批量增demo1")
                        .field("content", "bulk 批量增demo1")
                        .field("postdate", "2019-11-05")
                        .field("url", "csdn.net/79239072")
                        .endObject()
        ));

        requestBuilder.add(client.prepareIndex("index1", "blog", "7").setSource(
                XContentFactory.jsonBuilder().startObject()
                        .field("id", "4")
                        .field("title", "bulk 批量增demo2")
                        .field("content", "bulk 批量增demo2")
                        .field("postdate", "2019-11-05")
                        .field("url", "csdn.net/79239072")
                        .endObject()
        ));

        BulkResponse response = requestBuilder.get();
        if (response.hasFailures()) {
            System.out.println("失败");
        } else {
            System.out.println(" response.status() = " + response.status());

        }


    }


    /**
     * 查询删除
     */
    @Test
    public void testDeleteByQuery() throws Exception {
        TransportClient client = this.getClient();
        BulkByScrollResponse response = DeleteByQueryAction.INSTANCE
                .newRequestBuilder(client)
                .filter(QueryBuilders.matchQuery("title", "模式"))
                .source("index1").get();
        long counts = response.getDeleted();
        System.out.println("counts = " + counts);
    }

    /**
     * 查询所有
     */
    @Test
    public void testMatchAllQuery() throws Exception {
        TransportClient client = getClient();
        MatchAllQueryBuilder matchAllQuery = QueryBuilders.matchAllQuery();
        SearchResponse response = client.prepareSearch("index1", "test_index").setQuery(matchAllQuery)
                .setSize(3).get();
        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            System.out.println("hit.getSourceAsString() = " + hit.getSourceAsString());
            Map<String, Object> map = hit.getSourceAsMap();
            for (String key : map.keySet()) {
                System.out.println(key + " = " + map.get(key));
            }
        }
    }

    /**
     * match query
     */
    @Test
    public void testMatchQuery() throws Exception {
        TransportClient client = getClient();
        MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("test_field", "hello");
        SearchResponse response = client.prepareSearch("test_index", "index1").setQuery(matchQuery)
                .setSize(3).get();
        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            System.out.println("hit.getSourceAsString() = " + hit.getSourceAsString());
            Map<String, Object> map = hit.getSourceAsMap();
            for (String key : map.keySet()) {
                System.out.println(key + "  = " + map.get(key));
            }
        }
    }

    /**
     * multiMatchQuery 一个查询文本在多个字段中匹配,其中一个字段中有则返回
     */
    @Test
    public void testMultiMatchQuery() throws Exception {
        TransportClient client = getClient();
        MultiMatchQueryBuilder multiMatchQuery = QueryBuilders.multiMatchQuery("批量", "title", "content");
        SearchResponse response = client.prepareSearch("index1").setQuery(multiMatchQuery).setSize(3).get();
        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            System.out.println("hit.getSourceAsString() = " + hit.getSourceAsString());
            Map<String, Object> map = hit.getSourceAsMap();
            for (String key : map.keySet()) {
                System.out.println(key + "    =" + map.get(key));
            }
        }
    }


    /**
     * term query
     * term是代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇
     */
    @Test
    public void testTermQuery() throws Exception {
        TransportClient client = getClient();
        TermQueryBuilder termQuery = QueryBuilders.termQuery("name", "jack");
        SearchResponse response = client.prepareSearch("test_index", "company")
                .setQuery(termQuery).setSize(3).get();

        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            System.out.println("hit.getSourceAsString() = " + hit.getSourceAsString());
            Map<String, Object> map = hit.getSourceAsMap();
            for (String key : map.keySet()) {
                System.out.println(key + "    =" + map.get(key));
            }
        }
    }

    /**
     * terms query 多个词查询
     */
    @Test
    public void testTermsQuery() throws Exception {
        TransportClient client = getClient();
        TermsQueryBuilder termsQuery = QueryBuilders.termsQuery("name", "jack", "tom");
        SearchResponse response = client.prepareSearch("test_index", "company")
                .setQuery(termsQuery).setSize(3).get();

        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            Map<String, Object> map = hit.getSourceAsMap();
            for (String key : map.keySet()) {
                System.out.println(key + "= " + map.get(key));
            }
        }
    }

    /**
     * 各种查询
     */
    @Test
    public void testQuerys() throws Exception {
        TransportClient client = getClient();
        //range查询
        // RangeQueryBuilder builder = QueryBuilders.rangeQuery("join_work").from("2019-09-01").to("2019-11-7").format("yyyy-MM-dd");

        //prefix 查询
        //QueryBuilder builder = QueryBuilders.prefixQuery("name","zhao");

        //ids 查询
        // QueryBuilder builder = QueryBuilders.idsQuery().addIds("1","2","3");

        //wildcard 查询:通配符查询
        //QueryBuilder builder = QueryBuilders.wildcardQuery("name","zhao*");

        //type 查询
        //QueryBuilder builder = QueryBuilders.typeQuery("blog");

        //fuzzy 查询: 模糊查询
        QueryBuilder builder = QueryBuilders.fuzzyQuery("name", "jaek");

        SearchResponse response = client.prepareSearch("test_index", "company", "index1")
                .setQuery(builder).setSize(3)
                .get();
        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            Map<String, Object> map = hit.getSourceAsMap();
            for (String key : map.keySet()) {
                System.out.println(key + " = " + map.get(key));
            }
        }

    }


    /**
     * 聚合查询
     */
    @Test
    public void testAgg() throws Exception {
        TransportClient client = getClient();

//       AggregationBuilder agg = AggregationBuilders.max("aggMax").field("age");
//        SearchResponse response = client.prepareSearch("test_index", "company", "index1")
//                .addAggregation(agg).get();
//        Max max = response.getAggregations().get("aggMax");
//        System.out.println("max = " + max.getValue());

//        AggregationBuilder agg = AggregationBuilders.min("aggMin").field("age");
//        SearchResponse response = client.prepareSearch("test_index", "company", "index1").addAggregation(agg).get();
//        Min min = response.getAggregations().get("aggMin");
//        System.out.println("min.getValue() = " + min.getValue());

//        AggregationBuilder agg = AggregationBuilders.avg("aggAvg").field("age");
//        SearchResponse response = client.prepareSearch("test_index", "company", "index1").addAggregation(agg).get();
//        Avg avg = response.getAggregations().get("aggAvg");
//        System.out.println("avg = " + avg.getValue());

//        AggregationBuilder agg = AggregationBuilders.sum("aggSum").field("age");
//        SearchResponse response = client.prepareSearch("test_index", "company", "index1").addAggregation(agg).get();
//        Sum sum = response.getAggregations().get("aggSum");
//        System.out.println("sum = " + sum.getValue());

        //基数:即,如果有4个值,3个值不重复,则返回3
        AggregationBuilder agg = AggregationBuilders.cardinality("aggCardinality").field("age");
        SearchResponse response = client.prepareSearch("index1", "company").addAggregation(agg).get();
        Cardinality cardinality = response.getAggregations().get("aggCardinality");
        System.out.println("cardinality = " + cardinality.getValueAsString());
    }


    /**
     * queryString
     */
    @Test
    public void testQueryString() throws Exception {
        TransportClient client = getClient();
        //CommonTermsQueryBuilder builder = QueryBuilders.commonTermsQuery("name", "jack");

        //  +:必须包含  -:必须不能包含 queryStringQuery查询必须完全满足才返回结果
        //  QueryBuilder builder =QueryBuilders.queryStringQuery("+jiangsu -wuxi");

        //simpleQueryStringQuery 只需要满足其中一个条件就可以返回
        QueryBuilder builder = QueryBuilders.simpleQueryStringQuery("+jiangsu -wuxi");
        SearchResponse response = client.prepareSearch("index1", "company").setQuery(builder).setSize(3).get();
        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            System.out.println("hit.getSourceAsString() = " + hit.getSourceAsString());
            Map<String, Object> map = hit.getSourceAsMap();
            for (String key : map.keySet()) {
                System.out.println(key + " = " + map.get(key));
            }
        }
    }


    /**
     * 组合查询
     */
    @Test
    public void testCombinationQuery() throws Exception {
        TransportClient client = getClient();
//        QueryBuilder builder = QueryBuilders.boolQuery()
//                .must(QueryBuilders.prefixQuery("name", "zhao"))
//                .mustNot(QueryBuilders.matchQuery("adress", "shanghai"))
//                .should(QueryBuilders.matchQuery("adress", "China"))
//                .filter(QueryBuilders.rangeQuery("join_work").gte("2019-09-01").format("yyyy-MM-dd"));


        //constantScoreQuery 不计算相关度分数
        QueryBuilder builder =QueryBuilders.constantScoreQuery(QueryBuilders.wildcardQuery("name","zhao*"));
        SearchResponse response = client.prepareSearch("index1", "company").setQuery(builder)
                .setSize(3).get();
        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            System.out.println("hit.getSourceAsString() = " + hit.getSourceAsString());
        }
    }

    /**
     * 分组聚合
     */
    @Test
    public void testTermsAgg() throws UnknownHostException {
        TransportClient client = getClient();
       AggregationBuilder builder = AggregationBuilders.terms("terms").field("age");
        SearchResponse response = client.prepareSearch("company")
                .addAggregation(builder).execute().actionGet();
        Terms terms = response.getAggregations().get("terms");
        for (Terms.Bucket entry : terms.getBuckets()) {
            System.out.println(entry.getKey()+":"+entry.getDocCount());
        }
                
    }

    /**
     * Filter 聚合
     */
    @Test
    public void testFilterAgg() throws UnknownHostException {
        TransportClient client = getClient();
      QueryBuilder query = QueryBuilders.termQuery("age", 26);
       AggregationBuilder agg = AggregationBuilders.filter("filter", query);
        SearchResponse response = client.prepareSearch("company").addAggregation(agg).execute().actionGet();
        Filter filter = response.getAggregations().get("filter");
        System.out.println("filter.getDocCount() = "+filter.getDocCount());
    }

    /**
     * Filters 聚合
     */
    @Test
    public void testFiltersAgg() throws UnknownHostException {
        TransportClient client = getClient();
        AggregationBuilder agg = AggregationBuilders.filters("filters",
                new FiltersAggregator.KeyedFilter("26",QueryBuilders.termsQuery("age","26")),
                new FiltersAggregator.KeyedFilter("27",QueryBuilders.termsQuery("age","27"))
                );
        SearchResponse response = client.prepareSearch("company").addAggregation(agg).execute().actionGet();
        Filters filters = response.getAggregations().get("filters");
        for (Filters.Bucket entry : filters.getBuckets()) {
            System.out.println(entry.getKey()+":"+entry.getDocCount());
        }
    }

    /**
     * Range 聚合
     */
    @Test
    public void testRangeAgg() throws UnknownHostException {
        TransportClient client = getClient();
        AggregationBuilder agg = AggregationBuilders.range("range")
                .field("age")
                .addUnboundedTo(30)
                .addRange(25,30)
                .addUnboundedFrom(25);
        SearchResponse response = client.prepareSearch("company").addAggregation(agg).execute().actionGet();
        Range range = response.getAggregations().get("range");
        for (Range.Bucket entry : range.getBuckets()) {
            System.out.println(entry.getKey()+":"+entry.getDocCount());
        }
    }

    /**
     * missing 聚合:统计null值的字段有多少个
     */
    @Test
    public void testMissingAgg() throws UnknownHostException {
        TransportClient client = getClient();
        AggregationBuilder agg = AggregationBuilders.missing("missing").field("join_work");
        SearchResponse response = client.prepareSearch("company").addAggregation(agg).execute().actionGet();
        Aggregation missing = response.getAggregations().get("missing");
        System.out.println("missing.toString() = " + missing.toString());

    }


}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值