복붙노트

[SQL] 텍스트 필드의 단어 수 통계를 결정하기 위해 SQL을 사용하여

SQL

텍스트 필드의 단어 수 통계를 결정하기 위해 SQL을 사용하여

나는 최근에 일부 데이터베이스 검색 기능에 노력하고 (데이터베이스, 예를 들어 텍스트 필드) 일부 문서 당 평균 단어와 같은 정보를 얻을 싶어했습니다. 나는 (DB를 외부 선택의 언어로 처리하지 않고) 지금까지 발견 한 유일한 것은입니다 :

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

이 *이 작동하는 것 같다하지만 당신은 다른 제안을해야합니까? 나는 현재 (곧이 응용 프로그램의 버전 5로 이동 희망)의 MySQL 4를 사용하고, 또한 일반적으로 솔루션에 관심이 있어요.

감사!

* 나는 이것이 그뿐만 아니라 같은 내용에 HTML을 차지하지 않기 때문에이 문제를 결정하는 매우 거친 방법이라는 것을 상상할 수있다. 즉,이 특정 프로젝트에 대한 확인이다 그러나 다시 거기에 더 나은 방법은?

업데이트 : 더 효율적으로, 하나 더 정확한 수행을, 또는 그 이상의 "올바른"(쉬운 유지하기 위해, 좋은 습관, 등)이다 : 나는 "더 나은"무슨 뜻인지 정의합니다. 나는 가능한 컨텐츠를 들어, 쿼리는 위의 충분히 빨리이며,이 프로젝트에 대한 정확하지만 (내가 물었다 그래서) 나는 미래에 비슷한해야 할 수도 있습니다.

해결법

  1. ==============================

    1.MySQL을 텍스트 처리 기능은 당신이 원하는 좋은 충분하지 않습니다. 스토어드 함수는 옵션이지만, 아마도 느린 것입니다. MySQL의 내의 데이터를 처리하는 가장 좋은 방법은 사용자 정의 함수를 추가하는 것입니다. 어쨌든 MySQL의 최신 버전을 만들려고하는 경우에, 당신은 또한 고유의 기능을 추가 할 수 있습니다.

    MySQL을 텍스트 처리 기능은 당신이 원하는 좋은 충분하지 않습니다. 스토어드 함수는 옵션이지만, 아마도 느린 것입니다. MySQL의 내의 데이터를 처리하는 가장 좋은 방법은 사용자 정의 함수를 추가하는 것입니다. 어쨌든 MySQL의 최신 버전을 만들려고하는 경우에, 당신은 또한 고유의 기능을 추가 할 수 있습니다.

    은 "올바른"방법은 DB를하지 처리, 저장되기 때문에 DB 외부 데이터를 처리하고, 무거운 처리는 DBMS에 부하가 너무 많이 넣을 수 있습니다. 또한, MySQL을의 단어 수의 외부를 계산하는 것은 쉬운 단어로 계산 무엇의 정의를 변경할 수 있습니다. 어떻게 DB에있는 단어 수를 저장하고 문서가 변경 될 때 업데이트에 대한?

    예 기억 기능 :

    DELIMITER $$
    CREATE FUNCTION wordcount(str LONGTEXT)
           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);
        SET idx = 1;
        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 ;
    
  2. ==============================

    2.하지만 이것은 단지 조금, 아주 조금 더 빨리 덜 정확하다. 나는 "추정"시나리오에 대한 확인을 인 수,에 4 %의 빛을 발견했다.

    하지만 이것은 단지 조금, 아주 조금 더 빨리 덜 정확하다. 나는 "추정"시나리오에 대한 확인을 인 수,에 4 %의 빛을 발견했다.

    SELECT
        ROUND (   
            (
                CHAR_LENGTH(content) - CHAR_LENGTH(REPLACE (content, " ", "")) 
            ) 
            / CHAR_LENGTH(" ")        
        ) AS count    
    FROM documents
    
  3. ==============================

    3.당신은 https://github.com/spachev/mysql_udf_bundle에서 WORD_COUNT () UDF를 사용할 수 있습니다. 나는 내 코드는 라틴 문자 집합을 지원하는 차이로 허용 대답에서 논리를 포팅. 논리는 다른 문자 집합을 지원하기 위해 재 작업해야합니다. 예를 들어 "선생님의 책"모두 구현하여 세 단어로 간주됩니다 - 또한, 모두 구현은 항상 항상 바람직가되지 않을 수 있습니다 분리 문자로 영숫자가 아닌 문자를 고려한다.

    당신은 https://github.com/spachev/mysql_udf_bundle에서 WORD_COUNT () UDF를 사용할 수 있습니다. 나는 내 코드는 라틴 문자 집합을 지원하는 차이로 허용 대답에서 논리를 포팅. 논리는 다른 문자 집합을 지원하기 위해 재 작업해야합니다. 예를 들어 "선생님의 책"모두 구현하여 세 단어로 간주됩니다 - 또한, 모두 구현은 항상 항상 바람직가되지 않을 수 있습니다 분리 문자로 영숫자가 아닌 문자를 고려한다.

    UDF 본 버전은 속도가 매우 빠르고, 물론입니다. 빠른 테스트를 위해 나는 3기가바이트에 대해 총 9751 개 기록 구성된 프로젝트 Guttenberg에서 데이터 세트에 모두를 시도했다. 저장 기능은 30 기록 (UDF 0.05 초 않는다) 처리 63 초 걸렸 동안 UDF는 18 초에 그들 모두를했다. 그래서 UDF는 약 1000 배 빠른이 경우입니다.

    UDF는 MySQL의 소스 코드를 수정 포함하지 않는 속도에서 다른 방법을 이길 것입니다. 이 메모리에 문자열 바이트에 대한 액세스 권한이 그들 주위에 이동하지 않고도 바이트에 직접 작동 할 수 있기 때문이다. 또한 기계 코드로 컴파일하고, CPU에서 직접 실행됩니다.

  4. from https://stackoverflow.com/questions/748276/using-sql-to-determine-word-count-stats-of-a-text-field by cc-by-sa and MIT license