Skip to content

Commit f4ed9ce

Browse files
committed
feat: ES 연결실패해도 서버뜨도록 수정
1 parent 59e1844 commit f4ed9ce

File tree

3 files changed

+101
-6
lines changed

3 files changed

+101
-6
lines changed

src/main/kotlin/org/gitanimals/quiz/infra/similarity/EsKnnTextSimilarityChecker.kt

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,17 @@ class EsKnnTextSimilarityChecker(
2929
it.numCandidates(MAX_RETURN_KNN_SIZE * 5)
3030
}.build()
3131

32-
val searchHits = elasticSearchOperations.search(knnQuery, QuizSimilarity::class.java)
33-
34-
return SimilarityResponse(
35-
searchHits.searchHits.map { it.content.quizId }
36-
)
32+
return runCatching {
33+
elasticSearchOperations.search(knnQuery, QuizSimilarity::class.java)
34+
}.onFailure {
35+
logger.warn("[EsKnnTextSimilarityChecker] Elasticsearch similarity search failed. return empty result.", it)
36+
}.map { searchHits ->
37+
SimilarityResponse(
38+
searchHits.searchHits.map { it.content.quizId }
39+
)
40+
}.getOrElse {
41+
SimilarityResponse(emptyList())
42+
}
3743
}
3844

3945
companion object {

src/main/kotlin/org/gitanimals/quiz/infra/similarity/QuizSimilarity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import org.springframework.data.elasticsearch.annotations.FieldType
88

99
private const val OPEN_AI_SMALL_DIMS = 1536
1010

11-
@Document(indexName = "quiz_similarity", createIndex = true)
11+
@Document(indexName = "quiz_similarity", createIndex = false)
1212
class QuizSimilarity(
1313
@Id
1414
val id: Long,
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package org.gitanimals.quiz.infra.similarity
2+
3+
import io.kotest.core.spec.style.DescribeSpec
4+
import io.kotest.matchers.shouldBe
5+
import io.mockk.every
6+
import io.mockk.mockk
7+
import org.springframework.data.elasticsearch.client.elc.NativeQuery
8+
import org.springframework.data.elasticsearch.core.ElasticsearchOperations
9+
import org.springframework.data.elasticsearch.core.SearchHit
10+
import org.springframework.data.elasticsearch.core.SearchHits
11+
12+
internal class EsKnnTextSimilarityCheckerTest : DescribeSpec({
13+
14+
describe("getSimilarity 메소드는") {
15+
context("Elasticsearch 조회에 성공하면") {
16+
val elasticSearchOperations = mockk<ElasticsearchOperations>()
17+
val tokenizer = mockk<Tokenizer>()
18+
val checker = EsKnnTextSimilarityChecker(elasticSearchOperations, tokenizer)
19+
val quizSimilarity = QuizSimilarity(
20+
id = 1L,
21+
quizId = 10L,
22+
vector = listOf(0.1f, 0.2f),
23+
)
24+
val searchHits = mockk<SearchHits<QuizSimilarity>>()
25+
26+
every { tokenizer.embed(any()) } returns embeddingResponse()
27+
every {
28+
elasticSearchOperations.search(any<NativeQuery>(), QuizSimilarity::class.java)
29+
} returns searchHits
30+
every { searchHits.searchHits } returns listOf(
31+
SearchHit(
32+
null,
33+
null,
34+
null,
35+
1.0f,
36+
null,
37+
null,
38+
null,
39+
null,
40+
null,
41+
null,
42+
quizSimilarity,
43+
)
44+
)
45+
46+
it("유사한 퀴즈 아이디를 반환한다.") {
47+
val result = checker.getSimilarity("quiz")
48+
49+
result.similarityQuizIds shouldBe listOf(10L)
50+
}
51+
}
52+
53+
context("Elasticsearch 조회에 실패하면") {
54+
val elasticSearchOperations = mockk<ElasticsearchOperations>()
55+
val tokenizer = mockk<Tokenizer>()
56+
val checker = EsKnnTextSimilarityChecker(elasticSearchOperations, tokenizer)
57+
58+
every { tokenizer.embed(any()) } returns embeddingResponse()
59+
every {
60+
elasticSearchOperations.search(any<NativeQuery>(), QuizSimilarity::class.java)
61+
} throws IllegalStateException("Elastic down")
62+
63+
it("빈 결과를 반환한다.") {
64+
val result = checker.getSimilarity("quiz")
65+
66+
result.similarityQuizIds shouldBe emptyList()
67+
}
68+
}
69+
}
70+
}) {
71+
72+
companion object {
73+
private fun embeddingResponse(): Tokenizer.Response {
74+
return Tokenizer.Response(
75+
usage = Tokenizer.Response.Usage(
76+
promptToken = 1,
77+
totalToken = 1,
78+
),
79+
model = "text-embedding-3-small",
80+
data = listOf(
81+
Tokenizer.Response.Data(
82+
`object` = "embedding",
83+
embedding = listOf(0.1f, 0.2f),
84+
)
85+
),
86+
)
87+
}
88+
}
89+
}

0 commit comments

Comments
 (0)