文档章节

Lucene4入门(1)

一枚Sir
 一枚Sir
发布于 2014/04/10 15:19
字数 892
阅读 501
收藏 1

Lucene4.4入门(1)

Lucene主要分为三大块:

1、创建索引

2、分词

3、读取并查询索引

我们今天的入门主要讲创建索引和读取查询索引,使用的Lucene的版本是4.4。

第一步:创建一个java工程添加lucene-core-4.4.0.jar、lucene-analyzers-common-4.4.0.jar和lucene-queryparser-4.4.0.jar三个jar文件

一个核心jar文件、一个标准分词文件和一个查询的jar文件。完成后的工程图如下:

第二步:在java工程中创建两个文件夹用来分别放原文件和索引文件(content、index)在content文件夹 中放一些txt文件,完成后的工程图:

第三步:创建一个java类命名为ReaderAndWriterIndex.java并创建两个方法,createindex()用来创建索引,searcher()用来查询,

代码如下:

package com.cqn;
import java.io.File; 
import java.io.FileReader; 
import java.io.IOException; 
import org.apache.lucene.analysis.standard.StandardAnalyzer; 
import org.apache.lucene.document.Document; 
import org.apache.lucene.document.Field; 
import org.apache.lucene.document.FieldType; 
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader; 
import org.apache.lucene.index.FieldInfo.IndexOptions;
import org.apache.lucene.index.IndexReader; 
import org.apache.lucene.index.IndexWriter; 
import org.apache.lucene.index.IndexWriterConfig; 
import org.apache.lucene.queryparser.classic.ParseException; 
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.store.Directory; 
import org.apache.lucene.store.FSDirectory; 
import org.apache.lucene.util.Version;
public class ReaderAndWriterIndex { 
 public static void createindex(){ 
  IndexWriter writer = null;
        try { 
            //创建Directory对象有多种方式,使用FSDirectory.open()创建它会选择最优的方式获得 
            //Directory对象,Directory实现类包括SimpleFSDirectory和RAMDirectory两个类 
            //其中RAMDirectory是在内存中创建索引对象 
            //1、创建Directory对象来保存索引,index为刚才创建的index目录 
            Directory dir = FSDirectory.open(new File("index"));
            //2、创建IndexWriter对象需要IndexWriterConfig和Analyzer对象,这里使用标准分词器 
            IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_47, new StandardAnalyzer(Version.LUCENE_47)); 
            writer = new IndexWriter(dir, config);
            //3、创建Document对象 
            Document doc = null;
            File file = new File("content"); 
            //创建一个索引存储分词的FieldType 
            //在这里FieldType对象只是为了说明,下面并没有使用。 
            FieldType index_store_tokeniz = new FieldType(); 
            index_store_tokeniz.setIndexed(true); 
            index_store_tokeniz.setIndexOptions(IndexOptions.DOCS_ONLY); 
            index_store_tokeniz.setStored(true); 
            index_store_tokeniz.setTokenized(true); 
            index_store_tokeniz.freeze();
            for(File f : file.listFiles()){ 
                //4、根据索引内容创建Field对象并添加到Document中 
                doc = new Document();
                //为Documnet对象添加需要索引或保存的合适的Field对象 
                //TextField是一个索引分词可以存储的Field实现
                doc.add(new TextField("filename", f.getName(), Field.Store.YES));
                //StringField是一个索引可以存储但不分词的Field实现 
                doc.add(new StringField("filepath",f.getPath(),Field.Store.YES));
                //TextField是一个索引分词可以存储的Field实现
                //使用filename+Reader的构造是不存储的 
                doc.add(new TextField("content",new FileReader(f)));
                //6、把Document对象添加到IndexWriter对象中 
                writer.addDocument(doc); 
             }
        } catch (IOException e) { 
            e.printStackTrace(); 
        } finally{ 
            try { 
                if(writer != null){ 
                    //6、关闭IndexWriter对象 
                    writer.close(); 
                } 
            } catch (IOException e) { 
                e.printStackTrace(); 
            } 
        } 
    }
    public static void searcher(){ 
        try { 
         //1、创建Directory 
            Directory dir = FSDirectory.open(new File("index"));
            //2、创建IndexReader 
            IndexReader reader = DirectoryReader.open(dir); 
            //3、根据IndexReader创建IndexSearcher 
            IndexSearcher searcher = new IndexSearcher(reader); 
            //4、创建QueryParser 
            QueryParser parser = new QueryParser(Version.LUCENE_47, "content", new StandardAnalyzer(Version.LUCENE_47)); 
            //5、根据QueryParser创建Query,并传递需要查询的词 
            Query query = parser.parse("Lucene"); 
            //6、根据query使用IndexSearcher创建TopDocs 
            TopDocs tds = searcher.search(query, 10); 
            //7、通过TopDocs获得ScoreDoc对象 
            ScoreDoc[] sds = tds.scoreDocs; 
            for(ScoreDoc sd : sds){ 
                //8、通过IndexSearcher和ScoreDoc.doc获得Document对象 
                Document d = searcher.doc(sd.doc); 
                //9、关键Document对象获得值 
                System.out.println(d.get("filename") + "===" + d.get("filepath")); 
            } 
            //10、关闭IndexReader 
            reader.close(); 
        } catch (IOException e) { 
             e.printStackTrace(); 
        } catch (ParseException e) { 
             e.printStackTrace(); 
        } 
    } 
}

