Buscar palabras cerca de otra palabra con NEAR

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Puede usar el término de proximidadNEAR en un predicado CONTAINS o en una función CONTAINSTABLE para buscar palabras o frases que están cerca unas de otras.

Introducción a NEAR

NEAR tiene las características siguientes:

  • Puede especificar el número máximo de términos de no búsqueda que separan el primero y el último término de búsqueda.

  • Puede buscar palabras o frases en cualquier orden o puede buscar palabras y frases en un orden específico.

  • Puede especificar el número máximo de términos de no búsqueda, o distancia máxima, que separa el primero y el último término de búsqueda para que haya una coincidencia.

  • Si especifica el número máximo de términos, también puede especificar que las coincidencias deben contener los términos de búsqueda en el orden especificado.

Para que se considere una coincidencia, una cadena de texto debe:

  • Empezar con uno de los términos de búsqueda especificados y terminar con el otro término de búsqueda especificado.

  • Contener todos los términos de búsqueda especificados.

  • El número de términos de no búsqueda, incluidas las palabras irrelevantes, que hay entre el primero y el último término de búsqueda debe ser menor o igual que la distancia máxima, si esta se especifica.

Sintaxis de NEAR

La sintaxis básica de NEAR es:

 NEAR (  
  
 {  
  
 *search_term* [ ,...*n* ]  
  
 |  
  
 (*search_term* [ ,...*n* ] ) [, <maximum_distance> [, <match_order> ] ]  
  
 }  
  
 )  

Para obtener más información sobre la sintaxis, consulte CONTAINS (Transact-SQL).

Ejemplos

Ejemplo 1

Por ejemplo, podría buscar 'John' a dos términos de 'Smith', de la manera siguiente:

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

Algunos ejemplos de cadenas que coinciden son "John Jacob Smith" y "Smith, John". La cadena "John Jones knows Fred Smith" contiene tres términos de no búsqueda activos, por lo que no es una coincidencia.

Para exigir que los términos se encuentren en el orden especificado, cambiaría el término de proximidad del ejemplo a NEAR((John, Smith),2, TRUE). Esto busca "John" a dos términos de "Smith" pero solo cuando "John" precede a "Smith". En un idioma que se lee de izquierda a derecha, como el inglés, un ejemplo de cadena coincidente es "John Jacob Smith.

Tenga en cuenta que en un idioma que se lee de derecha a izquierda, como el árabe o el hebreo, el Motor de búsqueda de texto completo aplica en orden inverso los términos especificados. Además, Explorador de objetos en SQL Server Management Studio invierte automáticamente el orden de visualización de las palabras especificadas en idiomas de derecha a izquierda.

Ejemplo 2

En el siguiente ejemplo se buscan todos los resúmenes de documento que contienen el palabra "reflector" en el mismo documento que la palabra "bracket" en la tabla Production.Document de la base de datos de ejemplo AdventureWorks .

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  

Cómo se mide la distancia máxima

Una distancia máxima concreta, como 10 ó 25, determina cuántos términos de no búsqueda, incluidas las palabras irrelevantes, puede haber entre el primero y el último término de búsqueda en una cadena determinada. Por ejemplo, NEAR((dogs, cats, "hunting mice"), 3) devolverían la siguiente fila, en la que el número total de términos de no búsqueda es tres ("enjoy", "but" y "avoid"):

"Catsenjoyhunting mice``, but avoiddogs``."

El mismo término de proximidad no devolvería la siguiente fila, ya que los cuatro términos de no búsqueda ("enjoy", "but", "usually" y "avoid") superan la distancia máxima:

"Catsenjoyhunting mice``, but usually avoiddogs``."

Combinar NEAR con otros términos

Puede combinar NEAR con algunos otros términos. Puede usar AND (&), OR (|) o AND NOT (&!) para combinar un término de proximidad personalizado con otro término de proximidad personalizado, un término simple o un término de prefijo. Por ejemplo:

  • 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)')

Por ejemplo,

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

No se puede combinar NEAR con un término de generación (ISABOUT ...) o un término ponderado (FORMSOF ...).

Más información sobre las búsquedas de proximidad

  • Apariciones superpuestas de términos de búsqueda

    Todas las búsquedas de proximidad siempre buscan únicamente apariciones no superpuestas. Las apariciones superpuestas de términos de búsqueda nunca se consideran coincidencias. Por ejemplo, considere el siguiente término de proximidad, que busca "A" y "AA" en este orden con una distancia máxima de dos términos:

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

    Las posibles coincidencias son "AAA", "A.AA" y "A..AA". Las filas que simplemente contienen "AA" no coincidirían.

    Nota:

    Puede especificar términos que se superponen, por ejemplo NEAR("mountain bike", "bike trails") o (NEAR(comfort*, comfortable), 5). La especificación de un término superpuesto aumenta la complejidad de la consulta incrementando las posibles permutaciones de coincidencia. Si especifica un número grande de términos superpuestos, la consulta puede quedarse sin recursos y producir un error. En tal caso, simplifique la consulta e inténtelo de nuevo.

  • NEAR (independientemente de que se especifique una distancia máxima o no) indica la distancia lógica entre los términos, no la distancia absoluta entre ellos. Por ejemplo, los términos dentro de frases diferentes o las sentencias dentro de un párrafo se tratan como más alejados que los términos de la misma frase o sentencia, sin tener en cuenta su proximidad real, suponiéndose que están menos relacionados. Igualmente, los términos en párrafos diferentes se consideran todavía más alejados. Si una coincidencia abarca el final de una frase, un párrafo o un capítulo, el intervalo utilizado para clasificar un documento aumenta en 8, 128 ó 1024, respectivamente.

  • Impacto de los términos de proximidad en la clasificación por la función CONTAINSTABLE

    Cuando se utiliza NEAR en la función CONTAINSTABLE, el número de aciertos en un documento con respecto a su longitud, así como la distancia entre el primero y el último término de búsqueda de cada uno de los aciertos, afecta a la clasificación de cada documento. Para un término de proximidad genérico, si los términos de búsqueda coincidentes están separados por >50 términos lógicos, la clasificación devuelta en un documento es 0. Para un término de proximidad personalizado que no especifica un entero como la distancia máxima, un documento que contiene solo aciertos cuyo intervalo es >100 términos lógicos recibirá una clasificación de 0. Para obtener más información acerca de la clasificación de búsquedas de proximidad personalizadas, vea Limit Search Results with RANK.

  • La opción de servidor transformar palabras irrelevantes

    El valor de transformar palabras irrelevantes afecta a cómo SQL Server trata las palabras irrelevantes si se especifican en búsquedas por proximidad. Para más información, vea transform noise words Server Configuration Option.

Consulte también

CONTAINS (Transact-SQL)
CONTAINSTABLE (Transact-SQL)
Consultar con búsqueda de texto completo