|
换个思路,把检索引擎与BBS分离,看看这个 richsearch.com
————————————————
[转贴]
来自:yysun 时间:2001-11-29 1:24:00 ID:755450
我们的离线阅读器苦于没有全文检索引擎一直输给 chm。
最近,我终于发现一个可以利用的全文检索引擎 http://jakarta.apache.org/lucene
经过适当改造完全支持中文!
不久我将推出一个全新的离线阅读器。
来自:yysun 时间:2001-11-29 5:05:00 ID:755491
一篇介绍 lucene 的文章
http://www.javaworld.com/javaworld/jw-09-2000/jw-0915-lucene.html
来自:coolbaby 时间:2001-11-29 7:21:00 ID:755500
好啊
虽然,chm确实很好
但我一直希望大富翁能做出更好的来``
来自:datm 时间:2001-11-29 7:28:00 ID:755503
yysun有点钻牛角尖,[]
来自:forss 时间:2001-11-29 8:11:00 ID:755526
期待中,,,希望能比CHM更好更方便,,
不然我还是用CHM[]
来自:drummer 时间:2001-11-29 8:38:00 ID:755566
感谢孙老师,另请问,现在大富翁是否不支持XML更新了?我取贴子列表不成功。正在学习
xml,主要想试试,应该对大富翁网站影响不大吧,谢谢。
来自:yysun 时间:2001-11-30 22:34:00 ID:756509
“钻牛角尖”是什么意思? 我倒觉得中文全文检索是个非常有意思的题目。
首先,我我们得有个索引引擎,一般数据库用 B+ 树,而 Lucene 使用了 V-Twin 引擎。
V-Twin 是什么,我也不懂。反正 Lucene 已经实现,可以直接拿来用就是了。
然后是中英文单词分离 (tokenize)、非检索词过滤(filter),这些比较简单。
接下来是中文分词(做这个需要一个分词表和一个逻辑算法)。比如从“中华人民共和国”中
分出“中华”“人民”“共和国”,这样检索“华人”就不会把“中华人民共和国”也给检
索出来了。最后,还可以做“同义词”、“近音词”查询等等。
目前,我还没有时间实现中文分词以下的内容,不过成果已经比较满意了:
1、建立索引: 63万多条贴子,用去 135 分钟。索引文件总共 240+M。
2、按域查询,可检索标题、正文、分类和作者,例如:user:yysun subject:大富翁。
3、支持 +、-,例如: +user:yysun -delphi
4、支持 AND、OR,例如:+大富翁 AND -离线
5、支持更新,可以动态增加、删除贴子。
以上几点,除了索引文件比 chm 大以外,性能都已经超过 chm 了。chm 压缩 zip 格式。
Lucene 的索引文件用 zip 压,大致也能压掉 50%,为 120+M 左右。
我已经查到压缩索引的着手点了,不久这个性能指标也可以赶超 chm。
全文检索最重要的还是检索速度,让我们来看看新的离线阅读器 dfwSearch 的速度:
检索条件 检索到的贴子数 时间(秒)
delphi 45687 0.210
yysun 2130 0.180
+大富翁 -delphi 6068 0.701
ActiveX 2562 0.361
+user:yysun +activeX 38 0.210
这个周末我也许可以架设一个大富翁全文检索站点出来。
来自:dingbaosheng 时间:2001-11-30 22:41:00 ID:756521
关注
来自:timerri 时间:2001-11-30 22:43:00 ID:756525
能否做个在线浏览器?
xml在我这里总是有这样那样的问题,我现在按问题列表就什么都不会出来!!!
我现在用的是win2000advanced server+ie6+msxml3
来自:donkey 时间:2001-12-1 3:23:00 ID:756728
孙老师辛苦了,多谢!
现在的搜索引擎确实不好用,我发现有的帖子在搜索中无法查出,例如搜索"打印信息",
我发现至少有两篇帖子没有被检索出来
来自:luyear 时间:2001-12-1 8:08:00 ID:756765
十分关注!在离线和在线都要有这个功能才好!
来自:xianjun 时间:2001-12-1 10:24:00 ID:756933
确实挺好!
来自:lq_jeffer 时间:2001-12-1 10:34:00 ID:756948
检索提示有错:当检索为空是提示为 1条记录
来自:yysun 时间:2001-12-1 10:54:00 ID:756999
现在这个是在线的全文检索,过几天有空再补充进 XML 数据接收,使得全文检索与大富翁
数据库同步起来。
试想把这个引擎用到离线阅读器该有多爽!
来自:房客 时间:2001-12-1 11:27:00 ID:757084
数据挖掘 建立大富翁查询事务还是相当有价值的
看天网的查询速度就知道了
来自:ydfq 时间:2001-12-1 11:43:00 ID:757114
感谢孙老师!
来自:苦虫 时间:2001-12-1 12:12:00 ID:757150
恩,值得研究的课题
支持老孙;)
来自:小人物 时间:2001-12-1 12:16:00 ID:757157
全文检索结果
检索表达式: yysun,共检索到 2130 个记录,用时 381 微秒。
---------------------------
孙老师,您真牛啊!
您是上海哪所高校的教授啊?
来自:jbas 时间:2001-12-1 12:36:00 ID:757179
谢谢孙老师的,但不知孙老师能否把它的搜索出来的内容形式作成dfw的经典形式呢?就象
http://www.delphibbs.com/delphib ... w的页面形式的
,我还用php+mysql写了一个呢[])
来自:萧月禾 时间:2001-12-1 12:58:00 ID:757213
试了一下,还挺快的
孙老师厉害呀
来自:Derlin 时间:2001-12-1 14:22:00 ID:757304
爽,确实爽!
来自:蒋劲刚 时间:2001-12-1 20:38:00 ID:757906
[]速度还可以。满快的!
来自:cxyhy 时间:2001-12-1 21:50:00 ID:758051
gz
来自:coolcat 时间:2001-12-1 22:24:00 ID:758111
我现在用的那个太差了..
经常出现内存溢出和表达式太复杂的提示...
烦死了..
来自:DoubleWood 时间:2001-12-2 0:09:00 ID:758169
提个意见,比如我检索"SCSI",检索结果的最后2条返回的内容实在太多,
占了1页还多(1024*768的分辨率下),是否可以考虑加以限制?
希望大富翁越来越好:p
来自:yysun 时间:2001-12-2 11:09:00 ID:756908
大家可以试验一下这个地址: http://search.delphibbs.com
来自:yysun 时间:2001-12-2 11:09:00 ID:757117
现在大富翁每天进帖子3000个, 形成一个庞大的资料库。
配合全文检索, 我们有希望做成类似 google 的东东了。
有没有人能告诉我这个全文检索网站(速度如何?
http://search.delphibbs.com
来自:yysun 时间:2001-12-2 11:10:00 ID:758451
起用新域名: http://search.delphibbs.com
来自:吴剑明 时间:2001-12-3 20:04:00 ID:761370
yysun:
不如讲讲或者公开你那个全文搜索的方法?这样对大家都有所提高。
我现在用我自己新写的程序(没用任何第三方引擎):
标题搜索最快小于一秒,最慢16秒。
全文搜索最快1秒,最慢还是要一分钟。
感觉有点到头了的说。
来自:吴剑明 时间:2001-12-3 20:10:00 ID:761377
以下是我这两天的结果:
按秒记:
非技术问题 按标题(bde) 按标题(odbc) 按全文(bde) 按全文(odbc) 按标题(jdbc) 按全文(jdbc)
myrich1.2 129 20 17 67 65
re3.1 17 25 11 116 116
myrich1.3 1 3 2 <1 3 11 58
看来关键时刻还得看YYSUN做的引擎了。
来自:DoubleWood 时间:2001-12-3 22:15:00 ID:761585
to 吴剑明:
其实孙老师公布的网址上就有源码和介绍:p
可惜我看不懂,因为是Java写的,我不懂java
估计改成delphi再加上适当的优化,速度还有相当大的提高余地。
我估计孙老师也还没将其改到Delphi。不然也不会只公布原网址:p
如果你确实很想知道方法,那就去看java的源码。
来自:吴剑明 时间:2001-12-3 23:51:00 ID:761686
JAVA就JAVA,反正我也是写JAVA的。:)
代码在哪个URL?
来自:苦海无边 时间:2001-12-4 8:55:00 ID:761865
cool~![]
来自:yysun 时间:2001-12-4 12:39:00 ID:762578
自我下载 Lucene,用了3天(下班后的业余时间)改进了它的中文支持,
用了1天 建立了大富翁全文检索引擎 servlet,用了2天申请了一个新的 Web 空间。
这样,在一个星期左右,大富翁全文检索网站 http://www.richsearch.com 就面世了,
欢迎大家使用!
来自:yysun 时间:2001-12-5 1:23:00 ID:764217
开始倒是想把 Lucene 改成 Delphi,但是发现不好办,原因就是 Lucene 使用了一个叫
JavaCC 的文法工具 http://www.metamata.com/javacc
http://www.javaworld.com/javawor ... 1229-cooltools.html
JavaCC 能把 BNF 转换成相应的 Java 语法分析类。比如,我们的查询语法的 BNF 是:
* Query ::= ( Clause )*
* Clause ::= ["+", "-"] [<TERM> ":"] ( <TERM> | "(" Query ")" )
用 JavaCC 就能生成 7 个 Java 类。这些类负责检验用户输入的语法和分词(Tokenize)。
Lucene 首先操作这些类,看用户输入的内容是否符合规范、做分词,然后再检索。
这么做的好处是定义语法非常方便,并且是的检索语法和检索引擎分离。
但是,因为我们没有 DelphiCC,只能硬改 JavaCC 生成 7 个 Java 类,万一语法变化,
JavaCC 生成新的 7 个 Java 类。所作修改统统作废。所以把它改成 Delphi 的意义不大。
Java 的好处是其核心为 Unicode,因此我们在中文处理上并没有太大的麻烦。
利用 Lucene 的大富翁全文检索可以做成 servlet,也可以做成 SOAP Server,
或者本机的一个 TCP Server/Service。
来自:datm 时间:2001-12-5 1:29:00 ID:764222
牛,真牛。
我提个建议,能不能公布用户查询的关键字排名。
来自:datm 时间:2001-12-5 3:36:00 ID:764247
yysun老板,出了个问题:
检索表达式: 浩瀚的工程-汉化Delphi所有的帮助文件,共检索到 1 个记录,用时 9262 微秒。
返回
里面没有列表。
来自:yysun 时间:2001-12-5 5:39:00 ID:764256
谢谢,datm 这确实是个不大不小的 bug - 只检索到一条记录时,不会显示出来。
遍历一个数组,我竟然写成了 for(int ii=0; ii<nn.length()-1; ii++) 低级错误啊[]
这就改正!
另外,用户输入的检索词我已经保存下来,过一段时间可以整理出来。
来自:datm 时间:2001-12-5 18:50:00 ID:766199
呵呵,yysun的精神真值得我好好学习。
我只是对全文检索很感兴趣,但从来没想过去研究。所以搞了8,9的编程还是停留在控件的使用。
当然Windows编程才弄了2年。一个标准的实用主义者。
对了,为什么不把
http://www.shareware.net.cn/shareware_view.asp?id={53878364-C248-45B6-BDAC-F290A0C6227C}
改成:
http://www.shareware.net.cn/shareware_view.asp?id={53878364-C248-45B6-BDAC-F290A0C6227C}&func=author
来自:qdyoung 时间:2001-12-6 12:53:00 ID:767673
帖子数据是转入文本?XML存储的吗?不会每个帖子保存一个文件吧?
来自:qdyoung 时间:2001-12-6 13:08:00 ID:767732
还是直接对
http://www.delphibbs.com/
整个网站进行索引?
来自:yysun 时间:2001-12-6 22:05:00 ID:769068
谢谢 datm func=author 的建议。
qdyoung, 贴子数据转入独立的特定格式的索引库(目前大概 240M)
通过 XML 与 www.delphibbs.com 通讯,动态更新索引库(研制中)。
来自:datm 时间:2001-12-8 13:24:00 ID:772480
yysun 你要给我们一个交待了。
检索表达式: 离线 CHM,用时 187 微秒。共检索到 1863 个记录,
检索表达式: 最新 离线 CHM,用时 384 微秒。共检索到 3503 个记录
检索表达式: 离线+CHM+最新,用时 95 微秒。共检索到 18 个记录
检索表达式: 最新+离线+CHM,用时 108 微秒。共检索到 79 个记录
检索表达式: CHM+最新+离线,用时 100 微秒。共检索到 74 个记录
这是什么嘛?
来自:yysun 时间:2001-12-9 1:47:00 ID:773792
datm 这是您没有弄懂检索关键字的语法。
我们的检索引擎不认为 + 就是 AND,如果您用“最新 AND 离线 AND CHM”会锝到7个记录。
+ - 的含义请看: http://delphibbs.com/delphibbs/dispq.asp?lid=769014
来自:datm 时间:2001-12-9 2:53:00 ID:773819
[]原来如此
但是为什么会得到上述结果,特别是第一、二条。
干脆把这部分源码公布一下。
以后发贴子,要小心错别字了。
来自:房客 时间:2001-12-9 3:02:00 ID:773822
俺也简单研究了一下,这段代码能说明常用方法
************************************
public void testSimple() throws Exception {
assertQueryEquals("term term term", null, "term term term");
assertQueryEquals("term term1 term2", null, "term term term");
assertQueryEquals("term 1.0 1 2", null, "term");
assertQueryEquals("a AND b", null, "+a +b");
assertQueryEquals("a AND NOT b", null, "+a -b");
assertQueryEquals("a AND -b", null, "+a -b");
assertQueryEquals("a AND !b", null, "+a -b");
assertQueryEquals("a && b", null, "+a +b");
assertQueryEquals("a&&b", null, "+a +b");
assertQueryEquals("a && ! b", null, "+a -b");
assertQueryEquals("a OR b", null, "a b");
assertQueryEquals("a || b", null, "a b");
assertQueryEquals("a OR !b", null, "a -b");
assertQueryEquals("a OR ! b", null, "a -b");
assertQueryEquals("a OR -b", null, "a -b");
assertQueryEquals("+term -term term", null, "+term -term term");
assertQueryEquals("foo:term AND field:anotherTerm", null,
"+foo:term +anotherterm");
assertQueryEquals("term AND \"phrase phrase\"", null,
"+term +\"phrase phrase\"");
assertQueryEquals("germ term^2.0", null, "germ term^2.0");
assertQueryEquals("term^2.0", null, "term^2.0");
assertQueryEquals("(foo OR bar) AND (baz OR boo)", null,
"+(foo bar) +(baz boo)");
assertQueryEquals("((a OR b) AND NOT c) OR d", null,
"(+(a b) -c) d");
assertQueryEquals("+(apple \"steve jobs\") -(foo bar baz)", null,
"+(apple \"steve jobs\") -(foo bar baz)");
assertQueryEquals("+titledog OR cat) -author:\"bob dole\"", null,
"+(title:dog title:cat) -author:\"bob dole\"");
}
来自:yysun 时间:2001-12-9 3:41:00 ID:773831
datm:
“离线 CHM”表示 “离线 OR CHM”,所以有 1863 个记录,
“最新 离线 CHM”表示“最新 OR 离线 OR CHM”,所以有 3503 个记录。
检索表达式的最新 BNF 定义:
Query ::= Clause ( [ Conjunction ] Clause ) *
Conjunction ::= 'AND' | 'OR' | '||'
Clause ::= [ Modifier ] [ FieldName ':' ] BasicClause [ Boost ]
Modifier ::= '-' | '+' | '!' | 'NOT'
BasicClause ::= ( Term | Phrase | | PrefixQuery '(' Query ')'
PrefixQuery ::= Term '*'
Phrase ::= '"' Term * '"'
Boost ::= '^' DecimalDigit+ '.' DecimalDigit+
Term ::= <a-word-or-token-to-match>
FieldName ::= <name-of-an-indexed-field>
来自:datm 时间:2001-12-9 4:07:00 ID:773841
yysun的基础知识太扎实了,这种定义方法我差不多都还给老师了。
还是房客的好看动一些,谢谢。
来自:qdyoung 时间:2001-12-10 18:10:00 ID:777603
能不能介绍一下如何支持中文的改进方法?自己写一个中文的分析类ChineseAnalyzer
?
来自:ahxia 时间:2001-12-10 18:28:00 ID:777649
listening
来自:elan 时间:2001-12-12 11:09:00 ID:781874
>能不能介绍一下如何支持中文的改进方法?自己写一个中文的分析类ChineseAnalyzer
是啊,孙老师能不能讲讲
另外,这个东西支持pdf的全文检索嘛?
来自:yysun 时间:2001-12-12 20:25:00 ID:783399
我在下面的问题里给出了处理中文的三个类 ChineseAnalyzer,ChineseFilter,
ChineseTokenizer 和使用方法。
http://www.delphibbs.com/delphibbs/DispQ.asp?LID=747459
可以对 pdf, html, xml, doc, 实时网页 ... 任何格式做索引。
只要有合适的 Filter 和 Tokenizer,过滤掉排版信息,取出文字信息。
来自:Dick 时间:2001-12-12 21:01:00 ID:783458
我在自己的学校的Linux服务器上安装了一个harvest全文检索引擎。能快速的检索PDF、PS
、Tex文件的内容,是用C和Perl写的。可惜不能检索中文等双字节的东西,好在我们主要检
索网络上DOWN的论文,这样也就够了。用Java做的搜索引擎也能这么高效吗?看来我要好好
学习Java了。
行家一出手,就知有没有!再次感谢孙老师!
来自:mikedeakins 时间:2002-1-3 23:52:00 ID:833128
唉,看到这个帖子我受到了极大的刺激:
我在复旦内部建立了一个ftp搜索引擎,几十万条记录的检索速度最少也要十几秒。
我真希望能够使用全文检索技术,但是ftp检索的特性决定了我的全文索引必须包含
所有可能的关键字,sql server 数据库只有100mb,但是全文索引超过了1.5gb。
更新速度更是慢如死蜗牛(没错,蜗牛还是死的……)。到现在也没搞好。
前几天北大的mm又让我写一个编译器,两个月的作业让我一个星期完成,我就算
是神仙也得吐血了。刚刚写完,足足写了50个小时,结果连声谢谢都没听到。
同样是全文索引和编译器技术,我就没有孙老大潇洒…… |
|