¿Existen herramientas de código abierto o comerciales disponibles que permitan la indexación de fragmentos de texto de los contenidos de la base de datos y puedan consultarse desde Java?Cómo buscar fragmentos de texto en una base de datos
Antecedentes de la pregunta es una gran tabla de base de datos MySQL con varios cientos de miles de registros, que contiene varias columnas VARCHAR. En estas columnas, a las personas les gustaría buscar fragmentos de los contenidos, por lo que un índice de texto completo (que se basa en límites de palabras) no ayudaría.
EDITAR: [Agregado a dejar claro por qué estas primeras sugerencias no resolverían el problema:]
Esta es la razón de MySQL construido en el índice de texto completo no va a hacer el trabajo, y tampoco lo hará Lucene o Sphinx, toda de los cuales fueron sugeridos en las respuestas. Ya analicé ambos, pero hasta donde puedo decir, estos están basados en la indexación palabras, excluyendo palabras de parada y haciendo todo tipo de cosas sensatas para una búsqueda de texto completo real. Sin embargo, esto no es adecuado, porque podría estar buscando un término de búsqueda como "oison" que debe coincidir con "Roisonic Street" y con "Poison-Ivy". La diferencia clave aquí es que el término de búsqueda es solo un fragmento del contenido de la columna, que no tiene que estar delimitado por ningún carácter especial o espacio en blanco.
Edit2: [Agregado algo más de información de fondo:] La función solicitada que se va a implementar en base a esto es una búsqueda muy suelto para descripciones de los artículos en un sistema de gestión de mercancías. Los usuarios a menudo no conocen el número de artículo correcto, sino solo una parte del nombre del artículo. Lamentablemente, la calidad de estas descripciones es bastante baja, provienen de un sistema heredado y no se puede cambiar fácilmente. Si, por ejemplo, las personas buscaran un mazo entrarían en "trineo". Con un índice basado en palabras/tokens esto no encontraría las coincidencias que se almacenan como "mazo", pero solo aquellos escuchan "mazo de trineo". Hay todo tipo de variaciones extrañas que deben cubrirse, por lo que un enfoque basado en tokens no es práctico.
Actualmente, lo único que podemos hacer es una consulta LIKE '%searchterm%'
, lo que desactiva efectivamente el uso de cualquier índice y requiere muchos recursos y tiempo.
Idealmente, cualquier herramienta de este tipo crearía un índice que me permitiera obtener resultados de tales consultas muy rápidamente, para poder implementar una búsqueda tipo foco, solo recuperando los datos "reales" de la tabla MySQL mediante la clave primaria cuando un usuario elige un registro de resultados.
Si es posible, el índice debe ser actualizable (sin necesidad de una reconstrucción completa), ya que los datos podrían cambiar y deberían estar disponibles para la búsqueda inmediata por parte de otros clientes.
Estaría encantado de recibir recomendaciones y/o informes de experiencia.
Edit3: Solución Comercial encontró que "simplemente funciona" A pesar de que tengo un montón de buenas respuestas para esta pregunta, quería señalar aquí, que al final nos fuimos con un producto comercial llamado "búsqueda rápida" , fabricado y vendido por una empresa alemana llamada "HMB Datentechnik". Tenga en cuenta que estoy no afiliado a ellos de alguna manera, porque podría aparecer así cuando continúe y describa lo que su producto puede hacer. Desafortunadamente, su website parece bastante malo y solo es alemán, pero el producto en sí es realmente genial. Actualmente tengo una versión de prueba de ellos, tendrás que contactarlos, no hay descargas, y estoy muy impresionado.
Como no hay documentación completa disponible en línea, intentaré y describiré mis experiencias hasta ahora.
Lo que hacen es crear un archivo de índice personalizado basado en el contenido de la base de datos. Se pueden integrar a través de ODBC, pero por lo que me dicen, los clientes rara vez lo hacen. En su lugar, y esto es lo que probablemente haremos, usted genera una exportación de texto (como CSV) desde su base de datos primaria y la envía a su indexador. Esto le permite ser completamente independiente de la estructura de la tabla real (o cualquier base de datos SQL); de hecho, exportamos datos unidos desde varias tablas. Los índices se pueden actualizar progresivamente más adelante sobre la marcha.
Basado en que su servidor (de unos 250kb aproximadamente, ejecutándose como una aplicación de consola o servicio de Windows) sirve para escuchar las consultas en un puerto TCP. El protocolo está basado en texto y parece un poco "viejo", pero es simple y funciona. Básicamente, acaba de transmitir cuáles de los índices disponibles desea consultar y los términos de búsqueda (fragmentos), delimitados por espacios. Hay tres formatos de salida disponibles, matriz HTML/JavaScript, XML o CSV. Actualmente estoy trabajando en un contenedor Java para el protocolo de cable algo "anticuado". Pero los resultados son fantásticos: actualmente tengo un conjunto de datos de muestra de aproximadamente 500,000 registros con 8 columnas indexadas y mi aplicación de prueba desencadena una búsqueda en las 8 columnas para el contenido de un JTextField en cada golpe de teclado mientras se edita y puede actualizar el visualización de resultados (JTable) en tiempo real! Esto sucede sin ir a la instancia de MySQL de donde provienen los datos. Según las columnas que recibe, puede solicitar el registro "original" consultando MySQL con la clave principal de esa fila (debe incluirse en el índice QuickFind, por supuesto).
El índice es aproximadamente 30-40% del tamaño de la versión de exportación de texto de los datos. La indexación estaba principalmente vinculada a la velocidad de E/S del disco; mis 500,000 registros tomaron aproximadamente uno o dos minutos para procesarse.
Es difícil describir esto, ya que me resultó difícil de creer cuando vi una demostración de un producto interno. Presentaron una base de datos de direcciones de 10 millones de filas y buscaron fragmentos de nombres, direcciones y números de teléfono y al presionar el botón "Buscar", los resultados regresaron en menos de un segundo, todo en un cuaderno. Por lo que me dicen, a menudo se integran con sistemas SAP o CRM para mejorar los tiempos de búsqueda cuando los agentes del centro de llamadas solo entienden los fragmentos de los nombres o las direcciones de una persona que llama.
De todos modos, probablemente no lo describiré mucho mejor. Si necesita algo como esto, definitivamente debe ir a ver esto. Google Translate hace un trabajo razonablemente bueno al traducir su sitio web del alemán al inglés, por lo que este podría ser un buen comienzo.
agregó un párrafo después de que aparecieron las primeras sugerencias, haciendo referencia a las herramientas de búsqueda de texto completo. con suerte, esto aclara mi problema. –
Se agregó otro párrafo con más antecedentes –
lucene hace coincidencias de subcadenas ... – Stobor