sql serverda full text search kavramı

Upload: isa-karahan

Post on 31-Oct-2015

126 views

Category:

Documents


8 download

DESCRIPTION

Türkçe SQL 2012 Full Text Search

TRANSCRIPT

Full-Text Search Kavram

SQL Serverda Full-Text Search Kavram Yazan: Yiit AktanTeknik nceleme: Turgay Sahtiyan

Yaynlanma Tarihi: Haziran 2012Version: SQL Server 2012

zet: Bu makale, Full-Text Search ve Semantic Search kullanmnn amacn ve faydalarn sorguladktan sonra, programlama teknikleri arasndaki farklar derinlemesine inceleyip, ynetiminin nasl yaplaca zerinde duracaktr.

indekilerFull-Text Search (iFTS) Nedir ?3iFTS Mimarisi ve Bileenleri4Full-Text Indexing Sreci6Full-Text Querying Sreci6Kurulum ve Yaplandrma7SSMS ile Full-Text Catalog oluturulmas8T-SQL ile Full-Text Catalog Oluturulmas11SSMS ile Full-Text Index Oluturulmas12T-SQL ile Full-Text Index Oluturulmas18Full-Text Index Population19Full Population19Incremental Population20Update Population (Change Tracking-Based Population)20Rebuild ve Reorganize lemi21Yedekleme21Thesaurus22Stoplist25SSMS ile Stoplist Oluturulup, Stopword eklenmesi26T-SQL ile Stoplist Oluturulup, Stopword eklenmesi28Semantic Search Nedir ?29Semantic Searchn Kurulumu ve Yaplandrmas29Semantic Searchn Filetable ile ilikisi30Programlama31Full-Text Search Programlama Teknikleri32Semantic Search Programlama Teknikleri35Sonu36

Full-Text Search (iFTS) Nedir?Full-Text Search, SQL Server'n metin tabanl veri ve dkman aramak iin gelitirdii, dil destekli arama motorudur. Full-Text Search, 1998in sonlarnda Microsoft Indexing Service bileenlerini kullanarak oluturulup, ilk SQL Server 7.0 ile birlikte duyurulmutur. Microsoft Indexing Service, dosya sistemi zerinde dkman ve dosya aramak iin gelitirilen bir rndr. SQL Server 7.0 ile gelitirilen FTS, SQL Server 2000 ve SQL Server 2005 srmlerinde de devam ettirilmitir. Fakat bu srmlerde ki en byk eksiklik indexlerin birer dosya olarak dosya sistemi zerinde barndrlmas olmutur. Bu modelin bizler iin dezavantaj, veritabannn yedeini alrken veya yedekten geri dnerken Full-Text index lerin de birer dosya olarak gz nnde bulundurulmasnn gerekliliidir.SQL Server 2008 ile birlikte FTS btnleik bir modele (Integrated Full-Text Search - iFTS) gemitir. SQL Server 2008 ile artk Full-Text Search, Full-Text Engine filter daemon (msftefd.exe) servisinin kullanmn brakarak, The filter daemon host process (fdhost.exe) servisine gemitir. ndeksleme ilemi artk fdhost.exe tarafndan yaplmaktadr. Word breakerlar, stemmerlar ve indexer artk bu servis tarafndan ayr ayr ileme alnmaktadr. Full-Text Indexlerin SQL Server Engine tarafndan ilenmemesininen byk nedenlerinden biri 3rd Party word breakerlardr. COM nesnelerinin ierii gerei, SQL Server kendi engine modelinde bu nesneleriileme almak istemez ve bu zaten gvenli de deildir.SQL Server 2012de Full-Text Search, sorgu cmleleri ierisinde kullanlan operatrlerini (NEAR) daha da gelitirerek aramalarda snrlar geniletmitir. SQL Server 2012 ile birlikte 350 Milyon dkman leklendirilebilir hale gelmitir. 350 Milyonluk bir dkman havuzunda sorgular ve Full-Text Indexler test edildiinde 3sn den daha ksa srede indexlerin response verdii grlmtr. Bu sayede SQL Server 2008 zerinde ki lock sorununun zld grlmtr. nk SQL Server 2008 zerinde ki Full-Text Search de indexlerin rebuild olma sresi SQL Server 2012 de ki modeline gre daha uzun sryordu. Bu da sorgularn indexleri, indexlerin de sorgular lock lamasna yol ayordu. Fakat SQL Server 2012 ile birlikte rebuild olma sresinde ciddi anlamda ksalma olduu grlm ve lock sorunu ortadan kalkmtr. SQL Server 2012 ile birlikte Full-Text Search gelitirilerek Semantic Search mimarisini ierisine katmtr. lerleyen blmlerde Semantic Search detayl olarak inceleyeceiz.Peki, ama tam olarak Full-Text Search nedir?Full-Text Search, basit terimlerde, isim nne konan nvanlarda (r: Dr. , Prof.), Fiil ekimlerinde (r: Drive, Drove, Drives, Driving), ifadelerde ve sralamalarda kullanlan SQL Server ile btnleik alan gelimi bir arama motorudur.

iFTS Mimarisi ve BileenleriFull-Text Search mimarisi, ierisinde birok bileeni barndrr. Bu bileenler birbirleri ile btnlemi alrlar ve hiyerarik bir yap olutururlar. Bu hiyerari sorgularn istemci zerinden gnderilmesi ile balar ve kullanlan kriterlere gre mimari ierisinde barndrlan bileenler sayesinde ayklanarak dil-bilimsel olarak incelenip, istenilen kt retilir.Full-Text Search mimarisi aadaki ekilde detayl olarak gsterilmitir.

ekil 1 Full-Text Search mimarisi

Yukardaki ekilde de gsterilen Full-Text Search mimarisindeki ana bileenleri inceleyelim.

SQL Server query processor: SQL Server query processor, SQL sorgularn derleyip, altrlmasn ve sorgu btnlnn kontroln salar. Eer derlenen SQL sorgusunda Full-Text Search operatr kullanlyor ve bir Full-Text Indexe ynleniyor ise SQL Server query processor sorguyu Full-Text Enginee gnderip orada derlenmesini salar.Full-Text query processor: Full-Text query processor, Full-Text query compilation ve Full-Text query executionn birlemesinden oluan bir karlama alandr. SQL Server query processordan gnderilen istekleri (Full-Text Search sorgusu ieren istekler) karlayp, Full-Text Engine tarafndan ilenmesini salar.Full-Text Engine: Full-Text Engine, SQL Server query processor ierisinde Stoplist ve Thesaurus gibi bileenlerden veri alarak alr. Bir Full-Text Search sorgusu, SQL Server query processordan buraya dtnde sorgular burada derlenip altrlr.Indexer (Index Writer): Indexer, Full-Text Engine ile entegre olarak alarak, dkmanlardan veri almak, ierik okumak ve Full-Text Index'leri doldurmak iin alr.

