突出显示文本并在.net中提供定义

时间:2011-08-08 23:59:58

标签: asp.net regex performance replace

我们有一个大文本文档(存储在MSSQL数据库中),我们需要在它们悬停时为字词提供字典查找。

例如,如果有以下句子: “快速的狗跳过棕色的狐狸”我们的用户可以为“快速”,“狗”,“跳过”等任何一个词创建一个“定义”,我们需要突出显示这些文本以及何时鼠标悬停提供已在定义中设置的文本。

目前我们有一个实现该工作的实现,但它遭受了令人难以置信的糟糕性能,当前实现使用正则表达式来解析文本并在文本中的单词后面插入一个Javascript片段(如果它与定义匹配)。现在看到我们可以有多达400个或更多的定义,文本可以是多个段落或更长,这会挂起整个服务器并使应用程序不具有代表性。

我试图通过摆弄编译的正则表达来优化代码,但它没有多大帮助,请求在返回任何内容之前仍然超时。

我很好奇我还有什么其他选择来实现这一目标。

我考虑过:

  • 编写位于后台的服务并轮询 定义并在空闲时更新文本
  • 某种形式的缓存,但这并不是真正修复根目录 因为网站不会在所有页面加载问题和存在的原因 可能不会被缓存
  • 实现正则表达式客户端,我认为页面会加载 但我怀疑做这个客户端会比做它更好 服务器端甚至可能锁定浏览器

该应用程序是一个ASP.NET网站(.net 3.5目前正在迅速转向4),使用SQL Server 2005/8(取决于客户端站点)和NHibernate。

2 个答案:

答案 0 :(得分:1)

对于需要花费很长时间才能运行并且不经常更改的内容,请不要忘记低批量作业。晚上将文档解析为HTML页面。运行你的正则表达式并插入javascript,或其他任何东西。然后保存HTML一次,并根据需要多次提供。这是旧的方式,但它仍然是稳固的。

答案 1 :(得分:1)

抛出想法:

  • 正则表达式要求扫描每个单词,这需要太长时间。
  • 复合词需要疯狂处理,除非是以层级处理。

可能的算法:

  • 将文本拆分为字符串数组:text[]
  • 将定义的单词存储在内存中(只包含单词):words[]
    • 使用System.Collections.Generic.HashSet,因为它的查询速度非常快
  • 浏览每个text[]并使用<span class='known'>标记words[]
  • 在前端,发生鼠标悬停时使用AJAX

处理复合词:

  • 使用正则表达式。复合词不应该太多。如果有,那么在进行正则表达式搜索复合词之前,您可以看到存在words[]

AJAX鼠标悬停事件:

  • 标记逻辑完成后,您可能拥有嵌套的span标记:<span class='known'><span class='known'>house</span> plan</span>,这很好。您的jQuery会将最外面的span标记发送到服务器,服务器可以返回所有匹配的单词。