`
lc0451
  • 浏览: 46852 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类

lucene 索引技术

阅读更多
一、 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对象
0
0
分享到:
评论

相关推荐

    基于lucene技术的增量索引

    基于lucene技术的增量索引,实现索引的首次创建,动态增删改

    LUCENE索引搜索数据库技术汇总

    这是我学LUCENE索引数据库表并且搜索相关字段的时期整理出来的几个不错的资料,我觉得里面总有一款会适合你,而且你所需要知道的技术里面基本上都是涵盖的,所以可以当作教材或者参考手册使用。

    Lucene索引分析工具

    此工具是管理Lucene.net全文索引的利器,对新的盘古分词支持也相当给力。

    深入理解Luncen搜索引擎开发

    第2章 Lucene索引 Lucene索引里有什么 Lucene索引深入 Lucene索引深入优化 Lucene索引搜索 第3章 Lucene搜索实战 Lucene搜索实战 Lucene搜索深入实战 Lucene搜索深入实战进阶 第4章 Lucene高级 Lucene高级进阶 ...

    淘特大型门户网站CMS企业版

    8、搜索采用Lucene索引技术,支持任务管理,搜索速度相当于百度、GOOGLE 9、系统自带数据库连接池,性能高效,已经过Jmeter各种条件的压力测试;同时支持可选多种容器连接池。 10、支持Mysql,Sqlserver数据库 11...

    Lucene in Action 中文版

     《Lucene实战 第2版 》基于Apache的Lucene 3 0 从Lucene核心 Lucene应用 案例分析3个方面详细系统地介绍了Lucene 包括认识Lucene 建立索引 为应用程序添加搜索功能 高级搜索技术 扩展搜索 使用Tika提取文本 Lucene...

    Lucene实战

    《Lucene实战(第2版)》基于Apache的Lucene 3.0,从Lucene核心、Lucene应用、案例分析3个方面详细系统地介绍了Lucene,包括认识Lucene、建立索引、为应用程序添加搜索功能、高级搜索技术、扩展搜索、使用Tika提取文本...

    淘特Asp.Net Cms(1.0)

    9. 搜索采用Lucene索引技术,支持任务管理,站内搜索速度相当于百度、GOOGLE 10. 强大的采集系统,多线程并发采集、基于TASK任务的定时采集功能。 11. 高性能的计数统计模块,缓存+定时批量处理入库,访问量在百万...

    基于Jakarta Lucene的LIUS索引框架---下载不扣分,回帖加1分,欢迎下载,童叟无欺

    针对JavaBeans的索引特别有用当我们要对数据库进行索引或刚好用户使用持久层ORM技术如:Hibernate,JDO,Torque,TopLink进行开发时。 This project aims to integrate lius into compass(that is based on lucene). ...

    Lucene in action(中文版)

    《Lucene实战(第2版)》基于Apache的Lucene 3.0,从Lucene核心、Lucene应用、案例分析3个方面详细系统地介绍了Lucene,包括认识Lucene、建立索引、为应用程序添加搜索功能、高级搜索技术、扩展搜索、使用Tika提取文本...

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

    Lucene的知识主要分为索引、搜索、分析器、性能优化几个部分。索引和搜索没啥可说的,看几个例子就会了,来回那一套儿,按部就班做几个实验就熟悉了。分析器是Lucence的精华,又分为分词和过滤两部分,而且中文分词...

    Lucene实战中文版第2版.pdf

    lcene实战(第2版)》基于apache的lucene3.0,从lucene核心、lucene应用、案例分析3个方面详细系统地介绍了lucene,包括认识lucene、建立索引、为应用程序添加搜索功能、高级搜索技术、扩展搜索、使用tika提取文本、...

    LuceneInAction(第2版)_cn.pdf

     《Lucene实战(第2版)》基于Apache的Lucene 3.0,从Lucene核心、Lucene应用、案例分析3个方面详细系统地介绍了Lucene,包括认识Lucene、建立索引、为应用程序添加搜索功能、高级搜索技术、扩展搜索、使用Tika提取...

    lucene:lucene技术细节

    lucene lucene词典的构造原理 lucene模糊查询以及正则查询的原理 lucene删除索引的实现 lucene段merge的过程 lucene怎么实现Field lucene的分词过程

    有关Lucene的问题(8):用Lucene构建实时索引的文档更新问题[整理].pdf

    有关Lucene的问题(8):用Lucene构建实时索引的文档更新问题[整理].pdf

    基于合并因子的多种格式文件索引技术

    基于合并因子的多种格式文件索引技术,基于Lucene的全文索引技术,全文检索引擎的开发应用。

    java(结合lucene)版的公交搜索系统的实现.rar

    Lucene索引:利用Lucene技术建立公交线路和站点信息的全文索引,实现快速的路线搜索和匹配功能,提高系统查询效率。 多线程优化:采用多线程技术处理用户请求和数据更新,提高系统的并发处理能力和响应速度。 ...

    lucene搜索引擎配置详解

    lucene搜索引擎配置,从载入文件,建立索引,搜索三步让你知道lucene搜索的核心技术

    论文研究-基于Lucene的地名数据库快速检索系统.pdf

    其次,利用内存索引和多线程并行处理技术提高Lucene创建倒排索引效率,并依据地名类别和显示优先级属性优化了检索结果相关度排序策略。最后,开发了一套具有快速搜索和地图定位展示的Web地名检索系统,使用500万条...

    Lucene实战中文版第2版

    《Lucene实战(第2版)》基于apache的Lucene3.0,从Lucene核心、Lucene应用、案例分析3个方面详细系统地介绍了Lucene,包括认识Lucene、建立索引、为应用程序添加搜索功能、高级搜索技术、扩展搜索、使用tika提取...

Global site tag (gtag.js) - Google Analytics