facets.asciidoc 14 KB

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