Aracılığıyla paylaş


CONTAINSTABLE (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen Örneği

Bu sütunlar için kesin veya belirsiz (daha az kesin) eşleşmeler içeren sıfır, bir veya daha fazla satırdan oluşan bir tablo, tek sözcük ve tümceciklerle, sözcüklerin belirli bir mesafedeki yakınlığıyla veya ağırlıklı eşleşmelerle döndürür. CONTAINSTABLE, bir Transact-SQL SELECT deyiminin FROM yan tümcesinde kullanılır ve normal bir tablo adıymış gibi başvurulur. Karakter tabanlı veri türleri içeren tam metin dizinli sütunlarda SQL Server tam metin araması gerçekleştirir.

CONTAINSTABLE, CONTAINS koşulu ile aynı tür eşleşmeler için kullanışlıdır ve CONTAINS ile aynı arama koşullarını kullanır.

Ancak CONTAINSTABLE kullanan sorgular CONTAINSTABLE'ın aksine, her satır için bir ilgi derecelendirme değeri (RANK) ve tam metin anahtarı (KEY) döndürür. SQL Server tarafından desteklenen tam metin arama biçimleri hakkında bilgi için bkz. Full-Text Aramaile sorgu .

Transact-SQL söz dizimi kuralları

Sözdizimi

  
CONTAINSTABLE   
( table , { column_name | ( column_list ) | * } , ' <contains_search_condition> '   
     [ , LANGUAGE language_term]   
  [ , top_n_by_rank ]   
)   
  
<contains_search_condition> ::=   
    { <simple_term>   
    | <prefix_term>   
    | <generation_term>   
    | <generic_proximity_term>   
    | <custom_proximity_term>   
    |  <weighted_term>   
    }   
    | { ( <contains_search_condition> )   
    { { AND | & } | { AND NOT | &! } | { OR | | } }   
     <contains_search_condition> [ ...n ]   
    }  
  
<simple_term> ::=   
     { word | "phrase" }  
<prefix term> ::=   
     { "word*" | "phrase*" }   
<generation_term> ::=   
     FORMSOF ( { INFLECTIONAL | THESAURUS } , <simple_term> [ ,...n ] )   
  
<generic_proximity_term> ::=   
     { <simple_term> | <prefix_term> } { { { NEAR | ~ }   
     { <simple_term> | <prefix_term> } } [ ...n ] }  
  
<custom_proximity_term> ::=   
  NEAR (   
     {  
        { <simple_term> | <prefix_term> } [ ,...n ]  
     |  
        ( { <simple_term> | <prefix_term> } [ ,...n ] )   
      [, <maximum_distance> [, <match_order> ] ]  
     }  
       )   
  
      <maximum_distance> ::= { integer | MAX }  
      <match_order> ::= { TRUE | FALSE }   
  
<weighted_term> ::=   
     ISABOUT  
    ( { {   
  <simple_term>   
  | <prefix_term>   
  | <generation_term>   
  | <proximity_term>   
  }   
   [ WEIGHT ( weight_value ) ]   
   } [ ,...n ]   
    )  
  

Bağımsız değişken

tablo
Tam metin dizini oluşturulmuş bir tablonun adıdır. tablo bir, iki, üç veya dört bölümden oluşabilir. Bir görünümü sorgularken, yalnızca bir tam metin dizinli temel tablo dahil edilebilir.

tablo bir sunucu adı belirtemez ve bağlı sunuculara yönelik sorgularda kullanılamaz.

column_name
Tam metin araması için dizine alınan bir veya daha fazla sütunun adıdır. Sütunlar char, varchar, nchar, nvarchar, metintüründe olabilir . ntext, resim, xml, varbinaryveya varbinary(max).

column_list
Virgülle ayrılmış birkaç sütunun belirtilebileceğini gösterir. column_list parantez içine alınmalıdır. language_term belirtilmediği sürece, column_list tüm sütunlarının dili aynı olmalıdır.

*
tablodaki tüm tam metin dizinli sütunların verilen arama koşulu için kullanılması gerektiğini belirtir. language_term belirtilmediği sürece, tablonun tüm sütunlarının dili aynı olmalıdır.

LANGUAGE language_term
Kaynakları, sorgunun bir parçası olarak sözcük kesme, sözcük kökü oluşturma ve eş anlamlılar sözlüğü ile kirli sözcük (veya stopword) kaldırma için kullanılacak olan dildir. Bu parametre isteğe bağlıdır ve bir dilin yerel ayar tanımlayıcısına (LCID) karşılık gelen bir dize, tamsayı veya onaltılık değer olarak belirtilebilir. language_term belirtilirse, temsil ettiği dil arama koşulunun tüm öğelerine uygulanır. Değer belirtilmezse, sütun tam metin dili kullanılır.

Farklı dillerdeki belgeler tek bir sütunda ikili büyük nesneler (BLOB) olarak birlikte depolanıyorsa, belirli bir belgenin yerel ayar tanımlayıcısı (LCID), içeriğini dizine almak için hangi dilin kullanıldığını belirler. Böyle bir sütunu sorgularken language**language_term belirterek iyi eşleşme olasılığını artırabilirsiniz.

Dize olarak belirtildiğinde language_term, sys.syslanguages uyumluluk görünümündeki diğer ad sütun değerine karşılık gelir. Dize, 'language_term' içinde olduğu gibi tek tırnak içine alınmalıdır. Tamsayı olarak belirtildiğinde, language_term dili tanımlayan gerçek LCID'dir. Onaltılık değer olarak belirtildiğinde, language_term 0x olur ve bunu LCID'nin onaltılık değeri izler. Onaltılık değer, baştaki sıfırlar da dahil olmak üzere sekiz basamağı aşmamalıdır.

Değer çift baytlık karakter kümesi (DBCS) biçimindeyse, Microsoft SQL Server bunu Unicode'a dönüştürür.

Belirtilen dil geçerli değilse veya bu dile karşılık gelen hiçbir kaynak yüklü değilse, SQL Server bir hata döndürür. Nötr dil kaynaklarını kullanmak için 0x0 language_termolarak belirtin.

top_n_by_rank
Yalnızca n en yüksek dereceli eşleşmelerin azalan sırada döndürüldüğünü belirtir. Yalnızca nbir tamsayı değeri belirtildiğinde geçerlidir. top_n_by_rank diğer parametrelerle birleştirilirse, sorgu tüm koşullarla eşleşen satır sayısından daha az satır döndürebilir. top_n_by_rank yalnızca en ilgili isabetleri geri çekerek sorgu performansını artırmanıza olanak tanır.

<contains_search_condition>
column_name içinde aranacak metni ve eşleşme koşullarını belirtir. Arama koşulları hakkında bilgi için bkz. CONTAINS (Transact-SQL).

Açıklamalar

Tam metin önkoşulları ve işlevleri, FROM koşulunda yer alan tek bir tabloda çalışır. Birden çok tabloda arama yapmak için FROM yan tümcenizde birleştirilmiş bir tablo kullanarak iki veya daha fazla tablonun ürünü olan bir sonuç kümesinde arama yapın.

Döndürülen tabloda tam metin anahtar değerleri içeren KEY adlı bir sütun bulunur. Tam metin dizinli her tabloda değerlerin benzersiz olması garanti edilen bir sütun vardır ve KEY sütununda döndürülen değerler, arama koşulunda belirtilen seçim ölçütleriyle eşleşen satırların tam metin anahtar değerleridir. OBJECTPROPERTYEX işlevinden alınan TableFulltextKeyColumn özelliği, bu benzersiz anahtar sütununun kimliğini sağlar. Tam metin dizininin tam metin anahtarıyla ilişkili sütunun kimliğini almak için sys.fulltext_indexeskullanın. Daha fazla bilgi için bkz. sys.fulltext_indexes (Transact-SQL).

İstediğiniz satırları özgün tablodan almak için CONTAINSTABLE satırlarıyla bir birleşim belirtin. CONTAINSTABLE kullanan bir SELECT deyimi için FROM yan tümcesinin tipik biçimi:

SELECT select_list  
FROM table AS FT_TBL INNER JOIN  
   CONTAINSTABLE(table, column, contains_search_condition) AS KEY_TBL  
   ON FT_TBL.unique_key_column = KEY_TBL.[KEY];  

CONTAINSTABLE tarafından üretilen tablo, RANKadlı bir sütun içerir. RANK sütunu, bir satırın seçim ölçütlerine ne kadar uygun olduğunu gösteren her satır için bir değerdir (0 ile 1000 arasında). Bu derece değeri genellikle SELECT deyiminde şu yollardan birinde kullanılır:

  • ORDER BY yan tümcesinde, en yüksek derecelendirmeli satırları tablonun ilk satırları olarak döndürür.

  • Her satıra atanan derecelendirme değerini görmek için seçme listesinde.

İzinler

Yürütme izinleri yalnızca tabloda veya başvuruda bulunulmuş tablonun sütunlarında uygun SELECT ayrıcalıklarına sahip kullanıcılar tarafından kullanılabilir.

Örnekler

A. Basit Örnek

Aşağıdaki örnek, 3 ilçeyi ve bayraklarındaki renkleri listeleyerek iki sütundan oluşan basit bir tablo oluşturur ve doldurur. Tablodaki tam metin kataloğunu ve dizinini oluşturur ve doldurur. Ardından CONTAINSTABLE söz dizimi gösterilmiştir. Bu örnekte, arama değeri birden çok kez karşılandığında derece değerinin nasıl daha yüksek arttığı gösterilmektedir. Son sorguda, hem yeşil hem de siyah içeren Tanzanya sorgulanan renklerden yalnızca birini içeren İtalya'dan daha yüksek bir dereceye sahiptir.

CREATE TABLE Flags (Country nvarchar(30) NOT NULL, FlagColors varchar(200));  
CREATE UNIQUE CLUSTERED INDEX FlagKey ON Flags(Country);  
INSERT Flags VALUES ('France', 'Blue and White and Red');  
INSERT Flags VALUES ('Italy', 'Green and White and Red');  
INSERT Flags VALUES ('Tanzania', 'Green and Yellow and Black and Yellow and Blue');  
SELECT * FROM Flags;  
GO  
  
CREATE FULLTEXT CATALOG TestFTCat;  
CREATE FULLTEXT INDEX ON Flags(FlagColors) KEY INDEX FlagKey ON TestFTCat;  
GO   
  
SELECT * FROM Flags;  
SELECT * FROM CONTAINSTABLE (Flags, FlagColors, 'Green') ORDER BY RANK DESC;  
SELECT * FROM CONTAINSTABLE (Flags, FlagColors, 'Green or Black') ORDER BY RANK DESC;  

B. Derece değerlerini döndürme

Aşağıdaki örnek, "çerçeve", "tekerlek" veya "lastik" sözcüklerini içeren tüm ürün adlarını arar ve her sözcüğe farklı ağırlıklar verilir. Bu arama ölçütlerine uyan döndürülen her satır için, eşleşmenin göreli yakınlığı (derecelendirme değeri) gösterilir. Buna ek olarak, en yüksek derecelendirme satırları önce döndürülür.

USE AdventureWorks2022;  
GO  
  
SELECT FT_TBL.Name, KEY_TBL.RANK  
    FROM Production.Product AS FT_TBL   
        INNER JOIN CONTAINSTABLE(Production.Product, Name,   
        'ISABOUT (frame WEIGHT (.8),   
        wheel WEIGHT (.4), tire WEIGHT (.2) )' ) AS KEY_TBL  
            ON FT_TBL.ProductID = KEY_TBL.[KEY]  
ORDER BY KEY_TBL.RANK DESC;  
GO  

C. Belirtilen değerden büyük derece değerleri döndürme

için geçerlidir: SQL Server 2012 (11.x) ve üzeri.

Aşağıdaki örnek, Production.Document tablosunda birbirine yakın "bracket" ve "reflector" aramak için NEAR kullanır. Yalnızca derece değeri 50 veya daha yüksek olan satırlar döndürülür.

USE AdventureWorks2022  
GO  
  
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  

Not

Tam metin sorgusu maksimum uzaklık olarak bir tamsayı belirtmezse, yalnızca boşluğu 100 mantıksal terimden büyük olan isabetleri içeren bir belge NEAR gereksinimlerini karşılamaz ve derecelendirmesi 0 olur.

D. top_n_by_rank kullanarak ilk 5 dereceli sonucu döndürme

Aşağıdaki örnek, Description sütununun "hafif" veya "hafif" sözcüğünün yanında "alüminyum" sözcüğünü içerdiği ilk 5 ürünün açıklamasını döndürür.

USE AdventureWorks2022;  
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  

GO

E. LANGUAGE bağımsız değişkenini belirtme

Aşağıdaki örnekte LANGUAGE bağımsız değişkeninin kullanılması gösterilmektedir.

USE AdventureWorks2022;  
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)',  
      LANGUAGE N'English',  
      5  
   ) AS KEY_TBL  
   ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY];  
GO  

Not

top_n_by_rank kullanmak için LANGUAGE language_term bağımsız değişkeni gerekli değildir.

Ayrıca Bkz.

RANK ile Arama Sonuçlarını Sınırlama
Full-Text Arama
ile Sorgusu
Full-Text Arama Sorguları Oluşturma (Visual Database Araçları)
CONTAINS (Transact-SQL)
Full-Text Arama
ile Sorgusu
SELECT (Transact-SQL)

FROM (Transact-SQL)