第四步:为工程添加JUnit并编写测试类测试上面的两个方法:

package com.cqn;
import org.junit.Test;
public class IndexReaderMethodTest { 
    /** 
     * 测试创建索引方法 
     * */ 
    @Test  
    public void testIndex(){ 
        ReaderAndWriterIndex.createindex(); 
    } 
    /** 
     * 测试查询索引方法 
     * */ 
    @Test  
    public void testReader(){ 
        ReaderAndWriterIndex.searcher(); 
    } 
}

首先执行indexTest()测试方法,运行完成后刷新java工程会在index目录中创建一些索引文件:

然后在执行查询方法会在控制台打印出包含Lucene词的文件,输出如图:

到此Lucene的入门就写完了,有什么疑问或者不对的地方,欢迎发表评语。


© 著作权归作者所有

共有 人打赏支持
一枚Sir
粉丝 117
博文 209
码字总数 350904
作品 0
朝阳
架构师
Lucene4入门学习资料

分享几节Lucene4入门学习资料,一起学习! 地址:http://yunpan.cn/QXLCTt2A4w7QB

小人不才
2013/08/23
418
4
lucene solr 搜索关键词权重设置

公司有个特殊要求 系统自动判断用户输入的搜索关键词,给关键词做不同的权重设置,然后搜索出来的结果根据搜索关键词的权重进行排序显示,权重高的优先显示。 譬如:用户输入 女 包包 程序自...

老码农008
2013/08/08
3.8K
3
lucene4.0如何统计热词

项目有个需求,比如有一个用户留言表leavemsg[id,content,userid], 要实现统计content里出现频率在前10的热词,以及它出现的记录的总数。 我的解决思路遇到点问题: 1. 新增记录的时候,提交...

jkluooop
2015/05/15
1K
0
IKAnalyzer何时支持Lucene4.x

目前我已经用了lucene4.0,虽然是alpha版,但是也是未来的第一步。但是IKAnalyzer不支持lucene4,如果作者在,是否有计划对4支持?何时支持?

开源狂人
2012/07/11
2K
9
关于”动态支持同义词功能“的问题

@强子哥哥 你好,想跟你请教个问题: 在你的”我的架构演化笔记 11:ES之ansj分词器之定制:动态支持StopWord及同义词功能“一文中: 修改AnsjAnalysis.java时,您贴出来的代码 "return new ...

migrant620
2014/09/02
284
0

没有更多内容

加载失败,请刷新页面

加载更多

deepin系统使用deepin-wine安装exe程序

deepin自带原生deepin-wine使用命令如下: deepin-wine QQBrowser.exedeepin-wine QQMusicSetup.exe 默认安装的快捷方式位置: /root/.wine/drive_c/'Program Files'/Tencent/QQBrowser/......

临江仙卜算子
41分钟前
1
0
快速get到学习Linux操作系统的点

快速get到学习Linux操作系统的点 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。Linux能够运行主要的UNIX工具软件...

linuxCool
48分钟前
2
0
聊聊:Linux分区的那些方案

安装linux的整体步骤其实比较简单,唯一可能值得说明的地方,大概就是linux的分区了。 下面来给大家推荐一些分区方案。 1 分两个区 实际上,很多时候我们只需要分两个区:`/`和交换分区,日常...

Linux就该这么学
59分钟前
1
0
适配器模式和外观模式

适配器模式: 将一个类的接口,转换成客户期望的另一个接口。适配器让原本不兼容的类可以合作无间。 例子: //将Enumeration转换成Iteratorpublic class EnumerationIterator implements Iter...

王怀楼
今天
2
0
7-CXF与Spring整合发布webservice

Spring+CXF整合来管理webservice 实现步骤: 1. 添加cxf.jar 包(集成了Spring.jar、servlet.jar ),spring.jar包 ,servlet.jar 包 2. 编写业务类,通过CXF来发布webservice 员工管理: 方法...

江戸川
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部