java操作ElasticSearch(包含聚合查询)

1、引入依赖

<!-- es工具-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
		</dependency>

2、配置es连接信息

sring:
  elasticsearch:
    rest:
      uris: "http://localhost:9200"

3、构建索引

@Document(indexName = "test_index_person")
public class TestPerson{
    public TestPerson( String personName, Integer personId, String gmtCreate, String gmtModified) {
        this.personName = personName;
        this.personId = personId;
        this.gmtCreate = gmtCreate;
        this.gmtModified = gmtModified;
    }
    public TestPerson() {

    }
    @Override
    public String toString() {
        return "TestPerson{" +
                "id='" + id + '\'' +
                ", personName='" + personName + '\'' +
                ", personId=" + personId +
                ", gmtCreate=" + gmtCreate +
                ", gmtModified=" + gmtModified +
                '}';
    }

    @Id
    private String id;

    @Field(type = FieldType.Text, analyzer = "ik_analyzer",name = "person_name")
    private String personName;
    @Field(type = FieldType.Integer,name = "person_id")
    private Integer personId;

    @Field(type = FieldType.Date,name = "gmt_create")
    private String gmtCreate;

    @Field(type = FieldType.Date,name = "gmt_modified")
    private String gmtModified;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getPersonName() {
        return personName;
    }

    public void setPersonName(String personName) {
        this.personName = personName;
    }

    public Integer getPersonId() {
        return personId;
    }

    public void setPersonId(Integer personId) {
        this.personId = personId;
    }

    public String getGmtCreate() {
        return gmtCreate;
    }

    public void setGmtCreate(String gmtCreate) {
        this.gmtCreate = gmtCreate;
    }

    public String getGmtModified() {
        return gmtModified;
    }

    public void setGmtModified(String gmtModified) {
        this.gmtModified = gmtModified;
    }
}

