Поиск слов близких к другим с использованием оператора NEAR
Выражение с учетом расположения (NEAR) может применяться в предикате CONTAINS или функции CONTAINSTABLE для поиска слов или фраз, расположенных рядом. Также можно указать максимальное количество слов, которые не включаются в поиск и разделяют первое и последнее из искомых слов. Кроме того, можно искать два слова или две фразы в любом порядке или в порядке, в котором они указаны. SQL Server 2012 поддерживает универсальное выражение с учетом расположения, которое теперь считается устаревшим, а также настраиваемое выражение с учетом расположения, которое впервые появилось в версииSQL Server 2012.
В этом разделе
Настраиваемое выражение с учетом расположения
Дополнительные вопросы, касающиеся поиска с учетом расположения
Устаревшее универсальное выражение с учетом расположения
Настраиваемое выражение с учетом расположения
Настраиваемое выражение с учетом расположения дает следующие новые возможности.
Можно указывать максимальное число слов, которые не включаются в поиск, или максимальное расстояние, которое может разделять первое и последнее слово поиска для возвращения результата.
Если указать максимальное число слов, также можно указать, что слова поиска должны присутствовать в результате в заданном порядке.
Строка текста должна выполнять следующие условия.
Начинаться с одного из указанных слов поиска и заканчиваться одним из других указанных слов поиска.
Содержать все указанные слова поиска.
Число слов, которые не включаются в поиск, включая стоп-слова, которые могут разделять первое и последнее слово поиска, должно быть меньше максимального расстояния или равно ему, если оно указано.
Базовый синтаксис:
NEAR (
{
search_term [ ,…n ]
|
(search_term [ ,…n ] ) [,<maximum_distance> [,<match_order> ] ]
}
)
Примечание |
---|
Дополнительные сведения о синтаксисе <custom_proximity_term> см. в разделе CONTAINS (Transact-SQL). |
Например, можно искать слово «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 автоматически меняет порядок отображения для слов, заданных на языках с направлением чтения справа налево.
Примечание |
---|
Дополнительные сведения см. в подразделе «Дополнительные сведения о поиске по сходству» далее в этом разделе. |
Измерение максимального расстояния
Максимальное расстояние, например 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.»
Сочетание настраиваемого выражения с учетом расположения и других выражений
Настраиваемое выражение с учетом расположения можно сочетать с некоторыми другими выражениями. Можно использовать AND (&), OR ( |) или AND NOT (&!), которые позволяют сочетать настраиваемое выражение с учетом расположения с другим настраиваемым выражением с учетом расположения, простым выражением или префиксным выражением. Например:
CONTAINS('NEAR((term1,term2),5) AND term3')
CONTAINS('NEAR((term1,term2),5) OR term3')
CONTAINS('NEAR((term1,term2),5) AND NOT term3')
CONTAINS('NEAR((term1,term2),5) AND NEAR((term3,term4),2)')
CONTAINS('NEAR((term1,term2),5) OR NEAR((term3,term4),2, TRUE)')
Например:
CONTAINS(column_name, 'NEAR((term1, term2), 5, TRUE) AND term3')
Настраиваемое выражение с учетом расположения нельзя сочетать с универсальным выражением с учетом расположения (term1 NEAR term2), производным выражением (ISABOUT…) или взвешенным выражением (FORMSOF…).
Пример. Использование настраиваемого выражения с учетом расположения
В следующем примере в таблице Production.Document образца базы данных AdventureWorks2008 выполняется поиск всех сводок по документам, где слово reflector содержится в одном документе со словом bracket.
USE AdventureWorks2012
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
[В НАЧАЛО]
Дополнительные вопросы, касающиеся поиска с учетом расположения
В этом разделе описываются вопросы, касающиеся универсальных и настраиваемых поисковых запросов с учетом расположения.
Перекрывающиеся экземпляры слов поиска
В запросе с учетом расположения всегда ищутся только неперекрывающиеся экземпляры. Перекрывающиеся экземпляры слов поиска никогда не включаются в результаты. Например, рассмотрим следующие выражение с учетом расположения, которое ищет слова 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
Значение параметра transform noise words влияет на обработку в SQL Server стоп-слов, указанных в поисковых запросах с учетом расположения. Дополнительные сведения см. в разделе Параметр конфигурации сервера «transform noise words».
[В НАЧАЛО]
Устаревшее универсальное выражение с учетом расположения
Важно! |
---|
В будущей версии Microsoft SQL Server этот компонент будет удален. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется. Рекомендуется использовать настраиваемое выражение с учетом расположения. |
Универсальное выражение с учетом расположения показывает, что для возвращения результата все указанные слова поиска должны встречаться в документе, независимо от числа прочих слов (расстояния) между словами поиска. Базовый синтаксис:
{ search_term { NEAR | ~ } search_term } [ ,…n ]
Например, в следующем примере для получения результата должны встречаться оба слова (fox и chicken) в любом порядке:
CONTAINS(column_name, 'fox NEAR chicken')
CONTAINSTABLE(table_name, column_name, 'fox ~ chicken')
Примечание |
---|
Сведения о синтаксисе <generic_proximity_term> см. в разделе CONTAINS (Transact-SQL). |
Дополнительные сведения см. в подразделе «Дополнительные сведения о поиске по сходству» далее в этом разделе.
Сочетание универсального выражения с учетом расположения и других выражений
Можно использовать AND (&), OR (|) или AND NOT (&!), которые позволяют сочетать универсальное выражение с учетом расположения с другим универсальным выражением с учетом расположения, простым выражением или префиксным выражением. Например:
CONTAINSTABLE (Production.ProductDescription,
Description,
'(light NEAR aluminum) OR
(lightweight NEAR aluminum)'
)
Универсальное выражение с учетом расположения нельзя сочетать с настраиваемым выражением с учетом расположения (например, NEAR((term1,term2),5)), взвешенным выражением (ISABOUT…) или производным выражением (FORMSOF…)
Пример. Использование универсального выражения с учетом расположения
В следующем примере универсальное выражение с учетом расположения используется для поиска слова «reflector» в одном документе со словом «bracket».
USE AdventureWorks2012
GO
SELECT DocumentNode, Title, DocumentSummary
FROM Production.Document AS DocTable INNER JOIN
CONTAINSTABLE(Production.Document, Document,
'(reflector NEAR bracket)' ) AS KEY_TBL
ON DocTable.DocumentNode = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC
GO
Обратите внимание, что для достижения такого же результата можно поменять местами термы в функции CONTAINSTABLE:
CONTAINSTABLE(Production.Document, Document, '(bracket NEAR reflector)' ) AS KEY_TBL
Вместо ключевого слова NEAR в предыдущем запросе можно использовать «тильду» (~) и получить те же результаты:
CONTAINSTABLE(Production.Document, Document, '(reflector ~ bracket)' ) AS KEY_TBL
В условиях поиска можно указать более двух слов или фраз. Например, можно написать:
CONTAINSTABLE(Production.Document, Document, '(reflector ~ bracket ~ installation)' ) AS KEY_TBL
Это значит, что слово «reflector» должно находиться в одном документе со словом «bracket», а слово «bracket» должно находиться в одном документе со словом «installation».
[В начало]