Optimizó la función de búsqueda de sitios web dañados.
Descripción general de este artículo:
Optimización de búsqueda de sitios web Yupi
El sitio web de navegación de programación que desarrollé ha estado en línea durante 6 meses, pero el sitio web ha aparecido desde entonces. El principio Un problema grave es que la función de búsqueda no es fácil de usar.
En el pasado, para lograr la velocidad en línea, simplemente usábamos consultas difusas de la base de datos (incluidas) para implementar la función de búsqueda para facilitar el desarrollo, pero este método era muy inflexible.
Por ejemplo, hay un recurso llamado "Java Design Pattern" en el sitio web, pero el usuario no puede encontrar nada cuando busca "Java Design Pattern" porque el nombre del recurso contiene espacios y el usuario está buscando. para Las palabras clave ingresadas no contienen espacios.
El espacio es sólo un caso especial, y hay muchos casos similares. Por ejemplo, hay un recurso en el sitio web llamado "Práctica de programación concurrente de Java", pero cuando el usuario busca "Práctica de Java", está claro que el primero contiene las palabras "Java" y "Práctica", pero no se encuentra nada. .
Debes saber que la función de búsqueda es muy importante para un sitio web de agregación de información y afecta directamente a la experiencia del usuario. Si no se puede encontrar un recurso en su sitio web, ¿quién lo utilizará?
Así que también recibí algunas sugerencias amables de amigos, como este Bald Tom:
Había dos razones principales para no optimizar la búsqueda antes: pobreza + miedo a los problemas. Pero a medida que el sitio web recibe cada vez más usuarios, ¡es hora de llenar este vacío!
Si desea mejorar la flexibilidad de la búsqueda en un sitio web, puede utilizar la tecnología de búsqueda de texto completo, que se puede implementar tanto en el front-end como en el back-end.
A veces, los datos que queremos recuperar son limitados y todos los datos se almacenan en el cliente.
Por ejemplo, en un sitio web de blog personal, normalmente almacenamos cada artículo como un archivo en un directorio en lugar de en la base de datos backend. En este caso, no necesitamos solicitar datos dinámicos del servidor, por lo que podemos buscar los datos directamente en la interfaz.
Hay algunas bibliotecas de búsqueda listas para usar, como Lunr.js (GitHub 7k+ star). Primero agregue el contenido a buscar:
Entonces la búsqueda es suficiente:
La ventaja de la búsqueda de texto completo frontal pura es que no requiere un back-end, es simple y conveniente, y puede ahorrar presión en el servidor. No está conectado a Internet y no hay sobrecarga de red adicional, por lo que la recuperación es más rápida.
A diferencia del front-end, la búsqueda de texto completo del back-end se completa en el lado del servidor. Los datos que cumplen con los requisitos se buscan desde la base de datos remota y luego se devuelven directamente al front-end.
La principal tecnología de búsqueda de texto completo back-end actual es Elasticsearch, un motor distribuido de análisis de datos y búsqueda RESTful.
Es potente y flexible, pero necesita establecer, definir datos, gestionar diccionarios, cargar y mantener datos, etc. Es muy maniobrable y requiere cierto nivel de competencia. Existe un mundo de diferencia entre los sistemas de búsqueda ES diseñados por principiantes y los diseñados por jefes.
De modo que los estudiantes que no estén familiarizados con Elasticsearch también pueden utilizar directamente el servicio de búsqueda de texto completo ya preparado. Por ejemplo, Algolia carga directamente los datos que se recuperarán a través de la API que proporciona y luego utiliza la API que proporciona para recuperarlos. Proporciona una cierta cantidad de espacio libre, que es completamente suficiente para sitios web pequeños y para el aprendizaje.
Servicio de búsqueda de Algoria
Entonces, ¿qué modo de implementación debo elegir para mi sitio web de navegación de programación?
En primer lugar, la cantidad de recursos en este sitio web no es fija ni se actualiza dinámicamente, por lo que no es adecuado para la recuperación de texto completo desde el front-end.
En segundo lugar, considerando que la cantidad de datos en el sitio web será relativamente grande en el futuro y que el sistema de búsqueda puede optimizarse dinámicamente en función de las búsquedas de los usuarios (como diccionarios de programación personalizados), consideramos utilizar la tecnología Elasticsearch. para construir nuestro propio motor de búsqueda, en lugar de un servicio de búsqueda de texto completo listo para usar, para que pueda personalizar el sistema como desee en el futuro. Además, no es necesario enviar datos del sitio web a otras plataformas, lo que garantiza la seguridad de los datos.
Después de decidir utilizar Elasticsearch, primero debe configurar el entorno.
Puedes adquirir el servidor tú mismo e instalarlo manualmente paso a paso según la documentación oficial.
Para un sitio web personal de cierta escala, aunque el proceso de construcción no es difícil, los costos de mantenimiento posteriores son enormes, como análisis de rendimiento, monitoreo, alarmas, seguridad, etc. , debe configurarlo usted mismo. Especialmente en el último período, cuando el volumen de datos del sitio web es mayor, debemos considerar la construcción de un clúster y la expansión horizontal.
Así que elegí utilizar directamente el servicio Elasticsearch proporcionado por el proveedor de servicios en la nube. Aquí elijo Tencent Cloud. Tencent Cloud crea automáticamente servicios de clúster ES listos para usar y también proporciona administración de arquitectura visual, monitoreo de clústeres, registro, complementos avanzados, inspección inteligente y otras funciones.
Diagrama de arquitectura del clúster de Cloud ES
Aunque los servicios de ES son caros, para mí vale la pena ahorrar mucho tiempo y dinero.
Nuestro objetivo es optimizar la función de búsqueda de los recursos del sitio web, pero lo que debemos hacer a continuación no es escribir una lógica empresarial específica directamente, sino desarrollar primero un servicio público es.
El funcionamiento de ES es en realidad relativamente simple. Puede entenderse simplemente como una base de datos, por lo que el servicio público de ES debe tener las funciones básicas de agregar, eliminar, verificar y llamar a otras funciones.
Debido a que el backend de navegación de programación utiliza la tecnología de desarrollo Tencent Cloud y usa Node.js para escribir servicios, elegimos la biblioteca @elastic/elasticsearch oficialmente recomendada para ejecutar es.
El código es muy sencillo. Primero, establezca una conexión con ES. Aquí, para garantizar la seguridad de los datos, utilice la dirección de intranet:
Luego escriba agregar, eliminar, modificar y verificar. Aquí hacemos una abstracción adicional y utilizamos declaraciones de rama como switch para distinguir las operaciones y los datos que se operarán en función de los parámetros de solicitud, de modo que no sea necesario escribir cada operación como una interfaz por separado.
No entraré en detalles sobre cómo agregar, eliminar y verificar código. Simplemente eche un vistazo a la documentación oficial de ES Node, luego abra el código en el Repositorio de navegación de programación (/Li UPI/code-nav).
Después de escribir el código, puede utilizar la herramienta de línea de comandos tcb que viene con el desarrollo en la nube para ejecutar la función localmente.
Recuerde cambiar primero la dirección de conexión de ES a la red pública y luego ingresar una línea de comando. Por ejemplo, necesitamos insertar un dato en ES y pasar el nombre, los parámetros de solicitud y la ruta del código de la función que se ejecutará:
Después de una ejecución exitosa, puede ver los datos recién insertados en ES (a través del panel Kibana o curl):
Después de probar el código de servicio público localmente, cambie la dirección de conexión de ES a la IP de la intranet y luego publíquela en la nube.
A continuación, intente escribir otra función para acceder al servicio público *** ES, como insertar recursos en ES y solicitar llamando a la función:
Sin embargo, los datos no se obtuvieron correctamente insertado, pero devuelto Se agotó el tiempo de espera de la interfaz. ¿Por qué?
Se sabe por el registro que ES no puede conectarse. ¿Será porque la máquina donde se publican online los servicios públicos de ES no está en la misma intranet que ES?
Por lo tanto, debe cambiar la configuración de red privada del servicio público de ES en la consola de desarrollo en la nube y seleccionar la misma subred que cuando compró el ES:
Configurar el ES red privada de función de nube
Después de la modificación, el servicio ES se solicita nuevamente de forma remota y los datos se insertan con éxito ~
Después de desarrollar el servicio público ES, puede escribir una lógica empresarial específica.
Primero, cree un índice en ES (similar a una tabla de base de datos) y especifique información como el tipo de datos, segmentación de palabras, etc., en lugar de permitir la inserción arbitraria de datos.
Por ejemplo, para que la búsqueda sea más flexible, debe especificar el nombre del recurso como tipo "texto" para activar la segmentación de palabras y especificar la segmentación de palabras en chino ik:
Es mejor especificar un alias para el índice para que pueda usarse más adelante. El índice se puede reconstruir al modificar campos:
Después de escribir la configuración json del índice, solo necesita llamar. la nueva interfaz de índice de ES a través de curl o Kibana.
En el pasado, los datos de recursos de los sitios web de navegación de programación se almacenaban en la base de datos y los usuarios realizaban consultas desde la base de datos. Ahora, si desea consultar desde ES, ES no puede estar vacío, por lo que debe encontrar una manera de sincronizar los datos de recursos en la base de datos con ES.
Existen varias estrategias de sincronización.
Antes, los recursos recomendados por los usuarios sólo se insertaban en la base de datos. La escritura doble significa que cuando se insertan recursos en la base de datos, es debe insertarse al mismo tiempo.
Suena simple, pero hay algunos problemas con este enfoque:
¿Existe una forma menos intrusiva de acceder al código existente?
Si los requisitos de datos en tiempo real no son altos, puede elegir la sincronización programada para copiar los datos recién insertados o modificados en la base de datos a ES a intervalos regulares.
Hay muchas formas de implementarlo, como utilizar la canalización de transmisión de datos de Logstash o escribir un programa de tareas programadas usted mismo, sin modificar el código existente en absoluto.
Si los requisitos de datos en tiempo real son muy altos y los datos recién insertados en la base de datos se pueden buscar inmediatamente, entonces se requiere sincronización en tiempo real. Además de la escritura doble, también podemos monitorear el binlog de la base de datos y podemos sentir cualquier cambio en la base de datos.
Alibaba tiene un proyecto de código abierto llamado Canal, que puede monitorear la base de datos MySQL en tiempo real y enviar notificaciones hacia abajo. Los amigos interesados pueden echar un vistazo.
Proyecto Canal
Debido a que la búsqueda de recursos del programa no requiere un alto rendimiento en tiempo real, es posible la sincronización programada.
El desarrollo en la nube proporciona una función de sincronización de forma predeterminada, por lo que escribiré directamente una función en la nube para ejecutarla cada 1 minuto y leeré los datos que han cambiado en la base de datos en los últimos 5 minutos cada vez para evitar la última fallo de ejecución. Además, se debe configurar un tiempo de espera para evitar que la función tarde demasiado y provoque un error.
Se puede configurar visualmente en Cloud Development-Cloud Function Console. Debe especificar una expresión crontab para la tarea programada:
Configurar el tiempo de espera y el tiempo de espera de la función de la nube
Después de iniciar la sincronización programada, no olvide escribir y ejecutar la primera función de sincronización. , que utiliza para sincronizar todos los datos históricos con ES.
Ahora que hay datos en ES, solo queda el último paso, ¿cómo buscar los datos?
En primer lugar, necesitamos aprender la búsqueda DSL (sintaxis) de ES, incluido cómo obtener columnas, buscar, filtrar, paginar, ordenar, etc. Para los principiantes, todavía es un poco problemático, especialmente la combinación de expresiones booleanas en las condiciones de consulta. Si no tiene cuidado, no podrá encontrar los datos. Por lo tanto, se recomienda que primero escriba la sintaxis de la consulta en la herramienta de depuración proporcionada por Kibana:
Depuración de Kibana
Después de encontrar los datos esperados, escriba la función de búsqueda de backend para aceptar la solicitud. Los parámetros deben ser consistentes con la interfaz original para reducir los cambios.
La sintaxis de la consulta se puede empalmar dinámicamente de acuerdo con la solicitud de front-end, como buscar por nombre de recurso:
Para completar la optimización de búsqueda de todo el sitio web.
Pruebe el efecto nuevamente. ¡Ahora puedes encontrarlo incluso escribiendo algunas palabras con muchos "peces"!
El lanzamiento de la nueva interfaz de búsqueda de ES no significa que la antigua interfaz de consulta de la base de datos esté obsoleta; se puede conservar al mismo tiempo. La nueva interfaz es más flexible cuando se buscan recursos por nombre; cuando se buscan recursos publicados por el usuario según el estado de la revisión, la interfaz anterior se puede utilizar para verificar desde la base de datos. ¡De este modo se comparte la carga, se separan las responsabilidades y se deja que la tecnología adecuada haga lo correcto!
Soy Yupi. Finalmente, te enviaré algunos materiales de aprendizaje para ayudarme a conseguir una oferta de un gran fabricante:
Instrucciones: https://t.1yb.co/. qOJG
Bienvenido a leer sobre mi experiencia de aprender programación Tencent desde cero, realizar prácticas, buscar empleo, exámenes de certificación y escribir libros.
Descripción: https://t.1yb.co/w66s.