lucene初探(-):lucene基本,实现文件查找

1:什么是lucene?

Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆.
以前我们的搜索都是从数据库中查找,这样既耗费带宽而且用户体验也不好,有的时候我们的用户想搜索整个网站的内容时,sql搜索就做不到了,总的来说就是我们可以实用lucene框架很容易的实现web站点的内容检索,

由于网络上lucene学习视频即教程都是杂乱无章,Apache自己的关于lucene说明文档,也不是很清晰,虽然现在lucene6.0已经发布,但是作为一个小白,很抱歉我的能力不够,实在看不懂lucene6.0,所以这里,先从lucene4.0学起

2:lucene4.0实现文件检索

2.1:首先准备要检索的文件

这里写图片描述
这里写图片描述

2.2,编写文件检索代码

代码如下,内容解释都在代码中:

package com.leige.demo;




import java.io.File;
import java.io.FileReader;
import java.io.IOException;

import org.apache.lucene.analysis.core.SimpleAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;

import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.TopScoreDocCollector;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

/**
 * Created by 姊佺 on 2016/6/4.
 */
public class HelloLucene {



    public void index() throws  Exception{//创建索引
         IndexWriter writer=null;
         try {
             //1.创建directory,保存索引,可以保存在内存中也可以保存在硬盘上
             //保存在内存中使用Directory directory=new RAMDirectory();

             Directory directory= FSDirectory.open(new File("F:\\lucene\\index"));

              //2.1创建indexwriterConfig,并指定分词器版本
             IndexWriterConfig config=new IndexWriterConfig(Version.LUCENE_40,
                     new SimpleAnalyzer(Version.LUCENE_40));
             //2,创建IndexWriter,indexWriter,需要使用indexConfig,
             writer= new IndexWriter(directory, config);
             //3.创建document
             Document doc=null;
             File docDirectory=new File("F:\\lucene\\example");
             for(File file: docDirectory.listFiles()){
                 doc=new Document();

                 //创建搜索域,并说明是否进行分词
                 doc.add(new TextField("content",new FileReader(file)));
                 doc.add(new StringField("filename", file.getName(), Store.YES));
                 doc.add(new StringField("path",file.getAbsolutePath(), Store.YES));
                 //写入文档
                 writer.addDocument(doc);
             }
         }catch (Exception e){
             throw e;
         }finally {
             if(writer!=null)writer.close();
         }
     }

     public void seach(){//搜索索引
         IndexReader indexReader=null;
         try {
             //.1创建索引在的文件夹
             Directory indexDirectory=FSDirectory.open(new File("F:\\lucene\\index"));
             //2.创建indexReader
             indexReader=DirectoryReader.open(indexDirectory);
             //3:根据indexReader创建indexSeacher
             IndexSearcher searcher=new IndexSearcher(indexReader);
             //4创建搜索用的query,指定搜索域

             QueryParser parser=new QueryParser(Version.LUCENE_40,"content",
                     new SimpleAnalyzer(Version.LUCENE_40));
             Query query=parser.parse("mybatis");
             TopScoreDocCollector collector = TopScoreDocCollector.create(10, true);
             //5,根据seacher搜索
            searcher.search(query,collector);
             ScoreDoc[] scoreDocs=collector.topDocs().scoreDocs;

             for (ScoreDoc sd:scoreDocs){
                 //6:根据seacher和scoredoc对象获取具体的document对象
                 Document doc=searcher.doc(sd.doc);
                 System.out.println(doc.get("filename")+"---------"+doc.get("path"));
             }
         } catch (Exception e) {
             e.printStackTrace();
         }finally {
             if(indexReader!=null) try {
                 indexReader.close();
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }

     }
}

2.3测试代码,注意要先执行创建索引,然后才能查找

package com.leige.demo;

import static org.junit.Assert.*;

import org.junit.Test;

public class HelloLuceneTest {

    @Test
    public void test() {//测试索引
    HelloLucene lucene=new HelloLucene();
    try {
        lucene.index();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }
    @Test
    public void seach(){//搜索索引
        HelloLucene lucene=new HelloLucene();
        try {
            lucene.seach();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

执行创建索引会生成,索引文件:如下

这里写图片描述

2.4,文件检索结果,表示这两个,文件中包含mybatis文字:

这里写图片描述

需要注意的lucene自带的分词器,对中文分词不是很友好,所以我们可以再第三方分词器,例如mms分词器也是极好的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值