一、 Lucene索引创建和优化 [版本2.9.0以上]

Lucene索引的创建首先需要取得几个必须的对象:

1、分词器//可以采用其他的中文分词器 
StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT);//分词器

2、lucene目录 
File dir = new File(indexDir);// indexDir为文件路径 
//这种目录存在锁机制,在打开目录时,写的权利一次只分给一个用户;有效保证了索引文件不会因为多线程问题,同时写索引导致文件损坏。 
Directory idxDir = new SimpleFSDirectory(dir, new SimpleFSLockFactory());

3、写索引对象 
// isNewCreate为boolean值 
IndexWriter writer = new IndexWriter(idxDir, analyzer, isNewCreate, IndexWriter.MaxFieldLength.LIMITED);

对writer对象可以做一些基本设置,以便优化数据操作。 
writer.setMergeFactor(50); // 多少个合并一次【优化缓存】 
writer.setMaxMergeDocs(5000); // 一个segment最多有多少个document【优化索引存储的segment文件】

4、document实例化和参数设置 
writer可以写入的对象document也需要预先申明。 
Document doc = new Document(); 
这个document是lucene自定义的一种存储节点对象。一个document可以包含N个filed域,N的取值可以在indexWriter定义的时候申明。各种域对应不同的应用场景。

//只存储,不做索引分析,value值就是唯一索引对应该条记录 
Field field = new Field(key1, value1, Store.YES, Index.NOT_ANALYZED_NO_NORMS); 
//存储,且做索引分析,value值被分析器解析成各种分词,一组索引对应该条记录 
field = new Field(key2, value2, Store.YES, Index.ANALYZED); 
//只存储,没有索引对应该域 
field = new Field(key3, value3, Store.YES, Index.NO);

// 数字范围搜索 
NumericField numericField = new NumericField(key4, Store.YES, true); 
     numericField.setLongValue(value4);

域生成之后通过document的add方法添加到一个document对象中。 
//document 域的添加 
doc.add(field); 
doc.add(numericField);

5、对索引的写操作和优化操作关键步骤如下

writer.addDocument(doc);//向索引文件中写数据 
writer.optimize();// 索引优化,一般执行此步骤时,所消耗的内存是写入索引所需内存的2倍,在执行索引生成操作的时候本身就对内存有比较大的消耗,最好在索引创建完成之后,执行此步骤。 
writer.commit();//数据提交 
writer.rollback();//数据回滚 
writer.close();//关闭流索引写入器,此步骤才真正将数据写入到索引文件中。

二、 Lucene索引实现 精确查询 分词查询 范围查询 多条件查询等

查询的步骤实现:

1、首先需要设置查询条件参数。 
BooleanQuery query = new BooleanQuery();// 多条件查询 处理检索条件

Query termQuery = new TermQuery(new Term(key,value)); // 基本/精确 查询 
query.add(termQuery, Occur.MUST);// 根据索引中的document生成时的设置,可以实现精确记录

/* 范围查询 */ 
Query numericRangeQuery = NumericRangeQuery.newLongRange(key, minValueLong, maxValueLong, true, true); 
query.add(numericRangeQuery, Occur.MUST); // numericRangeQuery是按数值范围匹配

/* 多域组合查询 */ 
BooleanClause.Occur[] occurs = 
new BooleanClause.Occur[] { BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD }; 
Query multiFieldQuery = MultiFieldQueryParser.parse(keyWord, new String[] { key1, key2 }, occurs, analyzer); 
query.add(multiFieldQuery, Occur.MUST);// multiFieldQuery是把关键字keyWord分别在key1和key2中匹配 组合查询

2、创建索引搜索器。 
//以只读方式,创建索引搜索器 
IndexSearcher searcher = new IndexSearcher(idxDir, readOnly);//readOnly 为boolean值

3、设置排序条件。 
//设置根据哪个域的key来排序 
SortField field = null; 
// Long型降序 
field = new SortField(key, SortField.LONG, true); 
// Long型升序 
field = new SortField(key, SortField.LONG, false); 
// 搜索引擎权重 
field = new SortField(null, SortField.SCORE, true);//不需要指定域的key来排序,lucene中会根据查询结果出现的次数给每个结果设置排序参数,搜索结果会按照这个排序参数的大小来由大到小进行排序。【即为搜索结果热门程度的降序排列】

// Integer型排序 
field = new SortField(key, SortField.INT, true);

// 单条件排序 
Sort sort =  = new Sort(field);

// 多条件排序 
SortField[] fields = new SortField[] { field1, field2 }; 
Sort sort =  = new Sort(fields);

4、执行查询操作,并处理获得查询结果

//查询获取结果 
// 查询      searcher.maxDoc()为searcher中所包含的最大document下标值 filter为过滤器[没有的话,一般写null] 
TopFieldDocs docs = searcher.search(query, filter, searcher.maxDoc(), sort); 
ScoreDoc[] scoreDocs = docs.scoreDocs;//权值对象 包含document下标信息,能确定searcher中的document的下标。 
int docCount = scoreDocs.length;//查询结果统计 
// 取出最后一个查出的document对象

Document doc = searcher.doc(scoreDocs[docCount - 1].doc); // 通过document下标值,获取document对象

来源:http://lc0451.iteye.com/blog/616176

