`
吴英贵
  • 浏览: 7410 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

一步一步跟我学习lucene(1)---lucene的IndexWriter对象创建和索引策略的选择

 
阅读更多

应工作的需要(数据量大造成原有系统查询效率低),最近做了搜索引擎相关的内容,之前培训的时候对lucene即有接触,当时做的是3.x版本的,本人比较激进,毫不犹豫的选择了lucene5版本(15年刚发布的,O(∩_∩)O哈哈~)。

lucene是一个开放源代码的全文搜索引擎开发工具包,提供了简单强大的搜索引擎接口,其优点如下:

  • 数据以索引文件的形式存储,索引文件可以跨平台,只要保证索引完整,复制到任何机器或者磁盘空间均可以查询索引内容;
  • 在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的;
  • 索引的构建和查询都十分简洁,有强大的类库实现相关功能;
  • 开发源代码,论坛和资源十分丰富。

索引的构建过程描述如下:

1)判断JRE版本是否为64位和是否支持堆外内存,并创建

1.1 如果满足条件,创建MMapDirectory,此种Directory可以有效的利用虚拟机内存地址空间;

1.2 如果不满足以上条件,判断系统是否是windows,如果满足条件,创建SimpleFSDirectory,此种directory提供了性能不太高的多线程支持,lucene推荐使用NIOFSDirectory或者MMapDirectory来替代之;

1.3如果以上均不满足,创建NIOFSDirectory对象,此种directory的英文说明为

An FSDirectory implementation that uses java.nio's FileChannel's positional read, which allows multiple threads to read from the same file without synchronizing

大意是一个利用了java nio中FileChannel的FSDirectory实现,允许无syschronized的对同一文件进行多线程读

2)词库分析器Analyzer创建(需要注意的是使用哪种Analyzer进行索引查询,创建的时候也要使用对应的索引器,否则查询结果有问题)

3)IndexWriterConfig对象创建,并获取IndexWriter对象

3.1 判断是覆盖索引还是追加索引,如果是覆盖索引indexWriterConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE);

3.2 如果追加indexWriterConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);

4) 遍历根据要索引的对象列表,对单个对象的field进行lucene相关field构建,添加到Document对象中

5)IndexWriter对索引进行写入;

6)IndexWriter执行commit()和close()结束索引创建过程

以lucene5为例,索引器的创建如下:

 /**创建索引写入器
	 * @param indexPath
	 * @param create
	 * @return
	 * @throws IOException
	 */
	public static IndexWriter getIndexWriter(String indexPath,boolean create) throws IOException{
	    Directory dir = FSDirectory.open(Paths.get(indexPath, new String[0]));
	    Analyzer analyzer = new StandardAnalyzer();
	    IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
	    if (create){
	        iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
	    }else {
	        iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
	    }
	    IndexWriter writer = new IndexWriter(dir, iwc);
	    return writer;
	}


此博文是对近期做lucene索引的总结,大家有问题的话联系本人的Q-Q: 891922381,同时本人新建Q-Q群:106570134(lucene,solr,netty,hadoop),如蒙加入,不胜感激,大家共同探讨,本人争取每日一博,希望大家关注呦

分享到:
评论

相关推荐

    Lucene创建索引步骤

    Lucene创建索引步骤: 1、创建Directory(索引位置) 2、创建IndexWrite(写入索引) 3、创建Document对象 4、为Document添加Field(相当于添加属性:类似于表与字段的关系) 5、通过IndexWriter添加文档到索引中

    【分享:lucene学习资料】---<下载不扣分,回帖加1分,欢迎下载,童叟无欺>

    1&gt; lucene学习笔记 2&gt; 全文检索的实现机制 【1】lucene学习笔记的目录如下 1. 概述 3 2. lucene 的包结构 3 3. 索引文件格式 3 4. lucene中主要的类 4 4.1. Document文档类 4 4.1.1. 常用方法 4 4.1.2. 示例 4 4.2...

    Apache Lucene全文检索和IKAnalyzer分词工具类

    * Apache Lucene全文检索和IKAnalyzer分词工具类 * &lt;p&gt;Company: 91注册码 * time:2014-04-22 * @author www.91zcm.com * @date * @version 1.1 */ public class LuceneUtil { /**索引创建的路径**/ ...

    lucene,lucene教程,lucene讲解

    lucene,lucene教程,lucene讲解。 为了对文档进行索引,Lucene 提供了五个基础的类 public class IndexWriter org.apache.lucene.index.IndexWriter public abstract class Directory org.apache.lucene.store....

    基于JAVA的搜索引擎 lucene-2.2.0

    在前面Lucene-2.2.0 源代码阅读学习(1)中,根据Lucene提供的一个Demo,详细分析研究一下索引器org.apache.lucene.index.IndexWriter类,看看它是如果定义的,掌握它建立索引的机制。 通过IndexWriter类的实现源代码...

    lucene2.9.1所有最新开发包及源码及文档

    1) IndexWriter:索引写出器 a) 构造方法: IndexWriter(Directory d, Analyzer a, IndexWriter.MaxFieldLength mfl) 如果索引不存在,就会被创建。如果索引存在,就追加. IndexWriter(Directory d, Analyzer ...

    lucene2.9.1完整DEMO及开发文档

    //创建一个IndexWriter(存放索引文件的目录,分析器,Field的最大长度) iwriter = new IndexWriter(directory, analyzer,true, IndexWriter.MaxFieldLength.UNLIMITED); //iwriter.setUseCompoundFile(true);//...

    Lucene 详细教案

    这样你就告诉 lucene 我要在 c 盘的 index 目录下建立索引文件,我要使用车东老师的二分词算法做分析器、我要在这个目录下删除以前的索引或任何文件创立我的索引文件。 索引的建立有三种方式,让我一一道来: 1 ...

    基于lucene的搜索引擎总结

    IndexSearcher:用于搜索IndexWriter创建的索引 Term:用于搜索的一个基本单元包括了一对字符串元素,与Field相对应 Query :抽象的查询类 TermQuery:最基本的查询类型,用来匹配特定Field中包含特定值的文档 Hits...

    lucene.net搜索技术,附带学习资料

    性能优化也很重要,因为如果要索引的文件比较大的话,建立索引的性能就会很大的下降,你可以调整IndexWriter的几个参数来优化索引性能,还有可以用IndexWriter.Optimize()方法(这个方法主要是优化查询速度,反而使...

    Lucene3.1使用教程.doc

    Lucene3.1使用教程 随着Lucene开发的推进,Lucene3.1推出了,但是目前Lucene3.1的使用文档较少,特收集了《Lucene3.1使用教程》 值得关注的内容有: 1. 性能提升 2. ReusableAnalyzerBase使得跟容易让 ...

    learn-lucene:lucene学习

    lucene_learnlucene学习day_01:索引创建的步骤:创建directory创建IndexWriter创建Document为Document添加Field通过IdexUriter添加文档到索引中搜索的步骤:创建directory创建IndexReader根据IndexReader创建...

    apache lucene 4.10.0入门单元测试代码demo

    总结了一些实用的demo 包括: 1.建立索引 2.通过IKAnalyzer搜索中文关键词 3.复杂的多字段搜索 4.多线程并发搜索,通过contiperf测试,详见:...lucene支持多线程并发搜索和建索引,只要IndexWriter是单例模式即可

    lucene的第一个程序

    // 1)指定索引库的存放位置Directory对象 // 2)指定一个分析器,对文档内容进行分析 Directory directory = FSDirectory.open(new File&#40;"D:\\temp\\index"&#41;); Analyzer analyzer = new StandardAnalyzer...

    Lucene5 工具类

    工具类对IndexWriter,IndexReader,IndexSearcher,Analyzer,QueryParser等Lucene这些常用操作对象的获取进行了封装,其中IndexWriter采用了单例模式,确保始终只有一个对象实例,因为Lucene限制了索引写操作是阻塞的...

    Lucene 源码解析

    在创建完最重要的IndexWriter之后,就开始遍历需要索引的文件,构造对应的Document和Filed类,最终通过IndexWriter的addDocument函数开始索引。 Document的构造函数为空,StringField、TextField和Field的构造函数...

    Lucene 全文检索

    public static String indexDirpath = "e:\\work\\zhzyk\\index";...第一次执行请把 indexWriter = new IndexWriter(indexDir, luceneAnalyzer, false);//true建立索引库,false追加索引库 false改为true

    Homework-4 作业补充1

    2.1 在创建索引过程中,首先提供的是一个目录,用于存储索引 2.2 然后建立索引写文件入口 IndexWriter 2.3 创建索引过程中会使用 Field,

    SearchEngineDemo:学习搜索引擎的一些demo

    luceneIndexDetail Lucene索引详解(IndexWriter详解、Document详解、索引更新)博客学习地址: luceneSearchDetail Lucene搜索详解(Lucene搜索流程详解、搜索核心API详解、基本查询详解、QueryParser详解)博客...

    中文分词工具word-1.0,Java实现的中文分词组件多种基于词典的分词算法

    IndexWriter indexWriter = new IndexWriter(directory, config); 4、利用word分析器查询Lucene索引 QueryParser queryParser = new QueryParser(Version.LUCENE_47, "text", analyzer); Query query = queryParser...

Global site tag (gtag.js) - Google Analytics