Ricerca di parole vicine a un'altra parola con NEAR

Per cercare parole o frasi vicine, è possibile utilizzare un termine di prossimità (VICINO) in un predicato CONTAINS o in una funzione CONTAINSTABLE. È inoltre possibile specificare il numero massimo di termini non di ricerca che separano il primo e l'ultimo termine di ricerca. È inoltre possibile cercare parole o frasi in qualsiasi ordine o parole e frasi nell'ordine in cui sono state specificate. SQL Server 2012 supporta sia il termine di prossimità generico precedente, ora deprecato, che il termine di prossimità personalizzato, nuovo in SQL Server 2012.

Contenuto dell'argomento

  • Termine di prossimità personalizzato

  • Considerazioni aggiuntive per le ricerche per prossimità

  • Termine di prossimità generico deprecato

Termine di prossimità personalizzato

Con il termine di prossimità personalizzato vengono introdotte le seguenti nuove funzionalità:

  • È possibile specificare il numero massimo di termini non di ricerca, ovvero la distanza massima che separa i primo e l'ultimo termine di ricerca per formare una corrispondenza.

  • Se si specifica il numero massimo di termini, è inoltre possibile specificare che nelle corrispondenze devono essere inclusi i termini di ricerca nell'ordine specificato.

Per essere considerata una corrispondenza, una stringa di testo deve soddisfare i seguenti requisiti:

  • Iniziare con uno dei termini di ricerca specificati e terminare con uno degli altri termini di ricerca specificati.

  • Contenere tutti i termini di ricerca specificati.

  • Il numero di termini non di ricerca, incluse le parole non significative, presenti tra i primo e l'ultimo termine di ricerca deve essere minore o uguale alla distanza massima, se specificato.

La sintassi di base è la seguente:

NEAR (

     {

        search_term [ ,…n ]

     |

        ( search_term [ ,…n ] ) [, <maximum_distance> [, <match_order> ] ]

     }

       )

[!NOTA]

Per ulteriori informazioni sulla sintassi <custom_proximity_term>, vedere CONTAINS (Transact-SQL).

È possibile, ad esempio, cercare 'John' entro due termini 'Smith', come segue:

CONTAINS(column_name, 'NEAR((John, Smith), 2)')

Esempi di stringhe corrispondenti sono "John Jacob Smith" e "Smith, John". La stringa "John Jones knows Fred Smith" include tre termini non di ricerca intermedi, pertanto non è una corrispondenza.

Per ottenere che i termini vengano trovati nell'ordine specificato, modificare il termine di prossimità di esempio in NEAR((John, Smith),2, TRUE). In questo modo viene effettuata la ricerca di "John" entro due termini "Smith", ma solo quando "John" precede "Smith". In una lingua con direzione di lettura da sinistra a destra, ad esempio la lingua inglese, un esempio di stringa corrispondente è il seguente: "John Jacob Smith".

Si noti che per le lingue con lettura da destra a sinistra, come l'arabo o l'ebraico, i termini specificati vengono applicati in ordine inverso dal motore di ricerca full-text. L'ordine di visualizzazione di parole specificate nelle lingue con scrittura da destra a sinistra viene inoltre invertito automaticamente da Esplora oggetti in SQL Server Management Studio.

[!NOTA]

Per ulteriori informazioni, vedere "Considerazioni aggiuntive sulle ricerche per prossimità", più avanti in questo argomento.

Modalità di misurazione della distanza massima

Una distanza massima specifica, ad esempio 10 o 25, determina il numero di termini non di ricerca, incluse le parole non significative, che possono essere presenti tra il primo e l'ultimo termine di ricerca in una determinata stringa. Ad esempio, NEAR((dogs, cats, "hunting mice"), 3) restituirà la riga seguente nella quale sono complessivamente presenti tre termini non di ricerca ("enjoy", "but" e "avoid"):

"Cats enjoy hunting mice, but avoid dogs."

Lo stesso termine di prossimità non restituirà la riga seguente, perché la distanza massima viene superata dai quattro termini non di ricerca ("enjoy", "but", "usually" e "avoid"):

"Cats enjoy hunting mice, but usually avoid dogs."

Combinazione di un termine di prossimità personalizzato con altri termini

