/// <summary>
/// 创建索引
/// </summary>
/// <param name="fields">Field域集合,也可以是其他结构</param>
/// <param name="route"></param>
public void CreateIndex(Dictionary<string, string> fields, string route)
{
//创建索引操作器配置项,包含Lucene版本定义和Analyzer分析器定义。此处使用4.8版本和标准分析器。
IndexWriterConfig config = new IndexWriterConfig(LuceneVersion.LUCENE_48, new StandardAnalyzer(LuceneVersion.LUCENE_48));
//定义索引存储路径。此处使用磁盘文件存储,存储位置为项目运行目录下的“Lucene”
Lucene.Net.Store.Directory dir = new NIOFSDirectory("Lucene/"+route);
//实例化索引操作器。此处构造函数为上面定义索引存储路径和配置项。
using (IndexWriter writer = new IndexWriter(dir, config))
{
//创建文档
Document doc = new Document();
foreach (var field in fields)
{
//创建数据域。此处使用了StringField域。此外还能用Int32Field、DoubleField等。
Field f = new StringField(field.Key, field.Value, Field.Store.YES);
//添加数据域至文档
doc.Add(f);
}
//索引操作器增加文档
writer.AddDocument(doc);
//刷新索引
writer.Flush(true, true);
}
}
/// <summary>
/// 关键词查询
/// </summary>
/// <param name="keyword">关键词</param>
/// <param name="field">域</param>
/// <returns></returns>
public Dictionary<Document,float> SearchIndex(string keyword,string field)
{
//定义返回数据结构
Dictionary<Document, float> dic = new Dictionary<Document, float>();
//打开索引存储路径
Lucene.Net.Store.Directory dir = FSDirectory.Open("Lucene");
//实例化索引读取器
using (Lucene.Net.Index.DirectoryReader reader = DirectoryReader.Open(dir))
{
//实例化索引检索器
IndexSearcher searcher = new IndexSearcher(reader);
//创建查询生成器。此处使用了基础的查询生成器QueryPaser,构造函数参数为版本、查询的域、分析器。
//也可以使用MultiFieldQueryPaser多域查询生成器。
QueryParser parser = new QueryParser(LuceneVersion.LUCENE_48, field,
new StandardAnalyzer(LuceneVersion.LUCENE_48));
//生成查询对象。
Query query = parser.Parse(keyword);
//检索并返回结果。检索条件为返回符合程度最高的前10条。
TopDocs matches = searcher.Search(query, 10);
//遍历检索结构,构造需要返回的数据结构
foreach (var match in matches.ScoreDocs)
{
//获取匹配结果中的文档
Document doc = searcher.Doc(match.Doc);
//获取匹配文档的分数
dic.Add(doc,match.Score);
}
}
return dic;
}
//添加索引示例
public void AddDemo()
{
SearchManager searcher = new SearchManager();
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("Name", "南京工大建设监理咨询有限公司");
dic.Add("Address", "南京市中山北路200号");
searcher.CreateIndex(dic, "data");
}
//查询示例
public List<string> SearchDemo(string key,string field)
{
SearchManager searcher = new SearchManager();
List<string> list = new List<string>();
Dictionary<Document, float> docs = searcher.SearchIndex(key, field);
foreach (var doc in docs)
{
string tmp = string.Format("doc:{0},score:{1}", doc.Key.ToString(), doc.Value.ToString());
list.Add(tmp);
}
return list;
}