2011-04-06 7 views
0

필드의 전체 텍스트 검색을 수행하여 문자열의 특정 부분을 일치 시키려고합니다. 201 ::: 1 ### 193 ::: 5 ### 193 ::: 6 ### 202 ::: 6과 같은 배열 값을 보유하는 긴 문자열을 생각해보십시오. ###는 배열 요소를 분리하고 ::: seperates key => val입니다. 이제 일치에 대한 나의 이해는 부울 모드에서 문자열의 일부와 일치 할 수 있다는 것입니다. 하지만 난mysql fulltext 일치, 일치

`SELECT 
a.settings 
, MATCH(a.settings) AGAINST('201:::1') as relevance 
, b.maxrelevance 
, (MATCH(a.settings) AGAINST('201:::1'))/b.maxrelevance*100 as relevanceperc 
FROM 
users_profile a 
, (SELECT MAX(MATCH(settings) AGAINST('201:::1')) as maxrelevance FROM users_profile LIMIT 1) b 
WHERE 
MATCH(a.settings) AGAINST('201:::1') 
ORDER BY 
relevance DESC;` 

표 예

CREATE TABLE users_profile (
id INT (11)의 기본 NULL의 라인에 뭔가,
profile 텍스트,
views INT (11) 기본 NULL을 수행 할 때 ,
friends_list 텍스트,
settings 텍스트,
,210 points INT (11)의 기본 NULL,
KEY id (id)
전체 텍스트 KEY settings (settings)
) ENGINE의 MyISAM = DEFAULT 문자셋 = UTF8;

결과가 0 점입니다. 어떤 아이디어라도 환영합니다.

+0

표시 테이블 예제를 사용, 당신이 선택할 수 whant 필드를 표시합니다. –

+0

테이블 구조로 업데이트했습니다. 필드 설정 만 검색됩니다. – mbouclas

+0

부울 검색을 위해 ":"이 예약되어 있다고 생각합니다. http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_ft_boolean_syntax에서이 설정을 수정하십시오. 도움이 될 것입니다. 또한이 페이지에서 "ft_"로 시작하는 다른 모든 설정을 살펴보십시오. – eisberg

답변

1

MySQL FullText 인덱스는 자연어를 저장하도록 설계되었습니다. 샘플

201 ::: 1 ### 193 ::: 5 ### 193 ::: 6 ### 202 ::: 6. ###

중요한 부분으로는 201,1,192와 같이 숫자로만 구성됩니다 ... 매우 짧은 단어는 거의 유용하지 않으므로 보통 ft_min_word_len은 4로 설정됩니다. 색인

Fulltext는이 문제의 해결책이 아닙니다. 당신이 원하는 모든 수를 표현 컬럼에 존재하는 횟수에 경우


, 그냥주세요

(length(a.setting) - length(replace(a.setting,'201:::1','')))/length('201:::1') 
+0

대신 정규식이 작동한다고 생각합니까? – mbouclas

+0

예, REGEX 또는 LIKE. 단일 용어가 있기 때문에. 비록 천천히. – RichardTheKiwi

+0

문제는 내가 테스트하는 한 줄마다 매치 카운트를 줄 수 없으며 여기서 가장 중요한 비트는 무엇입니까? – mbouclas