query-dsl-filters.asciidoc 12 KB

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