Skip to content

Commit

Permalink
Add semantic text field type (#3141)
Browse files Browse the repository at this point in the history
* Add semantic text field type

* Remove comment
  • Loading branch information
Philippus authored Aug 22, 2024
1 parent 1155e58 commit f436fa1
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.sksamuel.elastic4s.fields

object SemanticTextField {
val `type`: String = "semantic_text"
}
case class SemanticTextField(override val name: String, inferenceId: String) extends ElasticField {
override def `type`: String = SemanticTextField.`type`
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.sksamuel.elastic4s.handlers.fields

import com.sksamuel.elastic4s.fields.{AggregateMetricField, AliasField, AnnotatedTextField, BinaryField, BooleanField, CompletionField, ConstantKeywordField, DateField, DateNanosField, DenseVectorField, DynamicField, ElasticField, FlattenedField, GeoPointField, GeoShapeField, HistogramField, IcuCollationKeywordField, IpField, IpRangeField, JoinField, KeywordField, MatchOnlyTextField, Murmur3Field, NestedField, NumberField, ObjectField, PercolatorField, RangeField, RankFeatureField, RankFeaturesField, SearchAsYouTypeField, SparseVectorField, TextField, TokenCountField, VersionField, WildcardField}
import com.sksamuel.elastic4s.fields.{AggregateMetricField, AliasField, AnnotatedTextField, BinaryField, BooleanField, CompletionField, ConstantKeywordField, DateField, DateNanosField, DenseVectorField, DynamicField, ElasticField, FlattenedField, GeoPointField, GeoShapeField, HistogramField, IcuCollationKeywordField, IpField, IpRangeField, JoinField, KeywordField, MatchOnlyTextField, Murmur3Field, NestedField, NumberField, ObjectField, PercolatorField, RangeField, RankFeatureField, RankFeaturesField, SearchAsYouTypeField, SemanticTextField, SparseVectorField, TextField, TokenCountField, VersionField, WildcardField}
import com.sksamuel.elastic4s.json.XContentBuilder

object ElasticFieldBuilderFn {
Expand Down Expand Up @@ -36,6 +36,7 @@ object ElasticFieldBuilderFn {
case f: RangeField => RangeFieldBuilderFn.build(f)
case f: RankFeatureField => RankFeatureFieldBuilderFn.build(f)
case f: RankFeaturesField => RankFeaturesFieldBuilderFn.build(f)
case f: SemanticTextField => SemanticTextFieldBuilderFn.build(f)
case f: SearchAsYouTypeField => SearchAsYouTypeFieldBuilderFn.build(f)
case f: SparseVectorField => SparseVectorFieldBuilderFn.build(f)
case f: TextField => TextFieldBuilderFn.build(f)
Expand All @@ -52,7 +53,7 @@ object ElasticFieldBuilderFn {
case AnnotatedTextField.`type` => AnnotatedTextFieldBuilderFn.toField(name, values)
case BinaryField.`type` => BinaryFieldBuilderFn.toField(name, values)
case BooleanField.`type` => BooleanFieldBuilderFn.toField(name, values)
case ConstantKeywordField.`type` => ConstantKeywordFieldBuilderFn.toField(name, values) // *
case ConstantKeywordField.`type` => ConstantKeywordFieldBuilderFn.toField(name, values)
case CompletionField.`type` => CompletionFieldBuilderFn.toField(name, values)
case DateField.`type` => DateFieldBuilderFn.toField(name, values)
case DateNanosField.`type` => DateNanosFieldBuilderFn.toField(name, values)
Expand All @@ -72,6 +73,7 @@ object ElasticFieldBuilderFn {
case PercolatorField.`type` => PercolatorFieldBuilderFn.toField(name, values)
case RankFeatureField.`type` => RankFeatureFieldBuilderFn.toField(name, values)
case RankFeaturesField.`type` => RankFeaturesFieldBuilderFn.toField(name, values)
case SemanticTextField.`type` => SemanticTextFieldBuilderFn.toField(name, values)
case SearchAsYouTypeField.`type` => SearchAsYouTypeFieldBuilderFn.toField(name, values)
case SparseVectorField.`type` => SparseVectorFieldBuilderFn.toField(name, values)
case TextField.`type` => TextFieldBuilderFn.toField(name, values)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.sksamuel.elastic4s.handlers.fields

import com.sksamuel.elastic4s.fields.SemanticTextField
import com.sksamuel.elastic4s.json.{XContentBuilder, XContentFactory}

object SemanticTextFieldBuilderFn {
def toField(name: String, values: Map[String, Any]): SemanticTextField = SemanticTextField(
name,
values.get("inference_id").map(_.asInstanceOf[String]).get
)

def build(field: SemanticTextField): XContentBuilder = {
val builder = XContentFactory.jsonBuilder()
builder.field("type", field.`type`)
builder.field("inference_id", field.inferenceId)
builder.endObject()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -145,5 +145,11 @@ class ElasticFieldBuilderFnTest extends AnyWordSpec with Matchers {
ElasticFieldBuilderFn(field).string shouldBe jsonString
ElasticFieldBuilderFn.construct(field.name, JacksonSupport.mapper.readValue[Map[String, Any]](jsonString)) shouldBe field
}
"support SemanticTextField" in {
val field = SemanticTextField("semantic_text_field", "my-elser-endpoint")
val jsonString = """{"type":"semantic_text","inference_id":"my-elser-endpoint"}"""
ElasticFieldBuilderFn(field).string shouldBe jsonString
ElasticFieldBuilderFn.construct(field.name, JacksonSupport.mapper.readValue[Map[String, Any]](jsonString)) shouldBe field
}
}
}

0 comments on commit f436fa1

Please sign in to comment.