여러 테이블에서 검색 (모범 사례)
-
21-08-2019 - |
문제
테이블로 구성된 속성 관리 응용 프로그램이 있습니다.
tenants
landlords
units
properties
vendors-contacts
기본적으로 검색 필드가 검색하는 범주를 선택하지 않고 검색 필드를 모두 검색하기를 원합니다. 이것이 허용되는 솔루션일까요 (기술 현명한가?)
장기적으로 5 개의 테이블을 검색하는 것이 정상적이며 서버를 멍청하게하지 않습니까? 이것을 달성하는 가장 좋은 방법은 무엇입니까?
PostgreSQL 사용
해결책
이를 위해 Lucene과 같은 전문적인 전체 텍스트 인덱싱 도구를 사용하는 것이 좋습니다. 일어나기가 더 쉬울 것입니다. 결과는 더 빠르고 더 특징입니다. Postgres 전체 텍스트 인덱스는이 위에 구조화 된 검색 기능이 필요하거나 검색 인덱스의 트랜잭션이 중요하다면 유용합니다.
데이터베이스에서이를 구현하려면 대리 키를 사용한다고 가정하면 다음 체계와 같은 것이 작동 할 수 있습니다.
- 각 검색 가능한 테이블에 대해 해당 테이블의 기본 키 열, 테이블 이름 및 해당 테이블의 모든 검색 가능한 필드를 연결하는 뷰를 만듭니다.
- 정확히 동일한 연결의 TO_TSVECTOR ()를 통해 기본에 기능성 진 또는 GIST 인덱스를 만듭니다.
- 검색 가능한 뷰를 만들기 위해 모든보기를 통해 노조를 만듭니다.
그런 다음 다음과 같은 검색을 수행 할 수 있습니다.
SELECT id, table_name, ts_rank_cd(body, query) AS rank
FROM search_view, to_tsquery('search&words') query
WHERE query @@ body
ORDER BY rank DESC
LIMIT 10;
다른 팁
검색하려는 열을 하나로 집계 한 다음 해당 집계 열에서 검색하는 테이블의 통합 인보기를 작성해보십시오.
당신은 다음과 같은 일을 할 수 있습니다 :
select 'tenants:' + ltrim(str(t.Id)), <shared fields> from Tenants as t union
select 'landlords:' + ltrim(str(l.Id)), <shared fields> from Tenants as l union
...
이를 위해서는 클라이언트 쿼리에서 일부 논리가 포함되어야합니다. 검색하기 위해 찾고있는 열쇠를 제작하는 방법을 알아야합니다. 하나의 필드.
즉, "유형"값 (예 : 임대인, 임차인)이 포함 된 별도의 열만 있으면 계산적으로 저렴하고 더 잘 최적화 될 수 있으므로 유형과 ID를 모두 필터하는 것이 더 좋습니다. ).
당신은 사용하고 싶습니다 내장 된 전체 텍스트 검색 또는 별도의 제품 루센. 이것은 이기종 데이터에 대한 구조화되지 않은 검색에 최적화됩니다.
또한 정상 지수는 사용할 수 없다는 것을 잊지 마십시오. something LIKE '%...%'
. 전체 텍스트 검색 엔진을 사용하면 효율적인 하위 문자 검색을 수행 할 수 있습니다.
당신은 괜찮아야하고, 이것을 할 수있는 다른 좋은 (쉬운) 방법은 없습니다. 검색중인 필드가 올바르게 색인되어 있는지 확인하십시오.