`
nything
  • 浏览: 145546 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

lucene的多种搜索

阅读更多

lucene的搜索相当强大,它提供了很多辅助查询类,各自完成一种特殊的查询,也可以相互组合使用,来完成一些复杂的操作.

 

 

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 divfixSearcher() 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"));   
        }   
    }   
}  

 

分享到:
评论

相关推荐

    lucene3.6 搜索例子

    《Lucene 3.6 搜索实例解析》 Apache Lucene 是一个开源全文搜索引擎库,为开发者提供了在Java应用程序中实现高效、可扩展的搜索功能的工具。在本篇文章中,我们将深入探讨Lucene 3.6版本中的搜索功能,通过实例...

    lucene 高级搜索项目

    Lucene支持多种查询类型,如TermQuery、PhraseQuery、BooleanQuery等,可以组合使用以满足复杂查询需求。 **6. Lucene 插件和扩展** `05_lucene_plugin`可能讨论了Lucene的扩展机制。Lucene允许开发人员编写自定义...

    Lucene全文搜索_LuceneJava全文搜索_

    在搜索阶段,Lucene支持多种查询类型,如标准查询(Standard Query)、短语查询(Phrase Query)、布尔查询(Boolean Query)以及模糊查询。模糊查询允许用户输入近似或部分关键词,系统会尝试找到与之最接近的匹配...

    基于Lucene的搜索引擎

    3. **查询解析**:用户输入的查询字符串被解析成一系列的查询项,Lucene提供多种查询语法,如布尔运算符(AND, OR, NOT)、短语查询、范围查询等。 4. **评分机制**:Lucene使用TF-IDF(Term Frequency-Inverse ...

    利用Lucene 实现高级搜索

    ### 利用Lucene实现高级搜索的关键知识点 #### Lucene简介 Lucene是Apache软件基金会下的一个开源全文检索库,提供了高性能的文本搜索能力。它不仅适用于网站的搜索功能,还可以用于任何需要文本搜索的应用场景,如...

    基于lucene的搜索引擎regain安装版

    **基于Lucene的搜索引擎Regain安装指南** Regain是一个基于Apache Lucene的全文搜索引擎,它提供了高级的搜索功能,能够帮助用户快速、准确地在大量数据中查找所需信息。Lucene是Java语言实现的一个开源信息检索库...

    实现多种文件格式的Lucene全文搜索功能的dom实例

    本项目“实现多种文件格式的Lucene全文搜索功能的DOM实例”专注于利用Lucene来处理不同类型的文件,并且实现了搜索结果中关键词的高亮显示,类似于百度等搜索引擎的效果。 首先,我们需要理解Lucene的基本概念。...

    Lucene时间区间搜索

    Lucene支持多种查询类型,例如TermQuery、PrefixQuery、RangeQuery等。在时间区间搜索中,我们通常会用到RangeQuery。RangeQuery允许我们在指定的范围内查找匹配的文档,包括或者不包括边界。例如,我们可以创建一个...

    lucene的多种搜索2-SpanQuery

    java类 博文链接:https://callan.iteye.com/blog/154251

    精通ajax+lucene做搜索引擎

    - **核心功能**:Lucene提供了强大的文本搜索功能,支持多种查询语法,并能够处理大量的文档集合。它通过建立索引来加速文档检索过程,使得搜索速度非常快。 - **集成方式**:在使用Ajax构建的前端界面中集成Lucene...

    lucene搜索引擎项目

    Lucene提供了强大的查询解析器,能够处理多种查询语法,包括布尔查询、短语查询、近似查询等。查询执行阶段,Lucene会使用倒排索引快速找到匹配的文档,并根据查询权重对结果进行排序。 4. **优化与更新** Lucene...

    lucene高级搜索进阶项目_03

    Lucene支持多种查询类型,如TermQuery、WildcardQuery、PhraseQuery等。在项目中,我们可能会探讨如何组合这些查询以实现布尔逻辑,比如AND、OR、NOT操作,以及如何利用Boosting来调整某些查询的优先级。同时,我们...

    基于LUCENE的搜索引擎的设计与实现源代码

    LUCENE提供多种预定义的分析器,如标准分析器(StandardAnalyzer),同时也支持自定义分析器。 4. 索引(Index):存储经过分析的关键词,用于快速查找匹配的文档。LUCENE采用倒排索引结构,以提高查询速度。 5. ...

    lucene_heritrix 搜索引擎

    Lucene支持多种语言,包括中文,通过使用合适的分词器如IK Analyzer或jieba分词,可以对中文文本进行有效的索引和搜索。此外,Lucene还提供了倒排索引技术,这是一种高效的检索机制,使得搜索速度非常快。 Heritrix...

    全文搜索-Lucene

    **全文搜索-Lucene** Lucene 是一个开源的全文搜索引擎库,由 Apache 软件基金会维护。它提供了高效的、可扩展的全文检索功能,被广泛应用于各种 Web 应用、内容管理系统以及数据挖掘项目中。Lucene 实现了索引和...

    lucene3.0.3搜索的使用示例

    Lucene 3.0.3提供了多种内置分析器,如StandardAnalyzer,它处理英文文本,移除停用词和标点符号。 4. **Document** 和 **Field** 类:Document是Lucene中的基本数据结构,代表一个要被索引的完整文档。每个文档...

    开发自己的搜索引擎 lucene + heritrix

    总结来说,开发一个基于Lucene和Heritrix的搜索引擎是一个涉及多种技术和步骤的复杂过程。理解Lucene和Heritrix的工作原理和使用方法,以及如何将两者结合构建有效的搜索引擎,对于完成这项工作至关重要。同时,针对...

    Java搜索引擎 Lucene

    2. **分词处理**:Lucene支持多种分词器,可以对文本进行分析,将句子拆分成可搜索的关键词。 3. **倒排索引**:Lucene使用倒排索引技术,通过构建索引表,使得搜索效率大大提高。 4. **多字段搜索**:允许用户对...

    lucene 实现类似百度搜索

    通过 Lucene,开发者可以轻松地在自己的应用程序中集成高级的搜索功能,支持多种语言,包括中文、英文、日文、俄文和德文。本文将深入探讨如何使用 Lucene 来构建一个类似百度的搜索引擎。 ### 一、Lucene 基本概念...

    C#调用Lucene.net搜索txt文档和控制台输入

    Lucene.NET是Apache Lucene项目的一个.NET版本,它是一个全文搜索引擎库,提供了强大的搜索功能,支持多种数据源。在C#中,我们可以利用Lucene.NET进行索引构建、查询解析和结果检索,以实现快速准确的文本搜索。 ...

Global site tag (gtag.js) - Google Analytics