Domanda

entrare descrizione dell'immagine qui

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.?

È stato utile?

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( |$)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top