Querying an Elasticsearch Server using Scala

Last updated:

Assuming you are using [Typesafe Activator][1] to manage your apps, create a simple project based upon the minimal-scala template.

We'll be using [elastic4s][2], which is but one way to connect to elasticsearch using Scala. There are other libraries around and you can also use raw HTTP requests.

Add

libraryDependencies += "com.sksamuel.elastic4s" %% "elastic4s" % "1.2.1.2"

to build.sbt and compile:

~/path/to/your/project$ sbt compile

Example 1: using Thread.sleep()

package com.example

// the query dsl
import com.sksamuel.elastic4s.ElasticClient
import com.sksamuel.elastic4s.ElasticDsl._

// elasticsearch stuff
import org.elasticsearch.action.search.SearchResponse

// scala concurrency stuff
import scala.concurrent._
import scala.concurrent.duration._
import ExecutionContext.Implicits.global
import scala.util.{Success, Failure}

object Hello {
    def main(args: Array[String]): Unit = {
       // scala uses the java driver which listens on port 9300
       val client = ElasticClient.remote("url.of.your.es.server", 9300)

       val res:Future[SearchResponse] = client execute { search in "index_name/type_name" query "your_query" }

        res onComplete{
            case Success(s) => println(s)
            case Failure(t) => println("An error has occured: " + t)
        }

        println("Request sent")

        //adjust this if needed
        Thread.sleep(1000)
    }
}

HEADS-UP

You may also want to have a look at Elastic4s DSL Examples and Reference.

Example 2: using Await.result()

package com.example

import com.sksamuel.elastic4s.ElasticClient
import com.sksamuel.elastic4s.ElasticDsl._
import org.elasticsearch.action.search.SearchResponse
import scala.concurrent._
import scala.concurrent.duration._
import ExecutionContext.Implicits.global
import scala.util.{ Success, Failure }
object Hello {
    def main(args: Array[String]) {
        val client = ElasticClient.remote("url.of.your.es.server", 9300)
        val res:Future[SearchResponse] = client execute { search in "index_name/type_name" query "your_query" }

        println("REQUEST SENT")

        val await = Await.result(res, 10.seconds)
        println(await)
    }
}

P.S.:

Since JSON is the lingua franca for Elasticsearch, you may want to have a look at some examples on how to use the json plugin for Play.

[1]: https://typesafe.com/activator [2]: https://github.com/sksamuel/elastic4s

Dialogue & Discussion