2010-03-30 6 views
2

MySQL InnoDB를 사용 중이고 특정 열에 대한 전문적인 스타일 검색을 원합니다. 관련성의 순서대로 결과를 정렬하는 가장 좋은 방법은 무엇입니까? 그러나 이것이 내가 1 개 이상의 열을 검색하거나 하나 개 이상의 키워드를 사용하기 시작하면 매우 복잡해질 것이다InnoDB 테이블에서 MySQL fulltext의 대체 관련성 정렬?

SELECT columns, 
(LENGTH(column_name) - LENGTH(REPLACE(column_name, '%searchterm%', ''))) AS score 
FROM table 
WHERE column_name LIKE '%searchterm%' 
ORDER BY score 

:

내가 좋아하는 뭔가를 시도하고있다. 이미 여러 조인이 있으므로 위의 쿼리를 단순화했습니다.

누구나 더 좋은 방법을 제안 할 수 있습니까? 스핑크스와 같은 타사 소프트웨어를 사용하고 싶지 않습니다.

답변

1

스핑크스 나 솔라를 살펴 보겠습니다. 둘 다 MyISAM보다 더 나은 fts를 가지고 있으며 innoDB-tables를 위해 일할 수도 있습니다.

+0

감사합니다. 그러나 솔로의 스핑크스를 사용할 필요없이 어떤 종류의 방법을 찾기를 희망했습니다. –

+0

모든 합리적인 대안이 너무 느리거나 너무 어렵습니다. 스핑크스를 시험해 봐야 할 것 같습니다. 감사합니다. –

3

다른 엔진을 사용하고 싶지 않다면, InnoDB 테이블의 "섀도우"MyISAM 복사본을 만들어 그 전체 텍스트 검색을 실행할 수 있습니다. InnoDB 테이블에서 적절한 트리거를 사용하면 MyISAM 복사본을 비교적 쉽게 업데이트 할 수있다. 그리고 InnoDB 측 레코드가 사라질 가능성을 배제하기 위해 InnoDB 테이블에 다시 참여하십시오. 뭔가 같은 : 당신이 InnoDB의 거래에 익숙한의 MyISAM 검색 구문을 사용할 수 있도록

이 MySQL을 5.6에서
SELECT MATCH(myisamtable.field1, myisamtable.field2, myisamtable.field3) 
     AGAINST ('search terms') AS relevance, 
    mysitamtable.field1, myisamtable.field2, myisamtable.field3 
FROM myistamtable 
RIGHT JOIN innodbtable ON myistamtable.commonID = innodbtable.commonID 
WHERE (innodbtable.commonID IS NOT NULL) AND (MATCH(myisamtable.field1, myisamtable.field2, myisamtable.field3) AGAINST ('search terms') IN BOOLEAN MODE) 
ORDER BY relevance DESC; 
+0

감사합니다.이 기능은 뛰어 났지만 데이터 양이 너무 많아서 다른 테이블에 연결하면 너무 느립니다. 스핑크스 같은 것을 사용해야 할 것처럼 보입니다. –

1

(현재 베타 버전으로, 2012 년 4 월), FULLTEXT 인덱스가, InnoDB 테이블에 허용되는 조인, 외래 키, 자세한 내용은 this related StackOverflow question을 참조하십시오.

관련 문제