2009-05-03 3 views
4

라틴 문자로 채워진 레코드 (영어, 프랑스어, 사용자 이름)와 함께 아시아 언어로 채워진 레코드 (중국어, 일본어 및 한국어)로 가득 찬 데이터베이스가 있습니다. 그 (것)들에 가득 차있는 원본 수색을하고 싶다.MySQL Fulltext 표의 문자 (아시아 언어) 검색

MySQL은 말한다 : 중국어 , 일본 등

표의 문자 언어는 단어를 구분이 없습니다. 따라서 FULLTEXT 파서는 이 시작하는 곳과 끝나는 곳을 결정할 수 없으며 기타 개 언어로 지정할 수 없습니다. 이 의 의미와 문제에 대한 해결 방법은 11.8, "전체 텍스트 검색 함수"에 설명되어 있습니다.

11.8 절에서는 실제로 대안이나 문제를 언급하지 않습니다.

그래서 어떻게 혼합 문자 데이터베이스에서 단일 한자 검색을 하시겠습니까?? %LIKE%가 작동하지만 관련성 등급이 적절하지 않습니다. 나는 캐릭터가 레코드에 등장하는 시간을 계산해야하고, 그 순위를 매겨 야하나요? 네가 가진 충고에 감사한다. 감사!

답변

2

데이터 세트의 크기에 따라 다릅니다. 우리가 수십만 개의 행을 다루고 있다면, 탁월한 독립적 인 풀 텍스트 검색 솔루션 중 하나를 살펴볼 것입니다. 사실이 문제는 mysqlf를 다루지 않아서, 아시아 언어에 대한 지원을 포함하는 솔루션을 확신 할 수 없습니다.

그러나 나는 lucene이 중국, 일본 및 한국의 분석기를 사용하고 있다는 것을 알고 있습니다. 따라서 내 생각에 당신이하고있는 일에 대한 어떤 지원이 있다는 것입니다. 필자가 lucene을 PHP와 통합해야 할 때 일반적으로하는 일은 lucene을 소켓 서버로 구현하고 PHP에서 연결하는 것입니다.

데이터 집합이 충분히 작 으면 자신 만의 임시 방법을 사용하는 것이 좋습니다. 이 문제에는 두 가지 부분이 있습니다 : 순위를 매길 문서 검색 및 실제 순위입니다. 검색을 수행하는 몇 가지 방법이 있습니다. 데이터 집합이 충분히 작은 경우 LIKE를 사용하는 것일 수 있습니다. 이것은 다소 복잡하고 시간이 많이 걸리지 만 독자적인 디스크 기반 인덱싱 체계를 사용하는 것일 수도 있습니다. 아래에 설명 된 것처럼 중간 경로로 MySQL을 사용할 수도 있습니다.

document 
    document_id 
    document_text 
    document_tokencount 

document_token 
    document_id 
    token_id 
    token_docfrequency 
    index (token_id, document_id) 

token 
    token_id 
    token_unicode 
    token_globalfrequency 
    index (token_unicode) 

은 그럼 각 문서를 처리하는 것하고 document_token 테이블에 행을 삽입 :

MySQL을 사용 색인 방식을 구현하기 위해, 다음과 같은 구조로 몇 테이블을 생성해야 할 것입니다 문서의 각 문자 (토큰). token_unicode 필드는이 문자를 참조하는 데 사용되는 정수 유니 코드 시퀀스를 포함합니다. token_docfrequency 필드는 문서에 토큰이 포함 된 횟수에 해당하는 정수를 포함하고 token_globalfrequency 필드는 모든 문서에서 용어가 사용 된 총 횟수를 포함합니다.

이것은 당신이 토큰에 대한 빠른 검색을 수행 할 수 것입니다 :

SELECT * FROM document_token WHERE token_id = 1 
UNION 
SELECT * FROM document_token WHERE token_id = 2 
UNION 
SELECT * FROM document_token WHERE token_id = 3 

이 (노조 방법은 MySQL이 모든 선택에 대한 인덱스를 활용할 수있는 해킹이며, 대부분 해당 쿼리보다 더 빨리 될 것입니다 단일 선택 및 여러 명령문 사용)

이렇게하면 남은 문제로 순위를 매기므로 실제로 요청한 것입니다. :) 이것은 Vector Space Model (VSM)을 사용하여 다소 좋은 결과를 얻을 수 있습니다.

검색을 수행 한 후에 가장 먼저해야 할 일은이 토큰에 대해 tf-idf 점수를 계산하는 것입니다. 이것은 공식을 사용하여 수행됩니다

tf-idf = tf(t,d)/tf(d) * log(D/d(t)) 

where: 
tf(t,d) = token frequency in current document 
tf(d) = total number of tokens in current document 
D = total number of documents 
d(t) = number of document that contains the token 

계산 먼저 검색 쿼리의 각 용어에 대해이 점수와는 해시 맵이나 뭐 비슷한에 결과를 저장합니다. 이것이 v_1이라는 첫 번째 벡터입니다. 그런 다음 첫 번째 문서로 진행하십시오. 문서의 각 용어에 대한 tf-idf 점수를 계산하여 v_2로 저장하십시오. 지금 당신은 cosine similiarity를 사용하여이 문서의 점수를 계산할 수 있습니다

score = arccos(v_1 * v_2/(|v_1| * |v_2|)) 

결과는 문서를 평가하는 데 사용할 수있는 값입니다. 계속하고 모든 문서에 대해이 작업을 수행하십시오. 그들을 내림차순으로 정렬합니다. 목록의 첫 번째 문서가 가장 관련성이 높은 문서입니다.

이것은 모두 복잡해 보이지만, 선형 대수학에 대한 기본적인 지식이 있다면 몇 시간 내에 효과적인 해결책을 얻을 수 있습니다. 그래도 가능하다면 lucene과 같은 기존 솔루션을 사용하십시오.