Lekérdezés Full-Text kereséssel

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseAzure SQL Felügyelt Példány

Teljes szöveges lekérdezéseket írj a predikátumok CONTAINS és FREETEXT és a sorhalmazértékű függvények CONTAINSTABLE használatával, FREETEXTTABLE valamint egy SELECT állítással. Ez a cikk példákat tartalmaz az egyes predikátumokra és függvényekre, és segít kiválasztani a legjobbat.

  • A szavak és kifejezések összeillesztéséhez használd CONTAINS a és CONTAINSTABLE-t.
  • A jelentéshez igazodva, de nem a pontos megfogalmazást követve, használd a FREETEXT és FREETEXTTABLE elemeket.

Példák az egyes predikátumokra és függvényekre

A cikkben szereplő kódminták a AdventureWorks2025 vagy AdventureWorksDW2025 mintaadatbázist használják, amelyet a Microsoft SQL Server-minták és közösségi projektek kezdőlapjáról tölthet le.

A minta lekérdezések futtatásához be kell állítania Full-Text Search szolgáltatást is. További információért lásd: Kezdj el Full-Text kereséssel.

Példa: TARTALMAZZA

Az alábbi példa megtalálja azokat az összes terméket, amelyek $80.99 árával rendelkeznek és tartalmazzák az Mountainszót.

USE AdventureWorks2025;
GO

SELECT Name,
       ListPrice
FROM Production.Product
WHERE ListPrice = 80.99
      AND CONTAINS ((Name), 'Mountain');
GO

Példa: FREETEXT

Az alábbi példa az összes olyan dokumentumot keresi, amely vital safety componentskapcsolatos szavakat tartalmaz:

USE AdventureWorks2025;
GO

SELECT Title
FROM Production.Document
WHERE FREETEXT ((Document), 'vital safety components');
GO

Példa: CONTAINSTABLE

A következő példa visszaadja azon termékek leírásazonosítóját és leírását, amelyeknél a(z) Description oszlop a light vagy a lightweight szó közelében tartalmazza a aluminum szót. Csak azok a sorok kerülnek vissza, amelyek rangja magasabb a 2-nél.

USE AdventureWorks2025;
GO

