sp_BlitzLa risposta di Erik colpisce molti buoni punti, ma non credo sia per questo che non dovresti usare la ricerca full-text. La ricerca full-text non è lì per fare ciò che pensi che faccia. Non è lì per cercare più campi. È lì per vettorializzare il contenuto delle parole e fare uso di dizionari, mozziconi, lexer, dizionari geografici, eliminazione di parole in blocco e una serie di altri trucchi che non si applicano. Oppure, non è stato ancora dimostrato di applicare.
Non sono d'accordo con la soluzione, anche se non sono sicuro di come farlo meglio in SQL Server. Ricreamo i suoi dati per PostgreSQL - è molto più pulito creare anche in 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;
Ora quello che vuoi è un tipo enum,
CREATE TYPE foo AS ENUM ('Bad', 'Idea', 'Jeans');
ALTER TABLE fulltextindexesarestupid
ALTER StopAbusingFeatures
SET DATA TYPE foo
USING StopAbusingFeatures::foo;
Ora hai compresso le stringhe in rappresentazioni di numeri interi. Ma ancora meglio puoi interrogarli come prima.
SELECT *
FROM fulltextindexesarestupid
WHERE StopAbusingFeatures = 'Bad';
Questo ha l'effetto.
- nasconde il fatto che le categorie sono di tipo elencato. Tale complessità è incapsulata nel tipo e nascosta all'utente.
- pone anche la manutenzione su quelle categorie sul tipo.
- è standardizzato.
- non aumenta la dimensione della riga.
Senza questi vantaggi, essenzialmente stai solo cercando di ottimizzare il confronto delle stringhe. Ma ahimè, non sono nemmeno sicuro di come sp_BlitzErik arriva alla risposta dato il codice nel suggerimento,
like '%rock%' or
like '%paper%' or
like '%scisor%' or
like '%car%' or
like '%pasta%'
Puoi comprimere i token in numeri interi usando un enum, o il metodo di rotolamento manuale suggerito da sp_BlitzErik ma se riesci a fare il collasso perché stai facendo anche il tipo non ancorato? Vale a dire, se sai che '% pasta%' è il token 'pasta', perché ne hai %
entrambi i lati. Senza '%' questo è un controllo di uguaglianza e dovrebbe essere abbastanza veloce anche come testo.