好消息:终于搞定一个全文检索引擎 - lucene(0分)

  • 主题发起人 主题发起人 yysun
  • 开始时间 开始时间
还是直接对
http://www.delphibbs.com/
整个网站进行索引?
 
谢谢 datm func=author 的建议。
qdyoung, 贴子数据转入独立的特定格式的索引库(目前大概 240M)
通过 XML 与 www.delphibbs.com 通讯,动态更新索引库(研制中)。
 
yysun 你要给我们一个交待了。
检索表达式: 离线 CHM,用时 187 微秒。共检索到 1863 个记录,
检索表达式: 最新 离线 CHM,用时 384 微秒。共检索到 3503 个记录
检索表达式: 离线+CHM+最新,用时 95 微秒。共检索到 18 个记录
检索表达式: 最新+离线+CHM,用时 108 微秒。共检索到 79 个记录
检索表达式: CHM+最新+离线,用时 100 微秒。共检索到 74 个记录
这是什么嘛?
 
datm 这是您没有弄懂检索关键字的语法。
我们的检索引擎不认为 + 就是 AND,如果您用“最新 AND 离线 AND CHM”会锝到7个记录。
+ - 的含义请看: http://delphibbs.com/delphibbs/dispq.asp?lid=769014
 
[:D]原来如此
但是为什么会得到上述结果,特别是第一、二条。
干脆把这部分源码公布一下。
以后发贴子,要小心错别字了。
 
俺也简单研究了一下,这段代码能说明常用方法
************************************
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("+title:(dog OR cat) -author:/"bobdo
le/"", null,
"+(title:dog title:cat) -author:/"bobdo
le/"");
}
 
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>
 
yysun的基础知识太扎实了,这种定义方法我差不多都还给老师了。
还是房客的好看动一些,谢谢。
 
能不能介绍一下如何支持中文的改进方法?自己写一个中文的分析类ChineseAnalyzer
?
 
>能不能介绍一下如何支持中文的改进方法?自己写一个中文的分析类ChineseAnalyzer
是啊,孙老师能不能讲讲
另外,这个东西支持pdf的全文检索嘛?
 
我在下面的问题里给出了处理中文的三个类 ChineseAnalyzer,ChineseFilter,
ChineseTokenizer 和使用方法。
http://www.delphibbs.com/delphibbs/DispQ.asp?LID=747459
可以对 pdf, html, xml,do
c, 实时网页 ... 任何格式做索引。
只要有合适的 Filter 和 Tokenizer,过滤掉排版信息,取出文字信息。
 
我在自己的学校的Linux服务器上安装了一个harvest全文检索引擎。能快速的检索PDF、PS
、Tex文件的内容,是用C和Perl写的。可惜不能检索中文等双字节的东西,好在我们主要检
索网络上DOWN的论文,这样也就够了。用Java做的搜索引擎也能这么高效吗?看来我要好好
学习Java了。
行家一出手,就知有没有!再次感谢孙老师!
 
唉,看到这个帖子我受到了极大的刺激:
我在复旦内部建立了一个ftp搜索引擎,几十万条记录的检索速度最少也要十几秒。
我真希望能够使用全文检索技术,但是ftp检索的特性决定了我的全文索引必须包含
所有可能的关键字,sql server 数据库只有100mb,但是全文索引超过了1.5gb。
更新速度更是慢如死蜗牛(没错,蜗牛还是死的……)。到现在也没搞好。
前几天北大的mm又让我写一个编译器,两个月的作业让我一个星期完成,我就算
是神仙也得吐血了。刚刚写完,足足写了50个小时,结果连声谢谢都没听到。
同样是全文索引和编译器技术,我就没有孙老大潇洒……
 
孙老大,到底是孙老大!
 
孙老师,象您致敬了,嘿嘿,俺服了你了!!!
 
敬仰啊,我是没办法赶超yysun,让我的后辈努力了.
 
高手就是高手,
令我等后輩佩服得五體投地,
學習。
 
对了,yysun老大,大富翁那个全文检索网站有没有源码可以下的,我也down一下来看看。
 
后退
顶部