您的位置:首页 > 其它

Lucene入门

2015-05-11 17:26 225 查看
Lucene是一款非常棒的搜索引擎,而Lucene.NET是Lucene的.NET版本,本入门文档将以Lucene.NET 3.03为例。

1、介绍一下创建索引过程的核心类



Directory类描述了Lucene索引存放的位置,它是一个抽象类,它的子类负责具体指定索引的存储路径。例如FSDirectory类是负责真实文件系统的存储。

IndexWriter是写索引的核心类,该类负责创建新索引或者打开已有的索引,以及向索引中添加、更新、删除被索引文档。该类不负责读取和搜索索引。

Analyzer是分词器的抽象类,分词器用来对文本信息进行分析处理,例如:输入的索引信息是Let me see.经过分词器分析后,得到三个单词Let、me、see。当然有很多分词规则,视实际需要而定。待索引文本需要经过分词器分析后,才能提交给IndexWriter类创建索引。

Document代表待索引的文档信息,可以通俗的理解为一条记录或一篇文章,而Field就是组成Document的最小单位。例如,需要保存10条记录的数据,每个记录包含title和content两个信息项,那么一条记录就是一个Document对象,而title和content就是两个Field。

2、介绍一下搜索索引过程的核心类



Searcher是一个用于搜索由 IndexWriter 类创建的索引,它是个抽象类,其中,IndexSearcher是最常用的派生类,该类最简单的实现是接收单个Query和int topN计数作为参数,返回一个TopDocs对象。

Query是查询子类,它是一个抽象类。搜索指定单词或词组涉及到在项中包装它们,将项添加到查询对象,将查询对象传递到Searcher的搜索方法。

Term是搜索功能的基本单元。与Field对象类似,Term对象包含一对字符串的键值对,即域名和单词。

TopDocs是一个简单的指针容器,其包含前Searcher对象返回的搜索结果,搜索结果包含在其ScoreDoc数组属性中,还包含这些文档的DocId和浮点型分数。

3、下面给出添加索引和搜索的简单示例

添加索引

// 索引文件所在目录
private string INDEX_STORE_PATH = "D:\\SearchIndex";

private void CreateIndex()
{
// 创建Directory对象,指向索引文件保存的目录
using (Directory indexDirectory = FSDirectory.Open(new System.IO.DirectoryInfo(INDEX_STORE_PATH)))
{
// 定义使用标准分词器
using (Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30))
{
// 检查目录是否已经存在
bool iscreate = !Lucene.Net.Index.IndexReader.IndexExists(indexDirectory);

// 使用之前创建的分析器、目录来创建索引写对象
using (IndexWriter writer = new IndexWriter(indexDirectory, analyzer, iscreate, IndexWriter.MaxFieldLength.UNLIMITED))
{
// 向索引中添加文档
AddDocument(writer, "Visual Studio", "Visual Studio 2013");
AddDocument(writer, "Microsoft Co.", "Microsoft will publish Visual Studio 2013");

// 优化索引
writer.Optimize();
}
}
}
}

static void AddDocument(IndexWriter writer, string title, string content)
{
// 创建文档对象
Document document = new Document();

// 给文档添加Field对象
document.Add(new Field("title", title, Field.Store.YES, Field.Index.ANALYZED));
document.Add(new Field("content", content, Field.Store.YES, Field.Index.ANALYZED));

// 将文档添加到writer对象中,由其后代码创建索引
writer.AddDocument(document);
}

搜索索引

public void Search()
{
// 创建Directory对象,指向索引文件保存的目录
using (Directory indexDirectory = FSDirectory.Open(new System.IO.DirectoryInfo(INDEX_STORE_PATH)))
{
// 创建标准分词器
using (Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30))
{
// 创建索引搜索对象
using (IndexSearcher searcher = new IndexSearcher(indexDirectory, true))
{
// 查找title中包含visual单词的文档
Term t = new Term("title", "visual");
Query query = new TermQuery(t);
TopDocs docs = searcher.Search(query, 10);
Console.WriteLine(docs.TotalHits);

// 查找content中包含studio单词的文档
t = new Term("content", "studio");
docs = searcher.Search(new TermQuery(t), 10);
Console.WriteLine(docs.TotalHits);

}
}
}
}


参考:《Lucene in Action》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Lucene Lucene.NET