facets

Elasticsearch提供完整的java API用来支持facets。在查询的过程中,将需要计数的facets添加到FacetBuilders中。然后将该FacetBuilders条件到查询请求中。

  1. SearchResponse sr = node.client().prepareSearch()
  2. .setQuery( /* your query */ )
  3. .addFacet( /* add a facet */ )
  4. .execute().actionGet();

为了构建facets请求,需要用到FacetBuilders帮助类。你只需要在你的程序中导入它即可。

  1. import org.elasticsearch.search.facet.FacetBuilders.*;

terms facet

准备一个facet请求

下面的例子新建一个facet请求

  1. FacetBuilders.termsFacet("f")
  2. .field("brand")
  3. .size(10);

利用facet响应

  1. import org.elasticsearch.search.facet.terms.*;
  2. // sr is here your SearchResponse object
  3. TermsFacet f = (TermsFacet) sr.getFacets().facetsAsMap().get("f");
  4. f.getTotalCount(); // Total terms doc count
  5. f.getOtherCount(); // Not shown terms doc count
  6. f.getMissingCount(); // Without term doc count
  7. // For each entry
  8. for (TermsFacet.Entry entry : f) {
  9. entry.getTerm(); // Term
  10. entry.getCount(); // Doc count
  11. }

范围facet

准备一个facet请求

下面的例子新建一个facet请求

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

利用facet响应

  1. import org.elasticsearch.search.facet.range.*;
  2. // sr is here your SearchResponse object
  3. RangeFacet f = (RangeFacet) sr.getFacets().facetsAsMap().get("f");
  4. // For each entry
  5. for (RangeFacet.Entry entry : f) {
  6. entry.getFrom(); // Range from requested
  7. entry.getTo(); // Range to requested
  8. entry.getCount(); // Doc count
  9. entry.getMin(); // Min value
  10. entry.getMax(); // Max value
  11. entry.getMean(); // Mean
  12. entry.getTotal(); // Sum of values
  13. }

直方图(Histogram) Facet

准备一个facet请求

下面的例子新建一个facet请求

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

利用facet响应

  1. import org.elasticsearch.search.facet.histogram.*;
  2. // sr is here your SearchResponse object
  3. HistogramFacet f = (HistogramFacet) sr.getFacets().facetsAsMap().get("f");
  4. // For each entry
  5. for (HistogramFacet.Entry entry : f) {
  6. entry.getKey(); // Key (X-Axis)
  7. entry.getCount(); // Doc count (Y-Axis)
  8. }

日期直方图(Histogram) Facet

准备一个facet请求

下面的例子新建一个facet请求

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

利用facet响应

  1. import org.elasticsearch.search.facet.datehistogram.*;
  2. // sr is here your SearchResponse object
  3. DateHistogramFacet f = (DateHistogramFacet) sr.getFacets().facetsAsMap().get("f");
  4. // For each entry
  5. for (DateHistogramFacet.Entry entry : f) {
  6. entry.getTime(); // Date in ms since epoch (X-Axis)
  7. entry.getCount(); // Doc count (Y-Axis)
  8. }

过滤facet(不是facet过滤)

准备一个facet请求

下面的例子新建一个facet请求

  1. FacetBuilders.filterFacet("f",
  2. FilterBuilders.termFilter("brand", "heineken")); // Your Filter here

利用facet响应

  1. import org.elasticsearch.search.facet.filter.*;
  2. // sr is here your SearchResponse object
  3. FilterFacet f = (FilterFacet) sr.getFacets().facetsAsMap().get("f");
  4. f.getCount(); // Number of docs that matched

查询facet

准备一个facet请求

下面的例子新建一个facet请求

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

利用facet响应

  1. import org.elasticsearch.search.facet.query.*;
  2. // sr is here your SearchResponse object
  3. QueryFacet f = (QueryFacet) sr.getFacets().facetsAsMap().get("f");
  4. f.getCount(); // Number of docs that matched

统计

准备一个facet请求

下面的例子新建一个facet请求

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

