`

<转>Lucene基本使用介绍

 
阅读更多
今天用了下Lucene,发现网上虽然也有不少介绍它的文档,不过很多都偏向介绍概念呀、设计或者是一些更为深入的东西,对于其入门使用的介绍性的文档并不多,就写了这么一篇。


Lucene基本使用介绍

本文的目的不在于对Lucene的概念和设计这些进行介绍,仅在于介绍怎么样去使用Lucene来达到自己想要的几种常见的全文检索的需求,如果想深入了解Lucene的话本文不会带给你什么收获的。看完本文后想更深入的了解Lucene请访问:http://lucene.apache.org

一.  概述
随着系统信息的越来越多,怎么样从这些信息海洋中捞起自己想要的那一根针就变得非常重要了,全文检索是通常用于解决此类问题的方案,而Lucene则为实现全文检索的工具,任何应用都可通过嵌入它来实现全文检索。
二.  环境搭建
从lucene.apache.org上下载最新版本的lucene.jar,将此jar作为项目的build path,那么在项目中就可以直接使用lucene了。
三.  使用说明
3.1.       基本概念
这里介绍的主要为在使用中经常碰到一些概念,以大家都比较熟悉的数据库来进行类比的讲解,使用Lucene进行全文检索的过程有点类似数据库的这个过程,table---à查询相应的字段或查询条件----à返回相应的记录,首先是IndexWriter,通过它建立相应的索引表,相当于数据库中的table,在构建此索引表时需指定的为该索引表采用何种方式进行构建,也就是说对于其中的记录的字段以什么方式来进行格式的划分,这个在Lucene中称为Analyzer,Lucene提供了几种环境下使用的Analyzer:SimpleAnalyzer、StandardAnalyzer、GermanAnalyzer等,其中StandardAnalyzer是经常使用的,因为它提供了对于中文的支持,在表建好后我们就需要往里面插入用于索引的记录,在Lucene中这个称为Document,有点类似数据库中table的一行记录,记录中的字段的添加方法,在Lucene中称为Field,这个和数据库中基本一样,对于Field Lucene分为可被索引的,可切分的,不可被切分的,不可被索引的几种组合类型,通过这几个元素基本上就可以建立起索引了。在查询时经常碰到的为另外几个概念,首先是Query,Lucene提供了几种经常可以用到的Query:TermQuery、MultiTermQuery、BooleanQuery、WildcardQuery、PhraseQuery、PrefixQuery、PhrasePrefixQuery、FuzzyQuery、RangeQuery、SpanQuery,Query其实也就是指对于需要查询的字段采用什么样的方式进行查询,如模糊查询、语义查询、短语查询、范围查询、组合查询等,还有就是QueryParser,QueryParser可用于创建不同的Query,还有一个MultiFieldQueryParser支持对于多个字段进行同一关键字的查询,IndexSearcher概念指的为需要对何目录下的索引文件进行何种方式的分析的查询,有点象对数据库的哪种索引表进行查询并按一定方式进行记录中字段的分解查询的概念,通过IndexSearcher以及Query即可查询出需要的结果,Lucene返回的为Hits.通过遍历Hits可获取返回的结果的Document,通过Document则可获取Field中的相关信息了。
通过对于上面在建立索引和全文检索的基本概念的介绍希望能让你对Lucene建立一定的了解。
3.2.       全文检索需求的实现
索引建立部分的代码:
private void createIndex(String indexFilePath) throws Exception{

        IndexWriter iwriter=getWriter(indexFilePath);

        Document doc=new Document();

        doc.add(Field.Keyword("name","jerry"));

        doc.add(Field.Text("sender","bluedavy@gmail.com"));

        doc.add(Field.Text("receiver","google@gmail.com"));

        doc.add(Field.Text("title","用于索引的标题"));

        doc.add(Field.UnIndexed("content","不建立索引的内容"));

        Document doc2=new Document();

        doc2.add(Field.Keyword("name","jerry.lin"));

        doc2.add(Field.Text("sender","bluedavy@hotmail.com"));

        doc2.add(Field.Text("receiver","msn@hotmail.com"));

        doc2.add(Field.Text("title","用于索引的第二个标题"));

        doc2.add(Field.Text("content","建立索引的内容"));

        iwriter.addDocument(doc);

        iwriter.addDocument(doc2);

        iwriter.optimize();

        iwriter.close();

    }

   

    private IndexWriter getWriter(String indexFilePath) throws Exception{

        boolean append=true;

        File file=new File(indexFilePath+File.separator+"segments");

        if(file.exists())

            append=false;

        return new IndexWriter(indexFilePath,analyzer,append);

    }


3.2.1.       对于某字段的关键字的模糊查询
Query query=new WildcardQuery(new Term("sender","*davy*"));

       

        Searcher searcher=new IndexSearcher(indexFilePath);

        Hits hits=searcher.search(query);

        for (int i = 0; i < hits.length(); i++) {

            System.out.println(hits.doc(i).get("name"));

        }


3.2.2.       对于某字段的关键字的语义查询
Query query=QueryParser.parse("索引","title",analyzer);

       

        Searcher searcher=new IndexSearcher(indexFilePath);

        Hits hits=searcher.search(query);

        for (int i = 0; i < hits.length(); i++) {

            System.out.println(hits.doc(i).get("name"));

        }


3.2.3.       对于多字段的关键字的查询
Query query=MultiFieldQueryParser.parse("索引",new String[]{"title","content"},analyzer);

       

        Searcher searcher=new IndexSearcher(indexFilePath);

        Hits hits=searcher.search(query);

        for (int i = 0; i < hits.length(); i++) {

            System.out.println(hits.doc(i).get("name"));

        }


3.2.4.       复合查询(多种查询条件的综合查询)
Query query=MultiFieldQueryParser.parse("索引",new String[]{"title","content"},analyzer);

        Query mquery=new WildcardQuery(new Term("sender","bluedavy*"));

        TermQuery tquery=new TermQuery(new Term("name","jerry"));

       

        BooleanQuery bquery=new BooleanQuery();

        bquery.add(query,true,false);

        bquery.add(mquery,true,false);

        bquery.add(tquery,true,false);

       

        Searcher searcher=new IndexSearcher(indexFilePath);

        Hits hits=searcher.search(bquery);

        for (int i = 0; i < hits.length(); i++) {

            System.out.println(hits.doc(i).get("name"));

        }


四.  总结
相信大家通过上面的说明能知道Lucene的一个基本的使用方法,在全文检索时建议大家先采用语义时的搜索,先搜索出有意义的内容,之后再进行模糊之类的搜索,^_^,这个还是需要根据搜索的需求才能定了,Lucene还提供了很多其他更好用的方法,这个就等待大家在使用的过程中自己去进一步的摸索了,比如对于Lucene本身提供的Query的更熟练的掌握,对于Filter、Sorter的使用,自己扩展实现Analyzer,自己实现Query等等,甚至可以去了解一些关于搜索引擎的技术(切词、索引排序 etc)等等。
分享到:
评论

相关推荐

    Lucene的简单介绍

    Apache Lucene是一个非常流行的开源全文检索库,由Apache软件基金会提供。它为开发者提供了构建...由于其开源性质,开发者可以自由地使用、修改和分发Lucene的代码,这也使得它在开源社区中得到了广泛的使用和支持。

    详解SpringBoot+Lucene案例介绍

    SpringBoot与Lucene集成案例详解 本文将详细介绍如何将SpringBoot与Lucene集成,以实现站内搜索系统。 Lucene是一个高性能的全文检索...通过本文,我们可以了解Lucene的基本概念和使用方法,并将其应用于实际项目中。

    lucene基本使用,适合初学者

    ### Lucene基本使用详解 #### 一、概述 在当今数据爆炸的时代,如何从海量的信息中快速找到所需的内容成为了一项重要技能。全文检索技术便应运而生,旨在提高信息检索的效率与准确度。Lucene是一款由Apache基金会...

    用java实现的从pdf文件中提取txt文本pdf2txt

    本篇将详细介绍如何使用Java实现从PDF文件中提取TXT文本,并涉及到Lucene项目中的xpdf包。 首先,Lucene是一个开源全文搜索引擎框架,它包含了多个辅助库,其中之一就是xpdf。xpdf是用于PDF处理的一个工具集,虽然...

    Lucene的介绍

    Lucene是Apache软件基金会的一个开放源代码项目,它是一个全文搜索引擎库,提供了文本分析、索引和搜索的基本功能。Lucene最初由Doug Cutting开发,现在已经成为Java领域中最广泛使用的全文检索库。它不仅适用于Java...

    Lucene 索引的简单使用

    Lucene基本概念 - **文档(Document)**:在Lucene中,一个文档代表你要索引的信息单元,它可以包含多个字段(Field)。 - **字段(Field)**:字段是文档的组成部分,每个字段都有特定的类型(如文本、日期等)...

    Lucene的使用与优化

    通过本文,我们深入了解了Lucene的关键组件和它们的作用,包括Analyzer、Document、Field、Term、Segment等,同时还介绍了Lucene的整体架构和组成部分。此外,还提供了一个简单的示例代码,帮助读者理解如何使用...

    lucene API最基本应用

    在这个主题中,我们将深入探讨 Lucene 的基本使用方法,包括如何集成 IK 分词器以及实现高亮显示。 ### 1. Lucene 的核心概念 - **索引(Index)**: Lucene 首先需要对文档进行索引,将文本数据转换为可搜索的结构...

    lucene in action英文版 lucene 3.30包

    《Lucene in Action》是关于Apache Lucene的权威指南,这本书深入浅出地介绍了全文搜索引擎的构建和优化。Lucene是一个高性能、全文本搜索库,它允许开发人员在应用程序中轻松实现复杂的搜索功能。这本书主要面向...

    Lucene资料大全(包括Lucene_in_Action书等)

    特别提到了"尚学堂科技_张志宇_lucene.ppt",这可能是一个由尚学堂科技的张志宇制作的Lucene讲解PPT,通常这样的PPT会以简洁明了的方式介绍Lucene的基本概念、使用方法和实战技巧。 **Lucene核心知识点** Apache ...

    lucene3源码分析

    - **基本概念**:介绍Lucene索引文件的基本术语和概念。 - **基本类型**:定义了索引文件中使用的数据类型。 - **基本规则**:阐述了文件格式设计的基本原则。 - **具体格式**: - **正向信息**:包括段元数据、...

    apache下的lucene教程

    - **基本查询**:了解如何使用Lucene进行简单的文本匹配查询。 - **高级查询技术**:包括布尔查询、短语查询、范围查询等多种复杂的查询方式。 - **查询优化**:讨论提高查询效率的方法,如缓存机制、查询重写等。 ...

    lucene开发部分例子

    首先,"Web搜索引擎开发实例"这部分内容将教你如何使用Lucene来构建一个基本的Web搜索引擎。这通常涉及到爬取网页数据,提取文本,然后使用Lucene进行索引。在这个过程中,你会了解到如何创建Analyzer来处理中文分词...

    不错的lucene资料

    本节将通过一个简单的例子来介绍如何使用 Lucene 来建立索引并进行搜索。示例的目标是从一个文件夹下的所有 `.txt` 文件中查找特定的词。 ##### 4.1 建立索引 建立索引的过程主要包括以下几个步骤: 1. **创建 ...

    Lucene开发指南

    在学习Lucene时,首先要理解其基本概念。Lucene的核心功能包括文档索引、查询解析、评分机制和结果排序。索引是Lucene的关键步骤,它将非结构化的文本数据转化为可高效搜索的结构化表示。这涉及到分词器(Tokenizer...

    luceneDemo

    以上就是关于 Lucene 及其在 "luceneDemo" 中的应用的简要介绍。实际的 "luceneDemo" 可能包含更丰富的功能,例如支持多字段查询、高亮显示搜索结果、分页显示等。学习和理解 Lucene,可以帮助开发者构建强大的全文...

    Lucene实战(中文版第二版)对应Lucene版本

    《Lucene实战(中文版第二版)》是针对搜索引擎开发领域的经典著作,它详细介绍了如何使用Apache Lucene这个强大的全文搜索引擎库。Lucene是Java语言实现的开源项目,被广泛应用于各种信息检索系统中,包括网站搜索...

    Lucene.In.Action.2nd.Edition

    1. **Lucene基本概念**:了解Lucene的基本架构,如文档、字段、术语(token)、倒排索引等。这些概念构成了Lucene搜索引擎的基础。 2. **索引创建**:学习如何将文本数据转换为可搜索的Lucene索引,包括分词、分析...

    lucene.net+完全入门教程

    **正文** Lucene.Net是一个基于Apache Lucene的开源全文搜索引擎库,它被移植到...教程可能涵盖从安装步骤、基本概念介绍,到实战案例的详细讲解,帮助初学者快速入门并熟练运用Lucene.Net进行全文搜索引擎的开发。

    Lucene+in+action中文版

    这本书详细介绍了Lucene的基本概念、核心组件以及高级应用,是学习和使用Lucene进行信息检索开发的重要参考资料。 首先,Lucene是一个开源的全文检索库,由Java编写,提供了强大的文本分析、索引和搜索功能。它允许...

Global site tag (gtag.js) - Google Analytics