Per selezionare l'esistenza indipendente della parola, ovunque nel testo
-
16-10-2019 - |
Domanda
Ho una tabella con i seguenti testi e la parola chiave Cerco è 'Search'.So ho scritto una query
SELECT [ID]
,[TextValue]
FROM
[dbo].[SearchLike]
WHERE
[TextValue] LIKE '%Search%'
Q.1 Come faccio a modificare la query in modo che solo i record che hanno 'Cerca' nel testo viene restituito e non dovrebbero prendere 'LSearch'. cioè come da immagine primi tre dischi solo per essere restituiti.?
Soluzione
Uso come
-
linea singola come la ricerca:
WHERE ' ' + [TextValue] + ' ' LIKE '%[.,;:() ]Search[.,;:() ]%' /* [] contains list of allowable characters, adding spaces around [TextValue] removes need to have multiple OR [TextValue] LIKE */
-
senza imbottitura sarà necessario gestire in modo specifico stringa che appare all'inizio / fine della stringa:
WHERE [TextValue] LIKE '%Search%' --middle OR [TextValue] LIKE 'Search%' --start OR [TextValue] LIKE '%Search' --end
Uso FULLTEXT INDEX
Edit2, per i puristi del testo completo
CREATE FULLTEXT INDEX
su MSDN Uniti per l'opzione AUTO (impostazione predefinita)
Sebbene modifiche vengono propagate automaticamente, queste modifiche potrebbero non essere riflessa immediatamente nell'indice full-text.
Quindi, non può dare risultati corretti. Ma poi pochi secondi dopo che lo farà.
Inoltre, per fino a un paio di righe 10k esso deve svolgere in modo adeguato: esso scale O (n). Io uso il come su un tavolo con circa 25k righe ma gli utenti so che si esibirà male se si cerca in questo modo (è su una pagina "avanzata"). Mi guadagno nel commercio fuori dalla gestione di un indice completo
Ricerca a testo integrale non è il soluzione corretta, è di una
Nota: L'esperienza mi ha dimostrato che l'indicizzazione full-text in SQL Server ha gravi implicazioni sulle prestazioni, vale a dire: implementare Solo se si ha realmente bisogno di e sai quello che stai facendo! (@Andrew Bickerton)
Altri suggerimenti
Se la tabella avrà un importo non banale di righe, si potrebbe desiderare di provare un indice FULLTEXT, invece. Sarà molto più veloce e corrisponderà solo sulla parola esatta.
CREATE FULLTEXT CATALOG <catalog_name> AS DEFAULT;
CREATE FULLTEXT INDEX ON [dbo].[SearchLike](TextValue)
KEY INDEX pk_id; --requires the existing of a PK or UQ index with this name on this table
Ora cercare il tuo testo:
SELECT [ID]
,[TextValue]
FROM
[dbo].[SearchLike]
WHERE
CONTAINS([TextValue], 'Search')
Maggiori info su:
Non so se supportati dal server SQL \b
in regex (partita sulla parola boundry). E dovrete creare una funzione definita dall'utente per consentire corrispondenza regex in primo luogo , ma se lo fa, si potrebbe abbinare il:
\bSearch\b
In caso contrario, si dovrebbe comunque essere in grado di eguagliare il:
(^| )Search( |$)