文档章节

Lucene4入门(1)

一枚Sir
 一枚Sir
发布于 2014/04/10 15:19
字数 892
阅读 497
收藏 1
点赞 0
评论 0

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
粉丝 116
博文 207
码字总数 350904
作品 0
朝阳
架构师
Lucene4入门学习资料

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

小人不才 ⋅ 2013/08/23 ⋅ 4

lucene solr 搜索关键词权重设置

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

老码农008 ⋅ 2013/08/08 ⋅ 3

lucene4.0如何统计热词

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

jkluooop ⋅ 2015/05/15 ⋅ 0

IKAnalyzer何时支持Lucene4.x

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

开源狂人 ⋅ 2012/07/11 ⋅ 9

关于”动态支持同义词功能“的问题

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

migrant620 ⋅ 2014/09/02 ⋅ 0

TngouDB 0.2 beta 发布,中文搜索引擎数据库

TngouDB 中文索引数据库 0.2 beta 版本 主要改进: 1、数据存储引擎Lucene4更新到Lucene5。 2、增加了并发增、删、改的功能。 3、添加了返回状态码 4、重构了回收链接已经关闭链接功能。 需要...

tngou ⋅ 2015/07/01 ⋅ 13

solr4.6.1配置ik分词器

接上篇文章windows+tomcat7安装solr4.6.1 下载解压IK Analyzer 2012FF_hf1(下载列表注意ik的版本,支持不同solr版本,此版本支持lucene4/solr4)。 拷贝IKAnalyzer2012FFu1.jar至E:servers...

Bingo许 ⋅ 2014/02/16 ⋅ 0

我的架构演化笔记 11:ES之ansj分词器之定制:动态支持StopWord及同义词功能

上一篇文章提到过方法,本文单独拿出来作为一个主题。 架构如下: 这里ansj分词器为了支持动态添加词汇,使用了Redis组件。 首先要明白动态支持意味着: 1)内存中支持动态增加/删除 2)文件...

强子哥哥 ⋅ 2014/06/16 ⋅ 18

Lucene4 入门(2)–Field类及辅助类说明

Lucene4 入门(2)–Field类及辅助类说明 一、Eclipse中Field类的继承关系图: 二、Field类 1、 类的说明 在一般情况下为Document对象创建一个Field对象会使用它的子类,比如: ,, , , , , , 。...

一枚Sir ⋅ 2014/04/10 ⋅ 0

Python爬虫学习系列教程

一、Python入门 1. Python爬虫入门一之综述 2. Python爬虫入门二之爬虫基础了解 3. Python爬虫入门三之Urllib库的基本使用 4. Python爬虫入门四之Urllib库的高级用法 5. Python爬虫入门五之U...

xiejunbo ⋅ 2016/02/16 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Cube、Cuboid 和 Cube Segment

1.Cube (或Data Cube),即数据立方体,是一种常用于数据分析与索引的技术;它可以对原始数据建立多维度索引。通过 Cube 对数据进行分析,可以大大加快数据的查询效率 2.Cuboid 在 Kylin 中特...

无精疯 ⋅ 27分钟前 ⋅ 0

github太慢

1:用浏览器访问 IPAddress.com or http://tool.chinaz.com 使用 IP Lookup 工具获得github.com和github.global.ssl.fastly.net域名的ip地址 2:/etc/hosts文件中添加如下格式(IP最好自己查一...

whoisliang ⋅ 29分钟前 ⋅ 0

非阻塞同步之 CAS

为解决线程安全问题,互斥同步相当于以时间换空间。多线程情况下,只有一个线程可以访问同步代码。这种同步也叫阻塞同步(Blocking Synchronization). 这种同步属于一种悲观并发策略。认为只...

长安一梦 ⋅ 39分钟前 ⋅ 0

云计算的选择悖论如何对待?

人们都希望在工作和生活中有所选择。但心理学家的调查研究表明,在多种选项中进行选择并不一定会使人们更快乐,甚至不会产生更好的决策。心理学家Barry Schwartz称之为“选择悖论”。云计算为...

linux-tao ⋅ 42分钟前 ⋅ 0

我的第一篇个人博客

虽然这是个技术博客,但是,我总是想写一些自己的东西,所有就大胆的在这里写下了第一篇非技术博客。技术博客也很久没有更新,个人原因。 以后自己打算在这里写一些非技术博客,可能个人观点...

Mrs_CoCo ⋅ 43分钟前 ⋅ 0

Redis 注册为 Windows 服务

Redis 注册为 Windows 服务 redis 注册为 windows 服务相关命令 注册服务 redis-server.exe –service-install redis.windows.conf 删除服务 redis-server –service-uninstall 启动服务 re......

Os_yxguang ⋅ 43分钟前 ⋅ 0

世界那么大,语言那么多,为什么选择Micropython,它的优势在哪?

最近国内MicroPython风靡程序界,是什么原因导致它这么火呢?是因为他功能强大,遵循Mit协议开源么? 错!因为使用它真的是太舒服了!!! Micropython的由来,这得益于Damien George这位伟大...

bodasisiter ⋅ 47分钟前 ⋅ 0

docker 清理总结

杀死所有正在运行的容器 docker kill $(docker ps -a -q) 删除所有已经停止的容器(docker rm没有加-f参数,运行中的容器不会删掉) docker rm $(docker ps -a -q) 删除所有未打 dangling 标...

vvx1024 ⋅ 57分钟前 ⋅ 0

关于学习

以前学车的时候,教练说了这样的一句话:如果一个人坐在车上一直学,一直学,反而不如大家轮流着学。因为一个人一直学,就没有给自己留空间来反思和改进。而轮流着学的时候大家下来之后思考上...

mskk ⋅ 今天 ⋅ 0

压缩工具之gzip-bzip2-xz

win下常见压缩工具:rar zip 7z linux下常见压缩工具:zip gz bz2 xz tar.gz tar.bz2 tar.xz gzip 不支持目录压缩 gzip 1.txt #压缩。执行后1.txt消失,生成1.txt.gz压缩文件 gzip -d 1.txt....

ZHENG-JY ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部