2013-05-16 5 views
1

나는 제품 표를 가지고 있습니다. 자동차. 사용자가 여러 검색어를 사용하여 검색 할 수 있기를 바랍니다. 자동 완성을 위해. LIKE % term %은 거대한 테이블이기 때문에 느려집니다. 빠르게하기 위해 MySQL의 전체 텍스트 검색을 사용하고 싶습니다. ft_min_word_lenght = 1을 사용합니다.글자/숫자로 MySQL 전체 텍스트가 나뉘어졌습니다.

제품 이름이 "Lexus RX450H"라고 가정 해보십시오. 그런 다음 두 단어로 색인이 생성됩니다 : "Lexus"및 "RX450H".

MATCH (productname) AGAINST ('+lex* +rx45*' IN BOOLEAN MODE) ') 

이 제품은 좋을 것입니다.

하지만

MATCH (productname) AGAINST ('+lex* +450*' IN BOOLEAN MODE) ') 

못해,이 단어의 시작에서 검색하는 것이 필수적이기 때문.

사용자가 숫자를 알고 있지만 문자를 잊어 버릴 수도 있습니다. 일치하는 두 번째 쿼리를 원합니다.

제품이 "Lexus RX 450 H"인 경우 마지막 쿼리가 문제를 해결했을 것입니다.

내가 할 수있는 것은 테이블에 두 번째 열을 만들고 두 문자 사이에 공백을 넣어 모든 문자/숫자를 분할하는 것입니다 (예 : regexp를 사용합니다. 그런 다음이 칼럼에서 검색을 수행해야합니다. 문제는 해결되었습니다.

그러나 (큰) 테이블의 크기가 거의 두 배로 커지고 여분의 열을 만들지 않고 설명 된 것처럼 색인을 수행하도록 MySQL에 알릴 수 있는지 궁금합니다.

+0

다음과 비슷한 질문입니다 : http://stackoverflow.com/questions/10731187/mysql-regexp-usage-within-boolean-match-against하지만 그는 생각, 정규식을 BOOLEN 모드와 결합 할 수 없습니다 – user4035

답변

-1

쿼리가 행을 반환하는 것처럼 보입니다. (BOOLEAN 모드의 '+ 렉스 * + 450 *')에 대한

MATCH (PRODUCTNAME는) ')

은 본질적으로 시작 일치하는 텍스트를 말한다'렉스 '와 로 시작'450 ' . 귀하의 데이터는 'lex'에서 일치하지만 '450'에서는 일치하지 않습니다. '+405'에서 별표를 제거하면 효과가 있다고 생각합니다. (부울 MODE IN '+ 렉스 * 450')에 대한

MATCH (PRODUCTNAME)는 렉서스 RX 450 H '및'렉서스 RX450H를 ')

반환한다.'