Lucene是个信息检索库(Library),利用它你可以为你应用加上索引和搜索功能.
Lucene使用者不需要深入了解有关全文检索知识,仅仅学会使用库中个类,你就为你应用实现全文检索功能.
不过千万别以为Lucene是个象google那样搜索引擎,Lucene甚至不是个应用,它仅仅是个工具,个Library.你也可以把它理解为个将索引,搜索功能封装很好套简单易用API.
利用这套API你可以做很多有关搜索事情,而且很方便.What Can Lucene DoLucene可以对任何数据做索引和搜索.
Lucene不管数据源是什么格式,只要它能被转化为文字形式,就可以被Lucene所分析利用.也就是说不管是MS word, Html ,pdf还是其他什么形式文件只要你可以从中抽取出文字形式内容就可以被Lucene所用.你就可以用Lucene对它们进行索引以及搜索.
How To Use Lucene --- A Simple Example
举例介绍:为作为输入参数文件夹下所有txt类型文件做索引,做好索引文件放入index文件夹.然后在索引基础上对文件进行全文搜索.
1. 建立索引
IndexWriter writer = IndexWriter("index", StandardAnalyzer, true);
IndexDocs(writer, .IO.FileInfo(args[0]));
writer.Optimize;
writer.Close;
IndexWriter是对索引进行写操作个类,利用它可以创建个索引对象然后往其中添加文件.需要注意它并不是唯可以修改索引类.在索引建好后利用其他类还可以对其进行修改.
构造第个参数是建立索引所要放文件夹名字.第 2个参数是个分析对象,主要用于从文本中抽取那些需要建立索引内容,把不需要参和建索引文本内容去掉.比如去掉些a the的类常用词,还有决定是否大小写敏感.区别选项通过指定区别分析对象控制.
第 3个参数用于确定是否覆盖原有索引.第 2步就是利用这个writer往索引中添加文件.具体后面再说.第 3步进行优化.第 4步关闭writer.下面具体看看第 2步:
public void IndexDirectory(IndexWriter writer, FileInfo file)
{
(Directory.Exists(file.FullName))
{
String files = Directory.GetFileEntries(file.FullName);
// an IO error could occur
(files != null)
{
for ( i = 0; i < files.Length; i)
{
IndexDirectory(writer, FileInfo(files[i])); //
这里是个递归
}
}
}
(file.Extension ".txt")
{
IndexFile(file, writer);
}
}
private void IndexFile(FileInfo file, IndexWriter writer)
{
Console.Out.WriteLine("adding " + file);
try
{
Document doc = Document;
doc.Add(Field.Keyword("filename", file.FullName));
doc.Add(Field.Text("contents", StreamReader(file.FullName)));
writer.AddDocument(doc);
}
catch (FileNotFoundException fnfe)
{
}
}
主要就是两个个用于处理文件夹(不是为文件夹建立索引),个用于真正为文件建立索引.因此主要集中看下IndexFile这个思路方法.首先建立Document对象,然后为Document对象添加些属性Field.你可以把Document对象看成是虚拟文件,将来将从此获取信息.
而Field则看成是描述此虚拟文件元数据(metadata).其中Field包括 4个类型: Keywork 该类型数据将不被分析,而会被索引并保存保存在索引中.
UnIndexed 该类型数据不会被分析也不会被索引,但是会保存在索引.
UnStored 和UnIndexed刚好相反,被分析被索引,但是不被保存.
Text 和UnStrored类似.如果值类型为还会被保存.如果值类型Reader就不会被保存和UnStored样.
最后将每个Document添加到索引当中.需要注意是索引不仅可以建立在文件系统上,也可以建立在内存中.
例如IndexWriter writer = IndexWriter("index", StandardAnalyzer, true);在第个参数不是指定文件夹名字而是使用Directory对象,并使用它子类RAMDirectory,就可以将索引建立在内存当中.
2. 对索引进行搜索
IndexSearcher indexSearcher= IndexSearcher(indexDir);
Query query = QueryParser.Parse(queryString, "contents", StandardAnalyzer);
Hits hits = indexSearcher.Search(query);
第步利用IndexSearcher打开索引文件用于后面搜索,其中参数是索引文件路径.
第 2步使用QueryParser将可读性较好查询语句(比如查询词lucene ,以及些高级方式lucene AND .net)转化为Lucene内部使用查询对象.
第 3步执行搜索.并将结果返回到hits集合.需要注意是Lucene并不是次将所有结果放入hits中而是采取次放部分方式.出于空间考虑.
最新评论