È possibile combinare un termine di prossimità personalizzato con alcuni altri termini. È possibile utilizzare AND (&), OR ( |o AND NOT (&!) per combinare un termine di prossimità personalizzato con un altro termine di prossimità personalizzato, un termine semplice o un termine prefisso. Ad esempio:

  • CONTAINS('NEAR((term1,term2),5) AND term3')

  • CONTAINS('NEAR((term1,term2),5) OR term3')

  • CONTAINS('NEAR((term1,term2),5) AND NOT term3')

  • CONTAINS('NEAR((term1,term2),5) AND NEAR((term3,term4),2)')

  • CONTAINS('NEAR((term1,term2),5) OR NEAR((term3,term4),2, TRUE)')

Ad esempio,

CONTAINS(column_name, 'NEAR((term1, term2), 5, TRUE) AND term3')

Non è possibile combinare un termine di prossimità personalizzato con un termine di prossimità generico (term1 NEAR term2), un termine generazionale (ISABOUT …) o un termine ponderato (FORMSOF …).

Esempio: Utilizzo del termine di prossimità personalizzato

Nell'esempio seguente viene effettuata la ricerca nella tabella Production.Document del database di esempio AdventureWorks2008 di tutti i riepiloghi di documenti che contengono sia la parola "riflettore" che la parola "supporto".

USE AdventureWorks2012
GO

SELECT DocumentNode, Title, DocumentSummary
FROM Production.Document AS DocTable 
INNER JOIN CONTAINSTABLE(Production.Document, Document,
  'NEAR(bracket, reflector)' ) AS KEY_TBL
  ON DocTable.DocumentNode = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 50
ORDER BY KEY_TBL.RANK DESC
GO

[TORNA ALL'INIZIO]

Considerazioni aggiuntive per le ricerche per prossimità

In questa sezione vengono illustrate alcune considerazioni riguardanti le ricerche per prossimità sia generiche che personalizzate:

  • Occorrenze di termini di ricerca sovrapposte

    In tutte le ricerche per prossimità viene sempre effettuata la ricerca solo di occorrenze non sovrapposte. Le occorrenze di termini di ricerca sovrapposte non vengono mai considerate come corrispondenze. Si consideri, ad esempio, il termine di prossimità seguente che effettua la ricerca di "A" e "AA" in questo ordine con una distanza massima di due termini:

    CONTAINS(column_name, 'NEAR((A,AA),2, TRUE')
    

    Le corrispondenze possibili sono "AAA", "A.AA" e "A..AA". Le righe che contengono solo "AA" non restituirebbero alcuna corrispondenza.

    [!NOTA]

    È possibile specificare termini che si sovrappongono, ad esempio, NEAR("mountain bike", "bike trails") o (NEAR(comfort*, comfortable), 5). In tal caso, tuttavia, aumenterebbe la complessità della query, aumentando di conseguenza le possibili permutazioni delle corrispondenze. Se si specifica un numero elevato di tali termini sovrapposti, è possibile che le risorse della query si esauriscano e che l'operazione abbia esito negativo. In tal caso, semplificare la query e riprovare.

  • Sia il termine generico NEAR che il termine personalizzato NEAR (indipendentemente dal fatto venga specificata o meno una distanza massima) indicano la distanza logica anziché la distanza assoluta tra i termini. Ad esempio, i termini all'interno di espressioni o frasi diverse di un paragrafo vengono trattati come più lontani dei termini nella stessa espressione o frase, indipendentemente dalla loro prossimità effettiva, presupponendo che siano meno correlati. In modo analogo, i termini presenti in paragrafi diversi vengono trattati come ancora più lontani. Se una corrispondenza si estende fino alla fine di una frase, un paragrafo o un capitolo, il gap utilizzato per la classificazione per rango di un documento viene aumentato rispettivamente di 8, 128 o 1024.

  • Impatto dei termini di prossimità sulla classificazione per rango tramite la funzione CONTAINSTABLE

    Quando NEAR viene utilizzato nella funzione CONTAINSTABLE, il numero di riscontri presenti in un documento in rapporto alla relativa lunghezza, nonché alla distanza tra i primo e l'ultimo termine di ricerca in ognuno dei riscontri, influisce sulla classificazione per rango di ogni documento. Per un termine di prossimità generico, se i termini di ricerca corrispondenti sono separati da >50 termini logici, il rango restituito per un documento sarà pari a 0. Per un termine di prossimità personalizzato in cui non è specificato un intero come distanza massima, il rango restituito per un documento che contiene solo riscontri il cui gap è >100 termini logici sarà pari a 0. Per ulteriori informazioni sulla classificazione per rango di ricerche per prossimità personalizzate, vedere Limitazione dei risultati della ricerca mediante RANK.

  • Opzione server transform noise words

    Il valore di transform noise words influisce sul modo in cui vengono gestite in SQL Server le parole non significative, se queste vengono specificate nelle ricerche per prossimità. Per ulteriori informazioni, vedere Opzione di configurazione del server transform noise words Server.

[TORNA ALL'INIZIO]

Termine di prossimità generico deprecato

Nota importanteImportante

Questa funzionalità verrà rimossa a partire da una delle prossime versioni di Microsoft SQL Server. Evitare di utilizzare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata. Si consiglia di utilizzare il termine di prossimità personalizzato.

Un termine di prossimità generico indica che i termini di ricerca specificati devono essere tutti presenti in un documento perché venga restituita una corrispondenza, indipendentemente dal numero di termini non di ricerca, ovvero la distanza, tra i termini di ricerca. La sintassi di base è la seguente:

{ search_term { NEAR | ~ } search_term } [ ,…n ]

Negli esempi seguenti le parole 'fox' e 'chicken', ad esempio, devono essere entrambe presenti, indipendentemente dall'ordine, per produrre una corrispondenza:

  • CONTAINS(column_name, 'fox NEAR chicken')

  • CONTAINSTABLE(table_name, column_name, 'fox ~ chicken')

[!NOTA]

Per informazioni sulla sintassi di <generic_proximity_term>, vedere CONTAINS (Transact-SQL).

Per ulteriori informazioni, vedere "Considerazioni aggiuntive sulle ricerche per prossimità", più avanti in questo argomento.

Combinazione di un termine di prossimità generico con altri termini

È possibile utilizzare AND (&), OR (|) o AND NOT (&!) per combinare un termine di prossimità generico con un altro termine di prossimità generico, un termine semplice o un termine prefisso. Ad esempio:

   CONTAINSTABLE (Production.ProductDescription,
      Description, 
      '(light NEAR aluminum) OR
      (lightweight NEAR aluminum)'
   )

Non è possibile combinare un termine di prossimità generico con un termine di prossimità personalizzato, ad esempio NEAR((term1,term2),5), un termine ponderato (ISABOUT …) o un termine generazionale (FORMSOF …).

Esempio: Utilizzo del termine di prossimità generico

Nell'esempio seguente viene utilizzato il termine di prossimità generico per cercare la parola "reflector" nello stesso documento che contiene la parola "bracket".

USE AdventureWorks2012
GO

SELECT DocumentNode, Title, DocumentSummary
FROM Production.Document AS DocTable INNER JOIN
  CONTAINSTABLE(Production.Document, Document,
  '(reflector NEAR bracket)' ) AS KEY_TBL
  ON DocTable.DocumentNode = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC
GO

Si noti che invertendo i termini in CONTAINSTABLE si ottiene lo stesso risultato:

CONTAINSTABLE(Production.Document, Document, '(bracket NEAR reflector)' ) AS KEY_TBL

È possibile ottenere lo stesso risultato sostituendo la parola chiave NEAR con una tilde (~):

CONTAINSTABLE(Production.Document, Document, '(reflector ~ bracket)' ) AS KEY_TBL

Nelle condizioni di ricerca è possibile includere più di due parole o frasi, ad esempio:

CONTAINSTABLE(Production.Document, Document, '(reflector ~ bracket ~ installation)' ) AS KEY_TBL

Ciò significa che la parola "riflettore" deve trovarsi nello stesso documento della parola "supporto" e "supporto" deve trovarsi nello stesso documento della parola "installazione".

[INIZIO PAGINA]

Vedere anche

Riferimento

CONTAINSTABLE (Transact-SQL)

CONTAINS (Transact-SQL)

Concetti

Esecuzione della query con ricerca Full-Text