@@ -78,6 +78,25 @@ internal fun List<SimilarityResult<out Retrievable>>.withNeighbours(
7878 return this + extra
7979}
8080
81+ @Suppress(" UNCHECKED_CAST" )
82+ internal fun <T : Retrievable > VectorSearch.vectorSearchWithFilter (
83+ request : TextSimilaritySearchRequest ,
84+ clazz : Class <T >,
85+ metadataFilter : PropertyFilter ? ,
86+ entityFilter : EntityFilter ? ,
87+ ): List <SimilarityResult <T >> = when {
88+ metadataFilter == null && entityFilter == null -> vectorSearch(request, clazz)
89+ this is FilteringVectorSearch -> vectorSearchWithFilter(request, clazz, metadataFilter, entityFilter)
90+ else -> PostFilteringSearch .search(
91+ request,
92+ metadataFilter,
93+ entityFilter,
94+ TopKInflationStrategy .DEFAULT ,
95+ ) { inflatedRequest ->
96+ vectorSearch(inflatedRequest, clazz)
97+ } as List <SimilarityResult <T >>
98+ }
99+
81100internal class VectorSearchTools @JvmOverloads constructor(
82101 private val vectorSearch : VectorSearch ,
83102 private val searchFor : List <Class <out Retrievable >> = listOf(Chunk ::class.java),
@@ -119,36 +138,10 @@ internal class VectorSearchTools @JvmOverloads constructor(
119138
120139 private fun searchForAllTypes (request : TextSimilaritySearchRequest ): List <SimilarityResult <out Retrievable >> {
121140 val allResults = searchFor.flatMap { clazz ->
122- searchWithFilter (request, clazz)
141+ vectorSearch.vectorSearchWithFilter (request, clazz, metadataFilter, entityFilter )
123142 }
124143 return deduplicateByIdKeepingHighestScore(allResults)
125144 }
126-
127- @Suppress(" UNCHECKED_CAST" )
128- private fun <T : Retrievable > searchWithFilter (
129- request : TextSimilaritySearchRequest ,
130- clazz : Class <T >,
131- ): List <SimilarityResult <T >> {
132- if (metadataFilter == null && entityFilter == null ) {
133- return vectorSearch.vectorSearch(request, clazz)
134- }
135-
136- // If backend supports native filtering, use it
137- if (vectorSearch is FilteringVectorSearch ) {
138- return vectorSearch.vectorSearchWithFilter(request, clazz, metadataFilter, entityFilter)
139- }
140-
141- // Fallback: inflate topK, search, post-filter, take topK
142- // Note: PostFilteringSearch requires Datum constraint, so we cast
143- return PostFilteringSearch .search(
144- request,
145- metadataFilter,
146- entityFilter,
147- TopKInflationStrategy .DEFAULT
148- ) { inflatedRequest ->
149- vectorSearch.vectorSearch(inflatedRequest, clazz)
150- } as List <SimilarityResult <T >>
151- }
152145}
153146
154147/* *
@@ -378,6 +371,25 @@ internal class SectionReadingTools @JvmOverloads constructor(
378371 }
379372}
380373
374+ @Suppress(" UNCHECKED_CAST" )
375+ internal fun <T : Retrievable > TextSearch.textSearchWithFilter (
376+ request : TextSimilaritySearchRequest ,
377+ clazz : Class <T >,
378+ metadataFilter : PropertyFilter ? ,
379+ entityFilter : EntityFilter ? ,
380+ ): List <SimilarityResult <T >> = when {
381+ metadataFilter == null && entityFilter == null -> textSearch(request, clazz)
382+ this is FilteringTextSearch -> textSearchWithFilter(request, clazz, metadataFilter, entityFilter)
383+ else -> PostFilteringSearch .search(
384+ request,
385+ metadataFilter,
386+ entityFilter,
387+ TopKInflationStrategy .DEFAULT ,
388+ ) { inflatedRequest ->
389+ textSearch(inflatedRequest, clazz)
390+ } as List <SimilarityResult <T >>
391+ }
392+
381393/* *
382394 * Tools to perform text search operations with the syntax supported by
383395 * the backing [TextSearch] store.
@@ -478,36 +490,11 @@ internal class TextSearchTools @JvmOverloads constructor(
478490
479491 private fun searchForAllTypes (request : TextSimilaritySearchRequest ): List <SimilarityResult <out Retrievable >> {
480492 val allResults = searchFor.flatMap { clazz ->
481- searchWithFilter (request, clazz)
493+ textSearch.textSearchWithFilter (request, clazz, metadataFilter, entityFilter )
482494 }
483495 return deduplicateByIdKeepingHighestScore(allResults)
484496 }
485497
486- @Suppress(" UNCHECKED_CAST" )
487- private fun <T : Retrievable > searchWithFilter (
488- request : TextSimilaritySearchRequest ,
489- clazz : Class <T >,
490- ): List <SimilarityResult <T >> {
491- if (metadataFilter == null && entityFilter == null ) {
492- return textSearch.textSearch(request, clazz)
493- }
494-
495- // If backend supports native filtering, use it
496- if (textSearch is FilteringTextSearch ) {
497- return textSearch.textSearchWithFilter(request, clazz, metadataFilter, entityFilter)
498- }
499-
500- // Fallback: inflate topK, search, post-filter, take topK
501- return PostFilteringSearch .search(
502- request,
503- metadataFilter,
504- entityFilter,
505- TopKInflationStrategy .DEFAULT
506- ) { inflatedRequest ->
507- textSearch.textSearch(inflatedRequest, clazz)
508- } as List <SimilarityResult <T >>
509- }
510-
511498 companion object {
512499 /* *
513500 * Compose the tool's top-level description from the store's
0 commit comments