Full-Text Index: Full-Text Index, indexer tarafndan doldurulur. Belirtilen tabloda ki veriyi indeksler. SQL Server 2005de Full-Text Indexler dosya sisteminde barndrlrd. SQL Server 2008den buyana artk bu yap Full-Text Engine ile entegre olup tamamen database ierisinde barndrlmaya baland.

Stoplist: Stoplist, gerek duyulmayan, sk kullanlan ve herhangi bir anlam iermeyen kelimelerden oluur (r: and, the, or). Bu kelimeler grubuna Stopwords deriz. Eski ismi Noise Wordsdr. Bunlarn btnn ise Stoplist olarak adlandrrz. Full-Text Engine, bu kelimeleri indekslemez. Stoplistin asl grevi anlamsz kelimelerin indekslenmesini engellemektir.

Word Breaker ve Stemmer: Word Breaker ve Stemmer, indekslenen veride dil-bilimsel olarak analiz yaparlar. kisi de dile zg olarak alr. Word Breaker, belirtilen dildeki szcksel kurallara dayal kelime snrlarn bulur. Stemmer ise fiil ekimlerini organize eder. (r: run, ran, running, runner)

Thesaurus: Thesaurus, bizim szlk dosyalarmzdr. Bu dosyalar fiziksel olarak XML dosyas olarak dosya sisteminde tutulurlar. Her dil iin farkl XML dosyas mevcuttur. E anlaml kelimeleri bulmak istediimizde veya istediimiz kelimeleri birbirleri arasnda deitirmek istediimizde bu XML dosyalarn kullanrz. Bu dosyalar Instance bazldr. Bir instance zerinde yklenip, tantlan Thesaurus dosyas, baka bir instanceda ykl olarak gzkmez. Bu dosyalar varsaylan olarak FTData ierisinde tutulur (C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\FTData).

Filters: varbinary, varbinary(max), image veya xml veri tipinde ki kolonlar ierisinde tutulan dkmanlar, Full-Text Index tarafndan indekslenmeden nce filtrelenmesi gerekir. Bu grevi filter stlenir. Birok filter mevcuttur. En ok kullanlanlar Microsoft Word ve Microsoft Excel dkmanlar iin olan filterdr. Filter sayesinde dkman ierisinde ki kelimenin pozisyonu belirlenip, gerek duyulmayan formatlama kalplar kaldrlr.

Protocol Handler: Protocol Handler, indekslenen veriyi memoryden ekerek tablo ierisinden eriilmesini salar. Bir dier grevi ise, Filter tarafndan ileme alnacak veriyi saptayp Filter Daemon Hosta gnderip, gerektii taktirde Word Breaker bileenini devreye sokmaktr.

Full-Text Indexing Sreci

Full-Text Indexler, indexer tarafndan doldurulduunda, Full-Text Engine, byk veri paketlerini memoryye aktarp, Filter Daemon Hosta bu aktarmn bilgisi verir. Bu blmde aktarlan veri, filter tarafndan kelime olarak ayrtrlp (word break), filtrelenip kelime havuzuna gnderilir. Oluturulan bu kelime havuzundan veri Full-Text Engine tarafndan ekilip, Stoplist ilemine tabi tutulur. Bu ilem srasnda istenmeyen kelimeler (Stop Word) bu veri ierisinden ayklanr ve kelime snrlar belirlenir. Belirlenen bu snrlar dorultusunda sorgu Full-Text querying sreci ierisinde deerlendirilip eer Thesaurus dosyalar tarafndan bir ilem gerekleecek ise xml dosyalar ile bu veri eletirilip istenen kt salanr.

Full-Text Querying Sreci

SQL Server query processor, sorgu ierisinde ki Full-Text ieriini Full-Text Enginee gndererek querying srecini balatr. Bu sre ierisinde dil-bilimsel olarak ayrtrmalar ve kelime kstlamalar (Word Breaker, Thesaurus ve Stemmer) uygulanr.

Kurulum ve Yaplandrma

iFTSin kurulumu ve ynetimi, ister SQL Server Management Studio (SSMS) ister T-SQL DDL ifadeleri ile gerekletirile bilinir. Her iki yoldan da Full-Text Catalog oluturup, Full-Text Indexler zerinde almak mmkndr. Bu blmde iki trl kullanm da inceleyeceiz.iFTSin kurulumu SQL Server 2012de gayet basittir. Kuruluma balamadan nce ilk olarak iFTSin instance zerinde kurulu olup olmadn sorgulamamz gerekmektedir. Bu sorgulama aadaki ekilde basite gerekletirile bilinir.SELECT IIF (SERVERPROPERTY('IsFullTextInstalled') = 1, 'Installed', 'Not Installed') AS [IsFullTextInstalled]GO

Eer yeni bir instance kurulumu gerekletiriyorsak SQL Server 2012 Setup ierisinde Feature Selection blmnden Full-Text and Semantic Extractions for Search sememiz gerekmektedir.

ekil 2 Instance kurulumunda Full-Textin seilmesi

SSMS ile Full-Text Catalog oluturulmas

Full-Text Catalog, database baml alan bir yapya sahiptir. Bu yzden Full-Text Catalog, kullanmak istediimiz database altnda yaratlr. Mevcut rnekleri AdventureWorks2012 databasei altnda gerekletireceim. AdventureWorks2012 databaseini http://msftdbprodsamples.codeplex.com/releases/view/55330 adresinden indirebilirsiniz.Aadaki admlar SQL Server 2012 SSMS zerinde adm adm gerekletirilecektir.

1) Object Explorer zerinde Instance ismi geniletilerek Databases klasr altna girilir.2) Database klasr ierisinden Storage klasrne girilir.3) Storage klasr altndaki Full-Text Catalogs klasrne sa tklanp New Full-Text Catalog... seilir.

