es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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:

    SearchQuerySet().filter(first_name__icontains='John')
    

    De manera similar, si un usuario busca “Doe” en el campo “last_name”, puedes construir una consulta de la siguiente manera:

    SearchQuerySet().filter(last_name__icontains='Doe')
    

    Y si un usuario busca “Dr” en el campo “title”, puedes construir una consulta de la siguiente manera:

    SearchQuerySet().filter(title__icontains='Dr')
    

    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:

    SearchQuerySet().filter(Q(first_name__icontains='John') | Q(last_name__icontains='John'))
    

    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.

Comments are closed.