Django-haystack: 'order_by'λŠ” 'DecimalField'와 ν•¨κ»˜ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2011λ…„ 08μ›” 09일  Β·  12μ½”λ©˜νŠΈ  Β·  좜처: django-haystack/django-haystack

λ•Œλ¬Έμ— DecimalField A와 μ €μž₯ string 인덱싱 μ‚¬μš©ν•˜λ©΄, μ˜ˆμƒλ˜λŠ” κ²°κ³Όλ₯Ό μƒμ„±ν•˜μ§€ μ•ŠλŠ” order_by .

숫자 κ°’μœΌλ‘œ μ •λ ¬ν•˜λŠ” λŒ€μ‹  데이터λ₯Ό μ•ŒνŒŒλ²³μˆœμœΌλ‘œ μ •λ ¬ν•©λ‹ˆλ‹€.

Xapian λ°±μ—”λ“œ κ΄€λ ¨ 문제: https://github.com/notanumber/xapian-haystack/issues/84

needs review

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

이에 λŒ€ν•œ ν•œ 가지 ν•΄κ²° 방법은 10μ§„μˆ˜ ν•„λ“œμ˜ λ‚΄μš©μ„ μ •μˆ˜λ‘œ μ €μž₯ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ MyModelμ΄λΌλŠ” λͺ¨λΈμ— priceλΌλŠ” Decimal ν•„λ“œκ°€ μžˆλŠ” 경우 μ†Œμˆ˜μ  μ΄ν•˜ 자릿수λ₯Ό κ³±ν•˜μ—¬ μ •μˆ˜λ‘œ μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

class MyIndex(SearchIndex):
    ...
    price = IntegerField(model_attr='price')

    def prepare_price(self, obj):
        return int(obj.price * Decimal('100'))

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

이 문제λ₯Ό (μ‹ μ†ν•˜κ²Œ) ν•΄κ²°ν•˜λŠ” κ°€μž₯ 쒋은 방법은 order_by κ°€ μ§€μ›λ˜μ§€ μ•ŠμŒμ„ λ‚˜νƒ€λ‚΄λ„λ‘ DecimalField λ¬Έμ„œλ₯Ό μ—…λ°μ΄νŠΈν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

μž₯기적으둜 DecimalField order_by μž‘μ—…μ„ μ‹œλ„ν•˜λ©΄ WARNING 레벨 둜그 λ©”μ‹œμ§€κ°€ 좜λ ₯될 수 μžˆμŠ΅λ‹ˆλ‹€. μ„±λŠ₯μƒμ˜ 이유둜 ν•„λ“œ μœ ν˜• 확인은 μ‚¬μ΄νŠΈκ°€ DEBUG λͺ¨λ“œμΌ λ•Œλ§Œ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이에 λŒ€ν•œ ν•œ 가지 ν•΄κ²° 방법은 10μ§„μˆ˜ ν•„λ“œμ˜ λ‚΄μš©μ„ μ •μˆ˜λ‘œ μ €μž₯ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ MyModelμ΄λΌλŠ” λͺ¨λΈμ— priceλΌλŠ” Decimal ν•„λ“œκ°€ μžˆλŠ” 경우 μ†Œμˆ˜μ  μ΄ν•˜ 자릿수λ₯Ό κ³±ν•˜μ—¬ μ •μˆ˜λ‘œ μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

class MyIndex(SearchIndex):
    ...
    price = IntegerField(model_attr='price')

    def prepare_price(self, obj):
        return int(obj.price * Decimal('100'))

이것은 elasticsearchμ—μ„œλŠ” μž‘λ™ν•˜μ§€λ§Œ solrμ—μ„œλŠ” μž‘λ™ν•˜μ§€ μ•ŠλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

λ²„κ·ΈλŠ” λΆ„λͺ…νžˆ Whoosh에도 μ μš©λ©λ‹ˆλ‹€.

λ²”μœ„ μΏΌλ¦¬λŠ” Elasticsearchμ—μ„œλ„ μ‹€νŒ¨ν•©λ‹ˆλ‹€.

+1

SolrBackendλ₯Ό μ‚¬μš©ν•˜μ—¬ 이와 λ™μΌν•œ 문제λ₯Ό κ²ͺμ—ˆμŠ΅λ‹ˆλ‹€. λ³΅μž‘ν•œ 점수 μ•Œκ³ λ¦¬μ¦˜μ„ λ‚˜νƒ€λ‚΄λŠ” 0.0 - 1.0 μ‚¬μ΄μ˜ μˆ«μžκ°€ ν¬ν•¨λœ ν•„λ“œλ₯Ό κΈ°μ€€μœΌλ‘œ μ •λ ¬ν•©λ‹ˆλ‹€. λ¬Έμžμ—΄λ‘œ μ •λ ¬ν•  λ•Œ μ μˆ˜κ°€ 맀우 μž‘μ€ μš”μ†Œκ°€ μ μˆ˜κ°€ 큰 μš”μ†Œ(예: 9e-08) μœ„μ— μ •λ ¬λ©λ‹ˆλ‹€.

κ³΅μ •ν•˜κ²Œ, λͺ…λ°±ν•œ ν•΄κ²° 방법은 λŒ€μ‹  float ν•„λ“œλ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€(λ‚΄ λͺ©μ μ—λŠ” λ³„λ‘œ μ€‘μš”ν•˜μ§€ μ•ŠμŒ).

이것은 κ½€ λ‚˜μ©λ‹ˆλ‹€. μˆ˜μ •λ˜μ§€ μ•Šκ³  "order_byκ°€ μž‘λ™ν•˜μ§€ μ•ŠμŒ"으둜 λ¬Έμ„œν™”λœ 경우 ν•„λ“œ μœ ν˜•μ„ μ‚¬μš©ν•˜μ§€ μ•ŠκΈ°λ‘œ ν•˜κ±°λ‚˜ ν•„λ“œ μœ ν˜• λͺ©λ‘μ— λͺ…ν™•ν•œ κ²½κ³ λ₯Ό ν‘œμ‹œν•΄μ•Ό ν•©λ‹ˆλ‹€. μ‹€μˆ˜ν•˜κ³  큰 λ°μ΄ν„°λ² μ΄μŠ€κ°€ μžˆλŠ” 경우 볡ꡬ 속도가 λŠλ¦½λ‹ˆλ‹€.

Elasticsearchμ—μ„œλ„ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

:+1:

@JoeJasinski 정말 κ°μ‚¬ν•©λ‹ˆλ‹€. 닡변이 도움이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

이에 λŒ€ν•œ ν•œ 가지 ν•΄κ²° 방법은 10μ§„μˆ˜ ν•„λ“œμ˜ λ‚΄μš©μ„ μ •μˆ˜λ‘œ μ €μž₯ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ MyModelμ΄λΌλŠ” λͺ¨λΈμ— priceλΌλŠ” Decimal ν•„λ“œκ°€ μžˆλŠ” 경우 μ†Œμˆ˜μ  μ΄ν•˜ 자릿수λ₯Ό κ³±ν•˜μ—¬ μ •μˆ˜λ‘œ μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

class MyIndex(SearchIndex):
    ...
    price = IntegerField(model_attr='price')

    def prepare_price(self, obj):
        return int(obj.price * Decimal('100'))

그리고?
MyIndex.objects.all().order_by('prepare_price') ? 였λ₯Έμͺ½?

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