LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1534|回复: 1

建议使用APACHE的lucene建立全文检索引擎

[复制链接]
发表于 2004-9-28 11:10:46 | 显示全部楼层 |阅读模式
换个思路,把检索引擎与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个小时,结果连声谢谢都没听到。

  同样是全文索引和编译器技术,我就没有孙老大潇洒……
发表于 2004-9-28 23:40:15 | 显示全部楼层
谢谢兄弟,先收下研究一下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表