ekil 3 SSMS zerinde New Full-Text Catalog...un seilmesi4) New Full-Text Catalog... seildikten sonra karmza Full-Text Catalogumuzu yaratacamz ana ekran kar.

ekil 4 SSMS zerinde Full-Text Catalog oluturmak iin karlalan ana ekran

Alan ekranda oluturmak istediimiz Full-Text Catalogumuzun ismini Full-text catalog name blmne yazmamz gerekir. Full-Text Catalogumuzun ynetiminin hangi kullanc tarafndan yaplaca Owner blmne yazlr. Eer yaratacamz Full-Text Catalogu, databaseimiz altnda ki default catalogumuz olarak belirlemek istiyorsak Set as default catalogu semeliyiz. Bunun anlam eer bir Full-Text Index yaratmak istersek ve kullandmz SQL ifadesinde bir catalog ismi belirtmezsek indeximiz default olarak belirlediimiz catalog altnda oluturulacaktr. Yaratacamz kataloumuzun Sensitive/Insensitive ayarlarn Accent sensitivity blmnden gerekletiririz.

5) Gerekli alanlar doldurulduktan sonra OKe tklayarak Full-Text Catalogumuz yaratm oluruz.

ekil 5 SSMS zerinde Full-Text Catalog oluturmak iin gerekli alanlarn doldurulmas

T-SQL ile Full-Text Catalog Oluturulmas

Full-Text Catalogu SSMS zerinde yaratrken karlatmz btn blmleri SQL sorgusu zerinden de tanmlayarak, oluturabiliriz. Yukarda karlatmz ekrann ayns aadaki gibi oluturula bilinir.USE [AdventureWorks2012]GO

CREATE FULLTEXT CATALOG [AdventureWorks2012_Cat] WITH ACCENT_SENSITIVITY = OFFAS DEFAULT AUTHORIZATION [dbo]GO

Eer kullanmak istemediimiz Full-Text Catalogumuzun default olarak atanmasn istiyorsak yukardaki SQL ifadesini aadaki gibi sadeletirip altrmamz mmkndr.USE [AdventureWorks2012]GO

CREATE FULLTEXT CATALOG [AdventureWorks2012_Cat] AS DEFAULTGO

Eer oluturulmu Full-Text Catalog zerinde bir deiiklik yapmak istiyorsak bunun iin ALTER Rebuild ifadesi kullanlr. rnek olarak, Accent Sensitivei True olan bir Full-Text Catalogu ALTER ifadesi kullanarak OFF haline getirelim.USE [AdventureWorks2012]GO

DECLARE @FullTextCatalogName NVARCHAR(250)DECLARE @AlterRebuild NVARCHAR(250)SET @FullTextCatalogName = 'AdventureWorks2012_Cat'SET @AlterRebuild = 'ALTER FULLTEXT CATALOG ' + @FullTextCatalogName + ' REBUILD WITH ACCENT_SENSITIVITY = OFF'SELECT IIF (FULLTEXTCATALOGPROPERTY(@FullTextCatalogName, 'accentsensitivity') = 1, (SELECT (@AlterRebuild)), '-') AS [Set Accent Sensitivity to OFF]GO

Yukardaki ifade de nce belirtmi olduumuz Full-Text Catalogumuzun ACCENT_SENSITIVITY zelliinin True olup olmadn kontrol ettik. Eer True ise bunu belirtmi olduumuz Alter Rebuild ifadesi ile False durumuna ekebileceimiz SQL ifademizi oluturmu olduk.Eer Full-Text Catalogumuzu silmek istiyorsak bunun iin DROP ifadesini kullanmamz gerekir. Fakat unutmamamz gereken eer Full-Text Catalogumuz ierisinde bir veya birden fazla Full-Text Index mevcut ise, ncelikle Full-Text Indexlerin silinmesi daha sonradan Full-Text Catalogun silinmesi gerekmektedir. nk ierisinde Full-Text Index olan bir Catalog ne SQL ifadesi ile ne de SSMS zerinden silinemez. Drop ifademizi aadaki gibi kullanabiliriz.USE [AdventureWorks2012]GO

DROP FULLTEXT CATALOG AdventureWorks2012_CatGO

DROP ifadesinin kullanlabilmesi iin ifadeyi altracak olan kullancnn Full-Text Catalog zerinde DROP hakknn olmas veya silmek istediimiz Full-Text Catalogun ykl olduu databasede db_owner veya db_ddladmin rolelerinin bulunmas gerekmektedir.Oluturulan Full-Text Catalog detaylarn SQL ifadesi ile grntlemek iin sys.fulltext_catalog DMVsi kullanlabilir. Aadaki gibi kullanm ile database altndaki btn Full-Text Catalog bilgilerine ulaabilirsiniz.USE [AdventureWorks2012]GO

SELECT * FROM sys.fulltext_catalogsGO

SSMS ile Full-Text Index Oluturulmas

1) Object Explorer ekranndan instance ismimiz geniletilerek Databases klasrne geilir.2) Databases klasrnden databaseimiz seilerek Tables klasr geniletilir.3) Tables klasr altnda Full-Text Indeximizin oluturulmasn istediimiz tabloya sa tklanp Full-Text index sekmesinden Define Full-Text Index...e tklanr.

ekil 6 SSMS zerinde Full-Text Index oluturmak iin Define Full-Text index... e tklanmas

4) Define Full-Text Index...e tkladktan sonra, aadaki Full-Text Indexing Wizard karlama penceresi belirir. Bu wizard sayesinde gerekli tanmlamalar rahatlkla yapmamza olanak salanr. Wizardmz daki admlara gemek iin Next >e tklyoruz.

ekil 7 SSMS zerinde Full-Text Index oluturmak iin Full-Text Indexing Wizard karlama ekran

5) Karmza kan ekranda bir adet Unique index sememiz isteniyor. Mevcut bir unique index seiyoruz. Full-Text Index oluturabilmek iin indexin oluturulaca tabloda kesinlikle bir adet unique indexin olmas gerekmektedir.

ekil 8 SSMS zerinde Full-Text Index oluturmak iin unique index belirlenmesi

6) Select Table Columns ekrannda indekslenmesini istediimiz columnlar belirlememiz gerekmektedir. Bu ekranda seilen columnlar zerinde kullanacamz Word Breaker dilini de belirlememiz gerekir. Eer seilen columnlar da Semantic Search kullanm gerekletirilecekse Statistical Semanticsi iaretlememiz gerekmektedir. Eer Statistical Semantics alann iaretleyeceksek ncesinde kesinlikle Semantic Language Statistics Databasein register edilmi olmas gerekmektedir. Semantic Searche ilerleyen blmler de detayl deineceiz.