利用facet响应

  1. import org.elasticsearch.search.facet.statistical.*;
  2. // sr is here your SearchResponse object
  3. StatisticalFacet f = (StatisticalFacet) sr.getFacets().facetsAsMap().get("f");
  4. f.getCount(); // Doc count
  5. f.getMin(); // Min value
  6. f.getMax(); // Max value
  7. f.getMean(); // Mean
  8. f.getTotal(); // Sum of values
  9. f.getStdDeviation(); // Standard Deviation
  10. f.getSumOfSquares(); // Sum of Squares
  11. f.getVariance(); // Variance

Terms Stats Facet

准备一个facet请求

下面的例子新建一个facet请求

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

利用facet响应

  1. // sr is here your SearchResponse object
  2. TermsStatsFacet f = (TermsStatsFacet) sr.getFacets().facetsAsMap().get("f");
  3. f.getTotalCount(); // Total terms doc count
  4. f.getOtherCount(); // Not shown terms doc count
  5. f.getMissingCount(); // Without term doc count
  6. // For each entry
  7. for (TermsStatsFacet.Entry entry : f) {
  8. entry.getTerm(); // Term
  9. entry.getCount(); // Doc count
  10. entry.getMin(); // Min value
  11. entry.getMax(); // Max value
  12. entry.getMean(); // Mean
  13. entry.getTotal(); // Sum of values
  14. }

地理距离Facet

准备一个facet请求

下面的例子新建一个facet请求

  1. FacetBuilders.geoDistanceFacet("f")
  2. .field("pin.location") // Field containing coordinates we want to compare with
  3. .point(40, -70) // Point from where we start (0)
  4. .addUnboundedFrom(10) // 0 to 10 km (excluded)
  5. .addRange(10, 20) // 10 to 20 km (excluded)
  6. .addRange(20, 100) // 20 to 100 km (excluded)
  7. .addUnboundedTo(100) // from 100 km to infinity (and beyond ;-) )
  8. .unit(DistanceUnit.KILOMETERS); // All distances are in kilometers. Can be MILES

利用facet响应

  1. // sr is here your SearchResponse object
  2. GeoDistanceFacet f = (GeoDistanceFacet) sr.getFacets().facetsAsMap().get("f");
  3. // For each entry
  4. for (GeoDistanceFacet.Entry entry : f) {
  5. entry.getFrom(); // Distance from requested
  6. entry.getTo(); // Distance to requested
  7. entry.getCount(); // Doc count
  8. entry.getMin(); // Min value
  9. entry.getMax(); // Max value
  10. entry.getTotal(); // Sum of values
  11. entry.getMean(); // Mean
  12. }

facet过滤器(不是过滤facet)

默认情况下,不管过滤器存在与否,facet都是作用在查询的结果集上。如果你需要计数带有过滤器的facet,你能够通过AbstractFacetBuilder#facetFilter(FilterBuilder)添加 过滤器到任何facet上。

  1. FacetBuilders
  2. .termsFacet("f").field("brand") // Your facet
  3. .facetFilter( // Your filter here
  4. FilterBuilders.termFilter("colour", "pale")
  5. );

例如,你可以在你的查询中重用创建的过滤器

  1. // A common filter
  2. FilterBuilder filter = FilterBuilders.termFilter("colour", "pale");
  3. TermsFacetBuilder facet = FacetBuilders.termsFacet("f")
  4. .field("brand")
  5. .facetFilter(filter); // We apply it to the facet
  6. SearchResponse sr = node.client().prepareSearch()
  7. .setQuery(QueryBuilders.matchAllQuery())
  8. .setFilter(filter) // We apply it to the query
  9. .addFacet(facet)
  10. .execute().actionGet();

作用域

默认情况下,facet作用在查询的结果集上。但是,不管是哪个查询,你可以用global参数去计算来自于索引中的所有文档的facet。

  1. TermsFacetBuilder facet = FacetBuilders.termsFacet("f")
  2. .field("brand")
  3. .global(true);

