我们已经准备好了,你呢?

2026我们与您携手共赢,为您的企业形象保驾护航!

mysql date sub_ElasticsearchRepository 实战教程_Spring Boot Elasticsearch 整合方案

在分布式系统架构领域,高效搜索功能已经成为推动业务发展的核心要素。目前,该领域最受欢迎的分布式搜索引擎,凭借其即时响应、灵活扩展以及卓越的数据聚合分析功能,被广泛运用于日志处理、商品搜索、数据监控等多个应用场景。本文将立足实际操作,深入剖析Boot与的两种融合策略,助您迅速学会从基本的增删改查操作到高级的聚合查询技术的全过程实现。

一、核心概念:倒排索引与 优势

其卓越的搜索性能得益于其核心的数据架构——倒排索引技术。与常规数据库的正向索引(将文档与关键词进行对应)不同,倒排索引采用了关键词与文档之间的反向映射,从而实现了极快的全文搜索速度。以文档集合为例,若“一词”出现在文档1、2、4中,倒排索引便会直接记录该词所对应的文档ID及其具体位置,显著提高了检索的效率。

作为分布式搜索引擎, 具备三大核心优势:

分布式架构可轻松实现横向扩展,节点数量可达数百,有效应对PB级数据的处理需求;在数据写入后,实现秒级检索,满足实时业务的高效需求;查询功能丰富,包括全文检索、范围查询、聚合分析等多种复杂操作;此外,我们还提供了一整套整合方案,其中ory方案上手便捷。

数据接口,ory所提供,可经继承方式实现基本的增删改查操作,适用于处理简单的业务需求。

1. 定义实体与 接口

首先,需构建文档的实体类,并在其中添加注解以设定索引;接着,定义一个继承自ory的接口。

java

@Document(indexName = "demo")
public class Demo {
    @Id
    private String id;
    private String imsi;
    private double costTime;
    // 省略getter/setter
}
定义一个公共接口DemoRepository,该接口继承自ElasticsearchRepository。 {
    // 自定义方法(遵循Spring Data命名规范)
    List findByImsi(String imsi);
    
    // 自定义DSL查询
在查询条件中,必须包含对imsi字段的匹配,其值为参数?0所指定;同时,还需要设置时间范围的筛选条件,确保costTime字段在参数?1和?2所定义的时间区间内。
    List通过imsi和价格区间查找,参数分别为imsi字符串、最小价格和最大价格。
}

2. 服务层实现

通过该接口,可以直接执行内置函数或自定函数,以实现数据的处理与操作。

java

@Service
public class DemoService {
    @Autowired
私有变量demoRepository,用于存储Demo仓库实例。
    
    // 保存文档
    public Demo save(Demo demo) {
执行demoRepository的save方法,并将demo作为参数传入。
    }
    
    // 按条件查询
    public List通过imsi和价格区间进行查找,参数包括imsi字符串、最小价格值和最大价格值。
返回demoRepository根据imsi和价格区间查询得到的结果,(imsi, min, max)为查询条件;
    }
}

三、整合方案二:plate 进阶实战

在处理复杂的查询需求,例如进行数据聚合或执行滚动查询时,我们建议采用 plate,因为它能够提供更加灵活的领域特定语言(DSL)构建功能。

1. 配置

通过配置类初始化 ,支持权限认证与集群地址配置:

java

@Configuration
public class Elasticsearch配置类继承自AbstractElasticsearch配置类{
使用注解@Value,指定了Spring Elasticsearch的连接地址,默认为本地主机的9200端口。
    private String[] uris;
    
    @Override
创建并返回一个RestHighLevelClient实例,用于与Elasticsearch进行交互。
创建了一个新的凭证提供者实例,该实例基于基础凭证提供器。
provider配置了凭证信息,指定了认证范围任意,并使用了新的用户名和密码凭证,具体为"user"和"pwd"。
        
创建 RestClientBuilder 对象的实例,名为 builder,通过调用 RestClient.builder 方法实现。
将URI列表转换为HttpHost数组,具体操作为:首先,对uris进行流式处理;接着,对每个元素调用HttpHost的创建方法;最后,将处理后的结果数组化。
设置HttpClient配置回调,通过clientBuilder参数,实现自定义配置。
客户端构建器将默认凭证提供者设置为该提供者。
        );
构建完成后,将返回一个新的RestHighLevelClient实例。
    }
}

2. 高级查询实现(1)组合 Bool 查询

通过 lder 构建多条件查询:

java

public List执行复杂搜索操作,针对指定IMSI号码,在最小值和最大值范围内进行查询。
创建了一个名为BoolQueryBuilder的对象,该对象是通过调用QueryBuilders类中的boolQuery方法生成的。
    if (imsi != null) {
布尔查询中必须包含对"imsi"字段的匹配查询,条件为imsi值。
    }
