데이터베이스 전체 텍스트 검색 기능/한계?

다음 토론을 계속합니다: 제목이 검색어와 일치할 때 검색 결과에서 해당 주제의 첫 번째 게시물을 우선해야 합니다:

이것은 원래 토론과 완전히 관련이 없긴 하지만, 그저 놀라워해야 할지, 아니면 완전히 충격을 받아야 할지 모르겠습니다:

(강조는 제가 한 것입니다)

데이터베이스 선택에 대해 논쟁할 생각은 없습니다. 왜냐하면 저는 이 부분에 대해 아무런 경험도 없기 때문입니다. 하지만 이 진술은 Postgres가 내부적으로 이러한 경우를 구별하지 않는다는 것을 시사합니다. 이러한 제한이 데이터베이스 텍스트 검색 엔진에서 일반적인가요? 만약 그렇다면, 대부분의 사이트 검색 기능이 왜 엉망인지 충분히 설명할 수 있을 것입니다…

이 진술을 명확히 설명해 드리겠습니다. 완전 일치(exact match)의 경우, 결과가 일치하는지 아닌지만 판단하면 되므로 순위를 매길 필요가 없습니다. 부분 일치(contains match)의 경우, 어떤 결과를 더 높은 순위에 놓아야 할지 어떻게 결정할까요?

  1. 이것이 제 검색어입니다
  2. 검색어는 흥미롭습니다
  3. 제목이 더 길기 때문에 여기서는 검색어가 더 흥미롭습니다

위 제목들은 모두 검색어를 포함하고 있으므로, 문제는 결과를 어떻게 순위 매길 것인가입니다. 현재 우리는 Postgres의 랭킹 함수에 의존하여 이 문제를 해결하고 있습니다.

랭킹 시도는 문서가 특정 쿼리에 얼마나 관련성이 높은지를 측정하여, 일치하는 항목이 많을 때 가장 관련성이 높은 항목을 먼저 표시할 수 있도록 합니다. PostgreSQL은 사전 정의된 두 가지 랭킹 함수를 제공하며, 이들은 어휘적, 근접성, 구조적 정보를 고려합니다. 즉, 쿼리 용어가 문서에 얼마나 자주 등장하는지, 문서 내에서 용어들이 얼마나 가까이 위치하는지, 그리고 용어가 발생하는 문서의 부분이 얼마나 중요한지를 고려합니다. 그러나 관련성의 개념은 모호하며 애플리케이션에 따라 매우 구체적입니다. 다른 애플리케이션에서는 랭킹을 위해 추가 정보가 필요할 수 있으며, 예를 들어 문서 수정 시간 등이 해당될 수 있습니다. 내장된 랭킹 함수는 예시일 뿐입니다. 특정 요구 사항에 맞게 사용자 정의 랭킹 함수를 작성하거나, 그 결과를 추가 요인과 결합할 수 있습니다.

Postgres가 고려하는 요인들은 다양하지만, 궁극적으로 랭킹은 여전히 다소 모호하며, 포럼 콘텐츠의 구조에 따라 사이트마다 크게 달라질 수 있습니다. Discourse에서의 목표는 대부분의 포럼에서 잘 작동할 수 있는 좋은 기본값을 제공하는 것입니다.

아… 아마도 제가 오해한 것 같습니다. 데이터베이스가 정확한 일치(Exact match)와 부분 일치(Contains match)를 구별할 수 없다고 생각했습니다.

원래 논의했던 주제 제목의 일치 우선순위 맥락에서:

  • 제 의도상으로는 제시하신 세 가지 예시를 모두 "정확한 일치"라고 부를 것입니다.
  • "Search할 수 있는 term이 있습니다"는 "부분 일치"에 해당합니다.

  • 제시하신 세 가지 예시는 랭킹이 동일합니다. 단순히 발견된 순서대로 나열하시면 됩니다.
  • 제 예시는 그것들보다 아래에 랭크됩니다.
  • 하지만 모두 제목이 아닌 게시물 내용 만으로 일치/관련된 게시물들보다 앞서 랭크됩니다.

검색 결과 상위가 “제목” 일치로 가득 차는 것이 우려된다면, 검색어가 최소 복잡도 수준에 도달했을 때만 제목 검색을 사용하세요. 검색 결과 상위에 “제목” 일치가 최대 4~5개만 나오도록 하는 것이 목표입니다. (다만, 이를 구현하는 것이 어려울 것 같다는 점은 이해합니다)