ekil 9 SSMS zerinde Full-Text Index oluturmak iin indekslenecek columnlarn belirlenmesi

7) Select Change Tracking ekrannda index deiikliklerimizin ilem grme biimi belirlenir. Burada herhangi bir deiiklik durumunda deiikliin kendiliinden ilenmesi iin Automaticallyi seiyoruz.

ekil 10 SSMS zerinde Full-Text Index oluturmak iin index deiiklik alglama biiminin belirlenmesi

Automatically: Deiiklikler otomatik olarak alglanp, Full-Text Index otomatik olarak update edilir. Manually: Deiiklikler otomatik olarak alglanr, fakat ALTER FULLTEXT INDEX ifadesi ile indexler update edilene kadar deiiklikler ilenmez. Do not track changes: Bu seenekte deiiklikler alglanmaz ve index zerine ilenmez. Deiikliklerin ilenmesi iin manuel olarak ALTER FULLTEXT INDEX ifadesi kullanlarak indexin update edilmesi gerekmektedir.

8) Select Catalog, Index Filegroup, and Stoplist ekrannda Select full-text catalog blmnde mevcut Full-Text Cataloglarmzdan birini sememiz istenir. Eer mevcut bir Catalogumuz yoksa veya yaratacamz Full-Text Indeximizin yeni bir Catalog ierisinde olmasn istiyorsak Create a new catalog blmnden yeni bir Full-Text Catalog oluturulur. Ayrca, Filegroup ve Stoplistlerimiz bu ekrandan belirlenebilir.

ekil 11 SSMS zerinde Full-Text Index oluturmak iin Full-Text Catalogun belirlenmesi

9) Define Population Schedules (Optional) ekrannda eer 7. Admda ki deiiklik alglama biimi Do not track changes olarak seildiyse gereklidir. Opsiyonel olan bu ekran Next > diyerek geiyoruz.

ekil 12 SSMS zerinde Full-Text Index oluturmak iin indexin update olma srelerinin belirlenmesi

10) Son olarak karmza Full-Text Indexing Wizard Description ekrannda oluturulacak index iin belirlemi olduumuz zelliklerin zeti gelmektedir. Finish diyip Full-Text Indeximizi oluturuyoruz.

ekil 13 SSMS zerinde Full-Text Index oluturmak iin oluturulacak Full-Text Index detaylarnn n izlenmesi

Oluturmu olduumuz indexi detayl olarak Full-Text Catalog altndan grebiliriz. Bunun iin mevcut databaseimiz altndaki Storage klasrnden Full-Text Catalogs klasrne geip Full-Text Catalog ismimize sa tklayp Properties demeliyiz. Alan Full-Text Catalog Properties ekranndan Tables/Views tabnda detayl olarak indekslenen tabloyu ve kolonlarn grmemiz mmkndr.

ekil 14 SSMS zerinde oluturulan Full-Text Indexin Full-Text Catalog zerinden detaylarnn n izlenmesi

T-SQL ile Full-Text Index Oluturulmas

Full-Text Indexlerin SQL ifadesi ile yaratlmas, SSMS zerinde oluturmaktan ok daha basittir. SSMS zerinde Full-Text Index yaratlmasn veya deiikliklerini CREATE FULLTEXT INDEX ve ALTER FULLTEXT INDEX ifadesi ile yapmak mmkndr.USE [AdventureWorks2012]GO

CREATE FULLTEXT INDEX ON [HumanResources].[Employee] ([Gender] LANGUAGE English, [JobTitle] LANGUAGE English)KEY INDEX [PK_Employee_BusinessEntityID] ON ([AdventureWorks2012_Cat])WITH (CHANGE_TRACKING = AUTO, STOPLIST = SYSTEM)GO

ALTER FULLTEXT INDEX ON [HumanResources].[Employee] ENABLEGO

Yukarda ki kod blounda, bir nceki blmde SSMS zerinden oluturduumuz Full-Text Indexin birebir SQL ifadesi ile olan hali gsterilmitir. Eer ou zellii default olarak gemek isterseniz, CREATE FULLTEXT INDEX ifadesini aadaki gibi sadeletirebilirsiniz.USE [AdventureWorks2012]GO

CREATE FULLTEXT INDEX ON [HumanResources].[Employee]([Gender], [JobTitle])KEY INDEX [PK_Employee_BusinessEntityID] WITH STOPLIST = SYSTEMGO

Full-Text Index Population

Full-Text Indexler yaratldktan sonra doldurulmas gerekmektedir. Eer CHANGE_TRACKING = AUTO olarak set ettiimiz bir Full-Text Index varsa, index oluturulduktan hemen sonra populate edilir. Eer CHANGE_TRACKING = OFF olarak set edildiyse, aralklarla indexlerin deiiklikleri fark etmesini salamamz gerekir. SQL Server 2012de Full-Text Indexleri beslemek iin 3 eit zellik bulunmaktadr. Bunlar Full Population, Incremantal Population ve Update Populationdr. Bu blmde bu 3 zellik zerinde duracaz.

Full Population

Full Population srecinde indexler btn tablo ierii iin yenilenirler. Bu sreci tablo ierisini satr satr okuyarak gerekletirirler. Default olarak yeni bir Full-Text Index yaratld anda SQL Server, indexi Full Population srecine tabi tutar. Eer byk bir tablo ierisindeki CHANGE_TRACKINGi OFF veya MANUEL olan index, full populate grecekse bu srecin en dk peak zamanda yaplmas gerekir. Full Populationn balatlmas iin aadaki SQL ifadesi kullanlmaldr.

USE [AdventureWorks2012]GO

ALTER FULLTEXT INDEX ON [HumanResources].[Employee] START FULL POPULATIONGO

Incremental Population

Incremental Populationda, index zerinde en son Full Population uygulandktan sonra deien satrlar ekilir. Byk tablolar iin Full Populationa gre ok daha performansl alr. nk Full Population tarafndan index verileri, Incremental Population tarafndan denetlenir ve sadece o satrdan sonraki silinen, deien veya yeni eklenen veriler iin gereken satrlar ekilir. Incremental Population kullanm aadaki gibidir.USE [AdventureWorks2012]GO

