¿Por qué Lucene es malo?
Antes de criticarlo, debo reconocer que Lucene es un buscador de graffitis de alto rendimiento. Durante varios años, Lucene ha sido tratado como un ciudadano de primera clase entre los motores de búsqueda integrados escritos en Java. Su reputación crece rápidamente cada día y sigue siendo el mejor entre los motores de búsqueda Java de código abierto. Todo el mundo decía: "Doug Kadin está haciendo un gran trabajo". Pero el desarrollo se ha ralentizado en los últimos meses y no creo que Lucene satisfaga las necesidades del procesamiento de documentos moderno. No lo arruines: no soy un desarrollador de motores de búsqueda, solo soy un desarrollador que utiliza motores de búsqueda para proporcionar técnicas de recuperación de la información adecuada.
Lucene no es la mejor opción, al menos para nosotros, y la situación no ha cambiado. Enumeramos las limitaciones de Lucene: Lingway genera consultas complejas basadas en semántica. Por ejemplo, cuando busque artículos sobre conflictos en el Medio Oriente, es posible que también desee buscar artículos sobre la guerra en Irak. En el caso de uso anterior, "Guerra" e "Irak" son extensiones de "Conflicto" y "Medio Oriente", respectivamente. Utilizamos una tecnología para analizar tus consultas, generar las extensiones más adecuadas y generar consultas para las mismas. Sin embargo, para obtener resultados relevantes, esto no es suficiente: ni los niveles similares a los de Google logrados a través de Lucene ni los niveles con puntos que cambian con frecuencia satisfacen los puntos de nivel semántico. Por ejemplo, las frases que contienen "中" y "东" pero están separadas por más de una palabra no son lo que queremos encontrar. Es más, deberíamos dar a las expansiones puntuaciones más bajas que a las palabras normales. Por ejemplo, deberíamos dar una puntuación más alta a la frase "conflicto en el Medio Oriente" que a "guerra en Irak".
En Lingwei, creemos que la tecnología relevante de este artículo es el motor de búsqueda del futuro. Google hace un gran trabajo con la búsqueda de artículos. Pero queremos los artículos más relevantes. Sin embargo, la mayoría de los motores de búsqueda contemporáneos no diseñan consultas tan complejas... Wikipedia utiliza Lucene. Si nota que cuando consulta una palabra, la mayoría de los resultados de la consulta son irrelevantes...
Para fines de demostración, la siguiente es una captura de pantalla de la interfaz del próximo producto KM3.7 de Lingwei. Aquí escribimos una consulta en francés para encontrar artículos escritos en inglés sobre el mismo tema. Tenga en cuenta que esto no es solo una traducción simple, lo llamamos un modelo entre idiomas:
Observe esas coincidencias verdes: el cantante se convirtió en cantante, pero también descubrimos que el canto coincidía. Asimismo, la música pop se convirtió en una extensión del blues.
6 Dalí no eligió Lucene.
6. No hay soporte integrado para la agrupación.
Si crea un clúster, puede escribir la implementación del Directorio usted mismo o usar Solr o Nutch+Hadoop. Tanto Solr como Nutch admiten Lucene, pero no son reemplazos directos. Lucene es integrable, tienes que admitir Solr y Nutch... Creo que no sorprende que Hadoop provenga del equipo de Lucene: Lucene no es universal. Su naturaleza inherente lo hace muy rápido en la mayoría de situaciones, pero para grandes colecciones de documentos hay que descartar Lucene. Debido a que no está en un clúster a nivel de kernel, debe convertir Lucene a otros motores de búsqueda, lo cual no es sencillo. El problema de cambiar a Solr o Nutch le provocará muchos problemas innecesarios: la integración del rastreo en Nutch y los servicios de recuperación en Solr.
5. La consulta de intervalo es demasiado lenta.
Esto puede ser un problema especial de Lingwei Company. Tenemos una fuerte demanda de consultas de intervalo y la estructura de búsqueda de Lucene ha comenzado a agregar este detalle, pero al principio no lo pensaron. La implementación más básica da como resultado algoritmos complejos y un funcionamiento lento, especialmente cuando algunas frases se repiten varias veces en un documento. Es por eso que me inclino a decir que Lucene es un motor de recuperación de accidentes cerebrovasculares de alto rendimiento cuando solo se utilizan consultas booleanas básicas.
4. Los puntos no pueden ser complementos.
Lucene tiene su propia implementación de algoritmo de integración, utilizando clases de similitud cuando las condiciones aumentan. Sin embargo, muestra rápidamente sus limitaciones cuando desea expresar integraciones complejas, como consultas basadas en coincidencias y metadatos reales. Si hace esto, debe heredar la clase de consulta de Lucene. Sin embargo, debido a que Lucene utiliza un algoritmo de integración similar a tf/idf, en la situación que encontramos, el mecanismo de integración de Lucene no es adecuado para la integración semántica. Nos vimos obligados a reescribir cada clase de consulta de Lucene para respaldar nuestros puntos personalizados. Esto es un problema.
3. Lucene no es un buen diseño
Como arquitecto de sistemas, tiendo a pensar que (1) el diseño OO de Lucene es muy malo. Aunque existen paquetes y clases, casi no existen patrones de diseño. Esto me recuerda el comportamiento de los desarrolladores de C++ que trajeron malos hábitos a Java. Esto crea un problema que debes enfrentar cuando necesites personalizar Lucene para satisfacer tus propias necesidades (que definitivamente encontrarás en el futuro). Por ejemplo:
<! -【¡si! Lista de soporte]-><! -[endif]->Casi no se utilizan interfaces. Las clases de consulta (como consultas booleanas, consultas de extensión, consultas $TERM...) son todas subclases de clases abstractas. Si desea agregar uno de estos detalles, primero pensaría en escribir una interfaz para describir su contrato de extensión, pero la clase de consulta abstracta no implementa esta interfaz. Siempre debe cambiar el objeto de consulta a una consulta y llamarlo en Lucene local. Un montón de ejemplos como (HitCollecor,...) también son problemas al utilizar AOP y proxies automáticos.
<! -【¡si! Lista de soporte]-><! -[endif]-> Implementación de iteración torpe. Si no existe un método hasNext(), el método Next() devuelve un tipo booleano y actualiza el contenido del objeto. Es muy doloroso para usted realizar un seguimiento de los elementos sobre los que itera. Supongo que esto se hace a propósito para ahorrar memoria, pero nuevamente esto da como resultado un algoritmo confuso y complejo.
2. La API cerrada hace que heredar Lucene sea doloroso.
En el mundo de Lucene, esto se llama característica. Cuando algunos usuarios necesitan obtener algunos detalles, la estrategia está abierta al público. Esto da como resultado que la mayoría de las clases estén protegidas por paquetes, lo que significa que no puedes heredar de ellas (a menos que crees algo similar al mismo paquete, lo que contaminaría el código del cliente) o tienes que copiar y reescribir el código. Es más, como se mencionó anteriormente, esta estructura falta gravemente en el diseño OO. Algunas clases deberían establecerse como clases internas, pero no lo son. Las clases anónimas se utilizan para cálculos complejos cuando es necesario anular su comportamiento. El motivo para cerrar la API es hacer que el código esté limpio y estable antes de su lanzamiento. La idea, aunque gloriosa, volvió a resultar dolorosa. Porque si tienes algún código que no se ajusta a la idea principal de Lucene, siempre debes volver a Lucene para mejorar tu propia versión hasta que tu parche sea aceptado.
Sin embargo, cuando los desarrolladores comienzan a restringir los cambios de API durante períodos de tiempo cada vez más largos, las posibilidades de que su parche sea aceptado se reducen. Agregar un modificador final a algunas clases y métodos puede causarle problemas. Si el marco Spring tuviera tales limitaciones, no creo que se hiciera popular.
<! -【¡si! Lista de soporte]->1.? El algoritmo de búsqueda de Lucene no es adecuado para la computación grid
Cuando se escribió Lucene, el hardware no tenía mucha memoria y no existían multiprocesadores. Por lo tanto, la estructura del índice está diseñada para utilizar memoria lineal con poca sobrecarga. Pasé mucho tiempo reescribiendo el algoritmo de consulta de intervalo para usar elementos de subprocesos múltiples (usando un procesador de doble núcleo), pero el algoritmo de lectura de directorio basado en iteradores es casi imposible. En algunos casos excepcionales, puede realizar algunas optimizaciones e iterar sobre un índice en paralelo, pero en la mayoría de los casos esto no es posible. Tenemos una situación en la que cuando tenemos una consulta compleja con intervalos de inserción de más de 5, la CPU permanece inactiva pero la E/S siempre está ocupada. ¿Oso? No sé nada sobre AMDirectory.
¿Existen alternativas?
Creo que el último punto está lleno de dudas: Lucene ha alcanzado su límite en la búsqueda de grandes conjuntos de datos en las condiciones actuales basadas en hardware. Esta es también la razón por la que estoy buscando la próxima alternativa a Lucene.
Después de leer las discusiones en el directorio de blogs y en Wikia, descubrí que no hay muchas alternativas. Pero finalmente recomiendo una solución prometedora: MG4J. Tiene un buen diseño orientado a objetos, buen rendimiento de recuperación (la indexación es más lenta que Lucene) y la sobrecarga de memoria también es muy pequeña, alcanzando 10 veces la velocidad de consulta de Lucene. Según mi punto de referencia de consultas de extensión, admite la agrupación en clústeres de forma nativa. También tiene equilibrio de carga incorporado, que se agregó recientemente a Lucene y es experimental. Sin embargo, MG4J todavía carece de algunas funciones, como una indexación sencilla, la eliminación de documentos y un uso más sencillo del procesamiento de índices. Lo que me hace feliz es que puedo personalizar la funcionalidad de Lucene. Sólo se necesitan unas horas en MG4J pero unos días en Lucene.
Creo que todavía hay espacio para el desarrollo de motores de búsqueda de código abierto. En lugar de indexar un lote de documentos con memoria limitada en una sola computadora, proporciona respuestas más rápidas a grandes conjuntos de datos a través de una indexación distribuida transparente. No es necesario utilizar una aplicación para obtener la funcionalidad del clúster. Lucene tiene una buena implementación del primer tipo de motor de búsqueda, pero no creo que cubra nuestras necesidades: encontrar la mejor respuesta en un tiempo razonable. El algoritmo de búsqueda basado en tf/idf y el ranking de Google no son la tendencia de los motores de búsqueda del futuro. Lo completa Lingwei Company (a través de tecnología de motores de búsqueda como Lucene) para implementar consultas complejas sobre datos originales y semántica para encontrar información relevante, pero se necesitan más tecnologías nuevas para admitir nuevo hardware.
Una buena razón para usar Lucene
No importa cuánto culpe a Lucene, sigue siendo la mejor implementación entre las soluciones de código abierto de Java.