2012-05-10 11 views
6

ho un modello come questo:Django pagliaio, la priorità per alcuni campi in cerca

class MyModel(models.Model): 
    desc1 = models.TextField(blank=True, default="") 
    desc2 = models.TextField(blank=True, default="") 

voglio cercare stringa su campi di questo modello. Assumere queste istanze di MyModel:

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

quando cerco "tu", si deve a me, prima e seconda istanze mostrare. finalmente ho bisogno di mostrare i risultati che hanno "tu" in desc1 più in alto di altri. per esempio, in questo esempio, il secondo dovrebbe essere più alto del primo.

Ho usato, pagliaio per la ricerca e creato un modello per questo. ma non ho potuto risolvere il problema prioritario.

risposta

2

Quando si dice "priorità", si intende veramente "ordina", nel gergo della ricerca.

Django Haystack può ordinare per corrispondenza, ma può ordinare per "punteggio", dove utilizza un algoritmo per determinare l'ordinamento. È possibile influenzare la ponderazione del punteggio con 'Boost'ing esso - vedi http://django-haystack.readthedocs.org/en/latest/boost.html

Inoltre, si dovrebbe considerare l'aggiunta di campi aggiuntivi nel search_indexes.py che sarà solo per ponderazione. Non è necessario disporre di una mappatura uno-a-uno tra i campi del modello Django e l'indice. Qualcosa come

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

L'API "boosting" appare molto instabile. Il documento che colleghi mostra un approccio completamente diverso ... che non funziona nemmeno con il codice corrente ... – Cerin

+0

Per essere chiari, questo è un esempio scritto per Haystack 1.2 –

1

Io uso questo approccio.

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

è sorprendente che nessuno stia provando a implementalo. Suppongo che non sarà ancora applicabile se vogliamo mescolare EdgeNgramField e CharField? Sto pensando di modificare solo il set di query in modo che la query predefinita venga cercata tra diversi campi – Forethinker

Problemi correlati