2012-05-10 13 views
6

में कुछ क्षेत्रों के लिए प्राथमिकता मैं इस तरह एक मॉडल है। MyModel के इन उदाहरणों मान लें:Django भूसे के ढेर, खोज

1: desc1="ABc?", desc2="asdasd you" 
2: desc1="Hello, How are you?", desc2="Thank you!" 
3: desc1="ABc?", desc2="ajdf" 

जब मैं खोज "आप", यह मेरे, पहले और दूसरे उदाहरणों को दिखाना चाहिए। अंत में मुझे उन परिणामों को दिखाने की ज़रूरत है जिनमें "आप" अन्य लोगों की तुलना में desc1 में अधिक हैं। उदाहरण के लिए, इस नमूने में, दूसरा एक पहले से अधिक होना चाहिए।

मैंने खोज के लिए उपयोग किया है, इसके लिए एक टेम्पलेट बनाया है। लेकिन मैं प्राथमिकता की समस्या को हल नहीं कर सका।

उत्तर

2

जब आप 'प्राथमिकता' कहते हैं तो आप खोज के लिंग में वास्तव में 'सॉर्ट' का मतलब रखते हैं।

Django Haystack फील्ड मैचों द्वारा क्रमबद्ध कर सकता है, लेकिन यह 'स्कोर' द्वारा क्रमबद्ध कर सकता है, जहां यह सॉर्ट ऑर्डर निर्धारित करने के लिए एल्गोरिदम का उपयोग करता है। आप यह Boost'ing साथ स्कोर के भार को प्रभावित कर सकते हैं - http://django-haystack.readthedocs.org/en/latest/boost.html

भी देखें, तो आप अपने search_indexes.py में अतिरिक्त क्षेत्रों है कि बस भार के लिए किया जाएगा जोड़ने पर विचार करना चाहिए। Django मॉडल फ़ील्ड और इंडेक्स के बीच आपको एक-से-एक मैपिंग करने की आवश्यकता नहीं है। कुछ

class MyModelIndex(QueuedSearchIndex): 
    desc1 = indexes.CharField() 
    desc2 = indexes.CharField() 
    otherWeightedField = indexes.CharField() 

    def prepare_otherWeightedField(self,obj) 
     # fill the extra field with extra stuff to help you sort, based on processing values from other fields 
+0

"बूस्टिंग" एपीआई बहुत अस्थिर दिखाई देता है। जिस दस्तावेज़ से आप लिंक करते हैं वह एक पूरी तरह से अलग दृष्टिकोण दिखाता है ... जो वर्तमान कोड के साथ भी काम नहीं करता है ... – Cerin

+0

बस स्पष्ट होने के लिए, यह एक उदाहरण है जो हेस्टैक 1.2 –

1

मैं इस दृष्टिकोण का उपयोग करता हूं।

from types import ListType 
from haystack import indexes 


class DocumentField(indexes.SearchField): 
    """An index field that combines and weights other fields because Haystack 
    does not provide for weighted searching. This field makes use of other 
    existing field classes for DRY.""" 

    def __init__(self, *args, **kwargs): 
     self.fields = kwargs.pop("fields", None) 
     super(DocumentField, self).__init__(*args, **kwargs) 
     self.document = True 
     self.use_template = False 

    def prepare(self, obj): 
     values = [] 

     for field_instance in self.fields.values(): 
      v = field_instance.prepare(obj) 
      if not v: 
       continue 
      if not isinstance(v, ListType): 
       v = [v] 
      # Apply boost 
      v = v * int(field_instance.boost * 10) 
      values.extend(v) 

     return "\n".join(values) 


class MyModelIndex(indexes.SearchIndex, indexes.Indexable): 
    text = DocumentField(fields=dict(
     desc1 = indexes.CharField(model_attr="desc1", boost=1.0), 
     desc2 = indexes.CharField(model_attr="desc2", boost=0.7) 
    )) 

    def get_model(self): 
     return MyModel 
+0

के लिए लिखा गया था यह आश्चर्यजनक है कि कोई भी कोशिश नहीं कर रहा है इसे लागू करें। मुझे लगता है कि अगर हम EdgeNgramField और CharField को मिश्रित करना चाहते हैं तो यह अभी भी लागू नहीं होगा? मैं केवल क्वेरीसेट को संशोधित करने के बारे में सोच रहा हूं ताकि अलग-अलग क्षेत्रों में डिफ़ॉल्ट क्वेरी खोजी जा सके – Forethinker

संबंधित मुद्दे