2012-05-10 13 views
6

que tienen un modelo como este:Django pajar, prioridad para algunos campos en busca

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

Quiero buscar la cadena en los campos de este modelo. Asumir estas instancias de MyModel:

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

cuando busco "usted", debería ser yo, primera y segunda instancia mostrar. finalmente necesito mostrar los resultados que tienen "usted" en desc1 más alto que otros. por ejemplo, en esta muestra, el segundo debe ser más alto que el primero.

He utilizado, haystack para búsqueda y he creado una plantilla para esto. pero no pude resolver el problema de prioridad.

Respuesta

2

Cuando dices 'prioridad' realmente quieres decir 'ordenar', en la jerga de la búsqueda.

Django Haystack puede ordenar por coincidencias de campo, pero puede ordenar por "puntaje", donde utiliza un algoritmo para determinar el orden de clasificación. Puede influir en la ponderación de la puntuación con 'Boost'ing que - ver http://django-haystack.readthedocs.org/en/latest/boost.html

Además, se debe considerar la adición de campos adicionales en su search_indexes.py que serán sólo para la ponderación. No necesita tener un mapeo uno a uno entre los campos del modelo de Django y el índice. Algo como

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

La API "impulsar" parece muy inestable. El documento al que se vincula muestra un enfoque completamente diferente ... que ni siquiera funciona con el código actual ... – Cerin

+0

Para que quede claro, este es un ejemplo escrito para Haystack 1.2 –

1

Uso este enfoque.

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

. Es sorprendente que nadie intente implementar esto ¿Supongo que esto no será aplicable si queremos mezclar EdgeNgramField y CharField? Estoy pensando en simplemente modificar el conjunto de consultas para que la consulta predeterminada se busque en diferentes campos – Forethinker

Cuestiones relacionadas