Как запросить поле базы данных, но игнорировать разметку HTML? - PullRequest
3 голосов
/ 11 февраля 2010

У нас есть поле, содержащее HTML-разметку для форматирования на веб-сайте, но нам нужно запрашивать только текст, который должен отображаться на экране, а не такие вещи, как теги CSS, имена тегов, имена свойств и т. Д.

Есть ли способ игнорировать разметку прямо в запросе SQL или хранимой процедуре? Если есть способы сделать это, у нас будут проблемы с производительностью позже?

Я предполагаю, что есть какой-то способ использовать угловые скобки для анализа полей для поиска текста.

Ответы [ 5 ]

4 голосов
/ 11 февраля 2010

Обработка, подобная этой, не должна выполняться в базе данных. Я бы порекомендовал создать отдельное поле, содержащее только текстовое содержимое.

В ответ на комментарий поклонников @Nissan: извлечение текста из HTML не является задачей IMO базы данных. Это слишком сложная работа для нее, и в ней слишком много переменных. Я не очень хорошо разбираюсь в чтении хранимых процедур, но если я правильно прочитал код, у него будут проблемы с (недопустимым, но все еще часто встречающимся) незакодированным < в исходном коде. И он, скорее всего, сломается из-за неверного HTML.

Или представьте себе, что однажды клиент приходит и хочет индексировать свойства img elements 'ALT. Или title с. Начните строить это с помощью алгоритма «начальная позиция, конечная позиция». Вы будете сумасшедшим .

Я говорю, что если это необходимо для повседневной обработки HTML из разных источников, находящихся вне вашего контроля, оставьте это для слоя над БД, который лучше подготовлен для обработки этого материала. Подход, основанный на DOM - возможно, использующий BeautifulSoup для работы с недопустимым HTML - разбор всех nodeValue будет наиболее надежным.

Может быть, это излишне, и хранимая процедура будет отлично работать в случае с OP - похоже, это из его комментария, и это совершенно нормально. Я просто говорю, что если вы не можете контролировать входящий HTML, не лишайте HTML ограниченных средств, предлагаемых базой данных для работы.

3 голосов
/ 11 февраля 2010

Я согласен с Пеккой; это не то, с чем ваша база данных должна иметь дело.

Минусы для выполнения этого анализа в БД:

  1. Проблемы с производительностью. Использование пользовательских функций может снизить производительность и привести к сканированию таблиц. И даже если вы избегаете сканирования таблиц, вы все равно просите БД сделать кучу вещей (манипулирование строками), для которых она не предназначена.

  2. Сложнее понять правильно. Правильный анализ HTML - сложная задача. Правда, вы можете пройти 95% пути с помощью UDF, но обработка этого на уровне приложений может помочь вам на 100%.

  3. Сложнее проверить. Я бы предпочел написать модульные тесты для кода разметки HTML, который выполняется в C # для строковых литералов, а не для обхода в БД.

Если вы должны сделать это в БД ...

Если это необходимо сделать в БД, рассмотрите следующий подход:

  1. Добавьте второе поле в вашу БД для хранения текстовой версии содержимого.

  2. Добавьте триггер, чтобы при каждом изменении значения HTML текстовая версия регенерировалась.

  3. Напишите ваши запросы к текстовому полю.

Вы получите более высокую производительность, потому что вы выполняете синтаксический анализ только во время записи, а не при каждом поиске, и ваша БД будет лучше использовать любые индексы, которые вы определяете в текстовом поле.

3 голосов
/ 11 февраля 2010

Вот пользовательская функция только для того, что вы можете использовать:

http://blog.sqlauthority.com/2007/06/16/sql-server-udf-user-defined-function-to-strip-html-parse-html-no-regular-expression/

0 голосов
/ 11 февраля 2010

Если вы попытаетесь проиндексировать один из этих столбцов и получить к нему доступ, удалив html:

WHERE dbo.anyRemoveHtml(yourColumn)='your search text'

индекс не будет использоваться, и вы будете сканировать таблицу. это может не быть проблемой, когда приложение имеет мало данных, но приведет к медленному и медленному SELECT, когда в таблицу добавляется больше данных.

примечание: dbo.anyRemoveHtml - это просто выдуманное имя, представляющее функцию, выбранную для удаления HTML, и на самом деле не существует

0 голосов
/ 11 февраля 2010

Если вы можете запускать регулярные выражения в своем запросе, вы можете удалить HTML и вернуть только текст, используя примеры здесь: http://www.regular -expressions.info / examples.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...