Elasticsearch: custom_score 쿼리의 Null κ°’ ν•„λ“œλ‘œ 인해 'ν•„λ“œ μ—†μŒ' 였λ₯˜ λ°œμƒ

에 λ§Œλ“  2011λ…„ 02μ›” 09일  Β·  5μ½”λ©˜νŠΈ  Β·  좜처: elastic/elasticsearch

custom_score 쿼리λ₯Ό μ‚¬μš©ν•˜κ³  null 값을 포함할 수 μžˆλŠ” ν•„λ“œλ₯Ό 기반으둜 점수λ₯Ό 맀길 λ•Œ λ¬Έμ œκ°€ μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

λ‚΄κ°€ κ°€μ§€κ³ μžˆλŠ” 것을 κ°μ•ˆν•  λ•Œ :

{"user": {"name": "John", "position": null}}

custom_score 및 λ‹€μŒκ³Ό 같은 슀크립트λ₯Ό μ‚¬μš©ν•˜μ—¬ 쿼리할 λ•Œ:

{"script": "_score + doc['position'].value"}

λ‹€μŒ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

ElasticSearchIllegalArgumentException[No field found for [position]]; }]

λ‹€λ₯Έ μ‚¬μš©μžλ₯Ό μΆ”κ°€ν•˜λŠ” 경우:

{"user": {"name": "Jane", "position": 1}}

λͺ¨λ“  것이 잘 μž‘λ™ν•©λ‹ˆλ‹€.

κΈ°λ³Έ λ™μž‘μ€ null κ°’ ν•„λ“œκ°€ null을 λ°˜ν™˜ν•˜κ³  였λ₯˜λ₯Ό λ°œμƒμ‹œν‚€μ§€ μ•ŠλŠ” 것이어야 ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

μœ„μ˜ μ˜ˆλŠ” ν˜•νŽΈμ—†μ–΄ 보일 수 μžˆμ§€λ§Œ 열에 null κ°’ μ΄μ™Έμ˜ λ‹€λ₯Έ 것이 ν¬ν•¨λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” 보μž₯이 μ—†λŠ” λ°μ΄ν„°λ² μ΄μŠ€μ˜ λ°μ΄ν„°λ‘œ 인덱슀λ₯Ό μ±„μš°λŠ” 것을 상상해 λ³΄μ‹­μ‹œμ˜€. 맀핑을 μ‚¬μš©ν•˜μ—¬ ν•„λ“œλ₯Ό λ¬Έμžμ—΄λ‘œ ν˜•λ³€ν™˜ν•˜μ—¬ 이 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμ§€λ§Œ ElasticSearchκ°€ 슀크립트 값을 보닀 지λŠ₯적으둜 μ²˜λ¦¬ν•  수 μžˆλ‹€κ³  ν™•μ‹€νžˆ μ œμ•ˆν•©λ‹ˆλ‹€.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

이것은 μž‘λ™ν•΄μ•Ό ν•©λ‹ˆλ‹€:

{"script": "_score + (doc.containsKey('position') ? doc['position'].value : 0)"}

λ˜λŠ” λ‹€μŒκ³Ό 같은 κ²½μš°λ„ μžˆμŠ΅λ‹ˆλ‹€.

{"script": "_score + (doc['position'] ? doc['position'].value : 0)"}

κ·ΈλŸΌμ—λ„ λΆˆκ΅¬ν•˜κ³  각 μƒ€λ“œμ— λŒ€ν•΄ ν•˜λ‚˜ μ΄μƒμ˜ λ¬Έμ„œμ— position 값이 μžˆλŠ” μΆ©λΆ„ν•œ 데이터 μ„ΈνŠΈκ°€ 있으면 이 검사가 ν•„μš”ν•˜μ§€ μ•ŠμœΌλ©° 슀크립트의 μ„±λŠ₯이 훨씬 더 μ’‹μ•„μ§‘λ‹ˆλ‹€.

