Поделиться через


Поиск слов близких к другим с использованием оператора 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):

" "Catsenjoyhunting mice``, but avoiddogs``.

То же выражение с учетом близости не вернет следующую строку, так как максимальное расстояние превышается четырьмя терминами, не включенными в поиск ("enjoy", "but", "usually" и "avoid").

" "Catsenjoyhunting mice``, but usually avoiddogs``.

Сочетайте 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) И НЕ выражение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 ...) или взвешенным термином (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)
Запросы с полнотекстовым поиском