Skip to content

Commit

Permalink
Add semantic query
Browse files Browse the repository at this point in the history
  • Loading branch information
Philippus committed Aug 22, 2024
1 parent f436fa1 commit 74adf3a
Show file tree
Hide file tree
Showing 6 changed files with 46 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import com.sksamuel.elastic4s.requests.searches.queries.compound.BoolQuery
import com.sksamuel.elastic4s.requests.searches.queries.funcscorer.FunctionScoreQuery
import com.sksamuel.elastic4s.requests.searches.queries.geo.{GeoBoundingBoxQuery, GeoDistanceQuery, GeoPolygonQuery, GeoShapeQuery, Shape}
import com.sksamuel.elastic4s.requests.searches.queries.matches.{MatchAllQuery, MatchBoolPrefixQuery, MatchNoneQuery, MatchPhrasePrefixQuery, MatchPhraseQuery, MatchQuery, MultiMatchQuery}
import com.sksamuel.elastic4s.requests.searches.queries.{ArtificialDocument, BoostingQuery, CombinedFieldsQuery, ConstantScore, DisMaxQuery, DistanceFeatureQuery, ExistsQuery, FuzzyQuery, HasChildQuery, HasParentQuery, IdQuery, IntervalsQuery, IntervalsRule, MoreLikeThisItem, MoreLikeThisQuery, MultiTermQuery, NestedQuery, PercolateQuery, PinnedQuery, PrefixQuery, Query, QueryStringQuery, RangeQuery, RankFeatureQuery, RawQuery, RegexQuery, ScriptQuery, ScriptScoreQuery, SimpleStringQuery, SparseVectorQuery}
import com.sksamuel.elastic4s.requests.searches.queries.{ArtificialDocument, BoostingQuery, CombinedFieldsQuery, ConstantScore, DisMaxQuery, DistanceFeatureQuery, ExistsQuery, FuzzyQuery, HasChildQuery, HasParentQuery, IdQuery, IntervalsQuery, IntervalsRule, MoreLikeThisItem, MoreLikeThisQuery, MultiTermQuery, NestedQuery, PercolateQuery, PinnedQuery, PrefixQuery, Query, QueryStringQuery, RangeQuery, RankFeatureQuery, RawQuery, RegexQuery, ScriptQuery, ScriptScoreQuery, SemanticQuery, SimpleStringQuery, SparseVectorQuery}
import com.sksamuel.elastic4s.requests.searches.span.{SpanContainingQuery, SpanFieldMaskingQuery, SpanFirstQuery, SpanMultiTermQuery, SpanNearQuery, SpanNotQuery, SpanOrQuery, SpanQuery, SpanTermQuery, SpanWithinQuery}
import com.sksamuel.elastic4s.requests.searches.term.{TermQuery, TermsLookupQuery, TermsQuery, TermsSetQuery, WildcardQuery}
import com.sksamuel.elastic4s.requests.searches.{GeoPoint, ScoreMode, TermsLookup, span, term}
Expand Down Expand Up @@ -275,4 +275,7 @@ trait QueryApi {

def sparseVectorQuery(field: String, queryVector: Map[String, Double]): SparseVectorQuery =
SparseVectorQuery(field, queryVector = queryVector)

def semanticQuery(field: String, query: String): SemanticQuery =
SemanticQuery(field, query)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.sksamuel.elastic4s.requests.searches.queries

import com.sksamuel.elastic4s.JsonSugar
import com.sksamuel.elastic4s.api.QueryApi
import com.sksamuel.elastic4s.handlers.searches.queries.{SemanticQueryBuilderFn, SparseVectorQueryBuilderFn}
import org.scalatest.funsuite.AnyFunSuite
import org.scalatest.matchers.should.Matchers

class SemanticQueryBuilderFnTest extends AnyFunSuite with QueryApi with Matchers with JsonSugar {
test("Should correctly build semantic query") {
val query = SemanticQuery("test", "my_query")

val queryBody = SemanticQueryBuilderFn(query)

queryBody.string shouldBe """{"semantic":{"field":"test","query":"my_query"}}"""
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package com.sksamuel.elastic4s.requests.searches.queries

case class SemanticQuery(field: String, query: String) extends Query
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import com.sksamuel.elastic4s.requests.searches.queries.compound.BoolQuery
import com.sksamuel.elastic4s.requests.searches.queries.funcscorer.FunctionScoreQuery
import com.sksamuel.elastic4s.requests.searches.queries.geo.{GeoBoundingBoxQuery, GeoDistanceQuery, GeoPolygonQuery, GeoShapeQuery}
import com.sksamuel.elastic4s.requests.searches.queries.matches.{MatchAllQuery, MatchBoolPrefixQuery, MatchNoneQuery, MatchPhrasePrefixQuery, MatchPhraseQuery, MatchQuery, MultiMatchQuery}
import com.sksamuel.elastic4s.requests.searches.queries.{BoostingQuery, CombinedFieldsQuery, ConstantScore, CustomQuery, DisMaxQuery, DistanceFeatureQuery, ExistsQuery, FuzzyQuery, HasChildQuery, HasParentQuery, IdQuery, IntervalsQuery, MoreLikeThisQuery, NestedQuery, NoopQuery, ParentIdQuery, PercolateQuery, PinnedQuery, PrefixQuery, Query, QueryStringQuery, RangeQuery, RankFeatureQuery, RawQuery, RegexQuery, ScriptQuery, ScriptScoreQuery, SimpleStringQuery, SparseVectorQuery}
import com.sksamuel.elastic4s.requests.searches.queries.{BoostingQuery, CombinedFieldsQuery, ConstantScore, CustomQuery, DisMaxQuery, DistanceFeatureQuery, ExistsQuery, FuzzyQuery, HasChildQuery, HasParentQuery, IdQuery, IntervalsQuery, MoreLikeThisQuery, NestedQuery, NoopQuery, ParentIdQuery, PercolateQuery, PinnedQuery, PrefixQuery, Query, QueryStringQuery, RangeQuery, RankFeatureQuery, RawQuery, RegexQuery, ScriptQuery, ScriptScoreQuery, SemanticQuery, SimpleStringQuery, SparseVectorQuery}
import com.sksamuel.elastic4s.requests.searches.span.{SpanContainingQuery, SpanFieldMaskingQuery, SpanFirstQuery, SpanMultiTermQuery, SpanNearQuery, SpanNotQuery, SpanOrQuery, SpanTermQuery, SpanWithinQuery}
import com.sksamuel.elastic4s.requests.searches.term.{TermQuery, TermsLookupQuery, TermsQuery, TermsSetQuery, WildcardQuery}

Expand Down Expand Up @@ -56,6 +56,7 @@ object QueryBuilderFn {
case q: RegexQuery => RegexQueryBodyFn(q)
case q: ScriptQuery => ScriptQueryBodyFn(q)
case q: ScriptScoreQuery => ScriptScoreQueryBodyFn(q)
case q: SemanticQuery => SemanticQueryBuilderFn(q)
case s: SimpleStringQuery => SimpleStringBodyFn(s)
case s: SpanContainingQuery => SpanContainingQueryBodyFn(s)
case s: SpanFirstQuery => SpanFirstQueryBodyFn(s)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.sksamuel.elastic4s.handlers.searches.queries

import com.sksamuel.elastic4s.json.{XContentBuilder, XContentFactory}
import com.sksamuel.elastic4s.requests.searches.queries.SemanticQuery

object SemanticQueryBuilderFn {
def apply(q: SemanticQuery): XContentBuilder = {
val builder = XContentFactory.jsonBuilder()
builder.startObject("semantic")
builder.field("field", q.field)
builder.field("query", q.query)
builder.endObject()
builder
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -976,4 +976,9 @@ class SearchDslTest extends AnyFlatSpec with MockitoSugar with JsonSugar with On
val req = search("index").query(sparseVectorQuery("test", Map("a" -> 0.3D)))
req.request.entity.get.get should matchJson("""{"query":{"sparse_vector":{"field":"test", "query_vector":{"a":0.3}}}}""")
}

it should "generate json for semantic query" in {
val req = search("index").query(semanticQuery("test", "my_query"))
req.request.entity.get.get should matchJson("""{"query":{"semantic":{"field":"test", "query":"my_query"}}}""")
}
}

0 comments on commit 74adf3a

Please sign in to comment.