Pesquisar palavras próximas de outra palavra com NEAR

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do Azure

Você pode usar o termo de proximidadeNEAR em um predicado CONTAINS ou uma função CONTAINSTABLE para pesquisar palavras ou frases próximas umas das outras.

Visão geral de NEAR

NEAR inclui os seguintes recursos:

  • Você pode especificar o número máximo de termos que não sejam de pesquisa que separam o primeiro e o último termos de pesquisa.

  • É possível pesquisar palavras ou frases em qualquer ordem ou pesquisar palavras ou frases em uma ordem especificada.

  • Você pode especificar o número máximo de condições não relacionadas à pesquisa ou distância máximaque separa a primeira e o último critério de pesquisa para constituir uma correspondência.

  • Se você especificar o número máximo de termos, também poderá especificar que as correspondências devem conter os termos de pesquisa na ordem especificada.

Para se qualificar como uma correspondência, uma cadeia de caracteres de texto deve:

  • Iniciar com uma das condições de pesquisa especificadas e terminar com uma das outras condições de pesquisa especificadas.

  • Conter todas as condições de pesquisa especificadas.

  • O número de termos que não são de pesquisa, incluindo palavras de parada, que ocorrem entre o primeiro e o último termos de pesquisa deve ser menor ou igual à distância máxima, caso esta seja especificada.

Sintaxe de NEAR

A sintaxe básica de NEAR é:

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

Para obter mais informações sobre sintaxe, veja CONTAINS (Transact-SQL).

Exemplos

Exemplo 1

Por exemplo, você pode procurar 'John' dentro de duas condições de 'Smith', da seguinte maneira:

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

Alguns exemplos de cadeias de caracteres que correspondem são "John Jacob Smith" e "Smith, John". A string "John Jones knows Fred Smith" contém três termos intervenientes que não fazem parte da pesquisa, portanto, não corresponde.

Para exigir que as condições sejam localizadas na ordem especificada, você deve alterar a condição de proximidade do exemplo para NEAR((John, Smith),2, TRUE). Dessa maneira, é possível procurar "John" dentro de duas condições de "Smith", mas somente quando "John" precede "Smith". Em um idioma lido da esquerda para a direita, como o inglês, um exemplo de uma cadeia de caracteres correspondente é "John Jacob Smith".

Observe que, para um idioma que lê da direita para a esquerda, como árabe ou hebraico, o Mecanismo de texto completo aplica as condições especificadas em ordem invertida. Além disso, o Pesquisador de Objetos no SQL Server Management Studio inverte automaticamente a ordem de exibição de palavras especificada em idiomas da direita para a esquerda.

Exemplo 2

O exemplo a seguir pesquisa a tabela Production.Document do banco de dados de exemplo AdventureWorks em busca de todos os resumos de documentos que contêm a palavra "reflector" no mesmo documento que a palavra "bracket".

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  

Como a distância máxima é medida

Uma distância máxima específica, como 10 ou 25, determina quantas condições não relacionadas à pesquisa, inclusive palavras irrelevantes, podem ocorrer entre a primeira e a última condição de pesquisa em uma determinada cadeia de caracteres. Por exemplo, NEAR((dogs, cats, "hunting mice"), 3) retorna a linha a seguir na qual o número total de condições não relacionadas à pesquisa é três ("enjoy", "but" e "avoid"):

"Catshunting mice``, but avoidenjoydogs``."

A mesma condição de proximidade não retorna a linha a seguir, porque a distância máxima é excedida pelas quatro condições não relacionadas à pesquisa ("enjoy", "but", "usually" e "avoid"):

"Catshunting mice``, but usually avoidenjoydogs``."

Combinar NEAR com outros termos

Você pode combinar NEAR com outros termos. Você pode usar AND (&), OR (|) ou AND NOT (&!) para combinar uma condição de proximidade personalizada com outra, uma condição simples ou uma condição de prefixo. Por exemplo:

  • CONTÉM('PRÓXIMO((termo1, termo2),5) E termo3')

  • CONTÉM('PRÓXIMO((termo1, termo2),5) OU termo3')

  • CONTÉM('PRÓXIMO((termo1, termo2),5) E NÃO termo3')

  • CONTÉM('PERTO((termo1, termo2),5) E PERTO((termo3, termo4),2)')

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

Por exemplo,

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

Você não pode combinar NEAR com um termo de geração (ISABOUT ...) ou um termo ponderado (FORMSOF ...).

Mais informações sobre pesquisas por proximidade

  • Sobreposição de ocorrências de termos de pesquisa

    Todas as pesquisas de proximidade sempre procuram somente ocorrências sem sobreposição. Ocorrências sobrepostas de termos de pesquisa nunca se qualificam como correspondências. Por exemplo, considere a condição de proximidade a seguir, que pesquisa "A" e "AA" nesta ordem com uma distância máxima de dois termos:

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

    As correspondências possíveis são "AAA", "A.AA" e "A..AA". Linhas que contenham apenas "AA" não corresponderiam.

    Observação

    Você pode especificar termos que se sobrepõem, por exemplo, NEAR("mountain bike", "bike trails") ou (NEAR(comfort*, comfortable), 5). Especificar condições de sobreposição aumenta a complexidade da consulta aumentando as possíveis permutações de correspondência. Se você especificar um número grande deste tipo de condições sobrepostas, a consulta poderá ficar sem recursos e falhar. Se isto ocorrer, simplifique a consulta e tente novamente.

  • NEAR (independentemente de uma distância máxima ter sido especificada) indica a distância lógica entre os termos, em vez da distância absoluta entre eles. Por exemplo, termos dentro de frases diferentes ou orações dentro de um parágrafo são tratadas de forma muito diferente dos termos na mesma frase ou oração, independentemente da proximidade real, supondo que eles estejam menos relacionados. Da mesma forma, termos em parágrafos diferentes são considerados ainda mais distantes. Se uma correspondência abranger o final de uma frase, de um parágrafo ou de um capítulo, o intervalo usado na classificação de um documento é aumentado em 8, 128 ou 1024, respectivamente.

  • Impacto dos termos de proximidade sobre a classificação pela função CONTAINSTABLE

    Quando NEAR é usado na função CONTAINSTABLE, o número de ocorrências em um documento em relação ao seu comprimento, assim como a distância entre o primeiro e o último termos de pesquisa em cada uma das ocorrências, afetam a classificação de cada documento. Para um termo de proximidade genérico, se os termos de pesquisa correspondentes estiverem separados por >50 termos lógicos, a classificação retornada para um documento será 0. Para uma condição de proximidade personalizada que não especifica um valor inteiro como distância máxima, um documento que só contém ocorrências cujo intervalo seja >100 termos lógicos receberá uma classificação de 0. Para obter mais informações sobre como classificar pesquisas de proximidade personalizada, veja Limitar resultados da pesquisa com RANK.

  • A opção do servidor transformar palavras irrelevantes

    O valor de transformar palavras irrelevantes afeta a forma como o SQL Server trata palavras irrelevantes se elas forem especificadas em pesquisas de proximidade. Para obter mais informações, consulte transform noise words Server Configuration Option.