выделение текста и предоставление определений в .net - PullRequest
0 голосов
/ 09 августа 2011

У нас большой текстовый документ (хранится в базе данных MSSQL), и нам нужно предоставить словарь, подобный поиску слов, когда они наведены.

Например, если было следующее предложение:quick dog перепрыгнул через коричневого лиса «наши пользователи могли создать« определение »для любого из этих слов, таких как« quick »,« dog »,« jumped over »и т. д., и нам нужно выделить такой текст, а когда при наведении курсора мыши предоставить текстэто было установлено в определении.

В настоящее время у нас есть реализация, которая выполняет свою работу, однако страдает от невероятно плохой производительности, текущая реализация использует Regex для анализа текста и вставки фрагмента Javascript сразу после словав тексте, если оно соответствует определению.Теперь видно, что у нас может быть где-то до 400 или более определений, а текст может быть длиной в несколько абзацев или более, что приводит к зависанию всего сервера и делает приложение не отвечающим на запросы.

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

Мне любопытно, какие еще варианты у меня есть для достижения этого.

Я рассмотрел:

  • Написание службы, которая находится в фоновом режиме и опрашивает определения и обновляет текст в простое
  • Некоторая форма кэширования, однако на самом деле это не происходитчтобы устранить основную причину проблемы и существ, поскольку сайт не загружается на всех страницах, вероятно, не будет кэширован
  • Реализация клиентской части регулярного выражения, я думаю, что страница будет загружаться тогда, но я сомневаюсь, что на этой стороне клиента будетможет быть лучше, чем делать это на стороне сервера, это может даже заблокировать браузер

Приложение - ASP.NET website (.net 3.5 в настоящее время переходит на 4 скоро), используя SQL Server 2005/8 (в зависимости от сайта клиента) и NHibernate.

Ответы [ 2 ]

1 голос
/ 09 августа 2011

Просто выбрасываю идеи:

  • Для регулярного выражения требуется сканирование каждого слова, что займет слишком много времени.
  • Составные слова потребуют безумной обработки, если они не были обработаныв ярусах.

Возможный алгоритм:

  • Разделить текст на массив строк: text[]
  • Сохранить определенные слова в памяти (простослова): words[]
    • Используйте System.Collections.Generic.HashSet, поскольку он имеет действительно быстрый поиск
  • Пройдите через каждый text[] и пометьте его <span class='known'>если он находится в words[]
  • На внешнем интерфейсе используйте AJAX при наведении мыши

Для обработки составных слов:

  • Используйте регулярное выражение дляэтот.Не должно быть слишком много составных слов.Если таковые имеются, вы можете увидеть, какие words[] существуют, прежде чем выполнять регулярное выражение для составного слова.

AJAX mouseover event:

  • После того, как логика тегированиязавершено, у вас могут быть вложенные теги span: <span class='known'><span class='known'>house</span> plan</span>, что нормально.Ваш jQuery отправит на сервер внешний тег span, и сервер сможет вернуть все совпадающие слова.
1 голос
/ 09 августа 2011

Для вещей, которые выполняются долго и меняются не очень часто, не забывайте о скромном пакетном задании.Разбор вашего документа на HTML-страницы ночью.Запустите свое регулярное выражение и вставьте JavaScript или что-то еще.Затем сохраните HTML один раз и подайте его столько раз, сколько необходимо.Это старый способ, но он все еще тверд.

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