ALTER FULLTEXT INDEX ON [HumanResources].[Employee] START INCREMENTAL POPULATIONGO

Update Population (Change Tracking-Based Population)

Update Population, Incremental Population ile benzerlik gsterir. SQL Server 2008 ve ncesinde Change Tracking-Based Population olarak adlandrlrd. Update Population, indexin en son full population grme sresinden sonraki deiiklikleri ana tabloda yeni bir deer atayarak saptar. Update Population balatldnda deiiklikler nce Change Tracking Indexe oradan Full-Text Indexe yazlr. Update Population kullanabilmek iin CHANGE_TRACKING zelliinin MANUEL olarak ayarlanmas gerekmektedir. Update Population aadaki SQL ifadesi ile uygulanr.USE [AdventureWorks2012]GO

ALTER FULLTEXT INDEX ON [HumanResources].[Employee] START UPDATE POPULATIONGO

Rebuild ve Reorganize lemi

Rebuild ilemi esnasnda yeni bir Full-Text Catalog yaratlp nceki hali silinir. Bu ileyii tablo ierisindeki indexlerin online olarak rebuild grmesine benzetebiliriz. Rebuild ilemi Full-Text Catalog ierisinde bulunan btn Full-Text Indexleri etkileyen bir ilemdir. Rebuild ilemi uygulanan Full-Text Catalog ierisindeki btn indexler Full Population grp yenilenirler. Reorganize ilemi Full-Text Catalog ierisindeki kk lekli birden fazla Full-Text Indexe baldr. Eer Full-Text Catalog ierisinde ok sayda ufak index mevcut ise bunlar reorganize ilemine tabi tutulup tek byk bir index olarak merge edilirler. Bu da Full-Text Catalogun indexler ile haberlemesinde performans art salar.Rebuild ilemi iin aadaki SQL ifadesi kullanlr.

USE [AdventureWorks2012]GO

ALTER FULLTEXT CATALOG AdventureWorks2012_Cat REBUILD WITH ACCENT_SENSITIVITY=OFFGO

Yedekleme

SQL Server 2012de Full-Text Catalogu ayr olarak yedeklememiz gerekmez. Eer yedekleyeceimiz database ierisinde Full-Text Catalog varsa o da backup ierisine alnp yedeklenir. nk SQL Server 2008 ile birlikte Full-Text Catalog tamamen integrated hale gelmitir. SQL Server 2012de, SQL Server 2005 ve ncesinde olduu gibi dosya sisteminde herhangi bir index barndrlmaz. Bu da backup alrken ayrtrma ileminden bizi kurtarm olur.Fakat yedekleme ve yedekten geri dnme ilemlerinde nemli olan bir konu vardr. Eer Catalog ierisindeki indexler ayr filegrouplar da tutuluyorsa backup alrken bu filegrouplarn gz nnde bulundurulmas gerekmektedir. Bu yzden backup almadan nce, aadaki SQL ifadesi ile Full-Text Catalog ierisinde ki indexlerin detayl bilgisini ekip, filegroup zelliklerini dikkate almamz gerekmektedir.

USE AdventureWorks2012GO

DECLARE @TableID INTSET @TableID = (SELECT OBJECT_ID('[HumanResources].[Employee]'))

SELECT object_name(@TableID) AS table_name, IIF(i.is_enabled = 1, 'Yes', 'No') AS is_enabled, i.change_tracking_state_desc, IIF(i.has_crawl_completed = 1, 'Yes', 'No') AS has_crawl_completed, i.crawl_type_desc, c.name as fulltext_catalog_name, f.name AS file_group FROM sys.fulltext_indexes i, sys.fulltext_catalogs c, sys.filegroups f WHERE i.fulltext_catalog_id = c.fulltext_catalog_id AND f.data_space_id = i.data_space_id GO

Thesaurus

Thesaurus, dosya sistemi zerinde tutulan dile zg hazrlanm szlk dosyalardr. Thesaurus, sayesinde aramalarmzda, bizim iin e anlam ieren kelimeleri birbirleri arasnda deitirebilir veya yanl yazldn tahmin ettiimiz kelimeleri bu dosyalar sayesinde istediimiz kelime ile replace edebiliriz.Thesaurus dosyalar XML dosyalar dr. Bu dosyalar, MSSQL\FTData altnda tutulurlar. Dosyalar, ts.xml formatndadr. Dil ksaltmalar global olarak harf olarak set edilmitir. Thesaurusun default lokasyonu aadaki gibidir.C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\FTData

ekil 15 Thesaurus XML dosyalar

Bu dosyalar instance bazl alrlar. Bir instance zerinde tanmlanan Thesaurus dosyas, baka bir instanceda tanml olarak gzkmez. Thesaurus dosyas, xml terimleri ierir. rnek olarak tsenu.xml dosyasn yani ngilizce thesaurus dosyasn notepadde ap ieriini inceleyelim.

ekil 16 Thesaurus XML dosyas ierii

XML dosyalarnn ierii default olarak commentl olarak gelir. Thesaurus dosyalarn 3 blmde inceleyeceiz.

Diacritics Sensitive: Bu xml deyiminin () ierisi 0 veya 1 olmaldr. Default olarak 0 gelir ve anlam accent-insensitive olmasdr. rnek olarak aramalarmzda accent-sensitive yani deeri 1 olarak set edip caf diye ararsak arama sonucu bize yine caf olarak gelecektir. Fakat deeri 0 yani accent-insensitive olarak set edip aramamz gerekletirirsek, sonucunda cafe yi aldmz grebiliriz.Expansion: Expansion, e anlaml kelimeler aras gei yapmamz salayan bir deyimdir. rnein, Internet Explorer, IE ve IE5 bizim iin ayn anlam ifade eder. Aramalar sonucunda bunlardan biri aratldnda, e anlamllarnn da sorgu sonucunda gzkmesini istiyorsak, expansion deyimi altnda bloklar aras bu kelimeleri yazmalyz.Replacement: Replacement deyimi altnda genelde belirgin yazm yanllar olabilecek kelimeleri doru olan halleri ile deitiririz. Replacement, belirleyeceimiz spesifik kelimeler aras gei yapmamza olanak salar. Replacement yapabilmemiz iin, blou altna gerek kelimemizi blou ierisine yazp, yanl yazlacan tahmin ettiimiz kelimeleri de blou ierisine yazmalyz.rnek olarak aadaki XML dosyas istenildii gibi deitirilebilir.