4、查询(包含自定义聚合查询)


    @Autowired
    ElasticsearchOperations elasticsearchOperations;
    /***
     * 自定义 match 查询
     */
    @Test
    public void test6(){
        // 构建查询条件
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        // 添加基本分词查询
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("person_name", "小黑子");
        queryBuilder.withQuery(matchQueryBuilder);
        SearchHits<TestPerson> searchHits = elasticsearchOperations.search(queryBuilder.build(), TestPerson.class);
        searchHits.forEach(item ->{
            System.out.println(item);
        });
    }
    /***
     * 自定义 term 查询
     */
    @Test
    public void test7(){
        // 构建查询条件
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        // 添加基本分词查询
        TermQueryBuilder personId = QueryBuilders.termQuery("person_id", "1");
        queryBuilder.withQuery(personId);
        SearchHits<TestPerson> searchHits = elasticsearchOperations.search(queryBuilder.build(), TestPerson.class);
        searchHits.forEach(item ->{
            System.out.println(item);
        });
    }
    /***
     * 自定义 match_all 查询
     */
    @Test
    public void test8(){
        // 构建查询条件
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        // 添加基本分词查询
        MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
        queryBuilder.withQuery(matchAllQueryBuilder);
        SearchHits<TestPerson> searchHits = elasticsearchOperations.search(queryBuilder.build(), TestPerson.class);
        searchHits.forEach(item ->{
            System.out.println(item);
        });
    }
    /***
     * 自定义 match_phrase 查询
     */
    @Test
    public void test9(){
        // 构建查询条件
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        // 添加基本分词查询
        MatchPhraseQueryBuilder matchPhraseQueryBuilder = QueryBuilders.matchPhraseQuery("person_name", "小黑子");
        queryBuilder.withQuery(matchPhraseQueryBuilder);
        SearchHits<TestPerson> searchHits = elasticsearchOperations.search(queryBuilder.build(), TestPerson.class);
        searchHits.forEach(item ->{
            System.out.println(item);
        });
    }
    /***
     * 范围查询
     */
    @Test
    public void test10(){
        // 构建查询条件
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        // 添加基本分词查询
        RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("gmt_create");
        rangeQuery.gte("2024-01-31T11:00:00");
        rangeQuery.lt("2024-07-31T11:00:00");
        queryBuilder.withQuery(rangeQuery);
        SearchHits<TestPerson> searchHits = elasticsearchOperations.search(queryBuilder.build(), TestPerson.class);
        searchHits.forEach(item ->{
            System.out.println(item);
        });
    }
    /***
     * 模糊匹配
     */
    @Test
    public void test11(){
        // 构建查询条件
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        // 添加基本分词查询
        FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("person_name", "张三");
        queryBuilder.withQuery(fuzzyQueryBuilder);
        SearchHits<TestPerson> searchHits = elasticsearchOperations.search(queryBuilder.build(), TestPerson.class);
        searchHits.forEach(item ->{
            System.out.println(item);
        });
    }
    /***
     * 布尔查询 必须匹配(must) 过滤(filter) 至少匹配一个(should)
     */
    @Test
    public void test12(){
        // 构建查询条件
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        // 构建布尔查询
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

        //布尔查询下添加must
        List<QueryBuilder> must = boolQueryBuilder.must();
        TermQueryBuilder personId = QueryBuilders.termQuery("person_id", "1");
        must.add(personId);

        //布尔查询下添加filter
        List<QueryBuilder> filter = boolQueryBuilder.filter();
        RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("gmt_create");
        rangeQuery.gte("2024-07-31T10:00:00");
        filter.add(rangeQuery);

       //布尔查询下添加should
        List<QueryBuilder> should = boolQueryBuilder.should();
        TermQueryBuilder shouldTerm = QueryBuilders.termQuery("person_id", "111");
        should.add(shouldTerm);
        //布尔查询下添加must_not
        List<QueryBuilder> queryBuilders = boolQueryBuilder.mustNot();
        TermQueryBuilder mustNotTerm = QueryBuilders.termQuery("person_name", "哈哈哈");
        queryBuilders.add(mustNotTerm);

        //构建布尔查询语法,准备执行
        queryBuilder.withQuery(boolQueryBuilder);
        SearchHits<TestPerson> searchHits = elasticsearchOperations.search(queryBuilder.build(), TestPerson.class);
        searchHits.forEach(item ->{
            System.out.println(item);
        });
    }
    /***
     * 分页
     */
    @Test
    public void test13(){
        // 构建查询条件
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        // 查询全部
        MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
        queryBuilder.withQuery(matchAllQueryBuilder);


        Pageable pageable = PageRequest.of(0, 10, Sort.by("personId").descending());

        queryBuilder.withPageable(pageable);
        SearchHits<TestPerson> searchHits = elasticsearchOperations.search(queryBuilder.build(), TestPerson.class);
        searchHits.forEach(item ->{
            System.out.println(item);
        });
    }
    /***
     * 对查询出来的值进行聚合查询 统计每个唯一值的个数
     */
    @Test
    public void test14(){
        // 构建查询条件
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        //查询数据
        MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("person_name", "张三");
        queryBuilder.withQuery(matchQuery);
        //聚合数据
        TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("test_aggs").field("gmt_create");
        queryBuilder.addAggregation(termsAggregationBuilder);
        SearchHits<TestPerson> searchHits = elasticsearchOperations.search(queryBuilder.build(), TestPerson.class);
        searchHits.forEach(item ->{
            System.out.println(item);
        });
        Aggregations aggregations = searchHits.getAggregations();
        // 检查 aggregations 是否为 null
        if (aggregations != null) {
            // 第二步:通过聚合名称获取特定的聚合结果
            Terms testAggs = aggregations.get("test_aggs");
            // 检查特定聚合是否存在
            if (testAggs != null) {
                // 第三步:遍历聚合中的桶(buckets)
                for (Terms.Bucket bucket : testAggs.getBuckets()) {
                    // 获取桶的键(在这个例子中是 gmt_create 的值)
                    String keyAsString = bucket.getKeyAsString();
                    // 获取桶中文档的数量
                    long docCount = bucket.getDocCount();
                    // 打印或处理每个桶的结果
                    System.out.println("Key: " + keyAsString + ", DocCount: " + docCount);
                }
            }
        }
    }
    /***
     * 对查询出来的值进行聚合查询 统计每个唯一值的个数  仅仅返回聚合结果
     */
    @Test
    public void test15(){
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        //仅仅返回聚合结果
        queryBuilder.withPageable(PageRequest.of(0,1));
        //查询数据
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("person_name", "张三");
        queryBuilder.withQuery(matchQueryBuilder);
        //聚合
        TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("test_aggs").field("gmt_create");
        queryBuilder.addAggregation(aggregationBuilder);
        //获取聚合信息
        SearchHits<TestPerson> search = elasticsearchOperations.search(queryBuilder.build(), TestPerson.class);
        Aggregations aggregations = search.getAggregations();
        if (aggregations != null){
            Terms terms = aggregations.get("test_aggs");
            List<? extends Terms.Bucket> buckets = terms.getBuckets();
            buckets.forEach(item ->{
                System.out.println("key:"+item.getKeyAsString()  +"===="+"doc_count:"+item.getDocCount());
            });
        }

    }
    /***
     * 多个聚合
     */
    @Test
    public void test16(){
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        //仅仅返回聚合结果
        queryBuilder.withPageable(PageRequest.of(0,1));
        TermsAggregationBuilder test_aggs = AggregationBuilders.terms("test_aggs").field("gmt_create");
        queryBuilder.addAggregation(test_aggs);
        AvgAggregationBuilder test_aggs2 = AggregationBuilders.avg("test_aggs2").field("person_id");
        queryBuilder.addAggregation(test_aggs2);
        SearchHits<TestPerson> search = elasticsearchOperations.search(queryBuilder.build(), TestPerson.class);
        Aggregations aggregations = search.getAggregations();
        if (aggregations != null){
            Terms test_aggs1 = aggregations.get("test_aggs");
            if (test_aggs != null){
                test_aggs1.getBuckets().forEach(item ->{
                    System.out.println("key:"+ item.getKeyAsString()+"===="+"doc_count:"+item.getDocCount());
                });
            }
            Avg test2_aggs = aggregations.get("test_aggs2");
            System.out.println( test2_aggs.getValue());
        }
    }
    /***
     * 子聚合 先分组,再计算
     */
    @Test
    public void test17(){
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        queryBuilder.withPageable(PageRequest.of(0,1));
        TermsAggregationBuilder test_aggs = AggregationBuilders.terms("test_aggs").field("gmt_create");
        test_aggs.subAggregation(AggregationBuilders.avg("son_aggs_test").field("person_id"));
        queryBuilder.addAggregation(test_aggs);
        SearchHits<TestPerson> search = elasticsearchOperations.search(queryBuilder.build(), TestPerson.class);
        Aggregations aggregations = search.getAggregations();
        Terms testAgges =  aggregations.get("test_aggs");
        testAgges.getBuckets().forEach(item ->{
            Avg aggregations1 = item.getAggregations().get("son_aggs_test");
            System.out.println("key:"+item.getKeyAsString()+"--doc_count:"+item.getKeyAsString()+"--son_aggs_test"+aggregations1.getValue());
        });
    }
    /**
     * 取聚合最大值
     */
    @Test
    public void test18(){
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        queryBuilder.addAggregation(AggregationBuilders.max("test_agg").field("person_id"));
        SearchHits<TestPerson> search = elasticsearchOperations.search(queryBuilder.build(), TestPerson.class);
        Aggregations aggregations = search.getAggregations();
        Max test_agg = aggregations.get("test_agg");
        System.out.println(test_agg.getValue());
    }
