select_related - utilizar la concordancia difusa en el filtro django queryset




select_related django example (2)

¿Hay alguna manera de usar la coincidencia difusa en un filtro de conjunto de consultas django?

Estoy buscando algo en la línea de Object.objects.filter (fuzzymatch (namevariable) __ gt = .9)

o hay una forma de usar las funciones lambda, o algo similar en las consultas de django, y si es así, cuánto afectaría el tiempo de rendimiento (dado que tengo un conjunto estable de ~ 6000 objetos en mi base de datos con los que quiero hacer coincidir)

(me di cuenta de que probablemente debería poner mis comentarios en la pregunta)

Necesito algo más fuerte que contiene, algo parecido a difflib. Básicamente estoy tratando de hacer Object.objects.all () y luego una lista de comprensión con concordancia difusa.

(aunque no estoy necesariamente seguro de que hacerlo sea mucho más lento que tratar de filtrar en función de una función, por lo que si tienes pensamientos sobre eso estoy feliz de escuchar)

también, aunque no sea exactamente lo que quiero, estaría abierto a algún tipo de tokenized opuesto-contiene, como Object.objects.filter (['Virginia', 'Tech'] __ in = Object.name), donde algo como "Virginia Technical Institute" sería devuelto. Aunque no distingue entre mayúsculas y minúsculas, preferiblemente.



Cuando está utilizando el ORM, lo que hay que entender es que todo lo que hace se convierte en comandos SQL y es el rendimiento de las consultas subyacentes que importan en la base de datos subyacente. Caso en punto:

SELECT COUNT (*) ...

¿Es eso rápido? Depende de si su base de datos almacena algún registro para darle esa información, MySQL / MyISAM si lo hace , MySQL / InnoDB no lo hace . En inglés: esta es una búsqueda en MYISAM yn en InnoDB.

Lo siguiente, para hacer búsquedas exactas de coincidencias de manera eficiente en SQL debes contarlo cuando creas la tabla, no puedes esperar que lo entienda. Para este propósito SQL tiene la instrucción INDEX - en django, use db_index=True en las opciones de campo de su modelo. Tenga en cuenta que esto tiene un impacto en el rendimiento agregado en las escrituras (para crear el índice) y obviamente se necesita almacenamiento adicional (para la estructura de datos) por lo que no puede " INDEX todas las cosas". Además, no creo que ayude con la coincidencia difusa, pero vale la pena señalar de todos modos.

Siguiente consideración: ¿cómo hacemos la coincidencia difusa en SQL? Bueno, aparentemente LIKE y CONTAINS permiten que se ejecute una cierta cantidad de resultados de búsqueda y comodín en SQL. Estos son enlaces T-SQL - traduzca para su servidor de base de datos :) Puede lograr esto a través de Model.objects.get(fieldname__contains=value) que producirá LIKE SQL, o similar. Hay una serie de opciones disponibles para diferentes búsquedas.

Esto puede o no ser lo suficientemente poderoso para ti, no estoy seguro.

Ahora, para la gran pregunta: rendimiento. Lo más probable es que, si está haciendo una búsqueda de contenido, el servidor SQL tenga que llegar a todas las filas de la base de datos, no se lo tome en serio, pero sería mi apuesta, incluso con la indexación. Con 6000 filas, esto podría no tomar todo ese tiempo; luego, de nuevo, si estás haciendo esto en una base por conexión a tu aplicación, probablemente va a crear una desaceleración.

Lo siguiente que debes entender sobre el ORM: si haces esto:

Model.objects.get(fieldname__contains=value)
Model.objects.get(fieldname__contains=value)

Usted emitirá dos consultas al servidor de la base de datos. En otras palabras, el ORM no siempre almacena en caché los resultados, por lo que es posible que solo desee hacer un .all() y buscar en la memoria. Lea sobre el almacenamiento en caché y los conjuntos de consulta .

Más adelante en esa última página, también verá objetos Q : útil para consultas más complicadas.

Entonces, en resumen, entonces:

  • SQL contiene algunos parámetros básicos parecidos a coincidencias difusas.
  • Si estos son suficientes o no depende de tus necesidades.
  • La forma en que funcionan depende de su servidor SQL; mida definitivamente .
  • Si puede almacenar estos resultados en la memoria caché depende de cuán probable es la escala, de nuevo podría valer la pena medir la confirmación de la memoria como resultado, si puede compartir entre instancias y si la memoria caché se invalidará con frecuencia (si es así, no lo haga). hazlo).

En última instancia, comenzaría trabajando en su combinación borrosa, luego mediría, luego ajustaría y luego mediría hasta que encuentre la forma de mejorar el rendimiento. El 99% de esto aprendí haciendo exactamente eso :)





django-queryset