0 Mert Cesur Ankaa Ankarraa Ankarra Anakara Ankara

Thesaurus dosyalarnn instance ierisinde tanmlanmas iin sp_fulltext_load_thesaurus_file stored procedure kullanlr. Kullanm aadaki gibidir.EXEC sys.sp_fulltext_load_thesaurus_file 1033GO

Stored Procedure execute ederken sys.sp_fulltext_load_thesaurus_filedan sonra Dil IDsinin yazlmas gerekmektedir. Her dil farkl xml dosyasn arr. Her dilin kendi IDsi vardr. SPyi kullanmadan nce tanmlamak istediimiz thesaurus dosyasnn dil IDsini almamz gerekmektedir. Aadaki gibi mevcut btn dillere ve IDlerine ulala bilinir.

SELECT [alias] AS [Language], [lcid] AS [ID] FROM [master].[sys].[syslanguages]GO

Stoplist

Stoplist, Full-Text Searchn gerek duymad, sk kullanlan ve herhangi bir anlam iermeyen kelimeler topluluudur. Bu kelimelere Stop Word deriz. SQL Server 2008 ncesinde bu kelimelere Noise Words deniliyordu ve MSSQL\FTData altnda dosya bazl (r: noiseenu.txt) tutuluyorlard. SQL Server 2008 ile birlikte artk Stopwords olarak adlandrlmaya ve tamamen btnleik olarak database altnda tutulmaya baland. Bu yap SQL Server 2012de de devam etmektedir. stenildii kadar kendi Stoplistlerimizi kendi belirleyeceimiz Stop Wordler ile oluturabiliriz. Tek snrlama, bir Full-Text Index iin sadece bir adet Stoplist tanmlayabiliriz. SQL Server 2012 ile Full-Text Searchn destekledii btn diller (baz Uzak Dou dilleri hari) iin default Stoplistler mevcuttur. SQL Server 2008de Trkenin Stoplisti bulunmasna ramen, default olarak Trke desteklenmemekteydi. SQL Server 2012 ile birlikte Trke de ngilizce gibi default diller arasna girmitir. System Stoplistlerini ve ierdikleri kelimeleri grmek iin aadaki SQL ifadesi kullanlabilir.

USE [master]GO

SELECT a.stopword AS [Stopword], b.alias AS [Language] FROM [sys].[fulltext_system_stopwords] aINNER JOIN [sys].[syslanguages] bON a.language_id = b.lcidORDER BY b.aliasGO

Kendi Stoplistimizi oluturmak iin hem SSMS zerinden hem de SQL ifadelerini kullanabiliriz.

SSMS ile Stoplist Oluturulup, Stopword eklenmesi

SSMS zerinden Stoplist oluturabilmek iin aadaki admlar takip edilmelidir.

1) Object Explorer zerinden Databases klasr girilip, mevcut database ismimiz geniletilir.2) Storage klasr geniletilerek Full-Text Stoplists klasrne sa tklanp, New Full-Text Stoplist...e tklanr.

ekil 17 Stoplist oluturulmas

Bu ekranda aadaki zelliklere dikkat edilmesi gerekmektedir. Create an empty stoplist: Yeni fakat ierii olmayan bo bir Stoplist yaratmak iin seilmelidir. Create from the system stoplist: Yeni fakat system stoplist zerinden bir Stoplist yaratmak iin seilmelidir. Create from an existing full-text stoplist: Dier databaseler zerinde bulunan Stoplistler kullanlarak yeni bir Stoplist yaratmak iin seilmelidir.

3) Full-Text Stoplists altnda oluturulan stoplist zerine sa tklanp Propertiesine girilir.

ekil 18 Stoplist e Stopword eklenmesi

Action: Action ksmnda stop word ekleyebilir, silebilir veya Stoplisti temizleyebilirsiniz. Stop word: Eklemek veya silmek istediimiz Stop Wordleri buraya yazmamz gerekmektedir. Full-text language: Ekleyip veya sileceimiz Stop Wordlerin hangi dil zerinden yaplacan belirteceimiz alandr.

4) Alan ekranda ki Action ksmnda Add stop word seilip, Stop word alanna eklemek istediimiz stop word yazlr.5) Son olarak ekleyeceimiz Stop Wordn hangi dilede eklenmesini istiyorsak Full-Text language blmden dil seilip OKe tklanr.

Oluturulan Stoplisti ve eklenen Stop Wordleri aadaki SQL ifadesi ile grntlenebilir.

USE [AdventureWorks2012]GO

SELECT b.stopword AS [Stop Word], b.language AS [Language], b.language_id AS [Language ID], a.name AS [Stop List] FROM sys.fulltext_stoplists a INNER JOIN sys.fulltext_stopwords b ON a.stoplist_id = b.stoplist_idGO

T-SQL ile Stoplist Oluturulup, Stopword eklenmesi

T-SQL ile Stoplist oluturmak SSMS zerinden gerekletirmek kadar kolaydr. Aadaki ekilde kendi Stoplist imizi oluturup ieriine istediimiz dilde Stopword ekleyebilir, sonrasnda bu eklemi olduumuz Stoplisti mevcut Full-Text Index zerine atayabiliriz.

USE [AdventureWorks2012]GO

CREATE FULLTEXT STOPLIST AW2012_Custom_Stoplist FROM SYSTEM STOPLIST AUTHORIZATION [dbo];GO

ALTER FULLTEXT STOPLIST AW2012_Custom_Stoplist ADD 'cool' LANGUAGE 1033;GO

ALTER FULLTEXT INDEX ON HumanResources.Employee SET STOPLIST = AW2012_Custom_StoplistGO

Semantic Search Nedir ?

Semantic Search, Full-Text Searchn gelitirilmi halidir. Tamamen Full-Text Search mimarisini kullanr. Full-Text Search, kelimeler zerine ilem yapabilme yetkinliine sahiptir. Fakat Semantic Search ile ilemi kelime kstndan kartp, ilem grecek olan kelimenin anlamna ynlendirebiliriz. Yani Semantic Search ile aramalarmz sadece kelimeye gre deil, dkmann anlam btnln gz nnde bulundurarak, kelimeler aras anlamlar kartp gerekletirebilmekteyiz. Semantic Search kullanabilmek iin, Semantic Language Statistics Databasei download edip, attach etmeniz, ardndan da register etmeniz gerekmektedir.Semantic Search kullanmna en iyi rnek, FileTable ierisinde tutulan CVlerin IK departman tarafndan anlamlarna gre aratmak diyebiliriz.