### 回答1: Java使用Elasticsearch查询可以通过以下步骤实现: 1. 首先需要安装ElasticsearchJava客户端库,可以使用Maven或Gradle等构建工具进行安装。 2. 创建Elasticsearch客户端对象,连接到Elasticsearch集群。 3. 构建查询请求,可以使用QueryBuilder对象来构建查询条件。 4. 执行查询请求,可以使用SearchRequest和SearchResponse对象来执行查询操作。 5. 处理查询结果,可以使用SearchHits对象来获取查询结果。 6. 关闭Elasticsearch客户端对象,释放资源。 以上是Java使用Elasticsearch查询的基本步骤,具体实现可以参考Elasticsearch官方文档和Java客户端库的API文档。 ### 回答2: Java是一种流行的编程语言,而Elasticsearch是一个基于Java的开源搜索引擎,具有强大的搜索和分析能力。使用Java开发Elasticsearch查询可以方便地实现搜索、分析、可视化和数据仓库等功能,以下是使用Java进行Elasticsearch查询的一些方法: 1. 引入ElasticsearchJava客户端库:需要添加maven依赖,或手动将.jar文件添加到类路径中。 2. 连接Elasticsearch:需要指定Elasticsearch节点的IP、端口和集群名称,通过创建TransportClient对象来建立连接。 3. 构建查询对象:可以使用QueryBuilder来构建一个查询对象,包括TermQuery、MatchQuery、RangeQuery等。 4. 执行查询:通过调用TransportClient的search方法执行查询,并指定查询对象和查询的返回类型。 5. 处理查询结果:可以使用SearchResponse对象获取查询结果,包括总命中数、查询耗时、每个文档的得分和聚合结果等。 6. 统计结果分析:可以使用AggregationBuilder构建聚合查询,并统计结果。 使用Java进行Elasticsearch查询需要熟悉Elasticsearch的查询语法和API,以及Java语言的编程能力。此外,需要合理使用索引、映射、分片等功能,以达到更高效的查询。在实际开发中,还需要考虑数据量、查询复杂度、网络带宽等因素,以获得最佳的查询性能。总之,使用Java进行Elasticsearch查询可以帮助开发者更好地利用Elasticsearch的强大功能,实现高效的搜索和分析。 ### 回答3: Java使用Elasticsearch查询需要先了解Elasticsearch的基本概念和使用方法。Elasticsearch是一个开源的分布式搜索引擎,主要用于全文检索、数据分析以及实时数据反馈。它基于Lucene引擎开发,提供了RESTful API和JSON格式的查询接口,可以在数据量大的情况下快速查询、过滤和聚合。Java作为一种主流编程语言,与Elasticsearch的集成非常便捷。 第一步是创建一个Elasticsearch客户端对象,可以使用ElasticsearchJava API创建,代码如下: ```java TransportClient client = new PreBuiltTransportClient(Settings.EMPTY) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300)); ``` 其中9300是Elasticsearch默认的端口,客户端对象可以通过addTransportAddress方法连接到Elasticsearch集群中的某个节点。 第二步是创建查询条件,Elasticsearch查询可以通过QueryBuilder对象构建。常见的查询条件包括: - matchQuery:基于match查询条件查询满足指定字段和关键字的文档。 - termQuery:基于term查询条件查询满足指定字段和精确值的文档。 - boolQuery:基于布尔查询条件组合多个查询条件,支持must、must_not、should和filter等关键字。 代码示例: ```java QueryBuilder queryBuilder = QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery("title", "Java")) .mustNot(QueryBuilders.termQuery("status", "0")) .should(QueryBuilders.termQuery("authorId", "123")) .filter(QueryBuilders.rangeQuery("createTime").gte("2022-01-01")); ``` 第三步是执行查询,在Elasticsearch中,查询是通过SearchRequestBuilder对象构建和执行的,代码示例: ```java SearchResponse response = client.prepareSearch("articles") .setTypes("article") .setQuery(queryBuilder) .setFrom(0) .setSize(10) .addSort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC)) .get(); ``` 其中,articles是索引名,article是类型名,setQuery方法传入查询条件,setFrom和setSize用于分页查询,addSort方法可以设置排序。查询结果是返回的SearchResponse对象,可以通过hits方法获取命中的文档信息。 最后,记得关闭客户端资源: ```java client.close(); ``` 总的来说,Java使用Elasticsearch查询的步骤包括创建Elasticsearch客户端对象、创建查询条件、执行查询和关闭客户端资源。Elasticsearch提供了丰富的查询API和查询条件,可以灵活地满足不同的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诸葛博仌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值