variable template linebreaksbr examples bootstrap django search search-engine django-haystack

django - template - ¿Cómo hago una coincidencia de campo parcial usando Haystack?



linebreaksbr django (5)

@riz No puedo comentar todavía o lo haría y sé que es un comentario antiguo, pero en caso de que alguien más corra después de esto: asegúrese de administrar.py update_index

Blockquote @Liarez ¿cómo conseguiste que esto funcione? Estoy usando la búsqueda Haystack / Elastic y no pude hacer que funcione.

Necesitaba una herramienta de búsqueda simple para mi sitio web impulsado por django, así que fui con Haystack y Solr. Configuré todo correctamente y puedo encontrar los resultados de búsqueda correctos cuando escribo la frase exacta , pero no puedo obtener ningún resultado al escribir una frase parcial.

Por ejemplo: "John" devuelve "John Doe" pero "Joh" no devuelve nada.

Modelo:

class Person(models.Model): first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50)

Índice de búsqueda:

class PersonIndex(SearchIndex): text = CharField(document=True, use_template=True) first_name = CharField(model_attr = ''first_name'') last_name = CharField(model_attr = ''last_name'') site.register(Person, PersonIndex)

Supongo que hay alguna configuración que me falta que permite la coincidencia de campo parcial. He visto personas hablando sobre EdgeNGramFilterFactory() en algunos foros, y lo he buscado en Google, pero no estoy seguro de su implementación. Además, esperaba que hubiera una manera específica de hacerlo, en caso de que cambiara el motor de búsqueda.


Además de la sugerencia de EdgeNgramField que otros mencionaron en esta página (y por supuesto NgramField , si trabajas con idiomas asiáticos), creo que vale la pena mencionar que en Django_haystack puedes ejecutar consultas en Solr mediante el siguiente comando:

from haystack.query import SearchQuerySet from haystack.inputs import Raw SearchQuerySet().filter(text=Raw(query))

donde el text es el campo que desea buscar, y la query puede basarse en la sintaxis del analizador de consultas (versión 3.6 o 4.6 ) de Lucene.

De esta forma, puede establecer fácilmente la consulta en ABC* o ABC~ o cualquier otra cosa que se ajuste a la sintaxis.


Puede lograr ese comportamiento haciendo que el campo de texto de su índice sea EdgeNgramField:

class PersonIndex(SearchIndex): text = EdgeNgramField(document=True, use_template=True) first_name = CharField(model_attr = ''first_name'') last_name = CharField(model_attr = ''last_name'')


Tuve el mismo problema y la única forma de obtener los resultados que quería era modificar el archivo de configuración de solr para incluir el filtrado de ngram, ya que el tokenizador predeterminado se basa en el espacio en blanco. Entonces usa NGramTokenizer en NGramTokenizer lugar. Me encantaría saber si hay una manera de hacer lo mismo.

No estoy en mi máquina ahora pero esto debería funcionar.

<tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15" />


Tuve un problema similar al buscar palabras no inglesas, por ejemplo:

ABC ABCD

Si quiero buscar palabras clave ABC , esperaré los dos resultados anteriores. Pude lograr lo siguiente al convertir la palabra clave a minúscula y usar startswith :

keywords = ''ABC'' results.filter(code__startswith=keywords.lower())