elasticsearchを使ったアプリでテストを書くとき別にあげたelasticsearch使ってたんですが
組み込みの(embedded)使うと便利だよ!という話です
普通に使うだけならサンプル見ながらやればできたんですが
日本でelasticsearchを使う場合だいたいkuromojiとかのpluginを使うと思います。
path.plugins指定すればできるという記事を見つけて試してみたんですが、最新(5.x)のelasticsearchだとエラーになりました。。
Cause: java.lang.IllegalArgumentException: unknown setting [path.plugins] please check that any required plugins are installed, or check the breaking changes documentation for removed settings
どうやらpath.pluginsはなくなったようです。
https://www.elastic.co/guide/en/elasticsearch/reference/current/zip-targz.html#zip-targz-layout
pluginsのDefault Locationが$ES_HOME/pluginsということなので素直にそこにおきましょう。
val clusterName = "artists"
val homePath = "./home"
val settings = Map(
"cluster.name" -> clusterName,
"path.home" -> homePath,
"path.repo" -> Paths.get(homePath).resolve("repo").toString,
"path.data" -> Paths.get(homePath).resolve("data").toString
)
val localNode = LocalNode(settings)
ここでHOMEを./homeにしたので./home/pluginsの下にkuromojiを保存する必要があります。
次にmappingの準備です。
kuromojiのTokenizerはデフォルトでないのでこの辺りのコードをみながら作ってみます。
case object KuromojiTokenizer extends Tokenizer("kuromoji_tokenizer")
case class KuromojiTokenizer(override val name: String) extends CustomizedTokenizer(name) {
override def build(source: XContentBuilder): Unit = {
source.field("type", "kuromoji_tokenizer")
}
}
という訳でmappingはこのようになります
client.execute {
createIndex("bands").mappings(
mapping("artist") as(
textField("name"),
textField("description") analyzer "my_analyzer"
)
)
.analysis(
CustomAnalyzerDefinition(
"my_analyzer",
KuromojiTokenizer
)
)
}.await
あとは適当なデータを突っ込んでみて
client.execute {
indexInto("bands" / "artists") doc Artist("山田太郎", "東京で活躍していたアーティストです") refresh(RefreshPolicy.IMMEDIATE)
}.await
queryを投げてみます
val resp = client.execute {
search("bands" / "artists") query termQuery("description", "東京")
}.await
完成品はこちらになります