2011-04-27 2 views
1

내 MySQL 테이블에서 전체 텍스트 검색을 사용하고 싶지만 그 외에도 "일종의 무게 순서 "검색이 수행되는 열의 경우."field weight/order"에 따른 MySQL 테이블의 전체 텍스트 검색

예를 들어, - ChapterCol, TextCol, NoteCol이라는 세 개의 열이 있습니다. "financial"이라는 단어를 검색하면 다음과 같이 반환해야합니다. 처음에이 단어가 ChapterCol (및/또는 TextCol, NoteCol에도 있음), 이 들어있는 모든 행, 그리고 TextCol에있는 모든 행 (및/또는 NoteCol) 그리고 마지막으로 NoteCol에만있는 모든 행.

답변

1

먼저 많은 고맙습니다 내가 응답이 희망

...

, 당신은 FULLTEXT 인덱스를 지원하는 MySQL의에서 단 하나의 sicne MyISAM 스토리지 엔진을 사용해야합니다.

각각의 열에 하나씩 3 개의 전체 텍스트 색인을 작성하십시오.

SELECT 쿼리에서 WHERE 절과 ORDER BY 절의 3 개 열 각각에 대해 MATCH ... AGAINST ...를 수행하면 검색 용어가 하나 이상인 모든 행을 가져올 수 있습니다 3 개의 열 중에서 하나를 선택하고 검색 용어가 포함 된 열을 기준으로 정렬합니다.

CREATE TABLE IF NOT EXISTS your_table (
ChapterCol TEXT, 
TextCol TEXT, 
NoteCol TEXT, 
FULLTEXT INDEX (ChapterCol), 
FULLTEXT INDEX (TextCol), 
FULLTEXT INDEX (NoteCol) 
) Engine = MyISAM; 

-- insert test values 
insert into your_table (ChapterCol,TextCol,NoteCol) values ('foo','foo','foo'), 
('financial blah blah','foo','foo'),('foo','financial blah blah','foo'), 
('foo','foo','financial blah blah'),('financial blah blah','financial blah blah', 
'financial blah blah'); 

-- insert filler 
insert into your_table (ChapterCol,TextCol,NoteCol) 
values (md5(rand()),md5(rand()),md5(rand())),(md5(rand()),md5(rand()),md5(rand())), 
(md5(rand()),md5(rand()),md5(rand())),(md5(rand()),md5(rand()),md5(rand())), 
(md5(rand()),md5(rand()),md5(rand())),(md5(rand()),md5(rand()),md5(rand())), 
(md5(rand()),md5(rand()),md5(rand())),(md5(rand()),md5(rand()),md5(rand())), 
(md5(rand()),md5(rand()),md5(rand())),(md5(rand()),md5(rand()),md5(rand())), 
(md5(rand()),md5(rand()),md5(rand())),(md5(rand()),md5(rand()),md5(rand())); 

SELECT ChapterCol,TextCol,NoteCol 
FROM your_table 
WHERE MATCH (ChapterCol) AGAINST ('financial' IN BOOLEAN MODE) 
OR MATCH (TextCol) AGAINST ('financial' IN BOOLEAN MODE) 
OR MATCH (NoteCol) AGAINST ('financial' IN BOOLEAN MODE) 
ORDER BY MATCH (ChapterCol) AGAINST ('financial' IN BOOLEAN MODE) DESC, 
MATCH (TextCol) AGAINST ('financial' IN BOOLEAN MODE) DESC, 
MATCH (NoteCol) AGAINST ('financial' IN BOOLEAN MODE) DESC; 
+0

더 나은 가독성을 위해 성냥에게 별칭을 제공하기 위해 더 좋을 수도 순서 절에 관하여 : 여기

은 예입니다 'WHERE MATCH (BOOLEAN MODE의'금융 ')에 대한 (TextCol) match_text'로 ... 그리고 나서'ORDER BY match_text DESC .... ' – acme

+0

안녕하세요. 'WHERE' 절에서 열을 별명으로 지정할 수 없습니다. 하위 쿼리를 사용하여 SELECT 절의 별칭을 지정한 다음 외 부 SELECT에서 해당 열을 제외 할 수는 있지만 쿼리가 길어지면 여전히 MATCH() 문을 복제해야합니다. 두 번째 복사본을'ORDER BY'에서'SELECT' 절로 옮기고 있습니다. –

+0

아, 맞습니다. - WHERE 절에 있음을 알지 못했습니다. 설명해 주셔서 감사합니다! – acme