★★关于全文检索的难题

mosani 2003-05-27 03:32:43
各位大虾,谢了先:
我在设计一个新闻全文检索,即输入关键字查询后返回的新闻的标题,然后在新闻标题下方是新闻的一段内容,这段内容包含被不同颜色点亮的关键字。循环对我来说没有问题,问题是我如何取到新闻内容中包含关键字的这段有限长度的文字,并且将其中的关键字用不同颜色点亮呢?
大虾们请不吝赐教,参考效果请看:
http://search.pconline.com.cn/cgi-bin/wstsearch?tn=bear&relative=1&title=&content=LCD&ch_id=&iftitle=0&yf=&mf=&df=&yt=&dt=&to_date=&from_date=&query=LCD&image.x=15&image.y=9
  项目较急,对您的帮助我不胜感激!!!!!!!!!!!
...全文
47 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jorcks2002 2003-06-07
  • 打赏
  • 举报
回复
用模式匹配
ms-help://MS.MSDNQTR.2003FEB.2052/vblr7/html/vaoprLike.htm
我用的是(vs2003
比较两个字符串。
result = string Like pattern
各部分说明
result
必选项。任何 Boolean 变量。结果是 Boolean 值,它表示 string 是否匹配 pattern。
string
必选项。任何 String 表达式。
pattern
必选项。任何符合“备注”中描述的模式匹配约定的 String 表达式。
备注
如果 string 匹配 pattern,则 result 为 True;如果不匹配,则 result 为 False。如果 string 和 pattern 都是空字符串,则结果是 True。否则,如果 string 或 pattern 中有一个为空字符串,则结果为 False。
Like 运算符的行为取决于 Option Compare 语句。每个模块的默认字符串比较方法是 Option Compare Binary。
内置的模式匹配为字符串比较提供了一种多功能工具。模式匹配功能允许您使用通配符、字符列表或字符范围的任何组合来匹配字符串。下表显示 pattern 中允许的字符和这些字符的匹配项:
pattern 中的字符string 中的匹配项
?任何单个字符
*零或更多字符
#任何单个数字(0 到 9)
[charlist]charlist 中的任何单个字符
[!charlist]不在 charlist 中的任何单个字符

括在方括号 ([ ]) 内的一个或多个字符的组 (charlist) 可以用于匹配 string 中的任何单个字符,并且可以包含几乎任何字符代码(包括数字)。
注意 若要匹配特殊字符,如左方括号 ([)、问号 (?)、数字符号 (#) 和星号 (*),请将它们括在方括号中。不能在组中使用右方括号 (]) 来匹配它自己,但可以在组外作为单个字符使用。
通过使用连字符 (–) 将范围的上下限分开,charlist 可以指定字符的范围。例如,如果 string 中的相应字符位置包含范围 A–Z 中的任何大写字母,则 [A-Z] 将产生匹配。可以在方括号中包括多个范围而不用分隔符。
指定范围的含义取决于在运行时有效的字符排序(由 Option Compare 和运行代码的系统的区域设置确定)。当使用 Option Compare Binary 时,范围 [A–E] 匹配 A、B、C、D 和 E。当使用 Option Compare Text 时,[A–E] 匹配 A、a、À、à、B、b、C、c、D、d、E 和 e。该范围不匹配 Ê 或 ê,因为在排序顺序中,重音字符排在非重音字符之后。
模式匹配的其他重要规则包括:
charlist 开始处的感叹号 (!) 意味着仅当在 string 中找到除 charlist 以外的任何字符时才发生匹配。当在方括号外使用时,感叹号匹配它自己。
连字符 (-) 可以出现在 charlist 的开始处(如果有感叹号,则在它后面)或结尾处以匹配它自己。在任何其他位置,连字符标识由连字符两侧的字符界定的字符范围。
在指定字符范围时,这些字符必须以升序排序顺序出现(即,从最低到最高)。因此,[A-Z] 是有效的模式,但 [Z-A] 不是。
字符序列 [] 被视为零长度字符串 ("")。
在某些语言中,字母表中有一些表示两种不同字符的特殊字符。例如,有几种语言使用字符 æ 来表示字符 a 和 e(当这两个字符一起出现时)。Like 运算符认为该单个特殊字符与这两个字符是等效的。
当在系统区域设置中指定使用特殊字符的语言时,在 pattern 或 string 中出现的单个特殊字符都匹配其他字符串中等效的双字符序列。与此类似,括在方括号内的 pattern 中的单个特殊字符(独立存在、在列表中或在某个范围内)匹配 string 中等效的双字符序列。
示例
本示例使用 Like 运算符将字符串与模式比较。结果是 Boolean 值,它表示该字符串是否符合该模式。
Dim myCheck As Boolean
myCheck = "F" Like "F" ' Does "F" match "F"? Returns True.
myCheck = "F" Like "f" ' Does "F" match "f"? Returns False.
myCheck = "F" Like "FFF" ' Does "F" match "FFF"? Returns False.
myCheck = "aBBBa" Like "a*a" ' Does "aBBBa" have a "a" at the
' beginning, an "a" at the end, and any number of characters in
' between? Returns True.
myCheck = "F" Like "[A-Z]" ' Does "F" occur in the set of
' characters from A to Z? Returns True.
myCheck = "F" Like "[!A-Z]" ' Does "F" NOT occur in the set of
' characters from A to Z? Returns False.
myCheck = "a2a" Like "a#a" ' Does "a2a" begin and end with an
' "a" and have any single-digit number inbetween? Returns True.
myCheck = "aM5b" Like "a[L-P]#[!c-e]" ' Does "aM5b" fit the following
' pattern: Begins with "a", has and character from the set L through
' P, followed byb any single-digit number, and finally contains any
' character excluded from the character set c through e. Returns True.
myCheck = "BAT123khg" Like "B?T*" ' Does "BAT123khg" fit the
' following pattern: Begins with "B", followed by any single
' character, followed by a "T" and finally zero or more characters
' of any type. Returns True.
myCheck = "CAT123khg" Like "B?T*" ' Does "CAT123khg" fit the
' following pattern: Begins with "B", followed by any single
' character, followed by a "T" and finally zero or more characters
' of any type. Returns False.
)
Jshadow 2003-06-07
  • 打赏
  • 举报
回复
用“替换”命令:

格式:Edit.Replace findwhat replacewith

注释:
Edit 是你要替换的控件上的文本的ID。如:Label
findwhat 是你要替换的文本
replacewith 替换后的文本,如把 aaa 替换成 "<font color='#000000'>aaa</font>"
yyhao 2003-06-07
  • 打赏
  • 举报
回复
好像是全文检索的关键词不能太短,但具体我也记不清了,你可能及长一点的词试试。
jzw995123 2003-05-27
  • 打赏
  • 举报
回复
全文索引会有问题的!请看完我这段文字。

我经过一个晚上的测试,先用northwind数据库中的products表来测试。在这个表上建立的全问索引。索引的列名为:ProductName ,Qutityname,这两个都是字符类型的。

然后我select * from products where FREETEXT(*,'Tofu').就是寻找出现单词:Tofu的记录
结果有几个记录被查找出来了,但我改为Tof,则没记录查到。我个人的结论是:全文索引只能匹配单词短语。我看到的ASP.net以及SQL上的例子,都是用完整的单词在演示给读者看,全文索引的效果,不能查单个字母。

这是第一个问题。第二个问题,假设我有一个自己的数据表,建立了个全文索引,在字符类型的列上建立索引。但我给他填充的值是“你好 谢谢 再见”。按照我刚才测试northwind的结论,我用“谢谢”应该能查出来,但结论是查不出来。我打个“谢”,也才查不出来。有时候还有错误的。

所以,我怀疑是不是SQL只能查英文单词,不能匹配字母,也就是说它不像select 的like那样可以前后匹配任意字符。

另外一个方面,全文索引的更新是非常消耗资源的!每次填充索引都要消耗一定的资源!

以上是我对使用全文索引的一些想法。请参考!
我所得出的一些结论也只是我机器上的调试结果,我不知道别人的怎么样!

谢谢
hfgang 2003-05-27
  • 打赏
  • 举报
回复
你所说的包括:全文检索、取动态摘要(按检索词)以及检索结果的反显三方面的问题。
对于第一个全文检索说简单使用sqlserver也能实现,说复杂卖到几十万的全文检索系统也有。
对于去动态摘要一般的做法是取得整篇文章,然后再文章中完全匹配检索词,再把这个检索词前后N个字节的内容显示出来。
对于反显,取动态摘要的时候完全匹配到检索词后在该词的前后加上html标记,如:<b>检索词</b>就可以实现了。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