sp_BlitzErik의 답변 은 많은 좋은 점에 부딪치지 만 이것이 전체 텍스트 검색을 사용해서는 안되는 이유는 아닙니다. 전체 텍스트 검색은 당신이 생각하는 것을 수행하지 않습니다. 여러 필드를 검색 할 필요는 없습니다. 단어 내용을 벡터화하고 사전, 스터 빙, 어휘 분석기, 가제트, 중지 단어 제거 및 기타 적용되지 않는 많은 트릭을 사용합니다. 또는 아직 적용되지 않은 것으로 보입니다.
SQL Server 에서이 작업을 더 잘 수행하는 방법을 모르겠지만 솔루션에도 동의하지 않습니다. PostgreSQL에 대한 데이터를 다시 만들어 봅시다. PostgreSQL에서도 훨씬 깔끔합니다.
CREATE TABLE fulltextindexesarestupid
AS
SELECT
id,
CASE WHEN Id % 15 = 0 THEN 'Bad'
WHEN Id % 3 = 0 THEN 'Idea'
WHEN Id % 5 = 0 THEN 'Jeans'
END AS StopAbusingFeatures
FROM generate_series(1,1000000) AS id;
이제 원하는 것은 열거 형입니다.
CREATE TYPE foo AS ENUM ('Bad', 'Idea', 'Jeans');
ALTER TABLE fulltextindexesarestupid
ALTER StopAbusingFeatures
SET DATA TYPE foo
USING StopAbusingFeatures::foo;
이제 문자열을 정수 표현으로 축소했습니다. 그러나 이전과 같이 쿼리하는 것이 더 좋습니다.
SELECT *
FROM fulltextindexesarestupid
WHERE StopAbusingFeatures = 'Bad';
효과가 있습니다.
- 카테고리라는 것이 열거 된 유형이라는 사실을 숨 깁니다. 이러한 복잡성은 유형으로 캡슐화되어 사용자에게 숨겨져 있습니다.
- 또한 해당 유형에 대한 유지 보수를 유형에 배치합니다.
- 표준화되었습니다.
- 행 크기가 커지지 않습니다.
이러한 이점이 없으면 본질적으로 문자열 비교를 최적화하려고합니다. 그러나 아아, 나는 제안에 코드가 주어지면 sp_BlitzErik이 어떻게 대답을 얻는 지 잘 모르겠습니다.
like '%rock%' or
like '%paper%' or
like '%scisor%' or
like '%car%' or
like '%pasta%'
열거 형을 사용하거나 sp_BlitzErik에서 제안한 핸드 롤링 방법을 사용하여 토큰을 정수로 축소 할 수 있지만 축소를 수행 할 수있는 경우 왜 고정되지 않은 방식을 수행합니까? 즉, '% pasta %'가 'pasta'토큰이라는 것을 알고 있다면 %
양쪽에 모두 왜 있어야합니까? '%'가 없으면 평등 확인이며 텍스트처럼 매우 빠릅니다.