/*
* Licensed to Elasticsearch under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch licenses this file to you under
* the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.elasticsearch.client.documentation;
import org.apache.lucene.search.join.ScoreMode;
import org.elasticsearch.common.geo.GeoPoint;
import org.elasticsearch.common.geo.ShapeRelation;
import org.elasticsearch.common.geo.builders.CoordinatesBuilder;
import org.elasticsearch.common.geo.builders.ShapeBuilders;
import org.elasticsearch.common.unit.DistanceUnit;
import org.elasticsearch.index.query.GeoShapeQueryBuilder;
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder.FilterFunctionBuilder;
import org.elasticsearch.script.Script;
import org.elasticsearch.script.ScriptType;
import org.elasticsearch.test.ESTestCase;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static java.util.Collections.singletonMap;
import static org.elasticsearch.index.query.QueryBuilders.boolQuery;
import static org.elasticsearch.index.query.QueryBuilders.boostingQuery;
import static org.elasticsearch.index.query.QueryBuilders.commonTermsQuery;
import static org.elasticsearch.index.query.QueryBuilders.constantScoreQuery;
import static org.elasticsearch.index.query.QueryBuilders.disMaxQuery;
import static org.elasticsearch.index.query.QueryBuilders.existsQuery;
import static org.elasticsearch.index.query.QueryBuilders.functionScoreQuery;
import static org.elasticsearch.index.query.QueryBuilders.fuzzyQuery;
import static org.elasticsearch.index.query.QueryBuilders.geoBoundingBoxQuery;
import static org.elasticsearch.index.query.QueryBuilders.geoDistanceQuery;
import static org.elasticsearch.index.query.QueryBuilders.geoPolygonQuery;
import static org.elasticsearch.index.query.QueryBuilders.geoShapeQuery;
import static org.elasticsearch.index.query.QueryBuilders.idsQuery;
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
import static org.elasticsearch.index.query.QueryBuilders.matchQuery;
import static org.elasticsearch.index.query.QueryBuilders.moreLikeThisQuery;
import static org.elasticsearch.index.query.QueryBuilders.multiMatchQuery;
import static org.elasticsearch.index.query.QueryBuilders.nestedQuery;
import static org.elasticsearch.index.query.QueryBuilders.prefixQuery;
import static org.elasticsearch.index.query.QueryBuilders.queryStringQuery;
import static org.elasticsearch.index.query.QueryBuilders.rangeQuery;
import static org.elasticsearch.index.query.QueryBuilders.regexpQuery;
import static org.elasticsearch.index.query.QueryBuilders.scriptQuery;
import static org.elasticsearch.index.query.QueryBuilders.simpleQueryStringQuery;
import static org.elasticsearch.index.query.QueryBuilders.spanContainingQuery;
import static org.elasticsearch.index.query.QueryBuilders.spanFirstQuery;
import static org.elasticsearch.index.query.QueryBuilders.spanMultiTermQueryBuilder;
import static org.elasticsearch.index.query.QueryBuilders.spanNearQuery;
import static org.elasticsearch.index.query.QueryBuilders.spanNotQuery;
import static org.elasticsearch.index.query.QueryBuilders.spanOrQuery;
import static org.elasticsearch.index.query.QueryBuilders.spanTermQuery;
import static org.elasticsearch.index.query.QueryBuilders.spanWithinQuery;
import static org.elasticsearch.index.query.QueryBuilders.termQuery;
import static org.elasticsearch.index.query.QueryBuilders.termsQuery;
import static org.elasticsearch.index.query.QueryBuilders.typeQuery;
import static org.elasticsearch.index.query.QueryBuilders.wildcardQuery;
import static org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders.exponentialDecayFunction;
import static org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders.randomFunction;
import static org.elasticsearch.join.query.JoinQueryBuilders.hasChildQuery;
import static org.elasticsearch.join.query.JoinQueryBuilders.hasParentQuery;
/**
* Examples of using the transport client that are imported into the transport client documentation.
* There are no assertions here because we're mostly concerned with making sure that the examples
* compile and don't throw weird runtime exceptions. Assertions and example data would be nice, but
* that is secondary.
*/
public class QueryDSLDocumentationTests extends ESTestCase {
public void testBool() {
// tag::bool
boolQuery()
.must(termQuery("content", "test1")) // <1>
.must(termQuery("content", "test4")) // <1>
.mustNot(termQuery("content", "test2")) // <2>
.should(termQuery("content", "test3")) // <3>
.filter(termQuery("content", "test5")); // <4>
// end::bool
}
public void testBoosting() {
// tag::boosting
boostingQuery(
termQuery("name","kimchy"), // <1>
termQuery("name","dadoonet")) // <2>
.negativeBoost(0.2f); // <3>
// end::boosting
}
public void testCommonTerms() {
// tag::common_terms
commonTermsQuery("name", // <1>
"kimchy"); // <2>
// end::common_terms
}
public void testConstantScore() {
// tag::constant_score
constantScoreQuery(
termQuery("name","kimchy")) // <1>
.boost(2.0f); // <2>
// end::constant_score
}
public void testDisMax() {
// tag::dis_max
disMaxQuery()
.add(termQuery("name", "kimchy")) // <1>
.add(termQuery("name", "elasticsearch")) // <2>
.boost(1.2f) // <3>
.tieBreaker(0.7f); // <4>
// end::dis_max
}
public void testExists() {
// tag::exists
existsQuery("name"); // <1>
// end::exists
}
public void testFunctionScore() {
// tag::function_score
FilterFunctionBuilder[] functions = {
new FunctionScoreQueryBuilder.FilterFunctionBuilder(
matchQuery("name", "kimchy"), // <1>
randomFunction("ABCDEF")), // <2>
new FunctionScoreQueryBuilder.FilterFunctionBuilder(
exponentialDecayFunction("age", 0L, 1L)) // <3>
};
functionScoreQuery(functions);
// end::function_score
}
public void testFuzzy() {
// tag::fuzzy
fuzzyQuery(
"name", // <1>
"kimchy"); // <2>
// end::fuzzy
}
public void testGeoBoundingBox() {
// tag::geo_bounding_box
geoBoundingBoxQuery("pin.location") // <1>
.setCorners(40.73, -74.1, // <2>
40.717, -73.99); // <3>
// end::geo_bounding_box
}
public void testGeoDistance() {
// tag::geo_distance
geoDistanceQuery("pin.location") // <1>
.point(40, -70) // <2>
.distance(200, DistanceUnit.KILOMETERS); // <3>
// end::geo_distance
}
public void testGeoPolygon() {
// tag::geo_polygon
List<GeoPoint> points = new ArrayList<GeoPoint>(); // <1>
points.add(new GeoPoint(40, -70));
points.add(new GeoPoint(30, -80));
points.add(new GeoPoint(20, -90));
geoPolygonQuery("pin.location", points); // <2>
// end::geo_polygon
}
public void testGeoShape() throws IOException {
{
// tag::geo_shape
GeoShapeQueryBuilder qb = geoShapeQuery(
"pin.location", // <1>
ShapeBuilders.newMultiPoint( // <2>
new CoordinatesBuilder()
.coordinate(0, 0)
.coordinate(0, 10)
.coordinate(10, 10)
.coordinate(10, 0)
.coordinate(0, 0)
.build()));
qb.relation(ShapeRelation.WITHIN); // <3>
// end::geo_shape
}
{
// tag::indexed_geo_shape
// Using pre-indexed shapes
GeoShapeQueryBuilder qb = geoShapeQuery(
"pin.location", // <1>
"DEU", // <2>
"countries"); // <3>
qb.relation(ShapeRelation.WITHIN) // <4>
.indexedShapeIndex("shapes") // <5>
.indexedShapePath("location"); // <6>
// end::indexed_geo_shape
}
}
public void testHasChild() {
// tag::has_child
hasChildQuery(
"blog_tag", // <1>
termQuery("tag","something"), // <2>
ScoreMode.None); // <3>
// end::has_child
}
public void testHasParent() {
// tag::has_parent
hasParentQuery(
"blog", // <1>
termQuery("tag","something"), // <2>
false); // <3>
// end::has_parent
}
public void testIds() {
// tag::ids
idsQuery("my_type", "type2")
.addIds("1", "4", "100");
idsQuery() // <1>
.addIds("1", "4", "100");
// end::ids
}
public void testMatchAll() {
// tag::match_all
matchAllQuery();
// end::match_all
}
public void testMatch() {
// tag::match
matchQuery(
"name", // <1>
"kimchy elasticsearch"); // <2>
// end::match
}
public void testMoreLikeThis() {
// tag::more_like_this
String[] fields = {"name.first", "name.last"}; // <1>
String[] texts = {"text like this one"}; // <2>
moreLikeThisQuery(fields, texts, null)
.minTermFreq(1) // <3>
.maxQueryTerms(12); // <4>
// end::more_like_this
}
public void testMultiMatch() {
// tag::multi_match
multiMatchQuery(
"kimchy elasticsearch", // <1>
"user", "message"); // <2>
// end::multi_match
}
public void testNested() {
// tag::nested
nestedQuery(
"obj1", // <1>
boolQuery() // <2>
.must(matchQuery("obj1.name", "blue"))
.must(rangeQuery("obj1.count").gt(5)),
ScoreMode.Avg); // <3>
// end::nested
}
public void testPrefix() {
// tag::prefix
prefixQuery(
"brand", // <1>
"heine"); // <2>
// end::prefix
}
public void testQueryString() {
// tag::query_string
queryStringQuery("+kimchy -elasticsearch");
// end::query_string
}
public void testRange() {
// tag::range
rangeQuery("price") // <1>
.from(5) // <2>
.to(10) // <3>
.includeLower(true) // <4>
.includeUpper(false); // <5>
// end::range
// tag::range_simplified
// A simplified form using gte, gt, lt or lte
rangeQuery("age") // <1>
.gte("10") // <2>
.lt("20"); // <3>
// end::range_simplified
}
public void testRegExp() {
// tag::regexp
regexpQuery(
"name.first", // <1>
"s.*y"); // <2>
// end::regexp
}
public void testScript() {
// tag::script_inline
scriptQuery(
new Script("doc['num1'].value > 1") // <1>
);
// end::script_inline
// tag::script_file
Map<String, Object> parameters = new HashMap<>();
parameters.put("param1", 5);
scriptQuery(new Script(
ScriptType.FILE, // <1>
"painless", // <2>
"myscript", // <3>
singletonMap("param1", 5))); // <4>
// end::script_file
}
public void testSimpleQueryString() {
// tag::simple_query_string
simpleQueryStringQuery("+kimchy -elasticsearch");
// end::simple_query_string
}
public void testSpanContaining() {
// tag::span_containing
spanContainingQuery(
spanNearQuery(spanTermQuery("field1","bar"), 5) // <1>
.addClause(spanTermQuery("field1","baz"))
.inOrder(true),
spanTermQuery("field1","foo")); // <2>
// end::span_containing
}
public void testSpanFirst() {
// tag::span_first
spanFirstQuery(
spanTermQuery("user", "kimchy"), // <1>
3 // <2>
);
// end::span_first
}
public void testSpanMultiTerm() {
// tag::span_multi
spanMultiTermQueryBuilder(
prefixQuery("user", "ki")); // <1>
// end::span_multi
}
public void testSpanNear() {
// tag::span_near
spanNearQuery(
spanTermQuery("field","value1"), // <1>
12) // <2>
.addClause(spanTermQuery("field","value2")) // <1>
.addClause(spanTermQuery("field","value3")) // <1>
.inOrder(false); // <3>
// end::span_near
}
public void testSpanNot() {
// tag::span_not
spanNotQuery(
spanTermQuery("field","value1"), // <1>
spanTermQuery("field","value2")); // <2>
// end::span_not
}
public void testSpanOr() {
// tag::span_or
spanOrQuery(spanTermQuery("field","value1")) // <1>
.addClause(spanTermQuery("field","value2")) // <1>
.addClause(spanTermQuery("field","value3")); // <1>
// end::span_or
}
public void testSpanTerm() {
// tag::span_term
spanTermQuery(
"user", // <1>
"kimchy"); // <2>
// end::span_term
}
public void testSpanWithin() {
// tag::span_within
spanWithinQuery(
spanNearQuery(spanTermQuery("field1", "bar"), 5) // <1>
.addClause(spanTermQuery("field1", "baz"))
.inOrder(true),
spanTermQuery("field1", "foo")); // <2>
// end::span_within
}
public void testTerm() {
// tag::term
termQuery(
"name", // <1>
"kimchy"); // <2>
// end::term
}
public void testTerms() {
// tag::terms
termsQuery("tags", // <1>
"blue", "pill"); // <2>
// end::terms
}
public void testType() {
// tag::type
typeQuery("my_type"); // <1>
// end::type
}
public void testWildcard() {
// tag::wildcard
wildcardQuery(
"user", // <1>
"k?mch*"); // <2>
// end::wildcard
}
}