1.百度百科

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
我们建立一个网站或应用程序,并要添加搜索功能,但是想要完成搜索工作的创建是非常困难的。我们希望搜索解决方案要运行速度快,我们希望能有一个零配置和一个完全免费的搜索模式,我们希望能够简单地使用JSON通过HTTP来索引数据,我们希望我们的搜索服务器始终可用,我们希望能够从一台开始并扩展到数百台,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。因此我们利用Elasticsearch来解决所有这些问题及可能出现的更多其它问题。

2.实际项目中对es的使用

上面是百度上面关于es的解释,下面说一下ES在实际项目中的应用,在我做的项目中,由于数据量太过庞大,传统的mysql和oracle数据库无法满足这样庞大的数据,因此选择es搜索引擎,项目使用时全是从es表中去查询数据,下面就说一下我在实际项目中,Java如何使用es来进行查询操作,

简单的查询大家百度一下也可以学会,后续我会详细更新文章,下面主要说一下es的聚合查询。
聚合类似于mysql中的group by分组查询,下面通过代码来说明es的聚合查询

先新建BoolQueryBuilder —相当于写入你的查询条件

BoolQueryBuilder builders = QueryBuilders.boolQuery();
 builders.must(QueryBuilders.termQuery(CommonConfig.IN_ID, objects)); (CommonConfig.IN_ID是es中的表的字段,objects是你传入的参数,查询条件)
 builders.must(QueryBuilders.rangeQuery(CommonConfig.GMT_CREATE).from(relationParam.getStartTime()).to(relationParam.getEndTime()));
 builders.must(QueryBuilders.termsQuery(CommonConfig.R_TYPE, rTypes));

下面是三重聚合(会了三重聚合其他全是浮云)

TermsAggregationBuilder inIdAgg = AggregationBuilders.terms(CommonConfig.IN_ID).field(CommonConfig.IN_ID);
 TermsAggregationBuilder outIdAgg = AggregationBuilders.terms(CommonConfig.OUT_ID).field(CommonConfig.OUT_ID).size(1000);
 TermsAggregationBuilder rtypeAgg = AggregationBuilders.terms(CommonConfig.R_TYPE).field(CommonConfig.R_TYPE).size(1000);
inIdAgg.subAggregation(outIdAgg);
    outIdAgg.subAggregation(rtypeAgg);

创建SearchRequestBuilder

java 搜索引擎 模式匹配算法库 java的搜索引擎_三重聚合


SearchRequestBuilder searchRequestBuilder = client.prepareSearch(dynamicRelationIndex).setTypes(dynamicRelationType);
 searchRequestBuilder.setQuery(builders);

数据返回

SearchResponse searchResponse = searchRequestBuilder.addAggregation(inIdAgg).execute().actionGet();

获取数据

Terms terms = searchResponse.getAggregations().get(CommonConfig.IN_ID);
 if( null != terms){
 Iterator<Terms.Bucket> inIdIter = terms.getBuckets().iterator();
 while (inIdIter.hasNext()) {
 Terms.Bucket mainIdBucket = inIdIter.next();
 Terms subIdTerms = mainIdBucket.getAggregations().get(CommonConfig.OUT_ID);
 if (null != subIdTerms) {
 Iterator<Terms.Bucket> subIdIter = subIdTerms.getBuckets().iterator();
 while (subIdIter.hasNext()) {
 Terms.Bucket outIdBucket = subIdIter.next();
 Terms tagTerms = outIdBucket.getAggregations().get(CommonConfig.R_TYPE);
 if (null != tagTerms) {
 Iterator<Terms.Bucket> tagIter = tagTerms.getBuckets().iterator();
 while (tagIter.hasNext()) {
 Terms.Bucket rTypeBucket = tagIter.next();
 }
 }
 }
 }
 }
 }

获取自己想要的数据就可以了,

由于时间仓促,写的比较少,主要介绍三重聚合供大家参考,如有不对的地方请指正