若min值非空,且max值亦非空,则{
执行查询时,对"costTime"字段应用了范围过滤,确保其值大于等于最小值,同时小于等于最大值。
    }
    
创建一个本地搜索查询对象query,该对象是通过使用NativeSearchQueryBuilder类实例化得到的。
        .withQuery(boolQuery)
使用分页请求,设置起始页码为零,每页显示二十条记录。
        .build();
    
执行查询操作,并返回由ElasticsearchRestTemplate根据给定查询和Demo类类型执行搜索的结果。
        .getSearchHits().stream()
        .map(SearchHit::getContent)
将收集到的元素整合成一个列表。
}

(2)聚合分析实战

以三级分组聚合方式(按照时间、域、IMSI的顺序)为例,我们进行了总计与失败次数的统计工作。

java

public List进行数据统计汇总,参数包括起始时间字符串和结束时间字符串。
    // 构建基础查询条件
创建了一个布尔查询构建器实例,名为boolQuery,通过调用QueryBuilders的boolQuery方法实现。
必须使用查询构建器对“rtime”字段进行范围查询,确保起始时间大于等于设定的开始时间,同时结束时间小于等于设定的结束时间。
    
    // 构建聚合查询
    NativeSearchQuery query = new NativeSearchQueryBuilder()
        .withQuery(boolQuery)
向聚合构建器中添加一个以“按分钟”为名称的时间直方图聚合。
            .field("rtime")
设置固定时间间隔为分钟级的时间序列间隔。
创建子聚合,通过指定"by_domain"作为术语名称,使用AggregationBuilders类。
                .field("vpdndomain")
对数据进行分组,依据“imsi”字段,采用术语聚合构建器。
                    .field("imsi")
设置子聚合,采用计数方式,针对字段"_index"进行统计。
将“fail_count”这一条件应用于聚合构建器,实现子聚合功能。
构建查询时,需使用boolQuery方法,并通过mustNot方法来排除特定的条件。
构建查询条件,针对"resulCode"字段,指定值为"0000"。
                        )))
                )))
        .build();
    
    // 解析聚合结果
    SearchHits执行查询操作后,获取了与Authlog类相关的搜索结果,存储在变量hits中。
获取到名为"by_minute"的聚合数据后,将时间聚合的直方图赋值给变量Histogram timeAgg。
    List result = new ArrayList<>();
在遍历时间聚合对象获取到的桶时,对于每一个时间桶对象timeBucket,执行以下操作:{
timeBucket对象通过获取聚合信息,进而从其中提取名为"by_domain"的特定聚合,并将该聚合赋值给domainAgg变量。
在遍历domainAgg对象获取到的桶集合中,针对每一个属于Terms.Bucket类型的domainBucket元素,进行操作处理。
获取名为"by_imsi"的聚合信息,将其赋值给变量Terms imsiAgg,该信息是通过调用domainBucket对象的getAggregations方法获得的。
在遍历imsiAgg对象获取的桶集合中,针对每一个属于Terms桶的imsiBucket元素,执行:
long total; 获取imsiBucket的聚合信息,从中提取"total_count"对应的值;该值被封装在ValueCount对象中;通过调用getValue()方法,得到最终的long类型total值。
long fail等于imsiBucket获取的聚合数据中名为"fail_count"的聚合对象,再通过该对象获取文档计数的结果。
                result.add(Map.of(
"时间", 时间桶通过其键值获取的字符串表示,
指定域名,域存储桶的键值,以字符串形式呈现。
"imsi",imsiBucket所获取的字符串形式的键值。
                    "total", total,
                    "fail", fail
                ));
            }
        }
    }
    return result;
}

四、针对测试与优化建议,在索引管理方面,建议采用 plate 工具来自动完成索引的创建以及映射的更新。

java

@Test
public void initIndex() {
ops = elasticsearchRestTemplate执行对Demo类进行的索引操作;
    if (!ops.exists()) {
        ops.create();
        ops.putMapping(Demo.class);
    }
}

性能优化:五、总结

Boot与的融合可依据业务难度灵活挑选策略:ory适用于迅速搭建基础功能,而plate则擅长处理复杂查询和聚合分析。在具体项目实施中,必须考虑数据量级和查询环境,科学规划索引架构与查询策略,以充分利用其分布式搜索的强大功能。借助本文的实战攻略,开发者有望迅速掌握融合技巧,打造出高效的搜索系统。

二维码
扫一扫在手机端查看

本文链接:https://by928.com/10583.html     转载请注明出处和本文链接!请遵守 《网站协议》
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。

项目经理在线

我们已经准备好了,你呢?

2020我们与您携手共赢,为您的企业形象保驾护航!

在线客服
联系方式

热线电话

13761152229

上班时间

周一到周五

公司电话

二维码
微信
线