/elasticsearch4s

Scala client and code generator for Elasticsearch

Primary LanguageScalaApache License 2.0Apache-2.0

elasticsearch4s Build Status

Scala client and code generator for Elasticsearch

How to use

Add a following dependency into your build.sbt at first.

libraryDependencies += "jp.co.bizreach" %% "elasticsearch4s" % "0.0.11"

You can access Elasticsearch via REST API as following:

case class Tweet(name: String, message: String)

import jp.co.bizreach.elasticsearch4s._

ESClient.using("http://localhost:9200"){ client =>
  val config = ESConfig("twitter", "tweet")

  // Insert
  client.insert(config, Tweet("takezoe", "Hello World!!"))
  client.insertJson(config, """{name: "takezoe", message: "Hello World!!"}""")
  
  // Update
  client.update(config, "1", Tweet("takezoe", "Hello Scala!!"))
  client.updateJson(config, "1", """{name: "takezoe", message: "Hello World!!"}""")

  // Delete
  client.delete(config, "1")

  // Find one document
  val tweet: Option[(String, Tweet)] = client.find[Tweet](config){ seacher =>
    seacher.setQuery(QueryBuilders.termQuery("_id", "1"))
  }

  // Search documents
  val list: List[ESSearchResult] = client.list[Tweet](config){ seacher =>
    seacher.setQuery(QueryBuilders.termQuery("name", "takezoe"))
  }
}

elasticsearch4s is a wrapper of Elasticsearch Java API. Therefore see its document to know details, especially how to build query.

Code Generator

elasticsearch4s-gen can generate source code from Elasticsearch schema json file.

At first, add following setting into project/plugins.sbt:

addSbtPlugin("jp.co.bizreach" % "elasticsearch4s-gen" % "0.0.6")

Then put Elasticsearch schema json file as PROJECT_ROOT/schema.json and execute sbt es-gen. Source code will be generated into src/main/scala/models.

You can configure generation settings in PROJECT_ROOT/es-gen.conf. Here is a configuration example:

# package name
es-gen.package.name=models
# schema definition files
es-gen.json.files=[
  "./schema/book_master.json",
  "./schema/book_search.json"
]
# map same index name to different classes
es-gen.class.mappings=[
  "book_master.json#book:BookMaster",
  "book_search.json#book:BookSearch"
]
# map unknown type
es-gen.type.mappings=[
  "minhash:String"
]
# specify array properties
es-gen.array.properties=[
  "BookMaster.author",
  "BookSearch.author"
]
# specify ignore properties
es-gen.ignore.properties=[
  "internalCode"
]

See ESCodegenConfig.scala to know configuration details.