来源:http://www.cnblogs.com/lhj588/archive/2013/02/06/2900937.html

Lucence.net索引技术 二的更多相关文章

  1. Lucence.net索引技术 一

    1.建立索引 为了对文档进行索引,Lucene 提供了五个基础的类,他们分别是 Document, Field, IndexWriter, Analyzer, Directory.下面我们分别介绍一下 ...

  2. UNIX索引技术访问文件初阶

    背景: 软考里面,多次碰到一道题: 过程 以前对于这样的题,仅仅知道: 在文件系统中,文件的存储设备通常划分为若干个大小相等的物理块,每块长为512或1024字节.文件的理结构是指文件在存储设备上的存 ...

  3. 应用索引技术优化SQL 语句(转)

    原文出处 一.前言 很多数据库系统性能不理想是因为系统没有经过整体优化,存在大量性能低下的SQL 语句.这类SQL语句性能不好的首要原因是缺乏高效的索引.没有索引除了导致语句本身运行速度慢外,更是导致 ...

  4. Atitit 索引技术--位图索引

    Atitit 索引技术--位图索引 索引在数据结构上可以分为三种B树索引.位图索引和散列索引 存储原理 编辑 位图索引对数据表的列的每一个键值分别存储为一个位图,Oracle对于不同的版本,不同的操作 ...

  5. Indri中的动态文档索引技术

    Indri中的动态文档索引技术 戴维 译 摘要: Indri 动态文档索引的实现技术,支持在更新索引的同时处理用户在线查询请求. 文本搜索引擎曾被设计为针对固定的文档集合进行查询,对不少应用来说,这种 ...

  6. Lucene.Net 2.3.1开发介绍 —— 三、索引(二)

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(二) 2.索引中用到的核心类 在Lucene.Net索引开发中,用到的类不多,这些类是索引过程的核心类.其中Analyzer是索引建立的 ...

  7. Oracle索引技术研究

    Oracle索引类型 B树索引 特定类型索引 确定索引列 主键和唯一键值列的索引 外键索引 其他合适的索引列 B树索引 B树索引算法 B树是指B-tree(Balanced Tree),B树的存在是为 ...

  8. SQL Server索引总结二

    从CREATE开始 通过显式的CREATE INDEX命令 在创建约束时作为隐含的对象 随约束创建的隐含索引 当向表中添加如下两种约束之一时,就会创建隐含索引. 主键约束(聚集索引) 唯一约束(唯一索 ...

  9. MySQL索引(二)B+树在磁盘中的存储

    MySQL索引(二)B+树在磁盘中的存储 回顾  上一篇文章<MySQL索引为什么要用B+树>讲了MySQL为什么选择用B+树来作为底层存储结构,提了两个知识点: B+树索引并不能直接找 ...

随机推荐

  1. 奇怪的问题:android:focusable和android:clickable造成ListView的点击不了

    今天花了我很长时间,才解决一个很奇怪的问题,就是在ListView的点击反应不了的问题…… 在ListView中,如果其中一个元素设置为android:focusable="true&quo ...

  2. [Leetcode][Python]31: Next Permutation

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 31: Next Permutationhttps://oj.leetcode ...

  3. Qt编写端口扫描工具

    Qt提供了QTcpSocket类,可以方便地建立TCP连接.利用这一功能,Maxiee编写了一个简单地端口扫描工具. 软件的功能就是,扫描某一网段的固定端口,如80端口,若目的地址开放了这一端口,那么 ...

  4. struts2 全局格式化,格式化时间,金钱,数字

    //在前台页面去控制时间,数字,小数,金钱,是极其不明智的选择,除非你是写了良好的 js api 像freemarker , struts 都有良好的标签,我们应该好好利用,才发现的,给大家分享一下 ...

  5. android 强制设置横屏 判断是横屏还是竖屏

    判断activity 是横屏还是竖屏  方法 1: //根据设备配置信息 Configuration cf= this.getResources().getConfiguration(); //获取设 ...

  6. C#实现给手机发送短信

    public static void SendSMS(string FaSongUser, string ToUserList, string ContentStr)    {        //针对 ...

  7. Filemanager 的使用

    filemanager的使用包括: 1.创建文件夹 2.删除文件夹 3.写入文件 4.复制文件 5.移动文件 6.删除文件​ 一.创建文件夹​ 首先宏的定义一个字符串作为地址的​来获取当前的docum ...

  8. C#反序列化json字符串时,提示:应为来自命名空间“”的元素“root”。。遇到名称为“”、命名空间为“”的“None”。

    反序列化调用接口返回的字符串时,出现:应为来自命名空间“”的元素“root”..遇到名称为“”.命名空间为“”的“None”.,导致反序列化数据失败,这种失败并有时候并不会直接提示反序列化失败(抛异常 ...

  9. BZOJ 3566: [SHOI2014]概率充电器( 树形dp )

    通过一次dfs求出dp(x)表示节点x考虑了x和x的子树都没成功充电的概率, dp(x) = (1-p[x])π(1 - (1-dp[son])*P(edge(x, son)).然后再dfs一次考虑节 ...

  10. Android Bitmap与DrawAble与byte[]与InputStream之间的转换工具类【转】

    package com.soai.imdemo; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; ...