`
小嘴冰凉
  • 浏览: 457142 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

lucene常用搜索总结

阅读更多
lucene常用搜索总结2008-04-17 09:02转载一篇文章,在此只为搜藏和大家查询方便。

public class Test{    
        
     Analyzer analyzer = new StandardAnalyzer();    
        
     RAMDirectory directory = new RAMDirectory();    
        
    /** 
      * 创建索引 
      * 
      * @throws IOException 
      */   
    public void index() throws IOException{    
            
         IndexWriter indexWriter = new IndexWriter(directory,analyzer,true);    
            
         Document doc1 = new Document();    
            
         doc1.add(new Field("title","aaabbb",Store.YES,Index.TOKENIZED));    
            
         doc1.add(new Field("content","If you would like to help promote OpenOffice",Store.YES,Index.TOKENIZED));    
            
         doc1.add(new Field("time","2005",Store.YES,Index.TOKENIZED));    
            
         indexWriter.addDocument(doc1);    
            
         Document doc2 = new Document();    
            
         doc2.add(new Field("title","bbcc",Store.YES,Index.TOKENIZED));    
            
         doc2.add(new Field("content","sdfsdfsdfasdds",Store.YES,Index.TOKENIZED));    
            
         doc2.add(new Field("time","2007",Store.YES,Index.TOKENIZED));    
            
         indexWriter.addDocument(doc2);    
            
         indexWriter.optimize();    
            
         indexWriter.close();    
     }    
        
    // 按词条搜索    
    public void termSearcher() throws IOException{    
            
         IndexSearcher searcher = new IndexSearcher(directory);    
            
        // 查询title中包含aaa    
         Term term = new Term("title","aaa");    
            
         Query query = new TermQuery(term);    
            
         searcher.search(query);    
        
         searcher.close();    
     }    
   
    // 短语搜索    
    public void phraseSearcher() throws IOException{    
            
         IndexSearcher searcher = new IndexSearcher(directory);    
            
         PhraseQuery phraseQuery = new PhraseQuery();    
            
        // slop 两个项的位置之间允许的最大间隔,这里would和help中间只隔了like(to会被去掉),所以最大间隔设为1就能找到值    
        // 对于两个相连的关键词来说,无论坡度设为多少,都可以找到    
        // 对于不相连的词来说,当两个关键词相隔数小于坡度都可以找到,否则找不到    
         phraseQuery.setSlop(1);    
            
         phraseQuery.add(new Term("content","would"));    
            
         phraseQuery.add(new Term("content","help"));    
            
        // 如果将help放前面,would放后面,需要将would向后移动3个位置才能到help后面(to不算),所以要设为slop最少要设为3    
        // phraseQuery.add(new Term("content","help"));    
            
        // phraseQuery.add(new Term("content","would"));    
            
        // phraseQuery.setSlop(3);    
            
        // 短语的评分是根据项之间距离越小,评分越高,否则越小    
         Hits hits =   searcher.search(phraseQuery);    
            
         printResult(hits);    
            
         searcher.close();    
     }    
        
    // 通配符搜索 WildcardQuery       
    // 通配符包括’?’匹配一个任意字符和’*’匹配零个或多个任意字符,例如你搜索’use*’,你可能找到’user’或者’uses’:       
    public void wildcardSearcher() throws IOException{    
            
             IndexSearcher searcher = new IndexSearcher(directory);    
                
            // 与正则一样,*代表0个或多个字母,?代表0个或一个字母    
            // WildcardQuery与QueryParser不同的是:WildcardQuery的前缀可以为*,而QueryParser不行    
             WildcardQuery query = new WildcardQuery(new Term("content","a?bbb*"));    
                
             Hits hits = searcher.search(query);    
                
             printResult(hits);    
                
             searcher.close();    
     }    
        
    // 模糊搜索 FuzzyQuery    
    public void fuzzySearcher() throws IOException{    
                
             IndexSearcher search = new IndexSearcher(directory);    
                
            // OpenOffica虽然没被索引,但能找到相近的OpenOffice    
             FuzzyQuery query = new FuzzyQuery(new Term("content","OpenOffica"));    
                
             Hits hits = search.search(query);    
                
             printResult(hits);    
                
             search.close();    
     }    
        
    // 使用前缀PrefixQuery    
    public void prefixSearcher() throws IOException{    
            
             IndexSearcher search = new IndexSearcher(directory);    
                
            // 全部title前缀为a    
             PrefixQuery query = new PrefixQuery(new Term("title","b"));    
                
             Hits hits = search.search(query);    
                
             printResult(hits);    
                
             search.close();    
                
     }    
   
    // 范围搜索 RangeQuery    
    public void rangeSearcher() throws IOException{    
            
         IndexSearcher search = new IndexSearcher(directory);    
            
        // RangeQuery query = new RangeQuery(beginTime, endTime, false);    
        // 开始时间,结束时间,最后一个参数表示是否包含边界条件本身,如果为false    
         RangeQuery query = new RangeQuery(new Term("time","2005"),new Term("time","2007"),true);    
            
         Hits hits = search.search(query);    
            
         printResult(hits);    
            
         search.close();    
     }    
        
        
    // 与或搜索BooleanQuery    
    //BooleanClause用于表示布尔查询子句关系的类,包括:BooleanClause.Occur.MUST,BooleanClause.Occur.MUST_NOT,BooleanClause.Occur.SHOULD。有以下6种组合:    
   
    //1.MUST和MUST:取得连个查询子句的交集。    
   
    //2.MUST和MUST_NOT:表示查询结果中不能包含MUST_NOT所对应得查询子句的检索结果。    
   
    //3.MUST_NOT和MUST_NOT:无意义,检索无结果。    
   
    //4.SHOULD与MUST、SHOULD与MUST_NOT:SHOULD与MUST连用时,无意义,结果为MUST子句的检索结果。与MUST_NOT连用时,功能同MUST。    
   
    //5.SHOULD与SHOULD:表示“或”关系,最终检索结果为所有检索子句的并集。    
   
    public void booleanSearcher() throws IOException, ParseException{    
            
         IndexSearcher search = new IndexSearcher(directory);    
            
         QueryParser qp1 = new QueryParser("title",new StandardAnalyzer());    
                
         Query query1 = qp1.parse("aa*");    
                
         QueryParser qp2 = new QueryParser("title",new StandardAnalyzer());    
                
         Query query2 = qp2.parse("bb*");    
                
         BooleanQuery query = new BooleanQuery();    
                
        // 搜索结果的title的前双缀可以是aa,或bb    
         query.add(query1, BooleanClause.Occur.SHOULD);    
                
        // BooleanClause.Occur.MUST 必须    
        // BooleanClause.Occur.MUST_NOT 必须不是    
         query.add(query2, BooleanClause.Occur.SHOULD);    
            
         Hits hits = search.search(query);    
                
         printResult(hits);    
            
         search.close();    
            
     }    
        
   
    // 多关键的搜索 PhrasePrefixQuery    
    public void phrasePrefixSearcher() throws IOException{    
            
         IndexSearcher search = new IndexSearcher(directory);    
            
         PhrasePrefixQuery query = new PhrasePrefixQuery();    
            
        // 这里两项都有可能首先被匹配    
         query.add(new Term[]{new Term("content","would"),new Term("content","can")});    
            
        // 只有一项必须匹配    
         query.add(new Term("content","help"));    
            
        // If you would like to help promote OpenOffice    
        // can I help you    
        // slop因子的作用域为查询中的所有短语    
         query.setSlop(1);    
            
        // 匹配第一项为 would 或 can 第二项为help    
        // solp设置为1    
        // If you would like to help promote OpenOffice   除去if to 外,would与help的距离=1    
        // can I help you 的距离也=1   所以可以搜索出两条数据    
            
         Hits hits = search.search(query);    
            
         printResult(hits);    
            
         search.close();    
     }    
        
    // 在多个域上查询 MultiFieldQueryParser    
    public void multiFieldSearcher() throws IOException, ParseException{    
            
         IndexSearcher search = new IndexSearcher(directory);    
            
        // 默认情况下的方式为Occur.SHOULD    
        // titile可以匹配bb,content可以匹配you    
//       MultiFieldQueryParser.parse(new String[]{"bb","you"},new String[]{"title","content"}, analyzer);    
            
        // titile必须匹配bb,content不能匹配    
         Query query = MultiFieldQueryParser.parse( new String[]{"bb","you"},new String[]{"title","content"},new BooleanClause.Occur[]{Occur.MUST,Occur.MUST_NOT}, analyzer);    
            
        // title中必须包含bb   content不能有bb    
        // Query query = MultiFieldQueryParser.parse( "bb*",new String[]{"title","content"},new BooleanClause.Occur[]{BooleanClause.Occur.MUST,BooleanClause.Occur.MUST_NOT}, analyzer);    
            
         Hits hits = search.search(query);    
            
         printResult(hits);    
            
         search.close();    
     }    
        
    public void printResult(Hits hits) throws IOException{    
        for(int i = 0; i < hits.length(); i++){    
             Document d = hits.doc(i);    
             System.out.println(d.get("title"));    
             System.out.println(d.get("content"));    
             System.out.println(d.get("time"));    
         }    
     }    
 

分享到:
评论

相关推荐

    Lucene 搜索方法(布尔搜索)

    Lucene是一个高性能、全文本搜索库,它提供了强大的信息检索功能,而布尔搜索是其中一种常用且灵活的搜索方式,允许用户通过逻辑运算符(如AND、OR、NOT等)来组合多个查询条件,以精确地控制搜索结果。 描述部分...

    lucene搜索引擎配置详解

    Lucene是Apache软件基金会的一个开放源代码项目,它是一个全文搜索引擎库,提供了高效、可扩展的信息检索服务。本文将深入探讨Lucene搜索引擎的配置过程,包括文件加载、索引创建和搜索操作,帮助你理解其核心技术。...

    Lucene搜索引擎开发权威经典 光盘

    介绍解析不同格式数据(如Word、PDF等)的方法,包括常用的数据解析组件、Lucene自身的数据解析机制和Lius类库。第3部分:索引的高级知识。介绍了Lucene建立索引的过程,索引的查看和删除,索引的同步,索引的合并和...

    lucene4.4的搜索示例

    总结一下,`lucene4.4的搜索示例` 项目展示了 Lucene 4.4 如何实现高效的全文搜索功能。通过索引构建、查询解析、结果排序等步骤,我们可以创建一个用户友好的搜索界面,而 `TestDemo` 文件可能包含了实现这些功能的...

    Lucene.Net基本用法

    本文将详细介绍Lucene.Net的基本用法,包括环境搭建、基本应用流程(索引创建与文档搜索)、多字段搜索以及一些高级特性。 #### 二、环境搭建 在使用Lucene.Net之前,需确保已安装.NET Framework或.NET Core环境,...

    Lucene组件

    总结来说,Lucene组件是构建高效全文检索系统的基石,通过合理的配置和优化,能够大幅提升数据检索的效率。无论是小型项目还是大型企业级应用,Lucene都能提供可靠的文本搜索解决方案。在实际应用中,开发者应根据...

    Lucene 搜索引擎框架 基础实践.pdf

    3. **索引优化**:为了提高搜索性能,Lucene提供了多种索引优化策略,比如合并段落(Segment)、缓存常用项等。 4. **搜索排序**:Lucene支持多种排序方式,包括按照相关性、时间戳等进行排序,还可以通过设置权重来...

    基于Heritrix与Lucene的垂直搜索引擎研究

    ### 基于Heritrix与Lucene的垂直搜索引擎研究 #### 一、引言 随着互联网信息爆炸式增长,用户对于高效、精准获取信息的需求日益强烈。传统的搜索引擎虽然能够覆盖广泛的信息源,但在面对特定领域或精细需求时往往...

    lucene笔记

    ### Lucene知识点详解 #### 一、Lucene简介 **1.1 什么是Lucene** ...总结而言,Lucene是一个强大且灵活的全文检索引擎工具包,通过理解和掌握其核心概念和技术细节,我们可以有效地利用它来开发各种复杂的搜索应用。

    lucene-core-3.5.0.jar和junit4jar_xpgod

    总结来说,这个压缩包包含了一个用于构建全文搜索引擎的Apache Lucene核心库和一个包含多个版本的Junit测试框架的集合。开发者可以利用Lucene来处理文本数据的索引和搜索,同时用Junit来编写和运行单元测试,保证...

    lucene个人总结

    Lucene是一个高性能的全文检索引擎库,它提供了一套完整的解决方案来处理文本搜索的需求。Lucene的主要优点在于其高度的灵活性、易于集成和出色的性能表现。它可以方便地嵌入到任何应用程序中,为用户提供高效的全文...

    lucene3.0.2jar包

    总结,Lucene 3.0.2作为一个成熟的全文检索框架,为开发者提供了强大的搜索功能,同时也具备良好的可扩展性和定制性。无论是对于小型项目还是大型企业级应用,都能找到合适的解决方案。通过深入了解和熟练掌握Lucene...

    Lucene3总体图_建索引_查询_数据库索引

    Lucene是一款高性能、全功能的文本搜索引擎库,被广泛应用于多种场景下的文本检索。Lucene3相较于之前的版本,主要增加了对国际化的支持,引入了`message`包来处理与语言相关的功能。 #### 二、Lucene3模块介绍 ##...

    JAVA_Lucene_in_Action教程完整版

    - **分析常用文档格式**:针对PDF、Word等常见文档格式的分析方法,使这些文档能够被索引和搜索。 - **工具和扩展**:介绍一系列围绕Lucene开发的工具和扩展,帮助开发者提高开发效率。 - **Lucene的其他版本**:...

    lucene7.1.0所需jar包

    总结来说,"lucene7.1.0所需jar包"是构建高效、功能丰富的全文搜索引擎应用的基础。通过理解和利用这些jar包中的功能,开发者可以构建出满足各种需求的搜索解决方案,无论是在企业级应用还是小型项目中,都能发挥出...

    lucene3.5学习笔记

    以上是对 Lucene 3.5 的学习笔记总结,涵盖了从索引构建到查询操作的基础和高级功能。通过深入理解这些概念和实践应用,可以帮助开发者更好地利用 Lucene 和 Solr 构建高效且功能强大的搜索应用。

    lucene.net.analysis.cn

    总结,lucene.net.analysis.cn是Lucene.NET针对中文信息检索的重要组成部分,通过有效的分词处理,提升了中文文本检索的准确性和效率。掌握这个模块的使用,能帮助开发者在.NET平台上构建出更优秀的搜索引擎系统。

Global site tag (gtag.js) - Google Analytics