Возврат окружающего текста для фразы, найденной в полнотекстовом поиске, SQL 2005 - PullRequest
3 голосов
/ 08 апреля 2009

Я использую предикат содержимого для поиска фраз в индексированном текстовом поле SQL Server. Есть ли способ вернуть часть текстового поля, содержащего искомую фразу, или область вокруг нее?

Например, если я ищу «все люди созданы равными» в адресе Геттисберга (ниже приводится выдержка), я бы хотел вернуться «посвященный утверждению, что все люди равны», например вокруг него какой-то текст.

Four score and seven years ago our fathers brought forth on this continent, a new nation, conceived in Liberty, and dedicated to the proposition that *all men are created equal.*

Now we are engaged in a great civil war, testing whether that nation, or any nation so conceived and so dedicated, can long endure. We are met on a great battle-field of that war. We have come to dedicate a portion of that field, as a final resting place for those who here gave their lives that that nation might live. It is altogether fitting and proper that we should do this. 

Ответы [ 2 ]

2 голосов
/ 08 апреля 2009

Хорошо, я не знаком с синтаксисом SQL Server, но вы можете найти вхождение в поле и вернуть для него подстроку. Псевдо-код

SELECT
  SUBSTRING(field, MAX(0, STRPOS(field, 'all men are equal' - 20), STRLEN('all men are equal') + 40)
FROM
  yourtable
WHERE
  field CONTAINS 'all men are equal'

При этом вы находите положение подстроки только для тех записей, которые содержат фразу, и возвращаете строку на 40 символов длиннее, поэтому что-то подобное должно работать.

0 голосов
/ 09 октября 2014

Просто наткнулся на это, пытаясь добиться чего-то подобного. Основываясь на ответе Себа, я решил следующую проблему:

SELECT '...' + SUBSTRING(@TextToParse, CHARINDEX(@TheKeyword, @TextToParse)-150, 350) + '...'

Это вернет ключевое слово или фразу, которой предшествуют 150 символов. Всего будет возвращено 350 символов. Измените эти числа по мере необходимости. Также эллипсы включены в начало и конец, так как этот код не позволяет избежать разрывов в середине слова.

...