Skip to content

Commit

Permalink
Feat: add support for analyzers in annotated_text fields (#2654)
Browse files Browse the repository at this point in the history
* feat: add support for analyzers in annotated_text fields

* fix tests
  • Loading branch information
Jacksonfern authored Apr 17, 2022
1 parent 7d028c4 commit 770208c
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,16 @@ package com.sksamuel.elastic4s.fields
object AnnotatedTextField {
val `type` = "annotated_text"
}
case class AnnotatedTextField(name: String, copyTo: Seq[String] = Nil) extends ElasticField {
case class AnnotatedTextField(name: String,
analyzer: Option[String] = None,
searchAnalyzer: Option[String] = None,
searchQuoteAnalyzer: Option[String] = None,
copyTo: Seq[String] = Nil) extends ElasticField {
override def `type`: String = AnnotatedTextField.`type`

def analyzer(name: String): AnnotatedTextField = copy(analyzer = Option(name))

def searchAnalyzer(name: String): AnnotatedTextField = copy(searchAnalyzer = Option(name))

def searchQuoteAnalyzer(name: String): AnnotatedTextField = copy(searchQuoteAnalyzer = Option(name))
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,21 @@ import com.sksamuel.elastic4s.json.{XContentBuilder, XContentFactory}
object AnnotatedTextFieldBuilderFn {
def toField(name: String, values: Map[String, Any]): AnnotatedTextField = AnnotatedTextField(
name,
values.get("analyzer").map(_.asInstanceOf[String]),
values.get("search_analyzer").map(_.asInstanceOf[String]),
values.get("search_quote_analyzer").map(_.asInstanceOf[String]),
values.get("copy_to").map(_.asInstanceOf[Seq[String]]).getOrElse(Seq.empty)
)

def build(field: AnnotatedTextField): XContentBuilder = {

val builder = XContentFactory.jsonBuilder()
builder.field("type", field.`type`)

field.analyzer.foreach(builder.field("analyzer", _))
field.searchAnalyzer.foreach(builder.field("search_analyzer", _))
field.searchQuoteAnalyzer.foreach(builder.field("search_quote_analyzer", _))

if (field.copyTo.nonEmpty) builder.array("copy_to", field.copyTo.toArray)
builder.endObject()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,21 @@ class ElasticFieldBuilderFnTest extends AnyWordSpec with Matchers {

}

"support AnnotatedTextField analyzers" in {
val field = AnnotatedTextField("annotatedText",
analyzer = Some("standard"),
searchAnalyzer = Some("standard"),
searchQuoteAnalyzer = Some("standard"))
val jsonString = """{"type":"annotated_text","analyzer":"standard","search_analyzer":"standard","search_quote_analyzer":"standard"}"""

ElasticFieldBuilderFn(field).string() shouldBe(jsonString)
ElasticFieldBuilderFn.construct(field.name, JacksonSupport.mapper.readValue[Map[String, Any]](jsonString)) shouldBe(field)

val fieldSet = AnnotatedTextField("annotatedText").analyzer("standard").searchAnalyzer("standard").searchQuoteAnalyzer("standard")
ElasticFieldBuilderFn(fieldSet).string() shouldBe(jsonString)
ElasticFieldBuilderFn.construct(fieldSet.name, JacksonSupport.mapper.readValue[Map[String, Any]](jsonString)) shouldBe(fieldSet)
}

}

}

0 comments on commit 770208c

Please sign in to comment.