100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Elasticsearch Java API 之Query Filter count Aggregations

Elasticsearch Java API 之Query Filter count Aggregations

时间:2018-10-17 18:19:56

相关推荐

Elasticsearch Java API 之Query Filter count Aggregations

1、Query查询器

查询器(query)倾向于更准确的查找,根据elasticsearch内部分析相关度得到与搜索内容匹配度更高的内容,因此速度较慢。

elasticsearch有着默认分词器。term是代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇。使用term要确定的是这个字段是否“被分析”(analyzed),默认的字符串是被分析的。

例如存入“日志”,分词器默认把中文分割存储,存为“日”“志”,当查询“日志”时发现查不到;或者存入"error log",因其中有空格,所以其实存入es的数据为"error""log",当查询"error log"时会发现查不到。这是因为默认"index":"analyzed",即默认对该字段进行分析,可设置"index":"not_analyzed"即不对该字段进行分词。

match是查询的字符串也是要被分析的,如果存入字符串是被分析的,如果想被查到,就必须要用matchquery。

构造Query查询器实例:

[java]view plain copyQueryBuilderqb=termQuery("_type","log");SearchResponseresponse=transportClient.prepareSearch("test_tx").setQuery(qb).setFrom(0).setSize(60).setExplain(true).execute().actionGet(); prepareSearch(String str),str为index即索引名,如若prepareSearch()即为查询整个集群。

多条件查询Query查询:[java]view plain copyQueryBuilderqb=boolQuery().must(termQuery("type","typeValue")).mustNot(termsQuery("logrank",logrank))..should(termsQuery("logsource",logsource)); must、mustNot、should分别代表and、not、or逻辑。

构造好Query传到elasticsearch里进行查询:

[java]view plain copySearchResponseresponse=client.prepareSearch().setQuery(query).setFrom(0).setSize(60).setExplain(true).execute().actionGet();

2、Filter过滤器
过滤器(filter)通常用于过滤文档的范围,比如某个字段是否属于某个类型,或者是属于哪个时间区间。filter是不计算相关性的,同时可以cache。因此,filter速度要快于query。

[java]view plain copyFilterBuilders.andFilter(FilterBuilders.rangeFilter("age").from(1).to(100),FilterBuilders.prefixFilter("name","Jack"));

同样,多条件查询也可以用boolFilter():

[java]view plain copyFilterBuilders.boolFilter().must(FilterBuilders.termFilter("name","Jack")).mustNot(FilterBuilders.rangeFilter("age").from(10).to(30)).should(FilterBuilders.termFilter("home","hometown"));} 构造好Filter 传到elasticsearch里进行过滤:[java]view plain copySearchResponseresponse=client.prepareSearch().setFilter(filterBuilder).execute().actionGet();

3、Count
count API允许轻松地执行一个查询,获得匹配的数量,可以跨越一个或多个index ,一个或多个type。

[java]view plain copyQueryBuilderqb=boolQuery().must(termQuery("logRank",logRank));CountResponseresponse=client.prepareCount("test_tx")//索引.setQuery(qb)//类型.execute().actionGet();

4、Aggregations聚合
4.1 DateHistogram日期聚合

date histogram为Bucket(桶)聚合中的常用聚合。

其中,interval字段支持多种关键字:`year`, `quarter`, `month`, `week`, `day`, `hour`, `minute`, `second`,

返回的结果可以通过设置format进行格式化。

[java]view plain copyDateHistogramBuilderdateAgg=AggregationBuilders.dateHistogram("dateAgg");//取名字dateAgg.field("time");//设置聚合字段dateAgg.interval(DateHistogram.Interval.YEAR);//dateAgg.interval(DateHistogram.Interval.QUARTER);//dateAgg.interval(DateHistogram.Interval.MONTH);//dateAgg.interval(DateHistogram.Interval.weeks(2));//dateAgg.interval(DateHistogram.Interval.days(1));//dateAgg.interval(DateHistogram.Interval.hours(2));//dateAgg.interval(DateHistogram.Interval.minutes(5));//dateAgg.interval(DateHistogram.Interval.seconds(10));dateAgg.format("yyyy-MM-dd")//设置聚合日期格式.minDocCount(0)//设置聚合后最小值,防止聚合数为0时得到的结果没有该项.extendedBounds(beginDate,endDate);//强制设置时间范围 然后在elasticsearch中开始聚合:

[java]view plain copySearchResponseresponse=client.prepareSearch().addAggregation("dateAgg").execute().actionGet();Map<String,Long>logNumByDay=newHashMap<String,Long>();DateHistogramaggByDay=response.getAggregations().get("dateAgg");//得到聚合后的桶for(DateHistogram.BucketlogByDay:aggByDay.getBuckets())//遍历桶{logNumByDay.put(logByDay.getKey(),logByDay.getDocCount());//对每个桶取信息构造键值对}

4.2 terms聚合

[java]view plain copypublicMap<String,Long>getTypesAggNum(Stringtype,List<String>logRank,DatebeginDate,DateendDate){TermsBuildertypeAgg=AggregationBuilders.terms("typeAgg")//取名字.field(type);//聚合属性SearchResponseresponse=client.prepareSearch("testindex").setQuery(boolQuery().must(termsQuery("logRank",logRank)).must(rangeQuery("time").from(beginDate).to(endDate))).addAggregation(typeAgg).execute().actionGet();Map<String,Long>logNumByAgg=newLinkedHashMap<>();TermsaggByType=response.getAggregations().get("typeAgg");//取结果for(BucketlogByType:aggByType.getBuckets()){logNumByAgg.put(logByType.getKey(),logByType.getDocCount());}returnlogNumByAgg;}

上述代码为以“logRank”属性取值为logRank链表内元素并且时间范围在beginDate与endDate之间条件进行查询后,根据type进行聚合,聚合后的结果为terms类型,terms聚合为根据属性所有取值进行聚合。

一些官方(官方才是最好用的):Java API、es权威指南、真正官方

版权声明:本文为博主原创文章,未经博主允许。 /Sugar_girl/article/details/62237469

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。