作?idior | |||||||||
2005-03-16 22:36 | |||||||||
本文介绍了什么是Lucene,Lucene能做什? 如何从一个文件夹下的所有txt文g中查扄定的? 本文围l该个实例介l了lucene.net的烦引的建立以及如何针对索引q行搜烦.最后还给出源代码供大家学? What’s Lucene Lucene的用者不需要深入了解有兛_文检索的知识,仅仅学会使用库中的一个类,你就Z的应用实现全文检索的功能. 不过千万别以为Lucene是一个象google那样的搜索引?Lucene甚至不是一个应用程?它仅仅是一个工?一个Library.你也可以把它理解Z个将索引,搜烦功能装的很好的一套简单易用的API.利用q套API你可以做很多有关搜烦的事?而且很方? What Can Lucene Do Lucene可以对Q何的数据做烦引和搜烦. Lucene不管数据源是什么格?只要它能被{化ؓ文字的Ş?可以被Lucene所分析利用.也就是说不管是MS word, Html ,pdfq是其他什么Ş式的文g只要你可以从中抽取出文字形式的内容就可以被Lucene所?你就可以用Lucene对它们进行烦引以及搜? How To Use Lucene --- A Simple Example Z入参数的文g夹下的所有txtcd的文件做索引,做好的烦引文件放入index文g? 然后在烦引的基础上对文gq行全文搜烦. 1. 建立索引IndexWriter writer = new IndexWriter("index", new StandardAnalyzer(), true); IndexDocs(writer, new System.IO.FileInfo(args[0])); writer.Optimize(); writer.Close(); IndexWriter是对索引q行写操作的一个类,利用它可以创Z个烦引对象然后往其中d文g.需要注意它q不是唯一可以修改索引的类.在烦引徏好后利用其他c还可以对其q行修改. 构造函数第一个参数是建立的烦引所要放的文件夹的名?W二个参数是一个分析对?主要用于从文本中抽取那些需要徏立烦引的内容,把不需要参与徏索引的文本内容去?比如L一些a the之类的常用词,q有军_是否大小写敏?不同的选项通过指定不同的分析对象控?W三个参数用于确定是否覆盖原有烦引的. W二步就是利用这个writer往索引中添加文?具体后面再说. W三步进行优? W四步关闭writer.
下面具体看看W二? public static void IndexDirectory(IndexWriter writer, FileInfo file){ if (Directory.Exists(file.FullName)) { String[] files = Directory.GetFileSystemEntries(file.FullName); // an IO error could occur if (files != null) { for (int i = 0; i < files.Length; i++) { IndexDirectory(writer, new FileInfo(files[i])); //q里是一个递归 } } } else if (file.Extension == ".txt") { IndexFile(file, writer); } }
private static void IndexFile(FileInfo file, IndexWriter writer) doc.Add(Field.Text("contents", new StreamReader(file.FullName))); writer.AddDocument(doc); 主要是两个函数一个用于处理文件夹(不是为文件夹建立索引),一个用于真正ؓ文g建立索引. 因此主要集中看一下IndexFileq个Ҏ.首先建立Document对象,然后为Document对象d一些属性Field.你可以把Document对象看成是虚拟文?来从此获取信?而Field则看成是描述此虚拟文件的元数?metadata). 其中Field包括四个cd:
最后将每一个Documentd到烦引当? 需要注意的是烦引不仅可以徏立在文gpȝ?也可以徏立在内存? 例如 IndexWriter writer = new IndexWriter("index", new StandardAnalyzer(), true); 在第一个参C是指定文件夹的名字而是使用Directory对象,q用它的子cRAMDirectory,可以将索引建立在内存当?
2. 对烦引进行搜?/STRONG> IndexSearcher indexSearcher= new IndexSearcher(indexDir);Query query = QueryParser.Parse(queryString, "contents",new StandardAnalyzer()); Hits hits = indexSearcher.Search(query); W一步利用IndexSearcher打开索引文g用于后面搜烦,其中的参数是索引文g的\? W二步用QueryParser可L较好的查询语句(比如查询的词lucene ,以及一些高U方式lucene AND .net)转化为Lucene内部使用的查询对? W三步执行搜?q将l果q回到hits集合.需要注意的是Luceneq不是一ơ将所有的l果攑օhits中而是采取一ơ放一部分的方?ZI间考虑. |