elasticsearch Java API 之Facets(统计)

TermsFacet

可以指定一个字段,es将返回在指定字段中使用最多的词项,size指定了最多返回多少个最频繁词项。包含其他词项的文档将

被包含在结果的other字段中计数。

//生成一般查询的统计
        TermsFacetBuilder termsFacet = FacetBuilders.termsFacet("termF1").field("accountId").size(10);
        
        SearchResponse sr = client.prepareSearch("hermes3")
                .setQuery(QueryBuilders.matchAllQuery())
                .addFacet(termsFacet)
                .execute().actionGet();
        
        TermsFacet f = (TermsFacet) sr.getFacets().facetsAsMap().get("f");
        
        System.out.println(f.getTotalCount());
        System.out.println(f.getOtherCount());
        System.out.println(f.getMissingCount());
        
        for (TermsFacet.Entry entry : f) {
            System.out.println("t:" + entry.getTerm()); // Term
            System.out.println("c:" + entry.getCount()); // Doc count
            System.out.println("----");
        }

Range Facet

能够获得一个属于指定范围集的文档个数。例如我们可以获取某个字段中,小于90、90-180、以及大于180的文档个数。

FacetBuilders.rangeFacet("f")
    .field("price")         // Field to compute on
    .addUnboundedFrom(90)    // from -infinity to 3 (excluded)
    .addRange(90, 180)         // from 3 to 6 (excluded)
    .addUnboundedTo(180);     // from 6 to +infinity

// sr is here your SearchResponse object
RangeFacet f = (RangeFacet) sr.getFacets().facetsAsMap().get("f");
// For each entry
for (RangeFacet.Entry entry : f) {
    entry.getFrom();    // Range from requested
    entry.getTo();      // Range to requested
    entry.getCount();   // Doc count
    entry.getMin();     // Min value
    entry.getMax();     // Max value
    entry.getMean();    // Mean
    entry.getTotal();   // Sum of values
}

Histogram Facet

可以使我们能够对字段取值按间隔统计建立直方图(针对数值型或者日期型字段)。比如查询price字段,每隔1(interval)有多少文档。

HistogramFacetBuilder facet = FacetBuilders.histogramFacet("f")
    .field("price")
    .interval(1);

// sr is here your SearchResponse object
HistogramFacet f = (HistogramFacet) sr.getFacets().facetsAsMap().get("f");
// For each entry
for (HistogramFacet.Entry entry : f) {
    entry.getKey();     // Key (X-Axis)
    entry.getCount();   // Doc count (Y-Axis)
}

// 日期类型
FacetBuilders.dateHistogramFacet("f")
    .field("date")      // Your date field
    .interval("year");  // You can also use "quarter", "month", "week", "day",
                        // "hour" and "minute" or notation like "1.5h" or "2w"

// sr is here your SearchResponse object
DateHistogramFacet f = (DateHistogramFacet) sr.getFacets().facetsAsMap().get("f");
// For each entry
for (DateHistogramFacet.Entry entry : f) {
    entry.getTime();    // Date in ms since epoch (X-Axis)
    entry.getCount();   // Doc count (Y-Axis)
}

Filter Fact

简单的统计类型,返回与指定过滤相匹配的文档个数。

FacetBuilders.filterFacet("f",
    FilterBuilders.termFilter("brand", "heineken"));

FilterFacet f = (FilterFacet) sr.getFacets().facetsAsMap().get("f");
f.getCount();

Query Facet

最简单的统计类型,能够在统计的结果中得到匹配指定查询的文档个数。(类似count API???)

FacetBuilders.queryFacet("f",
    QueryBuilders.matchQuery("brand", "heineken"));

QueryFacet f = (QueryFacet) sr.getFacets().facetsAsMap().get("f");
f.getCount();

Statistical

可以让我们对一个数值型字段计算统计信息。我们可以得到个数、总和、平方和、均值、最小值,最大值、方差和标准差。

FacetBuilders.statisticalFacet("f")
   .field("price");

StatisticalFacet f = (StatisticalFacet) sr.getFacets().facetsAsMap().get("f");
f.getCount();           // Doc count 文档个数
f.getMin();             // Min value 最小值
f.getMax();             // Max value 最大值
f.getMean();            // Mean 平均值
f.getTotal();           // Sum of values 最大值
f.getStdDeviation();    // Standard Deviation 标准差
f.getSumOfSquares();    // Sum of Squares 平方和
f.getVariance();        // Variance 方差

Terms stats

综合了statistical + terms统计。比如希望对brand进行terms统计,然后又同时对price字段进行值的划分。

FacetBuilders.termsStatsFacet("f")
    .keyField("brand")
    .valueField("price");

TermsStatsFacet f = (TermsStatsFacet) sr.getFacets().facetsAsMap().get("f");
// terms的结果
f.getTotalCount();      // Total terms doc count
f.getOtherCount();      // Not shown terms doc count
f.getMissingCount();    // Without term doc count

// For each entry
for (TermsStatsFacet.Entry entry : f) {
    entry.getTerm();            // Term terms的结果
    entry.getCount();           // Doc count
    entry.getMin();             // Min value
    entry.getMax();             // Max value
    entry.getMean();            // Mean
    entry.getTotal();           // Sum of values
}

  Geo Distance Facet

暂不介绍。如有需要再查资料了解。



你可能感兴趣的:(elasticsearch Java API 之Facets(统计))