2009-04-14 11 views
16

Recientemente he estado trabajando en algunas funcionalidades de búsqueda de bases de datos y quería obtener información como las palabras promedio por documento (por ejemplo, campo de texto en la base de datos). La única cosa que he encontrado hasta el momento (sin procesamiento en el idioma de su elección fuera de la DB) es:Utilizando SQL para determinar las estadísticas del campo de texto

SELECT AVG(LENGTH(content) - LENGTH(REPLACE(content, ' ', '')) + 1) 
FROM documents 

Esto parece funcionar * pero, ¿tienes otra sugerencia? Actualmente estoy usando MySQL 4 (espero pasar pronto a la versión 5 para esta aplicación), pero también estoy interesado en soluciones generales.

Gracias!

* Me imagino que esta es una forma bastante aproximada de determinar esto, ya que no cuenta para HTML en el contenido y similares también. Eso está bien para este proyecto en particular, pero de nuevo ¿hay mejores formas?

Actualización: Para definir lo que quiero decir con "mejor": ya sea más preciso, funciona de manera más eficiente o es más "correcto" (fácil de mantener, buenas prácticas, etc.). Para el contenido que tengo disponible, la consulta anterior es lo suficientemente rápida y precisa para este proyecto, pero es posible que necesite algo similar en el futuro (por lo que pregunté).

+0

Debes definir "mejor" –

Respuesta

33

Las capacidades de manejo de texto de MySQL no son lo suficientemente buenas para lo que desea. Una función almacenada es una opción, pero probablemente será lenta. Su mejor apuesta para procesar los datos dentro de MySQL es agregar un user defined function. Si va a construir una versión más nueva de MySQL de todos modos, también puede agregar un native function.

La forma "correcta" es procesar los datos fuera del DB, ya que los DB son para almacenamiento, no para procesamiento, y cualquier procesamiento pesado puede generar demasiada carga en el DBMS. Además, calcular el recuento de palabras fuera de MySQL hace que sea más fácil cambiar la definición de lo que cuenta como una palabra. ¿Qué hay de almacenar el conteo de palabras en el DB y actualizarlo cuando se cambia un documento?

Ejemplo función almacenada:

DELIMITER $$ 
CREATE FUNCTION wordcount(str TEXT) 
     RETURNS INT 
     DETERMINISTIC 
     SQL SECURITY INVOKER 
     NO SQL 
    BEGIN 
    DECLARE wordCnt, idx, maxIdx INT DEFAULT 0; 
    DECLARE currChar, prevChar BOOL DEFAULT 0; 
    SET maxIdx=char_length(str); 
    WHILE idx < maxIdx DO 
     SET currChar=SUBSTRING(str, idx, 1) RLIKE '[[:alnum:]]'; 
     IF NOT prevChar AND currChar THEN 
      SET wordCnt=wordCnt+1; 
     END IF; 
     SET prevChar=currChar; 
     SET idx=idx+1; 
    END WHILE; 
    RETURN wordCnt; 
    END 
$$ 
DELIMITER ; 
1

Esto es un poco más rápido, aunque sólo un poco menos precisa. Encontré 4% de luz en el recuento, lo cual está bien para los escenarios "estimados".

SELECT 
    ROUND ( 
     (
      CHAR_LENGTH(content) - CHAR_LENGTH(REPLACE (content, " ", "")) 
     ) 
     /CHAR_LENGTH(" ")   
    ) AS count  
FROM documents 
Cuestiones relacionadas