일단 ν•˜κ³  λ³΄λŠ” μ‚¬λžŒ

λ‚˜μ€‘λ³΄λ‹¨ μ§€κΈˆμ— μ§‘μ€‘ν•˜λ˜, μ§€κΈˆλ³΄λ‹¨ λ‚˜μ€‘μ— μ™„λ²½ν•΄μ§€μžπŸ’ͺ🏻

🀚🏻 더 λ‚˜μ€ 개발자 ν•˜κΈ°

[query] eq or eq or eq…λŠ” μ™œ μœ„ν—˜ν• κΉŒ? Azure Search recursion μ—λŸ¬

JanginTech 2026. 1. 2. 16:15

Azure AI Searchλ₯Ό μ‚¬μš©ν•΄ νŠΉμ • μ‚¬μš©μž(evIUserId), νŠΉμ • μΉ΄ν…Œκ³ λ¦¬(csagId)에 ν•΄λ‹Ήν•˜λŠ” 데이터λ₯Ό μ‘°νšŒν•΄μ•Ό ν–ˆλ‹€.
λ¬Έμ œλŠ” λ‹¨μˆœ μ‘°νšŒκ°€ μ•„λ‹ˆλΌ ν•œ λ²ˆμ— λ“€μ–΄μ˜€λŠ” ID κ°œμˆ˜κ°€ 맀우 λ§Žμ•˜λ‹€λŠ” 점이닀.

  • evlUserId: μ΅œλŒ€ 2,800개
  • csagId: μ΅œλŒ€ 2,800개
  • ν•„λ“œ νƒ€μž…: Edm.String (단일 string)

“μ—¬λŸ¬ κ°’ 쀑 ν•˜λ‚˜λΌλ„ μΌμΉ˜ν•˜λ©΄ 쑰회”λΌλŠ” 쑰건 μžμ²΄λŠ” ν”ν–ˆμ§€λ§Œ
막상 μ‹€μ œ 데이터 규λͺ¨λ‘œ λŒλ¦¬λ‹ˆ μ˜ˆμƒμΉ˜ λͺ»ν•œ μ—λŸ¬κ°€ νŠ€μ–΄λ‚˜μ™”λ‹€πŸ₯²πŸ₯²

λ‚΄κ°€ 생각을 짧게 ν•œ 탓이닀..γ…Ž

 

 

πŸ’­ κ³ λ―Ό

“OR둜 묢으면 λ˜κ² μ§€?”

μ²˜μŒμ—λŠ” λ‹¨μˆœν•˜κ²Œ μƒκ°ν–ˆλ‹€.

 

κ·Έλž˜μ„œ ν•„ν„°λ₯Ό 이런 μ‹μœΌλ‘œ λ§Œλ“€μ—ˆλ‹€.

(evlUserId eq 'u1' or evlUserId eq 'u2' or evlUserId eq 'u3' or ...)

 

값이 수백 κ°œκ°€ λ„˜μž λ°”λ‘œ μ•„λž˜μ™€ 같은 μ—λŸ¬κ°€ λ°œμƒν–ˆλ‹€.

recursion depth exceeded allowed limit parameter name: $filter

  • 파이썬 μ—λŸ¬κ°€ μ•„λ‹ˆλΌ Azure Search λ‚΄λΆ€ νŒŒμ„œ μ—λŸ¬μ˜€κ³ 
  • “μ™œ” μ•ˆ λ˜λŠ”μ§€ 곡식 λ¬Έμ„œμ—μ„œ λ°”λ‘œ 닡을 μ°ΎκΈ° μ–΄λ €μ› κΈ° λ•Œλ¬Έμ΄λ‹€.

“μΏΌλ¦¬λŠ” λ§žλŠ” 것 같은데… μ™œ ν„°μ§€μ§€?”λΌλŠ” 생각이 λ“€μ—ˆλ‹€.

 

πŸ› οΈ μ‹œλ„

1️⃣ 처음 μ‚¬μš©ν•˜λ˜ μ½”λ“œ (문제의 원인)

if key in keyword_keys:
    i_v = [value.strip() for value in value.split(",") if value.strip()]
    con = [f"{key} eq '{v}'" for v in i_v]
    filters.append(f"({' or '.join(con)})")

이런 μ‹μœΌλ‘œ μ§°μ—ˆλ‹€.

λ…Όλ¦¬μ μœΌλ‘œλŠ” λ§žμ„ μˆ˜λ„ μžˆμ§€λ§Œ..

 

Azure SearchλŠ” $filter μ•ˆμ—μ„œ OR 쑰건을 μž¬κ·€μ μœΌλ‘œ νŒŒμ‹± ν•˜λŠ”λ°

κ°œμˆ˜κ°€ λ§Žμ•„μ§€λ©΄ λ‚΄λΆ€ μ œν•œμ„ μ΄ˆκ³Όν•΄ 버린닀

 

2️⃣ λŒ€μ•ˆ 탐색: search.in() μ‚¬μš©

μ°Ύμ•„λ³΄λ‹ˆ Azure Searchμ—λŠ” 닀쀑 값을 λΉ„κ΅ν•˜κΈ° μœ„ν•œ 곡식 ν•¨μˆ˜κ°€ μžˆλ”λΌ!

search.in(field, 'A,B,C', ',')

 

μš”λ ‡κ²Œ 바꿔쀬닀.

 

 

πŸ“ˆ λ³€ν™” / κ²°κ³Ό

  • recursion depth μ—λŸ¬ ❌ → μ™„μ „νžˆ ν•΄κ²°
  • 쿼리 가독성 ↑
  • Azure Searchκ°€ μ˜λ„ν•œ λ°©μ‹μœΌλ‘œ 필터링 κ°€λŠ₯
  • μ‹€μ œ 운영 데이터(수천 개 ID)μ—μ„œλ„ μ•ˆμ •μ μœΌλ‘œ λ™μž‘

무엇보닀
πŸ‘‰ “μ™œ μ•ˆ λλŠ”μ§€”λ₯Ό μ„€λͺ…ν•  수 있게 λλ‹€λŠ” 게 κ°€μž₯ μ»Έλ‹€!!(good)

 

 

 

이 μ—λŸ¬λŠ” 논리 λ¬Έμ œκ°€ μ•„λ‹Œ, ꡬ쑰 λ¬Έμ œμ˜€λ‹€.

값이 λ§Žμ•„μ§ˆμˆ˜λ‘ OR은 μœ„ν—˜ν•˜κ³ , μ–΄λ–»κ²Œ 보면 λ‹¨μˆœλ¬΄μ‹ν•œ? 쿼리닀.

닀쀑 κ°’ λΉ„κ΅λŠ” search.in()κ³Ό 같이 λ‹€λ₯Έ 방식을 ν™œμš©ν•˜λŠ” 것이 훨씬 더 μ’‹μ•„ 보인닀.

 

근데 이게 μ΅œμ„ μΌκΉŒ? μ‹ΆκΈ΄ ν•˜λ‹€..γ…Žγ…Žγ…Ž;;

찾아보면 더 쒋은 게 μžˆμ„ κ±° 같은데..

그건 미래의 λ‚΄κ°€ 찾을 κ±°λ‹€ γ…‹γ…‹