저는 대용량 웹 애플리케이션을 개발 중이며, 그중 일부는 2,000 만 개 이상의 행으로 원활하게 확장되어야하는 토론 게시물의 MySQL 데이터베이스입니다.
원래는 테이블 (내장 된 전체 텍스트 검색 기능 용 )에 MyISAM을 사용할 계획 이었지만, 단일 쓰기 작업으로 인해 전체 테이블 이 잠긴다 는 생각이 멈춰버 렸습니다 . 행 수준 잠금은 훨씬 더 의미가 있습니다 (거대한 테이블을 처리 할 때 InnoDB의 다른 속도 이점은 말할 것도 없습니다). 따라서 이러한 이유로 InnoDB를 사용하기로 결정했습니다.
문제는 … InnoDB에는 전체 텍스트 검색 기능이 내장되어 있지 않습니다.
타사 검색 시스템을 사용해야합니까? Lucene (c ++) / Sphinx 처럼 ? 데이터베이스 닌자 중 제안 / 지침이 있습니까?LinkedIn의 zoie (Lucene 기반)는 현재 최상의 옵션으로 보입니다.… 실시간 기능을 기반으로 구축되었으므로 (내 애플리케이션에 매우 중요합니다.) 아직 약간의 통찰력없이 커밋하는 것을 주저합니다 …
(참고 : 프런트 엔드를 제공하기 위해 PHP를 사용하여 높은 메모리 리그로 EC2에있을 예정입니다.)
답변
MyISAM 전체 텍스트가 잘못된 옵션이라는 것을 보증 할 수 있습니다. 일반적으로 MyISAM 테이블의 다양한 문제를 제쳐두고 전체 텍스트 내용이 레일을 벗어나 스스로 손상되고 MySQL이 정기적으로 충돌하기 시작하는 것을 보았습니다.
여기에서는 전용 검색 엔진이 가장 유연한 옵션이 될 것입니다. 포스트 데이터를 MySQL / innodb에 저장 한 다음 텍스트를 검색 엔진으로 내보내십시오. 정기적 인 전체 인덱스 빌드 / 게시를 매우 쉽게 설정할 수 있으며, 필요를 느끼고 시간을 보내고 싶다면 실시간 인덱스 업데이트를 추가 할 수 있습니다.
Lucene과 Sphinx는 훌륭하고 가벼운 Xapian 과 마찬가지로 좋은 옵션 입니다. Lucene 길을 가면 Clucene이 더 나을 것이라고 가정하지 마십시오. 비록 Java와 씨름하는 것을 선호하지 않더라도 둘 중 하나의 장단점을 논의 할 자격이 없습니다.
답변
MyISAM의 일반적인 단계적 제거와 함께 InnoDB 전체 텍스트 검색 (FTS)이 마침내 MySQL 5.6.4 릴리스에서 제공됩니다.
https://dev.mysql.com/doc/refman/5.6/en/innodb-fulltext-index.html 에서 많은 세부 정보를 확인할 수 있습니다.
다른 엔진에는 많은 다른 기능이 있지만 이것은 InnoDB이므로 네이티브 (업그레이드 경로가 있음)이므로 가치있는 옵션이됩니다.
답변
한 시간을 보내고 Sphinx와 Lucene을 설치하고 시운전해야합니다. 데이터 업데이트와 관련하여 둘 중 하나가 귀하의 요구를 충족하는지 확인하십시오.
Sphinx에 대해 실망한 점 중 하나는 증분 삽입을 잘 지원하지 않는다는 것입니다. 즉, 삽입 후 재 인덱싱하는 데 비용이 많이 들기 때문에 권장되는 솔루션은 데이터를 이전의 변경되지 않은 행과 더 새로운 휘발성 행으로 분할하는 것입니다. 따라서 앱에서 수행하는 모든 검색은 두 번 검색해야합니다. 한 번은 이전 행의 경우 더 큰 인덱스에서, 최근 행의 경우 더 작은 인덱스에서 검색해야합니다. 이것이 사용 패턴과 통합되지 않으면이 Sphinx는 좋은 솔루션이 아닙니다 (적어도 현재 구현에서는 그렇지 않습니다).
고려할 수있는 또 다른 솔루션 인 Google 맞춤 검색을 알려 드리고자합니다 . 웹 애플리케이션에 일부 SEO를 적용 할 수 있다면 인덱싱 및 검색 기능을 Google에 아웃소싱하고 Google 검색 텍스트 필드를 사이트에 삽입하십시오. 사이트를 검색 가능하게 만드는 가장 경제적이고 확장 가능한 방법 일 수 있습니다.
답변
아마도 당신은 MySQL의 FT를 너무 빨리 무시해서는 안 될 것입니다. Craigslist는 그것을 사용했습니다 .
MySQL의 속도와 전체 텍스트 검색을 통해 craigslist는 사용자에게 서비스를 제공 할 수있었습니다. .. craigslist는 MySQL을 사용하여 초당 최대 60 회 검색 속도로 매월 약 5 천만 건의 검색을 제공합니다. ”
편집하다
아래에서 언급했듯이 Craigslist는 2009 년 초 에 Sphinx로 전환 한 것으로 보입니다 .
답변
당신이 지적했듯이 스핑크스는 이것에 아주 좋습니다. 모든 작업은 구성 파일에 있습니다. 문자열이있는 테이블에 고유 한 정수 ID 키가 있는지 확인하고 괜찮습니다.
답변
이 시도
ROUND((LENGTH(text) - LENGTH(REPLACE(text, 'serchtext', ''))) / LENGTH('serchtext'),0)!=0
답변
스핑크스를 살펴 봐야합니다. 시도해 볼 가치가 있습니다. 인덱싱이 매우 빠르며 배포됩니다. 이 (http://www.percona.com/webinars/2012-08-22-full-text-search-throwdown) 웹 세미나를 보셔야합니다. 검색에 대해 이야기하고 몇 가지 깔끔한 벤치 마크가 있습니다. 도움이 될 수 있습니다.