InnoDB로 전체 텍스트 검색


93

저는 대용량 웹 애플리케이션을 개발 중이며, 그중 일부는 2,000 만 개 이상의 행으로 원활하게 확장되어야하는 토론 게시물의 MySQL 데이터베이스입니다.

원래는 테이블 (내장 된 전체 텍스트 검색 기능 용 )에 MyISAM을 사용할 계획 이었지만, 단일 쓰기 작업으로 인해 전체 테이블 이 잠긴다 는 생각이 멈춰버 렸습니다 . 행 수준 잠금은 훨씬 더 의미가 있습니다 (거대한 테이블을 처리 할 때 InnoDB의 다른 속도 이점은 말할 것도 없습니다). 따라서 이러한 이유로 InnoDB를 사용하기로 결정했습니다.

문제는 ... InnoDB에는 전체 텍스트 검색 기능이 내장되어 있지 않습니다.

타사 검색 시스템을 사용해야합니까? Lucene (c ++) / Sphinx 처럼 ? 데이터베이스 닌자 중 제안 / 지침이 있습니까?LinkedIn의 zoie (Lucene 기반)는 현재 최상의 옵션으로 보입니다.... 실시간 기능을 기반으로 구축되었으므로 (내 애플리케이션에 매우 중요합니다.) 아직 약간의 통찰력없이 커밋하는 것을 주저합니다 ...

(참고 : 프런트 엔드를 제공하기 위해 PHP를 사용하여 높은 메모리 리그로 EC2에있을 예정입니다.)


답변:


50

MyISAM 전체 텍스트가 잘못된 옵션이라는 것을 보증 할 수 있습니다. 일반적으로 MyISAM 테이블의 다양한 문제를 제쳐두고 전체 텍스트 내용이 레일을 벗어나 스스로 손상되고 MySQL이 정기적으로 충돌하기 시작하는 것을 보았습니다.

여기에서는 전용 검색 엔진이 가장 유연한 옵션이 될 것입니다. 포스트 데이터를 MySQL / innodb에 저장 한 다음 텍스트를 검색 엔진으로 내보내십시오. 정기적 인 전체 인덱스 빌드 / 게시를 매우 쉽게 설정할 수 있으며, 필요를 느끼고 시간을 보내고 싶다면 실시간 인덱스 업데이트를 추가 할 수 있습니다.

Lucene과 Sphinx는 훌륭하고 가벼운 Xapian 과 마찬가지로 좋은 옵션 입니다. Lucene 길을 가면 Clucene이 더 나을 것이라고 가정하지 마십시오. 비록 Java와 씨름하는 것을 선호하지 않더라도 둘 중 하나의 장단점을 논의 할 자격이 없습니다.


7
Solr (Lucene 기반)는 크게 확장 할 수 있으며 매우 강력하고 유연합니다. 우리는 Solr (특히 LucidWorks for Solr 에디션)를 사용했으며 큰 성과라고 말할 수 있습니다. Sphinx는 심각한 약속을 가지고 있지만 궁극적으로 데이터 유형의 부족은 적어도 우리 응용 프로그램에 문제가 될 수 있습니다. Sphinx는 매우 빠르며 필요에 맞는 경우 확실한 선택입니다.
Cody Caughlan

두 사람에게 감사합니다. 훌륭한 응답. 나는 Solr의 문서를 훑어 보았는데, 그것은 훌륭한 솔루션 인 것 같습니다. 꽤 많은 거대한 웹 사이트를 지원합니다. Solr이 티켓이라고 생각합니다. 감사합니다. 또한 MyISAM 두통에 대해 배우는 것도 좋습니다. Ian ... 그것들은 미래에 염두에두면 좋을 것입니다. 다른 프로젝트에서는 전체 텍스트 기능을 사용하려고하지 않습니다.
brianreavis

11
Ian이 "Clucene이 더 나아질 것이라고 생각하지 마십시오"라고 말한 이유가 무엇인지 궁금하십니까? clucene 핵심 팀 중 하나로서 나는 그렇게 객관적이지 않을 수도 있지만, Java 라이브러리의 최적화 된 C ++ 포트가 지붕을 통해 성능을 향상시킬 것 같습니다. 나는 그들이 모욕을주는 제품을 적어도 한 눈에 보지 않고 그러한 코멘트를 게시하지 말 것을 누구에게나 권하고 싶다.
synhershko

4
MyISAM을 강타 할 때는 더 구체적이어야합니다. "Off the rails" 는 매우 모호하며 사용중인 빌드의 단일 버그 때문일 수 있습니다.
bobobobo

6
그러나 서버에 소프트웨어를 설치할 수있는 옵션이 없다면 어떻게 될까요?이 경우 어떤 대안이 있습니까?
acme

56

MyISAM의 일반적인 단계적 제거와 함께 InnoDB 전체 텍스트 검색 (FTS)이 마침내 MySQL 5.6.4 릴리스에서 제공됩니다.

https://dev.mysql.com/doc/refman/5.6/en/innodb-fulltext-index.html 에서 많은 세부 정보를 확인할 수 있습니다.

다른 엔진에는 많은 다른 기능이 있지만 이것은 InnoDB이므로 네이티브 (업그레이드 경로가 있음)이므로 가치있는 옵션이됩니다.


1
기사 링크는 403 금지입니다
Marco Demaio 2013

