zoukankan      html  css  js  c++  java
  • Lucene的配置及创建索引全文检索

    Lucene


      是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。

    优点


    (1)索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。
    (2)在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。
    (3)优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能。
    (4)设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。
    (5)已经默认实现了一套强大的查询引擎,用户无需自己编写代码即可使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询(Fuzzy Search[11])、分组查询等等。

    概念


    首先大家可以看一下这张图,已经流传许久了,在我的理解中的是:
     
    左边:是各种数据的采集,比如网上,文本,数据库等,采集到经过Lucene建立索引index
    右边:是用户通过一些搜索,经过索引,返回结果的一个过程
     

     

    Lucene配置


    很简单导几个jar包,创建一个索引文件
    我用的是最新版本的6.6.0的核心包:lucene-core-6.6.0.jar,可以上官网下载http://lucene.apache.org/,这一个包就够你测试用了
    索引文件为:index,这个文件名可以随便取,因为里面内容自动生成,就是一个索引目录,可以上网下载工具查看,感兴趣可以去试试
    然而这个jar包:IKAnalyzer6.5.0.jar,是一个analyzer分词处理的扩展包,支持中文的分词,这两个目录跟src目录同级
     
    不多说先上代码:
    首先根据上面的那张lucene的概念图,我们需要先建立一个索引,这里这些异常我直接抛出去了,其实需要处理的,太懒了
    public static void createindex() throws Exception {
            //创建文件目录    创建在项目目录下的index中
            Directory dir=FSDirectory.open(FileSystems.getDefault().getPath(System.getProperty("user.dir")+"/index"));
            //分词处理         是一个抽象类 一种单字分词,标准的
            Analyzer analyzer=new IKAnalyzer();
            //创建IndexWriterConfig对象
            IndexWriterConfig config=new IndexWriterConfig(analyzer);
            //创建IndexWriter对象
            IndexWriter iWriter=new IndexWriter(dir, config);
            //清除之前的索引
            iWriter.deleteAll();
                    //创建文档对象
            Document doc=new Document();
            //向文档中添加文本内容字段,及字段类型
            doc.add(new Field("fieldname","坚持到底gl博主的博文,转载请注释出处", TextField.TYPE_STORED));
            //将文档添加到indexWriter中,写入索引文件中
            iWriter.addDocument(doc);
                    //关闭写入    
                    iWriter.close();        
    }

    这样运行可以看到你的索引index中的内容文件已经创建出来了

    索引已经创建,接下来查询一下试试索引 ,传入需要查询的词

    public static void search(String string) throws Exception {
        
            Directory dir=FSDirectory.open(FileSystems.getDefault().getPath(System.getProperty("user.dir")+"/search"));
            //打开索引目录的
            DirectoryReader dReader=DirectoryReader.open(dir);
            IndexSearcher searcher=new IndexSearcher(dReader);
            //第一个参数 field值 ,第二个参数用户需要检索的字符串
            Term t=new Term("fieldname",string);
            //将用户需要索引的字符串封装成lucene能识别的内容 
            Query query=new TermQuery(t);
            //查询,最大的返回值10
            TopDocs top=searcher.search(query, 10);
                    //命中数,那个字段命中,命中的字段有几个
            System.out.println("命中数:"+top.totalHits);
                   //查询返回的doc数组
            ScoreDoc[]    sDocs= top.scoreDocs;   
                for (ScoreDoc scoreDoc : sDocs) {
                    //输出命中字段内容
            System.out.println(searcher.doc(scoreDoc.doc).get(field));
    }
    }
     

    就这样一个全文检索的测试就出来了,多去思考总结,扩展出去

    再给添加一个代码有益于理解

        public static void main(String[] args) throws Exception {
            String chString="坚持到底的文章,转载请注释出处";
            Analyzer analyzer=new IKAnalyzer();
            TokenStream stream=analyzer.tokenStream("word", chString);
            stream.reset();
            CharTermAttribute cta=stream.addAttribute(CharTermAttribute.class);
            while (stream.incrementToken()) {
                System.out.println(cta.toString());
            }
            stream.close();
        }

    显示如下:

    还可以添加这几个文件,有一点需要注意的是,注意你的编码格式

    第一个:ext.dic 扩展词典,分词中那个需要组在一起的,如:分词处理可能将“坚持到底”四个字分为“坚持”和“到底”,可以在这个文件中直接添加坚持到底,就可以显示出坚持到底的这个索引

    第三个:stopword.dic 扩展停止词典,分词中不想出现的,不希望他被分开出现或单独的,可以往里面写,检索的时候就不会有

    第二个:是指定上面两个扩展词典的

    这些就是最基本掌握的内容,还有很多分词算法等类型,需要去扩展

     
           【版本声明】本文为博主原创文章,转载请注明出处
     
     
     
  • 相关阅读:
    java中常量定义在interface中好还是定义在class中
    CharacterEncodingFilter-Spring字符编码过滤器
    Integer判断相等,到底该用==还是equals
    ThreadLocal实现session中用户信息 的线程间共享
    分布式部署引发的问题
    分布式部署
    LogBack通过MDC实现日志记录区分用户Session
    Fragment 简介 基础知识 总结 MD
    直播 相关技术文章 相关调研文章
    直播 背景 技术体系 乐视云直播Demo
  • 原文地址:https://www.cnblogs.com/zhouguanglin/p/7482021.html
Copyright © 2011-2022 走看看