T-SQL | Как искать данные с помощью FTI |
Для возможности искать полнотекстовым поиском по данным таблицы, нужно в этой таблице настроить полнотекстовый индекс.
Для поиска вызываем функцию FREETEXTTABLE (table, field, search_string, language, top_n_by_rank)
и связываем возвращаемое поле [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".
См. также: Пример полнотекстового поиска в цикле
|