Interactive examples with Go
Setting things up
Before we start using the appbase.io REST API, we’ll need to set up an appbase.io app.
For this tutorial, we have used a sample app containing some dummy housing records. All the examples use this app. You can also clone this app (to create your own private app) directly by clicking "Clone this app" in the data browser view of the app here.
All the records are structured in the following format:
{
"name": "The White House",
"room_type": "Private room",
"property_type": "Townhouse",
"price": 124,
"has_availability": true,
"accommodates": 2,
"bedrooms": 1,
"bathrooms": 1.5,
"beds": 1,
"bed_type": "Real Bed",
"host_image": "https://host_image.link",
"host_name": "Alyson",
"image": "https://image.link",
"listing_url": "https://www.airbnb.com/rooms/6644628",
"location": {
"lat": 47.53540733743967,
"lon": -122.27983057017123
},
"date_from": 20170426,
"date_to": 20170421,
}
To interact with our app instance, we'll make HTTP REST API requests. The semantics should remain the same for any 3rd party HTTP library as well.
This is the common code which exists in all examples. Here, we simply create url
based on app
, a payload
containing request body and set headers with credentials
.
// Request URL containing app, type and id or method
url := "https://appbase-demo-ansible-abxiydt-arc.searchbase.io/{{app}}/{{type}}/{{id/method}}"
// Request body/payload
payload := strings.NewReader("{{query_request}}")
// Request HTTP method ( GET | POST | PUT | DELETE )
req, _ := http.NewRequest("{{http_method}}", url, payload)
// App credentials base64 encoded
req.Header.Add("Authorization", "Basic {{credentials_base64}}")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
Note
If you are using your own app instance, make sure to update
url
with yourapp
,type
andreq.Header
with yourcredentials
.
Fetch All
Before with start with all the fancy queries, let's write a query to fetch all the records in the app.
We'll use the /_search
endpoint from appbase.io REST API to fire a POST
request with the body containing a match_all query.
Note
Feel free to play around the query by making changes in the interactive demo. Make sure to hit the run button after every change.
You can also see this query in Mirage - a GUI for Elasticsearch queries which provides a query explorer view to interact with an app's data. Here's the same query executed on Mirage.
Note
You can use any query parameters such as
from
andsize
that are supported by Query DSL.
Index Data
Next, let's add some data to our app.
We'll use the /id
endpoint from appbase.io REST API specifying the id H1
and fire a PUT
request with the body containing a simple JSON object with some housing data.
Note
If you intended to autogenerate
id
, do aPOST
request instead and don't pass anyid
with the URL. We'll autogenerate it for you.
Fetch Data
Let's learn how to fetch or read the data present at specific id
location.
We'll use the /id
endpoint from appbase.io REST API specifying the id H1
and fire a GET
request.
Bulk Index Data
Let's now learn to index multiple documents in one request. For this, we'll use Bulk API to perform many index/delete operations in a single API call.
Note
It is recommended to index up to 1 MB of data (~500 documents) at a time (so if you have 50,000 documents, you can split them into chunks of 500 documents and index).
Range Query
Let's now query the dataset to get all rooms between prices 100 to 150.
We'll use the /_search
endpoint from appbase.io REST API to fire a POST
request with the body containing a range query by passing the field price
and specifying range filter values.
Here's the same query executed on Mirage.
GeoDistance Query
Let's now get a list of all the rooms available within a certain distance from a specific geopoint (lat,lon) location.
We'll use the /_search
endpoint from appbase.io REST API to fire a POST
request with the body containing a geodistance query specifying distance
and location
co-ordinates.
Full-text Search
Here, we will apply a full-text search query on a field with a n-gram analyzer applied to it. Instead of indexing the exact field value, an n-gram indexes multiple grams that constitute the field value when indexing. This allows for a granular querying experience, where even partial field values can be matched back, really useful when building auto-suggestion based search. You can read more about n-grams here.
We'll do a full-text search query on the name
field by using the /_search
endpoint from appbase.io REST API to fire a POST
request with the body containing a match query with our n-gram analyzed field name
and query value.
Here's the same query executed on Mirage.
Date Query
Let's now do a date query to get houses that are available between certain dates. As per our mapping (aka data schema), we'll need to use date_from
and date_to
fields for querying by the date range.
We'll use the /_search
endpoint from appbase.io REST API to fire a POST
request with the body containing a range query with our field name
and query values.
Here's the same query executed on Mirage.
Compound Query
Finally, let's do a compound query that combines multiple queries together. We'll take an example of fetching a specific room_type
of rooms that are within the specified price range.
We'll use the /_search
endpoint from appbase.io REST API to fire a POST
request with the body containing a bool query combining a match query for room_type
and a range query for price
.
Here's the same query executed on Mirage.
Further Reading
appbase.io REST API methods provide full Query DSL support and there are lots of use-cases that are unlocked by constructing various types of queries. Feel free to use our GUI query explorer to construct complex queries easily.
There are many more methods provided by the appbase.io REST API other than the ones we used. The full API reference with example snippets in cURL, Ruby, Python, Node, PHP, Go, jQuery can be browsed at rest.appbase.io.