欢迎投稿

今日深度:

Elasticsearch Java API 之Query、Filter、count、Aggregations,

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 copy
  1. QueryBuilder qb = termQuery("_type""log");  
  2. SearchResponse response = transportClient.prepareSearch("test_tx")  
  3.                 .setQuery(qb)  
  4.                 .setFrom(0).setSize(60).setExplain(true)  
  5.                 .execute()  
  6.                 .actionGet();  
    prepareSearch(String str),str为index即索引名,如若prepareSearch()即为查询整个集群。
    多条件查询Query查询:
[java] view plain copy
  1. QueryBuilder qb = boolQuery()  
  2.                 .must(termQuery("type""typeValue"))     
  3.                 .mustNot(termsQuery("logrank",logrank)).  
  4.                 .should(termsQuery("logsource",logsource));  
    must、mustNot、should分别代表and、not、or逻辑。
    构造好Query传到elasticsearch里进行查询:

[java] view plain copy
  1. SearchResponse response = client.prepareSearch()     
  2.         .setQuery(query)     
  3.         .setFrom(0).setSize(60).setExplain(true)     
  4.         .execute()     
  5.         .actionGet();   
2、Filter过滤器
    过滤器(filter)通常用于过滤文档的范围,比如某个字段是否属于某个类型,或者是属于哪个时间区间。filter是不计算相关性的,同时可以cache。因此,filter速度要快于query。
[java] view plain copy
  1. FilterBuilders.andFilter(    
  2.                 FilterBuilders.rangeFilter("age").from(1).to(100),    
  3.                 FilterBuilders.prefixFilter("name""Jack")    
  4.         );   

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

[java] view plain copy
  1. FilterBuilders.boolFilter()    
  2.                 .must(FilterBuilders.termFilter("name""Jack"))    
  3.                 .mustNot(FilterBuilders.rangeFilter("age").from(10).to(30))    
  4.                 .should(FilterBuilders.termFilter("home""hometown"));    
  5.     }  
    构造好Filter 传到elasticsearch里进行过滤:[java] view plain copy
  1. SearchResponse response = client.prepareSearch()    
  2.         .setFilter(filterBuilder)    
  3.         .execute().actionGet();   
3、Count
    count API允许轻松地执行一个查询,获得匹配的数量,可以跨越一个或多个index ,一个或多个type。

[java] view plain copy
  1. QueryBuilder qb = boolQuery()  
  2.                 .must(termQuery("logRank", logRank));  
  3.   
  4.         CountResponse response = client.prepareCount("test_tx"// 索引  
  5.                 .setQuery(qb) //类型  
  6.                 .execute().actionGet();  

4、Aggregations聚合
4.1 DateHistogram日期聚合
    date histogram为Bucket(桶)聚合中的常用聚合。
    其中,interval字段支持多种关键字:`year`, `quarter`, `month`, `week`, `day`, `hour`, `minute`, `second`,
    返回的结果可以通过设置format进行格式化。

[java] view plain copy
  1. DateHistogramBuilder dateAgg = AggregationBuilders.dateHistogram("dateAgg");//取名字  
  2.         dateAgg.field("time");     //设置聚合字段  
  3.         dateAgg.interval(DateHistogram.Interval.YEAR);  
  4.         //dateAgg.interval(DateHistogram.Interval.QUARTER);  
  5.         //dateAgg.interval(DateHistogram.Interval.MONTH);  
  6.         //dateAgg.interval(DateHistogram.Interval.weeks(2));  
  7.         //dateAgg.interval(DateHistogram.Interval.days(1));  
  8.         //dateAgg.interval(DateHistogram.Interval.hours(2));  
  9.         //dateAgg.interval(DateHistogram.Interval.minutes(5));  
  10.         //dateAgg.interval(DateHistogram.Interval.seconds(10));  
  11.         dateAgg .format("yyyy-MM-dd")       //设置聚合日期格式  
  12.                 .minDocCount(0)              //设置聚合后最小值,防止聚合数为0时得到的结果没有该项  
  13.                 .extendedBounds(beginDate, endDate);    //强制设置时间范围  
    然后在elasticsearch中开始聚合:
[java] view plain copy
  1. SearchResponse response = client.prepareSearch()  
  2.                 .addAggregation("dateAgg")  
  3.                 .execute().actionGet();  
  4.         Map<String, Long> logNumByDay = new HashMap<String, Long>();  
  5.         DateHistogram aggByDay = response.getAggregations().get("dateAgg");  //得到聚合后的桶  
  6.         for(DateHistogram.Bucket logByDay : aggByDay.getBuckets())           //遍历桶  
  7.         {  
  8.             logNumByDay.put(logByDay.getKey(),logByDay.getDocCount());       //对每个桶取信息构造键值对  
  9.         }  

4.2 terms聚合

[java] view plain copy
  1. public Map<String, Long> getTypesAggNum(String type, List<String> logRank, Date beginDate, Date endDate) {  
  2.         TermsBuilder typeAgg = AggregationBuilders  
  3.                 .terms("typeAgg")    //取名字  
  4.                 .field(type);       //聚合属性  
  5.   
  6.         SearchResponse response = client.prepareSearch("testindex")  
  7.                 .setQuery(boolQuery()  
  8.                         .must(termsQuery("logRank", logRank))  
  9.                         .must(rangeQuery("time").from(beginDate).to(endDate))  
  10.                 )  
  11.                 .addAggregation(typeAgg)  
  12.                 .execute().actionGet();  
  13.   
  14.         Map<String, Long> logNumByAgg = new LinkedHashMap<>();  
  15.         Terms aggByType = response.getAggregations().get("typeAgg");   //取结果  
  16.         for(Bucket logByType : aggByType.getBuckets())  
  17.         {  
  18.             logNumByAgg.put(logByType.getKey(),logByType.getDocCount());  
  19.         }  
  20.         return logNumByAgg;  
  21.     }  

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


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


版权声明:本文为博主原创文章,未经博主允许不得转载。 http://blog.csdn.net/Sugar_girl/article/details/62237469

www.htsjk.Com true http://www.htsjk.com/Elasticsearch/28909.html NewsArticle Elasticsearch Java API 之Query、Filter、count、Aggregations,  1、Query查询器     查询器(query)倾向于更准确的查找,根据elasticsearch内部分析相关度得到与搜索内容匹配度更高的内容,因此速度...
相关文章
    暂无相关文章
评论暂时关闭