Semantic Searchn Kurulumu ve Yaplandrmas

lk olarak Semantic Search download etmemiz gerekmektedir. Bunun iin http://www.microsoft.com/en-us/download/details.aspx?id=29069 adresinden msi pakedini edinebilirsiniz. Bu paket ierisinde semanticsdb databaseinin MDF ve LDF dosyalar bulunmaktadr. Semanticsdb ierisinde dil dosyas bilgileri tutulmaktadr.

Semantic Search kullanmna balamak iin ncelikle Full-Text Searchn kurulu olduundan emin olmamz gerekmektedir. Bunun iin Full-Text Searchn instance ierisinde ykl olduundan aadaki kod blou ile emin olmalyz.SELECT IIF (SERVERPROPERTY('IsFullTextInstalled') = 1, 'Installed', 'Not Installed') AS [IsFullTextInstalled]GO

Ardndan, indirmi olduumuz ve diskimize atmz msi paketi ierisindeki semanticsdb veritaban dosyalarn attach ediyoruz.CREATE DATABASE semanticsdb ON ( FILENAME = 'C:\Microsoft Semantic Language Database\semanticsdb.mdf' )LOG ON ( FILENAME = 'C:\Microsoft Semantic Language Database\semanticsdb_log.ldf' ) FOR ATTACHGO

Databaseimizi attach ettikten sonra Semantic Search kullanma balayamayz. Bunun iin Semantic Language Statistics Databasein aadaki gibi register edilmesi gerekmektedir. lk olarak Semantic Searchn register olup olmadn renelim.SELECT * FROM sys.fulltext_semantic_language_statistics_databaseGO

Eer register edilmemi ise aadaki gibi register ediyoruz.EXEC sp_fulltext_semantic_register_language_statistics_db @dbname = N'semanticsdb'GO

Semantic Searchn Filetable ile ilikisi

Semantic Search, SQL Server 2012 ile birlikte gelen FileTable ile entegre alabilen bir yapya sahiptir. FileTable ierisinde barndrdmz dkmanlarmz Semantic Search sayesinde kelimelerin anlamlarn skorlama ve sralama yaparak istediimiz ekilde listeleme yapmaya olanak salanr.Semantic Searchn FileTable ile entegre almasnda dkmanlar zerinde ki Property List zelliinin nemi byktr. rnein, FileTable ierisinde barndrdmz dkmanlarn zelliklerinde ki Details ksmnda yer alan Propertylere gre arama gerekletirebiliriz. Barndrdmz dkmanlarn Balk, Yazar vb. zellikleri FileTable ierisinde rahatlkla aranabilir.

ekil 19 Microsoft Word dkman zerindeki propertyler.

Programlama

SQL Server 2012 ile birlikte Full-Text Search zerinde programlama alannda en byk yenilik NEAR operatrne gelmitir. SQL Server 2008de ki kullanmnda kelimeler aras uzaklk hesab yaplamyordu. Fakat SQL Server 2012 ile birlikte NEAR operatr leklendirilebilir hale gelmitir. NEAR operatrnn yeni haline Full-Text Search Programlama Teknikleri blmnde deineceiz.Semantic Search alannda 3 temel fonksiyon bulunmaktadr. Bu fonksiyonlar sayesinde kelimelerin anlamlar zerinde aramalar gerekletirilmektedir.

Full-Text Search Programlama Teknikleri

Full-Text Search zerinde yaygn olarak kullanlan birka programlama teknii mevcuttur. Bunlardan en yaygn olan, ekimsel fiil (Inflectional Forms) kullanmdr. ekimsel fiil kullanm ile bir fiilin ekimleri rahatlkla sorgularn sonucunda arla bilinir. ngilizceden rnek vermek gerekirse, run, ran, running diyebiliriz. ekimsel Fiil kullanm iin FORMSOF tagi ierisinde INFLECTIONAL yazlarak arama szcmz oluturulur. Bu kullanma rnek bir yapda denemek iin aadaki kod blou zerinde alalm.lk olarak Full-Text Search platformunu ve ilgili verileri oluturalm.USE [AdventureWorks2012]GO

CREATE TABLE dbo.DemoTable ( ID INT IDENTITY(1,1) NOT NULL ,Sentence VARCHAR(MAX) CONSTRAINT PKID PRIMARY KEY(ID) )GO

CREATE UNIQUE INDEX IDX_SentenceID ON dbo.DemoTable(ID)GO

CREATE FULLTEXT CATALOG AW2012_Catalog AS DEFAULTGO

CREATE FULLTEXT INDEX ON dbo.DemoTable(Sentence) KEY INDEX IDX_SentenceID WITH STOPLIST = SYSTEMGO

INSERT INTO dbo.DemoTable(Sentence) VALUES('I go to the cinema')INSERT INTO dbo.DemoTable(Sentence) VALUES('I ran to the mall')INSERT INTO dbo.DemoTable(Sentence) VALUES('I''m drinking tea')GO

Oluturmu olduumuz DemoTable tablosu ierisindeki Sentence kolonu zerinde ekimsel Fill yapsn kullanarak aramalarmz gerekletirelim. Aramalarmzda eklemi olduumuz cmlelerde ki fiillerin zamanlarn deitirerek gerekletiriyoruz.USE [AdventureWorks2012]GO

SELECT * FROM dbo.DemoTable WHERE CONTAINS(Sentence, 'FORMSOF( INFLECTIONAL, "went" )')GO

SELECT * FROM dbo.DemoTable WHERE CONTAINS(Sentence, 'FORMSOF( INFLECTIONAL, "run" )')GO

SELECT * FROM dbo.DemoTable WHERE CONTAINS(Sentence, 'FORMSOF( INFLECTIONAL, "drunk" )')GO

Sorgu sonucu olarak eklemi olduumuz cmleleri ekimsel Fiil olarak aldmz grebiliyoruz.

ekil 20 ekimsel Fiil ile eklemi olduumuz cmlelerin sorgu sonucu dndn gryoruz.

