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


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

[В начало]

См. также

Справочник

CONTAINSTABLE (Transact-SQL)

CONTAINS (Transact-SQL)

Основные понятия

Запрос с полнотекстовым поиском