搜索到关于全文检索的一些文章,希望对大富翁们有帮助 ( 积分: 0 )

H

hengnuo

Unregistered / Unconfirmed
GUEST, unregistred user!
Lucene之起源现状及初步应用
Lucene之起源现状及初步应用
1.起源与发展
Lucene是一个高性能、纯Java的全文检索引擎,而且免费、开源。Lucene几乎适合于任何需要全文检索的应用,尤其是跨平台的应用。
Lucene的作者Doug Cutting是一个资深的全文检索专家,刚开始,Doug Cutting将Lucene发表在自己的主页上,2000年3月将其转移到sourceforge,于2001年10捐献给Apache,作为Jakarta的一个子工程。
2.使用现状
经过多年的发展,Lucene在全文检索领域已经有了很多的成功案例,并积累了良好的声誉。
基于Lucene的全文检索产品(Lucene本身只是一个组件,而非一个完整的应用)和应用Lucene的项目在世界各地已经非常之多,比较知名的有:
l Eclipse:主流Java开发工具,其帮助文档采用Lucene作为检索引擎
l Jive:知名论坛系统,其检索功能基于Lucene
l Ifinder:出自德国的网站检索系统,基于Lucene(http://ifinder.intrafind.org/)
l MIT DSpace Federation:一个文档管理系统(http://www.dspace.org/)
国内外采用Lucene作为网站全文检索引擎的也很多,比较知名的有:
l http://www.blogchina.com/weblucene/
l http://www.ioffer.com/
l http://search.soufun.com/
l http://www.taminn.com/
(更多案例,请参见http://wiki.apache.org/jakarta-lucene/PoweredBy)
在所有这些案例中,开源应用占了很大一部分,但更多的还是商化业产品和网站。毫不夸张的说,Lucene的出现,极大的推动了全文检索技术在各个行业或领域中的深层次应用。
3.初步应用
前面提到,Lucene本身只是一个组件,而非一个完整的应用,所以若想让Lucene跑起来,还得在Lucene基础上进行必要的二次开发。
下载与安装
首先,你需要到Lucene的官方网站http://jakarta.apache.org/lucene/ 去下载一份拷贝,最新版是1.4。下载后将得到一个名为lucene-1.4-final.zip的压缩文件,将其解压,里面有一个名为lucene-1.4-final.jar的文件,这就是Lucene组件包了,若需要在项目使用Lucene,只需要把lucene-1.4-final.jar置于类路径下即可,至于解压后的其他文件都是参考用的。
接下来,我用Eclipse建立一个工程,实现基于Lucene的建库、记录加载和记录查询等功能。


如上图所示,这是开发完成后的工程,其中有三个源文件CreateDataBase.java,InsertRecords.java,QueryRecords.java,分别实现建库、入库、检索的功能。

以下是对这三个源文件的分析。
建库源码及说明

CreateDataBase.java
packagecom.holen.part1;

importjava.io.File;
importorg.apache.lucene.analysis.standard.StandardAnalyzer;
importorg.apache.lucene.index.IndexWriter;

/**
* @authorHolenChen
*初始化检索库
*/
public classCreateDataBase{

publicCreateDataBase(){
}

public intcreateDataBase(Filefile){
intreturnValue=0;
if(!file.isDirectory()){
file.mkdirs();
}
try{
IndexWriterindexWriter= newIndexWriter(file,newStandardAnalyzer(),true);
indexWriter.close();
returnValue=1;
}catch(Exceptionex){
ex.printStackTrace();
}
returnreturnValue;
}

/**
*传入检索库路径,初始化库
* @paramfile
* @return
*/
public intcreateDataBase(Stringfile){
return this.createDataBase(newFile(file));

}

public static voidmain(String[]args){
CreateDataBasetemp= newCreateDataBase();
if(temp.createDataBase("e://lucene//holendb")==1){
System.out.println("db init succ");
}
}
}


说明:这里最关键的语句是IndexWriterindexWriter= newIndexWriter(file,newStandardAnalyzer(),true)。
第一个参数是库的路径,也就是说你准备把全文检索库保存在哪个位置,比如main方法中设定的“e://lucene//holendb”,Lucene支持多库,且每个库的位置允许不同。
第二个参数是分析器,这里采用的是Lucene自带的标准分析器,分析器用于对整篇文章进行分词解析,这里的标准分析器实现对英文(或拉丁文,凡是由字母组成,由空格分开的文字均可)的分词,分析器将把整篇英文按空格切成一个个的单词(在全文检索里这叫切词,切词是全文检索的核心技术之一,Lucene默认只能切英文或其他拉丁文,默认不支持中日韩等双字节文字,关于中文切词技术将在后续章节重点探讨)。
第三个参数是是否初始化库,这里我设的是true,true意味着新建库或覆盖已经存在的库,false意味着追加到已经存在的库。这里新建库,所以肯定需要初始化,初始化后,库目录下只存在一个名为segments的文件,大小为1k。但是当库中存在记录时执行初始化,库中内容将全部丢失,库回复到初始状态,即相当于新建了该库,所以真正做项目时,该方法一定要慎用。
InsertRecords.java
packagecom.holen.part1;

importjava.io.File;
importjava.io.FileReader;
importjava.io.Reader;
importorg.apache.lucene.analysis.standard.StandardAnalyzer;
importorg.apache.lucene.document.Document;
importorg.apache.lucene.document.Field;
importorg.apache.lucene.index.IndexWriter;

/**
* @authorHolenChen
*记录加载
*/
public classInsertRecords{

publicInsertRecords(){
}

public intinsertRecords(Stringdbpath,Filefile){
intreturnValue=0;
try{
IndexWriterindexWriter
= newIndexWriter(dbpath,newStandardAnalyzer(),false);
this.addFiles(indexWriter,file);
returnValue=1;
}catch(Exceptionex){
ex.printStackTrace();
}
returnreturnValue;
}

/**
*传入需加载的文件名
* @paramfile
* @return
*/
public intinsertRecords(Stringdbpath,Stringfile){
return this.insertRecords(dbpath,newFile(file));
}

public voidaddFiles(IndexWriterindexWriter,Filefile){
do
cumentdoc= newDocument();
try{
do
c.add(Field.Keyword("filename",file.getName()));


//以下两句只能取一句,前者是索引不存储,后者是索引且存储
//doc.add(Field.Text("content",new FileReader(file)));

do
c.add(Field.Text("content",this.chgFileToString(file)));

indexWriter.addDocument(doc);
indexWriter.close();
}catch(Exceptionex){
ex.printStackTrace();
}
}

/**
*从文本文件中读取内容
* @paramfile
* @return
*/
publicStringchgFileToString(Filefile){
StringreturnValue= null;
StringBuffersb= newStringBuffer();
char[]c= new char[4096];
try{
Readerreader= newFileReader(file);
intn=0;
while(true){
n=reader.read(c);
if(n>0){
sb.append(c,0,n);
}else
{
break;
}
}
reader.close();
}catch(Exceptionex){
ex.printStackTrace();
}
returnValue=sb.toString();
returnreturnValue;

}

public static voidmain(String[]args){
InsertRecordstemp= newInsertRecords();
Stringdbpath="e://lucene//holendb";
//holen1.txt中包含关键字"holen"和"java"
if(temp.insertRecords(dbpath,"e://lucene//holen1.txt")==1){
System.out.println("add file1 succ");
}
//holen2.txt中包含关键字"holen"和"chen"
if(temp.insertRecords(dbpath,"e://lucene//holen2.txt")==1){
System.out.println("add file2 succ");
}
}
}

文本分析提供了概念发现,自动分类以及无结构文档的创新显示
文本分析提供了概念发现,自动分类以及无结构文档的创新显示
原作者:Seth Grimes
As the minutia of everyday business and personal life migrates to the Internet, small wonder that text search is likely the Web's most popular function. Who has time nowadays for Web surfing, for meandering through a network of linked pages until you come to something intriguing? We want the express train, a direct link to content. Yet text-search results sometimes seem like the generic wisdom you get randomly from a Magic 8 Ball: They're so lacking in contextual relevance that they may answer many questions other than the one you're asking. Text-search results lack the aptness that would follow from understanding the meaning of search terms — rather than just their presence or absence — and from the ability to assess the relevance of a search hit.

Text mining is poised to fill the void, structuring the information inherent in volumes of free text in ways that enable decidedly more intelligent search. There will still be a role for the thoughtful, manual classification and filtering that made Yahoo a winner from its earliest incarnation, and there will still be advantages to intentional, semantic-Web type efforts to categorize content for identification by automated agents. But just as data mining lets you discover hidden relationships in structured data and apply predictive algorithms, text mining will help identify value that you and the manual classifiers and Resource Description Framework wizards didn't know existed.
Tired of search results presented as pages of hits? Text-mining software implements innovative display and navigation techniques that graphically represent networks of conceptually interrelateddo
cuments. Although plenty of pointless graphics, animation, and other whiz-bangs adorn the Web and office software, text-mining interfaces won't be all glitz. They already harness hyperbolic (zooming) displays and other approaches that deliver results in a navigable, organized form that reflects the underlying structure of the result sets — approaches that add analytic value.
Text mining will let us move from knowledge management to knowledge analytics.
Wordspace
Everyone is familiar with the problem space: Languages and forms of communication are designed for human rather than machine consumption, but people's daily lives are increasingly mediated by and reliant on information technology, creating a need for innovative modes of human-computer interaction. People and computers often meet halfway, communicating via simple, structured instruction sets tailored for particular processes like operating an automated teller machine. It isn't feasible for people to go further by learning the variety of languages used to program more sophisticated transactions;
instead we expect computers to understand our native languages.
This problem isn't trivial because the meaning of words is highly dependent on context and may be obscured by slang, irregular grammar, fractured syntax, spelling errors and variations, and imprecision. Interpreting among languages is also difficult when you're dealing with degrees of incomparability of syntax (composition), semantics (meaning), and alphabet. Humans can overcome these difficulties because we understand abstraction, context, and linguistic variations and can detect and apply patterns. We're not so good on speed, volume, consistency, and breadth, by which I mean an individual's ability to work in more than a handful of languages except in the most exceptional of cases.
The challenge — designing information technology that matches human language comprehension while bringing to bear the advantages of automation — defines the playing field for text mining.
Application Space
The most pressing applications for text mining are first in corporate knowledge analytics — making use of the vast stores of non-numeric information that organizations collect in the course of everyday operations — and second in responding to amorphous security threats. I've been skeptical of knowledge management for as long as the field has existed, seeing it as little more than providing a search interface on ado
cument warehouse. In particular, government research programs like the Department of Defense mooted Terrorism Information Awareness (TIA), originally known as Total Information Awareness, proposed to analyze very large volumes of structured and unstructured data to detect patterns and forestall terrorist attacks. Congress has had issues with TIA and similar programs and has eliminated their funding. As a result, the programs will likely "go black,"
classified secret, continuing out of the spotlight of public scrutiny, funded via special appropriations.

Many companies and government agencies already use text mining, albeit for very specialized applications. Because competitiveness and security concerns will only grow in the coming years and text mining extends well-understood search and data mining concepts, the scope and pervasiveness of text-mining applications are bound to grow rapidly.
Techniques and Vendors
Text mining is a two-stage process of categorization and classification. First, you figure out how to describedo
cuments and their contents including the concepts they contain, and then
you bindo
cuments into the descriptive categories and map inter-document relationships according to the newly detected concepts. This approach is similar to segmentation and classification through data mining;
I see data mining's clusters as analogous to text-mining-generated concepts. Once you have classified according to categories, you cando
something akin to OLAP-style slice-and-dice analysis of multidimensional data sets in order to tease interesting details — anomalous or exceptional information — out of the largerdo
cument sets.
Barak Pridor, president of text-mining vendor ClearForest describes text-mining steps as "semantic, statistical, and structural analysis that classifiesdo
cuments and discovers buried persistent entities, event, facts, and relationships"
in a process he calls "intelligent hybrid tagging."
Pridor distinguishesdo
cument-level tags (descriptive elements like subject and author) from "innerdo
cument tags"
that work with families of entity types (that is, with conceptual groupings).
Text-mining offerings are by no means uniform. For example, many implementations such as those from Autonomy derive or import taxonomies (hierarchical knowledge representations that include concept definitions) for use in classifying and relatingdo
cuments. Autonomy's director of technology strategy, Ron Kolb, claims, "Autonomy is unique in being mathematically based, using pattern matching and statistical analysis across multiple languages and multiple platforms."
Autonomy uses Bayesian statistics, which assess relevance based on prior probabilities, and Claude Shannon's information theory to facilitate extracting concepts fromdo
cument sets. The result is to contain the effect of the vagaries of human languages.
Not everyone agrees that a statistically focused approach to categorization is best. Claude Vogel, CTO of Convera, told me, "You cannot build high-level taxonomies and ontologies that way. You can't escape the manual librarian-style work."
(Roughly put, an ontology provides meaning for a knowledgedo
main, while a taxonomy organizes that knowledge.) Thatdo
esn't mean that you need an army of taxonomy builders to work with Convera's RetrievalWare because, as with Autonomy's products, you can import XML-expressed taxonomies. Convera also shares with Autonomy the distinction of searching media such as audio, images, and video in addition to text.
Autonomy has focused on its mining engine, offering options such as weighting, supporting a large number of languages, and providing interfaces that integrate its products with BI, CRM, ERP, and other enterprise applications. Inxight Software, by contrast, is a notable vendor that, like ClearForest, has devoted significant resources to developing front ends. Inxight's Star Tree, for example, lets you explore network maps via hyperbolic visualization where segment details are enlarged or collapsed as you move the focus from one map node to another. Inxight, like Autonomy, provides back-end categorization and taxonomy management software to other companies including ClearForest and SAS.
SASdo
minates the high-end data analysis market. Its Text Miner incorporates Inxight technology for linguistic analysis and concept extraction but gives the results a statistical spin that can be matched by few other vendors. According to product manager Manya Mayes, Text Miner and the Enterprise Miner data-mining tools are fully integrated, where textual-analysis results become available as structured data for application of a full range of traditional analytic approaches.
Rate This Article
Rating: 1 (best) 2 3 4 5 (worst)
Comments:
Optional e-mail address:

Challenges
Although still in its infancy, text mining promises rapid advances in the scope of applications and in the effectiveness, comprehensiveness, interoperability, and usability of software implementations. The field won't be mature until commercial tools offer closed-loop analytics, that is, actionable results rather than just visualizations, analytics that are well integrated with data mining, and statistical analysis systems that use all an organization's information assets. Although techniques seem fairly well established, maturity will also bring standardized interfaces and input and output formats, extension to a spectrum of rich media in addition to plain text, the scalability to world-size applications, and predictive capabilities. The implementations available show that researchers and vendors are on the right track.

Lucene学习笔记(1)
Lucene学习笔记(1)
  Lucene是一套全文检索的API,对其介绍的文章和应用的案例都多,可参考lucene及本文的参考文献。
  此次学习,以实用为主,一是简单应用,二是Web应用,三是汉化,四相关应用(Lucene主页上在SandBox中)。
0、准备工作
  去Lucene的主页下载目前的稳定版本lucene-1.2.tar.gz,解压缩,将lucene-1.2目录下的两个jar文件lucene-1.2.jar和lucene-demo2-1.2.jar放到适当的目录下后,并将其加入到CLASSPATH环境变量中。
tar zxvf lucene-1.2.tar.gz <----解压缩
cd lucene-1.2
cp *.jar $DP<---存放jar文件的目录,根据具体工作要求用实际目录替换
CLASSPATH=$CLASSPATH:$DP/lucene-1.2.jar:$DP/lucene-demos-1.2.jar;
export CLASSPATH
如果不想在每次都登录后,可以编辑/etc/profile或自己目录下的.profile,将上面的最后一行加到文件的最后一行。Windows的设置,右击桌面的“我的电脑”,选“高级”->“环境变量”->选中CLASSPATH->“编辑”,在输入框中加入两个jar文件的全路径名,注意分隔符是分号(;)。参见下图。
1、运行demo
$ java org.apache.lucene.demo.IndexFiles /usr/local/man/man1/ <--对man文件建立索引
adding /usr/local/man/man1/mysql.1
...........
adding /usr/local/man/man1/cvs.1
1614 total milliseconds
$ java org.apache.lucene.demo.SearchFiles <--进行检索
Query: password
Searching for: password
7 total matchingdo
cuments
0. /usr/local/man/man1/mysql.1
......
6. /usr/local/man/man1/mysqlshow.1
Query:
OK!Lucene自待的demo运行成功
这个demo程序调用的主要API函数:
/*关于索引的主要函数*/
File file=new File(argv[]);
IndexWriter writer = new IndexWriter(&quot;index&quot;, new StandardAnalyzer(), true);
Documentdo
c = newdo
cument();
doc.add(Field.Text(&quot;path&quot;, file.getPath()));
doc.add(Field.Keyword(&quot;modified&quot;,DateField.timeToString(file.lastModified())));
FileInputStream is = new FileInputStream(f);
Reader reader = new BufferedReader(new InputStreamReader(is));
doc.add(Field.Text(&quot;contents&quot;, reader));
writer.addDocument(doc);
writer.optimize();
writer.close();
/*关于检索的主要函数*/
Searcher searcher = new IndexSearcher(&quot;index&quot;);
Analyzer analyzer = new StandardAnalyzer();
Query query = QueryParser.parse(lineforsearch, &quot;contents&quot;, analyzer);
Hits hits = searcher.search(query);
for (int i = start;
i < hits.length();
i++) {
Documentdo
c = hits.doc(i);
String path =do
c.get(&quot;path&quot;);
System.out.println(i + &quot;. &quot;
+ path);
}
3、运行LuceneWeb
  假定tomcat装在$TOMCATHOME目录下,具体应用时用真实的目录替换$TOMCATHOME。
cd $TOMCATHOME/webapps
mkdir lucenedb
cd lucenedb
java org.apache.lucene.demo.IndexHTML -create -index $TOMCAT/webapps/lucenedb ../examples<--用相对路径“..”,一来指明被索引的文件的位置,二来用来显示被索引文件的URL,因为检索的jsp程序在luceneweb子目录下.examples可用其它的真实应用的目录名来替换
cd ..
cp ~/lucene-1.2/luceneweb.war . <--luceneweb.war在你解压缩生成的lucene-1.2目录下
../bin/shudown.sh
../bin/startup.sh
然后通过客户端访问http://yourdomain.com:8080/luceneweb,如果顺利浏览器应出现右边所示的内容。 .
再到服务器端
cd luceneweb
vi configuration.jsp <--将indexLocation 的值改为 &quot;$TOMCATHOME/webapps/lucenedb&quot;;
cd ..
jar -ur luceneweb.war luceneweb
再到客户端,刷新刚才的页面,然后就可以输入单词进行检索了。遗憾的是,此是只能检索英文单词。且如果命中的html页面的title是汉字的话,显示也有问题。如图。

  此处的IndexHTML,可以对htm、html和txt类型的文件进行索引,用的是一个HTMLParser,除此以外与上一例基本相同。
参考文献
1、Lucene FAQ, http://lucene.sourceforge.net/cgi-bin/faq/faqmanager.cgi?file=chapter.indexing&amp;toc=faq#q1
2、Getting Started,http://jakarta.apache.org/lucene/docs/gettingstarted.html
引自 竹笋炒肉
Lucene学习笔记(2)
Lucene学习笔记(2)
  不仅仅在推广和介绍方面,车东在Lucene的汉化及web应用,也作出了极大的极大的贡献。他将自己的汉化和web应用两方面的成果,放在sourceforge上成了开源的项目。下面主要是对这个项目的学习笔记。
  对Lucene的汉化,车东开发了两个Analyzer,一个是二元切分,一个单字切分。利用这两个中的任一个进行分析,都可以进行汉字的索引和检索了。我把这两个Analyzer编译后一起打入到lucene-1.2.jar中了,如果不愿自己动手进行编译这两个Analyzer的朋友,可以从这儿下载。
  有了新的Analyzer,我把IndexFiles、IndexHTML和SearchFiles中的Analyzer也用了新CJKAnalyzer做了替换,并重新编译打了包lucene-demo-1.2.jar,可以从这儿下载。包内带有修改后的三个java文件。
  用上面两个jar文件,分别替换同名的原来的文件,就可以索引和检索汉语了。右面是我做的测试。
Lucene学习笔记(3)
Lucene学习笔记(3)
  继续学习车东利用Lucene提供网站全文检索的开源项目。
  由于文档不全,这次看代码看得很苦,几乎是用log4j一个类一个方法的看过来的。令人高兴的是,期间请教车东时,他说到要重新整理一下整个项目的源代码和文档,估计后来者可以轻松矣。
  除了以前提到的汉化外,车东在这个项目中,加入了很多实用的东东,如反显、排序、摘要等,甚至连网页过期时间、输出格式的限制都考虑到了。
  下面是我的测试页面,大家看看先。等明天我把源代码diff一下,把我做的修改文件也挂上来,供大家参考。


  在车东的简历上,有一个商业检索网址,估计是车东他们的成绩,可以去看看,也帮助理解这个项目的功能。
  下面是运行weblucene需要作得改动和说明。
weblucene/
|-- WEB-INF
| |-- classes
| | `-- com
| | `-- chedong
| | |-- weblucene
| | |-- WebLuceneAdminServlet.java
| | |-- index
| | | `-- SAXIndexer.java
| | `-- search
| | `-- WebLuceneHighlighter.java
| |-- logs <-----这是一个子目录,手工建立后程序运行时log文件在这个目录下。
| `-- var
| `-- app
| |-- index <-----这是一个子目录,手工建立后索引时将索引文件放在这儿。
| |-- weblucene.xsl
| `-- wl.conf
|-- index.html
|-- style.css
`-- test.xml
对SAXIndexer.java的修改
将两行
sb.append(luceneDoc.getField((String) it.next()));
改为两行
sb.append(luceneDoc.get((String) it.next()));
对WebLuceneHighlighter.java的修改
将两处<u>改为<ins>
将两处</u>改为</ins>
对WebLuceneAdminServlet.java可改可不改
建议将
logFileName = servletConfig.getServletContext().getRealPath(&quot;WEB-INF/logs/&quot;)
+ logFileName;
改为
logFileName = servletConfig.getServletContext().getRealPath(&quot;WEB-INF/logs/&quot;)
+ &quot;/&quot;
+ logFileName;

除了三个java程序外,其它文件都可以从这儿下载.
  通过web进行检索前,需要先建立索引,命令如下:
$ java IndexRunner -i tt.xml -o WEB-INF/var/app/index/ -t Title,Content -n Author,Pubtime
  需要再说一句,就是估计车东会很快推出一个崭新的实用性更强的版本,到那时此处可供下载的内容估计都没有用了。:)
引自 竹笋炒肉
Lucene学习笔记(4)将M$Word转为HTML
Lucene学习笔记(4)将M$Word转为HTML
  后面是一些关于Luncene外围的工具,这是其中之一。
  Majix利用jacob,将M$Word转换为xml,进而转换为html.
  试了一下,对英语文档没问题,对汉语的却转换成了乱码,估计是那些地方需要设置一下。
  Majix中用了一个tool叫jade(如果你认为是反编译的那个jad就错了,hehe),是一个DSSSL的实现,可以做XML、RTF、TeX、MIF、SGML的转换。
  Jacob既然是Java与Com之间的桥梁,则可以乐观地预测M$的所有文档,都有可以转换了,至少抽取其内容应该问题不大吧。
  突然感觉很迷惘,让Majix彻底把我搞糊涂了。Majix本身很简单,可其中用了不少XML技术(也叫技术吧),一时搞不清它们之间的关系了。看来,虽然自觉XML比较熟悉了,其实还是欠火侯,抽空再去IBM学习学习了
引自 竹笋炒肉
Lucene学习笔记(5)爬行者LARM
Lucene学习笔记(5)爬行者LARM
  爬行者LARM是一个抓取网页的机器人,用纯Java写就。
  通过作者的叙述,写一个爬行者,远非想象中的那么简单。HTML规范太简单了,所以会出很多标新立异的HTML文件。网络的随机性太强了,说不定就会遇到什么问题。这种种意外,都会考验一个爬行者。
  LARM作为Lucene的子项目,还在开发之中,连个稳定版都没有,只能通过CVS取得。而且文档的说明也不统一,具有开发中的项目的共性。不过,它的随机文档还是把LARM的设想和特点说了,它还有一个wiki页面,不知为什么在sourceforge上还挂了一个名(这儿还有几篇RTF文档)。
  LARM源码中,有一个GUI界面,把我乐坏了,一运行,怎么点击“Start”它也不活动,很郁闷,一看源码,“// todo
: code goes here.”,根本没有对这个点击事件的处理代码。FT!
  如果不考虑它与Lucene的关系,单当作一个爬行者来看,也有一定的使用价值。我下了这个项目,编译运行以后,对http://hedong.3322.org进行抓取,由于没限制域名,一下子到了5500多个域名,在下了300M左右,就把它中断了。
mkdir jakarta
cd jakarta
cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic login
password: anoncvs
cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic checkout jakarta-lucene-sandbox
cd jakarta-lucene-sandbox/contributions/webcrawler-LARM
ant dist
把build/webcrawler_LARM-0.5.jar及libs/目录下的所有jar都加到classpath里去。
java -server de.lanlab.larm.fetcher.FetcherMain -start http://hedong.3322.org
  我把larm及所用的jar文件打了包放在这儿,有兴趣又不原编译的可从这儿下载。
引自 竹笋炒肉

//--------------
使用Lucene建立自己的搜索引擎
使用Lucene建立自己的搜索引擎

lucene是一个极其灵活的开放源代码的搜索引擎。
Lucene会直接同你的Web应用程序集成到一起。它是由Jakarta Apache工作组使用Java编写成的。你的Java应用程序能够将Lucene作为任何搜索功能的核心来使用。Lucene能够处理任何类型的文本数据;但是它没有内置对Word、Excel、PDF和XML的支持。但是还是有一些解决方案能够让Lucene支持它们中的每一个。
关于Lucene的重要一点是,它只是一个搜索引擎,因此没有内置Web图形用户界面和Web crawler。要把Lucene集成到你的Web应用程序里,你就要编写一个显示查询表单的servlet或者JSP页面,还要编写另一个列出结果的页面。
用Lucene来建立一个索引
你应用程序的文本内容由Lucene来索引,并被作为一系列索引文件保存在文件系统里。Lucene能够接受代表单篇内容的文档(Document)对象,例如一个Web页面或者PDF文件。你的应用程序就负责将其内容转变成Lucene能够理解的文档对象。
每个文档都是由有一个或者多个的字段(Field)对象。这些字段包含有一个名称和一个值,非常像散裂图里的一个项目(entry)。每个字段都应该对应一段信息,这段信息是同你需要查询或者显示的检索结果相关的。例如,标题应该被用在搜索结果里,因此它会被作为一个字段添加到文档对象里。这些字段可以被索引,也可以不被索引,而原始的数据也可以选择保存在索引里。保存在索引里的字段在创建检索结果页面的时候会很有用。对于搜索没有用处的字段,例如唯一的ID,就不需要被索引,只需要被保存就行了。
字段也可以是标记化了的(tokenized),这就意味着一个分析程序会将输入到字段里的内容分解成搜索引擎能够使用的标记。Lucene带有多个分析程序,但是我只会使用最强大的分析程序——StandardAnalyzer类。
StandardAnalyzer类会将文本的所有内容变成小写的,并去掉一些常用的停顿词(stop word)。停顿词是像“a”、“the”和“in”这样的词,它们都是内容里非常常见的词,但是对搜索却一点用处都没有。分析程序也会分析搜索查询,这就意味着查询会找到匹配的部分。例如,这段文本“Thedo
g is a golden retriever(这条狗是一只金毛猎犬)”,就会被处理为“dog golden retriever”作为索引。当用户搜索“a Goldendo
g”的时候,分析程序会处理这个查询,并将其转变为“goldendo
g”,这就符合我们的内容了。
我们的例子准备使用数据访问对象(Data Access Object,DAO)的商务对象(business object),前者是Java应用程序开发的一个常见模式。我要使用的DAO——ProductDAO见Listing A。
为了让这个演示程序简单,我不准备使用数据库,DAO也只会包含产品(Product)对象的一个集合。在本例里,我会采用Listing B里的产品对象,并将它们转变成为用于索引的文档。
索引符(Indexer)类在Listing C里,它将负责把Product转换成为Lucene文档,还负责创建Lucene索引。
产品类里的字段是ID名、简短描述和详细描述。通过使用字段(Field)类的UnIndexed方法,ID会被作为一个非索引的非标记字段被保存。通过使用字段类的Keyword方法,名称和简短描述会被作为索引的非标记字段被保存。搜索引擎会对内容字段进行查询,而内容字段里会包含有产品的名称、简短描述和详细描述字段。
在所有的文档都添加完之后,就要优化索引并关闭索引编写器,这样你才能够使用索引。Lucene的大多数实现都要使用增量索引(incremental indexing),在增量索引里,已经在索引里的文档都是独立更新的,而不是每次先删除索引再创建一个新的。
运行查询
创建一个查询并在索引里搜索结果要比创建一个索引简单。你的应用程序会要求使用者提供一个搜索查询,这个查询可以是一个简单的词语。Lucene拥有一些更加高级的查询(Query)类,用于布尔搜索或者整句搜索。
高级查询的一个例子是”Mutual Fund”(互惠基金)AND stock*(股票),它会搜索包含有短语Mutual Fund和以stock开头的词(例如stocks、stock或者甚至是stockings)的文档。
________________________________________
获取更多关于Lucene里查询的信息
Lucene Web网站里的句法页面会提供更加详细的信息。
________________________________________
搜索符(Searcher)类放在Listing D里,它负责在Lucene索引里查找你所使用的词语。对于本篇演示程序而言,我使用了一个简单的查询,它只是一个字符串,而没有使用任何高级查询功能。我用QueryParser类从查询字符串里创建了一个查询(Query)对象,QueryParser这个类会使用StandardAnalyzer类将查询字符串分解成标记,再去掉停顿词,然后将这个字符串转换成小写的。
这个查询被传递给一个IndexSearcher对象。IndexSearcher会在索引的文件系统里被初始化。IndexSearcher的搜索方法将接受这个查询并返回一个命中(Hits)对象。这个命中对象包含有作为Lucene文档对象的检索结果,以及结果的长度。使用命中对象的Doc方法将取回命中对象里的每个文档。
文档对象包含有我添加到索引符文档里的字段。这些字段中的一些被保存了,但是没有被标记化,你可以将它们从文档里提取出来。示例应用程序会用搜索引擎运行一个查询,然后显示它所找到的产品名称。
________________________________________
运行演示程序
要运行本文里的示例程序,你需要从Lucene的Web网站下载最新版本的Lucene二进制发布版本(binary distribution)。Lucene发行版的lucene-1.3-rc1.jar文件需要被添加到你Java类的路径下才能够运行这个演示程序。演示程序会在运行com.greenninja.lucene.Demo类的目录下创建一个叫做index的索引目录。你还需要安装好JDK。一行典型的命令是:java -cp c:/java/lucene-1.3-rc1/lucene-1.3-rc1.jar;. com.greenninja.lucene.Demo(见图A)。本例所使用的示例数据包含在ProductDAO类里。这个查询是演示(Demo)类的一部分。
________________________________________
图A


命令行示例

//===================================================
基于JAVA的全文索引引擎Lucene简介(上)
作者: 车东
Wednesday, August 14 2002 12:15 PM
摘要:Lucene是一个基于JAVA的全文索引工具包。
1. 基于JAVA的全文索引引擎Lucene简介:关于作者和Lucene的历史
2. 全文检索的实现:Luene全文索引和数据库索引的比较
基于JAVA的全文索引/检索引擎——Lucene
Lucene不是一个完整的全文索引应用,而是是一个用JAVA写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。
Lucene的作者:Lucene的贡献者Doug Cutting是一位资深全文索引/检索专家,曾经是V-Twin搜索引擎(Apple的Copland操作系统的成就之一)的主要开发者,后在Excite担任高级系统架构设计师,目前从事于一些INTERNET底层架构的研究。他贡献出的Lucene的目标是为各种中小型应用程序加入全文检索功能。
Lucene的发展历程:早先发布在作者自己的http://www.lucene.com/,后来宿主在SOURCEFORGE,2001年年底成为APACHE基金会jakarta的一个子项目:http://jakarta.apache.org/Lucene/
基于Lucene的应用:
已经有很多JAVA项目都使用了Lucene作为其后台的全文索引引擎,比较著名的有:
&amp;#8226; JIVE:WEB论坛系统;
&amp;#8226; Eyebrows:邮件列表HTML归档/浏览/查询系统,本文的主要参考文档“The Lucene search engine: Powerful, flexible, and free”作者就是EyeBrows系统的主要开发者之一,而EyeBrows已经成为目前APACHE项目的主要邮件列表归档系统。
&amp;#8226; Cocoon: 基于XML的web发布框架,全文检索部分使用了LUCENE
对于中文用户来说,最关心的问题是其是否支持中文的全文检索。但通过后面对于Lucene的结构的介绍,你会了解到由于Lucene良好架构设计,只需一些简单的接口扩展就能实现对中文检索的支持。
全文检索的实现机制
Lucene的API接口设计的比较通用,输入输出结构都很像数据库的表==>记录==>字段,所以很多传统的应用的文件、数据库等都可以比较方便的映射到Lucene的存储结构/接口中。总体上看:可以先把Lucene当成一个支持全文索引的数据库系统。
比较一下Lucene和数据库:


全文检索 ≠ like &quot;%keyword%&quot;
通常比较厚的书籍后面常常附关键词索引表(比如:北京:12, 34页, 上海:3, 77页……),它能够帮助读者比较快地找到相关内容的页码。而数据库索引能够大大提高查询的速度原理也是一样,想像一下通过书后面的索引查找的速度要比一页一页地翻内容高多少倍……而索引之所以效率高,另外一个原因是它是排好序的。对于检索系统来说核心是一个排序问题。
由于数据库索引不是为全文索引设计的,因此,使用like &quot;%keyword%&quot;时,数据库索引是不起作用的,在使用like查询时,搜索过程又变成类似于一页页翻书的遍历过程了,所以对于含有模糊查询的数据库服务来说,LIKE对性能的危害是极大的。如果是需要对多个关键词进行模糊匹配:like &quot;%keyword1%&quot;
and like &quot;%keyword2%&quot;
...其效率也就可想而知了。
所以建立一个高效检索系统的关键是建立一个类似于科技索引一样的反向索引机制,将数据源(比如多篇文章)排序顺序存储的同时,有另外一个排好序的关键词列表,用于存储关键词==>文章映射关系,利用这样的映射关系索引:[关键词==>出现关键词的文章编号,出现次数(甚至包括位置:起始偏移量,结束偏移量),出现频率],检索过程就是把模糊查询变成多个可以利用索引的精确查询的逻辑组合的过程。从而大大提高了多关键词查询的效率,所以,全文检索问题归结到最后是一个排序问题。
由此可以看出模糊查询相对数据库的精确查询是一个非常不确定的问题,这也是大部分数据库对全文检索支持有限的原因。Lucene最核心的特征是通过特殊的索引结构实现了传统数据库不擅长的全文索引机制,并提供了扩展接口,以方便针对不同应用的定制。
可以通过一下表格对比一下数据库的模糊查询:
  Lucene全文索引引擎 数据库
索引 将数据源中的数据都通过全文索引一一建立反向索引 对于LIKE 查询来说,数据传统的索引是根本用不上的。数据需要逐个便利记录进行GREP式的模糊匹配,比有索引的搜索速度要有多个数量级的下降。
匹配效果 通过词元(term)进行匹配,通过语言分析接口的实现,可以实现对中文等非英语的支持。 使用:like &quot;%net%&quot;
会把netherlands也匹配出来,
多个关键词的模糊匹配:使用like &quot;%com%net%&quot;:就不能匹配词序颠倒的xxx.net..xxx.com
匹配度 有匹配度算法,将匹配程度(相似度)比较高的结果排在前面。 没有匹配程度的控制:比如有记录中net出现5词和出现1次的,结果是一样的。
结果输出 通过特别的算法,将最匹配度最高的头100条结果输出,结果集是缓冲式的小批量读取的。 返回所有的结果集,在匹配条目非常多的时候(比如上万条)需要大量的内存存放这些临时结果集。
可定制性 通过不同的语言分析接口实现,可以方便的定制出符合应用需要的索引规则(包括对中文的支持) 没有接口或接口复杂,无法定制
结论 高负载的模糊查询应用,需要负责的模糊查询的规则,索引的资料量比较大 使用率低,模糊匹配规则简单或者需要模糊查询的资料量少
Lucene的创新之处:
大部分的搜索(数据库)引擎都是用B树结构来维护索引,索引的更新会导致大量的IO操作,Lucene在实现中,对此稍微有所改进:不是维护一个索引文件,而是在扩展索引的时候不断创建新的索引文件,然后定期的把这些新的小索引文件合并到原先的大索引中(针对不同的更新策略,批次的大小可以调整),这样在不影响检索的效率的前提下,提高了索引的效率。
Lucene和其他一些全文检索系统/应用的比较:
  Lucene 其他开源全文检索系统
增量索引和批量索引 可以进行增量的索引(Append),可以对于大量数据进行批量索引,并且接口设计用于优化批量索引和小批量的增量索引。 很多系统只支持批量的索引,有时数据源有一点增加也需要重建索引。
数据源 Lucene没有定义具体的数据源,而是一个文档的结构,因此可以非常灵活的适应各种应用(只要前端有合适的转换器把数据源转换成相应结构), 很多系统只针对网页,缺乏其他格式文档的灵活性。
内容分割 Lucene的文档是由多个字段组成的,甚至可以控制那些字段需要索引,
那些字段不需要索引,近一步索引的字段也分:
需要进行分词的索引,比如:标题,文章内容字段
不需要进行分词的索引,比如:作者/日期字段 缺乏通用性,往往将文档整个索引了
语言分析 通过语言分析器的不同扩展实现:
可以过滤掉不需要的词:an the of 等,
西文语法分析:将jumps jumped jumper都归结成jump进行索引/检索
非英文支持:对亚洲语言,阿拉伯语言的索引支持 缺乏通用接口实现
查询分析 通过查询分析接口的实现,可以定制自己的查询语法规则:
比如: 多个关键词之间的 + - and or关系等  
并发访问 能够支持多用户的使用  
 
//=============================================
基于JAVA的全文索引引擎Lucene简介(中)
简介:Lucene是一个基于JAVA的全文索引工具包。
1. 中文切分词机制简介:基于词库和自动切分词算法的比较
2. 具体的安装和使用简介:系统结构介绍和演示
关于亚洲语言的的切分词问题(Word Segment)
对于中文来说,全文索引首先还要解决一个语言分析的问题,对于英文来说,语句中单词之间是天然通过空格分开的,但亚洲语言的中日韩文语句中的字是一个字挨一个,所有,首先要把语句中按“词”进行索引的话,这个词如何切分出来就是一个很大的问题。
首先,肯定不能用单个字符作(si-gram)为索引单元,否则查“上海”时,不能让含有“海上”也匹配。
但一句话:“北京天安门”,计算机如何按照中文的语言习惯进行切分呢?
“北京 天安门” 还是“北 京 天安 门”?让计算机能够按照语言习惯进行切分,往往需要机器有一个比较丰富的词库才能够比较准确的识别出语句中的单词。
另外一个解决的办法是采用自动切分算法:将单词按照2元语法(bigram)方式切分出来,比如:
&quot;北京天安门&quot;
==> &quot;北京 京天 天安 安门&quot;。
这样,在查询的时候,无论是查询&quot;北京&quot;
还是查询&quot;天安门&quot;,将查询词组按同样的规则进行切分:&quot;北京&quot;,&quot;天安 安门&quot;,多个关键词之间按与&quot;and&quot;的关系组合,同样能够正确地映射到相应的索引中。这种方式对于其他亚洲语言:韩文,日文都是通用的。
基于自动切分的最大优点是没有词表维护成本,实现简单,缺点是索引效率低,但对于中小型应用来说,基于2元语法的切分还是够用的。
自动切分 词表切分
实现 实现非常简单 实现复杂
查询 增加了查询分析的复杂程度, 适于实现比较复杂的查询语法规则
存储效率 索引冗余大,索引几乎和原文一样大 索引效率高,为原文大小的30%左右
维护成本 无词表维护成本 词表维护成本非常高:中日韩等语言需要分别维护。
还需要包括词频统计等内容
适用领域 嵌入式系统:运行环境资源有限
分布式系统:无词表同步问题
多语言环境:无词表维护成本 对查询和存储效率要求高的专业搜索引擎
目前比较大的搜索引擎的语言分析算法一般是基于以上2个机制的结合。关于中文的语言分析算法,大家可以在GOOGLE查关键词&quot;word segment search&quot;能找到更多相关的资料。
安装和使用
下载:http://jakarta.apache.org/Lucene/
注意:Lucene中的一些比较复杂的词法分析是用JavaCC生成的(JavaCC:Java Compiler Compiler,纯JAVA的词法分析生成器),所以如果从源代码编译或需要修改其中的QueryParser、定制自己的词法分析器,还需要从http://www.webgain.com/products/java_cc/下载javacc。
lucene的组成结构:对于外部应用来说索引模块(index)和检索模块(search)是主要的外部应用入口
org.apache.Lucene.search/ 搜索入口
org.apache.Lucene.index/ 索引入口
org.apache.Lucene.analysis/ 语言分析器
org.apache.Lucene.queryParser/ 查询分析器
org.apache.Lucene.document/ 存储结构
org.apache.Lucene.store/ 底层IO/存储结构
org.apache.Lucene.util/ 一些公用的数据结构
简单的例子演示一下Lucene的使用方法:
索引过程:从命令行读取文件名(多个),将文件分路径(path字段)和内容(body字段)2个字段进行存储,并对内容进行全文索引:索引的单位是Document对象,每个Document对象包含多个字段Field对象,针对不同的字段属性和数据输出的需求,对字段还可以选择不同的索引/存储字段规则,列表如下:
方法 切词 索引 存储 用途
Field.Text(String name, String value) Yes Yes Yes 切分词索引并存储,比如:标题,内容字段
Field.Text(String name, Reader value) Yes Yes No 切分词索引不存储,比如:META信息,
不用于返回显示,但需要进行检索内容
Field.Keyword(String name, String value) No Yes Yes 不切分索引并存储,比如:日期字段
Field.UnIndexed(String name, String value) No No Yes 不索引,只存储,比如:文件路径
Field.UnStored(String name, String value) Yes Yes No 只全文索引,不存储
public class IndexFiles {
//使用方法:: IndexFiles [索引输出目录] [索引的文件列表] ...
public static void main(String[] args) throws Exception {
String indexPath = args[0];
IndexWriter writer;
//用指定的语言分析器构造一个新的写索引器(第3个参数表示是否为追加索引)
writer = new IndexWriter(indexPath, new SimpleAnalyzer(), false);
for (int i=1;
i<args.length;
i++) {
System.out.println(&quot;Indexing file &quot;
+ args);
InputStream is = new FileInputStream(args);
//构造包含2个字段Field的Document对象
//一个是路径path字段,不索引,只存储
//一个是内容body字段,进行全文索引,并存储
do
cumentdo
c = newdo
cument();
do
c.add(Field.UnIndexed(&quot;path&quot;, args));
do
c.add(Field.Text(&quot;body&quot;, (Reader) new InputStreamReader(is)));
//将文档写入索引
writer.addDocument(doc);
is.close();
};
//关闭写索引器
writer.close();
}
}
索引过程中可以看到:
&amp;#8226; 语言分析器提供了抽象的接口,因此语言分析(Analyser)是可以定制的,虽然lucene缺省提供了2个比较通用的分析器SimpleAnalyser和StandardAnalyser,这2个分析器缺省都不支持中文,所以要加入对中文语言的切分规则,需要修改这2个分析器。
&amp;#8226; Lucene并没有规定数据源的格式,而只提供了一个通用的结构(Document对象)来接受索引的输入,因此输入的数据源可以是:数据库,WORD文档,PDF文档,HTML文档……只要能够设计相应的解析转换器将数据源构造成成Docuement对象即可进行索引。
&amp;#8226; 对于大批量的数据索引,还可以通过调整IndexerWrite的文件合并频率属性(mergeFactor)来提高批量索引的效率。
检索过程和结果显示:
搜索结果返回的是Hits对象,可以通过它再访问Document==>Field中的内容。
假设根据body字段进行全文检索,可以将查询结果的path字段和相应查询的匹配度(score)打印出来,
public class Search {
public static void main(String[] args) throws Exception {
String indexPath = args[0], queryString = args[1];
//指向索引目录的搜索器
Searcher searcher = new IndexSearcher(indexPath);
//查询解析器:使用和索引同样的语言分析器
Query query = QueryParser.parse(queryString, &quot;body&quot;,
new SimpleAnalyzer());
//搜索结果使用Hits存储
Hits hits = searcher.search(query);
//通过hits可以访问到相应字段的数据和查询的匹配度
for (int i=0;
i<hits.length();
i++) {
System.out.println(hits.doc(i).get(&quot;path&quot;) + &quot;;
Score: &quot;
+
hits.score(i));
};
}
}
在整个检索过程中,语言分析器,查询分析器,甚至搜索器(Searcher)都是提供了抽象的接口,可以根据需要进行定制。
//====================================================
基于JAVA的全文索引引擎Lucene简介(下)
摘要:Lucene是一个基于JAVA的全文索引工具包。
1. Hacking Lucene:简化的查询分析器,删除的实现,定制的排序,应用接口的扩展
2. 从Lucene我们还可以学到什么
Hacking Lucene
简化的查询分析器
个人感觉lucene成为JAKARTA项目后,画在了太多的时间用于调试日趋复杂QueryParser,而其中大部分是大多数用户并不很熟悉的,目前LUCENE支持的语法:
Query ::= ( Clause )*
Clause ::= [&quot;+&quot;, &quot;-&quot;] [<TERM> &quot;:&quot;] ( <TERM> | &quot;(&quot;
Query &quot;)&quot;
)
中间的逻辑包括:and or + - &amp;&amp;
||等符号,而且还有&quot;短语查询&quot;和针对西文的前缀/模糊查询等,个人感觉对于一般应用来说,这些功能有一些华而不实,其实能够实现目前类似于GOOGLE的查询语句分析功能其实对于大多数用户来说已经够了。所以,Lucene早期版本的QueryParser仍是比较好的选择。
添加修改删除指定记录(Document)
Lucene提供了索引的扩展机制,因此索引的动态扩展应该是没有问题的,而指定记录的修改也似乎只能通过记录的删除,然后重新加入实现。如何删除指定的记录呢?删除的方法也很简单,只是需要在索引时根据数据源中的记录ID专门另建索引,然后利用IndexReader.delete(Term term)方法通过这个记录ID删除相应的Document。
根据某个字段值的排序功能
lucene缺省是按照自己的相关度算法(score)进行结果排序的,但能够根据其他字段进行结果排序是一个在LUCENE的开发邮件列表中经常提到的问题,很多原先基于数据库应用都需要除了基于匹配度(score)以外的排序功能。而从全文检索的原理我们可以了解到,任何不基于索引的搜索过程效率都会导致效率非常的低,如果基于其他字段的排序需要在搜索过程中访问存储字段,速度回大大降低,因此非常是不可取的。
但这里也有一个折中的解决方法:在搜索过程中能够影响排序结果的只有索引中已经存储的docID和score这2个参数,所以,基于score以外的排序,其实可以通过将数据源预先排好序,然后根据docID进行排序来实现。这样就避免了在LUCENE搜索结果外对结果再次进行排序和在搜索过程中访问不在索引中的某个字段值。
这里需要修改的是IndexSearcher中的HitCollector过程:
...
 scorer.score(new HitCollector() {
private float minScore = 0.0f;
public final void collect(intdo
c, float score) {
if (score > 0.0f &amp;&amp; // ignore zeroed buckets
(bits==null || bits.get(doc))) { // skipdo
cs not in bits
totalHits[0]++;
if (score >= minScore) {
/* 原先:Lucene将docID和相应的匹配度score例入结果命中列表中:
* hq.put(new ScoreDoc(doc, score)); // update hit queue
* 如果用doc 或 1/doc 代替 score,就实现了根据docID顺排或逆排
* 假设数据源索引时已经按照某个字段排好了序,而结果根据docID排序也就实现了
* 针对某个字段的排序,甚至可以实现更复杂的score和docID的拟合。
*/
hq.put(new ScoreDoc(doc, (float) 1/doc ));
if (hq.size() > nDocs) { // if hit queue overfull
hq.pop(); // remove lowest in hit queue
minScore = ((ScoreDoc)hq.top()).score;
// reset minScore
}
}
}
}
}, reader.maxDoc());
更通用的输入输出接口
虽然lucene没有定义一个确定的输入文档格式,但越来越多的人想到使用一个标准的中间格式作为Lucene的数据导入接口,然后其他数据,比如PDF只需要通过解析器转换成标准的中间格式就可以进行数据索引了。这个中间格式主要以XML为主,类似实现已经不下4,5个:
数据源: WORD PDF HTML DB
/ | | | /
XML中间格式
|
Lucene INDEX
从Lucene学到更多
Luene的确是一个面对对象设计的典范
&amp;#8226; 所有的问题都通过一个额外抽象层来方便以后的扩展和重用:你可以通过重新实现来达到自己的目的,而对其他模块而不需要;
&amp;#8226; 简单的应用入口Searcher, Indexer,并调用底层一系列组件协同的完成搜索任务;
&amp;#8226; 所有的对象的任务都非常专一:比如搜索过程:QueryParser分析将查询语句转换成一系列的精确查询的组合(Query), 通过底层的索引读取结构IndexReader进行索引的读取,并用相应的打分器给搜索结果进行打分/排序等。最后只将最前面的头100条结果放到结果集缓存中,知道有需要读取更后面的结果时。由于所有的功能模块原子化程度非常高,因此可以通过重新实现而不需要修改其他程序。
&amp;#8226; 除了灵活的应用接口设计,Lucene还提供了一些适合大多数应用的语言分析器实现(SimpleAnalyser, StandardAnalyser),这也是新用户能够很快上手的重要原因之一。
这些优点都是非常值得在以后的开发中学习借鉴的。作为一个通用工具库,Lunece的确给予了需要将全文检索功能嵌入到应用中的开发者很多的便利。
参考资料:
Apache: Lucene Project
http://jakarta.apache.org/Lucene/
Lucene邮件列表归档
Lucenehttp://nagoya.apache.org/eyebrowse/SummarizeList?listId=29
http://nagoya.apache.org/eyebrowse/SummarizeList?listId=30
The Lucene search engine: Powerful, flexible, and free
http://www.javaworld.com/javaworld/jw-09-2000/jw-0915-Lucene_p.html
中文语言的切分词
Lucene Tutorial
http://www.darksleep.com/puff/lucene/lucene.html
Notes on distributed searching with Lucene
http://home.clara.net/markharwood/lucene/
搜索引擎工具介绍
http://searchtools.com/
搜索引擎行业研究
http://www.searchenginewatch.com/

//+++++++++++++++++++++++++++++++++++++++++++++
全文检索概述
网站中,有大量的被反复利用的有价值信息,如何科学高效地去管理这些信息,使它们在最短的时间内最大限度地发挥其价值,是每一个网站面临的问题。
网站全文检索系统就是将用户的网站内容由系统自动地添加到检索引擎(数据库)中,这样,网站的访问者就可以用关键词方式查询网站中任何他关心的内容而不需繁琐的人工查找。
传统的信息管理的方式是采用以纸张为载体的信息分类管理,容量小,保存难。随着计算机产业的发展,以计算机存储设备为载体的电子文档随即出现,但是,人们仍然沿用传统的分类管理的方式来管理这些电子文档,或者根本就没有任何管理手段,这样就无法将这些信息有效的管理和利用,造成了信息巨大的浪费。全文检索的出现,将彻底改变传统的信息处理的模式。全文检索的基本原理就是以各类数据诸如文字、声音、图象等为处理对象,提供按照数据资料的内容而不是外在特征来实现信息的检索。它能提供快捷的数据管理工具和强大的数据查询手段,通过快捷的数据管理工具,能快速帮助人们进行文档资料的整理和管理工作,强大的数据查询手段,使人们能很方便地查到他们想要的任何信息。对于网站比较庞大、网页数目比较多、内容丰富的企业来讲,网站全文检索可以提供有效的查询手段,来增强网站的吸引力,方便访问者快速有效地找到自己感兴趣的信息。
全文检索实现了网站的数据库管理模式,使网站由静态响应转变为智能化动态响应,极大地提高了网站的应用水平。 全文检索系统能为您做什么?
&amp;#8226;
每天自动将新发布的网页内容增加到全文索引数据库中,每个访问网站的用户可以在第一时间内检索到您发布到网站的信息。
&amp;#8226;
将您单位有价值的信息在Internet/Intranet网上发布。
&amp;#8226;
您单位或个人的站点信息较多,可方便上网查找所需信息者进行站内检索。
&amp;#8226;
如果您是Internet内容供应商(ICP),可为您的用户提供更方便的信息查询手段。
&amp;#8226;
如果您是Internet服务提供商(ISP),可帮助您为用户提供更完美的服务,以增强您的竞争力。WebSearch全文检索系统组成模块
&amp;#8226;
全文数据库服务器 核心技术为中英文全文检索,以卓越的性能和多种强大的功能为各种格式文档的存储、管理和检索提供原动力。
&amp;#8226;
站点检索工具 为Web站点提供该站点网页的全文检索功能,由Web模块和全文数据库服务器组成。Web模块为最终用户的使用提供简单易用的操作界面。可自动定期搜索网站,自动根据网站内容更新索引。
&amp;#8226;
网页抓取工具 可通过&quot;智能机器人&quot;从互联网上成批或有选择的收集用户感兴趣的信息,能够抓取文本、图像、多媒体文件和各种格式化文档。拥有灵活的抓取控制策略,如控制抓取层次等。高效率和高可靠性的抓取,能跳过无效链接。自动化程度高,能自动启动Spider搜索功能的时间,以及重复搜索的时间间隔。操作非常简单便捷。
&amp;#8226;
与WebBuilder内容管理和发布系统的集成 可方便地按各种设置将数据库中的数据自动生成HTML文件,加载到Web服务器上,并可按设定的时间每天自动进行,不需人工干预。可自动根据数据库字段的取值生成导航页面和相关静态网页。为构造电子化媒体网站而专门设计,主要完成网上特定站点信息的采集和整理,分为数据采集和数据加工两部分。所有的操作可以通过浏览器完成。根据用户的分类标准把用户的资料按层次分门别类地组织在一起,生成静态索引页面,便于用户按目录浏览的方式定位所需信息。
&amp;#8226;
搜索引擎构造工具 由GetSite网页抓取模块、可以与WebBuilder内容管理和发布系统进行集成,与全文数据库服务器等集成。该工具可以为门户网站定制他们特有的专业搜索引擎或通用搜索引擎。 WebSearch全文检索系统突出特点
&amp;#8226;
查询速度快 基于全文检索技术检索网页的信息,比传统的数据库检索技术和直接检索网页的内容要快,降低了对检索服务器的硬件要求并提高了响应速度。
&amp;#8226;
智能化高查准率、查全率 实现了以自然语言处理技术为核心内容的智能中文分词技术,能够满足查全率和查准率的要求。
&amp;#8226;
查询手段丰富 支持各种逻辑运算(如AND、OR、NOT等),支持西文检索和中西文混合检索、词频运算和按时间或相关性(重要性)排序,等等。
&amp;#8226;
新网页自动入库 由WebBuilder系统生成的网页将自动进入全文索引数据库,无需用户进行任何干预。
&amp;#8226;
多平台支持 支持多种硬件平台(如小型机、工作站、服务器、PC机等)和多种操作系统(如Linux、Sun Solaris、Windows /NT/2000等)。
&amp;#8226;
多语言支持 支持简体中文(GB2312、GBK)、繁体中文(BIG5)、英文和Unicode,并能够在不同的编码之间转换。
&amp;#8226;
高开放性 可透明地连接Oracle、SQL Server、DB2、Informix、Sybase等主流的关系数据库管理系统。
&amp;#8226;
其它优秀特点 如简便的安装、便捷的用户管理,等等。
//+++++++++++++++++++++
WWW上信息检索概述--信息检索原理和技术
WWW上信息检索概述 ̄
——— 信息检索原理和技术
海南大学 徐华 (99714049)
摘要  计算机处理的数据量不断地呈指数增长,随着数据信息库积累的数据和主题越来越多,怎样快速、有效、经济地检索某个主题的所有信息,就成了一个十分热门的课题。解决这一难题的方法之一是采用智能搜索技术。本文中给出了自然语言处理的结构梗概,以及最终有助于网络用户查找信息的检索技术。
关键词 信息检索 模型和系统结构 搜索引擎 作用与特点
1 查找信息
  信息检索主要研究信息的表示、存储、组织和访问。即根据用户的查询要求,从信息数据库中检索出与之相关的信息资料。信息检索已从手工建立关键字索引,发展到计算机自动索引的全文信息检索、自动信息文摘、自动信息分类,并正朝着自然语言处理的方向发展。在信息检索领域,英语信息检索的发展较为迅速。英语信息检索系统,可以利用向量空间表示检索信息内容,并将自然语言处理应用于信息检索,大大提高了信息查询的准确性。(过程如附图)中文信息检索系统的发展相对较慢,目前已有的中文检索系统绝大部分仍为关键词检索,甚至许多系统还处于“字”索引阶段。不仅效率较低,而且信息检索的精度和准确性很差。究其原因,是因为中文信息检索有自身的特点,比如中文语词之间没有空格,因此在索引前需要进行语词切分。另一方面,与英语相比,汉语句法分析和语义理解更为困难,造成中文信息检索的发展较为缓慢。
2 信息检索模型
  信息检索系统的核心是搜索引擎,它需要从纷繁复杂的大量信息中,筛选出符合用户需求的信息。例如,用户希望从信息库中查询有关计算机网络产品销售方面的信息,如果查询出的结果为计算机软件产品方面的信息,则不能满足用户的需求。根据搜索引擎查找相关信息方式的不同,可将信息检索分为:布尔逻辑模型、模糊逻辑模型、向量空间模型以及概率模型等。
  布尔型信息检索模型,是最简单的信息检索模型,用户可以根据检索项在文档中的布尔逻辑关系提交查询,搜索引擎根据事先建立的倒排文件结构,确定查询结果。标准布尔逻辑模型为二元逻辑,所搜索的文档要么与查询相关,要么与查询无关。查询结果一般不进行相关性排序。如查询“计算机”,只要文档中出现关键词“计算机”,则全部包含在查询结果中。为了克服布尔型信息检索模型查询结果的无序性,在查询结果处理中引进了模糊逻辑运算,将所检索的数据库文档信息与用户的查询要求进行模糊逻辑比较,按照相关的优先次序排列查询结果。例如,查询“计算机”,那么出现“计算机”较多的文档将排列在较前的位置。
  与布尔型信息检索模型不同,向量空间模型用检索项的向量空间来表示用户的查询要求和数据库文档信息。根据向量空间的相似性,排列查询结果。向量空间模型不仅可方便地产生有效的查询结果,而且能提供相关文档的文摘,并进行查询结果分类,为用户提供准确定位所需的信息。
  基于贝叶斯概率论原理的概率模型不同于布尔和向量空间模型,它利用相关反馈的归纳学习方法,获取匹配函数。
  虽然不同检索模型使用的方法不同,但所要达到的目标是相同的,既按照用户要求,提供用户所需的信息。实际上,大多数检索系统往往将上述各种模型混合在一起,以达到最佳的检索效果。
3 信息检索系统结构
搜索引擎构成信息检索系统的核心。然而,信息检索系统还包括对索引信息文档格式的预处理、索引信息的分析、信息索引和用户信息检索等几个阶段。
3.1 信息预处理 
 信息预处理包括信息格式转换和过滤两个不同层次。信关作为访问不同信息的机构,能够访问不同组织形式的数据信息,如各种数据库、不同文件系统以及网络Web页面等。同时,信息预处理也能够过滤不同格式的文档。如Microsoft Word、WPS、Text和 HTML等。这使得搜索引擎不仅能够检索正文文档,而且能够检索原始格式的文档信息。
3.2 信息索引
  信息索引就是创建文档信息的特征记录,它使用户能很容易地检索到所需信息。建立索引需要进行下列处理:
3.2.1 信息语词切分和语词词法分析
  语词是信息表达的最小单位,而汉语不同于西方语言,其句子的语词间没有分隔符(空格),因此需要进行语词切分。汉语语词切分中存在切分歧异,如句子“使用户满意”可切分为“使/用户/满意”,也可能被错误地切分为“使用/户/满意”。因而需要利用各种上下文知识解决语词切分歧异。此外,还需要对语词进行词法分析,识别出各个语词的词干,以便根据词干建立信息索引。
3.2.2 进行词性标注及相关的自然语言处理
  在切分的基础上,利用基于规则和统计(马尔科夫链)的方法进行词性标注。基于马尔科夫链随机过程的n元语法统计分析方法,被证明在词性标注中能达到较高的精度。在此基础上,还要利用各种语法规则,识别出重要的短语结构。
3.2.3 建立检索项索引
  一般使用倒排文件的方式建立检索项相关信息,如表1所示。相关信息一般包括“检索项”、“检索项所在文件位置信息”以及“检索项权重”。例如,检索项“计算机”的位置信息为“文档D中第n段第m句第w词”。这样,在信息检索时,用户可以要求在查询中,检索项T1和检索项T2位于同一语句或同一段落中。检索项索引的建立准则是要易于文档信息的更新处理。
表1: 典型倒排检索项列表
TERM1do
Ci, WTi1;
DOCj, WTj1;
_ ;DOCm, WTm1
TERM2do
Ci, WTi2;
DOCk, WTk2;
_ ;DOCn, WTn2
TERMsdo
Cj, WTjs;
DOCm, WTms;
_ ;DOCp, WTps
3.3 查询扩展处理
  信息检索评价的标准是信息检索的精度和召回率。信息检索的精度为检索结果中相关信息文档数与查询结果总数之比。信息检索的召回率为实际检索出的相关信息文档数与信息库中总的相关信息文档数之比。
  为了提高信息检索的召回率,需要进行查询扩展处理。这种处理根据同义词词典和语义蕴涵词典扩展查询检索项。同义词扩展,如“计算机”和“电脑”指同一概念;因而查询“计算机”同时也要查询“电脑”,反之亦然。主题蕴涵扩展是指不但要查询检索词,而且还要查询其中所包含的子概念。比如,主题词“艺术”包括“电影”、“舞蹈”、“绘画”等等。“电影”又包括“故事片”、“记录片”等。因此,查询“艺术”当然包括“电影”、“舞蹈”、“绘画”以及其下的子概念。
  提高信息检索的精度,可利用向量空间模型实行相关查询反馈处理。即用户从初次查询的结果中,选择内容重要的文档或文档片断,让搜索引擎依据所选文档的特征,重新进行查询,从而提高查询精度。
3.4 信息分类和摘要
  为了方便用户从查询结果中选择所需信息,搜索引擎可将提供给用户的文档信息按照文档内容进行分类,并为每一篇文档产生简短摘要。
  搜索引擎根据文本检索项的统计特征,对查询结果进行分类和摘要。例如,用户查询检索项“计算机”,相应的结果分类也许为“分类1”:“网络”、“系统”、“路由器”等;“分类2”:“市场”、“产品”、“销售”等;以及其它分类。分类的目的是便于用户找到相关信息。
3.5 智能代理
搜索引擎除了被动搜索外,也可利用智能代理技术进行主动信息检索。信息检索系统智能用户代理,可根据用户事先定义的信息检索要求,在网络上实时监视信息源,如指定Web页面的更新、网络新闻、电子邮件、数据库信息变化等。并将用户所需的信息,通过电子邮件或其它方式,主动提供给用户。用户无须反复搜索所需信息,这样将大大减少用户检索信息的时间。
 目前,商用信息检索系统主要以布尔模糊逻辑加向量空间模型为主,辅以部分自然语言处理。自然语言处理,特别是自然语言理解在信息检索中应用,将大大提高信息检索的精度和相关性。
4 搜索引擎的主要作用及工作过程
  搜索引擎是Internet上的一个网站,它的主要任务是在Internet上主动搜索Web服务器信息并将其自动索引,其索引内容存储于可供查询的大型数据库中。当用户输入关键字(Keyword)查询时,该网站会告诉用户包含该关键字信息的所有网址,并提供通向该网站的链接。
  对于各种搜索引擎,它们的工作过程基本一样,包括以下三个方面:
  4.1. 派出“网页搜索程序”在网上搜寻所有信息,并将它们带回搜索引擎每个搜索引擎都派出绰号为“蜘蛛(Spider)”或“机器人(robots)”的网页搜索软件在各网址中爬行,访问网络中公开区域的每一个站点并记录其网址,从而创建出一个详尽的网络目录。各搜索引擎工作的最初步骤大致都是如此。
  4.2.将信息进行分类整理,建立搜索引擎数据库
  在进行信息分类整理阶段,不同的系统会在搜索结果的数量和质量上产生明显的不同。有的系统是把“网页搜索软件&quot;发往每一个站点,记录下每一页的所有文本内容;其他系统则首先分析数据库中的地址,以判别哪些站点最受欢迎(一般都是通过测定该站点的链接数量),然后再用软件记录这些站点的信息。记录的信息包括从HTML标题到整个站点所有文本内容以及经过算法处理后的摘要。当然,最重要的是数据库的内容必须经常更新、重建,以保持与信息世界的同步发展。
  4.3.通过Web服务器端软件,为用户提供浏览器界面下的信息查询
  每个搜索引擎都提供了一个良好的界面,并具有帮助功能。用户只要把想要查找的关键字或短语输入查询栏中,并按“Search”按钮(或其他类似的按钮)。搜索引擎就会根据用户输入的提问,在索引中查找相应的词语,并进行必要的逻辑运算,最后给出查询的命中结果(均为超文本链形式)。用户只需通过搜索引擎提供的链接,马上就可以访问到相关信息。有些搜索引擎将搜索的范围进行了分类,查找可以在用户指定的类别中进行,这样可以提高查询效率,搜索结果的“命中率”较高,从而节省了搜寻时间。
5 优秀搜索引擎的特点
  目前各种各样的中西文搜索引擎有十几种或更多,比较著名的搜索引擎有Yahoo!、Google、Sohu等。每个搜索引擎都有其各自的特点,有的以查询速度快见长,有的以数据库容量大占优,但总而言之,一个优秀的搜索引擎应具有以下几个特点:
  5.1.支持全文检索
  全文搜索引擎的优点是查询全面而充分,用户能够对各网站的每篇文章中的每个词进行搜索。当全文搜索引擎遇到一个网站时,会将该网站上所有的文章(网页)全部获取下来,并收入到引擎的数据库中。只要用户输入查询的“关键字”在引擎库的某篇文章中出现过,则这篇文章就会作为匹配结果返回给用户。从这点上看,全文搜索真正提供了用户对Internet上所有信息资源进行检索的手段,给用户以最全面最广泛的搜索结果。但全文搜索的缺点是提供的信息虽然多而全,但由于没有分类式搜索引擎那样清晰的层次结构,有时给人一种繁多而杂乱的感觉。
  5.2.支持目录式分类结构
  分类搜索引擎的优点是将信息系统地分门归类,当遇到一个网站时,它并不像全文搜索引擎那样,将网站上的所有文章和信息都收录进去,而是首先将该网站划分到某个分类下,再记录一些摘要信息,对该网站进行概述性的简要介绍。最具代表性的目录式分类搜索引擎是Yahoo网站。 分类搜索引擎可以使用户清晰方便地查找到某一大类信息,这符合传统的信息查找方式,尤其适合那些“希望了解某一方面/范围内信息,并不严格限于查询关键字”的用户。但目录式搜索引擎的搜索范围较全文搜索引擎要小许多,尤其是当用户选择类型不当时,这样有可能遗漏某些重要的信息源。
  5.3.能够区分搜索结果的相关性
搜索引擎应该能够找到与搜索要求相对应的站点,并按其相关程度将搜索结果排序。这里的相关程度是指搜索关键字在文档中出现的频度,最高为1。当频度越高时,则认为该文档的相关程度越高。但由于目前的搜索引擎还不具备智能,除非你知道要查找的文档的标题,否则排列第一的结果未必是“最好”的结果。所以有些文档尽管相关程度高,但并不一定是用户更需要的文档。
  5.4.检索方法多样、查找手段完备
  有些性能完善的搜索引擎不仅能检索Internet上的文献,还能查找公司和个人的信息;不仅能检索Web页面,还提供对新闻组内文章的查找;不仅能输入单词、词组或句子进行检索,还能指定多个单词之间的逻辑组配及其位置关系;不仅能以词语查询有关主题的页面信息,也能以特定的域名、主机名、URL等查找有关信息;此外,还可以对被检索文献发表的语种、日期等进行限制。
5.5. 其他性能
一个优秀的搜索引擎产品还必须查询速度快、具有较好的可维护、可更新性能。系统必须稳定可靠,具有完整的容错、备份、崩溃修复机制,系统即使出错,也可以得到迅速的恢复。
主题分析 索引

存储过程 → → →

∣ 序


→→→→

↑ 循
∣ 环
∣ 匹

检索过程 → → →


主题分析 索引

附图: 检索原理图
参考文献:《搜索引擎在幕后怎样工作》 中国科学院软件研究所 朱洁
《网络检索工具的比较研究》 段其宪 时咏梅
 
Lucene之起源现状及初步应用
Lucene之起源现状及初步应用
1.起源与发展
Lucene是一个高性能、纯Java的全文检索引擎,而且免费、开源。Lucene几乎适合于任何需要全文检索的应用,尤其是跨平台的应用。
Lucene的作者Doug Cutting是一个资深的全文检索专家,刚开始,Doug Cutting将Lucene发表在自己的主页上,2000年3月将其转移到sourceforge,于2001年10捐献给Apache,作为Jakarta的一个子工程。
2.使用现状
经过多年的发展,Lucene在全文检索领域已经有了很多的成功案例,并积累了良好的声誉。
基于Lucene的全文检索产品(Lucene本身只是一个组件,而非一个完整的应用)和应用Lucene的项目在世界各地已经非常之多,比较知名的有:
l Eclipse:主流Java开发工具,其帮助文档采用Lucene作为检索引擎
l Jive:知名论坛系统,其检索功能基于Lucene
l Ifinder:出自德国的网站检索系统,基于Lucene(http://ifinder.intrafind.org/)
l MIT DSpace Federation:一个文档管理系统(http://www.dspace.org/)
国内外采用Lucene作为网站全文检索引擎的也很多,比较知名的有:
l http://www.blogchina.com/weblucene/
l http://www.ioffer.com/
l http://search.soufun.com/
l http://www.taminn.com/
(更多案例,请参见http://wiki.apache.org/jakarta-lucene/PoweredBy)
在所有这些案例中,开源应用占了很大一部分,但更多的还是商化业产品和网站。毫不夸张的说,Lucene的出现,极大的推动了全文检索技术在各个行业或领域中的深层次应用。
3.初步应用
前面提到,Lucene本身只是一个组件,而非一个完整的应用,所以若想让Lucene跑起来,还得在Lucene基础上进行必要的二次开发。
下载与安装
首先,你需要到Lucene的官方网站http://jakarta.apache.org/lucene/ 去下载一份拷贝,最新版是1.4。下载后将得到一个名为lucene-1.4-final.zip的压缩文件,将其解压,里面有一个名为lucene-1.4-final.jar的文件,这就是Lucene组件包了,若需要在项目使用Lucene,只需要把lucene-1.4-final.jar置于类路径下即可,至于解压后的其他文件都是参考用的。
接下来,我用Eclipse建立一个工程,实现基于Lucene的建库、记录加载和记录查询等功能。


如上图所示,这是开发完成后的工程,其中有三个源文件CreateDataBase.java,InsertRecords.java,QueryRecords.java,分别实现建库、入库、检索的功能。

以下是对这三个源文件的分析。
建库源码及说明

CreateDataBase.java
packagecom.holen.part1;

importjava.io.File;
importorg.apache.lucene.analysis.standard.StandardAnalyzer;
importorg.apache.lucene.index.IndexWriter;

/**
* @authorHolenChen
*初始化检索库
*/
public classCreateDataBase{

publicCreateDataBase(){
}

public intcreateDataBase(Filefile){
intreturnValue=0;
if(!file.isDirectory()){
file.mkdirs();
}
try{
IndexWriterindexWriter= newIndexWriter(file,newStandardAnalyzer(),true);
indexWriter.close();
returnValue=1;
}catch(Exceptionex){
ex.printStackTrace();
}
returnreturnValue;
}

/**
*传入检索库路径,初始化库
* @paramfile
* @return
*/
public intcreateDataBase(Stringfile){
return this.createDataBase(newFile(file));

}

public static voidmain(String[]args){
CreateDataBasetemp= newCreateDataBase();
if(temp.createDataBase(&quot;e://lucene//holendb&quot;)==1){
System.out.println(&quot;db init succ&quot;);
}
}
}


说明:这里最关键的语句是IndexWriterindexWriter= newIndexWriter(file,newStandardAnalyzer(),true)。
第一个参数是库的路径,也就是说你准备把全文检索库保存在哪个位置,比如main方法中设定的“e://lucene//holendb”,Lucene支持多库,且每个库的位置允许不同。
第二个参数是分析器,这里采用的是Lucene自带的标准分析器,分析器用于对整篇文章进行分词解析,这里的标准分析器实现对英文(或拉丁文,凡是由字母组成,由空格分开的文字均可)的分词,分析器将把整篇英文按空格切成一个个的单词(在全文检索里这叫切词,切词是全文检索的核心技术之一,Lucene默认只能切英文或其他拉丁文,默认不支持中日韩等双字节文字,关于中文切词技术将在后续章节重点探讨)。
第三个参数是是否初始化库,这里我设的是true,true意味着新建库或覆盖已经存在的库,false意味着追加到已经存在的库。这里新建库,所以肯定需要初始化,初始化后,库目录下只存在一个名为segments的文件,大小为1k。但是当库中存在记录时执行初始化,库中内容将全部丢失,库回复到初始状态,即相当于新建了该库,所以真正做项目时,该方法一定要慎用。
InsertRecords.java
packagecom.holen.part1;

importjava.io.File;
importjava.io.FileReader;
importjava.io.Reader;
importorg.apache.lucene.analysis.standard.StandardAnalyzer;
importorg.apache.lucene.document.Document;
importorg.apache.lucene.document.Field;
importorg.apache.lucene.index.IndexWriter;

/**
* @authorHolenChen
*记录加载
*/
public classInsertRecords{

publicInsertRecords(){
}

public intinsertRecords(Stringdbpath,Filefile){
intreturnValue=0;
try{
IndexWriterindexWriter
= newIndexWriter(dbpath,newStandardAnalyzer(),false);
this.addFiles(indexWriter,file);
returnValue=1;
}catch(Exceptionex){
ex.printStackTrace();
}
returnreturnValue;
}

/**
*传入需加载的文件名
* @paramfile
* @return
*/
public intinsertRecords(Stringdbpath,Stringfile){
return this.insertRecords(dbpath,newFile(file));
}

public voidaddFiles(IndexWriterindexWriter,Filefile){
do
cumentdoc= newDocument();
try{
do
c.add(Field.Keyword(&quot;filename&quot;,file.getName()));


//以下两句只能取一句,前者是索引不存储,后者是索引且存储
//doc.add(Field.Text(&quot;content&quot;,new FileReader(file)));

do
c.add(Field.Text(&quot;content&quot;,this.chgFileToString(file)));

indexWriter.addDocument(doc);
indexWriter.close();
}catch(Exceptionex){
ex.printStackTrace();
}
}

/**
*从文本文件中读取内容
* @paramfile
* @return
*/
publicStringchgFileToString(Filefile){
StringreturnValue= null;
StringBuffersb= newStringBuffer();
char[]c= new char[4096];
try{
Readerreader= newFileReader(file);
intn=0;
while(true){
n=reader.read(c);
if(n>0){
sb.append(c,0,n);
}else
{
break;
}
}
reader.close();
}catch(Exceptionex){
ex.printStackTrace();
}
returnValue=sb.toString();
returnreturnValue;

}

public static voidmain(String[]args){
InsertRecordstemp= newInsertRecords();
Stringdbpath=&quot;e://lucene//holendb&quot;;
//holen1.txt中包含关键字&quot;holen&quot;和&quot;java&quot;
if(temp.insertRecords(dbpath,&quot;e://lucene//holen1.txt&quot;)==1){
System.out.println(&quot;add file1 succ&quot;);
}
//holen2.txt中包含关键字&quot;holen&quot;和&quot;chen&quot;
if(temp.insertRecords(dbpath,&quot;e://lucene//holen2.txt&quot;)==1){
System.out.println(&quot;add file2 succ&quot;);
}
}
}

文本分析提供了概念发现,自动分类以及无结构文档的创新显示
文本分析提供了概念发现,自动分类以及无结构文档的创新显示
原作者:Seth Grimes
As the minutia of everyday business and personal life migrates to the Internet, small wonder that text search is likely the Web's most popular function. Who has time nowadays for Web surfing, for meandering through a network of linked pages until you come to something intriguing? We want the express train, a direct link to content. Yet text-search results sometimes seem like the generic wisdom you get randomly from a Magic 8 Ball: They're so lacking in contextual relevance that they may answer many questions other than the one you're asking. Text-search results lack the aptness that would follow from understanding the meaning of search terms — rather than just their presence or absence — and from the ability to assess the relevance of a search hit.

Text mining is poised to fill the void, structuring the information inherent in volumes of free text in ways that enable decidedly more intelligent search. There will still be a role for the thoughtful, manual classification and filtering that made Yahoo a winner from its earliest incarnation, and there will still be advantages to intentional, semantic-Web type efforts to categorize content for identification by automated agents. But just as data mining lets you discover hidden relationships in structured data and apply predictive algorithms, text mining will help identify value that you and the manual classifiers and Resource Description Framework wizards didn't know existed.
Tired of search results presented as pages of hits? Text-mining software implements innovative display and navigation techniques that graphically represent networks of conceptually interrelateddo
cuments. Although plenty of pointless graphics, animation, and other whiz-bangs adorn the Web and office software, text-mining interfaces won't be all glitz. They already harness hyperbolic (zooming) displays and other approaches that deliver results in a navigable, organized form that reflects the underlying structure of the result sets — approaches that add analytic value.
Text mining will let us move from knowledge management to knowledge analytics.
Wordspace
Everyone is familiar with the problem space: Languages and forms of communication are designed for human rather than machine consumption, but people's daily lives are increasingly mediated by and reliant on information technology, creating a need for innovative modes of human-computer interaction. People and computers often meet halfway, communicating via simple, structured instruction sets tailored for particular processes like operating an automated teller machine. It isn't feasible for people to go further by learning the variety of languages used to program more sophisticated transactions;
instead we expect computers to understand our native languages.
This problem isn't trivial because the meaning of words is highly dependent on context and may be obscured by slang, irregular grammar, fractured syntax, spelling errors and variations, and imprecision. Interpreting among languages is also difficult when you're dealing with degrees of incomparability of syntax (composition), semantics (meaning), and alphabet. Humans can overcome these difficulties because we understand abstraction, context, and linguistic variations and can detect and apply patterns. We're not so good on speed, volume, consistency, and breadth, by which I mean an individual's ability to work in more than a handful of languages except in the most exceptional of cases.
The challenge — designing information technology that matches human language comprehension while bringing to bear the advantages of automation — defines the playing field for text mining.
Application Space
The most pressing applications for text mining are first in corporate knowledge analytics — making use of the vast stores of non-numeric information that organizations collect in the course of everyday operations — and second in responding to amorphous security threats. I've been skeptical of knowledge management for as long as the field has existed, seeing it as little more than providing a search interface on ado
cument warehouse. In particular, government research programs like the Department of Defense mooted Terrorism Information Awareness (TIA), originally known as Total Information Awareness, proposed to analyze very large volumes of structured and unstructured data to detect patterns and forestall terrorist attacks. Congress has had issues with TIA and similar programs and has eliminated their funding. As a result, the programs will likely &quot;go black,&quot;
classified secret, continuing out of the spotlight of public scrutiny, funded via special appropriations.

Many companies and government agencies already use text mining, albeit for very specialized applications. Because competitiveness and security concerns will only grow in the coming years and text mining extends well-understood search and data mining concepts, the scope and pervasiveness of text-mining applications are bound to grow rapidly.
Techniques and Vendors
Text mining is a two-stage process of categorization and classification. First, you figure out how to describedo
cuments and their contents including the concepts they contain, and then
you bindo
cuments into the descriptive categories and map inter-document relationships according to the newly detected concepts. This approach is similar to segmentation and classification through data mining;
I see data mining's clusters as analogous to text-mining-generated concepts. Once you have classified according to categories, you cando
something akin to OLAP-style slice-and-dice analysis of multidimensional data sets in order to tease interesting details — anomalous or exceptional information — out of the largerdo
cument sets.
Barak Pridor, president of text-mining vendor ClearForest describes text-mining steps as &quot;semantic, statistical, and structural analysis that classifiesdo
cuments and discovers buried persistent entities, event, facts, and relationships&quot;
in a process he calls &quot;intelligent hybrid tagging.&quot;
Pridor distinguishesdo
cument-level tags (descriptive elements like subject and author) from &quot;innerdo
cument tags&quot;
that work with families of entity types (that is, with conceptual groupings).
Text-mining offerings are by no means uniform. For example, many implementations such as those from Autonomy derive or import taxonomies (hierarchical knowledge representations that include concept definitions) for use in classifying and relatingdo
cuments. Autonomy's director of technology strategy, Ron Kolb, claims, &quot;Autonomy is unique in being mathematically based, using pattern matching and statistical analysis across multiple languages and multiple platforms.&quot;
Autonomy uses Bayesian statistics, which assess relevance based on prior probabilities, and Claude Shannon's information theory to facilitate extracting concepts fromdo
cument sets. The result is to contain the effect of the vagaries of human languages.
Not everyone agrees that a statistically focused approach to categorization is best. Claude Vogel, CTO of Convera, told me, &quot;You cannot build high-level taxonomies and ontologies that way. You can't escape the manual librarian-style work.&quot;
(Roughly put, an ontology provides meaning for a knowledgedo
main, while a taxonomy organizes that knowledge.) Thatdo
esn't mean that you need an army of taxonomy builders to work with Convera's RetrievalWare because, as with Autonomy's products, you can import XML-expressed taxonomies. Convera also shares with Autonomy the distinction of searching media such as audio, images, and video in addition to text.
Autonomy has focused on its mining engine, offering options such as weighting, supporting a large number of languages, and providing interfaces that integrate its products with BI, CRM, ERP, and other enterprise applications. Inxight Software, by contrast, is a notable vendor that, like ClearForest, has devoted significant resources to developing front ends. Inxight's Star Tree, for example, lets you explore network maps via hyperbolic visualization where segment details are enlarged or collapsed as you move the focus from one map node to another. Inxight, like Autonomy, provides back-end categorization and taxonomy management software to other companies including ClearForest and SAS.
SASdo
minates the high-end data analysis market. Its Text Miner incorporates Inxight technology for linguistic analysis and concept extraction but gives the results a statistical spin that can be matched by few other vendors. According to product manager Manya Mayes, Text Miner and the Enterprise Miner data-mining tools are fully integrated, where textual-analysis results become available as structured data for application of a full range of traditional analytic approaches.
Rate This Article
Rating: 1 (best) 2 3 4 5 (worst)
Comments:
Optional e-mail address:

Challenges
Although still in its infancy, text mining promises rapid advances in the scope of applications and in the effectiveness, comprehensiveness, interoperability, and usability of software implementations. The field won't be mature until commercial tools offer closed-loop analytics, that is, actionable results rather than just visualizations, analytics that are well integrated with data mining, and statistical analysis systems that use all an organization's information assets. Although techniques seem fairly well established, maturity will also bring standardized interfaces and input and output formats, extension to a spectrum of rich media in addition to plain text, the scalability to world-size applications, and predictive capabilities. The implementations available show that researchers and vendors are on the right track.

Lucene学习笔记(1)
Lucene学习笔记(1)
  Lucene是一套全文检索的API,对其介绍的文章和应用的案例都多,可参考lucene及本文的参考文献。
  此次学习,以实用为主,一是简单应用,二是Web应用,三是汉化,四相关应用(Lucene主页上在SandBox中)。
0、准备工作
  去Lucene的主页下载目前的稳定版本lucene-1.2.tar.gz,解压缩,将lucene-1.2目录下的两个jar文件lucene-1.2.jar和lucene-demo2-1.2.jar放到适当的目录下后,并将其加入到CLASSPATH环境变量中。
tar zxvf lucene-1.2.tar.gz <----解压缩
cd lucene-1.2
cp *.jar $DP<---存放jar文件的目录,根据具体工作要求用实际目录替换
CLASSPATH=$CLASSPATH:$DP/lucene-1.2.jar:$DP/lucene-demos-1.2.jar;
export CLASSPATH
如果不想在每次都登录后,可以编辑/etc/profile或自己目录下的.profile,将上面的最后一行加到文件的最后一行。Windows的设置,右击桌面的“我的电脑”,选“高级”->“环境变量”->选中CLASSPATH->“编辑”,在输入框中加入两个jar文件的全路径名,注意分隔符是分号(;)。参见下图。
1、运行demo
$ java org.apache.lucene.demo.IndexFiles /usr/local/man/man1/ <--对man文件建立索引
adding /usr/local/man/man1/mysql.1
...........
adding /usr/local/man/man1/cvs.1
1614 total milliseconds
$ java org.apache.lucene.demo.SearchFiles <--进行检索
Query: password
Searching for: password
7 total matchingdo
cuments
0. /usr/local/man/man1/mysql.1
......
6. /usr/local/man/man1/mysqlshow.1
Query:
OK!Lucene自待的demo运行成功
这个demo程序调用的主要API函数:
/*关于索引的主要函数*/
File file=new File(argv[]);
IndexWriter writer = new IndexWriter(&quot;index&quot;, new StandardAnalyzer(), true);
Documentdo
c = newdo
cument();
doc.add(Field.Text(&quot;path&quot;, file.getPath()));
doc.add(Field.Keyword(&quot;modified&quot;,DateField.timeToString(file.lastModified())));
FileInputStream is = new FileInputStream(f);
Reader reader = new BufferedReader(new InputStreamReader(is));
doc.add(Field.Text(&quot;contents&quot;, reader));
writer.addDocument(doc);
writer.optimize();
writer.close();
/*关于检索的主要函数*/
Searcher searcher = new IndexSearcher(&quot;index&quot;);
Analyzer analyzer = new StandardAnalyzer();
Query query = QueryParser.parse(lineforsearch, &quot;contents&quot;, analyzer);
Hits hits = searcher.search(query);
for (int i = start;
i < hits.length();
i++) {
Documentdo
c = hits.doc(i);
String path =do
c.get(&quot;path&quot;);
System.out.println(i + &quot;. &quot;
+ path);
}
3、运行LuceneWeb
  假定tomcat装在$TOMCATHOME目录下,具体应用时用真实的目录替换$TOMCATHOME。
cd $TOMCATHOME/webapps
mkdir lucenedb
cd lucenedb
java org.apache.lucene.demo.IndexHTML -create -index $TOMCAT/webapps/lucenedb ../examples<--用相对路径“..”,一来指明被索引的文件的位置,二来用来显示被索引文件的URL,因为检索的jsp程序在luceneweb子目录下.examples可用其它的真实应用的目录名来替换
cd ..
cp ~/lucene-1.2/luceneweb.war . <--luceneweb.war在你解压缩生成的lucene-1.2目录下
../bin/shudown.sh
../bin/startup.sh
然后通过客户端访问http://yourdomain.com:8080/luceneweb,如果顺利浏览器应出现右边所示的内容。 .
再到服务器端
cd luceneweb
vi configuration.jsp <--将indexLocation 的值改为 &quot;$TOMCATHOME/webapps/lucenedb&quot;;
cd ..
jar -ur luceneweb.war luceneweb
再到客户端,刷新刚才的页面,然后就可以输入单词进行检索了。遗憾的是,此是只能检索英文单词。且如果命中的html页面的title是汉字的话,显示也有问题。如图。

  此处的IndexHTML,可以对htm、html和txt类型的文件进行索引,用的是一个HTMLParser,除此以外与上一例基本相同。
参考文献
1、Lucene FAQ, http://lucene.sourceforge.net/cgi-bin/faq/faqmanager.cgi?file=chapter.indexing&amp;toc=faq#q1
2、Getting Started,http://jakarta.apache.org/lucene/docs/gettingstarted.html
引自 竹笋炒肉
Lucene学习笔记(2)
Lucene学习笔记(2)
  不仅仅在推广和介绍方面,车东在Lucene的汉化及web应用,也作出了极大的极大的贡献。他将自己的汉化和web应用两方面的成果,放在sourceforge上成了开源的项目。下面主要是对这个项目的学习笔记。
  对Lucene的汉化,车东开发了两个Analyzer,一个是二元切分,一个单字切分。利用这两个中的任一个进行分析,都可以进行汉字的索引和检索了。我把这两个Analyzer编译后一起打入到lucene-1.2.jar中了,如果不愿自己动手进行编译这两个Analyzer的朋友,可以从这儿下载。
  有了新的Analyzer,我把IndexFiles、IndexHTML和SearchFiles中的Analyzer也用了新CJKAnalyzer做了替换,并重新编译打了包lucene-demo-1.2.jar,可以从这儿下载。包内带有修改后的三个java文件。
  用上面两个jar文件,分别替换同名的原来的文件,就可以索引和检索汉语了。右面是我做的测试。
Lucene学习笔记(3)
Lucene学习笔记(3)
  继续学习车东利用Lucene提供网站全文检索的开源项目。
  由于文档不全,这次看代码看得很苦,几乎是用log4j一个类一个方法的看过来的。令人高兴的是,期间请教车东时,他说到要重新整理一下整个项目的源代码和文档,估计后来者可以轻松矣。
  除了以前提到的汉化外,车东在这个项目中,加入了很多实用的东东,如反显、排序、摘要等,甚至连网页过期时间、输出格式的限制都考虑到了。
  下面是我的测试页面,大家看看先。等明天我把源代码diff一下,把我做的修改文件也挂上来,供大家参考。


  在车东的简历上,有一个商业检索网址,估计是车东他们的成绩,可以去看看,也帮助理解这个项目的功能。
  下面是运行weblucene需要作得改动和说明。
weblucene/
|-- WEB-INF
| |-- classes
| | `-- com
| | `-- chedong
| | |-- weblucene
| | |-- WebLuceneAdminServlet.java
| | |-- index
| | | `-- SAXIndexer.java
| | `-- search
| | `-- WebLuceneHighlighter.java
| |-- logs <-----这是一个子目录,手工建立后程序运行时log文件在这个目录下。
| `-- var
| `-- app
| |-- index <-----这是一个子目录,手工建立后索引时将索引文件放在这儿。
| |-- weblucene.xsl
| `-- wl.conf
|-- index.html
|-- style.css
`-- test.xml
对SAXIndexer.java的修改
将两行
sb.append(luceneDoc.getField((String) it.next()));
改为两行
sb.append(luceneDoc.get((String) it.next()));
对WebLuceneHighlighter.java的修改
将两处<u>改为<ins>
将两处</u>改为</ins>
对WebLuceneAdminServlet.java可改可不改
建议将
logFileName = servletConfig.getServletContext().getRealPath(&quot;WEB-INF/logs/&quot;)
+ logFileName;
改为
logFileName = servletConfig.getServletContext().getRealPath(&quot;WEB-INF/logs/&quot;)
+ &quot;/&quot;
+ logFileName;

除了三个java程序外,其它文件都可以从这儿下载.
  通过web进行检索前,需要先建立索引,命令如下:
$ java IndexRunner -i tt.xml -o WEB-INF/var/app/index/ -t Title,Content -n Author,Pubtime
  需要再说一句,就是估计车东会很快推出一个崭新的实用性更强的版本,到那时此处可供下载的内容估计都没有用了。:)
引自 竹笋炒肉
Lucene学习笔记(4)将M$Word转为HTML
Lucene学习笔记(4)将M$Word转为HTML
  后面是一些关于Luncene外围的工具,这是其中之一。
  Majix利用jacob,将M$Word转换为xml,进而转换为html.
  试了一下,对英语文档没问题,对汉语的却转换成了乱码,估计是那些地方需要设置一下。
  Majix中用了一个tool叫jade(如果你认为是反编译的那个jad就错了,hehe),是一个DSSSL的实现,可以做XML、RTF、TeX、MIF、SGML的转换。
  Jacob既然是Java与Com之间的桥梁,则可以乐观地预测M$的所有文档,都有可以转换了,至少抽取其内容应该问题不大吧。
  突然感觉很迷惘,让Majix彻底把我搞糊涂了。Majix本身很简单,可其中用了不少XML技术(也叫技术吧),一时搞不清它们之间的关系了。看来,虽然自觉XML比较熟悉了,其实还是欠火侯,抽空再去IBM学习学习了
引自 竹笋炒肉
Lucene学习笔记(5)爬行者LARM
Lucene学习笔记(5)爬行者LARM
  爬行者LARM是一个抓取网页的机器人,用纯Java写就。
  通过作者的叙述,写一个爬行者,远非想象中的那么简单。HTML规范太简单了,所以会出很多标新立异的HTML文件。网络的随机性太强了,说不定就会遇到什么问题。这种种意外,都会考验一个爬行者。
  LARM作为Lucene的子项目,还在开发之中,连个稳定版都没有,只能通过CVS取得。而且文档的说明也不统一,具有开发中的项目的共性。不过,它的随机文档还是把LARM的设想和特点说了,它还有一个wiki页面,不知为什么在sourceforge上还挂了一个名(这儿还有几篇RTF文档)。
  LARM源码中,有一个GUI界面,把我乐坏了,一运行,怎么点击“Start”它也不活动,很郁闷,一看源码,“// todo
: code goes here.”,根本没有对这个点击事件的处理代码。FT!
  如果不考虑它与Lucene的关系,单当作一个爬行者来看,也有一定的使用价值。我下了这个项目,编译运行以后,对http://hedong.3322.org进行抓取,由于没限制域名,一下子到了5500多个域名,在下了300M左右,就把它中断了。
mkdir jakarta
cd jakarta
cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic login
password: anoncvs
cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic checkout jakarta-lucene-sandbox
cd jakarta-lucene-sandbox/contributions/webcrawler-LARM
ant dist
把build/webcrawler_LARM-0.5.jar及libs/目录下的所有jar都加到classpath里去。
java -server de.lanlab.larm.fetcher.FetcherMain -start http://hedong.3322.org
  我把larm及所用的jar文件打了包放在这儿,有兴趣又不原编译的可从这儿下载。
引自 竹笋炒肉

//--------------
使用Lucene建立自己的搜索引擎
使用Lucene建立自己的搜索引擎

lucene是一个极其灵活的开放源代码的搜索引擎。
Lucene会直接同你的Web应用程序集成到一起。它是由Jakarta Apache工作组使用Java编写成的。你的Java应用程序能够将Lucene作为任何搜索功能的核心来使用。Lucene能够处理任何类型的文本数据;但是它没有内置对Word、Excel、PDF和XML的支持。但是还是有一些解决方案能够让Lucene支持它们中的每一个。
关于Lucene的重要一点是,它只是一个搜索引擎,因此没有内置Web图形用户界面和Web crawler。要把Lucene集成到你的Web应用程序里,你就要编写一个显示查询表单的servlet或者JSP页面,还要编写另一个列出结果的页面。
用Lucene来建立一个索引
你应用程序的文本内容由Lucene来索引,并被作为一系列索引文件保存在文件系统里。Lucene能够接受代表单篇内容的文档(Document)对象,例如一个Web页面或者PDF文件。你的应用程序就负责将其内容转变成Lucene能够理解的文档对象。
每个文档都是由有一个或者多个的字段(Field)对象。这些字段包含有一个名称和一个值,非常像散裂图里的一个项目(entry)。每个字段都应该对应一段信息,这段信息是同你需要查询或者显示的检索结果相关的。例如,标题应该被用在搜索结果里,因此它会被作为一个字段添加到文档对象里。这些字段可以被索引,也可以不被索引,而原始的数据也可以选择保存在索引里。保存在索引里的字段在创建检索结果页面的时候会很有用。对于搜索没有用处的字段,例如唯一的ID,就不需要被索引,只需要被保存就行了。
字段也可以是标记化了的(tokenized),这就意味着一个分析程序会将输入到字段里的内容分解成搜索引擎能够使用的标记。Lucene带有多个分析程序,但是我只会使用最强大的分析程序——StandardAnalyzer类。
StandardAnalyzer类会将文本的所有内容变成小写的,并去掉一些常用的停顿词(stop word)。停顿词是像“a”、“the”和“in”这样的词,它们都是内容里非常常见的词,但是对搜索却一点用处都没有。分析程序也会分析搜索查询,这就意味着查询会找到匹配的部分。例如,这段文本“Thedo
g is a golden retriever(这条狗是一只金毛猎犬)”,就会被处理为“dog golden retriever”作为索引。当用户搜索“a Goldendo
g”的时候,分析程序会处理这个查询,并将其转变为“goldendo
g”,这就符合我们的内容了。
我们的例子准备使用数据访问对象(Data Access Object,DAO)的商务对象(business object),前者是Java应用程序开发的一个常见模式。我要使用的DAO——ProductDAO见Listing A。
为了让这个演示程序简单,我不准备使用数据库,DAO也只会包含产品(Product)对象的一个集合。在本例里,我会采用Listing B里的产品对象,并将它们转变成为用于索引的文档。
索引符(Indexer)类在Listing C里,它将负责把Product转换成为Lucene文档,还负责创建Lucene索引。
产品类里的字段是ID名、简短描述和详细描述。通过使用字段(Field)类的UnIndexed方法,ID会被作为一个非索引的非标记字段被保存。通过使用字段类的Keyword方法,名称和简短描述会被作为索引的非标记字段被保存。搜索引擎会对内容字段进行查询,而内容字段里会包含有产品的名称、简短描述和详细描述字段。
在所有的文档都添加完之后,就要优化索引并关闭索引编写器,这样你才能够使用索引。Lucene的大多数实现都要使用增量索引(incremental indexing),在增量索引里,已经在索引里的文档都是独立更新的,而不是每次先删除索引再创建一个新的。
运行查询
创建一个查询并在索引里搜索结果要比创建一个索引简单。你的应用程序会要求使用者提供一个搜索查询,这个查询可以是一个简单的词语。Lucene拥有一些更加高级的查询(Query)类,用于布尔搜索或者整句搜索。
高级查询的一个例子是”Mutual Fund”(互惠基金)AND stock*(股票),它会搜索包含有短语Mutual Fund和以stock开头的词(例如stocks、stock或者甚至是stockings)的文档。
________________________________________
获取更多关于Lucene里查询的信息
Lucene Web网站里的句法页面会提供更加详细的信息。
________________________________________
搜索符(Searcher)类放在Listing D里,它负责在Lucene索引里查找你所使用的词语。对于本篇演示程序而言,我使用了一个简单的查询,它只是一个字符串,而没有使用任何高级查询功能。我用QueryParser类从查询字符串里创建了一个查询(Query)对象,QueryParser这个类会使用StandardAnalyzer类将查询字符串分解成标记,再去掉停顿词,然后将这个字符串转换成小写的。
这个查询被传递给一个IndexSearcher对象。IndexSearcher会在索引的文件系统里被初始化。IndexSearcher的搜索方法将接受这个查询并返回一个命中(Hits)对象。这个命中对象包含有作为Lucene文档对象的检索结果,以及结果的长度。使用命中对象的Doc方法将取回命中对象里的每个文档。
文档对象包含有我添加到索引符文档里的字段。这些字段中的一些被保存了,但是没有被标记化,你可以将它们从文档里提取出来。示例应用程序会用搜索引擎运行一个查询,然后显示它所找到的产品名称。
________________________________________
运行演示程序
要运行本文里的示例程序,你需要从Lucene的Web网站下载最新版本的Lucene二进制发布版本(binary distribution)。Lucene发行版的lucene-1.3-rc1.jar文件需要被添加到你Java类的路径下才能够运行这个演示程序。演示程序会在运行com.greenninja.lucene.Demo类的目录下创建一个叫做index的索引目录。你还需要安装好JDK。一行典型的命令是:java -cp c:/java/lucene-1.3-rc1/lucene-1.3-rc1.jar;. com.greenninja.lucene.Demo(见图A)。本例所使用的示例数据包含在ProductDAO类里。这个查询是演示(Demo)类的一部分。
________________________________________
图A


命令行示例

//===================================================
基于JAVA的全文索引引擎Lucene简介(上)
作者: 车东
Wednesday, August 14 2002 12:15 PM
摘要:Lucene是一个基于JAVA的全文索引工具包。
1. 基于JAVA的全文索引引擎Lucene简介:关于作者和Lucene的历史
2. 全文检索的实现:Luene全文索引和数据库索引的比较
基于JAVA的全文索引/检索引擎——Lucene
Lucene不是一个完整的全文索引应用,而是是一个用JAVA写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。
Lucene的作者:Lucene的贡献者Doug Cutting是一位资深全文索引/检索专家,曾经是V-Twin搜索引擎(Apple的Copland操作系统的成就之一)的主要开发者,后在Excite担任高级系统架构设计师,目前从事于一些INTERNET底层架构的研究。他贡献出的Lucene的目标是为各种中小型应用程序加入全文检索功能。
Lucene的发展历程:早先发布在作者自己的http://www.lucene.com/,后来宿主在SOURCEFORGE,2001年年底成为APACHE基金会jakarta的一个子项目:http://jakarta.apache.org/Lucene/
基于Lucene的应用:
已经有很多JAVA项目都使用了Lucene作为其后台的全文索引引擎,比较著名的有:
&amp;#8226; JIVE:WEB论坛系统;
&amp;#8226; Eyebrows:邮件列表HTML归档/浏览/查询系统,本文的主要参考文档“The Lucene search engine: Powerful, flexible, and free”作者就是EyeBrows系统的主要开发者之一,而EyeBrows已经成为目前APACHE项目的主要邮件列表归档系统。
&amp;#8226; Cocoon: 基于XML的web发布框架,全文检索部分使用了LUCENE
对于中文用户来说,最关心的问题是其是否支持中文的全文检索。但通过后面对于Lucene的结构的介绍,你会了解到由于Lucene良好架构设计,只需一些简单的接口扩展就能实现对中文检索的支持。
全文检索的实现机制
Lucene的API接口设计的比较通用,输入输出结构都很像数据库的表==>记录==>字段,所以很多传统的应用的文件、数据库等都可以比较方便的映射到Lucene的存储结构/接口中。总体上看:可以先把Lucene当成一个支持全文索引的数据库系统。
比较一下Lucene和数据库:


全文检索 ≠ like &quot;%keyword%&quot;
通常比较厚的书籍后面常常附关键词索引表(比如:北京:12, 34页, 上海:3, 77页……),它能够帮助读者比较快地找到相关内容的页码。而数据库索引能够大大提高查询的速度原理也是一样,想像一下通过书后面的索引查找的速度要比一页一页地翻内容高多少倍……而索引之所以效率高,另外一个原因是它是排好序的。对于检索系统来说核心是一个排序问题。
由于数据库索引不是为全文索引设计的,因此,使用like &quot;%keyword%&quot;时,数据库索引是不起作用的,在使用like查询时,搜索过程又变成类似于一页页翻书的遍历过程了,所以对于含有模糊查询的数据库服务来说,LIKE对性能的危害是极大的。如果是需要对多个关键词进行模糊匹配:like &quot;%keyword1%&quot;
and like &quot;%keyword2%&quot;
...其效率也就可想而知了。
所以建立一个高效检索系统的关键是建立一个类似于科技索引一样的反向索引机制,将数据源(比如多篇文章)排序顺序存储的同时,有另外一个排好序的关键词列表,用于存储关键词==>文章映射关系,利用这样的映射关系索引:[关键词==>出现关键词的文章编号,出现次数(甚至包括位置:起始偏移量,结束偏移量),出现频率],检索过程就是把模糊查询变成多个可以利用索引的精确查询的逻辑组合的过程。从而大大提高了多关键词查询的效率,所以,全文检索问题归结到最后是一个排序问题。
由此可以看出模糊查询相对数据库的精确查询是一个非常不确定的问题,这也是大部分数据库对全文检索支持有限的原因。Lucene最核心的特征是通过特殊的索引结构实现了传统数据库不擅长的全文索引机制,并提供了扩展接口,以方便针对不同应用的定制。
可以通过一下表格对比一下数据库的模糊查询:
  Lucene全文索引引擎 数据库
索引 将数据源中的数据都通过全文索引一一建立反向索引 对于LIKE 查询来说,数据传统的索引是根本用不上的。数据需要逐个便利记录进行GREP式的模糊匹配,比有索引的搜索速度要有多个数量级的下降。
匹配效果 通过词元(term)进行匹配,通过语言分析接口的实现,可以实现对中文等非英语的支持。 使用:like &quot;%net%&quot;
会把netherlands也匹配出来,
多个关键词的模糊匹配:使用like &quot;%com%net%&quot;:就不能匹配词序颠倒的xxx.net..xxx.com
匹配度 有匹配度算法,将匹配程度(相似度)比较高的结果排在前面。 没有匹配程度的控制:比如有记录中net出现5词和出现1次的,结果是一样的。
结果输出 通过特别的算法,将最匹配度最高的头100条结果输出,结果集是缓冲式的小批量读取的。 返回所有的结果集,在匹配条目非常多的时候(比如上万条)需要大量的内存存放这些临时结果集。
可定制性 通过不同的语言分析接口实现,可以方便的定制出符合应用需要的索引规则(包括对中文的支持) 没有接口或接口复杂,无法定制
结论 高负载的模糊查询应用,需要负责的模糊查询的规则,索引的资料量比较大 使用率低,模糊匹配规则简单或者需要模糊查询的资料量少
Lucene的创新之处:
大部分的搜索(数据库)引擎都是用B树结构来维护索引,索引的更新会导致大量的IO操作,Lucene在实现中,对此稍微有所改进:不是维护一个索引文件,而是在扩展索引的时候不断创建新的索引文件,然后定期的把这些新的小索引文件合并到原先的大索引中(针对不同的更新策略,批次的大小可以调整),这样在不影响检索的效率的前提下,提高了索引的效率。
Lucene和其他一些全文检索系统/应用的比较:
  Lucene 其他开源全文检索系统
增量索引和批量索引 可以进行增量的索引(Append),可以对于大量数据进行批量索引,并且接口设计用于优化批量索引和小批量的增量索引。 很多系统只支持批量的索引,有时数据源有一点增加也需要重建索引。
数据源 Lucene没有定义具体的数据源,而是一个文档的结构,因此可以非常灵活的适应各种应用(只要前端有合适的转换器把数据源转换成相应结构), 很多系统只针对网页,缺乏其他格式文档的灵活性。
内容分割 Lucene的文档是由多个字段组成的,甚至可以控制那些字段需要索引,
那些字段不需要索引,近一步索引的字段也分:
需要进行分词的索引,比如:标题,文章内容字段
不需要进行分词的索引,比如:作者/日期字段 缺乏通用性,往往将文档整个索引了
语言分析 通过语言分析器的不同扩展实现:
可以过滤掉不需要的词:an the of 等,
西文语法分析:将jumps jumped jumper都归结成jump进行索引/检索
非英文支持:对亚洲语言,阿拉伯语言的索引支持 缺乏通用接口实现
查询分析 通过查询分析接口的实现,可以定制自己的查询语法规则:
比如: 多个关键词之间的 + - and or关系等  
并发访问 能够支持多用户的使用  
 
//=============================================
基于JAVA的全文索引引擎Lucene简介(中)
简介:Lucene是一个基于JAVA的全文索引工具包。
1. 中文切分词机制简介:基于词库和自动切分词算法的比较
2. 具体的安装和使用简介:系统结构介绍和演示
关于亚洲语言的的切分词问题(Word Segment)
对于中文来说,全文索引首先还要解决一个语言分析的问题,对于英文来说,语句中单词之间是天然通过空格分开的,但亚洲语言的中日韩文语句中的字是一个字挨一个,所有,首先要把语句中按“词”进行索引的话,这个词如何切分出来就是一个很大的问题。
首先,肯定不能用单个字符作(si-gram)为索引单元,否则查“上海”时,不能让含有“海上”也匹配。
但一句话:“北京天安门”,计算机如何按照中文的语言习惯进行切分呢?
“北京 天安门” 还是“北 京 天安 门”?让计算机能够按照语言习惯进行切分,往往需要机器有一个比较丰富的词库才能够比较准确的识别出语句中的单词。
另外一个解决的办法是采用自动切分算法:将单词按照2元语法(bigram)方式切分出来,比如:
&quot;北京天安门&quot;
==> &quot;北京 京天 天安 安门&quot;。
这样,在查询的时候,无论是查询&quot;北京&quot;
还是查询&quot;天安门&quot;,将查询词组按同样的规则进行切分:&quot;北京&quot;,&quot;天安 安门&quot;,多个关键词之间按与&quot;and&quot;的关系组合,同样能够正确地映射到相应的索引中。这种方式对于其他亚洲语言:韩文,日文都是通用的。
基于自动切分的最大优点是没有词表维护成本,实现简单,缺点是索引效率低,但对于中小型应用来说,基于2元语法的切分还是够用的。
自动切分 词表切分
实现 实现非常简单 实现复杂
查询 增加了查询分析的复杂程度, 适于实现比较复杂的查询语法规则
存储效率 索引冗余大,索引几乎和原文一样大 索引效率高,为原文大小的30%左右
维护成本 无词表维护成本 词表维护成本非常高:中日韩等语言需要分别维护。
还需要包括词频统计等内容
适用领域 嵌入式系统:运行环境资源有限
分布式系统:无词表同步问题
多语言环境:无词表维护成本 对查询和存储效率要求高的专业搜索引擎
目前比较大的搜索引擎的语言分析算法一般是基于以上2个机制的结合。关于中文的语言分析算法,大家可以在GOOGLE查关键词&quot;word segment search&quot;能找到更多相关的资料。
安装和使用
下载:http://jakarta.apache.org/Lucene/
注意:Lucene中的一些比较复杂的词法分析是用JavaCC生成的(JavaCC:Java Compiler Compiler,纯JAVA的词法分析生成器),所以如果从源代码编译或需要修改其中的QueryParser、定制自己的词法分析器,还需要从http://www.webgain.com/products/java_cc/下载javacc。
lucene的组成结构:对于外部应用来说索引模块(index)和检索模块(search)是主要的外部应用入口
org.apache.Lucene.search/ 搜索入口
org.apache.Lucene.index/ 索引入口
org.apache.Lucene.analysis/ 语言分析器
org.apache.Lucene.queryParser/ 查询分析器
org.apache.Lucene.document/ 存储结构
org.apache.Lucene.store/ 底层IO/存储结构
org.apache.Lucene.util/ 一些公用的数据结构
简单的例子演示一下Lucene的使用方法:
索引过程:从命令行读取文件名(多个),将文件分路径(path字段)和内容(body字段)2个字段进行存储,并对内容进行全文索引:索引的单位是Document对象,每个Document对象包含多个字段Field对象,针对不同的字段属性和数据输出的需求,对字段还可以选择不同的索引/存储字段规则,列表如下:
方法 切词 索引 存储 用途
Field.Text(String name, String value) Yes Yes Yes 切分词索引并存储,比如:标题,内容字段
Field.Text(String name, Reader value) Yes Yes No 切分词索引不存储,比如:META信息,
不用于返回显示,但需要进行检索内容
Field.Keyword(String name, String value) No Yes Yes 不切分索引并存储,比如:日期字段
Field.UnIndexed(String name, String value) No No Yes 不索引,只存储,比如:文件路径
Field.UnStored(String name, String value) Yes Yes No 只全文索引,不存储
public class IndexFiles {
//使用方法:: IndexFiles [索引输出目录] [索引的文件列表] ...
public static void main(String[] args) throws Exception {
String indexPath = args[0];
IndexWriter writer;
//用指定的语言分析器构造一个新的写索引器(第3个参数表示是否为追加索引)
writer = new IndexWriter(indexPath, new SimpleAnalyzer(), false);
for (int i=1;
i<args.length;
i++) {
System.out.println(&quot;Indexing file &quot;
+ args);
InputStream is = new FileInputStream(args);
//构造包含2个字段Field的Document对象
//一个是路径path字段,不索引,只存储
//一个是内容body字段,进行全文索引,并存储
do
cumentdo
c = newdo
cument();
do
c.add(Field.UnIndexed(&quot;path&quot;, args));
do
c.add(Field.Text(&quot;body&quot;, (Reader) new InputStreamReader(is)));
//将文档写入索引
writer.addDocument(doc);
is.close();
};
//关闭写索引器
writer.close();
}
}
索引过程中可以看到:
&amp;#8226; 语言分析器提供了抽象的接口,因此语言分析(Analyser)是可以定制的,虽然lucene缺省提供了2个比较通用的分析器SimpleAnalyser和StandardAnalyser,这2个分析器缺省都不支持中文,所以要加入对中文语言的切分规则,需要修改这2个分析器。
&amp;#8226; Lucene并没有规定数据源的格式,而只提供了一个通用的结构(Document对象)来接受索引的输入,因此输入的数据源可以是:数据库,WORD文档,PDF文档,HTML文档……只要能够设计相应的解析转换器将数据源构造成成Docuement对象即可进行索引。
&amp;#8226; 对于大批量的数据索引,还可以通过调整IndexerWrite的文件合并频率属性(mergeFactor)来提高批量索引的效率。
检索过程和结果显示:
搜索结果返回的是Hits对象,可以通过它再访问Document==>Field中的内容。
假设根据body字段进行全文检索,可以将查询结果的path字段和相应查询的匹配度(score)打印出来,
public class Search {
public static void main(String[] args) throws Exception {
String indexPath = args[0], queryString = args[1];
//指向索引目录的搜索器
Searcher searcher = new IndexSearcher(indexPath);
//查询解析器:使用和索引同样的语言分析器
Query query = QueryParser.parse(queryString, &quot;body&quot;,
new SimpleAnalyzer());
//搜索结果使用Hits存储
Hits hits = searcher.search(query);
//通过hits可以访问到相应字段的数据和查询的匹配度
for (int i=0;
i<hits.length();
i++) {
System.out.println(hits.doc(i).get(&quot;path&quot;) + &quot;;
Score: &quot;
+
hits.score(i));
};
}
}
在整个检索过程中,语言分析器,查询分析器,甚至搜索器(Searcher)都是提供了抽象的接口,可以根据需要进行定制。
//====================================================
基于JAVA的全文索引引擎Lucene简介(下)
摘要:Lucene是一个基于JAVA的全文索引工具包。
1. Hacking Lucene:简化的查询分析器,删除的实现,定制的排序,应用接口的扩展
2. 从Lucene我们还可以学到什么
Hacking Lucene
简化的查询分析器
个人感觉lucene成为JAKARTA项目后,画在了太多的时间用于调试日趋复杂QueryParser,而其中大部分是大多数用户并不很熟悉的,目前LUCENE支持的语法:
Query ::= ( Clause )*
Clause ::= [&quot;+&quot;, &quot;-&quot;] [<TERM> &quot;:&quot;] ( <TERM> | &quot;(&quot;
Query &quot;)&quot;
)
中间的逻辑包括:and or + - &amp;&amp;
||等符号,而且还有&quot;短语查询&quot;和针对西文的前缀/模糊查询等,个人感觉对于一般应用来说,这些功能有一些华而不实,其实能够实现目前类似于GOOGLE的查询语句分析功能其实对于大多数用户来说已经够了。所以,Lucene早期版本的QueryParser仍是比较好的选择。
添加修改删除指定记录(Document)
Lucene提供了索引的扩展机制,因此索引的动态扩展应该是没有问题的,而指定记录的修改也似乎只能通过记录的删除,然后重新加入实现。如何删除指定的记录呢?删除的方法也很简单,只是需要在索引时根据数据源中的记录ID专门另建索引,然后利用IndexReader.delete(Term term)方法通过这个记录ID删除相应的Document。
根据某个字段值的排序功能
lucene缺省是按照自己的相关度算法(score)进行结果排序的,但能够根据其他字段进行结果排序是一个在LUCENE的开发邮件列表中经常提到的问题,很多原先基于数据库应用都需要除了基于匹配度(score)以外的排序功能。而从全文检索的原理我们可以了解到,任何不基于索引的搜索过程效率都会导致效率非常的低,如果基于其他字段的排序需要在搜索过程中访问存储字段,速度回大大降低,因此非常是不可取的。
但这里也有一个折中的解决方法:在搜索过程中能够影响排序结果的只有索引中已经存储的docID和score这2个参数,所以,基于score以外的排序,其实可以通过将数据源预先排好序,然后根据docID进行排序来实现。这样就避免了在LUCENE搜索结果外对结果再次进行排序和在搜索过程中访问不在索引中的某个字段值。
这里需要修改的是IndexSearcher中的HitCollector过程:
...
 scorer.score(new HitCollector() {
private float minScore = 0.0f;
public final void collect(intdo
c, float score) {
if (score > 0.0f &amp;&amp; // ignore zeroed buckets
(bits==null || bits.get(doc))) { // skipdo
cs not in bits
totalHits[0]++;
if (score >= minScore) {
/* 原先:Lucene将docID和相应的匹配度score例入结果命中列表中:
* hq.put(new ScoreDoc(doc, score)); // update hit queue
* 如果用doc 或 1/doc 代替 score,就实现了根据docID顺排或逆排
* 假设数据源索引时已经按照某个字段排好了序,而结果根据docID排序也就实现了
* 针对某个字段的排序,甚至可以实现更复杂的score和docID的拟合。
*/
hq.put(new ScoreDoc(doc, (float) 1/doc ));
if (hq.size() > nDocs) { // if hit queue overfull
hq.pop(); // remove lowest in hit queue
minScore = ((ScoreDoc)hq.top()).score;
// reset minScore
}
}
}
}
}, reader.maxDoc());
更通用的输入输出接口
虽然lucene没有定义一个确定的输入文档格式,但越来越多的人想到使用一个标准的中间格式作为Lucene的数据导入接口,然后其他数据,比如PDF只需要通过解析器转换成标准的中间格式就可以进行数据索引了。这个中间格式主要以XML为主,类似实现已经不下4,5个:
数据源: WORD PDF HTML DB
/ | | | /
XML中间格式
|
Lucene INDEX
从Lucene学到更多
Luene的确是一个面对对象设计的典范
&amp;#8226; 所有的问题都通过一个额外抽象层来方便以后的扩展和重用:你可以通过重新实现来达到自己的目的,而对其他模块而不需要;
&amp;#8226; 简单的应用入口Searcher, Indexer,并调用底层一系列组件协同的完成搜索任务;
&amp;#8226; 所有的对象的任务都非常专一:比如搜索过程:QueryParser分析将查询语句转换成一系列的精确查询的组合(Query), 通过底层的索引读取结构IndexReader进行索引的读取,并用相应的打分器给搜索结果进行打分/排序等。最后只将最前面的头100条结果放到结果集缓存中,知道有需要读取更后面的结果时。由于所有的功能模块原子化程度非常高,因此可以通过重新实现而不需要修改其他程序。
&amp;#8226; 除了灵活的应用接口设计,Lucene还提供了一些适合大多数应用的语言分析器实现(SimpleAnalyser, StandardAnalyser),这也是新用户能够很快上手的重要原因之一。
这些优点都是非常值得在以后的开发中学习借鉴的。作为一个通用工具库,Lunece的确给予了需要将全文检索功能嵌入到应用中的开发者很多的便利。
参考资料:
Apache: Lucene Project
http://jakarta.apache.org/Lucene/
Lucene邮件列表归档
Lucenehttp://nagoya.apache.org/eyebrowse/SummarizeList?listId=29
http://nagoya.apache.org/eyebrowse/SummarizeList?listId=30
The Lucene search engine: Powerful, flexible, and free
http://www.javaworld.com/javaworld/jw-09-2000/jw-0915-Lucene_p.html
中文语言的切分词
Lucene Tutorial
http://www.darksleep.com/puff/lucene/lucene.html
Notes on distributed searching with Lucene
http://home.clara.net/markharwood/lucene/
搜索引擎工具介绍
http://searchtools.com/
搜索引擎行业研究
http://www.searchenginewatch.com/

//+++++++++++++++++++++++++++++++++++++++++++++
全文检索概述
网站中,有大量的被反复利用的有价值信息,如何科学高效地去管理这些信息,使它们在最短的时间内最大限度地发挥其价值,是每一个网站面临的问题。
网站全文检索系统就是将用户的网站内容由系统自动地添加到检索引擎(数据库)中,这样,网站的访问者就可以用关键词方式查询网站中任何他关心的内容而不需繁琐的人工查找。
传统的信息管理的方式是采用以纸张为载体的信息分类管理,容量小,保存难。随着计算机产业的发展,以计算机存储设备为载体的电子文档随即出现,但是,人们仍然沿用传统的分类管理的方式来管理这些电子文档,或者根本就没有任何管理手段,这样就无法将这些信息有效的管理和利用,造成了信息巨大的浪费。全文检索的出现,将彻底改变传统的信息处理的模式。全文检索的基本原理就是以各类数据诸如文字、声音、图象等为处理对象,提供按照数据资料的内容而不是外在特征来实现信息的检索。它能提供快捷的数据管理工具和强大的数据查询手段,通过快捷的数据管理工具,能快速帮助人们进行文档资料的整理和管理工作,强大的数据查询手段,使人们能很方便地查到他们想要的任何信息。对于网站比较庞大、网页数目比较多、内容丰富的企业来讲,网站全文检索可以提供有效的查询手段,来增强网站的吸引力,方便访问者快速有效地找到自己感兴趣的信息。
全文检索实现了网站的数据库管理模式,使网站由静态响应转变为智能化动态响应,极大地提高了网站的应用水平。 全文检索系统能为您做什么?
&amp;#8226;
每天自动将新发布的网页内容增加到全文索引数据库中,每个访问网站的用户可以在第一时间内检索到您发布到网站的信息。
&amp;#8226;
将您单位有价值的信息在Internet/Intranet网上发布。
&amp;#8226;
您单位或个人的站点信息较多,可方便上网查找所需信息者进行站内检索。
&amp;#8226;
如果您是Internet内容供应商(ICP),可为您的用户提供更方便的信息查询手段。
&amp;#8226;
如果您是Internet服务提供商(ISP),可帮助您为用户提供更完美的服务,以增强您的竞争力。WebSearch全文检索系统组成模块
&amp;#8226;
全文数据库服务器 核心技术为中英文全文检索,以卓越的性能和多种强大的功能为各种格式文档的存储、管理和检索提供原动力。
&amp;#8226;
站点检索工具 为Web站点提供该站点网页的全文检索功能,由Web模块和全文数据库服务器组成。Web模块为最终用户的使用提供简单易用的操作界面。可自动定期搜索网站,自动根据网站内容更新索引。
&amp;#8226;
网页抓取工具 可通过&quot;智能机器人&quot;从互联网上成批或有选择的收集用户感兴趣的信息,能够抓取文本、图像、多媒体文件和各种格式化文档。拥有灵活的抓取控制策略,如控制抓取层次等。高效率和高可靠性的抓取,能跳过无效链接。自动化程度高,能自动启动Spider搜索功能的时间,以及重复搜索的时间间隔。操作非常简单便捷。
&amp;#8226;
与WebBuilder内容管理和发布系统的集成 可方便地按各种设置将数据库中的数据自动生成HTML文件,加载到Web服务器上,并可按设定的时间每天自动进行,不需人工干预。可自动根据数据库字段的取值生成导航页面和相关静态网页。为构造电子化媒体网站而专门设计,主要完成网上特定站点信息的采集和整理,分为数据采集和数据加工两部分。所有的操作可以通过浏览器完成。根据用户的分类标准把用户的资料按层次分门别类地组织在一起,生成静态索引页面,便于用户按目录浏览的方式定位所需信息。
&amp;#8226;
搜索引擎构造工具 由GetSite网页抓取模块、可以与WebBuilder内容管理和发布系统进行集成,与全文数据库服务器等集成。该工具可以为门户网站定制他们特有的专业搜索引擎或通用搜索引擎。 WebSearch全文检索系统突出特点
&amp;#8226;
查询速度快 基于全文检索技术检索网页的信息,比传统的数据库检索技术和直接检索网页的内容要快,降低了对检索服务器的硬件要求并提高了响应速度。
&amp;#8226;
智能化高查准率、查全率 实现了以自然语言处理技术为核心内容的智能中文分词技术,能够满足查全率和查准率的要求。
&amp;#8226;
查询手段丰富 支持各种逻辑运算(如AND、OR、NOT等),支持西文检索和中西文混合检索、词频运算和按时间或相关性(重要性)排序,等等。
&amp;#8226;
新网页自动入库 由WebBuilder系统生成的网页将自动进入全文索引数据库,无需用户进行任何干预。
&amp;#8226;
多平台支持 支持多种硬件平台(如小型机、工作站、服务器、PC机等)和多种操作系统(如Linux、Sun Solaris、Windows /NT/2000等)。
&amp;#8226;
多语言支持 支持简体中文(GB2312、GBK)、繁体中文(BIG5)、英文和Unicode,并能够在不同的编码之间转换。
&amp;#8226;
高开放性 可透明地连接Oracle、SQL Server、DB2、Informix、Sybase等主流的关系数据库管理系统。
&amp;#8226;
其它优秀特点 如简便的安装、便捷的用户管理,等等。
//+++++++++++++++++++++
WWW上信息检索概述--信息检索原理和技术
WWW上信息检索概述 ̄
——— 信息检索原理和技术
海南大学 徐华 (99714049)
摘要  计算机处理的数据量不断地呈指数增长,随着数据信息库积累的数据和主题越来越多,怎样快速、有效、经济地检索某个主题的所有信息,就成了一个十分热门的课题。解决这一难题的方法之一是采用智能搜索技术。本文中给出了自然语言处理的结构梗概,以及最终有助于网络用户查找信息的检索技术。
关键词 信息检索 模型和系统结构 搜索引擎 作用与特点
1 查找信息
  信息检索主要研究信息的表示、存储、组织和访问。即根据用户的查询要求,从信息数据库中检索出与之相关的信息资料。信息检索已从手工建立关键字索引,发展到计算机自动索引的全文信息检索、自动信息文摘、自动信息分类,并正朝着自然语言处理的方向发展。在信息检索领域,英语信息检索的发展较为迅速。英语信息检索系统,可以利用向量空间表示检索信息内容,并将自然语言处理应用于信息检索,大大提高了信息查询的准确性。(过程如附图)中文信息检索系统的发展相对较慢,目前已有的中文检索系统绝大部分仍为关键词检索,甚至许多系统还处于“字”索引阶段。不仅效率较低,而且信息检索的精度和准确性很差。究其原因,是因为中文信息检索有自身的特点,比如中文语词之间没有空格,因此在索引前需要进行语词切分。另一方面,与英语相比,汉语句法分析和语义理解更为困难,造成中文信息检索的发展较为缓慢。
2 信息检索模型
  信息检索系统的核心是搜索引擎,它需要从纷繁复杂的大量信息中,筛选出符合用户需求的信息。例如,用户希望从信息库中查询有关计算机网络产品销售方面的信息,如果查询出的结果为计算机软件产品方面的信息,则不能满足用户的需求。根据搜索引擎查找相关信息方式的不同,可将信息检索分为:布尔逻辑模型、模糊逻辑模型、向量空间模型以及概率模型等。
  布尔型信息检索模型,是最简单的信息检索模型,用户可以根据检索项在文档中的布尔逻辑关系提交查询,搜索引擎根据事先建立的倒排文件结构,确定查询结果。标准布尔逻辑模型为二元逻辑,所搜索的文档要么与查询相关,要么与查询无关。查询结果一般不进行相关性排序。如查询“计算机”,只要文档中出现关键词“计算机”,则全部包含在查询结果中。为了克服布尔型信息检索模型查询结果的无序性,在查询结果处理中引进了模糊逻辑运算,将所检索的数据库文档信息与用户的查询要求进行模糊逻辑比较,按照相关的优先次序排列查询结果。例如,查询“计算机”,那么出现“计算机”较多的文档将排列在较前的位置。
  与布尔型信息检索模型不同,向量空间模型用检索项的向量空间来表示用户的查询要求和数据库文档信息。根据向量空间的相似性,排列查询结果。向量空间模型不仅可方便地产生有效的查询结果,而且能提供相关文档的文摘,并进行查询结果分类,为用户提供准确定位所需的信息。
  基于贝叶斯概率论原理的概率模型不同于布尔和向量空间模型,它利用相关反馈的归纳学习方法,获取匹配函数。
  虽然不同检索模型使用的方法不同,但所要达到的目标是相同的,既按照用户要求,提供用户所需的信息。实际上,大多数检索系统往往将上述各种模型混合在一起,以达到最佳的检索效果。
3 信息检索系统结构
搜索引擎构成信息检索系统的核心。然而,信息检索系统还包括对索引信息文档格式的预处理、索引信息的分析、信息索引和用户信息检索等几个阶段。
3.1 信息预处理 
 信息预处理包括信息格式转换和过滤两个不同层次。信关作为访问不同信息的机构,能够访问不同组织形式的数据信息,如各种数据库、不同文件系统以及网络Web页面等。同时,信息预处理也能够过滤不同格式的文档。如Microsoft Word、WPS、Text和 HTML等。这使得搜索引擎不仅能够检索正文文档,而且能够检索原始格式的文档信息。
3.2 信息索引
  信息索引就是创建文档信息的特征记录,它使用户能很容易地检索到所需信息。建立索引需要进行下列处理:
3.2.1 信息语词切分和语词词法分析
  语词是信息表达的最小单位,而汉语不同于西方语言,其句子的语词间没有分隔符(空格),因此需要进行语词切分。汉语语词切分中存在切分歧异,如句子“使用户满意”可切分为“使/用户/满意”,也可能被错误地切分为“使用/户/满意”。因而需要利用各种上下文知识解决语词切分歧异。此外,还需要对语词进行词法分析,识别出各个语词的词干,以便根据词干建立信息索引。
3.2.2 进行词性标注及相关的自然语言处理
  在切分的基础上,利用基于规则和统计(马尔科夫链)的方法进行词性标注。基于马尔科夫链随机过程的n元语法统计分析方法,被证明在词性标注中能达到较高的精度。在此基础上,还要利用各种语法规则,识别出重要的短语结构。
3.2.3 建立检索项索引
  一般使用倒排文件的方式建立检索项相关信息,如表1所示。相关信息一般包括“检索项”、“检索项所在文件位置信息”以及“检索项权重”。例如,检索项“计算机”的位置信息为“文档D中第n段第m句第w词”。这样,在信息检索时,用户可以要求在查询中,检索项T1和检索项T2位于同一语句或同一段落中。检索项索引的建立准则是要易于文档信息的更新处理。
表1: 典型倒排检索项列表
TERM1do
Ci, WTi1;
DOCj, WTj1;
_ ;DOCm, WTm1
TERM2do
Ci, WTi2;
DOCk, WTk2;
_ ;DOCn, WTn2
TERMsdo
Cj, WTjs;
DOCm, WTms;
_ ;DOCp, WTps
3.3 查询扩展处理
  信息检索评价的标准是信息检索的精度和召回率。信息检索的精度为检索结果中相关信息文档数与查询结果总数之比。信息检索的召回率为实际检索出的相关信息文档数与信息库中总的相关信息文档数之比。
  为了提高信息检索的召回率,需要进行查询扩展处理。这种处理根据同义词词典和语义蕴涵词典扩展查询检索项。同义词扩展,如“计算机”和“电脑”指同一概念;因而查询“计算机”同时也要查询“电脑”,反之亦然。主题蕴涵扩展是指不但要查询检索词,而且还要查询其中所包含的子概念。比如,主题词“艺术”包括“电影”、“舞蹈”、“绘画”等等。“电影”又包括“故事片”、“记录片”等。因此,查询“艺术”当然包括“电影”、“舞蹈”、“绘画”以及其下的子概念。
  提高信息检索的精度,可利用向量空间模型实行相关查询反馈处理。即用户从初次查询的结果中,选择内容重要的文档或文档片断,让搜索引擎依据所选文档的特征,重新进行查询,从而提高查询精度。
3.4 信息分类和摘要
  为了方便用户从查询结果中选择所需信息,搜索引擎可将提供给用户的文档信息按照文档内容进行分类,并为每一篇文档产生简短摘要。
  搜索引擎根据文本检索项的统计特征,对查询结果进行分类和摘要。例如,用户查询检索项“计算机”,相应的结果分类也许为“分类1”:“网络”、“系统”、“路由器”等;“分类2”:“市场”、“产品”、“销售”等;以及其它分类。分类的目的是便于用户找到相关信息。
3.5 智能代理
搜索引擎除了被动搜索外,也可利用智能代理技术进行主动信息检索。信息检索系统智能用户代理,可根据用户事先定义的信息检索要求,在网络上实时监视信息源,如指定Web页面的更新、网络新闻、电子邮件、数据库信息变化等。并将用户所需的信息,通过电子邮件或其它方式,主动提供给用户。用户无须反复搜索所需信息,这样将大大减少用户检索信息的时间。
 目前,商用信息检索系统主要以布尔模糊逻辑加向量空间模型为主,辅以部分自然语言处理。自然语言处理,特别是自然语言理解在信息检索中应用,将大大提高信息检索的精度和相关性。
4 搜索引擎的主要作用及工作过程
  搜索引擎是Internet上的一个网站,它的主要任务是在Internet上主动搜索Web服务器信息并将其自动索引,其索引内容存储于可供查询的大型数据库中。当用户输入关键字(Keyword)查询时,该网站会告诉用户包含该关键字信息的所有网址,并提供通向该网站的链接。
  对于各种搜索引擎,它们的工作过程基本一样,包括以下三个方面:
  4.1. 派出“网页搜索程序”在网上搜寻所有信息,并将它们带回搜索引擎每个搜索引擎都派出绰号为“蜘蛛(Spider)”或“机器人(robots)”的网页搜索软件在各网址中爬行,访问网络中公开区域的每一个站点并记录其网址,从而创建出一个详尽的网络目录。各搜索引擎工作的最初步骤大致都是如此。
  4.2.将信息进行分类整理,建立搜索引擎数据库
  在进行信息分类整理阶段,不同的系统会在搜索结果的数量和质量上产生明显的不同。有的系统是把“网页搜索软件&quot;发往每一个站点,记录下每一页的所有文本内容;其他系统则首先分析数据库中的地址,以判别哪些站点最受欢迎(一般都是通过测定该站点的链接数量),然后再用软件记录这些站点的信息。记录的信息包括从HTML标题到整个站点所有文本内容以及经过算法处理后的摘要。当然,最重要的是数据库的内容必须经常更新、重建,以保持与信息世界的同步发展。
  4.3.通过Web服务器端软件,为用户提供浏览器界面下的信息查询
  每个搜索引擎都提供了一个良好的界面,并具有帮助功能。用户只要把想要查找的关键字或短语输入查询栏中,并按“Search”按钮(或其他类似的按钮)。搜索引擎就会根据用户输入的提问,在索引中查找相应的词语,并进行必要的逻辑运算,最后给出查询的命中结果(均为超文本链形式)。用户只需通过搜索引擎提供的链接,马上就可以访问到相关信息。有些搜索引擎将搜索的范围进行了分类,查找可以在用户指定的类别中进行,这样可以提高查询效率,搜索结果的“命中率”较高,从而节省了搜寻时间。
5 优秀搜索引擎的特点
  目前各种各样的中西文搜索引擎有十几种或更多,比较著名的搜索引擎有Yahoo!、Google、Sohu等。每个搜索引擎都有其各自的特点,有的以查询速度快见长,有的以数据库容量大占优,但总而言之,一个优秀的搜索引擎应具有以下几个特点:
  5.1.支持全文检索
  全文搜索引擎的优点是查询全面而充分,用户能够对各网站的每篇文章中的每个词进行搜索。当全文搜索引擎遇到一个网站时,会将该网站上所有的文章(网页)全部获取下来,并收入到引擎的数据库中。只要用户输入查询的“关键字”在引擎库的某篇文章中出现过,则这篇文章就会作为匹配结果返回给用户。从这点上看,全文搜索真正提供了用户对Internet上所有信息资源进行检索的手段,给用户以最全面最广泛的搜索结果。但全文搜索的缺点是提供的信息虽然多而全,但由于没有分类式搜索引擎那样清晰的层次结构,有时给人一种繁多而杂乱的感觉。
  5.2.支持目录式分类结构
  分类搜索引擎的优点是将信息系统地分门归类,当遇到一个网站时,它并不像全文搜索引擎那样,将网站上的所有文章和信息都收录进去,而是首先将该网站划分到某个分类下,再记录一些摘要信息,对该网站进行概述性的简要介绍。最具代表性的目录式分类搜索引擎是Yahoo网站。 分类搜索引擎可以使用户清晰方便地查找到某一大类信息,这符合传统的信息查找方式,尤其适合那些“希望了解某一方面/范围内信息,并不严格限于查询关键字”的用户。但目录式搜索引擎的搜索范围较全文搜索引擎要小许多,尤其是当用户选择类型不当时,这样有可能遗漏某些重要的信息源。
  5.3.能够区分搜索结果的相关性
搜索引擎应该能够找到与搜索要求相对应的站点,并按其相关程度将搜索结果排序。这里的相关程度是指搜索关键字在文档中出现的频度,最高为1。当频度越高时,则认为该文档的相关程度越高。但由于目前的搜索引擎还不具备智能,除非你知道要查找的文档的标题,否则排列第一的结果未必是“最好”的结果。所以有些文档尽管相关程度高,但并不一定是用户更需要的文档。
  5.4.检索方法多样、查找手段完备
  有些性能完善的搜索引擎不仅能检索Internet上的文献,还能查找公司和个人的信息;不仅能检索Web页面,还提供对新闻组内文章的查找;不仅能输入单词、词组或句子进行检索,还能指定多个单词之间的逻辑组配及其位置关系;不仅能以词语查询有关主题的页面信息,也能以特定的域名、主机名、URL等查找有关信息;此外,还可以对被检索文献发表的语种、日期等进行限制。
5.5. 其他性能
一个优秀的搜索引擎产品还必须查询速度快、具有较好的可维护、可更新性能。系统必须稳定可靠,具有完整的容错、备份、崩溃修复机制,系统即使出错,也可以得到迅速的恢复。
主题分析 索引

存储过程 → → →

∣ 序


→→→→

↑ 循
∣ 环
∣ 匹

检索过程 → → →


主题分析 索引

附图: 检索原理图
参考文献:《搜索引擎在幕后怎样工作》 中国科学院软件研究所 朱洁
《网络检索工具的比较研究》 段其宪 时咏梅
 
顶部