浏览 6416 次
精华帖 (0) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-25
最后修改:2009-06-25
下面是一个简单的例子 1.第一步建立索引 public class IndexDatebase { public static void main(String[] args) throws IOException { //创建保存索引的目录 String indexDir = "d://indexDir"; //创建Directory对象,具体的实现有FSDirectory,RAMDirectory,MMapDirectory,NIOFSDirector //FSDirectory表示索引是放到文件里面的,RAMDirectory是放到内存里面 //new RAMDirectory() Directory index = FSDirectory.getDirectory(new File(indexDir)); //创建索引IndexWriter对象,要四个参数,第一个是Directory对象,可以传File和String类型的path //new StandardAnalyzer()这个表示分析器,拆字用的,其它的分析器还有new ChineseAnalyzer(),new IK_CAnalyzer(),new CJKAnalyzer() //第三个参数代表是新建Index还是在原来上面的追加,true是新建 //表示分词的最大值,比如说new MaxFieldLength(2),就表示两个字一分,一般用IndexWriter.MaxFieldLength.LIMITED IndexWriter writer = new IndexWriter(indexDir,new StandardAnalyzer(),true,IndexWriter.MaxFieldLength.LIMITED); //IndexWriter writer = new IndexWriter(indexDir,new StandardAnalyzer(),true,new MaxFieldLength(20)); addDoc(writer,"法医鉴定称湖北石南海首死亡厨师系自杀"); addDoc(writer,"国务院建议珠海横琴岛划南海地交澳门管理"); addDoc(writer,"印尼在南海扣75名中国渔民 中方要求尽快释放南海南海南海南海南海南海南海"); addDoc(writer,"南海南海南海南海南海南海南海南海南海印尼在南海扣75南海南海名中国渔民 中方要求尽快释放"); addDoc(writer,"湖北洪湖一初南海中生被同学刺亡 亲属怒砸学校 "); //优化 writer.optimize(); //关闭流 writer.close(); } /** * 把Document对象加到Index里面 * @param w * @param value * @throws IOException */ private static void addDoc(IndexWriter w, String value) throws IOException { //新建的Document对象 Document doc = new Document(); //Field(String name, String value, Store store, Index index)表示保存,并建立索引,如果字段多的话,不要都建立索引 doc.add(new Field("title", value, Field.Store.YES,Field.Index.ANALYZED)); //加进去 w.addDocument(doc); } } 2.从索引中找出相应的对象 public class QueryLucene { public static void main(String[] args) throws ParseException, CorruptIndexException, IOException { //创建Query,QueryParser对象,根据Field建立的索引的KEY来搜,并设置要搜的内容 Query query = new QueryParser("title",new StandardAnalyzer()).parse("南海"); //可以理解成读Index对象,Directory,File,String都行 IndexSearcher indexSearch = new IndexSearcher(FSDirectory.getDirectory(new File("d://indexDir"))); //表示查出前四个 TopDocCollector collector = new TopDocCollector(4); //查找 indexSearch.search(query,collector); //ScoreDoc这个对象还不清楚,但是有多少结果,就有多少个这个对象 ScoreDoc[] hits = collector.topDocs().scoreDocs; for(int i=0;i<hits.length;++i) { //找到这个Document原来的索引值 int docId = hits[i].doc; System.out.println(docId); //根据这个值找到对象的Document Document d = indexSearch.doc(docId); System.out.println((i + 1) + ". " + d.get("title")); } } } 1.x,2.0和2.4是有一些区别的 比如说: 1 //1.x IndexWriter writer = new IndexWriter(indexPath, getAnalyzer(), true); //2.0,2.4 IndexWriter writer = new IndexWriter(indexPath, getAnalyzer(), true, IndexWriter.MaxFieldLength.UNLIMITED); 2. Field.Index.TOKENIZED 替换为 Field.Index.ANALYZED 没啥特殊的,改了一个名字而已 3. IndexWriter.flush(); 替换为 IndexWriter.commit(); 4.org.apache.lucene.search.Hits; 这个类将在3.0中被删除 新的使用方法在上面的例子中 5.Field的创建 在2.0+中 Field没了Keyword、UnIndexed、UnStored、Text这几个静态成员,只能用 Field(String, String, Store, Index)。 Keyword对应Field.Store.YES, Field.Index.UN_TOKENIZED, UnIndexed 对应Field.Store.YES, Field.Index.NO, UnStored对应Field.Store.NO, Field.Index.TOKENIZED, Text对应Field.Store.YES, Field.Index.TOKENIZED //2.0版本以上 Field(String name, byte[] value, Field.Store store) // Create a stored field with binary value. Field(String name, Reader reader) // Create a tokenized and indexed field that is not stored. Field(String name, Reader reader, Field.TermVector termVector) // Create a tokenized and indexed field that is not stored, optionally with storing term vectors. Field(String name, String value, Field.Store store, Field.Index index) // Create a field by specifying its name, value and how it will be saved in the index. Field(String name, String value, Field.Store store, Field.Index index, Field.TermVector termVector) // Create a field by specifying its name, value and how it will be saved in the index. Field.Store 表示“是否存储”,即该Field内的信息是否要被原封不动的保存在索引中。 Field.Index 表示“是否索引”,即在这个Field中的数据是否在将来检索时需要被用户检索到,一个“不索引”的Field通常仅是提供辅助信息储存的功能。 Field.TermVector 表示“是否切词”,即在这个Field中的数据是否需要被切词。 通常,参数用Reader,表示在文本流数据源中获取数据,数据量一般会比较大。像链接地址URL、文件系统路径信息、时间日期、人名、居民身份证、电话号码等等通常将被索引并且完整的存储在索引中,但一般不需要切分词,通常用上面的第四个构造函数,第三四个参数分别为Field.Store.YES, Field.Index.YES。而长文本通常可用第3个构造函数。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-06-26
对我这新手入门有点帮助,结合其它贴子的完整代码例子,现在理解起来有点眉目了
|
|
返回顶楼 | |
发表时间:2009-07-09
讲得还可以,适合入门。尤其是指出了2.0以上及2.0以前版本中的不同处。
|
|
返回顶楼 | |
发表时间:2009-07-09
最后修改:2009-07-09
Luc是一个好东西,对于基础的,目的性不是很强的搜索是一个非常优秀,干净,经济而且快速的解决方案,在Luc的邮件列表里面,我和几个老外一直在讨论Luc XA的问题,我们研究过comprass的Xa支持,非常薄弱,楼主有空可以一起来讨论。
|
|
返回顶楼 | |
发表时间:2009-07-09
dizdev 写道 Luc是一个好东西,对于基础的,目的性不是很强的搜索是一个非常优秀,干净,经济而且快速的解决方案,在Luc的邮件列表里面,我和几个老外一直在讨论Luc XA的问题,我们研究过comprass的Xa支持,非常薄弱,楼主有空可以一起来讨论。
呵呵,Lucene我没有真真细细的研究的。。。有困难的时候你给我指点下嘛 |
|
返回顶楼 | |
发表时间:2009-07-09
很想给你透个良好帖,很可惜,我的积分不足30分,无法投票。
|
|
返回顶楼 | |
发表时间:2009-07-20
把上面建立索引的代码我另存为了一个文件,在dos执行
d:/java/javac IndexDatease.java 提示以下错误信息 什么原因的,环境配置是按以下的方法做的 在这里输入检索内容环境变量还是附上CLASSPATH :.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\lucene-core-2.0.0.jar;%JAVA_HOME%\lib\lucene-demos-2.0.0.jarJAVA_HOME C:\Program Files\Java\jdk1.5.0path 加上 %JAVA_HOME%\bin 在网上下载了lucene 2.0版然后分别安装了jdk1.5和tomcat5.5建一个目录d:\lucenetest\index,在里面放一些文本文件和网页文件进入dos模式,输入命令:java org.apache.lucene.demo.IndexFiles d:\lucenetest\index 如:c:\>java org.apache.lucene.demo.IndexFiles d:\lucenetest\index 回车,这时会索引d:\lucenetest\index目录下的所有文件,包括子目录中的文件,并将索引文件写入:c:\index目录中(自动创建的,根据你的dos符起始路径,将在其下建index目录)。 输入命令:java org.apache.lucene.demo.SearchFiles 如:c:\>java org.apache.lucene.demo.SearchFiles 回车 测试了这种方法没有问题的 |
|
返回顶楼 | |