`
nything
  • 浏览: 141572 次
  • 性别: 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"));   
        }   
    }   
}  

 

分享到:
评论

相关推荐

    lucene的多种搜索2-SpanQuery

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

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

    这是一个实现Lucene全文搜索多种文件格式的一个小项目。包括对搜索到得内容中的搜索字进行高亮显示,就是实现像百度那样对搜索的关键字标红。

    基于lucene的搜索引擎总结

    Lucene搜索过程的核心类 IndexSearcher:用于搜索IndexWriter创建的索引 Term:用于搜索的一个基本单元包括了一对字符串元素,与Field相对应 Query :抽象的查询类 TermQuery:最基本的查询类型,用来匹配特定Field...

    Lucene实现多种高级搜索形式

    主要介绍了Lucene实现多种高级搜索形式的相关资料,需要的朋友可以参考下

    Lucene3.0做的文件搜索

    Lucene3.0做的文件搜索,支持多种文件格式

    Java毕业设计-[搜索链接]java(结合lucene)版的公交搜索系统_javaso.rar

    **Java公交搜索系统(基于Lucene)** 本资源是一个基于Java语言开发的公交搜索系统,结合了强大的全文搜索引擎Lucene,为用户提供高效、准确的公交线路查询服务。系统采用模块化设计,易于二次开发和定制,可广泛...

    毕业设计:ASP.NET基于Ajax+Lucene构建搜索引擎的设计和实现(源代码+论文)

    中文的意思多种多样,是很难用程序处理的。目前国内外都在做中文引擎,门户网站、非门户网站也都在进军搜索业,成立搜索门户。为了满足用户更深层次的需求,国内的搜索引擎也在不断的完善自己。如何将人类的知识和...

    java(结合lucene)版的公交搜索系统的实现.rar

    公交搜索系统是基于Java语言结合Lucene技术实现的一款智能公交信息查询系统,旨在为用户提供便捷的公交路线查询服务。系统具有以下主要功能: 路线搜索:用户可以根据出发地和目的地输入关键字进行公交路线搜索,...

    Lucene搜索引擎的设计与实现毕业设计论文.doc

    这种计算机程序,需要日夜不停地处于运行的状态,为的是可以尽可能的更快地搜集更多的新信息,这些信息的种类是多种多样的,包括有HTML格式、XML格式、字处理文档格式以及多媒体信息等等,此外搜索引擎还需要定期...

    开源企业搜索引擎SOLR的应用教程

    Solr 提供了层面搜索、命中醒目显示并且支持多种输出格式(包括 XML/XSLT 和 JSON 格式)。它易于安装和配置,而且附带了一个基于 HTTP 的管理界面。Solr已经在众多大型的网站中使用,较为成熟和稳定。Solr 包装并...

    Lucene 在知识库全文检索模块中所起的作用

    Lucene目前是应用最为广泛的全文检索架构,支持对TXT(HTML),PDF,WORD,JDBC等多种文本来源的全文索引创建及全文搜索。由于CIS系统中的信息存放方式主要有以上五种方式,所以可以通过Lucene大大提高CIS系统的信息定位...

    solr 企业搜索引擎教程

     拷贝域功能允许对一个域进行多种方式的索引,或者将多个域联合成一个可搜索的域  显式类型能够减少对域类型的猜测  能够使用外部的基于文件的终止词列表,同义词列表和保护词列表的配置 1.2.3 查询  拥有可...

    CavalliumDBEngine:具有RocksDB和Lucene Core的Java数据库引擎

    多种数据类型: 单值(单身) 地图(词典) 可组合的嵌套地图(深度词典) 可定制的数据序列化器 值编解码器 使用版本化编解码器进行写入时更新值版本控制 Apache Lucene Core索引库 快照 文件结构 排序 上升和...

    Solr详细学习笔记.doc

    Solr 是一种可供企业使用的、基于 Lucene 的搜索服务器,它支持层面搜索、命中醒目显示和多种输出格式。在这篇分两部分的文章中,Lucene Java的提交人 Grant Ingersoll 将介绍 Solr 并向您展示如何轻松地将其表现...

    Regain:一个基于Jakarta Lucene的Java搜索引擎-开源

    Regain是一个基于Jakarta Lucene的Java搜索引擎。 它提供了索引和搜索文件的多种格式(HTML,XML,doc(x),xls(x),ppt(x),oo,PDF,RTF,mp3,mp4,Java)。 TagLibrary使您可以轻松地将搜索结果集成到基于...

    Elasticsearch分布式搜索模型的实际应用小案例

    Elasticsearch是一个开源的分布式搜索和分析引擎,构建在Apache Lucene之上。它提供了一套强大的API和工具,可以实现分布式全文搜索、结构化和非结构化数据分析、日志存储和实时数据可视化等功能。 以下是一些...

    搜索引擎文本预处理

    本文在深入分析难过过搜索引擎基本原理、架构设计和核心技术的基础上,结合可扩展的scrapy框架、开源搜索引擎lucene的实现原理以及多种分词技术,设计并实现了一个可扩展可复用的小型搜索引擎文本预处理系统。

    elasticsearch-7.17.3-linux-x86-64.tar.gz

    Elasticsearch是一个基于Lucene库的分布式搜索引擎,它提供了一个可扩展的多租户全文搜索引擎。它是一个开源、分布式、RESTful搜索和分析引擎,可在各种用例中使用,包括文本搜索、结构化搜索、分析和日志分析。...

Global site tag (gtag.js) - Google Analytics