Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Azure SQL Felügyelt Példány
A CONTAINSTABLE és a FREETEXTTABLE függvények egy oszlopot adnak vissza, RANK amely 0-tól 1000-ig terjedő ordinális értékeket tartalmaz (rangértékek). Ezek az értékek sorokat annak megfelelően rangsorolják, mennyire illeszkednek a kiválasztási kritériumokhoz. A rangsorértékek csak az eredményhalmaz sorainak relatív relevanciáját jelzik, alacsonyabb értékkel, amely alacsonyabb relevanciát jelez. A tényleges értékek nem fontosak, és általában minden alkalommal eltérnek, amikor a lekérdezés fut.
Jegyzet
A CONTAINS és FREETEXT predikátumok nem adnak vissza rangértéket.
A keresési feltételnek megfelelő elemek száma gyakran nagy. Annak megakadályozására, hogy a CONTAINSTABLE vagy FREETEXTTABLE lekérdezések túl sok találatot adjanak vissza, használd az opcionális top_n_by_rank paramétert. Csak a sorok egy részhalmazát adja vissza.
top_n_by_rank egy n egész érték, amely azt adja meg, hogy csak a n legmagasabb rangsorú találat kerül visszaadásra, csökkenő sorrendben. Ha top_n_by_rank más paraméterekkel van kombinálva, a lekérdezés kevesebb sort ad vissza, mint az összes predikátumnak ténylegesen megfelelő sorok száma.
Az SQL Server adatbázismotor rang szerint sorolja a párokat, és csak a megadott sor számig tér vissza. Például egy lekérdezés, amely általában 100 000 sort ad vissza egy 1 000 000 soros táblázatból, gyorsabban feldolgozódik, ha csak a felső 100 sort kérik.
Példák a RANK használatára a keresési eredmények korlátozására
A példa: Csak az első három találat keresése
Az alábbi példa a CONTAINSTABLE-t használja, hogy csak az első három találatot adja vissza.
USE AdventureWorks2025;
GO
SELECT K.RANK,
AddressLine1,
City
FROM Person.Address AS A
INNER JOIN CONTAINSTABLE (Person.Address, AddressLine1, 'ISABOUT ("des*",
Rue WEIGHT(0.5),
Bouchers WEIGHT(0.9))', 3) AS K
ON A.AddressID = K.[KEY];
GO
Itt van az eredményhalmaz.
RANK Address City
----------- -------------------------------- ------------------------------
172 9005, rue des Bouchers Paris
172 5, rue des Bouchers Orleans
172 5, rue des Bouchers Metz
B példa: Az első öt találat keresése
Az alábbi példa CONTAINSTABLE használatával adja vissza az első öt termék leírását, ahol a Description oszlop az "alumínium" szót tartalmazza az light vagy a lightweightszó közelében.
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)', 5) AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY];
GO
A keresési lekérdezés eredményeinek rangsorolása
A teljes szöveges keresés opcionális pontszámot (vagy rangsorértéket) generálhat, amely jelzi, hogy egy teljes szöveges lekérdezés által visszaadott adatok relevanciája. Ezt a rangértéket minden sorban kiszámítják, és sorrendi kritériumként használható egy adott lekérdezés eredményhalmazának relevancia szerinti rendezésére. A rangértékek csak az eredményhalmaz sorainak relatív relevanciáját jelzik. A tényleges értékek nem lényegesek, és általában különböznek a lekérdezés minden futtatásakor. A rangsor értéke nem hordoz semmilyen jelentőséget a lekérdezések között.
Rangsorolási statisztikák
Amikor indexet építesz, a rendszer statisztikákat gyűjt rangsoroláshoz. Teljes szöveges katalógus létrehozása nem közvetlenül egyetlen indexstruktúrát hoz létre. Ehelyett a Full-Text Engine köztes indexeket hoz létre, miközben adatokat indexel. A Full-Text motor ezután szükség szerint összevonja ezeket az indexeket egy nagyobb indexbe. Ez a folyamat sokszor megtörténhet. A Full-Text motor ezután egy "fő egyesítést" hajt végre, amely az összes köztes indexet egy nagy főindexbe egyesíti.
A statisztikákat minden köztes index szintjén gyűjtjük. A statisztikák egyesítése az indexek egyesítésekor történik. Egyes statisztikai értékek csak a fő egyesítési folyamat során hozhatók létre.
Míg a Database Engine egy lekérdezési eredményhalmazt rangsorol, a legnagyobb köztes index statisztikáit használja. Ez a használat attól függ, hogy a köztes indexeket összevonják-e. Ennek eredményeképpen a rangsorolási statisztikák pontossága változhat, ha a köztes indexek nem egyesülnek. Ez a pontossági különbség magyarázza, miért tud ugyanaz a lekérdezés idővel eltérő rangsori eredményeket adni, ahogy a teljes szöveges indexelt adatokat hozzáadják, módosítják és töröljük, illetve ahogy a kisebb indexeket egyesítik.
Az index méretének és a számítási összetettség minimalizálása érdekében a statisztikák gyakran kerekítve jelennek meg.
Az alábbi lista tartalmaz néhány általánosan használt kifejezést és statisztikai értéket, amelyek fontosak a rang kiszámításában.
| Kifejezés/érték | Leírás |
|---|---|
| Ingatlan | A sor teljes szövegindexelt oszlopa. |
| dokumentum | A lekérdezésekben visszaadott entitás. A Database Engine-ben ez egy sornak felel meg. A dokumentumok több tulajdonsággal is rendelkezhetnek, ahogyan egy sornak több teljes szöveges indexelt oszlopa is lehet. |
| Index | Egy vagy több dokumentum egyetlen fordított indexe. Ez lehet teljes egészében memóriában vagy lemezen. Számos lekérdezési statisztika ahhoz az egyes indexhez képest van, ahol az egyezés történt. |
| Full-Text katalógus | A lekérdezések egyetlen entitásaként kezelt köztes indexek gyűjteménye. A katalógusok azok, amiket az adminisztrátorok a szervezet egységének tekintenek. |
| szó, token vagy elem | Az egyezés egysége a teljes szövegű keresőmotorban. A dokumentumokból származó szövegfolyamokat nyelvspecifikus szótörők tokenizálják szavakká vagy tokenekké. |
| előfordulás | A szóeltolás egy dokumentumtulajdonságban, ahogyan a szóhatároló meghatározza. Az első szó az 1. előfordulásnál van, a következő 2-nél, és így tovább. A kifejezés- és közelségi lekérdezésekben történő hamis pozitív eredmények elkerülése érdekében a mondat végén és a bekezdés végén nagyobb előfordulási hiányokat vezetnek be. |
| Kifejezés gyakorisága | Hányszor fordul elő a kulcsérték egymás után. |
| IndexeltSorokSzáma | Indexelt sorok teljes száma. Ezt az értéket a köztes indexekben tárolt számok alapján számítják ki. Ez a szám pontossága változhat. |
| KeyRowCount | Egy adott kulcsot tartalmazó sorok teljes száma a teljes szöveges katalógusban. |
| MaximálisElőfordulás | Egy sor adott tulajdonságához tartozó teljes szöveges katalógusban tárolt legnagyobb előfordulás. |
| MaxQueryRank | A Full-Text Engine által visszaadott legmagasabb rang, 1000. |
Rangsorolási számítási problémák
Számos tényező befolyásolja a rang számításának folyamatát. A különböző nyelvi szóhatárolók eltérő módon tokenizálják a szöveget. Például az egyik szóelválasztó a „dog-house” karakterláncot „dog” és „house” elemekre bontja, míg egy másik szóelválasztó egyetlen „dog-house” elemként kezeli. A párosítás és rangsorolás a megadott nyelvtől függően változik, mert nemcsak a szavak eltérnek, hanem a dokumentum hossza is. A dokumentum hosszának különbsége hatással lehet az összes lekérdezés rangsorolására.
Az olyan statisztikák, mint az IndexRowCount, széles körben változhatnak. Például, ha egy katalógusban 2 milliárd sor van a fő indexben, egy új dokumentumot egy memórián belüli köztes indexbe indexelnek, és az adott dokumentum rangsorai a memóriabeli indexben lévő dokumentumok száma alapján eltérhetnek a fő index dokumentumainak rangsoraihoz képest. Ezért minden olyan populáció után, amely sok sor indexeléséhez vagy újraindexeléséhez vezet, az indexeket egy fő indexbe egyesítse a ALTER FULLTEXT CATALOG ... REORGANIZE Transact-SQL állítással. A Full-Text motor automatikusan egyesíti az indexeket olyan paraméterek alapján, mint a köztes indexek száma és mérete.
MaxOccurrence értékek 32 tartományból 1-re vannak normalizálva. Ez a normalizáció például azt jelenti, hogy egy 50 szó hosszú dokumentumot ugyanúgy kezelnek, mint egy 100 szó hosszú dokumentumot. Az alábbi táblázat a normalizációt mutatja. Mivel a dokumentum hossza a 32 és 128 szomszédos táblaértékek közötti tartományban van, a rendszer hatékonyan úgy kezeli őket, mint amelyek azonos hosszúságúak, 128 (32 <docLength<= 128).
{ 16, 32, 128, 256, 512, 725, 1024, 1450, 2048, 2896, 4096, 5792, 8192, 11585,
16384, 23170, 28000, 32768, 39554, 46340, 55938, 65536, 92681, 131072, 185363,
262144, 370727, 524288, 741455, 1048576, 2097152, 4194304 };
A CONTAINSTABLE rangja
CONTAINSTABLE rangsorolása a következő algoritmust használja:
StatisticalWeight = Log2( ( 2 + IndexedRowCount ) / KeyRowCount )
Rank = min( MaxQueryRank, HitCount * 16 * StatisticalWeight / MaxOccurrence )
A kifejezéspárosításokat ugyanúgy rangsorolják, mint az egyes kulcsokat, kivéve, hogy a KeyRowCount (a kifejezést tartalmazó sorok száma) egy becsült érték, amely pontatlan és nagyobb lehet a tényleges számnál.
A NEAR rangja
CONTAINSTABLE a NEAR beállítással támogatja két vagy több egymáshoz közel lévő keresési kifejezés lekérdezését. Az egyes visszaadott sorok rangértéke több paraméteren alapul. Az egyik fő rangsorolási tényező a találatok teljes száma (vagy találatok) a dokumentum hosszához viszonyítva. Így például ha egy 100 szóból álló és egy 900 szóból álló dokumentum azonos egyezéseket tartalmaz, akkor a 100 szóból álló dokumentum rangsorolása magasabb.
A sor egyes találatainak teljes hossza is hozzájárul a sor rangsorolásához, a találat első és utolsó keresési kifejezésének távolsága alapján. Minél kisebb a távolság, annál több találat járul hozzá a sor rangértékéhez. Ha egy teljes szöveges lekérdezés nem határoz meg egy egész számot maximális távolságként, akkor egy olyan dokumentum, amely csak olyan találatokat tartalmaz, amelyek távolsága több mint 100 logikai tag között van, 0 rangsorral rendelkezik.
Az ISABOUT rangja
CONTAINSTABLE a ISABOUT lehetőséggel támogatja a súlyozott kifejezések lekérdezését.
ISABOUT egy vektortér-lekérdezés a hagyományos információlekérési terminológiában. Az alapértelmezett rangsorolási algoritmus a Jaccard, egy széles körben ismert képlet. A rangsor a lekérdezés minden egyes kifejezéséhez ki lesz számítva, majd összevonva, az alábbi algoritmusban leírtak szerint.
ContainsRank = same formula used for CONTAINSTABLE ranking of a single term (above).
Weight = the weight specified in the query for each term. Default weight is 1.
WeightedSum = Σ[key=1 to n] ContainsRankKey * WeightKey
Rank = ( MaxQueryRank * WeightedSum ) / ( ( Σ[key=1 to n] ContainsRankKey^2 )
+ ( Σ[key=1 to n] WeightKey^2 ) - ( WeightedSum ) )
A FREETEXTTABLE rangja
FREETEXTTABLE rangsorolása az OKAPI BM25 rangsorolási képleten alapul.
FREETEXTTABLE lekérdezések ragozott alakok generálásával további szavakat adnak hozzá a lekérdezéshez (a lekérdezés eredeti szavainak ragozott alakjait). Ezeket a szavakat különálló szavakként kezelik, és nincs különösebb kapcsolatuk azokkal a szavakkal, amelyekből származnak. A Szinonimaszótár funkcióból létrehozott szinonimákat külön, egyformán súlyozott kifejezésként kezeli a rendszer. A lekérdezés minden egyes szava hozzájárul a ranghoz.
Rank = Σ[Terms in Query] w ( ( ( k1 + 1 ) tf ) / ( K + tf ) ) * ( ( k3 + 1 ) qtf / ( k3 + qtf ) ) )
Where:
w is the Robertson-Sparck Jones weight.
In simplified form, w is defined as:
w = log10 ( ( ( r + 0.5 ) * ( N - R + r + 0.5 ) ) / ( ( R - r + 0.5 ) * ( n - r + 0.5 ) )
N is the number of indexed rows for the property being queried.
n is the number of rows containing the word.
K is ( k1 * ( ( 1 - b ) + ( b * dl / avdl ) ) ).
dl is the property length, in word occurrences.
avdl is the average length of the property being queried, in word occurrences.
k1, b, and k3 are the constants 1.2, 0.75, and 8.0, respectively.
tf is the frequency of the word in the queried property in a specific row.
qtf is the frequency of the term in the query.