2009-04-14 7 views
16

Ich habe kürzlich an einigen Datenbank-Suchfunktionen gearbeitet und wollte einige Informationen wie die durchschnittlichen Wörter pro Dokument (z. B. Textfeld in der Datenbank) erhalten. Das einzige, was ich bisher gefunden (ohne Verarbeitung in der Sprache der Wahl außerhalb des DB) ist:Verwenden von SQL zum Ermitteln der Anzahl der Wörter in einem Textfeld

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

Dies scheint * zu arbeiten, aber haben Sie andere Vorschläge? Ich benutze derzeit MySQL 4 (hoffentlich bald auf Version 5 für diese App wechseln), bin aber auch an allgemeinen Lösungen interessiert.

Danke!

* Ich kann mir vorstellen, dass dies eine ziemlich grobe Art ist, dies zu bestimmen, da es HTML im Inhalt und ähnlichem nicht berücksichtigt. Das ist in Ordnung für dieses spezielle Projekt, aber gibt es wieder bessere Möglichkeiten?

Update: Um zu definieren, was ich mit "besser" meine: entweder genauer, führt effizienter aus, oder ist mehr "korrekt" (einfach zu pflegen, gute Praxis, etc). Für den Inhalt, den ich zur Verfügung habe, ist die obige Abfrage schnell genug und ist genau für dieses Projekt, aber ich brauche vielleicht etwas Ähnliches in der Zukunft (so fragte ich).

+0

Sie müssen "besser" definieren –

Antwort

33

Die Textverarbeitungsfunktionen von MySQL sind nicht gut genug für das, was Sie wollen. Eine gespeicherte Funktion ist eine Option, wird aber wahrscheinlich langsam sein. Die beste Möglichkeit, die Daten innerhalb von MySQL zu verarbeiten, besteht darin, eine user defined function hinzuzufügen. Wenn Sie sowieso eine neuere Version von MySQL erstellen möchten, können Sie auch eine native function hinzufügen.

Der "richtige" Weg besteht darin, die Daten außerhalb der DB zu verarbeiten, da DBs für die Speicherung, nicht für die Verarbeitung und jede schwere Verarbeitung das DBMS zu sehr belasten. Darüber hinaus macht es die Berechnung der Wortzahl außerhalb von MySQL einfacher, die Definition dessen, was als Wort zählt, zu ändern. Wie wäre es, die Wortzahl in der Datenbank zu speichern und sie zu aktualisieren, wenn ein Dokument geändert wird?

Beispiel gespeicherte Funktion:

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

Dies ist ein bisschen schneller, wenn auch nur geringfügig weniger genau. Ich fand es 4% Licht auf die Anzahl, was für "Schätzung" Szenarien OK ist.

SELECT 
    ROUND ( 
     (
      CHAR_LENGTH(content) - CHAR_LENGTH(REPLACE (content, " ", "")) 
     ) 
     /CHAR_LENGTH(" ")   
    ) AS count  
FROM documents 
Verwandte Themen