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.