tipos funciones busquedas almacenamiento mysql performance relevance full-text-search

busquedas - funciones de mysql workbench



La relevancia de búsqueda de texto completo se mide en? (3)

Estoy haciendo un sistema de cuestionarios, y cuando los cuestionarios inserten preguntas en el Banco de preguntas, debo verificar las preguntas duplicadas / muy similares en la base de datos.

Al probar MySQL''s MATCH () ... AGAINST () , la mayor relevancia que obtengo es 30+, cuando pruebo contra una cadena 100% similar.

Entonces, ¿cuál es exactamente la relevancia? Para citar el manual :

Los valores de relevancia son números de coma flotante no negativos. Cero relevancia significa que no hay similitud. La relevancia se calcula en función del número de palabras en la fila, el número de palabras únicas en esa fila, el número total de palabras en la colección y el número de documentos (filas) que contienen una palabra en particular.

Mi problema es cómo probar el valor de relevancia si una cadena es un duplicado. Si es 100% duplicado, evite que se inserte en el banco de preguntas. Pero si solo es similar, solicite al concursante que verifique, inserte o no. Entonces, ¿cómo hago eso? Más de 30 para una cadena 100% idéntica no es un porcentaje, entonces estoy tocón.

Gracias por adelantado.


La estructura de datos básicos para un sistema de recuperación de texto es un índice invertido . Esta es esencialmente una lista de palabras encontradas en la colección de documentos con una lista de los documentos en los que aparecen. También puede tener metadatos sobre la ocurrencia de cada documento, como el número de veces que aparece la palabra.

Los documentos que contienen las palabras se pueden consultar haciendo coincidir los términos de búsqueda. Para determinar la relevancia, se calcula una heurística conocida como Clasificación de Coseno en los aciertos. Esto funciona construyendo un vector n-dimensional con un componente para cada uno de los n términos de búsqueda. También puede ponderar los términos de búsqueda si lo desea. Este vector da un punto en el espacio n-dimensional que corresponde a sus términos de búsqueda.

Se puede construir un vector similar basado en las ocurrencias ponderadas en cada documento a partir del índice invertido con cada eje en el vector correspondiente con el eje para cada término de búsqueda. Si calcula un producto escalar de estos vectores, obtendrá el coseno del ángulo entre ellos. 1.0 es equivalente a cos (0), lo que supondría que los vectores ocupan una línea común desde el origen. Cuanto más cerca estén los vectores, menor será el ángulo y más cerca estará el coseno de 1.0.

Si clasifica los resultados de búsqueda por el coseno (o los coloca en una cola de prioridad como mg lo hace), obtiene los más relevantes. Los algoritmos de relevancia de Cleverer tienden a jugar con los pesos de los términos de búsqueda, sesgando el producto de puntos a favor de términos con alta relevancia.

Si desea profundizar un poco, Managing Gigabytes de Bell y Moffet analiza la arquitectura interna de los sistemas de recuperación de texto.


No conozco los detalles de la función MySQL que está utilizando, pero me imagino que podría ser que no haya un significado absoluto para esos números; solo están diseñados para ser comparados con otros valores producidos por la misma función. Para verificar si hay una coincidencia absoluta, puede seleccionar el texto y compararlo manualmente.


andygeers está en el camino correcto: esos números no tienen otro significado empírico más que sus relaciones entre sí y no pueden usarse por sí mismos para determinar qué es o no es una "coincidencia exacta". Debe determinarlo usted mismo. Incluso aparte de las limitaciones de la clasificación de búsqueda de texto completo, también está la pregunta abierta de lo que usted considera que constituye una "coincidencia exacta". (¿El texto real es el único o el soundex coincide? ¿Los sinónimos (p. Ej., "Sofá" vs. "sofá") cuentan como coincidentes o distintos? ¿Se debe intentar compensar las faltas de ortografía? Etc.)

Si tuviera la necesidad de realizar dicha comprobación, tomaría solo la entrada de mayor clasificación devuelta por la búsqueda de texto completo, eliminaría cualquier palabra vacía designada, normalizaría el espacio en blanco, convertiría a minúscula, haría la comparación y lo dejaría así hasta que me encontrara un caso que requería que se refinara aún más. En realidad, no se trata de mucho trabajo adicional: si especifica el idioma que está utilizando para su aplicación, probablemente pueda encontrar a alguien por aquí que pueda escribir la función de normalización en una docena de líneas de código.