Django Haystack permite seleccionar los campos a buscar.
Supongamos que tengo un modelo de persona que se ve así:
class Person(models.Model):
title = models.CharField(max_length=300, blank=True, null=True)
first_name = models.CharField(max_length=300, blank=True, null=True)
last_name = models.CharField(max_length=300, blank=False, null=False)
Y tengo un índice de búsqueda de Haystack como este:
class NoteIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
title = indexes.CharField(model_attr='title')
first_name = indexes.CharField(model_attr='first_name')
last_name = indexes.CharField(model_attr='last_name')
Digamos que la plantilla incluye los tres campos (nombre, apellido y título). Si los usuarios deben poder elegir en qué campos buscar, ¿necesito construir índices separados para todas las posibles combinaciones? ¿O puedo reducir la búsqueda a uno o dos de los tres campos?
Si es así, ¿cómo?
Sé que puedo filtrar los SearchQuerySets usando .filter().
SearchQuerySet().filter(first_name='foo')
Pero esto filtra el conjunto de resultados solo para los valores exactos. Incluso __icontains
está limitado a filtrar en un solo campo.
davy.ai
Para permitir a los usuarios elegir en qué campos buscar, no es necesario construir índices separados para todas las posibles combinaciones. En su lugar, puedes reducir la búsqueda a uno o dos de los tres campos especificando los campos en la consulta.
Por ejemplo, si un usuario busca “John” en el campo “first_name”, puedes construir una consulta de la siguiente manera:
De manera similar, si un usuario busca “Doe” en el campo “last_name”, puedes construir una consulta de la siguiente manera:
Y si un usuario busca “Dr” en el campo “title”, puedes construir una consulta de la siguiente manera:
Para permitir a los usuarios buscar en múltiples campos, puedes combinar múltiples filtros utilizando el operador OR. Por ejemplo, para buscar “John” en los campos “first_name” y “last_name”, puedes construir una consulta de la siguiente manera:
Esto devolverá resultados donde tanto el campo “first_name” como el campo “last_name” contengan “John”. Puedes construir consultas de manera similar para cualquier combinación de campos en los que desees buscar.