11

한 시간을 보내고 Sphinx와 Lucene을 설치하고 시운전해야합니다. 데이터 업데이트와 관련하여 둘 중 하나가 귀하의 요구를 충족하는지 확인하십시오.

Sphinx에 대해 실망한 점 중 하나는 증분 삽입을 잘 지원하지 않는다는 것입니다. 즉, 삽입 후 재 인덱싱하는 데 비용이 많이 들기 때문에 권장되는 솔루션은 데이터를 이전의 변경되지 않은 행과 더 새로운 휘발성 행으로 분할하는 것입니다. 따라서 앱에서 수행하는 모든 검색은 두 번 검색해야합니다. 한 번은 이전 행의 경우 더 큰 인덱스에서, 최근 행의 경우 더 작은 인덱스에서 검색해야합니다. 이것이 사용 패턴과 통합되지 않으면이 Sphinx는 좋은 솔루션이 아닙니다 (적어도 현재 구현에서는 그렇지 않습니다).

고려할 수있는 또 다른 솔루션 인 Google 맞춤 검색을 알려 드리고자합니다 . 웹 애플리케이션에 일부 SEO를 적용 할 수 있다면 인덱싱 및 검색 기능을 Google에 아웃소싱하고 Google 검색 텍스트 필드를 사이트에 삽입하십시오. 사이트를 검색 가능하게 만드는 가장 경제적이고 확장 가능한 방법 일 수 있습니다.


고마워, 빌. 예, Sphinx 문서는 색인 업데이트를 처리하는 방법에 대해 약간 흔들 렸습니다. 확인해 주셔서 감사합니다. 그런 종류의 시스템은 아마도 나에게 악몽이 될 것이라고 생각합니다. Google 맞춤 검색의 경우 옵션입니다. 그러나 내 주요 문제는 비 실시간 인덱스와 사용자 정의가 없다는 것입니다. 결과의 스타일을 지정하고 추가 데이터를 가져 오는 것은 나에게 상당히 중요합니다. 들어 주셔서 감사합니다 --- 스핑크스 정보는 확실히 알아두면 좋습니다!
brianreavis

3

아마도 당신은 MySQL의 FT를 너무 빨리 무시해서는 안 될 것입니다. Craigslist는 그것을 사용했습니다 .

MySQL의 속도와 전체 텍스트 검색을 통해 craigslist는 사용자에게 서비스를 제공 할 수있었습니다. .. craigslist는 MySQL을 사용하여 초당 최대 60 회 검색 속도로 매월 약 5 천만 건의 검색을 제공합니다. "

편집하다

아래에서 언급했듯이 Craigslist는 2009 년 초 에 Sphinx로 전환 한 것으로 보입니다 .


링크 된 기사의 나는 스핑크스를 언급하지 않고, 닉은 크레이그리스트 전혀 스핑크스를 사용 말하는 모든 소스를 인용하지 않습니다
bobobobo

사례 연구 PDF는 2004 년의 모습으로 한 달에 5 천만 건의 검색이있었습니다. Sphinx 페이지에는 하루에 5 천만 건의 검색이 나와 있는데, 이는 아마도 전용 검색 솔루션으로 전환 한 이유를 설명 할 것입니다.
Halil Özgür 2011

1

당신이 지적했듯이 스핑크스는 이것에 아주 좋습니다. 모든 작업은 구성 파일에 있습니다. 문자열이있는 테이블에 고유 한 정수 ID 키가 있는지 확인하고 괜찮습니다.


0

이 시도

ROUND((LENGTH(text) - LENGTH(REPLACE(text, 'serchtext', ''))) / LENGTH('serchtext'),0)!=0

0

스핑크스를 살펴 봐야합니다. 시도해 볼 가치가 있습니다. 인덱싱이 매우 빠르며 배포됩니다. 이 (http://www.percona.com/webinars/2012-08-22-full-text-search-throwdown) 웹 세미나를 보셔야합니다. 검색에 대해 이야기하고 몇 가지 깔끔한 벤치 마크가 있습니다. 도움이 될 수 있습니다.



0

InnoDB가 Fulltext 검색을 지원하지 않는 이전 버전의 MySQL / MariaDB (예 : CentOS 사용자)를 사용하는 사람을 위해 InnoDB 테이블을 사용할 때 내 솔루션은 검색하려는 항목에 대해 별도의 MyISAM 테이블을 만드는 것이 었습니다.

예를 들어, 제 기본 InnoDB 테이블 products에는 다양한 키와 참조 무결성이 있습니다. 그때라는 간단한 MyISAM 테이블 작성 product_search개의 필드를 포함를, product_id그리고 product_name여기서 후자의 것은로 설정 FULLTEXT인덱스. 두 필드 모두 기본 product테이블 에있는 내용의 복사본입니다 .

그런 다음 전체 텍스트를 사용하여 MyISAM 테이블을 검색하고 InnoDB 테이블에 다시 내부 조인을 수행합니다.

MyISAM 테이블의 내용은 트리거 또는 애플리케이션 모델을 통해 최신 상태로 유지할 수 있습니다.

전체 텍스트가 필요한 여러 테이블이있는 경우에는 권장하지 않지만 단일 테이블의 경우 업그레이드 할 수있을 때까지 적절한 해결 방법 인 것 같습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.