Lucene之创建索引

      Lucene用来建搜索引擎要解决四个问题:抓取数据、解析数据、创建索引和执行搜索。

      抓取数据和解析数据的知识独立于Lucene,而创建索引就如同建立文集,文集里面有许多文章,每一篇文章包括标题、内容、作者名称、写作时间等信息。我们采用这种方式写文集:

首先为每一篇文章添加标题、内容、写作时间等信息,从而写好每一篇文章,然后将每一篇文章添加到书里面去。这样问及就写好了。

创建索引的过程如下:

①  建立索引器IndexWriter,这相当于一本书的框架。

②  建立文档对象Docment,这相当于一篇文章。

③  建立信息字段对象Field,这相当于一篇文章中的不同信息(标题、正文等)。

④  将Field添加到Document里面。

⑤  将Document添加到IndexWriter里面。

⑥  关闭索引器IndexWriter。

 

 

创建索引有三个基本步骤:

①  创建Field,将文章的不同信息包装起来。

②  将多个Field组织到一个Document里面,这样就完成了对一篇文章的包装。

③  将多个Document组织到一个IndexWriter里面,也就是将多篇文章组装起来,最终形成索引。

 

一、创建Field:

创建Field的方法很多,下面是最常用的方法:

Field field=new Field(Field名称,Field内容,存储方式,索引方式);

这四个参数的意义如下:

①  Field名称就是为Field起的名字,类似数据表的字段名称。

②  Field内容就是该Field的内容,类似数据表的字段内容。

③  存储方式包括三种:

不存储(Field.Store.No)、完全存储(Field.Store.YES)和压缩存储(Field.Store.COMPRESS)

一般情况下不担心索引太大的话,可以都使用完全存储的方式,但出于对性能的考虑,索引文件的内容是越小越好,因此,如果Field的内容很少就采用完全存储(如标题),如果Field的内容很多就采用不存储或者压缩存储的方式(如正文)。

④  索引方式包括四种:

不索引(Field.Index.No),索引但不分析(Field.Index.NO_NORMS)、索引但不分词(Field.Index.UN_TOKENIZED)、分词并索引(Field.Index.TOKENIZED)

通常我们会按照标题和全文进行模糊搜索,这类需要进行模糊搜索的字段就用Field.Index.TOKENIZED。通常我们会按照作者名称进行模糊搜索,需要进行精确搜索的字段就用Field.Index.UN_TOKENIZER。对于那些只需要跟着搜索结果显示出来却不需要按照其内容进行搜索的字段,使用Field.Index.NO。

 

二、创建Document

Document doc=new Document();//这个方法创建一个不包含任何Field的空Document。

如果想把Field添加到Document里面,只需要使用add方法,如:doc.add(field);

重复使用这个方法就可以将多个Field加入到一个Document里面。

 

三、创建IndexWriter

创建IndexWriter方法很多,下面是最常用的方法:

IndexWriter writer=new IndexWriter(存储索引的路径,分析器的实例);

这两个参数的含义如下:

① 储索引的路径就是索引被存储在硬盘上的物理路径,如:c:\myDir等。

② 分析器实例。分析器用来做词法分析的,包括英文分析器和中文分析器等。要根据索要建立缩影的文件情况选择恰当的分析器,常用的有StandardAnalyzer(标准分析器)、CJKAnalyzer(二分法分词器)、ChineseAnalyzer(中文分析器)和FrenchAnalyzer(法语分析器)等,也可以根据自己的需要去编写分析器,从而处理不同的语言文字。

通过建立IndexWriter,就把逻辑索引和物理索引联系起来了,这样就可以很方便地建立索引,如IndexWriter writer=new IndexWriter(”c:/my/index”,newCJKAnalyzer());

 

使用new IndexWriter()方法建立起来的是一个空的索引器,要把Document添加到索引中来,需要使用addDocument方法,如:

Writer.addDocument(doc);

 

类似于向Document中添加Field,重复执行这个操作就可以向一个IndexWriter中添加多个Field.

最后在索引创建完成的时候要使用close方法关闭索引器:

Writer.close();


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C# Lucene.Net创建索引的步骤: 1.添加Lucene.Net的引用 在Visual Studio中,右键单击项目并选择“管理NuGet程序包”。在搜索框中搜索“Lucene.Net”,然后安装Lucene.Net。 2.创建索引 ```csharp using Lucene.Net.Analysis.Standard; using Lucene.Net.Documents; using Lucene.Net.Index; using Lucene.Net.Store; using System.IO; // 创建索引 public void CreateIndex(string indexPath, string dataPath) { // 创建分析器 var analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30); // 创建索引存储目录 var directory = FSDirectory.Open(new DirectoryInfo(indexPath)); // 创建索引写入器 var writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED); // 读取数据文件 var lines = File.ReadAllLines(dataPath); // 遍历数据文件中的每一行 foreach (var line in lines) { // 创建文档 var doc = new Document(); // 添加字段 doc.Add(new Field("content", line, Field.Store.YES, Field.Index.ANALYZED)); // 将文档写入索引 writer.AddDocument(doc); } // 关闭索引写入器 writer.Dispose(); } ``` 3.使用索引 ```csharp using Lucene.Net.Analysis.Standard; using Lucene.Net.QueryParsers; using Lucene.Net.Search; using Lucene.Net.Store; using System.IO; // 使用索引 public void SearchIndex(string indexPath, string queryStr) { // 创建分析器 var analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30); // 创建索引存储目录 var directory = FSDirectory.Open(new DirectoryInfo(indexPath)); // 创建索引搜索器 var searcher = new IndexSearcher(directory, true); // 创建查询解析器 var parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, "content", analyzer); // 解析查询字符串 var query = parser.Parse(queryStr); // 执行查询 var hits = searcher.Search(query, null, 10, Sort.RELEVANCE).ScoreDocs; // 遍历查询结果 foreach (var hit in hits) { // 获取文档 var doc = searcher.Doc(hit.Doc); // 输出文档内容 Console.WriteLine(doc.Get("content")); } // 关闭索引搜索器 searcher.Dispose(); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值