SELECT FT_TBL.ProductDescriptionID,
       FT_TBL.Description,
       KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL
     INNER JOIN CONTAINSTABLE (Production.ProductDescription, Description, '(light NEAR aluminum) OR
      (lightweight NEAR aluminum)') AS KEY_TBL
     ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEY_TBL.RANK DESC;
GO

Példa: FREETEXTTABLE

A következő példa kiterjeszti a FREETEXTTABLE lekérdezést, hogy először a legmagasabb rangsorú sorokat adja vissza, és minden sorban a rangsort hozzáadja a kiválasztási listához. Ahhoz, hogy hasonló lekérdezést írj, tudnod kell, hogy ez ProductDescriptionID az egyedi kulcsoszlop a ProductDescription táblahoz.

USE AdventureWorks2025;
GO

SELECT KEY_TBL.RANK,
       FT_TBL.Description
FROM Production.ProductDescription AS FT_TBL
     INNER JOIN FREETEXTTABLE (Production.ProductDescription, Description, 'perfect all-around bike') AS KEY_TBL
         ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO

Íme ugyanannak a lekérdezésnek a kiterjesztése, amely csak 10 vagy annál nagyobb sorokat ad vissza:

USE AdventureWorks2025;
GO

SELECT KEY_TBL.RANK,
       FT_TBL.Description
FROM Production.ProductDescription AS FT_TBL
     INNER JOIN FREETEXTTABLE (Production.ProductDescription, Description, 'perfect all-around bike') AS KEY_TBL
         ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK >= 10
ORDER BY KEY_TBL.RANK DESC;
GO

Szavak összehasonlítása vagy jelentésük egyezése

CONTAINS és CONTAINSTABLE, vagy FREETEXT és FREETEXTTABLE, hasznosak különböző párosítási típusokhoz. Az alábbi információk segítenek kiválasztani a legjobb predikátumot vagy függvényt a lekérdezésedhez:

CONTAINS és CONTAINSTABLE

  • Egyező szavak és kifejezések pontos vagy homályos (kevésbé pontos) egyeztetésével.
  • A következő műveleteket is elvégezheti:

FREETEXT és FREETEXTTABLE

  • Az adott szavak, kifejezések vagy mondatok jelentésének kell megfelelnie, nem pedig a pontos szövegezésüknek (a szabadszöveg-sztring).
  • Egyezések akkor jönnek létre, ha egy adott oszlop teljes szöveges indexében bármilyen kifejezés vagy kifejezés formája található.

Predikátumok és függvények összehasonlítása

Az CONTAINS or FREETEXT predikátumok és az CONTAINSTABLE or FREETEXTTABLE sorhalmazértékű függvények eltérő szintaxissal és opciókkal rendelkeznek. Az alábbi információk segítenek kiválasztani a legjobb predikátumot vagy függvényt a lekérdezésedhez:

A CONTAINS és a FREETEXT predikátumok

Használati. Használd a CONTAINS és FREETEXT teljes szöveges predikátumokat egy SELECT utasítás WHERE vagy HAVING záradékában.

Találatok. Az CONTAINS és FREETEXT predikátumok egy TRUE vagy FALSE értéket adnak vissza, amely jelzi, hogy egy adott sor megfelel-e a teljes szöveges lekérdezésnek. Az eredményhalmaz egyező sorokat ad vissza.

További lehetőségek. Ezeket a predikátumokat kombinálhatod bármely más Transact-SQL predikátummal, például LIKE és BETWEEN.

Megadhat egyetlen oszlopot, egy oszloplistát vagy a keresendő tábla összes oszlopát.

Igény szerint megadhatja azt a nyelvet, amelynek erőforrásait a teljes szövegű lekérdezés a szótöréshez és a lemmatizáláshoz, a szinonimaszótár-keresésekhez és a felesleges szavak eltávolításához használhatja.

Négyrészes nevet használhatsz az CONTAINS or FREETEXT predikátumban, hogy teljes szövegű, indexelt oszlopokat lekérdezz a céltáblák egy összekapcsolt szerveren. Ha egy távoli kiszolgálót teljes szöveges lekérdezések fogadására szeretne előkészíteni, hozzon létre egy teljes szöveges indexet a távoli kiszolgálón lévő céltáblákon és oszlopokon, majd adja hozzá a távoli kiszolgálót csatolt kiszolgálóként.

További információért ezeknek a predikátumoknak a szintaxisáról és érveiről lásd: CONTAINS és FREETEXT.

Sorkészletérték függvények CONTAINSTABLE és FREETEXTTABLE

Használati. Használd a SELECT utasítás FROM záradékában a CONTAINSTABLE és FREETEXTTABLE teljes szöveges függvényeket úgy, mint egy normál táblanevet.

Ezen függvények bármelyikének használatakor meg kell adnia a keresés alapjául szolgáló táblát. A predikátumokhoz hasonlóan megadhat egyetlen oszlopot, oszloplistát vagy a keresendő táblázat összes oszlopát, és opcionálisan azt a nyelvet, amelynek erőforrásait egy teljes szöveges lekérdezés használja.

Általában a CONTAINSTABLE vagy a FREETEXTTABLE eredményeit össze kell kapcsolni az alaptáblával. A táblákhoz való csatlakozáshoz ismernie kell az egyedi kulcsoszlop nevét. Ez az oszlop, amely minden teljes szöveget engedélyezett táblázatban megtalálható, az egyedi sorok érvényesítésére szolgál a táblázatban ( az egyedi kulcsoszlop). További információért a kulcsoszlopról lásd: Teljes szöveges indexek létrehozása és kezelése.

Találatok. Ezek a függvények nullából, egy vagy több sorból álló táblát ad vissza, amely megfelel a teljes szöveges lekérdezésnek. A visszaadott tábla csak az alaptábla azon sorait tartalmazza, amelyek megfelelnek a függvény teljes szöveges keresési feltételében megadott kiválasztási feltételeknek.

Az ilyen függvényeket használó lekérdezések minden visszaküldött sorra relevancia rangsorolási értéket (RANK) és teljes szöveges kulcsot (KEY) is adnak, az alábbiak szerint:

  • KEY oszlop. Az KEY oszlop a visszaadott sorok egyedi értékeit adja vissza. Az KEY oszlop segítségével megjelölheti a kiválasztási kritériumokat.

  • RANK oszlop. Az RANK oszlop minden sorhoz egy rangértéket ad vissza, amely jelzi, hogy a sor mennyire felelt meg a kiválasztási kritériumoknak. Minél magasabb a sor szövegének vagy dokumentumának rangértéke, annál relevánsabb a sor az adott teljes szöveges lekérdezéshez. A különböző sorok azonos sorrendben rangsorolhatók. Az opcionális top_n_by_rank paraméter megadásával korlátozhatja a visszaadandó egyezések számát. További információért lásd: Keresési eredmények korlátja rangsorral.

További információkért ezeknek a függvényeknek a szintaxisáról és argumentumairól lásd a CONTAINSTABLE és a FREETEXTTABLE oldalt.

Bizonyos típusú keresések

Keress egy konkrét szót vagy kifejezést (egyszerű kifejezést)

Használhatod CONTAINS, CONTAINSTABLE, FREETEXT, vagy FREETEXTTABLE arra, hogy egy táblázatban keress egy adott szót vagy kifejezést. Például, ha ProductReview az adatbázis táblázatában AdventureWorks2025 keresni szeretnénk minden hozzászólást egy termékről, amelyen a kifejezés learning curve, használhatod a CONTAINS predikátumot a következőként:

USE AdventureWorks2025;
GO

SELECT Comments
FROM Production.ProductReview
WHERE CONTAINS ((Comments), '"learning curve"');
GO

A keresési feltétel, ebben az esetben learning curve, összetett lehet, és egy vagy több kifejezésből állhat.

További információk az egyszerű kifejezéskeresésekről

A teljes szöveges keresés során a szó (vagy elem) olyan karakterlánc, amelynek határait a megfelelő szóhatárolók azonosítják a megadott nyelv nyelvi szabályainak megfelelően. Az érvényes kifejezés több szóból áll, írásjelekkel, vagy azok nélkül.

Például egy croissant szó, és café au lait egy kifejezés. Az ilyen szavakat és kifejezéseket egyszerű kifejezéseknek nevezik.

CONTAINS És CONTAINSTABLE keress pontosan egyező kifejezést. FREETEXT és FREETEXTTABLE külön szavakra bontsa a kifejezést.

Keress egy szót, amelynek előtagja van (előtag kifejezés)

Használhatod CONTAINS vagy CONTAINSTABLE kereshetsz olyan szavakat vagy kifejezéseket, amelyek meghatározott előtaggal rendelkeznek. A megadott előtaggal kezdődő szöveget tartalmazó oszlop minden bejegyzését visszaadja a rendszer. Például, ha minden olyan sor után keresünk, amelyek tartalmazzák az előtagot top-, például topple, topping, és top, a lekérdezés a következő példának tűnik:

USE AdventureWorks2025;
GO

SELECT Description,
       ProductDescriptionID
FROM Production.ProductDescription
WHERE CONTAINS ((Description), '"top*"');
GO

Minden olyan szöveg, amely megfelel a csillag (*) visszaadása előtt megadott szövegnek. Ha a szöveget és a csillagot nem különbözteti meg kétszeres idézőjel, mint például CONTAINS (DESCRIPTION, 'top*'), a teljes szöveges keresés nem tekinti a csillagot vakkkártyának.

Ha az előtag több szóból áll, az azt alkotó minden egyes elem külön előtag-kifejezésnek minősül. A rendszer minden olyan sort visszaad, amely az előtagkifejezésekkel kezdődő szavakat tartalmaz. Például a(z) light bread* előtag olyan sorokat talál meg, amelyek szövege light breaded, lightly breaded vagy light bread, de a(z) lightly toasted bread értéket nem adja vissza.

További információk a prefixkeresésekről

A előtag olyan sztringre utal, amelyet egy szó elejére illesztenek egy származtatott szó vagy egy ragozott alak létrehozásához.

  • Egyetlen előtagtag esetén bármely szó, amely a megadott taggal kezdődik, az eredményhalmaz része. Például a kifejezés auto* egyezik automatic, automobile, és így tovább.

  • Egy kifejezés esetében a kifejezésen belüli összes szó előtagnak minősül. Például a(z) auto tran* kifejezés egyezik a automatic transmission és a automobile transducer elemmel, de nem egyezik a automatic motor transmission elemmel.

Az előtagkereséseket a(z) CONTAINS és CONTAINSTABLE támogatja.

Egy adott szó (generálási kifejezés) ragozott alakjainak keresése

A CONTAINS, CONTAINSTABLE, FREETEXT vagy FREETEXTTABLE használatával rákereshetsz egy ige összes különböző igeidejére és ragozott alakjára, illetve egy főnév egyes és többes számára (alaktani keresés), vagy egy adott szó szinonimáira (tezauruszkeresés).

A következő példa a(z) AdventureWorks2025 adatbázis ProductReview táblájának Comments oszlopában keresi a(z) foot bármely formáját (foot, feet és így tovább):

USE AdventureWorks2025;
GO

SELECT Comments,
       ReviewerName
FROM Production.ProductReview
WHERE CONTAINS ((Comments), 'FORMSOF(INFLECTIONAL, "foot")');
GO

A teljes szöveges keresés szótövekethasznál, amelyek lehetővé teszik az ige különböző igeidőinek és ragozásainak keresését, illetve a főnév egyes és többes számú alakjainak is. A szótövezőkkel kapcsolatos további információkért lásd a Szóelválasztók és szótövezők konfigurálása és kezelése című témakört.

További információk a generációs kifejezéskeresésekről

A inflekciós formák az ige különböző húzásai és ragozásai, vagy a főnevek egyes és többes számú formái.

Például keressen rá a(z) drive szó ragozott alakjára. Ha a táblázat különböző sorai a következő szavakat tartalmazzák: drive, drives, drove, driving és driven, akkor mindegyik szerepelne az eredményhalmazban, mert ezek mindegyike a(z) drive szó ragozott alakjaként képezhető.

FREETEXT és FREETEXTTABLE alapértelmezés szerint keresse az összes megadott szó ragagszó kifejezését. CONTAINS és CONTAINSTABLE támogathatsz egy opcionális INFLECTIONAL érvet.

Adott szó szinonimáinak keresése

A szinonimaszótár definiálja a kifejezések felhasználó által megadott szinonimáit. További információért a szótár fájlokról lásd: Configure and Management Thesaurus Files for Full-Text Search.

Például, ha egy szócikkhez hozzáadunk egy bejegyzést, {car, automobile, truck, van}, kereshetsz a szó cartesznomus formáját. A lekérdezett táblában minden olyan sor megjelenik az eredményhalmazban, amely tartalmazza a automobile, truck, van vagy car szavak valamelyikét, mert e szavak mindegyike a car szót tartalmazó szinonimabővítési halmazhoz tartozik.

FREETEXT és FREETEXTTABLE alapértelmezés szerint használd a szótárt. CONTAINS és CONTAINSTABLE támogathatsz egy opcionális THESAURUS érvet.

Keress egy szót egy másik szó közelében

A közelségi kifejezés egymáshoz közeli szavakat vagy kifejezéseket jelöl. Megadhatja az első és az utolsó keresési kifejezéseket elválasztó nem keresési kifejezések maximális számát is. Emellett bármilyen sorrendben kereshet szavakat vagy kifejezéseket, illetve a megadott sorrendben.

Például azokat a sorokat kell megtalálni, amelyekben a szó ice a szó hockey közelében van, vagy ahol a kifejezés ice skating a kifejezés ice hockeyközelében van.

További információkért a közelségi keresésekről lásd: Szavak keresése egy másik szó közelében a NEAR operátorral.

Keress szavakat vagy kifejezéseket súlyozott értékekkel (súlyozott kifejezéssel)

Használhatod CONTAINSTABLE szavakat vagy kifejezéseket keresni, és megadhatsz súlyzó értéket. A 0,0 és 1,0 közötti számként mért súly az egyes szavak és kifejezések fontosságát jelzi a szavak és kifejezések halmazában. A 0,0-s súly a legalacsonyabb, az 1,0-s súly pedig a legmagasabb.

A következő példa egy olyan lekérdezést mutat be, amely súlyozást alkalmazva az összes ügyfélcímet megkeresi, amelyben bármely, a(z) Bay karakterlánccal kezdődő szöveg tartalmazza a(z) Street vagy View elemet. Az eredmények magasabb rangot adnak azoknak a soroknak, amelyek több megadott szót tartalmaznak.

USE AdventureWorks2025;
GO

SELECT AddressLine1,
       KEY_TBL.RANK
FROM Person.Address AS Address
     INNER JOIN CONTAINSTABLE (Person.Address, AddressLine1, 'ISABOUT ("Bay*",
         Street WEIGHT(0.9),
         View WEIGHT(0.1)
         ) ') AS KEY_TBL
     ON Address.AddressID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO

A súlyozott kifejezés bármely egyszerű kifejezéssel, előtaggal, generációs kifejezéssel vagy közelségi kifejezéssel együtt használható.

További információk a súlyozott kifejezéskeresésekről

A súlyozott kifejezéskeresésben a súlyozási érték jelzi az egyes szavak és kifejezések fontosságát egy sor szóban és kifejezésben. A 0,0 súlyérték a legalacsonyabb, az 1,0-s súlyérték pedig a legmagasabb.

Egy több kifejezést kereső lekérdezésben például minden keresőszóhoz hozzárendelhet egy súlyértéket, amely a keresési feltételben szereplő többi szóhoz képest jelzi annak fontosságát. Az ilyen típusú lekérdezések eredményei a keresési szavakhoz rendelt relatív súlynak megfelelően először a legrelevánsabb sorokat adnak vissza. Az eredményhalmazok dokumentumokat vagy sorokat tartalmaznak, amelyek bármelyik meghatározott kifejezést (vagy azok között lévő tartalmat) tartalmaznak; azonban egyes eredményeket relevánsabbnak tartanak másoknál a különböző keresett kifejezésekhez kapcsolódó súlyozott értékek eltérése miatt.

A súlyozott kifejezéskeresést a(z) CONTAINSTABLE támogatja.

AND, OR és NOT (logikai operátorok) használata

A CONTAINS predikátum és CONTAINSTABLE a függvény ugyanazokat a keresési feltételeket használja. Mindkettő több keresőkifejezés kombinálását támogatja Boole-operátorokkal (AND, OR, és NOT) logikai műveletek végrehajtásához. ANDPéldául használhatod , hogy olyan sorokat találj, amelyek mind latte és New York-style bagel-t tartalmazzák. AND NOTPéldául használhatod , hogy megtaláld azokat a sorokat, amelyek tartalmazzákbagel, de nem tartalmazzák cream cheese.

Ezzel szemben FREETEXT a FREETEXTTABLE Boole-kifejezéseket keresendő szavakként kezeljük.

További információért CONTAINS más predikátumokkal való kombinálásról, amelyek a logikai operátorokat ANDhasználják, OR, és NOT, lásd a keresési feltételt.

Példa

A következő példa a CONTAINS predikátumot használja olyan leírások keresésére, amelyekben a leírási azonosító nem egyenlő 5-össel, és a leírás tartalmazza mind a szót Aluminum , mind a szót spindle. A keresési feltétel a AND Boole-operátort használja. Ez a példa a AdventureWorks2025 adatbázis ProductDescription tábláját használja.

USE AdventureWorks2025;
GO

SELECT Description
FROM Production.ProductDescription
WHERE ProductDescriptionID <> 5
      AND CONTAINS ((Description), 'aluminum AND spindle');
GO

Eset, stopwords, nyelv és szinonimaszótár

Teljes szöveges lekérdezések írásakor a következő beállításokat is megadhatja:

  • Kiszámíthatóság érzékenysége. A teljes szöveges keresési lekérdezések nem érzékenyek a kis- és nagybetűkre. Japánban azonban több fonetikai ortopédia létezik, amelyekben az ortográfiai normalizálás fogalma hasonló a kis- és nagybetűk érzéketlenségéhez (például kana = érzéketlenség). Ez a fajta helyesírási normalizálás nem támogatott.

  • Stopwords. Amikor teljes szöveges lekérdezést definiálsz, a Full-Text Engine kidobja a stopwordokat (más néven zaj szavakat) a keresési kritériumokból. A stopword olyan szavak, mint a, and, is, vagy the, amelyek gyakran előfordulnak, de általában nem segítenek egy adott szöveg keresésekor. A stopwords egy stoplistán szerepel. Minden teljes szöveges index egy adott stoplistához van társítva, amely meghatározza, hogy a lekérdezés vagy az index milyen stopwords-eket hagy ki az indexeléskor. További információért lásd: Stopword és stoplisták konfigurálása és kezelése Full-Text kereséshez.

  • Nyelv, a(z) LANGUAGE beállítással. Számos lekérdezési kifejezés nagymértékben függ a szövegfelbontó viselkedésétől. Annak érdekében, hogy a megfelelő szóelválasztót (és szótövezőt), valamint a tezauruszfájlt használd, meg kell adnod az LANGUAGE beállítást. További információért lásd: Válassz nyelvet teljes szöveges index létrehozásakor.

  • Szinonimaszótár. A(z) FREETEXT és FREETEXTTABLE lekérdezések alapértelmezés szerint a szinonimaszótárt használják. CONTAINS és CONTAINSTABLE támogathatsz egy opcionális THESAURUS érvet. További információ: Szinonimaszótárfájlok konfigurálása és kezelése Full-Text kereséshez.

A tokenizálási eredmények ellenőrzése

Miután egy adott szótörő, szótár és stoplist kombinációt alkalmaztál egy lekérdezésben, láthatod, hogyan tokenizálja az eredményeket a Full-Text Search a dinamikus menedzsment nézet segítségével sys.dm_fts_parser . További információért lásd: sys.dm_fts_parser.