λͺ¨λ“  5 λŒ“κΈ€

μ•„, 그리고 멋진 μ œν’ˆ κ°μ‚¬ν•©λ‹ˆλ‹€! :-)

μ•Ό,

이것은 ν•΄λ‹Ή ν•„λ“œκ°€ 아직 λ„μž…λ˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— λ°œμƒν•©λ‹ˆλ‹€(null 값을 가짐). ν΄λŸ¬μŠ€ν„°μ— 단일 κ°’μœΌλ‘œ λ„μž…λ˜λ©΄ μ œλŒ€λ‘œ μž‘λ™ν•©λ‹ˆλ‹€. ν•΄λ‹Ή ν•„λ“œκ°€ null 인 경우 νŠΉμ • null 값을 인덱싱할 λ§€ν•‘μ—μ„œ null-value λ₯Ό μ •μ˜ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. λ„μž…λ˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ ν•΄λ‹Ή μœ ν˜•μ„ νŒŒμƒμ‹œν‚¬ 수 μ—†μŠ΅λ‹ˆλ‹€.

λ„€, μ΄ν•΄ν•©λ‹ˆλ‹€. μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€κ³  κ²°κ³Όκ°€ λ°˜ν™˜λ˜μ§€ μ•Šκ²Œ ν•˜λŠ” λŒ€μ‹  슀크립트 값이 null을 λ°˜ν™˜ν•˜κ±°λ‚˜ μ΅œμ†Œν•œ 쑴재 μ—¬λΆ€λ₯Ό ν™•μΈν•˜λŠ” μ–΄λ–€ μ’…λ₯˜μ˜ κΈ°λŠ₯을 κ°–λŠ” 것이 더 낫지 μ•Šμ„κΉŒμš”?

예:

{"script": "_score + (doc['position'].present ? doc['position'] : 0)"}

이것은 μž‘λ™ν•΄μ•Ό ν•©λ‹ˆλ‹€:

{"script": "_score + (doc.containsKey('position') ? doc['position'].value : 0)"}

λ˜λŠ” λ‹€μŒκ³Ό 같은 κ²½μš°λ„ μžˆμŠ΅λ‹ˆλ‹€.

{"script": "_score + (doc['position'] ? doc['position'].value : 0)"}

κ·ΈλŸΌμ—λ„ λΆˆκ΅¬ν•˜κ³  각 μƒ€λ“œμ— λŒ€ν•΄ ν•˜λ‚˜ μ΄μƒμ˜ λ¬Έμ„œμ— position 값이 μžˆλŠ” μΆ©λΆ„ν•œ 데이터 μ„ΈνŠΈκ°€ 있으면 이 검사가 ν•„μš”ν•˜μ§€ μ•ŠμœΌλ©° 슀크립트의 μ„±λŠ₯이 훨씬 더 μ’‹μ•„μ§‘λ‹ˆλ‹€.

치λͺ…적인 였λ₯˜: μž‘νžˆμ§€ μ•ŠμŒ [NoFieldFound]ν•„λ“œλ₯Ό 찾을 수 μ—†μŒ: Contact._PloiciesLastApplicationDate0 μ‹œλ„: 1회. 던져

μ—°λ½μ²˜λ₯Ό μ—…λ°μ΄νŠΈν•˜λŠ” λ™μ•ˆ λ‹€μŒ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

예:-

$checkExist = Infusionsoft_DataService::query(new Infusionsoft_Contact(), array('Phone1' => '(618)-795-0304'));

μ—°λ½μ²˜λ₯Ό κ°€μ Έμ˜€κ³  μ „ν™” 번호λ₯Ό 기반으둜 μ—°λ½μ²˜λ₯Ό μ—…λ°μ΄νŠΈν•˜κ³  μžˆμ§€λ§Œμ΄ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆκΉŒ?

감사 ν•΄μš”!

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