Estoy tratando de insertar elasticsearch en mi aplicación Django usando django-haystack
. Estoy tratando de implementar una búsqueda de usuario. Mi modelo de usuario es este:
class MyUser(AbstractBaseUser):
username = models.CharField(max_length=255, unique=True)
name = models.CharField(max_length=63, blank=True)
email = models.EmailField(blank=True, unique=True)
status = models.CharField(max_length=255, blank=True, null=True)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
joined = models.DateTimeField(auto_now_add=True, null=True)
Ahora, quiero buscar en name
y username
campos. He creado el siguiente search_indexes.py
:
class UserIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.EdgeNgramField(document=True, model_attr="name")
username = indexes.CharField(model_attr="username")
def get_model(self):
return MyUser
def get_updated_field(self):
return "joined"
Sin embargo, cuando realizo una búsqueda, solo obtengo los resultados que coinciden con name
campo. ¿Qué estoy haciendo mal aquí? ¿Hay alguna otra manera de hacer esto?
Gracias por adelantado.
Respuestas
4 para la respuesta № 1La forma en que funciona django-haystack, los datos dentro del document=True
campo se utiliza para una búsqueda general, y cualquier otro campo se utiliza para el filtrado individual. Así que en tu caso, una búsqueda solo usará el name
campo. Para solucionar este problema, deberá usar una plantilla que especifique todos los campos que se utilizarán en una búsqueda. En primer lugar, use:
text = indexes.EdgeNgramField(document=True, use_template=True)
Luego deberá crear una nueva plantilla dentro de su directorio de plantillas llamado search/indexes/myapp/myuser_text.txt
y coloque lo siguiente adentro:
{{ object.username }}
{{ object.name }}
Ver http://django-haystack.readthedocs.org/en/latest/tutorial.html#handling-data para referencia completa