2010-04-30 5 views
2

나는 3 개의 테이블을 가지고 있는데,이 테이블에는 전체 텍스트 인덱스가있는 컬럼이 있습니다. 사용자가 검색어를 하나의 텍스트 상자에 입력하면 세 개의 표가 모두 검색됩니다.많은 테이블에 대한 전체 텍스트 검색

이것은 더 나은 예를 들어 설명 :

documents 
    doc_id 
    name FULLTEXT 

table2 
    id 
    doc_id 
    a_field FULLTEXT 

table3 
    id 
    doc_id 
    another_field FULLTEXT 

(나는이 바보 보인다 실현하지만 난 그것을 단순화하기 위해 다른 모든 필드와 테이블을 제거했기 때문에 그건).

그래서 기본적으로 내가 찾을 수 name, a_fieldanother_field에 전체 텍스트 검색을 수행하고 바람직하게는 해당 문서의 원인과 documents의 목록으로 결과를 보여, 예를 들어, 원하는 another_field이 일치하면 another_field이 표시됩니다. 이것은 며칠에 대한 캐시 결과를 만들 수있는 (

search_results 
    table_name 
    row_id 
    score 

:

나는 같은 구조를 가진 테이블에 세 전체 텍스트 검색 쿼리를 수행하고 결과를 삽입함으로써 시스템에 작업을 시작 예를 들어 검색어의 해시).

이 아이디어에는 두 가지 문제점이 있습니다. 첫 번째는 같은 문서가 서로 다른 점수로 검색 결과에 최대 세 번 표시 될 수 있다는 것입니다. 그 대신, 검색 용어가 두 테이블에서 일치하는 경우 결과는 하나이지만 점수는 높아야합니다.

두 번째는 결과를 구문 분석하는 것이 어렵다는 것입니다. 문서 목록을 표시하고 싶지만 어떤 종류의 조인이없는 즉시 doc_id을 알지 못합니다. 그러나 조인 할 테이블은 table_name 열에 종속되어 있으며이를 수행하는 방법을 잘 모르겠습니다.

이와 같이 여러 개의 관련 테이블을 검색하고 싶다면 공통점이 있어야합니다. 그래서 내가 옳은 방향으로 접근하고 있는지 묻고 싶습니다. 누군가 제게 최선의 방법을 말해 줄 수 있어요.

답변

1

나는 비정규 화 된 단일 색인을 만들 것입니다. 즉, doc_id, doc_type 및 단일 전체 텍스트 블록에 대한 필드가있는 단일 테이블에 세 가지 문서 형식을 모두 넣습니다. 그런 다음 한 번에 세 가지 문서 유형을 모두 검색 할 수 있습니다.

이 상황에서 Lucene이 적합 할 수도 있습니다. 검색 및 채점 방법에 대한 더 많은 기능뿐만 아니라 빠른 검색 기능을 제공합니다.

단점은 각 레코드에 대해 텍스트의 별도의 denomalized 복사본을 보관한다는 것입니다. 단점은 검색이 훨씬 빠릅니다.

+0

나는 그것이 적절할 것이라고 생각하지 않습니다. 예를 들어, table2는 모든 항목이 상위 ID를 갖는 트리 구조이며, 각 문서에는 20-30 개의 항목이있는 트리 중 하나가 있습니다. 그 데이터를 실제로 문서 테이블에 넣을 수는 없습니다. 그러나 나는 그것을 검색하고 일치하는 것이 발견되면 해당 문서가 결과에 표시되기를 원합니다. – Rob

+0

인덱스가 데이터베이스 테이블이 아닙니다. 빠른 검색을 위해 별도의 비정규 화 된 사본입니다. –