MySQL 전체 텍스트 검색 표의 문자(아시아)자
-
03-07-2019 - |
문제
나는 데이터베이스 전체의 아시아 문득 기록(중국,일본어,한국어)가진 사람들과 함께 라틴 문자로 채워진 레코드(영어,프랑스어,당신은 그것),나를 수행하려는 전체 텍스트 검색니다.
MySQL 을 말한다:
표의 문자와 같은 언어 중국 일본어 있지 않은 단어 구분 기호.따라서,FULLTEXT 파서 위치를 확인할 수 없습니다 말 시작과 끝에서 이러한과 같은 다른 언어입니다.의 의미를 이 일부 문제에 대한 해결 방법 섹션에 설명되어 11.8, "전체 텍스트 검색 기능을".
섹션 11.8 실제로 제공하지 않습 해결 방법이나 문제입니다.
그래서, 어떻게 정렬 검색에 대한 하나의 캐릭터 중국에서 문자 데이터베이스? %LIKE%
지만,그것을 가지지 않는 멋진 관련성 평가.어야 나는 단지 세 시간이 문자가 나타납에서 기록과 순위는?내가 감사한 조언이있다.감사합니다!
해결책
그것의 크기에 따라 달라집니합니다.만약 우리가 얘기 백의 수천의 행,나는 아마도 살펴 하나의 우수한 독립적인 전체 텍스트 검색 솔루션을 제공합니다.나는 실제로 적이 이 문제를 해결하기 위하여 mysqlf,그래서 나는 확실하지 않다는 솔루션에 대한 지원을 포함하는 아시아 언어입니다.
그러나 알고 있는 루씬 스포츠 분석기 위해 중국,일본어,한국어,그래서 내 생각은 그것이 어떤 종류의 지원을 위해 당신이 무엇을하고있다.What I usually do when I 을 통합하는 데 필요한 루씬 php 구현하는 루씬 소켓 서버에서 연결하 php.
는 경우에 데이터 집합이 충분히 작은,그것은 옵션을 수 있습을 자신의 롤 ad-hoc 접근 방식이다.거기에는 두 부분이 이 문제는:검색 문서의 순위하고,실제 순위가 있습니다.거기에 여러 가지 방법을 불러올 수 있습니다.수처럼 사용하는 경우,데이터 집합이 충분히 작습니다.다른 수 있습을 자신의 롤스 디스크 기반의 인덱스 구조,될 수 있지만 오히려 복잡하고 시간이 소요됩니다.사용할 수도 있습 MySQL 중간 경로를 아래에서 설명합니다.
을 구현하기 위해서는 인덱스 구조를 사용하여 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 테이블을 각각 문자(토큰)에서 문서입니다.이 token_unicode 분야가 포함될 것입 정수 유니코드는 데 사용되는 시퀀스를 referr 이 문자입니다.이 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 을 활용하는 인덱스에 대한 모든 선택,그리고 가장 가능성이보다 빠른 것이 해당 쿼리를 사용하는 단일 선택하고 여러 또는 진술)
이것은 우리와 관련 순위로 나머지는 문제입니다 당신이 정말로 물었습니다.:) 이로 할 수 있습니다 오히려 좋은 결과를 활용하여 벡터 공간이 모델(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
이 계산에 대한 점수를 각각기에서 검색 질 첫째로,그리고 저장소에서 결과 hashmap 또는 무언가를 바랍니다이것은 당신의 첫 번째 벡터,라 v_1.를 진행하는 첫 번째 문서입니다.계산 tf-idf 점수를 각 용어에 대한 문서 뿐만 아니라,그리고 상점으로 v_2.지금 당신은 계산할 수 있는 점수에 대한 이를 사용하여 문서 코사인 similiarity:
score = arccos(v_1 * v_2 / (|v_1| * |v_2|))
그 결과 값을 사용할 수 있는 순위를 문서입니다.계속하고 이에 대한 모든 문서입니다.정렬이 그들에 내림차순으로.첫 번째 목록에서 문서를 가장 관련성이 될 것입니다.
이 모든 소리는 조금 복잡,하지만 당신은 몇 가지 기본적인 이해의 선형 대수,당신은 아마 생성 작업 솔루션에서 몇 시간입니다.여전히,가능한 모든 경우에 사용,기존 솔루션 같은 루씬.