Programlama blmnde bahsettiimiz gibi SQL Server 2012de NEAR operatr artk kendi koullarmza gre leklendirilebilir hale getirilmitir. NEAR operatrnn yeni hali zerinde rnekler ile birlikte alalm.

NEAR operatr SQL Server 2008de aadaki gibi kullanlyordu.SELECT * FROM dbo.DemoTable WHERE CONTAINS (Sentence, 'Search NEAR questions')

Bu kullanmda Search ve questions kelimeleri, eer ayn cmlede bulunuyorsa sorgu sonucumuza istediimiz olumlu cevab dndrebiliyorduk. Yenilenen NEAR operatr ile artk bu iki kelime aras uzaklk farkn hesaplayabilmekteyiz. Yani iki kelime aras ka adet kelime mevcut ise belirteceimiz kelime says ile kelimeler aras uzaklk hesabn gerekletirebiliyoruz. Yenilenen NEAR operatrnn kullanm aadaki gibidir.SELECT * FROM dbo.DemoTable WHERE CONTAINS (Sentence, 'NEAR((Search, questions), 10, FALSE)')

ok sk kullanlan teknikler arasnda szlk dosyas (Thesaurus) kullanm da bulunmaktadr. Thesaurus dosyalar sayesinde istediimiz kelimeleri, belirteceimiz kelimeler ile replace etmemiz mmkn olmaktadr. Bu yapda kullanm iin ekimsel Fiil kullanmnda grdmz gibi FORMSOF tagi ierisinde THESAURUS yazarak gerekletirebilmekteyiz. THESAURUS kullanm ierisinde szlk dosyalarmzn dilinide belirtmemiz gerekir. rnek olarak kullanm aada inceleyeceiz.lk olarak kendi Thesaurus dosyamz oluturalm. Bunun iin tsenu.xml (ngilizce dil dosyas) dosyasn dzenliyoruz. Burada Microsoft kelimesinin yanl yazlacan tahmin ettiimiz hallerini ekleyip, sorgu ierisinde belirtmi olduumuz szckler geldiinde doru olan hali ile replace edilecei ekilde dzenliyoruz.

ekil 21 Thesaurus dosyasnn dzenlenmesi.

XML dosyasn dzenledikten sonra bu dosyasnn instance ierisinde load edilmesini salamamz gerekmektedir. Load edilmesi iin Thesaurus dosyasnn dil kodunuda belirtmemiz gerekmektedir. Aadaki gibi Thesaurus dil dosyamz load ediyoruz.EXEC sys.sp_fulltext_load_thesaurus_file 1033GO

Artk Thesaurus kullanarak aramalarmz gerekletirebiliriz. Bunun iin xml dosyas ierisinde tanmladmz kelimeleri rnek olarak parse edelim.SELECT source_term AS [YAZILAN], display_term as [THESAURUS] FROM sys.dm_fts_parser ('FORMSOF( THESAURUS, "microsft" )', 1033, 0, 0)

Sorgu sonucunda XML ierisinde belirtmi olduumuz doru kelimenin grntlendiini gryoruz.

ekil 22 Thesaurus kullanlarak sorgu sonucu.

Semantic Search Programlama Teknikleri

Semantic Search kullanm iin 3 temel fonksiyonun olduuna yukarda deinmitik. Bu 3 temel fonksiyonu inceleyelim.

SEMANTICKEYPHRASETABLE: bu fonksiyon ile belirtilen dokman ierisindeki kelimeler zerinde skorlama yapmamza olanak salanr.

rnek kullanm ekli aadaki gibidir.DECLARE @DocumentName AS NVARCHAR(1000)DECLARE @DocumentID AS UNIQUEIDENTIFIER

SET @DocumentName = 'InsideSQLAzure.docx'

SELECT @DocumentID = stream_id FROM Documents WHERE name = @DocumentName

SELECT name, document_key, keyphrase, scoreFROM semantickeyphrasetable(Documents, *, @DocumentID)INNER JOIN DocumentsON stream_id = document_keyORDER BY name, score DESCGO

SEMANTICSIMILARITYTABLE: Bu fonksiyon ile baz alnan dkmann belirtilen dokman havuzundaki dier dkmanlar zerindeki kelime bazl eleme oranlar zerinde skorlama yaplr.

rnek kullanm ekli aadaki gibidir.DECLARE @DocumentName as NVARCHAR(1000)DECLARE @DocumentID as UNIQUEIDENTIFIER

SET @DocumentName = 'ConsolidationPrescriptiveGuidance.docx'

SELECT @DocumentID = stream_id FROM Documents WHERE name = @DocumentName

SELECT @DocumentName AS SourceTitle, name AS MatchedTitle, stream_id, scoreFROM semanticsimilaritytable(Documents, *, @DocumentID) INNER JOIN Documents ON stream_id = matched_document_keyORDER BY score DESCGO

SEMANTICSIMILARITYDETAILSTABLE: Bu fonksiyonun kullanm SEMANTICSIMILARITYTABLE ile benzemektedir. SEMANTICSIMILARITYTABLE da grntlenen eleme oranlarnn neden ve hangi kelimeler ile eletiini gsterir.

rnek kullanm ekli aadaki gibidir.DECLARE @SourceTitle as NVARCHAR(1000)DECLARE @MatchedTitle as NVARCHAR(1000)DECLARE @SourceDocID as UNIQUEIDENTIFIERDECLARE @MatchedDocID as UNIQUEIDENTIFIER

SET @SourceTitle = 'ConsolidationPrescriptiveGuidance.docx'SET @MatchedTitle = 'SS08R2Virtualization.docx'

SELECT @SourceDocID = stream_id FROM Documents WHERE name = @SourceTitleSELECT @MatchedDocID = stream_id FROM Documents WHERE name = @MatchedTitle

SELECT @SourceTitle AS SourceTitle, @MatchedTitle AS MatchedTitle, keyphrase, scoreFROM SEMANTICSIMILARITYDETAILSTABLE(Documents, file_stream, @SourceDocID, file_stream, @MatchedDocID)ORDER BY score DESCGO

Sonu

Full-Text Search, SQL Server 2012 ile birlikte Semantic Search de mimarisine katarak arama biimlerini geniletmitir. Fiil ekimleri, e anlaml ifadeler ve Semantic Search sayesinde Full-Text Search, fonksiyonel anlamda ierik zerinde anlamsal olarak aramalar yapmaya olanak salar.1