elasticsearch 中文API facets(⑩)的更多相关文章

  1. elasticsearch 中文API 基于查询的删除(九)

    基于查询的删除API 基于查询的删除API允许开发者基于查询删除一个或者多个索引.一个或者多个类型.下面是一个例子. import static org.elasticsearch.index.que ...

  2. elasticsearch 中文API 记数(八)

    计数API 计数API允许开发者简单的执行一个查询,返回和查询条件相匹配的文档的总数.它可以跨多个索引以及跨多个类型执行. import static org.elasticsearch.index. ...

  3. elasticsearch 中文API bulk(六)

    bulk API bulk API允许开发者在一个请求中索引和删除多个文档.下面是使用实例. import static org.elasticsearch.common.xcontent.XCont ...

  4. elasticsearch 中文API 索引(三)

    索引API 索引API允许开发者索引类型化的JSON文档到一个特定的索引,使其可以被搜索. 生成JSON文档 有几种不同的方式生成JSON文档 利用byte[]或者作为一个String手动生成 利用一 ...

  5. elasticsearch 中文API(一)

    Java API 这节会介绍elasticsearch支持的Java API.所有的elasticsearch操作都使用Client对象执行.本质上,所有的操作都是并行执行的. 另外,Client中的 ...

  6. elasticsearch 中文API river

    river-jdbc 安装 ./bin/plugin --install jdbc --url http://xbib.org/repository/org/xbib/elasticsearch/pl ...

  7. elasticsearch 中文API 更新(五)

    更新API 你能够创建一个UpdateRequest,然后将其发送给client. UpdateRequest updateRequest = new UpdateRequest(); updateR ...

  8. elasticsearch 中文API 删除(四)

    删除API 删除api允许你通过id,从特定的索引中删除类型化的JSON文档.如下例: DeleteResponse response = client.prepareDelete("twi ...

  9. elasticsearch 中文API 获得(三)

    获取API 获取API允许你通过id从索引中获取类型化的JSON文档,如下例: GetResponse response = client.prepareGet("twitter" ...

随机推荐

  1. jquery无缝向上滚动实现代

    <!DOCTYPE html><html><head><style type="text/css">.renav{width:200 ...

  2. Windows 获取控制台窗口句柄

    详细信息 因为多个窗口可能具有相同的标题,您应该更改当前的控制台窗口标题为唯一的标题.这将有助于防止返回不正确的窗口句柄.使用 SetConsoleTitle() 来更改当前的控制台窗口标题.下面是此 ...

  3. thinkphp 控制器定义

    控制器和操作 一般来说,ThinkPHP的控制器是一个类,而操作则是控制器类的一个公共方法. 下面就是一个典型的控制器类的定义: <?php namespace Home\Controller; ...

  4. 請問各位大大,我要將listview顯示的縮圖加入到listview2,請問該如何做呢

    請問各位大大,我要將listview顯示的縮圖加入到listview2,請問該如何做呢?下面的function可以將listview的縮圖加到listview2但是全都顯示listview1第一張的圖 ...

  5. System.Web.Mvc.HttpPutAttribute.cs

    ylbtech-System.Web.Mvc.HttpPutAttribute.cs 1.程序集 System.Web.Mvc, Version=5.2.3.0, Culture=neutral, P ...

  6. (36)C# COM交互

    调用DLL [DllImport("standerMFC.dll")] public static extern int PReadUID(ref HHFC_SET stru); ...

  7. hdu-1394(线段树求最小逆序数)

    http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意: 给定一个n,然后又n个数字,首先,这些数字的大小是从0开始到n-1,比如样例n=10,则这十个数就 ...

  8. Java 的锁-老王女儿的爱情

    对象锁: new一个对象,都会给这个实例创建一把锁,对象中的方法必须在实例创建后,通过调用方法获取锁,一个线程进去这个方法之前拿到对象的锁,才能调用方法,否则被阻塞,举个例子,老王有个如花似玉的女儿, ...

  9. Java并发编程中的若干核心技术,向高手进阶!

    来源:http://www.jianshu.com/p/5f499f8212e7 引言 本文试图从一个更高的视角来总结Java语言中的并发编程内容,希望阅读完本文之后,可以收获一些内容,至少应该知道在 ...

  10. 关于tomcat配置了虚拟路径,但是在Idea中无法生效的问题

    1. 确认 tomcat 的server.xml 文件中配置的虚拟路径是否正确 其中,path表示访问的虚拟路径,docBase表示真实路径 2. Idea 服务器配置中是否勾选 “Deploy ap ...