学习笔记----lucene内存索引库与文件索引库及分词器

本文介绍如何使用Lucene创建内存索引库,并将其与文件索引库合并,同时探讨了不同类型的分词器,包括标准分词器、中文分词器以及IK分词器的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内存索引库:

  1、内存索引库
  2、文件索引库和内存索引库的合并
  3、可以利用indexWriter.addIndexesNoOptimize方法把很多个索引库合并在一起
 

    1:创建内存索引库
         实现:
        RAMDirectory directory = new RAMDirectory();
        创建索引库后其他操作与操作普通数据库的原理和流程都是一样的。
        IndexWriter indexWriter = new IndexWriter(directory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);只不过在建立流对象时,注意别放错索引库即可。



    2:把文件索引库和内存索引库合并

        1、当程序运行的时候,把文件索引库的内容复制到内存索引库一份
            2、让应用程序和内存索引库进行交互
        3、把内存索引库的内容复制到文件索引库中



         实现:
        Directory ramDirectory = new RAMDirectory(Filedirectory);
        在创建内存索引库时,直接利用构造函数将一个文件索引库以参数传入,就会建立起内存索引库和文件索引库之间的关联。
        
        //创建indexWriter操作内存索引库
IndexWriter ramIndexWriter = new IndexWriter(ramDirectory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);
        //创建indexWriter操作文件索引库
IndexWriter fileIndexWriter = new IndexWriter(LuceneUtils.directory,LuceneUtils.analyzer,true,MaxFieldLength.LIMITED);
        注意:创建fileIdexWriter时,在analyzer参数后跟了一个true,代表当同步数据时,更新覆盖原有数据。

        /**
         * 把内存索引库的内容合并到文件索引库中
         */
        fileIndexWriter.addIndexesNoOptimize(ramDirectory);

        此方法可以加入的不止是内存索引库,还具备其他参数可以加入,专门用来合并数据时使用。

    完整代码:
        @Test
    public void testRamDirectoryAndFileDirectory() throws Exception{
        
        Directory ramDirectory = new RAMDirectory(LuceneUtils.directory);
        
        IndexWriter ramIndexWriter = new IndexWriter(ramDirectory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);
        
        IndexWriter fileIndexWriter = new IndexWriter(LuceneUtils.directory,LuceneUtils.analyzer,true,MaxFieldLength.LIMITED);
    
        Article article = new Article();
        article.setId(1L);
        article.setTitle("lucene可以做搜索引擎");
        article.setContent("baidu,google是很好的搜索引擎");
        ramIndexWriter.addDocument(DocumentUtils.article2Document(article));
        
        ramIndexWriter.close();
        
        
        fileIndexWriter.addIndexesNoOptimize(ramDirectory);
        
        fileIndexWriter.close();
        
        this.testSeacherIndex(LuceneUtils.directory);
    }





分词器

         1、切分关键词
         2、去掉停用词
         3、把大写转化成小写

         

          实现方法:

                    String s = "Creates a searcher searching the index in the named directory";
                    Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
                    this.testAnalyzer(analyzer, s);


Apache提供的对中文的分词器,一种是单字分词,一种是二分分词,都不适合,知道即可。

           1.Analyzer analyzer = new ChineseAnalyzer();

            2. new CJKAnalyzer(Version.LUCENE_30);



IK分词器是针对中文的分词器:

        使用该分词器需要导入jar包:IKAnalyzer3.2.0Stable.jar

         创建IK分词器对象:Analyzer analyzer = new IKAnalyzer();


        该分词器最好的地方在于 可以自定义 词库:

        操作方法:

          1、       将IKAnalyzer.cfg.xml和ext_stopword.dic拷贝进工程的src目录下。

          2、      然后建一个自定义 词库:这里以mydict.dic为例,然后在该词库中添加自定义的内容,即可。



           3、     在IKAnalyzer.cfg.xml中配置访问自定义词库的路径:

                <?xml version="1.0" encoding="UTF-8"?>
                <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">  
                    <properties>  
                             <comment>IK Analyzer 扩展配置</comment>
    
                                      <entry key="ext_dict">/mydict.dic;</entry> //这里配置的是自定义分词词库的访问路径。
    
    
                                    <entry key="ext_stopwords">/ext_stopword.dic</entry>//这里定义的是过滤掉的分词器词库的访问路径
    
                      </properties>


完成以上操作即可实现自定义分词的效果了。需要注意的是,这几个文件必须是utf-8的编码形式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值