elasticsearch provides a full Java query dsl in a similar manner to the REST Query DSL. The factory for query builders is QueryBuilders
. Once your query is ready, you can use the Search API.
See also how to build Filters
To use QueryBuilders
just import them in your class:
import org.elasticsearch.index.query.QueryBuilders.*;
Note that you can easily print (aka debug) JSON generated queries using toString()
method on QueryBuilder
object.
The QueryBuilder
can then be used with any API that accepts a query, such as count
and search
.
Match Query
See Match Query
QueryBuilder qb =QueryBuilders.matchQuery("name","kimchy elasticsearch");
MultiMatch Query
See MultiMatch Query
QueryBuilder qb =QueryBuilders.multiMatchQuery(
"kimchy elasticsearch", // Text you are looking for
"user","message" // Fields you query on
);
Boolean Query
See Boolean Query
QueryBuilder qb =QueryBuilders
.boolQuery()
.must(termQuery("content","test1"))
.must(termQuery("content","test4"))
.mustNot(termQuery("content","test2"))
.should(termQuery("content","test3"));
Boosting Query
See Boosting Query
QueryBuilders.boostingQuery()
.positive(QueryBuilders.termQuery("name","kimchy"))
.negative(QueryBuilders.termQuery("name","dadoonet"))
.negativeBoost(0.2f);
Custom Score Query
QueryBuilders.customScoreQuery(QueryBuilders.matchAllQuery()) // Your query here
.script("_score * doc['price'].value"); // Your script here
// If the script have parameters, use the same script and provide parameters to it.
QueryBuilders.customScoreQuery(QueryBuilders.matchAllQuery())
.script("_score * doc['price'].value / pow(param1, param2)")
.param("param1",2)
.param("param2",3.1);
Custom Boost Factor Query
QueryBuilders.customBoostFactorQuery(QueryBuilders.matchAllQuery())// Your query
.boostFactor(3.1f);
Constant Score Query
// Using with Filters
QueryBuilders.constantScoreQuery(FilterBuilders.termFilter("name","kimchy"))
.boost(2.0f);
// With Queries
QueryBuilders.constantScoreQuery(QueryBuilders.termQuery("name","kimchy"))
.boost(2.0f);
Disjunction Max Query
QueryBuilders.disMaxQuery()
.add(QueryBuilders.termQuery("name","kimchy")) // Your queries
.add(QueryBuilders.termQuery("name","elasticsearch")) // Your queries
.boost(1.2f)
.tieBreaker(0.7f);
Field Query
See Field Query
QueryBuilders.fieldQuery("name","+kimchy -dadoonet");
// Note that you can write the same query using queryString query.
QueryBuilders.queryString("+kimchy -dadoonet").field("name");
Fuzzy Like This (Field) Query (flt and flt_field)
See: * Fuzzy Like This Query * Fuzzy Like This Field Query
// flt Query
QueryBuilders.fuzzyLikeThisQuery("name.first","name.last") // Fields
.likeText("text like this one") // Text
.maxQueryTerms(12); // Max num of Terms
// in generated queries
// flt_field Query
QueryBuilders.fuzzyLikeThisFieldQuery("name.first") // Only on single field
.likeText("text like this one")
.maxQueryTerms(12);
Has Child / Has Parent
See: * Has Child Query * Has Parent
// Has Child
QueryBuilders.hasChildQuery("blog_tag",
QueryBuilders.termQuery("tag","something"))
// Has Parent
QueryBuilders.hasParentQuery("blog",
QueryBuilders.termQuery("tag","something"));
More Like This (Field) Query (mlt and mlt_field)
See: * More Like This Query * More Like This Field Query
// mlt Query
QueryBuilders.moreLikeThisQuery("name.first","name.last") // Fields
.likeText("text like this one") // Text
.minTermFreq(1) // Ignore Threshold
.maxQueryTerms(12); // Max num of Terms
// in generated queries
// mlt_field Query
QueryBuilders.moreLikeThisFieldQuery("name.first") // Only on single field
.likeText("text like this one")
.minTermFreq(1)
.maxQueryTerms(12);
QueryString Query
QueryBuilder qb =QueryBuilders.queryString("+kimchy -elasticsearch");
Range Query
See Range Query
QueryBuilder qb =QueryBuilders
.rangeQuery("price")
.from(5)
.to(10)
.includeLower(true)
.includeUpper(false);
Span Queries (first, near, not, or, term)
See: * Span First Query * Span Near Query * Span Not Query * Span Or Query * Span Term Query
// Span First
QueryBuilders.spanFirstQuery(
QueryBuilders.spanTermQuery("user","kimchy"), // Query
3 // Max End position
);
// Span Near
QueryBuilders.spanNearQuery()
.clause(QueryBuilders.spanTermQuery("field","value1")) // Span Term Queries
.clause(QueryBuilders.spanTermQuery("field","value2"))
.clause(QueryBuilders.spanTermQuery("field","value3"))
.slop(12) // Slop factor
.inOrder(false)
.collectPayloads(false);
// Span Not
QueryBuilders.spanNotQuery()
.include(QueryBuilders.spanTermQuery("field","value1"))
.exclude(QueryBuilders.spanTermQuery("field","value2"));
// Span Or
QueryBuilders.spanOrQuery()
.clause(QueryBuilders.spanTermQuery("field","value1"))
.clause(QueryBuilders.spanTermQuery("field","value2"))
.clause(QueryBuilders.spanTermQuery("field","value3"));
// Span Term
QueryBuilders.spanTermQuery("user","kimchy");
Terms Query
See Terms Query
QueryBuilders.termsQuery("tags", // field
"blue","pill") // values
.minimumMatch(1); // How many terms must match
Top Children Query
QueryBuilders.topChildrenQuery(
"blog_tag", // field
QueryBuilders.termQuery("tag","something")// Query
)
.score("max") // max, sum or avg
.factor(5)
.incrementalFactor(2);
Nested Query
See Nested Query
QueryBuilders.nestedQuery("obj1", // Path
QueryBuilders.boolQuery() // Your query
.must(QueryBuilders.matchQuery("obj1.name","blue"))
.must(QueryBuilders.rangeQuery("obj1.count").gt(5))
)
.scoreMode("avg"); // max, total, avg or none
Custom Filters Score Query
See Custom Filters Score Query
QueryBuilders.customFiltersScoreQuery(
QueryBuilders.matchAllQuery()) // Query
// Filters with their boost factors
.add(FilterBuilders.rangeFilter("age").from(0).to(10),3)
.add(FilterBuilders.rangeFilter("age").from(10).to(20),2)
.scoreMode("first"); // first, min, max, total, avg or multiply
Indices Query
See Indices Query
// Using another query when no match for the main one
QueryBuilders.indicesQuery(
QueryBuilders.termQuery("tag","wow"),
"index1","index2"
)
.noMatchQuery(QueryBuilders.termQuery("tag","kow"));
// Using all (match all) or none (match no documents)
QueryBuilders.indicesQuery(
QueryBuilders.termQuery("tag","wow"),
"index1","index2"
)
.noMatchQuery("all"); // all or none
GeoShape Query
See GeoShape Query
Note: the geo_shape
type uses Spatial4J
and JTS
, both of which are optional dependencies. Consequently you must add Spatial4J
and JTS
to your classpath in order to use this type:
<dependency>
<groupId>com.spatial4j</groupId>
<artifactId>spatial4j</artifactId>
<version>0.3</version>
</dependency>
<dependency>
<groupId>com.vividsolutions</groupId>
<artifactId>jts</artifactId>
<version>1.12</version>
<exclusions>
<exclusion>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
</exclusion>
</exclusions>
</dependency>
// Import Spatial4J shapes
import com.spatial4j.core.context.SpatialContext;
import com.spatial4j.core.shape.Shape;
import com.spatial4j.core.shape.impl.RectangleImpl;
// Also import ShapeRelation
import org.elasticsearch.common.geo.ShapeRelation;
// Shape within another
QueryBuilders.geoShapeQuery("location",
newRectangleImpl(0,10,0,10,SpatialContext.GEO))
.relation(ShapeRelation.WITHIN);
// Intersect shapes
QueryBuilders.geoShapeQuery("location",
newPointImpl(0,0,SpatialContext.GEO))
.relation(ShapeRelation.INTERSECTS);
// Using pre-indexed shapes
QueryBuilders.geoShapeQuery("location","New Zealand","countries")
.relation(ShapeRelation.DISJOINT);