Using ElasticSearch in Golang API: Writing a SearchQuery Structure for HTTP Requests

Kacper Bąk
3 min readFeb 16, 2023

--

Photo by Warren Wong on Unsplash

ElasticSearch is a powerful search engine that is used to index and search large amounts of data in real time. It is often used in applications that require fast and efficient search capabilities, such as e-commerce websites, social media platforms, and news portals. In this article, we will explore how to use ElasticSearch in a Golang API by writing a SearchQuery structure that allows us to perform search queries via HTTP requests.

Using ElasticSearch in Golang API

To use ElasticSearch in a Golang API, we first need to set up an ElasticSearch client. There are several Golang libraries that can be used for this purpose, such as “github.com/elastic/go-elasticsearch” and “github.com/olivere/elastic”. For the purpose of this article, we will be using “github.com/elastic/go-elasticsearch”.

After setting up the ElasticSearch client, we can define a structure for our search query. This structure will allow us to specify the search parameters, such as the query string, the fields to search in, and the sorting criteria.

Here is an example of a SearchQuery structure:

type SearchQuery struct {
QueryString string
SearchFields []string
SortField string
SortOrder string
}

The QueryString field specifies the search query, which can be a simple string or a more complex query using the ElasticSearch Query DSL. The SearchFields field is a list of fields to search in, and the SortField and SortOrder fields specify the field and order to sort the results by.

Performing a Search Query via HTTP Request

Once we have defined our SearchQuery structure, we can use it to perform a search query via an HTTP request. Here is an example of a Golang API endpoint that accepts a SearchQuery via an HTTP POST request and returns the search results as a JSON response:

func searchHandler(w http.ResponseWriter, r *http.Request) {
decoder := json.NewDecoder(r.Body)
var query SearchQuery
err := decoder.Decode(&query)
if err != nil {
http.Error(w, "Invalid request body", http.StatusBadRequest)
return
}

esQuery := elastic.NewBoolQuery()
for _, field := range query.SearchFields {
esQuery = esQuery.Should(elastic.NewMatchQuery(field, query.QueryString))
}

sortField := query.SortField
sortOrder := elastic.SortOrder(query.SortOrder)

res, err := esClient.Search(
esClient.Search.WithQuery(esQuery),
esClient.Search.WithSort(sortField, sortOrder),
)
if err != nil {
http.Error(w, "Internal server error", http.StatusInternalServerError)
return
}

var hits []map[string]interface{}
for _, hit := range res.Hits.Hits {
var source map[string]interface{}
err := json.Unmarshal(hit.Source, &source)
if err != nil {
continue
}
hits = append(hits, source)
}

json.NewEncoder(w).Encode(hits)
}

In this example, we first decode the SearchQuery from the HTTP request body. We then use the ElasticSearch client to build a search query based on the search parameters specified in the SearchQuery. We also specify the sorting criteria using the SortField and SortOrder fields.

Finally, we execute the search query and extract the search results from the response. We then encode the search results as a JSON response and return it to the client.

Conclusion

In conclusion, ElasticSearch is a powerful search engine that can greatly enhance the search capabilities of a Golang API. By using an ElasticSearch client and defining a SearchQuery structure, we can perform search queries via HTTP requests and return the search results to the client. This allows us to build applications with fast and efficient search capabilities, which is crucial for many types of applications, such as e-commerce websites, social media platforms, and news portals. With the knowledge provided in this article, developers can implement ElasticSearch into their Golang APIs and take advantage of its powerful search features.

--

--