2009-08-25 4 views
2

특정 테이블에서 50 개 이상의 컬럼 (varchar와 int 모두)을 검색하는 방법이 필요합니다. 사람들이 Lucene과 Sphinx를 추천하는 것을 보았습니다. 그러나 이들을 사용하는 방법에 대한 단서가 없습니다. MySQL의 Full-Text는 16 개 이상의 열 또는 varchar와 int 열 모두를 결합 할 수 없습니다.많은 컬럼에서 PHP와 MySQL 검색하기

답변

2

변경 사항이 검색에 반영되기 전에 테이블이 많이 업데이트되지 않거나 시간 지연이있는 경우 LONGTEXT에있는 모든 열을 결합하는 주기적으로 생성 된 파생 테이블을 만들 수 있습니다. 그것에 대한 전체 텍스트 색인.

+0

문제는이 시점에서 약 65,000 개의 행이 있으며 매주 약 500 개가 추가된다는 것입니다. –

+0

500이 무작위가 아닌 일괄 처리 인 경우 일괄 처리 후에 파생 테이블을 쉽게 다시 생성 할 수 있습니다. 인서트가 무작위로 발생한다고 가정 할 때, 일주일에 평균 500 시간이 여전히 1 시간에 불과합니다. 어떤 변경이 있었고 특별한 고통을 느끼지 않으면 파생 테이블을 재생성하는 매분 크론 작업을 실행할 수 있습니다. – chaos

+0

MySQL FULLTEXT 인덱스가있는 비정규 화 된 테이블의 경우 +1. 비록 첫 번째 옵션으로 스핑크스를 볼 수 있습니다. –

0

테이블을 피벗하고 약간 잘라내는 것이 좋습니다. 모든 varchar 열을 가져 와서 하나의 테이블 "Search_Strings"에 데이터를 저장하십시오. INT 컬럼에 대해 동일한 작업을 수행합니다

원래 테이블

id 
always_field1 
always_field2 
varstring1 
... 
varstringx 
int1 
... 
inty 

새로운 main_table (원본 테이블 행의 같은 수 있지만, 거의 열)

id 
always_field1 
always_field2 

search_string이 (

id (FK to main_table) 
old_column_name 
string_value 

검색 _Ints

id (FK to main_table) 
old_column_name 
int_value 

이 설정을 사용하면 string_value에 대한 전체 텍스트 색인 만 필요합니다. 죄송합니다. 스핑크스 나 Lucene과 관련하여 익숙하지 않아서 제안 할 수 없습니다.

+0

Sphinx를 사용하여이 문자열 테이블의 색인을 생성하려면 "문자열"테이블에 고유 한 ID 키 (시퀀스 생각)가 있어야합니다. cf : http://www.postneo.com/2009/02/06/sphinx-search-with-postgresql –