2011-10-03 5 views
1

php와 mySQL을 사용하여 온라인 FAQ 유형 시스템을 만들고 있습니다. 다음 SQL은 사용자가 $term으로 입력 한 내용에 따라 관련 질문을 찾는 데 사용됩니다.mySQL fulltext learning

사용자가 무언가를 검색하고 관련 질문을 클릭하면 대답을 표시 할 때 검색 한 내용에 따라 질문의 점수를 매길 수 있습니다.

SQL의 첫 번째 부분은 실제 질문 테이블에서 관련 질문 ID를 가져옵니다. 두 번째 부분에서는 등급 테이블을보고 관련 질문 ID를 찾기 위해 사람들이 이전에 검색 한 내용과 일치 시키려고합니다.

그런 다음이 결과의 합집합을 사용하여 데이터베이스에 저장된 실제 질문 제목을 얻습니다.

(SELECT id_question, 
MATCH(question, tags) AGAINST ('%$term%') as rank 
FROM question 
WHERE MATCH(question, tags) AGAINST ('%$term%') 
AND category = '$category') 

UNION 

(SELECT id_question, 
MATCH(customer_search_query) AGAINST ('%$term%') as rank 
FROM rating 
WHERE MATCH(customer_search_query) AGAINST ('%$term%') 
AND (customer_rating = 1)) 
ORDER BY rank DESC LIMIT 5;"); 

문제는 시스템이 실제로 올바르게 학습하지 못하는 것입니다. 예를 들어, "three users"를 입력하면 시스템은 질문 표에서 일치하는 것을 찾습니다.

"3 사용자"를 입력하면 시스템은 "사용자"라는 키워드를 기반로 한 질문 표에서 일치하는 항목을 찾습니다. "예"라는 질문을 클릭하면 "3 명의 사용자"라는 질문과 관련된 등급 테이블에 "3 명의 사용자"가 저장됩니다.

문제는 "3"이 "3 명의 사용자"와 만 관련된다는 것입니다. 이 경우 숫자 3을 단어 "three"의 모든 인스턴스와 연관시키는 방법이 있습니까?

+0

당신이 주어진에 의해 오래된 단어 (3 개)의 모든 인스턴스를 대체하는 것을 의미합니다 단어 (3). 내가 맞지 ?? – diEcho

답변

1

자연어 모드 (기본값)match against에 와일드 카드를 사용하지 마십시오. 이 쿼리 대신

사용 :

(SELECT id_question, 
MATCH(question, tags) AGAINST ('$term') as rank 
FROM question 
WHERE MATCH(question, tags) AGAINST ('$term') 
AND category = '$category') 

UNION ALL <<-- faster than UNION. 

(SELECT id_question, 
MATCH(customer_search_query) AGAINST ('$term') as rank 
FROM rating 
WHERE MATCH(customer_search_query) AGAINST ('$term') 
AND (customer_rating = 1)) 
ORDER BY rank DESC LIMIT 5;"); 

당신 사용 검색 수정 in boolean mode.

일치 항목은 불용어와 4 자 미만의 단어는 검색하지 않습니다.
$term = "3 users"을 사용할 때 MySQL은 users만을 찾고 3은 무시합니다. 당신이 3을 검색하려면

당신은에 복귀해야 LIKE '% 3 %'

참조 :
http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html
http://dev.mysql.com/doc/refman/5.0/en/fulltext-stopwords.html