@@ -114,16 +114,13 @@ class ObjectBoxEmbeddingDao(private val embeddingBox: Box<ObjectBoxEmbedding>) {
114114 similarityThreshold : Float = 0.7f,
115115 albumIds : List <Long >? = null
116116 ): List <ObjectWithScore <ObjectBoxEmbedding >> {
117- val query =
118- embeddingBox
119- .query()
120- .nearestNeighbors(ObjectBoxEmbedding_ .data, queryVector, topK)
121- .build()
122-
123- val results = query.findWithScores().filter { result ->
124- val cosineSimilarity = 1.0 - result.score
125- cosineSimilarity > similarityThreshold
126- }
117+ val results = searchNearestVectorsByScope(
118+ queryVector = queryVector,
119+ topK = topK,
120+ similarityThreshold = similarityThreshold,
121+ albumIds = albumIds,
122+ includeThreshold = false
123+ )
127124
128125 results.forEachIndexed { index, result ->
129126 Timber .d(" Result $index :" )
@@ -141,27 +138,57 @@ class ObjectBoxEmbeddingDao(private val embeddingBox: Box<ObjectBoxEmbedding>) {
141138 similarityThreshold : Float = 0.95f,
142139 albumIds : List <Long >? = null
143140 ): List <ObjectWithScore <ObjectBoxEmbedding >> {
144- val query =
145- embeddingBox
146- .query()
147- .nearestNeighbors(ObjectBoxEmbedding_ .data, queryVector, topK)
148- .build()
141+ val results = searchNearestVectorsByScope(
142+ queryVector = queryVector,
143+ topK = topK,
144+ similarityThreshold = similarityThreshold,
145+ albumIds = albumIds,
146+ includeThreshold = true
147+ ).onEach { result ->
148+ val cosineSimilarity = 1.0 - result.score
149149
150- val results = query.findWithScores()
151- .filter { result ->
150+ Timber .d(" Photo ID: ${result.get().photoId} " )
151+ Timber .d(" Score: ${result.score} " )
152+ Timber .d(" Cosine Similarity: $cosineSimilarity " )
153+ Timber .d(" Similarity Condition: ${cosineSimilarity >= similarityThreshold} " )
154+ }
152155
153- val cosineSimilarity = 1.0 - result.score
156+ Timber .d(" Filtered Results Count: ${results.size} " )
157+
158+ return results
159+ }
154160
155- Timber .d(" Photo ID: ${result.get().photoId} " )
156- Timber .d(" Score: ${result.score} " )
157- Timber .d(" Cosine Similarity: $cosineSimilarity " )
158- Timber .d(" Similarity Condition: ${cosineSimilarity >= similarityThreshold} " )
161+ private fun searchNearestVectorsByScope (
162+ queryVector : FloatArray ,
163+ topK : Int ,
164+ similarityThreshold : Float ,
165+ albumIds : List <Long >? ,
166+ includeThreshold : Boolean
167+ ): List <ObjectWithScore <ObjectBoxEmbedding >> {
168+ if (albumIds != null && albumIds.isEmpty()) {
169+ return emptyList()
170+ }
159171
160- cosineSimilarity >= similarityThreshold
161- }
172+ val queryBuilder = embeddingBox.query()
173+ if (albumIds != null ) {
174+ queryBuilder.`in `(ObjectBoxEmbedding_ .albumId, albumIds.toLongArray())
175+ }
162176
163- Timber .d(" Filtered Results Count: ${results.size} " )
177+ val query = queryBuilder
178+ .nearestNeighbors(ObjectBoxEmbedding_ .data, queryVector, topK)
179+ .build()
164180
165- return results
181+ return try {
182+ query.findWithScores().filter { result ->
183+ val cosineSimilarity = 1.0 - result.score
184+ if (includeThreshold) {
185+ cosineSimilarity >= similarityThreshold
186+ } else {
187+ cosineSimilarity > similarityThreshold
188+ }
189+ }
190+ } finally {
191+ query.close()
192+ }
166193 }
167194}
0 commit comments