facets.asciidoc 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  1. [[java-facets]]
  2. == Facets
  3. Elasticsearch provides a full Java API to play with facets. See the
  4. {ref}/search-facets.html[Facets guide].
  5. Use the factory for facet builders (`FacetBuilders`) and add each facet
  6. you want to compute when querying and add it to your search request:
  7. [source,java]
  8. --------------------------------------------------
  9. SearchResponse sr = node.client().prepareSearch()
  10. .setQuery( /* your query */ )
  11. .addFacet( /* add a facet */ )
  12. .execute().actionGet();
  13. --------------------------------------------------
  14. Note that you can add more than one facet. See
  15. {ref}/search-search.html[Search Java API] for details.
  16. To build facet requests, use `FacetBuilders` helpers. Just import them
  17. in your class:
  18. [source,java]
  19. --------------------------------------------------
  20. import org.elasticsearch.search.facet.FacetBuilders.*;
  21. --------------------------------------------------
  22. === Facets
  23. [[java-facet-terms]]
  24. ==== Terms Facet
  25. Here is how you can use
  26. {ref}/search-facets-terms-facet.html[Terms Facet]
  27. with Java API.
  28. ===== Prepare facet request
  29. Here is an example on how to create the facet request:
  30. [source,java]
  31. --------------------------------------------------
  32. FacetBuilders.termsFacet("f")
  33. .field("brand")
  34. .size(10);
  35. --------------------------------------------------
  36. ===== Use facet response
  37. Import Facet definition classes:
  38. [source,java]
  39. --------------------------------------------------
  40. import org.elasticsearch.search.facet.terms.*;
  41. --------------------------------------------------
  42. [source,java]
  43. --------------------------------------------------
  44. // sr is here your SearchResponse object
  45. TermsFacet f = (TermsFacet) sr.getFacets().facetsAsMap().get("f");
  46. f.getTotalCount(); // Total terms doc count
  47. f.getOtherCount(); // Not shown terms doc count
  48. f.getMissingCount(); // Without term doc count
  49. // For each entry
  50. for (TermsFacet.Entry entry : f) {
  51. entry.getTerm(); // Term
  52. entry.getCount(); // Doc count
  53. }
  54. --------------------------------------------------
  55. [[java-facet-range]]
  56. ==== Range Facet
  57. Here is how you can use
  58. {ref}/search-facets-range-facet.html[Range Facet]
  59. with Java API.
  60. ===== Prepare facet request
  61. Here is an example on how to create the facet request:
  62. [source,java]
  63. --------------------------------------------------
  64. FacetBuilders.rangeFacet("f")
  65. .field("price") // Field to compute on
  66. .addUnboundedFrom(3) // from -infinity to 3 (excluded)
  67. .addRange(3, 6) // from 3 to 6 (excluded)
  68. .addUnboundedTo(6); // from 6 to +infinity
  69. --------------------------------------------------
  70. ===== Use facet response
  71. Import Facet definition classes:
  72. [source,java]
  73. --------------------------------------------------
  74. import org.elasticsearch.search.facet.range.*;
  75. --------------------------------------------------
  76. [source,java]
  77. --------------------------------------------------
  78. // sr is here your SearchResponse object
  79. RangeFacet f = (RangeFacet) sr.getFacets().facetsAsMap().get("f");
  80. // For each entry
  81. for (RangeFacet.Entry entry : f) {
  82. entry.getFrom(); // Range from requested
  83. entry.getTo(); // Range to requested
  84. entry.getCount(); // Doc count
  85. entry.getMin(); // Min value
  86. entry.getMax(); // Max value
  87. entry.getMean(); // Mean
  88. entry.getTotal(); // Sum of values
  89. }
  90. --------------------------------------------------
  91. [[histogram]]
  92. ==== Histogram Facet
  93. Here is how you can use
  94. {ref}/search-facets-histogram-facet.html[Histogram
  95. Facet] with Java API.
  96. ===== Prepare facet request
  97. Here is an example on how to create the facet request:
  98. [source,java]
  99. --------------------------------------------------
  100. HistogramFacetBuilder facet = FacetBuilders.histogramFacet("f")
  101. .field("price")
  102. .interval(1);
  103. --------------------------------------------------
  104. ===== Use facet response
  105. Import Facet definition classes:
  106. [source,java]
  107. --------------------------------------------------
  108. import org.elasticsearch.search.facet.histogram.*;
  109. --------------------------------------------------
  110. [source,java]
  111. --------------------------------------------------
  112. // sr is here your SearchResponse object
  113. HistogramFacet f = (HistogramFacet) sr.getFacets().facetsAsMap().get("f");
  114. // For each entry
  115. for (HistogramFacet.Entry entry : f) {
  116. entry.getKey(); // Key (X-Axis)
  117. entry.getCount(); // Doc count (Y-Axis)
  118. }
  119. --------------------------------------------------
  120. [[date-histogram]]
  121. ==== Date Histogram Facet
  122. Here is how you can use
  123. {ref}/search-facets-date-histogram-facet.html[Date
  124. Histogram Facet] with Java API.
  125. ===== Prepare facet request
  126. Here is an example on how to create the facet request:
  127. [source,java]
  128. --------------------------------------------------
  129. FacetBuilders.dateHistogramFacet("f")
  130. .field("date") // Your date field
  131. .interval("year"); // You can also use "quarter", "month", "week", "day",
  132. // "hour" and "minute" or notation like "1.5h" or "2w"
  133. --------------------------------------------------
  134. ===== Use facet response
  135. Import Facet definition classes:
  136. [source,java]
  137. --------------------------------------------------
  138. import org.elasticsearch.search.facet.datehistogram.*;
  139. --------------------------------------------------
  140. [source,java]
  141. --------------------------------------------------
  142. // sr is here your SearchResponse object
  143. DateHistogramFacet f = (DateHistogramFacet) sr.getFacets().facetsAsMap().get("f");
  144. // For each entry
  145. for (DateHistogramFacet.Entry entry : f) {
  146. entry.getTime(); // Date in ms since epoch (X-Axis)
  147. entry.getCount(); // Doc count (Y-Axis)
  148. }
  149. --------------------------------------------------
  150. [[filter]]
  151. ==== Filter Facet (not facet filter)
  152. Here is how you can use
  153. {ref}/search-facets-filter-facet.html[Filter Facet]
  154. with Java API.
  155. If you are looking on how to apply a filter to a facet, have a look at
  156. link:#facet-filter[facet filter] using Java API.
  157. ===== Prepare facet request
  158. Here is an example on how to create the facet request:
  159. [source,java]
  160. --------------------------------------------------
  161. FacetBuilders.filterFacet("f",
  162. FilterBuilders.termFilter("brand", "heineken")); // Your Filter here
  163. --------------------------------------------------
  164. See <<query-dsl-filters,Filters>> to
  165. learn how to build filters using Java.
  166. ===== Use facet response
  167. Import Facet definition classes:
  168. [source,java]
  169. --------------------------------------------------
  170. import org.elasticsearch.search.facet.filter.*;
  171. --------------------------------------------------
  172. [source,java]
  173. --------------------------------------------------
  174. // sr is here your SearchResponse object
  175. FilterFacet f = (FilterFacet) sr.getFacets().facetsAsMap().get("f");
  176. f.getCount(); // Number of docs that matched
  177. --------------------------------------------------
  178. [[query]]
  179. ==== Query Facet
  180. Here is how you can use
  181. {ref}/search-facets-query-facet.html[Query Facet]
  182. with Java API.
  183. ===== Prepare facet request
  184. Here is an example on how to create the facet request:
  185. [source,java]
  186. --------------------------------------------------
  187. FacetBuilders.queryFacet("f",
  188. QueryBuilders.matchQuery("brand", "heineken"));
  189. --------------------------------------------------
  190. ===== Use facet response
  191. Import Facet definition classes:
  192. [source,java]
  193. --------------------------------------------------
  194. import org.elasticsearch.search.facet.query.*;
  195. --------------------------------------------------
  196. [source,java]
  197. --------------------------------------------------
  198. // sr is here your SearchResponse object
  199. QueryFacet f = (QueryFacet) sr.getFacets().facetsAsMap().get("f");
  200. f.getCount(); // Number of docs that matched
  201. --------------------------------------------------
  202. See <<query-dsl-queries,Queries>> to
  203. learn how to build queries using Java.
  204. [[statistical]]
  205. ==== Statistical
  206. Here is how you can use the
  207. {ref}/search-facets-statistical-facet.html[Statistical
  208. Facet] with Java API.
  209. ===== Prepare facet request
  210. Here is an example on how to create the facet request:
  211. [source,java]
  212. --------------------------------------------------
  213. FacetBuilders.statisticalFacet("f")
  214. .field("price");
  215. --------------------------------------------------
  216. ===== Use facet response
  217. Import Facet definition classes:
  218. [source,java]
  219. --------------------------------------------------
  220. import org.elasticsearch.search.facet.statistical.*;
  221. --------------------------------------------------
  222. [source,java]
  223. --------------------------------------------------
  224. // sr is here your SearchResponse object
  225. StatisticalFacet f = (StatisticalFacet) sr.getFacets().facetsAsMap().get("f");
  226. f.getCount(); // Doc count
  227. f.getMin(); // Min value
  228. f.getMax(); // Max value
  229. f.getMean(); // Mean
  230. f.getTotal(); // Sum of values
  231. f.getStdDeviation(); // Standard Deviation
  232. f.getSumOfSquares(); // Sum of Squares
  233. f.getVariance(); // Variance
  234. --------------------------------------------------
  235. [[terms-stats]]
  236. ==== Terms Stats Facet
  237. Here is how you can use the
  238. {ref}/search-facets-terms-stats-facet.html[Terms
  239. Stats Facet] with Java API.
  240. ===== Prepare facet request
  241. Here is an example on how to create the facet request:
  242. [source,java]
  243. --------------------------------------------------
  244. FacetBuilders.termsStatsFacet("f")
  245. .keyField("brand")
  246. .valueField("price");
  247. --------------------------------------------------
  248. ===== Use facet response
  249. Import Facet definition classes:
  250. [source,java]
  251. --------------------------------------------------
  252. import org.elasticsearch.search.facet.termsstats.*;
  253. --------------------------------------------------
  254. [source,java]
  255. --------------------------------------------------
  256. // sr is here your SearchResponse object
  257. TermsStatsFacet f = (TermsStatsFacet) sr.getFacets().facetsAsMap().get("f");
  258. f.getTotalCount(); // Total terms doc count
  259. f.getOtherCount(); // Not shown terms doc count
  260. f.getMissingCount(); // Without term doc count
  261. // For each entry
  262. for (TermsStatsFacet.Entry entry : f) {
  263. entry.getTerm(); // Term
  264. entry.getCount(); // Doc count
  265. entry.getMin(); // Min value
  266. entry.getMax(); // Max value
  267. entry.getMean(); // Mean
  268. entry.getTotal(); // Sum of values
  269. }
  270. --------------------------------------------------
  271. [[geo-distance]]
  272. ==== Geo Distance Facet
  273. Here is how you can use
  274. the {ref}/search-facets-geo-distance-facet.html[Geo
  275. Distance Facet] with Java API.
  276. ===== Prepare facet request
  277. Here is an example on how to create the facet request:
  278. [source,java]
  279. --------------------------------------------------
  280. FacetBuilders.geoDistanceFacet("f")
  281. .field("pin.location") // Field containing coordinates we want to compare with
  282. .point(40, -70) // Point from where we start (0)
  283. .addUnboundedFrom(10) // 0 to 10 km (excluded)
  284. .addRange(10, 20) // 10 to 20 km (excluded)
  285. .addRange(20, 100) // 20 to 100 km (excluded)
  286. .addUnboundedTo(100) // from 100 km to infinity (and beyond ;-) )
  287. .unit(DistanceUnit.KILOMETERS); // All distances are in kilometers. Can be MILES
  288. --------------------------------------------------
  289. ===== Use facet response
  290. Import Facet definition classes:
  291. [source,java]
  292. --------------------------------------------------
  293. import org.elasticsearch.search.facet.geodistance.*;
  294. --------------------------------------------------
  295. [source,java]
  296. --------------------------------------------------
  297. // sr is here your SearchResponse object
  298. GeoDistanceFacet f = (GeoDistanceFacet) sr.getFacets().facetsAsMap().get("f");
  299. // For each entry
  300. for (GeoDistanceFacet.Entry entry : f) {
  301. entry.getFrom(); // Distance from requested
  302. entry.getTo(); // Distance to requested
  303. entry.getCount(); // Doc count
  304. entry.getMin(); // Min value
  305. entry.getMax(); // Max value
  306. entry.getTotal(); // Sum of values
  307. entry.getMean(); // Mean
  308. }
  309. --------------------------------------------------
  310. [[facet-filter]]
  311. === Facet filters (not Filter Facet)
  312. By default, facets are applied on the query resultset whatever filters
  313. exists or are.
  314. If you need to compute facets with the same filters or even with other
  315. filters, you can add the filter to any facet using
  316. `AbstractFacetBuilder#facetFilter(FilterBuilder)` method:
  317. [source,java]
  318. --------------------------------------------------
  319. FacetBuilders
  320. .termsFacet("f").field("brand") // Your facet
  321. .facetFilter( // Your filter here
  322. FilterBuilders.termFilter("colour", "pale")
  323. );
  324. --------------------------------------------------
  325. For example, you can reuse the same filter you created for your query:
  326. [source,java]
  327. --------------------------------------------------
  328. // A common filter
  329. FilterBuilder filter = FilterBuilders.termFilter("colour", "pale");
  330. TermsFacetBuilder facet = FacetBuilders.termsFacet("f")
  331. .field("brand")
  332. .facetFilter(filter); // We apply it to the facet
  333. SearchResponse sr = node.client().prepareSearch()
  334. .setQuery(QueryBuilders.matchAllQuery())
  335. .setFilter(filter) // We apply it to the query
  336. .addFacet(facet)
  337. .execute().actionGet();
  338. --------------------------------------------------
  339. See documentation on how to build
  340. <<query-dsl-filters,Filters>>.
  341. [[scope]]
  342. === Scope
  343. By default, facets are computed within the query resultset. But, you can
  344. compute facets from all documents in the index whatever the query is,
  345. using `global` parameter:
  346. [source,java]
  347. --------------------------------------------------
  348. TermsFacetBuilder facet = FacetBuilders.termsFacet("f")
  349. .field("brand")
  350. .global(true);
  351. --------------------------------------------------