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

Asp.net 在.net中突出显示文本并提供定义,asp.net,regex,performance,replace,Asp.net,Regex,Performance,Replace,我们有一个很大的文本文档(存储在MSSQL数据库中),当单词悬停在上面时,我们需要提供类似字典的查找 例如,如果有以下句子: “快狗跳过了棕色狐狸”我们的用户可以为这些单词中的任何一个创建一个“定义”,如“快狗”、“狗”、“跳过”等,我们需要突出显示这些文本,并且当他们鼠标悬停时提供定义中设置的文本 目前我们有一个实现可以完成这项工作,但是它的性能非常差,当前的实现使用Regex解析文本,并在文本中的单词后面插入一段Javascript代码,如果它与定义匹配的话。现在,我们可以在任何地方看到多达

我们有一个很大的文本文档(存储在MSSQL数据库中),当单词悬停在上面时,我们需要提供类似字典的查找

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

目前我们有一个实现可以完成这项工作,但是它的性能非常差,当前的实现使用Regex解析文本,并在文本中的单词后面插入一段Javascript代码,如果它与定义匹配的话。现在,我们可以在任何地方看到多达400个或更多的定义,文本可以是多个段落或更长,这会挂起整个服务器,并使应用程序不具代表性

我试图通过修改已编译的正则表达式来优化代码,但这对问题没有多大帮助,请求在返回任何内容之前仍然超时

我很好奇我还有什么其他的选择来实现这一点

我曾考虑:

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

该应用程序是一个ASP.NET网站(.NET 3.5当前移动到4 soonish),使用SQL Server 2005/8(取决于客户端站点)和NHibernate。

对于运行时间较长且不经常更改的内容,不要忘记低批量作业。晚上将文档解析为HTML页面。运行regex并插入javascript,或者其他任何东西。然后保存HTML一次,并根据需要多次提供。这是旧方法,但它仍然是可靠的。

只是抛出一些想法:

  • 正则表达式将要求扫描每个单词,这将花费太长的时间
  • 复合词需要疯狂的处理,除非是分层处理
可能的算法:

  • 将文本拆分为字符串数组:
    text[]
  • 将定义的单词存储在内存中(仅存储单词):
    words[]
    • 使用
      System.Collections.Generic.HashSet
      ,因为它的查找速度非常快
  • 检查每个
    文本[]
    ,如果在
    单词[]
  • 在前端,鼠标悬停时使用AJAX
要处理复合词:

  • 为此使用正则表达式。复合词不应该太多。如果有,那么在对复合词进行正则表达式搜索之前,您可以查看存在哪些
    单词[]
AJAX鼠标悬停事件:

  • 标记逻辑完成后,您可能会有嵌套的跨度标记:
    房屋平面图
    ,这很好。jQuery将最外层的span标记发送到服务器,服务器可以返回所有匹配的单词

在我看来,这么早做这项工作是错误的。当客户机实际请求时,为什么不在服务器端获取定义呢?当用户突出显示时,进行AJAX调用或其他操作来获取定义。我曾考虑过这一点,但实际上我们需要预先突出显示一个单词,以表明有可用的定义,对于单词包含其他单词的情况,例如,“house”和“house plan”都有定义,我不确定这怎么可能?听起来不错,我有点被你在复合词中的意思弄糊涂了,你能再解释一下吗?在处理文本[]数组后,只需重新整理文本,然后对复合词执行典型的正则表达式搜索。如果regex'ing复合词似乎代价高昂,则只能搜索具有匹配项的复合词。例如,如果文档从未找到与“house”匹配的项,则不必使用正则表达式搜索“house plans”。