`
liuxinglanyue
  • 浏览: 557474 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

lucene 3.0学习笔记(2)-使用索引查询(转)

阅读更多

上一篇中我们已经建好了索引,下面该使用索引来做正事了。 



这是一段实施基本搜索功能的代码示例: 

Java代码 
  1. Directory dir = FSDirectory.open(new File("index")));  
  2. IndexSearcher searcher = new IndexSearcher(dir, true);  
  3. Query q = new TermQuery(new Term("contents""java"));  
  4. TopDocs hits = searcher.search(q, 10);  
  5. searcher.close();  
使用索引进行查询的主要步骤: 

1、打开已有的索引,创建IndexSearcher对象 

2、指定查询用到的Field和查询字符串,创建TermQuery 

3、使用IndexSearcher进行查询,查询结果以TopDocs对象返回。在这里search方法的第二个参数指定返回前N个记录。 



主要对象说明: 

1、Term 

     Term是查询使用的基本单位,对应与在索引中使用的Field类。可以将其理解为一个map,其中key为索引中Field name,value为查询字符串。 

     当查询字符串为一个单词的情况下,不会有任何问题;但是当需要查询查询字符串为多个单词或是一句话的时候就会查不出来。这个主要原因是,在建立索引时我们对Field中的内容进行了分词,但在查询时,对查询字符串没有做分词,整个做为一个单词处理,当然查不到了。 

     要解决这个问题,针对上面的例子,只需要去掉new TermQuery这句,换成下面的代码: 
//处理输入的查询字符串 
Java代码 
  1. Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT);  
  2. QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, "java", analyzer);  
  3. Query query = parser.parse(queries);  


这里需要保证使用的analyzer与建立索引时用的一样即可。new QueryParser的第二个参数就是查询字符串。 

     我们用query.toString()可以看到转化后的Term内容。 

•当查询字符串="java"时,query.toString()=contents:java (前面为field name,后面为查询内容) 
•当查询字符串="java and system"时,query.toString()=contents:java contents:system。可见已经被做了分词,同时去掉了连接字and 
2、TopDocs 

     此类封装了返回的符合条件的记录,其中: 

•totalHits为符合条件的记录总数; 
•scoreDocs为符合条件记录的数组,不过里面只记录了Document的ID。Document的实际内容,需通过IndexSearcher取docID对应的Document才能得到。 
     需要注意-若设置在search方法中设置了返回记录数为N,则scoreDocs最多只会包含前N个文档;但是totalHits会返回匹配的总数量(类似google中显示的匹配的总页面数量)。scoreDocs.length可能不等于totalHits,做scoreDocs遍历时,直接用totalHits做为数组大小用的,容易引起bug! 



     另外取符合条件Document实际内容的代码如下: 

//显示查询结果,字段包括:路径、修改时间 
Java代码 
  1. private void printDocs(Searcher searcher, TopDocs docs)  
  2.     {  
  3.         try  
  4.         {  
  5.             System.out.println("Find " + docs.totalHits + " files!");  
  6.             ScoreDoc[] sd = docs.scoreDocs;  
  7.             for (int i = 0; i < sd.length; i++)  
  8.             {  
  9.                 Document doc = searcher.doc(sd[i].doc);  
  10.                 System.out.println("Path:" + doc.get("path") + "; modified:" + doc.get("modified"));  
  11.             }  
  12.         }  
  13.         catch(Exception ex)  
  14.         {  
  15.             System.out.println(ex.getMessage());  
  16.         }  
  17.     }  



DEMO: 

Java代码 
  1. public class Indexer {  
  2.   
  3.     /** 
  4.      * @param args 
  5.      * @throws IOException  
  6.      */  
  7.     public static void main(String[] args) throws IOException {  
  8.         //保存索引文件的地方  
  9.         String indexDir = "c:\\indexDir";  
  10.         //将要搜索TXT文件的地方  
  11.         String dateDir = "c:\\dateDir";  
  12.         IndexWriter indexWriter = null;  
  13.         //创建Directory对象  
  14.         Directory dir = new SimpleFSDirectory(new File(indexDir));  
  15.         //创建IndexWriter对象,第一个参数是Directory,第二个是分词器,第三个表示是否是创建,如果为false为在此基础上面修改,第四表示表示分词的最大值,比如说new MaxFieldLength(2),就表示两个字一分,一般用IndexWriter.MaxFieldLength.LIMITED   
  16.         indexWriter = new IndexWriter(dir,new StandardAnalyzer(Version.LUCENE_30),true,IndexWriter.MaxFieldLength.UNLIMITED);  
  17.         File[] files = new File(dateDir).listFiles();  
  18.         for (int i = 0; i < files.length; i++) {  
  19.             Document doc = new Document();  
  20.             //创建Field对象,并放入doc对象中  
  21.             doc.add(new Field("contents"new FileReader(files[i])));   
  22.             doc.add(new Field("filename", files[i].getName(),   
  23.                                 Field.Store.YES, Field.Index.NOT_ANALYZED));  
  24.             doc.add(new Field("indexDate",DateTools.dateToString(new Date(), DateTools.Resolution.DAY),Field.Store.YES,Field.Index.NOT_ANALYZED));  
  25.             //写入IndexWriter  
  26.             indexWriter.addDocument(doc);  
  27.         }  
  28.         //查看IndexWriter里面有多少个索引  
  29.         System.out.println("numDocs"+indexWriter.numDocs());  
  30.         indexWriter.optimize();  
  31.         indexWriter.close();  
  32.           
  33.     }  
  34.   
  35. }  


Java代码 
  1. public class Searcher {  
  2.   
  3.     public static void main(String[] args) throws IOException, ParseException {  
  4.         //保存索引文件的地方  
  5.         String indexDir = "c:\\indexDir";  
  6.         Directory dir = new SimpleFSDirectory(new File(indexDir));  
  7.         //创建 IndexSearcher对象,相比IndexWriter对象,这个参数就要提供一个索引的目录就行了  
  8.         IndexSearcher indexSearch = new IndexSearcher(dir);  
  9.         //创建QueryParser对象,第一个参数表示Lucene的版本,第二个表示搜索Field的字段,第三个表示搜索使用分词器  
  10.         QueryParser queryParser = new QueryParser(Version.LUCENE_30,  
  11.                 "contents"new StandardAnalyzer(Version.LUCENE_30));  
  12.         //生成Query对象  
  13.         Query query = queryParser.parse("liliugen");  
  14.         //搜索结果 TopDocs里面有scoreDocs[]数组,里面保存着索引值  
  15.         TopDocs hits = indexSearch.search(query, 10);  
  16.         //hits.totalHits表示一共搜到多少个  
  17.         System.out.println("找到了"+hits.totalHits+"个");  
  18.         //循环hits.scoreDocs数据,并使用indexSearch.doc方法把Document还原,再拿出对应的字段的值  
  19.         for (int i = 0; i < hits.scoreDocs.length; i++) {  
  20.             ScoreDoc sdoc = hits.scoreDocs[i];  
  21.             Document doc = indexSearch.doc(sdoc.doc);  
  22.             System.out.println(doc.get("filename"));              
  23.         }         
  24.         indexSearch.close();  
  25.     }  
  26. }  

分享到:
评论

相关推荐

    适合lucene3.0用的paoding-analysis的jar包

    然后,开发者需要在Lucene的索引创建和查询过程中,替换默认的Analyzer为PaodingAnalyzer,以便利用其中文分词能力。 集成步骤大致如下: 1. 引入Paoding-Analysis和Spring兼容的jar包到项目类路径。 2. 在配置文件...

    lucene3.0 lucene3.0

    lucene3.0 lucene3.0 lucene3.0 lucene3.0 lucene3.0

    Lucene3.0之查询类型详解

    【Lucene3.0查询类型详解】 在Lucene3.0中,查询处理是一个关键环节,涉及多种查询方式和理论模型。以下是对这些概念的详细解释: 1. **查询方式**: - **顺序查询**:是最简单的查询方式,直接遍历索引,效率较...

    lucene3.0学习笔记(三)与paoding整合

    《Lucene 3.0 学习笔记(三)与Paoding整合》 在深入了解Lucene 3.0的过程中,我们经常会遇到如何将其与第三方工具进行整合的问题,以提升搜索性能和用户体验。这篇学习笔记主要关注的是将Lucene 3.0与Paoding搜索...

    lucene3.0庖丁+索引搜索程序

    2. 搜索索引:当用户提交查询时,查询解析器会生成查询对象,然后使用IndexSearcher进行搜索,找到匹配的文档。 3. 结果处理:最后,返回搜索结果,通常包括文档ID、分数及相关信息,可以进一步按需展示给用户。 ...

    Lucene3.0特性,Lucene3.0特性

    2. **Java版本要求的提升**:3.0放弃了对Java 1.4的支持,转而全面支持Java 1.5及以上版本,以及ant 1.7.0,进一步推动了Lucene对现代开发环境的适应性。 3. **核心代码的变化**:如`IOUtils`中的`isLocked()`方法...

    lucene 3.0 API 中文帮助文档 chm

    lucene 3.0 API中文帮助,学习的人懂得的

    Lucene3.0创建索引

    本篇文章将详细介绍如何使用Lucene3.0来创建索引,并通过一个具体的例子来演示整个过程。 #### 一、Lucene3.0简介 Lucene是一款高性能、全功能的全文搜索引擎库。它为开发者提供了构建搜索应用所需的所有基本工具...

    lucene3.0-highlighter.jar

    lucene3.0-highlighter.jar lucene3.0的高亮jar包,从lucene3.0源码中导出来的

    lucene-analyzers-smartcn-7.7.0-API文档-中文版.zip

    赠送jar包:lucene-analyzers-smartcn-7.7.0.jar; 赠送原API文档:lucene-analyzers-smartcn-7.7.0-javadoc.jar; 赠送源代码:lucene-analyzers-smartcn-7.7.0-sources.jar; 赠送Maven依赖信息文件:lucene-...

    Lucene 3.0 原理与代码分析完整版

    通过对《Lucene 3.0 原理与代码分析完整版》的学习,开发者不仅可以理解Lucene的工作原理,还能掌握如何定制化Lucene以满足特定需求,从而在实际项目中充分利用其强大功能。这本书是深入研究和应用Lucene不可或缺的...

    lucene3.0核心jar包

    8. **多线程支持**:Lucene 3.0 允许在多线程环境中使用,开发者可以利用并发特性来提高索引和搜索的速度,但需要注意同步问题,避免数据竞争。 9. **扩展性**:Lucene 3.0 提供了丰富的API,允许开发者自定义分词...

    lucene3.0使用介绍及实例

    doc.add(new Field("title", "Lucene 3.0使用介绍", Field.Store.YES, Field.Index.ANALYZED)); doc.add(new Field("content", "这是一个关于Lucene 3.0的实例教程。", Field.Store.YES, Field.Index.ANALYZED)); ...

    lucene-analyzers-common-6.6.0-API文档-中文版.zip

    赠送jar包:lucene-analyzers-common-6.6.0.jar; 赠送原API文档:lucene-analyzers-common-6.6.0-javadoc.jar; 赠送源代码:lucene-analyzers-common-6.6.0-sources.jar; 赠送Maven依赖信息文件:lucene-...

    lucene-core-7.7.0-API文档-中文版.zip

    赠送jar包:lucene-core-7.7.0.jar; 赠送原API文档:lucene-core-7.7.0-javadoc.jar; 赠送源代码:lucene-core-7.7.0-sources.jar; 赠送Maven依赖信息文件:lucene-core-7.7.0.pom; 包含翻译后的API文档:lucene...

    lucene3.0 实例

    索引是 Lucene 的关键,它将文本数据转换为倒排索引,以便快速查找匹配查询的文档。最后,搜索过程是基于查询对象进行的,用户输入查询字符串,Lucene 返回相关的文档列表。 在给定的实例中,有两个主要的类:一个...

    lucene3.0资料包

    总结,Lucene3.0是全文检索领域的一个强大工具,其索引构建、分词、查询解析、搜索算法等功能在当时具有很高的技术水平,并且具有高度的灵活性和扩展性。通过深入学习和应用Lucene3.0,开发者可以构建出高效、智能的...

    Lucene3.0全文信息检索

    3. **内存管理优化**:Lucene 3.0改进了内存使用策略,降低了内存占用,同时提升了索引和搜索的性能。 4. **查询性能提升**:通过引入更智能的缓存机制,以及对查询执行路径的优化,使得复杂查询的响应时间缩短。 ...

Global site tag (gtag.js) - Google Analytics