Dela via


Sök efter ord som är nära ett annat ord med hjälp av NEAR

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Du kan använda närhetstermenNEAR i en CONTAINS- predikat eller funktionen CONTAINSTABLE för att söka efter ord eller fraser nära varandra.

Översikt över NEAR

NEAR har följande funktioner:

  • Du kan ange det maximala antalet icke-söktermer som avgränsar de första och sista sökorden.

  • Du kan söka efter ord eller fraser i valfri ordning eller söka efter ord och fraser i en viss ordning.

  • Du kan ange det maximala antalet icke-söktermer, eller maximalt avstånd, som avgränsar de första och sista sökorden för att utgöra en matchning.

  • Om du anger det maximala antalet termer kan du också ange att matchningar måste innehålla söktermer i den angivna ordningen.

För att kvalificera sig som en matchning måste en textsträng:

  • Börja med ett av de angivna söktermer och avsluta med ett av de andra angivna sökorden.

  • Innehåller alla angivna söktermer.

  • Antalet icke-söktermer, inklusive stoppord, som inträffar mellan de första och sista sökorden måste vara mindre än eller lika med det maximala avståndet, om det maximala avståndet anges.

Syntax för NEAR

Den grundläggande syntaxen för NEAR är:

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

Mer information om syntaxen finns i CONTAINS (Transact-SQL).

Exempel

Exempel 1

Du kan till exempel söka efter "John" inom två termer i "Smith", enligt följande:

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

Några exempel på strängar som matchar är "John Jacob Smith" och "Smith, John". Strängen "John Jones knows Fred Smith" innehåller tre mellanliggande icke-söktermer, så det är inte en matchning.

Om du vill kräva att termerna hittas i den angivna ordningen ändrar du exempeltermen närhet till NEAR((John, Smith),2, TRUE). Detta söker efter "John" inom två termer av "Smith" men bara när "John" föregår "Smith". På ett språk som läser från vänster till höger, till exempel engelska, är ett exempel på en sträng som matchar "John Jacob Smith".

Observera att för ett språk som läser från höger till vänster, till exempel arabiska eller hebreiska, tillämpar Full-Text Engine de angivna termerna i omvänd ordning. Object Explorer i SQL Server Management Studio ändrar också automatiskt visningsordningen för ord som anges i höger-till-vänster-språk.

Exempel 2

I följande exempel söker du i tabellen Production.Document i AdventureWorks exempeldatabasen efter alla dokumentsammanfattningar som innehåller ordet "reflektor" i samma dokument som ordet "hakparentes".

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  

Hur maximalt avstånd mäts

Ett specifikt maximalt avstånd, till exempel 10 eller 25, avgör hur många icke-söktermer, inklusive stoppord, som kan inträffa mellan de första och sista sökorden i en viss sträng. NEAR((dogs, cats, "hunting mice"), 3) returnerar till exempel följande rad, där det totala antalet icke-söktermer är tre ("enjoy", "but" och "avoid"):

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

Samma närhetsvillkor skulle inte returnera följande rad, eftersom det maximala avståndet överskrids av de fyra icke-söktermer ("enjoy", "but", "usually", och "avoid"):

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

Kombinera NEAR med andra termer

Du kan kombinera NEAR med några andra termer. Du kan använda AND (&), OR (|) eller AND NOT (&!) för att kombinera en anpassad närhetsterm med en annan anpassad närhetsterm, en enkel term eller en prefixterm. Till exempel:

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

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

  • CONTAINS('NEAR((term1, term2),5) OCH INTE term3')

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

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

Till exempel

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

Du kan inte kombinera NEAR med en generationsterm (ISABOUT ...) eller en viktad term (FORMSOF ...).

Mer information om närhetssökningar

  • Överlappande förekomster av söktermer

    Alla närhetssökningar letar alltid efter endast icke-överlappande förekomster. Överlappande förekomster av söktermer kvalificeras aldrig som matchningar. Tänk till exempel på följande närhetsterm, som söker efter "A" och "AA" i den här ordningen med ett maximalt avstånd på två termer:

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

    De möjliga matchningarna är som "AAA", "A.AA" och "A..AA". Rader som bara innehåller "AA" skulle inte matcha.

    Not

    Du kan ange termer som överlappar, till exempel NEAR("mountain bike", "bike trails") eller (NEAR(comfort*, comfortable), 5). Om du anger överlappande termer ökar frågans komplexitet genom att öka möjliga matchningspermutationer. Om du anger ett stort antal sådana överlappande termer kan frågan få slut på resurser och misslyckas. Om detta inträffar förenklar du frågan och försöker igen.

  • NEAR (oavsett om ett maximalt avstånd anges) anger det logiska avståndet mellan termer i stället för det absoluta avståndet mellan dem. Till exempel behandlas termer inom olika fraser eller meningar inom ett stycke som längre ifrån varandra än termer i samma fras eller mening, oavsett deras faktiska närhet, under antagandet att de är mindre relaterade. På samma sätt betraktas termer i olika stycken som om de är ännu längre från varandra. Om en matchning sträcker sig över slutet av en mening, ett stycke eller ett kapitel ökas det mellanrum som används för att rangordna ett dokument med 8, 128 respektive 1024.

  • Påverkan av närhetsvillkor på rangordningen av funktionen CONTAINSTABLE

    När NEAR används i funktionen CONTAINSTABLE påverkar antalet träffar i ett dokument i förhållande till dess längd samt avståndet mellan de första och sista sökorden i var och en av träffarna rangordningen för varje dokument. För en allmän närhetsterm, om de matchade sökorden är >50 logiska termer ifrån varandra, är rangordningen som returneras i ett dokument 0. För en anpassad närhetsterm som inte anger ett heltal som maximalt avstånd får ett dokument som endast innehåller träffar vars mellanrum är >100 logiska termer en rangordning på 0. Mer information om rangordning av anpassade närhetssökningar finns i Begränsa sökresultat med RANK.

  • Alternativet transformera brusord server

    Värdet för omvandla brusord påverkar hur SQL Server behandlar stoppord om de specificeras i närhetssökningar. Mer information finns i transformera brusord serverkonfigurationsalternativet.

Se även

CONTAINS (Transact-SQL)
CONTAINSTABLE (Transact-SQL)
fråga med Full-Text Sök