http://okfnlabs.org/blog/2013/07/01/elasticsearch-query-tutorial.html
{endpoint}/_search?source={Query-as-JSON}
curl -XGET {endpoint}/_search -d 'Query-as-JSON'
curl -XGET {endpoint}/_search -d '{
"query" : {
"term" : { "user": "kimchy" }
}
}
QSL
{
size: # number of results to return (defaults to 10)
from: # offset into results (defaults to 0)
fields: # list of document fields that should be returned - http://elasticsearch.org/guide/reference/api/search/fields.html
sort: # define sort order - see http://elasticsearch.org/guide/reference/api/search/sort.html
query: {
# "query" object following the Query DSL: http://elasticsearch.org/guide/reference/query-dsl/
# details below
},
facets: {
# facets specifications
# Facets provide summary information about a particular field or fields in the data
}
# special case for situations where you want to apply filter/query to results but *not* to facets
filter: {
# filter objects
# a filter is a simple "filter" (query) on a specific field.
# Simple means e.g. checking against a specific value or range of values
},
}
---
{
# some info about the query (which shards it used, how long it took etc)
...
# the results
hits: {
total: # total number of matching documents
hits: [
# list of "hits" returned
{
_id: # id of document
score: # the search index score
_source: {
# document 'source' (i.e. the original JSON document you sent to the index
}
}
]
}
# facets if these were requested
facets: {
...
}
}
--
{
"query": {
# compound component
"bool": {
# compound component
"must": {
# basic component
"term": {
"user": "jones"
}
}
# compound component
"must_not": {
# basic component
"range" : {
"age" : {
"from" : 10,
"to" : 20
}
}
}
}
}
}
--
n addition, and somewhat confusingly, ElasticSearch distinguishes between sub-components that are “queries” and those that are “filters”. Filters, are really special kind of queries that are: mostly basic (though boolean compounding is alllowed); limited to one field or operation and which, as such, are especially performant.
-
{
"query": {
"match_all": {}
}
}
{
"query": {
"query_string": {
"query": {query string}
}
}
}
---
Filter on One Field
{
"query": {
"term": {
{field-name}: {value}
}
}
}
---
High performance equivalent using filters:
{
"query": {
"constant_score": {
"filter": {
"term": {
# note that value should be *lower-cased*
{field-name}: {value}
}
}
}
}
---
Filter on two fields
Note that you cannot, unfortunately, have a simple and query by adding two filters inside the query element. Instead you need an ‘and’ clause in a filter (which in turn requires nesting in ‘filtered’). You could also achieve the same result here using a bool query.
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"and": [
{
"range" : {
"b" : {
"from" : 4,
"to" : "8"
}
},
},
{
"term": {
"a": "john"
}
}
]
}
}
}
}
Geospatial Query to find results near a given point
This uses th
--
Geospatial Query to find results near a given point
This uses the Geo Distance filter. It requires that indexed documents have a field of geo point type.
Source data (a point in San Francisco!):
# This should be in lat,lon order
{
...
"Location": "37.7809035011582, -122.412119695795"
}
There are alternative formats to provide lon/lat locations e.g. (see ElasticSearch documentation for more):
# Note this must have lon,lat order (opposite of previous example!)
{
"Location":[-122.414753390488, 37.7762147914147]
}
# or ...
{
"Location": {
"lon": -122.414753390488,
"lat": 37.7762147914147
}
}
We also need a mapping to specify that Location field is of type geo_point as this will not usually get guessed from the data (see below for more on mappings):
"properties": {
"Location": {
"type": "geo_point"
}
...
}
---
@Test
public void givenJsonString_whenJavaObject_thenIndexDocument() {
String jsonObject = "{\"age\":10,\"dateOfBirth\":1471466076564,"
+"\"fullName\":\"John Doe\"}";
IndexResponse response = client.prepareIndex("people", "Doe")
.setSource(jsonObject, XContentType.JSON).get();
String id = response.getId();
String index = response.getIndex();
String type = response.getType();
long version = response.getVersion();
assertEquals(Result.CREATED, response.getResult());
assertEquals(0, version);
assertEquals("people", index);
assertEquals("Doe", type);
}
---
SearchResponse response = client.prepareSearch().execute().actionGet();
List searchHits = Arrays.asList(response.getHits().getHits());
List results = new ArrayList();
searchHits.forEach(
hit -> results.add(JSON.parseObject(hit.getSourceAsString(), Person.class)));
---
Retrieving and Deleting Documents
The prepareGet() and prepareDelete() methods allow to get or delete a JSON document from the cluster using its id:
1
2
3
4
5
GetResponse response = client.prepareGet("people","Doe","1").get();
String age = (String) response.getField("age").getValue();
// Process other fields
DeleteResponse response = client.prepareDelete("people", "Doe", "5")
.get();
--
The rangeQuery() matches documents where a field’s value is within a certain range:
1
2
QueryBuilder matchDocumentsWithinRange = QueryBuilders
.rangeQuery("price").from(15).to(100)
{endpoint}/_search?source={Query-as-JSON}
curl -XGET {endpoint}/_search -d 'Query-as-JSON'
curl -XGET {endpoint}/_search -d '{
"query" : {
"term" : { "user": "kimchy" }
}
}
QSL
{
size: # number of results to return (defaults to 10)
from: # offset into results (defaults to 0)
fields: # list of document fields that should be returned - http://elasticsearch.org/guide/reference/api/search/fields.html
sort: # define sort order - see http://elasticsearch.org/guide/reference/api/search/sort.html
query: {
# "query" object following the Query DSL: http://elasticsearch.org/guide/reference/query-dsl/
# details below
},
facets: {
# facets specifications
# Facets provide summary information about a particular field or fields in the data
}
# special case for situations where you want to apply filter/query to results but *not* to facets
filter: {
# filter objects
# a filter is a simple "filter" (query) on a specific field.
# Simple means e.g. checking against a specific value or range of values
},
}
---
{
# some info about the query (which shards it used, how long it took etc)
...
# the results
hits: {
total: # total number of matching documents
hits: [
# list of "hits" returned
{
_id: # id of document
score: # the search index score
_source: {
# document 'source' (i.e. the original JSON document you sent to the index
}
}
]
}
# facets if these were requested
facets: {
...
}
}
--
{
"query": {
# compound component
"bool": {
# compound component
"must": {
# basic component
"term": {
"user": "jones"
}
}
# compound component
"must_not": {
# basic component
"range" : {
"age" : {
"from" : 10,
"to" : 20
}
}
}
}
}
}
--
n addition, and somewhat confusingly, ElasticSearch distinguishes between sub-components that are “queries” and those that are “filters”. Filters, are really special kind of queries that are: mostly basic (though boolean compounding is alllowed); limited to one field or operation and which, as such, are especially performant.
-
{
"query": {
"match_all": {}
}
}
{
"query": {
"query_string": {
"query": {query string}
}
}
}
---
Filter on One Field
{
"query": {
"term": {
{field-name}: {value}
}
}
}
---
High performance equivalent using filters:
{
"query": {
"constant_score": {
"filter": {
"term": {
# note that value should be *lower-cased*
{field-name}: {value}
}
}
}
}
---
Filter on two fields
Note that you cannot, unfortunately, have a simple and query by adding two filters inside the query element. Instead you need an ‘and’ clause in a filter (which in turn requires nesting in ‘filtered’). You could also achieve the same result here using a bool query.
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"and": [
{
"range" : {
"b" : {
"from" : 4,
"to" : "8"
}
},
},
{
"term": {
"a": "john"
}
}
]
}
}
}
}
Geospatial Query to find results near a given point
This uses th
--
Geospatial Query to find results near a given point
This uses the Geo Distance filter. It requires that indexed documents have a field of geo point type.
Source data (a point in San Francisco!):
# This should be in lat,lon order
{
...
"Location": "37.7809035011582, -122.412119695795"
}
There are alternative formats to provide lon/lat locations e.g. (see ElasticSearch documentation for more):
# Note this must have lon,lat order (opposite of previous example!)
{
"Location":[-122.414753390488, 37.7762147914147]
}
# or ...
{
"Location": {
"lon": -122.414753390488,
"lat": 37.7762147914147
}
}
We also need a mapping to specify that Location field is of type geo_point as this will not usually get guessed from the data (see below for more on mappings):
"properties": {
"Location": {
"type": "geo_point"
}
...
}
---
@Test
public void givenJsonString_whenJavaObject_thenIndexDocument() {
String jsonObject = "{\"age\":10,\"dateOfBirth\":1471466076564,"
+"\"fullName\":\"John Doe\"}";
IndexResponse response = client.prepareIndex("people", "Doe")
.setSource(jsonObject, XContentType.JSON).get();
String id = response.getId();
String index = response.getIndex();
String type = response.getType();
long version = response.getVersion();
assertEquals(Result.CREATED, response.getResult());
assertEquals(0, version);
assertEquals("people", index);
assertEquals("Doe", type);
}
---
SearchResponse response = client.prepareSearch().execute().actionGet();
List
List
searchHits.forEach(
hit -> results.add(JSON.parseObject(hit.getSourceAsString(), Person.class)));
---
Retrieving and Deleting Documents
The prepareGet() and prepareDelete() methods allow to get or delete a JSON document from the cluster using its id:
1
2
3
4
5
GetResponse response = client.prepareGet("people","Doe","1").get();
String age = (String) response.getField("age").getValue();
// Process other fields
DeleteResponse response = client.prepareDelete("people", "Doe", "5")
.get();
--
The rangeQuery() matches documents where a field’s value is within a certain range:
1
2
QueryBuilder matchDocumentsWithinRange = QueryBuilders
.rangeQuery("price").from(15).to(100)
No comments:
Post a Comment