query-dsl-filters.asciidoc 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559
  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 `QueryBuilders` or `FilterBuilders` just import them in your class:
  9. [source,java]
  10. --------------------------------------------------
  11. import static org.elasticsearch.index.query.QueryBuilders.*;
  12. import static org.elasticsearch.index.query.FilterBuilders.*;
  13. --------------------------------------------------
  14. Note that you can easily print (aka debug) JSON generated queries using
  15. `toString()` method on `FilterBuilder` object.
  16. [[and-filter]]
  17. === And Filter
  18. See {ref}/query-dsl-and-filter.html[And Filter]
  19. [source,java]
  20. --------------------------------------------------
  21. FilterBuilder filter = andFilter(
  22. rangeFilter("postDate").from("2010-03-01").to("2010-04-01"), <1>
  23. prefixFilter("name.second", "ba")); <1>
  24. --------------------------------------------------
  25. <1> filters
  26. Note that you can cache the result using
  27. `AndFilterBuilder#cache(boolean)` method. See <<query-dsl-filters-caching>>.
  28. [[bool-filter]]
  29. === Bool Filter
  30. See {ref}/query-dsl-bool-filter.html[Bool Filter]
  31. [source,java]
  32. --------------------------------------------------
  33. FilterBuilder filter = boolFilter()
  34. .must(termFilter("tag", "wow")) <1>
  35. .mustNot(rangeFilter("age").from("10").to("20")) <2>
  36. .should(termFilter("tag", "sometag")) <3>
  37. .should(termFilter("tag", "sometagtag")); <3>
  38. --------------------------------------------------
  39. <1> must filter
  40. <2> must not filter
  41. <3> should filter
  42. Note that you can cache the result using
  43. `BoolFilterBuilder#cache(boolean)` method. See <<query-dsl-filters-caching>>.
  44. [[exists-filter]]
  45. === Exists Filter
  46. See {ref}/query-dsl-exists-filter.html[Exists Filter].
  47. [source,java]
  48. --------------------------------------------------
  49. FilterBuilder filter = existsFilter("user"); <1>
  50. --------------------------------------------------
  51. <1> field
  52. [[ids-filter]]
  53. === Ids Filter
  54. See {ref}/query-dsl-ids-filter.html[IDs Filter]
  55. [source,java]
  56. --------------------------------------------------
  57. FilterBuilder filter = idsFilter("my_type", "type2")
  58. .addIds("1", "4", "100");
  59. FilterBuilder filter = idsFilter() <1>
  60. .addIds("1", "4", "100");
  61. --------------------------------------------------
  62. <1> type is optional
  63. [[limit-filter]]
  64. === Limit Filter
  65. See {ref}/query-dsl-limit-filter.html[Limit Filter]
  66. [source,java]
  67. --------------------------------------------------
  68. FilterBuilder filter = limitFilter(100); <1>
  69. --------------------------------------------------
  70. <1> number of documents per shard
  71. [[type-filter]]
  72. === Type Filter
  73. See {ref}/query-dsl-type-filter.html[Type Filter]
  74. [source,java]
  75. --------------------------------------------------
  76. FilterBuilder filter = typeFilter("my_type"); <1>
  77. --------------------------------------------------
  78. <1> type
  79. [[geo-bbox-filter]]
  80. === Geo Bounding Box Filter
  81. See {ref}/query-dsl-geo-bounding-box-filter.html[Geo
  82. Bounding Box Filter]
  83. [source,java]
  84. --------------------------------------------------
  85. FilterBuilder filter = geoBoundingBoxFilter("pin.location") <1>
  86. .topLeft(40.73, -74.1) <2>
  87. .bottomRight(40.717, -73.99); <3>
  88. --------------------------------------------------
  89. <1> field
  90. <2> bounding box top left point
  91. <3> bounding box bottom right point
  92. Note that you can cache the result using
  93. `GeoBoundingBoxFilterBuilder#cache(boolean)` method. See
  94. <<query-dsl-filters-caching>>.
  95. [[geo-distance-filter]]
  96. === GeoDistance Filter
  97. See {ref}/query-dsl-geo-distance-filter.html[Geo
  98. Distance Filter]
  99. [source,java]
  100. --------------------------------------------------
  101. FilterBuilder filter = geoDistanceFilter("pin.location") <1>
  102. .point(40, -70) <2>
  103. .distance(200, DistanceUnit.KILOMETERS) <3>
  104. .optimizeBbox("memory") <4>
  105. .geoDistance(GeoDistance.ARC); <5>
  106. --------------------------------------------------
  107. <1> field
  108. <2> center point
  109. <3> distance from center point
  110. <4> optimize bounding box: `memory`, `indexed` or `none`
  111. <5> distance computation mode: `GeoDistance.SLOPPY_ARC` (default), `GeoDistance.ARC` (slightly more precise but
  112. significantly slower) or `GeoDistance.PLANE` (faster, but inaccurate on long distances and close to the poles)
  113. Note that you can cache the result using
  114. `GeoDistanceFilterBuilder#cache(boolean)` method. See
  115. <<query-dsl-filters-caching>>.
  116. [[geo-distance-range-filter]]
  117. === Geo Distance Range Filter
  118. See {ref}/query-dsl-geo-distance-range-filter.html[Geo
  119. Distance Range Filter]
  120. [source,java]
  121. --------------------------------------------------
  122. FilterBuilder filter = geoDistanceRangeFilter("pin.location") <1>
  123. .point(40, -70) <2>
  124. .from("200km") <3>
  125. .to("400km") <4>
  126. .includeLower(true) <5>
  127. .includeUpper(false) <6>
  128. .optimizeBbox("memory") <7>
  129. .geoDistance(GeoDistance.ARC); <8>
  130. --------------------------------------------------
  131. <1> field
  132. <2> center point
  133. <3> starting distance from center point
  134. <4> ending distance from center point
  135. <5> include lower value means that `from` is `gt` when `false` or `gte` when `true`
  136. <6> include upper value means that `to` is `lt` when `false` or `lte` when `true`
  137. <7> optimize bounding box: `memory`, `indexed` or `none`
  138. <8> distance computation mode: `GeoDistance.SLOPPY_ARC` (default), `GeoDistance.ARC` (slightly more precise but
  139. significantly slower) or `GeoDistance.PLANE` (faster, but inaccurate on long distances and close to the poles)
  140. Note that you can cache the result using
  141. `GeoDistanceRangeFilterBuilder#cache(boolean)` method. See
  142. <<query-dsl-filters-caching>>.
  143. [[geo-poly-filter]]
  144. === Geo Polygon Filter
  145. See {ref}/query-dsl-geo-polygon-filter.html[Geo Polygon
  146. Filter]
  147. [source,java]
  148. --------------------------------------------------
  149. FilterBuilder filter = geoPolygonFilter("pin.location") <1>
  150. .addPoint(40, -70) <2>
  151. .addPoint(30, -80) <2>
  152. .addPoint(20, -90); <2>
  153. --------------------------------------------------
  154. <1> field
  155. <2> add your polygon of points a document should fall within
  156. Note that you can cache the result using
  157. `GeoPolygonFilterBuilder#cache(boolean)` method. See
  158. <<query-dsl-filters-caching>>.
  159. [[geo-shape-filter]]
  160. === Geo Shape Filter
  161. See {ref}/query-dsl-geo-shape-filter.html[Geo Shape
  162. Filter]
  163. Note: the `geo_shape` type uses `Spatial4J` and `JTS`, both of which are
  164. optional dependencies. Consequently you must add `Spatial4J` and `JTS`
  165. to your classpath in order to use this type:
  166. [source,xml]
  167. -----------------------------------------------
  168. <dependency>
  169. <groupId>com.spatial4j</groupId>
  170. <artifactId>spatial4j</artifactId>
  171. <version>0.4.1</version> <1>
  172. </dependency>
  173. <dependency>
  174. <groupId>com.vividsolutions</groupId>
  175. <artifactId>jts</artifactId>
  176. <version>1.13</version> <2>
  177. <exclusions>
  178. <exclusion>
  179. <groupId>xerces</groupId>
  180. <artifactId>xercesImpl</artifactId>
  181. </exclusion>
  182. </exclusions>
  183. </dependency>
  184. -----------------------------------------------
  185. <1> check for updates in http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.spatial4j%22%20AND%20a%3A%22spatial4j%22[Maven Central]
  186. <2> check for updates in http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.vividsolutions%22%20AND%20a%3A%22jts%22[Maven Central]
  187. [source,java]
  188. --------------------------------------------------
  189. // Import Spatial4J shapes
  190. import com.spatial4j.core.context.SpatialContext;
  191. import com.spatial4j.core.shape.Shape;
  192. import com.spatial4j.core.shape.impl.RectangleImpl;
  193. // Also import ShapeRelation
  194. import org.elasticsearch.common.geo.ShapeRelation;
  195. --------------------------------------------------
  196. [source,java]
  197. --------------------------------------------------
  198. // Shape within another
  199. FilterBuilder filter = geoShapeFilter(
  200. "location", <1>
  201. new RectangleImpl(0,10,0,10,SpatialContext.GEO) <2>
  202. )
  203. .relation(ShapeRelation.WITHIN); <3>
  204. --------------------------------------------------
  205. <1> field
  206. <2> shape
  207. <3> relation
  208. [source,java]
  209. --------------------------------------------------
  210. // Intersect shapes
  211. FilterBuilder filter = geoShapeFilter(
  212. "location", <1>
  213. new PointImpl(0, 0, SpatialContext.GEO) <2>
  214. )
  215. .relation(ShapeRelation.INTERSECTS); <3>
  216. --------------------------------------------------
  217. <1> field
  218. <2> shape
  219. <3> relation
  220. [source,java]
  221. --------------------------------------------------
  222. // Using pre-indexed shapes
  223. FilterBuilder filter = geoShapeFilter(
  224. "location", <1>
  225. "New Zealand", <2>
  226. "countries") <3>
  227. .relation(ShapeRelation.DISJOINT); <4>
  228. --------------------------------------------------
  229. <1> field
  230. <2> indexed shape id
  231. <3> index type of the indexed shapes
  232. <4> relation
  233. [[has-child-parent-filter]]
  234. === Has Child / Has Parent Filters
  235. See:
  236. * {ref}/query-dsl-has-child-filter.html[Has Child Filter]
  237. * {ref}/query-dsl-has-parent-filter.html[Has Parent Filter]
  238. [source,java]
  239. --------------------------------------------------
  240. // Has Child
  241. QueryBuilder qb = hasChildFilter(
  242. "blog_tag", <1>
  243. termFilter("tag","something") <2>
  244. );
  245. --------------------------------------------------
  246. <1> child type to query against
  247. <2> filter (could be also a query)
  248. [source,java]
  249. --------------------------------------------------
  250. // Has Parent
  251. QueryBuilder qb = hasParentFilter(
  252. "blog", <1>
  253. termFilter("tag","something") <2>
  254. );
  255. --------------------------------------------------
  256. <1> parent type to query against
  257. <2> filter (could be also a query)
  258. [[match-all-filter]]
  259. === Match All Filter
  260. See {ref}/query-dsl-match-all-filter.html[Match All Filter]
  261. [source,java]
  262. --------------------------------------------------
  263. FilterBuilder filter = matchAllFilter();
  264. --------------------------------------------------
  265. [[missing-filter]]
  266. === Missing Filter
  267. See {ref}/query-dsl-missing-filter.html[Missing Filter]
  268. [source,java]
  269. --------------------------------------------------
  270. FilterBuilder filter = missingFilter("user") <1>
  271. .existence(true) <2>
  272. .nullValue(true); <3>
  273. --------------------------------------------------
  274. <1> field
  275. <2> find missing field that doesn’t exist
  276. <3> find missing field with an explicit `null` value
  277. [[not-filter]]
  278. === Not Filter
  279. See {ref}/query-dsl-not-filter.html[Not Filter]
  280. [source,java]
  281. --------------------------------------------------
  282. FilterBuilder filter = notFilter(
  283. rangeFilter("price").from("1").to("2") <1>
  284. );
  285. --------------------------------------------------
  286. <1> filter
  287. [[or-filter]]
  288. === Or Filter
  289. See {ref}/query-dsl-or-filter.html[Or Filter]
  290. [source,java]
  291. --------------------------------------------------
  292. FilterBuilder filter = orFilter(
  293. termFilter("name.second", "banon"), <1>
  294. termFilter("name.nick", "kimchy") <1>
  295. );
  296. --------------------------------------------------
  297. <1> filters
  298. Note that you can cache the result using
  299. `OrFilterBuilder#cache(boolean)` method. See <<query-dsl-filters-caching>>.
  300. [[prefix-filter]]
  301. === Prefix Filter
  302. See {ref}/query-dsl-prefix-filter.html[Prefix Filter]
  303. [source,java]
  304. --------------------------------------------------
  305. FilterBuilder filter = prefixFilter(
  306. "user", <1>
  307. "ki" <2>
  308. );
  309. --------------------------------------------------
  310. <1> field
  311. <2> prefix
  312. Note that you can cache the result using
  313. `PrefixFilterBuilder#cache(boolean)` method. See <<query-dsl-filters-caching>>.
  314. [[query-filter]]
  315. === Query Filter
  316. See {ref}/query-dsl-query-filter.html[Query Filter]
  317. [source,java]
  318. --------------------------------------------------
  319. FilterBuilder filter = queryFilter(
  320. queryStringQuery("this AND that OR thus") <1>
  321. );
  322. --------------------------------------------------
  323. <1> query you want to wrap as a filter
  324. Note that you can cache the result using
  325. `QueryFilterBuilder#cache(boolean)` method. See <<query-dsl-filters-caching>>.
  326. [[range-filter]]
  327. === Range Filter
  328. See {ref}/query-dsl-range-filter.html[Range Filter]
  329. [source,java]
  330. --------------------------------------------------
  331. FilterBuilder filter = rangeFilter("age") <1>
  332. .from("10") <2>
  333. .to("20") <3>
  334. .includeLower(true) <4>
  335. .includeUpper(false); <5>
  336. --------------------------------------------------
  337. <1> field
  338. <2> from
  339. <3> to
  340. <4> include lower value means that `from` is `gt` when `false` or `gte` when `true`
  341. <5> include upper value means that `to` is `lt` when `false` or `lte` when `true`
  342. [source,java]
  343. --------------------------------------------------
  344. // A simplified form using gte, gt, lt or lte
  345. FilterBuilder filter = rangeFilter("age") <1>
  346. .gte("10") <2>
  347. .lt("20"); <3>
  348. --------------------------------------------------
  349. <1> field
  350. <2> set `from` to 10 and `includeLower` to true
  351. <3> set `to` to 20 and `includeUpper` to false
  352. Note that you can ask not to cache the result using
  353. `RangeFilterBuilder#cache(boolean)` method. See <<query-dsl-filters-caching>>.
  354. [[script-filter]]
  355. === Script Filter
  356. See {ref}/query-dsl-script-filter.html[Script Filter]
  357. [source,java]
  358. --------------------------------------------------
  359. FilterBuilder filter = scriptFilter(
  360. "doc['age'].value > param1" <1>
  361. ).addParam("param1", 10); <2>
  362. --------------------------------------------------
  363. <1> script to execute
  364. <2> parameters
  365. Note that you can cache the result using
  366. `ScriptFilterBuilder#cache(boolean)` method. See <<query-dsl-filters-caching>>.
  367. [[term-filter]]
  368. === Term Filter
  369. See {ref}/query-dsl-term-filter.html[Term Filter]
  370. [source,java]
  371. --------------------------------------------------
  372. FilterBuilder filter = termFilter(
  373. "user", <1>
  374. "kimchy" <2>
  375. );
  376. --------------------------------------------------
  377. <1> field
  378. <2> value
  379. Note that you can ask not to cache the result using
  380. `TermFilterBuilder#cache(boolean)` method. See <<query-dsl-filters-caching>>.
  381. [[terms-filter]]
  382. === Terms Filter
  383. See {ref}/query-dsl-terms-filter.html[Terms Filter]
  384. [source,java]
  385. --------------------------------------------------
  386. FilterBuilder filter = termsFilter(
  387. "user", <1>
  388. "kimchy", <2>
  389. "elasticsearch" <2>
  390. )
  391. .execution("plain"); <3>
  392. --------------------------------------------------
  393. <1> field
  394. <2> terms
  395. <3> execution mode: could be `plain`, `fielddata`, `bool`, `and`, `or`, `bool_nocache`, `and_nocache` or `or_nocache`
  396. Note that you can ask not to cache the result using
  397. `TermsFilterBuilder#cache(boolean)` method. See <<query-dsl-filters-caching>>.
  398. [[nested-filter]]
  399. === Nested Filter
  400. See {ref}/query-dsl-nested-filter.html[Nested Filter]
  401. [source,java]
  402. --------------------------------------------------
  403. FilterBuilder filter = nestedFilter("obj1", <1>
  404. boolFilter() <2>
  405. .must(termFilter("obj1.name", "blue"))
  406. .must(rangeFilter("obj1.count").gt(5))
  407. );
  408. --------------------------------------------------
  409. <1> path to nested document
  410. <2> filter
  411. Note that you can ask not to cache the result using
  412. `NestedFilterBuilder#cache(boolean)` method. See <<query-dsl-filters-caching>>.
  413. [[query-dsl-filters-caching]]
  414. === Caching
  415. By default, some filters are cached or not cached. You can have a fine
  416. tuning control using `cache(boolean)` method when exists. For example:
  417. [source,java]
  418. --------------------------------------------------
  419. FilterBuilder filter = andFilter(
  420. rangeFilter("postDate").from("2010-03-01").to("2010-04-01"),
  421. prefixFilter("name.second", "ba")
  422. )
  423. .cache(true); <1>
  424. --------------------------------------------------
  425. <1> force caching filter