query-dsl-filters.asciidoc 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484
  1. [[query-dsl-filters]]
  2. == Query DSL - Filters
  3. elasticsearch provides a full Java query dsl in a similar manner to the
  4. REST {ref}/query-dsl.html[Query DSL]. The factory for filter
  5. builders is `FilterBuilders`.
  6. Once your query is ready, you can use the <<search,Search API>>.
  7. See also how to build <<query-dsl-queries,Queries>>.
  8. To use `FilterBuilders` just import them in your class:
  9. [source,java]
  10. --------------------------------------------------
  11. import org.elasticsearch.index.query.FilterBuilders.*;
  12. --------------------------------------------------
  13. Note that you can easily print (aka debug) JSON generated queries using
  14. `toString()` method on `FilterBuilder` object.
  15. [[and-filter]]
  16. === And Filter
  17. See {ref}/query-dsl-and-filter.html[And Filter]
  18. [source,java]
  19. --------------------------------------------------
  20. FilterBuilders.andFilter(
  21. FilterBuilders.rangeFilter("postDate").from("2010-03-01").to("2010-04-01"),
  22. FilterBuilders.prefixFilter("name.second", "ba")
  23. );
  24. --------------------------------------------------
  25. Note that you can cache the result using
  26. `AndFilterBuilder#cache(boolean)` method. See <<query-dsl-filters-caching>>.
  27. [[bool-filter]]
  28. === Bool Filter
  29. See {ref}/query-dsl-bool-filter.html[Bool Filter]
  30. [source,java]
  31. --------------------------------------------------
  32. FilterBuilders.boolFilter()
  33. .must(FilterBuilders.termFilter("tag", "wow"))
  34. .mustNot(FilterBuilders.rangeFilter("age").from("10").to("20"))
  35. .should(FilterBuilders.termFilter("tag", "sometag"))
  36. .should(FilterBuilders.termFilter("tag", "sometagtag"));
  37. --------------------------------------------------
  38. Note that you can cache the result using
  39. `BoolFilterBuilder#cache(boolean)` method. See <<query-dsl-filters-caching>>.
  40. [[exists-filter]]
  41. === Exists Filter
  42. See {ref}/query-dsl-exists-filter.html[Exists Filter].
  43. [source,java]
  44. --------------------------------------------------
  45. FilterBuilders.existsFilter("user");
  46. --------------------------------------------------
  47. [[ids-filter]]
  48. === Ids Filter
  49. See {ref}/query-dsl-ids-filter.html[IDs Filter]
  50. [source,java]
  51. --------------------------------------------------
  52. FilterBuilders.idsFilter("my_type", "type2").addIds("1", "4", "100");
  53. // Type is optional
  54. FilterBuilders.idsFilter().addIds("1", "4", "100");
  55. --------------------------------------------------
  56. [[limit-filter]]
  57. === Limit Filter
  58. See {ref}/query-dsl-limit-filter.html[Limit Filter]
  59. [source,java]
  60. --------------------------------------------------
  61. FilterBuilders.limitFilter(100);
  62. --------------------------------------------------
  63. [[type-filter]]
  64. === Type Filter
  65. See {ref}/query-dsl-type-filter.html[Type Filter]
  66. [source,java]
  67. --------------------------------------------------
  68. FilterBuilders.typeFilter("my_type");
  69. --------------------------------------------------
  70. [[geo-bbox-filter]]
  71. === Geo Bounding Box Filter
  72. See {ref}/query-dsl-geo-bounding-box-filter.html[Geo
  73. Bounding Box Filter]
  74. [source,java]
  75. --------------------------------------------------
  76. FilterBuilders.geoBoundingBoxFilter("pin.location")
  77. .topLeft(40.73, -74.1)
  78. .bottomRight(40.717, -73.99);
  79. --------------------------------------------------
  80. Note that you can cache the result using
  81. `GeoBoundingBoxFilterBuilder#cache(boolean)` method. See
  82. <<query-dsl-filters-caching>>.
  83. [[geo-distance-filter]]
  84. === GeoDistance Filter
  85. See {ref}/query-dsl-geo-distance-filter.html[Geo
  86. Distance Filter]
  87. [source,java]
  88. --------------------------------------------------
  89. FilterBuilders.geoDistanceFilter("pin.location")
  90. .point(40, -70)
  91. .distance(200, DistanceUnit.KILOMETERS)
  92. .optimizeBbox("memory") // Can be also "indexed" or "none"
  93. .geoDistance(GeoDistance.ARC); // Or GeoDistance.PLANE
  94. --------------------------------------------------
  95. Note that you can cache the result using
  96. `GeoDistanceFilterBuilder#cache(boolean)` method. See
  97. <<query-dsl-filters-caching>>.
  98. [[geo-distance-range-filter]]
  99. === Geo Distance Range Filter
  100. See {ref}/query-dsl-geo-distance-range-filter.html[Geo
  101. Distance Range Filter]
  102. [source,java]
  103. --------------------------------------------------
  104. FilterBuilders.geoDistanceRangeFilter("pin.location")
  105. .point(40, -70)
  106. .from("200km")
  107. .to("400km")
  108. .includeLower(true)
  109. .includeUpper(false)
  110. .optimizeBbox("memory") // Can be also "indexed" or "none"
  111. .geoDistance(GeoDistance.ARC); // Or GeoDistance.PLANE
  112. --------------------------------------------------
  113. Note that you can cache the result using
  114. `GeoDistanceRangeFilterBuilder#cache(boolean)` method. See
  115. <<query-dsl-filters-caching>>.
  116. [[geo-poly-filter]]
  117. === Geo Polygon Filter
  118. See {ref}/query-dsl-geo-polygon-filter.html[Geo Polygon
  119. Filter]
  120. [source,java]
  121. --------------------------------------------------
  122. FilterBuilders.geoPolygonFilter("pin.location")
  123. .addPoint(40, -70)
  124. .addPoint(30, -80)
  125. .addPoint(20, -90);
  126. --------------------------------------------------
  127. Note that you can cache the result using
  128. `GeoPolygonFilterBuilder#cache(boolean)` method. See
  129. <<query-dsl-filters-caching>>.
  130. [[geo-shape-filter]]
  131. === Geo Shape Filter
  132. See {ref}/query-dsl-geo-shape-filter.html[Geo Shape
  133. Filter]
  134. Note: the `geo_shape` type uses `Spatial4J` and `JTS`, both of which are
  135. optional dependencies. Consequently you must add `Spatial4J` and `JTS`
  136. to your classpath in order to use this type:
  137. [source,xml]
  138. -----------------------------------------------
  139. <dependency>
  140. <groupId>com.spatial4j</groupId>
  141. <artifactId>spatial4j</artifactId>
  142. <version>0.3</version>
  143. </dependency>
  144. <dependency>
  145. <groupId>com.vividsolutions</groupId>
  146. <artifactId>jts</artifactId>
  147. <version>1.12</version>
  148. <exclusions>
  149. <exclusion>
  150. <groupId>xerces</groupId>
  151. <artifactId>xercesImpl</artifactId>
  152. </exclusion>
  153. </exclusions>
  154. </dependency>
  155. -----------------------------------------------
  156. [source,java]
  157. --------------------------------------------------
  158. // Import Spatial4J shapes
  159. import com.spatial4j.core.context.SpatialContext;
  160. import com.spatial4j.core.shape.Shape;
  161. import com.spatial4j.core.shape.impl.RectangleImpl;
  162. // Also import ShapeRelation
  163. import org.elasticsearch.common.geo.ShapeRelation;
  164. --------------------------------------------------
  165. [source,java]
  166. --------------------------------------------------
  167. // Shape within another
  168. filter = FilterBuilders.geoShapeFilter("location",
  169. new RectangleImpl(0,10,0,10,SpatialContext.GEO))
  170. .relation(ShapeRelation.WITHIN);
  171. // Intersect shapes
  172. filter = FilterBuilders.geoShapeFilter("location",
  173. new PointImpl(0, 0, SpatialContext.GEO))
  174. .relation(ShapeRelation.INTERSECTS);
  175. // Using pre-indexed shapes
  176. filter = FilterBuilders.geoShapeFilter("location", "New Zealand", "countries")
  177. .relation(ShapeRelation.DISJOINT);
  178. --------------------------------------------------
  179. [[has-child-parent-filter]]
  180. === Has Child / Has Parent Filters
  181. See:
  182. * {ref}/query-dsl-has-child-filter.html[Has Child Filter]
  183. * {ref}/query-dsl-has-parent-filter.html[Has Parent Filter]
  184. [source,java]
  185. --------------------------------------------------
  186. // Has Child
  187. QFilterBuilders.hasChildFilter("blog_tag",
  188. QueryBuilders.termQuery("tag", "something"));
  189. // Has Parent
  190. QFilterBuilders.hasParentFilter("blog",
  191. QueryBuilders.termQuery("tag", "something"));
  192. --------------------------------------------------
  193. [[match-all-filter]]
  194. === Match All Filter
  195. See {ref}/query-dsl-match-all-filter.html[Match All Filter]
  196. [source,java]
  197. --------------------------------------------------
  198. FilterBuilders.matchAllFilter();
  199. --------------------------------------------------
  200. [[missing-filter]]
  201. === Missing Filter
  202. See {ref}/query-dsl-missing-filter.html[Missing Filter]
  203. [source,java]
  204. --------------------------------------------------
  205. FilterBuilders.missingFilter("user")
  206. .existence(true)
  207. .nullValue(true);
  208. --------------------------------------------------
  209. [[not-filter]]
  210. === Not Filter
  211. See {ref}/query-dsl-not-filter.html[Not Filter]
  212. [source,java]
  213. --------------------------------------------------
  214. FilterBuilders.notFilter(
  215. FilterBuilders.rangeFilter("price").from("1").to("2"));
  216. --------------------------------------------------
  217. [[numeric-range-filter]]
  218. === Numeric Range Filter
  219. See {ref}/query-dsl-numeric-range-filter.html[Numeric
  220. Range Filter]
  221. [source,java]
  222. --------------------------------------------------
  223. FilterBuilders.numericRangeFilter("age")
  224. .from(10)
  225. .to(20)
  226. .includeLower(true)
  227. .includeUpper(false);
  228. --------------------------------------------------
  229. Note that you can cache the result using
  230. `NumericRangeFilterBuilder#cache(boolean)` method. See
  231. <<query-dsl-filters-caching>>.
  232. [[or-filter]]
  233. === Or Filter
  234. See {ref}/query-dsl-or-filter.html[Or Filter]
  235. [source,java]
  236. --------------------------------------------------
  237. FilterBuilders.orFilter(
  238. FilterBuilders.termFilter("name.second", "banon"),
  239. FilterBuilders.termFilter("name.nick", "kimchy")
  240. );
  241. --------------------------------------------------
  242. Note that you can cache the result using
  243. `OrFilterBuilder#cache(boolean)` method. See <<query-dsl-filters-caching>>.
  244. [[prefix-filter]]
  245. === Prefix Filter
  246. See {ref}/query-dsl-prefix-filter.html[Prefix Filter]
  247. [source,java]
  248. --------------------------------------------------
  249. FilterBuilders.prefixFilter("user", "ki");
  250. --------------------------------------------------
  251. Note that you can cache the result using
  252. `PrefixFilterBuilder#cache(boolean)` method. See <<query-dsl-filters-caching>>.
  253. [[query-filter]]
  254. === Query Filter
  255. See {ref}/query-dsl-query-filter.html[Query Filter]
  256. [source,java]
  257. --------------------------------------------------
  258. FilterBuilders.queryFilter(
  259. QueryBuilders.queryString("this AND that OR thus")
  260. );
  261. --------------------------------------------------
  262. Note that you can cache the result using
  263. `QueryFilterBuilder#cache(boolean)` method. See <<query-dsl-filters-caching>>.
  264. [[range-filter]]
  265. === Range Filter
  266. See {ref}/query-dsl-range-filter.html[Range Filter]
  267. [source,java]
  268. --------------------------------------------------
  269. FilterBuilders.rangeFilter("age")
  270. .from("10")
  271. .to("20")
  272. .includeLower(true)
  273. .includeUpper(false);
  274. // A simplified form using gte, gt, lt or lte
  275. FilterBuilders.rangeFilter("age")
  276. .gte("10")
  277. .lt("20");
  278. --------------------------------------------------
  279. Note that you can ask not to cache the result using
  280. `RangeFilterBuilder#cache(boolean)` method. See <<query-dsl-filters-caching>>.
  281. [[script-filter]]
  282. === Script Filter
  283. See {ref}/query-dsl-script-filter.html[Script Filter]
  284. [source,java]
  285. --------------------------------------------------
  286. FilterBuilder filter = FilterBuilders.scriptFilter(
  287. "doc['age'].value > param1"
  288. ).addParam("param1", 10);
  289. --------------------------------------------------
  290. Note that you can cache the result using
  291. `ScriptFilterBuilder#cache(boolean)` method. See <<query-dsl-filters-caching>>.
  292. [[term-filter]]
  293. === Term Filter
  294. See {ref}/query-dsl-term-filter.html[Term Filter]
  295. [source,java]
  296. --------------------------------------------------
  297. FilterBuilders.termFilter("user", "kimchy");
  298. --------------------------------------------------
  299. Note that you can ask not to cache the result using
  300. `TermFilterBuilder#cache(boolean)` method. See <<query-dsl-filters-caching>>.
  301. [[terms-filter]]
  302. === Terms Filter
  303. See {ref}/query-dsl-terms-filter.html[Terms Filter]
  304. [source,java]
  305. --------------------------------------------------
  306. FilterBuilders.termsFilter("user", "kimchy", "elasticsearch")
  307. .execution("plain"); // Optional, can be also "bool", "and" or "or"
  308. // or "bool_nocache", "and_nocache" or "or_nocache"
  309. --------------------------------------------------
  310. Note that you can ask not to cache the result using
  311. `TermsFilterBuilder#cache(boolean)` method. See <<query-dsl-filters-caching>>.
  312. [[nested-filter]]
  313. === Nested Filter
  314. See {ref}/query-dsl-nested-filter.html[Nested Filter]
  315. [source,java]
  316. --------------------------------------------------
  317. FilterBuilders.nestedFilter("obj1",
  318. QueryBuilders.boolQuery()
  319. .must(QueryBuilders.matchQuery("obj1.name", "blue"))
  320. .must(QueryBuilders.rangeQuery("obj1.count").gt(5))
  321. );
  322. --------------------------------------------------
  323. Note that you can ask not to cache the result using
  324. `NestedFilterBuilder#cache(boolean)` method. See <<query-dsl-filters-caching>>.
  325. [[query-dsl-filters-caching]]
  326. [[caching]]
  327. === Caching
  328. By default, some filters are cached or not cached. You can have a fine
  329. tuning control using `cache(boolean)` method when exists. For example:
  330. [source,java]
  331. --------------------------------------------------
  332. FilterBuilder filter = FilterBuilders.andFilter(
  333. FilterBuilders.rangeFilter("postDate").from("2010-03-01").to("2010-04-01"),
  334. FilterBuilders.prefixFilter("name.second", "ba")
  335. )
  336. .cache(true);
  337. --------------------------------------------------