Quick Start
你第一件可能想做的事就是搜索网络。在jbox中这是很容易实现的。 下面代码展示一个搜索网络的示例:
public class Foo {
public crawl(String[] args){
Configuration cfg =
Configuration.config();
WebSpider s =
cfg.buildWebSpider();
while(s.hashNext()){
Page p =
s.next();
System.out.println(p);
}
}
}
文本切割
文本切割是搜索引擎中非常重要的一块。不同的语言有不同的切割算法。 在jbox的当前版本中提供了英文及CJK文字的切词实现。 在默认的情况下,只指定了英文切词,你可以在配置文件“jbox.cfg.xml”中修改需要切词的算法。做为开始,你可以像下面的代码一样切割文本:
public void cutText(){
String text = "Cutting
text into words is very important for search engineer."
CutterBox cb =
cfg.buildCutterBox();
System.out.println(cb.cutText(text));
}
或者切割页面的包装类Page:
public void cutPage(){
String text = "Cutting
text into words is very important for search engineer."
Page page = new Page();
page.setText(text);
CutterBox cb =
cfg.buildCutterBox();
cb.cutPage(page));
System.out.println(page.getWords());
}
你可以在配置文件中指定多个切割类同时作用(处理混合语言文本)。
生成索引
索引是搜索引擎的核心部分。 在jbox中也是很容易就可以做到的。下面代码展示一个示例,用默认的IndexWriter接口实现类来创建页面的索引。
public void createIndex(){
WebSpider s =
cfg.buildWebSpider();
CutterBox cb =
cfg.buildCutterBox();
org.jbox.indexer.IndexWriter iw
= cfg.buildIndexWriter();
while(s.hashNext()){
Page p =
s.next();
if(p==null||p.getText()==null)continue;
cb.cutPage(p);
// You should cut a page befor create its index.
iw.saveIndex(p);
}
}
你可以在数据库“Word”表的“index”字段找到所创建的索引。 一个索引可能如下:
"22-0.166667-0,1"
第一个域“22”表示这个词在id为22的页面中出现过,第二个域“0.166667”表示这个词在该页面中的TF(词频)。第三个域“0,1”表示词在该页面中的位置。
例如:
"I have a cat. You have a dog. He is so funny."
词“have”在第一、第二个句子出现,所以这个词在这一段文本中的位置就是“0,1”。这段文本有12个词,所以TF(词频)是 2/12 = 1.66667。 假设这段文本在“Page”表中的存在,其id为“22”,那么这个词在这段文本中的索引就是“22-0.166667-0,1”。
索引检索
在索引被创建之后,你就可以开始给你的应用程序创建自己的搜索端了。例如:
public void search(){
String query =
"successfully,status";
//search the key words "successfully,status";
Configuration cfg =
Configuration.config(); //load default configuration file
"jbox.cfg.xml";
Searcher s =
cfg.buildSearcher();
Page[] result =
s.search(query);
for (Page p : result) {
System.out.println(p.getTitle());
System.out.println(p.getText());
System.out.println(p.getUrl());
}
}
你可能会发现,返回的text仅仅是一个简短的介绍,如果你用的是SimpleSearcher来检索的话。那是因为SimpleSearcher返回一个Page的代理类。如果你想得到完整的text的话,你可以像下面的代码这样做:
for (Page p : result) {
PageProxy
proxy = (PageProxy)p;
P =
p.getPage();
System.out.println(p.getText());
}
关键词高亮
如果你需要将关键词高亮显示,你可以使用Highlight方法来做到这一点。例如,你可以将下面代码加到上面的例子中去高亮关键词。
for(…){
…
searcher.highLight(p.getText(),
new StringBuffer(query), Color.RED)
…
}
Highlight方法做仅仅是将所有的关键词置换成带指定的颜色:
keyword---><font
color="xxxxxx">keyword</font>
现 在你已经完成了一个你自己的简单搜索引擎。 你可以在example包中找到更多的例子:
createIndex/SimpleSample.java - 一个简单的,crawl网络创建索引的例子。
createIndex/ComplexExample.zip- 一个用多线程改进crawl网络创建索引的效率的例子。
MyJbox.zip - 一个完整的,在tomcat+mysql下的例子,需要tomcat5.5, mysql5.0, jdk 1.5以上。
你可以在
这里下载到Jbox。