T-SQL | Как искать данные с помощью FTI

Для возможности искать полнотекстовым поиском по данным таблицы, нужно в этой таблице настроить полнотекстовый индекс.

 

Для поиска вызываем функцию FREETEXTTABLE (table, field, search_string, language, top_n_by_rank)

 

table

– Где искать: имя таблицы, в которой настроен полнотекстовый индекс;

field

– Где искать: имя индексированного поля (указывается в процессе настройки полнотекстового индекса);

search_string

– Что искать: строка поиска

language

– Язык. Указывается, если нужно искать с учетом особенностей языка (переносы, синонимы и пр.)

top_n_by_rank

– При указании аргумента top_n_by_rank функция вернет первые n в порядке сортировки по рангу совпадений (самый высокий – наилучшее совпадение; самый низкий – наихудшее)

 

и связываем возвращаемое поле [Key] с ID таблицы:

 


select ID, SearchFieldName from SearchTableName

where ID in (select [Key] from freetexttable(SearchTableName, SearchFieldName, 'Search_Text', language 'Language_Name', n))


 

Можно также задать условие по рангу для фильтрации строк с лучшим совпадением:

 


select ID, SearchFieldName from SearchTableName

where ID in (select case when [Rank] > n then [Key] else null end from freetexttable(SearchTableName, SearchFieldName, 'Search_Text', language 'Language_Name', n))


 

Чтобы понять с какими рангами выводятся результаты поиска можно запустить запрос, который возвращает [Key] – связуемое поле и [Rank] – ранг совпадения:

 


select * from freetexttable(SearchTableName, SearchFieldName, 'Search_Text', language 'Language_Name', n)


 

Например, из адресной книги адресов клиентов (пусть это будет Person.Address.AddressLine1 из AdventureWorks) нужен поиск адресов, имеющих слова "Black" и "Lane".

 

Запрос поиска 'Black Lane' без условия по рангу и без указания top_n_by_rank возвращает все найденные строки с разным качеством совпадения:

 


use AdventureWorks

select

  AddressID

 ,AddressLine1

from        Person.Address

where

 AddressID in

(select [Key] from freetexttable(Person.Address, AddressLine1, 'Black Lane', language 'English'))

 

 


 

Поиск 'Black Lane' в Person.Address.AddressLine1 имеет следующие ранги:

 


use AdventureWorks

select distinct [Rank] from freetexttable(Person.Address, AddressLine1, 'Black Lane', language 'English')

order by 1 desc

 


 

Т.о. можно запустить поиск с фильтрацией по наилучшему рангу (> 60):

 


use AdventureWorks

select

  AddressID

 ,AddressLine1

from        Person.Address

where

 AddressID in (select case when [Rank] > 60 then [Key] else null end from

freetexttable(Person.Address, AddressLine1, 'Black Lane', language 'English'))

 


 

Всего найдено 8 строк с рангом > 60; укажем 8 в качестве аргумента top_n_by_rank:

 


use AdventureWorks

select

  AddressID

 ,AddressLine1

from        Person.Address

where

 AddressID in (select case when [Rank] > 60 then [Key] else null end from

freetexttable(Person.Address, AddressLine1, 'Black Lane', language 'English', 8 ))

 


 

В результате полнотекстового поиска в данных Person.Address.AddressLine1 найдено 6 адресов содержащих "Black" и "Lane".

 

См. также: Пример полнотекстового поиска в цикле

 



© 2018 | Анна Петросян | pashelp@yandex.ru