Поиск слов близких к другим с использованием оператора NEAR
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure
Выражение с учетом расположения NEAR может применяться в предикате CONTAINS или функции CONTAINSTABLE для поиска слов или фраз, расположенных рядом.
Обзор NEAR
NEAR обладает следующими функциями:
Вы можете указать максимальное количество слов, исключаемых из поиска и разделяющих первое и последнее из искомых слов.
Вы можете искать слова или фразы в произвольном или в определенном порядке.
Можно указывать максимальное число слов, которые не включаются в поиск, или максимальное расстояние, которое может разделять первое и последнее слово поиска для возвращения результата.
Если указать максимальное число слов, также можно указать, что слова поиска должны присутствовать в результате в заданном порядке.
Строка текста должна выполнять следующие условия.
Начинаться с одного из указанных слов поиска и заканчиваться одним из других указанных слов поиска.
Содержать все указанные слова поиска.
Число слов, исключаемых из поиска (включая стоп-слова), которые могут разделять первое и последнее слово поиска, должно быть меньше максимального расстояния или равно ему, если оно указано.
Синтаксис NEAR
Базовый синтаксис NEAR:
NEAR (
{
*search_term* [ ,...*n* ]
|
(*search_term* [ ,...*n* ] ) [, <maximum_distance> [, <match_order> ] ]
}
)
Дополнительные сведения о синтаксисе см. в разделе CONTAINS (Transact-SQL).
Примеры
Пример 1
Например, можно искать слово «John», расположенное не далее двух слов от слова «Smith», следующим образом.
... CONTAINS(column_name, 'NEAR((John, Smith), 2)')
Примеры строк, удовлетворяющих этому запросу: «John Jacob Smith
» и «Smith, John
». В строке «John Jones knows Fred Smith
» слова поиска разделены тремя другими словами, поэтому она не является результатом.
Чтобы задать необходимый порядок слов, нужно изменить выражение с учетом расположения из примера на NEAR((John, Smith),2, TRUE).
В этом случае словоJohn
должно располагаться не далее двух слов от словаSmith
, но только в случае, если словоJohn
стоит перед словомSmith
. В языке с направлением чтения слева направо (например, в английском) этому запросу отвечает, например, строкаJohn Jacob Smith
.
Для языка с направлением чтения справа налево (например, арабского или иврита) средство полнотекстового поиска применяет заданные выражения в обратном порядке. Кроме того, обозреватель объектов в SQL Server Management Studio автоматически изменяет порядок отображения слов, указанных в языках справа налево.
Пример 2
В следующем примере в таблице Production.Document
образца базы данных AdventureWorks
выполняется поиск всех сводок по документам, где слово reflector содержится в одном документе со словом bracket.
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
Измерение максимального расстояния
Максимальное расстояние, например 10 или 25, определяет, сколько слов, которые не включаются в поиск, включая стоп-слова, могут разделять первое и последнее слово поиска в заданной строке. Например, выражение NEAR((dogs, cats, "hunting mice"), 3)
возвращает следующую строку, в которой общее число слов, которые не включаются в поиск, равно трем (enjoy
,but
иavoid
):
" "Cats
enjoy
hunting mice``, but avoid
dogs``.
То же выражение с учетом расположения не вернет следующую строку, поскольку число слов, которые не включаются в поиск, равно четырем (enjoy
,but
,usually
иavoid
), что превышает максимальное расстояние:
" "Cats
enjoy
hunting mice``, but usually avoid
dogs``.
Сочетание NEAR с другими выражениями
NEAR можно сочетать с некоторыми другими выражениями. Операторы AND (&), OR (|) и AND NOT (&!) позволяют сочетать настраиваемое выражение с учетом расположения с другим настраиваемым выражением с учетом расположения, простым выражением или префиксным выражением. Например:
CONTAINS('NEAR((выражение1, выражение2),5) AND выражение3')
CONTAINS('NEAR((выражение1, выражение2),5) OR выражение3')
CONTAINS('NEAR((выражение1, выражение2),5) AND NOT выражение3')
CONTAINS('NEAR((выражение1, выражение2),5) AND NEAR((выражение3, выражение4),2)')
CONTAINS('NEAR((выражение1, выражение2),5) OR NEAR((выражение3, выражение4),2, TRUE)')
Например,
CONTAINS(column_name, 'NEAR((term1, term2), 5, TRUE) AND term3')
NEAR нельзя сочетать с производным выражением (ISABOUT ...T) или взвешенным выражением (FORMSOF ...).
Дополнительные сведения о поиске близкого взаимодействия
Перекрывающиеся экземпляры слов поиска
В запросе с учетом расположения всегда ищутся только неперекрывающиеся экземпляры. Перекрывающиеся экземпляры слов поиска никогда не включаются в результаты. Например, рассмотрим следующие выражение с учетом расположения, которое ищет слова
A
иAA
в заданном порядке на расстоянии не более двух слов:CONTAINS(column_name, 'NEAR((A,AA), 2, TRUE)')
Возможные результаты:
AAA
,A.AA
иA..AA
. Строки, содержащие толькоAA
, не будут результатом.Примечание.
Можно указывать перекрывающиеся выражения, например
NEAR("mountain bike", "bike trails")
или(NEAR(comfort*, comfortable), 5)
. Указание перекрывающихся выражений повышает сложность запроса за счет увеличения числа возможных перестановок. Если указать большое число таких перекрывающихся выражений, запрос может исчерпать ресурсы и завершиться с ошибкой. В этом случае упростите запрос и повторите попытку.В NEAR (независимо от указания максимального расстояния) указывается логическое, а не абсолютное расстояние между выражениями. Например, выражения, находящиеся в различных фразах и выражениях в пределах абзаца, считаются более удаленными друг от друга, чем фразы, находящиеся в одной фразе или в одном предложении, независимо от фактического расстояния между ними, поскольку предполагается, что в первом случае выражения в меньшей степени связаны. Аналогично выражения из различных абзацев считаются еще более удаленными друг от друга. Если в результат входит конец предложения, абзаца или главы, то интервал, используемый для определения ранга документа, увеличивается соответственно на 8, 128 или 1024.
Влияние выражений с учетом расположения на ранжирование, выполняемое функцией CONTAINSTABLE
Если выражение NEAR используется в функции CONTAINSTABLE, то на ранг документа влияет число совпадений в документе относительно его длины, а также расстояние между первым и последним выражением поиска в каждом совпадении. Для универсального термина близкого взаимодействия, если соответствующие термины поиска имеют 50 логических терминов, то ранг, возвращаемый в документе, равен >0. Для пользовательского термина близкого взаимодействия, не указывающего целое число в качестве максимального расстояния, документ, содержащий только попадания, разрыв которых составляет >100 логических терминов, получит рейтинг 0. Дополнительные сведения о ранжировании настраиваемых поисковых запросов с учетом расположения см. в разделе Ограничение количества результатов поиска с использованием функции RANK.
Параметр сервера transform noise words
Значение шумовых слов преобразования влияет на то, как SQL Server обрабатывает стоп-слова, если они указаны в поисках близкого взаимодействия. Дополнительные сведения см. в разделе transform noise words Server Configuration Option.
См. также
CONTAINS (Transact-SQL)
CONTAINSTABLE (Transact-SQL)
Запросы с полнотекстовым поиском