지난 며칠 동안 postgres에서 전체 텍스트 검색을 보았으며 여러 열을 검색 할 때 색인 작성에 대해 약간 혼란 스럽습니다.
postgres 문서ts_vector
는 다음과 같이 연결된 열에 인덱스를 만드는 것에 대해 이야기합니다 .
CREATE INDEX pgweb_idx ON pgweb
USING gin(to_tsvector('english', title || ' ' || body));
내가 그렇게 검색 할 수 있습니다 :
... WHERE
(to_tsvector('english', title||' '||body) @@ to_tsquery('english', 'foo'))
그러나 제목, 때로는 본문 및 때로는 둘 다 검색하려는 경우 3 개의 별도 색인이 필요합니다. 세 번째 열에 추가하면 잠재적으로 6 개의 인덱스 등이 될 수 있습니다.
문서에서 보지 못한 대안은 두 열을 별도로 색인화 한 다음 일반 WHERE...OR
쿼리를 사용하는 것입니다 .
... WHERE
(to_tsvector('english', title) @@ to_tsquery('english','foo'))
OR
(to_tsvector('english', body) @@ to_tsquery('english','foo'))
~ 1 백만 행에 두 개를 벤치마킹하면 기본적으로 성능에 차이가없는 것 같습니다.
그래서 내 질문은 :
열을 개별적으로 인덱싱하지 않고 이와 같은 인덱스를 연결하려는 이유는 무엇입니까? 두 가지의 장단점은 무엇입니까?
가장 좋은 추측은 사전에 알고 있다면 두 열 (한 번에 한 번만)을 검색하지 않고 메모리를 덜 사용하는 하나의 색인 만 연결하면된다는 것입니다.
title
에body
내가 수정 문을 열어주는 말들하지만 다음, 그 많은 가치를 줄 것이다 색인. 아마 그것들을 따로 인덱싱하는 것을 고수했을 것입니다. 또한 어쨌든 연결 해야하는 엉뚱한 일회성 인 경우 쿼리를 임시로 실행할 수 있다고 생각합니다.