/// <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; }