当前位置:文档之家› 经典的lucene实例代码及详细解析以及lucene结构流程介绍

经典的lucene实例代码及详细解析以及lucene结构流程介绍

经典的lucene实例代码及详细解析以及lucene结构流程介绍
经典的lucene实例代码及详细解析以及lucene结构流程介绍

本文摘要:

本文并给出一个经典的lucene全文收索例子代码。该例子功能是从磁盘文档建立索引,搜索该文档中的哪个TXT文件包含所搜索内容。最后再大致介绍Lucene的结构模块,应用流程希望对网友能有帮助。

创建索引代码:

package luceneL;

import java.io.File;

import java.io.FileReader;

import java.io.IOException;

import java.io.Reader;

import java.util.Date;

import org.apache.lucene.analysis.Analyzer;

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.document.Document;

import org.apache.lucene.document.Field;

import org.apache.lucene.index.CorruptIndexException;

import org.apache.lucene.index.IndexWriter;

import org.apache.lucene.store.LockObtainFailedException;

public class createIndex {

public static boolean createDocumentIndex(){

boolean bool=false;

//被索引的目录文件夹

File dirpath=new File("E:\\documentTest");

//索引文件存放的目录文件夹

File indexpath=new File("E:\\Index");

//分词,分词有StandardAnalyzer和SimpleAnalyzer两种

//lucene是将一句句话,一段话Field,分成一个个词Term进行索引搜索的。

Analyzer analyzer=new StandardAnalyzer();

try {

//向E:\\Index保存建立的索引Index内容

//用到IndexWriter类,这里需要传入的三个参数为:

//(索引目录文件夹,分词)

IndexWriter index=new IndexWriter(indexpath,analyzer,true);

File[] txtfiles=dirpath.listFiles();

long startTime=new Date().getTime();

for(int i=0;i

if(txtfiles[i].isFile()&&txtfiles[i].getName().endsWith(".txt")){ System.out.println("文件

"+txtfiles[i].getCanonicalPath()+"正在索引中。。。");

//Read将txt内容存进内存

Reader read=new FileReader(txtfiles[i]);

//创建Document的实例

Document doc=new Document();

//将field存进索引的Document

//Document添加读取的文章内容(缓存在内存中的文章内容read)

doc.add(new Field("content",read));

//Document添加文章对应路径信息等

//

doc.add(new

Field("path",txtfiles[i].getAbsolutePath(),Field.Store.YES,Field.Inde x.NO));

//index加Document,索引创建成功

index.addDocument(doc);

}

}

//索引优化optimize(),合并磁盘上的索引文件,以便减少文件的数量,从而也减少搜索索引的时间

index.optimize();

//注意关闭IndexWriter,立即将索引文件写入到目录磁盘中,生成索引文件

index.close();

long endTime=new Date().getTime();

System.out.println("共花了"+(endTime-startTime)+"毫秒将文档增加到索引中"+indexpath.getPath());

bool=true;

} catch (CorruptIndexException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (LockObtainFailedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return bool;

}

public static void main(String[] a){

createIndex.createDocumentIndex();

}

}//class createIndex

在创建索引代码中,我们注意到类 IndexWriter 的构造函数需要三个参数,第一个参数指定了所创建的索引要存放的位置,他可以是一个 File 对象,也可以是一个 FSDirectory 对象或者 RAMDirectory 对象。第二个参数指定了Analyzer 类的一个实现,也就是指定这个索引是用哪个分词器对文挡内容进行分词。第三个参数是一个布尔型的变量,如果为 true 的话就代表创建一个新的索引,为 false 的话就代表在原来索引的基础上进行操作。接着程序遍历了目录下面的所有文本文档,并为每一个文本文档创建了一个 Document 对象。然后把文本文档的两个属性:路径和内容加入到了两个 Field 对象中,接着在把这两个 Field 对象加入到 Document 对象中,最后把这个文档用 IndexWriter 类的 add 方法加入到索引中去。这样我们便完成了索引的创建。接下来我们进入在建立好的索引上进行搜索的部分。

搜索代码:

package luceneL;

import java.io.File;

import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.document.Document;

import org.apache.lucene.index.CorruptIndexException;

import org.apache.lucene.index.Term;

import org.apache.lucene.queryParser.ParseException;

import org.apache.lucene.queryParser.QueryParser;

import org.apache.lucene.search.Hits;

import org.apache.lucene.search.IndexSearcher;

import org.apache.lucene.search.Query;

import org.apache.lucene.search.TermQuery;

import org.apache.lucene.store.FSDirectory;

public class QueryString {

public static void main(String[] args) throws CorruptIndexException, IOException {

//想搜索的词

String queryStr="name";

//索引目录

File indexDir=new File("E:\\Index");

//创建directory,Index的映射地址,相当于电话本

FSDirectory directory=FSDirectory.getDirectory(indexDir, false);

IndexSearcher searcher2=new IndexSearcher(directory);

if(!indexDir.exists()){

System.out.println("索引目录不存在");

return;

}

//从Document的”content“中查找关键字,而在此之前文章全部变成小写toLowerCase()

Term term=new Term("content",queryStr.toLowerCase());

//查询命令

TermQuery luceneQuery=new TermQuery(term);

//结果保存在Hits中

Hits hits2=searcher2.search(luceneQuery);

for(int j=0;j

Document document=hits2.doc(j);

System.out.println("File:"+document.get("path"));

}

}

}

在索引代码中,类 IndexSearcher 的构造函数接受一个类型为 Directory 的对象,Directory 是一个抽象类,它目前有两个子类:FSDirctory 和RAMDirectory. 我们的程序中传入了一个 FSDirctory 对象作为其参数,代表了一个存储在磁盘上的索引的位置。构造函数执行完成后,代表了这个IndexSearcher 以只读的方式打开了一个索引。然后我们程序构造了一个 Term 对象,通过这个 Term 对象,我们指定了要在文档的内容中搜索包含关键词”lucene”的文档。接着利用这个 Term 对象构造出 TermQuery 对象并把这个TermQuery 对象传入到 IndexSearcher 的 search 方法中进行查询,返回的结果保存在 Hits 对象中。最后我们用了一个循环语句把搜索到的文档的路径都打印了出来。好了,我们的搜索应用程序已经开发完毕,怎么样,利用 Lucene 开发搜索应用程序是不是很简单。

Lucene 简介

Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一个开源项目。也是目前最为流行的基于 Java 开源全文检索工具包。

目前已经有很多应用程序的搜索功能是基于 Lucene 的,比如 Eclipse 的帮助系统的搜索功能。Lucene 能够为文本类型的数据建立索引,所以你只要能把你要索引的数据格式转化的文本的,Lucene 就能对你的文档进行索引和搜索。比如你要对一些 HTML 文档,PDF 文档进行索引的话你就首先需要把 HTML 文档和

PDF 文档转化成文本格式的,然后将转化后的内容交给 Lucene 进行索引,然后把创建好的索引文件保存到磁盘或者内存中,最后根据用户输入的查询条件在索引文件上进行查询。不指定要索引的文档的格式也使 Lucene 能够几乎适用于所有的搜索应用程序。

图 1 表示了搜索应用程序和 Lucene 之间的关系,也反映了利用 Lucene 构建搜索应用程序的流程:

图 1. 搜索应用程序和 Lucene 之间的关系

如图1所示:我们user要找Document得信息。最先将为Document文档建立Index 索引。然后通过search搜索Index从而找到我们想要的内容。

首先是创建索引。

索引通俗地说就是将内容做成书签目录,这样使得我们能更快地搜索得到内容。

对文档建立好索引后,就可以在这些索引上面进行搜索了。搜索引擎首先会对搜索的关键词进行解析,然后再在建立好的索引上面进行查找,最终返回和用户输入的关键词相关联的文档。所以创建索引很重要。

Document docOne=new Document();

docOne.add(new Field(**********));//向Document添加索引文件内容

IndexWriter index=new IndexWriter(indexDir,Analyzer,true/false);

index.add(docOne);//将Document对象加到索引中去

index.optimize();//优化索引

index.close();//关闭,在磁盘生成索引内容文档

Index生成成功

再是查询搜索:

FSDirectory directory=FSDirectory.getDirectory(indexDir, false);

//创建directory,索引Index的映射地址

IndexSearcher searcher2=new IndexSearcher(directory);//启用searcher

Term term=new Term("content",queryStr.toLowerCase());//要向Document 的content查找关键词term

TermQuery luceneQuery=new TermQuery(term); //查询命令建立

Hits hits2=searcher2.search(luceneQuery);//将结果保存在Hits中

再具体流程说明如下:

一下再是对索引和搜索的一些概念的介绍:

假设我们的电脑的目录中含有很多文本文档,我们需要查找哪些文档含有某个关键词。为了实现这种功能,我们首先利用 Lucene 对这个目录中的文档建立索引,然后在建立好的索引中搜索我们所要查找的文档。通过这个例子读者会对如何利用 Lucene 构建自己的搜索应用程序有个比较清楚的认识。

建立索引

为了对文档进行索引,Lucene 提供了五个基础的类,他们分别是 Document, Field, IndexWriter, Analyzer, Directory。下面我们分别介绍一下这五个类的用途:

Document

Document 是用来描述文档的,这里的文档可以指一个 HTML 页面,一封电子邮件,或者是一个文本文件。一个 Document 对象由多个 Field 对象组成的。可以把一个 Document 对象想象成数据库中的一个记录,而每个 Field 对象就是记录的一个字段。

Field

Field 对象是用来描述一个文档的某个属性的,比如一封电子邮件的标题和内容可以用两个 Field 对象分别描述。

Analyzer

在一个文档被索引之前,首先需要对文档内容进行分词处理,这部分工作就是由Analyzer 来做的。Analyzer 类是一个抽象类,它有多个实现。针对不同的语言和应用需要选择适合的 Analyzer。Analyzer 把分词后的内容交给 IndexWriter 来建立索引。

IndexWriter

IndexWriter 是 Lucene 用来创建索引的一个核心的类,他的作用是把一个个的Document 对象加到索引中来。

Directory

这个类代表了 Lucene 的索引的存储的位置,这是一个抽象类,它目前有两个实现,第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置。

总结

本文首先介绍了 Lucene 的一些基本概念,然后开发了一个应用程序演示了利用Lucene 建立索引并在该索引上进行搜索的过程。希望本文能够为学习 Lucene 的读者提供帮助。

基于Lucene的语段模糊匹配中文检索系统设计与实现

(责任编辑:陈和榜) 浙江理工大学学报,第26卷,第1期,2009年1月 Journal of Zhejiang Sci 2Tech U niversity Vol.26,No.1,J an.2009 文章编号:167323851(2009)0120109205收稿日期:2008-05-29 作者简介:黄 珏(1982-  ),女,浙江杭州人,助理研究员,主要从事搜索引擎,数字图书馆,软件工程方面的研究。基于Lucene 的语段模糊匹配中文检索系统设计与实现 黄 珏,黄志远 (浙江理工大学科技与艺术学院,杭州311121) 摘 要:为提高图书馆中文信息检索的精确度和有效性,设计了基于L ucene 的语段模糊匹配中文检索系统。其采用了自然语言处理中的词语切分技术,使输入条件可以直接通过自然语言的方式提交,同时针对语段匹配的实际问题情境,设计了一种新的结果有效性判别模型,提高了检索结果相似度的科学性和准确性。经过多次实验结果的统计,搜索结果有效性可提高12%。 关键词:L ucene ;语段;中文检索;有效性判别 中图分类号:TP393 文献标识码:A 0 引 言 信息检索技术在图书馆领域的应用是举足轻重的,然而,当前图书馆用户在检索资料的时候,常常会遇到这样的情况:记得一篇文章或一本书刊中的某段话,却记不清标题、作者、出版社之类的特征信息。凭着对这个语段的记忆,选取某些关键字/词进行查询,又无法快速准确的找到目标答案。个别数字资源自带的搜索引擎具有全文检索功能,允许用户输入一个语段来进行查询,但是查全率和查准率差强人意:要求输入条件与文档内容完全匹配,或者查询结果不能很好地对应用户感兴趣的内容。 首先,基于关键字/词和逻辑表达式的检索方式不能全面地反映用户的需求。由于用户输入的关键字/词之间,往往不存在任何联系,因此检索条件本身无法清晰表达用户的真正含义[1]。 其次,简单的关键字/词匹配,往往输出大量的文档,而真正相关的文本却很少,使得用户耗费很多的时间和精力处理一些不相关的结果。 因此建立一种基于语段模糊匹配的中文检索系统,为用户提供更为细致和有效的帮助是必要的。目前检索系统的开发平台并不多见,本文采用了一个较为实用的检索引擎架构———L ucene ,它结构精巧,功能强大,便于嵌入各种应用。在L ucene 良好的架构之上,本文结合最大正向匹配的中文分词算法,通过对L ucene 评分机制的改进,建立了一个新的文档有效性二次判别模型,设计了一个多维非线性计算函数得到搜索结果的相似度,并对搜索结果按照有效性来进行排序。与现有的图书馆中文检索系统相比,具有以下改进:输入全文中的某个语段(只需基本一致),即可搜索到与之相关的书籍/文章;检索的精度及结果集的有效性较一般检索系统有所提高。 1 基于Lucene 的语段模糊匹配中文检索系统设计 1.1 开放源码的搜索引擎(L ucene ) L ucene 是apache 软件基金会J akarta 项目组的子项目,是一个开放源代码的全文检索引擎工具包,它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构[2],提供了完整的查询引擎和索引引擎,部分

C程序代码大全

C程序代码大全 This manuscript was revised on November 28, 2020

<=70) cout<<"Your grade is a C."<=60) cout<<"Your grade is a D."< main() { int n; cout<<"n="; cin>>n; if (n>=0 && n<=100 &&n%2==0) cout<<"n="< main() { int a,b,Max; .10 for(int i=1;i<=10;i++) cout<=1;j--) cout<

一种基于Lucene的中文全文检索系统

—94— 一种基于Lucene 的中文全文检索系统 苏潭英1,郭宪勇2,金 鑫3 (1. 解放军信息工程大学电子技术学院,郑州 450004;2. 北京飞燕技术公司,北京 100072;3. 解放军通信指挥学院,武汉 430010)摘 要:在开源全文索引引擎Lucene 的基础上,设计了一个中文全文检索系统模型,该模型系统由7个模块组成,索引模块、检索模块是其中的核心部分。论述了模型的整体结构,分析设计了索引及检索模块,通过具体的索引技术和检索技术来提高整个系统的检索效率。该系统增加了加密模块,实现对建立的全文索引进行加密处理,增强了信息的安全性。 关键词:全文检索;Lucene ;倒排索引 Chinese Full-text Retrieval System Based on Lucene SU Tan-ying 1, GUO Xian-yong 2, JIN Xin 3 (1. Institute of Electronic Technology, PLA Information Engineering University, Zhengzhou 450004; 2. Technology Company of Beijing Feiyan, Beijing 100072; 3. Institute of PLA Communication Command, Wuhan 430010) 【Abstract 】This paper proposes a model of Chinese full-text retrieval system based on Lucene which is an open source full-text retrieval engine,and expatiates its frame. This model is composed of seven modules, among which the index module and the search module are the core parts. It designs them concretely, and improves the search efficiency of the full-text retrieval system with index technology and search technology. The system model concludes an encryption module to encrypt the index and increases the system security. 【Key words 】full-text retrieval; Lucene; inverse index 计 算 机 工 程Computer Engineering 第33卷 第23期 Vol.33 No.23 2007年12月 December 2007 ·软件技术与数据库· 文章编号:1000—3428(2007)23—0094—03 文献标识码:A 中图分类号:TP391 1 中文全文检索系统 全文检索技术是一个最普遍的信息查询应用,人们每天在网上使用Google 、百度等搜索引擎查找自己所需的信息,这些搜索引擎的核心技术之一就是全文检索。随着文档处理电子化、无纸化的发展,图书馆、新闻出版、企业甚至个人的电子数据激增,如何建立数据库、管理好自己的数据,是亟待解决的问题,而全文检索是其中一个非常实用的功能。全文检索产品实际上是一个内嵌该项技术的数据库产品[1]。 西文的全文检索已有许多成熟的理论与方法,其中,开放源代码的全文检索引擎Lucene 是Apache 软件基金会Jakarta 项目组的一个子项目,它的目的是为软件开发人员提供一个简单易用的工具包,方便在目标系统中实现全文检索的功能。很多项目使用了Lucene 作为其后台的全文索引引擎,比较著名的有: (1)Jive :Web 论坛系统; (2)Cocoon :基于XML 的Web 发布框架,全文检索部分使用了Lucene ; (3)Eclipse :基于Java 的开放开发平台,帮助部分的全文索引使用了Lucene 。 Lucene 不支持中文,但可以通过扩充它的语言分析器实现对中文的检索。本文在深入学习研究Lucene 的前提下,设计了一个中文的全文检索系统,对其核心的索引模块和检索模块进行了阐释,并添加了加密模块对索引信息加密,增强了系统的安全性。 2 系统的总体结构 本模型总体上采用了Lucene 的架构。Lucene 的体系结构如表1所示,它的源代码程序由7个模块组成。 表1 Lucene 的组成结构 模块名 功能 org.apache.Lucene.search 搜索入口 org.apache.Lucene.index 索引入口 org.apache.Lucene.analysis 语言分析器 org.apache.Lucene.queryParser 查询分析器 org.apache.Lucene.document 存储结构 org.apache.Lucene.store 底层IO/存储结构 org.apache.Lucene.util 一些公用的数据结构 本文通过扩充Lucene 系统来完成中文的全文检索系统,Lucene 包含了大量的抽象类、接口、文档类型等,需要根据具体应用来定义实现,本文对其作了如下扩充修改: (1)按照中文的词法结构来构建相应的语言分析器。Lucene 的语言分析器提供了抽象的接口,因此,语言分析(analyser)是可以定制的。Lucene 缺省提供了2个比较通用的分析器SimpleAnalyser 和StandardAnalyser ,但这2个分析器缺省都不支持中文,因此,要加入对中文语言的切分规则,需要对其进行修改。 (2)按照被索引的文件的格式对不同类型的文档进行解析,进而建立全文索引。例如HTML 文件,通常需要把其中的内容分类加入索引,这就需要从org.apache.lucene.子document 中定义的类Document 继承,定义自己的HTMLDocument 类,然后将之交给org. apache.lucene.index 模块写入索引文件。Lucene 没有规定数据源的格式,只提供 作者简介:苏潭英(1981-),女,硕士研究生,主研方向:数据库全文检索;郭宪勇,高级工程师;金 鑫,硕士研究生 收稿日期:2007-01-10 E-mail :sutanyingwendy@https://www.doczj.com/doc/4812519736.html,

lucene 版本变动总结

3.1 1. 性能提升 2. ReusableAnalyzerBase使得跟容易让TokenStreams 可重用 3. 改进分析器的功能,包括对Unicode的支持(Unicode 4)、CharTermAttribute、对象重用等 4. ConstantScoreQuery允许直接封装Query 对象 5. 可通过IndexWriterConfig 对IndexWriter 进行配置 6. IndexWriter.getReader 被IndexReader.open(IndexWriter) 所替换. 7. 废弃了MultiSearcher;ParallelMultiSearcher被直接吸收到IndexReader 类中 8. 在64位的Windows 和Solaris JVMs, MMapDirectory 作为默认的FSDirectory.open 的实现 9. 新的TotalHitCountCollector用来获取索引的命中数 10. ReaderFinishedListener API 用来清除外部缓存 3.2 1、全新的分组模块,位于lucene/contrib/grouping 使得搜索结果可通过单值的索引域进行分组 2、新的IndexUpgrader 工具,用来转换老格式的索引到当前的版本 3、实现一个新的Directory ——NRTCachingDirectory ,用来在内存中缓存一些小的segments,以减少应用对IO的负载过高,更快速的NRT 再次打开的效率 4、新的Collector 实现——CachingCollector,用来收集搜索命中率(文档ID和分值) 5、可使用IndexWriter 新的addDocuments 和updateDocuments 来批量创建和更新文档的索引 6、新的默认索引合并策略——TieredMergePolicy,更高效的合并非连续的segments,详见https://www.doczj.com/doc/4812519736.html,/merging 7、修复了NumericField 在加载已存储文档时没正确返回的问题 Deleted terms are now applied during flushing to the newly flushed segment, which is more efficient than having to later initialize a reader for that segment. 3.3 1、固定打开的文件句柄泄漏在很多地方代码。现在MockDirectoryWrapper(在测试框架)跟踪所有打开的文件、包括锁,并且如果测试失败,释放所有这些失败。 2、拼写检查suggest模块现在包括提示/自动完成功能、有三种实现:Jaspell,三元特里和有限状态https://www.doczj.com/doc/4812519736.html,/question/554168_155187 3、改进MMapDirectory(现在也是默认的实现通过FSDirectory.open在64位Linux)返回 4、NRTManager简化处理近乎实时搜索与多个搜索线程,允许应用程序来控制索引变化必须是可见的哪个搜索请求。 5、TwoPhaseCommitTool便于执行多资源两阶段提交,其中包括的IndexWriter。 6、默认合并策略,TieredMergePolicy,在默认情况下有一个新方法(套/

基于Lucene的网站全文搜索的设计与实现.

科技情报开发与经济 文章编号:1005-6033(2005)15-0242-03 SCI/TECHINFORMATIONDEVELOPMENT&ECONOMY2005年第15卷第15期 收稿日期:2005-06-03 基于Lucene的网站全文搜索的设计与实现 陈庆伟1,刘 军2 (1.山西省网络管理中心,山西太原,030001;2.山西省科技情报研究所,山西太原,030001)摘要:Lucene是一个基于Java技术的开放源代码全文索引引擎工具包,它可以方便 地嵌入到各种应用中实现针对应用的全文索引/检索功能。利用Lucene的API可以比较方便地为一个网站提供全文搜索功能。探讨了如何使用Lucene建造一个通用的Web站点全文搜索工具,并对在构建系统中应注意的若干问题进行了探讨。关键词:全文搜索;Lucene;Java中图分类号:TP393.07文献标识码:A 在构建一个信息类Web站点的时候,站点的全文搜索功能是必备的功能之一。一般站点的信息内容都存储在各种数据库系统中,并使用数据库提供的检索和查询功能构建网站的搜索功能。但随着信息的累‘%keyword%’查询构成的数据检索性能将积,使用数据库中的类似like急剧下降,因此,只使用数据库查询进行全文检索并不是一个好的解决它可以方便方案。Lucene是一个基于Java技术的全文索引引擎工具包,

地嵌入到各种应用中实现针对应用的全文索引/检索功能。例如Lucene可以快速实现一个简单、功能强大的数据全文检索系统。 PDFWord XSLT 格式化 各种输出 Text XML输出 XML格式 XML中间格式 DBLuceneDB 1设计目标 全文检索系统的主要功能就是为信息资料提供全文索引和查询。对 其他 专业格式 图1 接口的实现示意图 于一个以提供信息资料为主要目的网站来说,网站的全文检索系统是必备功能之一。但对于小型的信息网站来说,购置全文检索系统的代价经‘keyword’查询来代替全文检索常是昂贵的。如果只使用数据库的Like

用lucene实现在一个(或者多个)字段中查找多个关键字

用lucene实现在一个(或者多个)字段中查找多个关键字 最近跟着师兄们做个项目,我的任务就是负责做个“全文检索”的小模块。用到了Lucene 的索引,下面的是其中的用Lucene实现在索引的一个字段(比如文章内容字段)进行查找多个关键字的实例代码。 1.Lucene说明 Lucene是非常优秀的成熟的开源的免费的纯java语言的全文索引检索工具包。 Lucene的的强项在“建立索引”和”搜索“,而不是实现具体的”分词“。Lucene支持对生成索引的进行”增,删,改,查“操作,这比自己建立的索引有了很大的进步。 可以使用专门的分词程序进行分词,在分词的结果上用Lucene建立索引。 2.用Lucene实现在一个或者多个字段中的检索 主要是函数:MultiFieldQueryParser.parse(String[] query,String[] field,Occur[] occ,Analyzer analyzer); 1)query:要查找的字符串数组 2)field:要查找的字符串数组对应的字段(当然有可以相同的) 3)occ:表示对应字段的限制。有三种:Occur.MUST(必须有),Occur.MUST_NOT(必须没有),Occur.SHOULD(应该) 4)analyzer:对查询数据的分析器,最好与建立索引时用的分析器一致 3.代码示例 下面这个程序可以实现在一个字段“contents”中查找多个关键字。稍加修改也可以在多个字段查找多个关键字。 import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.queryParser.MultiFieldQueryParser; import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.search.Hits; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query;

C语言代码大全

------------------------------------------------------------------------摘自宋鲁生程序设计大赛 乘法口诀表 #include #include void main(void) { int i,j,x,y; clrscr(); printf("\n\n * * * 乘法口诀表* * * \n\n"); x=9; y=5; for(i=1;i<=9;i++) { gotoxy(x,y); printf("%2d ",i); x+=3; } x=7; y=6; for(i=1;i<=9;i++) { gotoxy(x,y); printf("%2d ",i); y++; } x=9; y= 6; for(i=1;i<=9;i++) { for(j=1;j<=9;j++) { gotoxy(x,y); printf("%2d ",i*j); y++; } y-=9; x+=3; } printf("\n\n"); }

用一维数组统计学生成绩 #include void main() { char SelectKey,CreditMoney,DebitMoney; while(1) { do{ clrscr(); puts("========================="); puts("| Please select key: |"); puts("| 1. Quary |"); puts("| 2. Credit |"); puts("| 3. Debit |"); puts("| 4. Return |"); puts("========================="); SelectKey = getch(); }while( SelectKey!='1' && SelectKey!='2' && SelectKey!='3' && SelectKey!='4' ); switch(SelectKey) { case '1': clrscr(); puts("================================"); puts("| Your balance is $1000. |"); puts("| Press any key to return... |"); puts("================================"); getch(); break; case '2': do{ clrscr(); puts("=================================="); puts("| Please select Credit money: |"); puts("| 1. $50 |"); puts("| 2. $100 |"); puts("| 3. Return |"); puts("=================================="); CreditMoney = getch(); }while( CreditMoney!='1' && CreditMoney!='2' && CreditMoney!='3' ); switch(CreditMoney)

lucene基础学习

搜索引擎Lucene 第一章Lucene简介 Lucene是apache软件基金会jakarta项目组的一个子项目,是一个开放源代码[的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。 第二章lucene索引的建立 的五个基础类 索引的建立,Lucene 提供了五个基础类,分别是Document, Field, IndexWriter, Analyzer, Directory。以下是他们的用途: Document Document的含义为文档,在Lucene中,它代表一种逻辑文件。Lucene本身无法对物理文件建立索引,而只能识别并处理Document的类型文件。Lucene从Document取出相关的数据源并根据属性配置进行相应的处理。 Field 对象是用来描述一个文档的某个属性的 lucene中的field也具有一些特定的类型如

在中,Field内部包含两个静态的内部类分别是Store和Index详细的描述了Field的属性,它们分别表示Field的储存方式和索引方式。 Store类有3个公有的静态属性: :表示该Field不需要储存。 :表示该Field需要储存。 :表示使用压缩方式来保存这个Field的值。 Index有4个公有的静态属性: :表示该Field不需要索引,也就是用户不需要去查找该Field的值。 :表示该Field先被分词再被索引。 TOKENIZED:表示不对该Field进行分词,但是要对他进行索引,也就是该Field会被用户查找。 :表示对该Field进行索引,但是不使用Analyzer,同时禁止它参加评分,主要是为了减少内存的消耗。 Analyzer

Lucene初级教程

Lucene初级教程 2007-12-26 15:24 点击次数:0 次 1 lucene简介 1.1 什么是lucene Lucene是一个全文搜索框架,而不是应用产品。因此它并不像https://www.doczj.com/doc/4812519736.html,或者google Desktop 那么拿来就能用,它只是提供了一种工具让你能实现这些产品。 2 lucene的工作方式 lucene提供的服务实际包含两部分:一入一出。所谓入是写入,即将你提供的源(本质是字符串)写入索引或者将其从索引中删除;所谓出是读出,即向用户提供全文搜索服务,让用户可以通过关键词定位源。 2.1写入流程 源字符串首先经过analyzer处理,包括:分词,分成一个个单词;去除stopword(可选)。 将源中需要的信息加入Document的各个Field中,并把需要索引的Field索引起来,把需要存储的Field 存储起来。 将索引写入存储器,存储器可以是内存或磁盘。 2.2读出流程 用户提供搜索关键词,经过analyzer处理。 对处理后的关键词搜索索引找出对应的Document。 用户根据需要从找到的Document中提取需要的Field。 3 一些需要知道的概念 3.1 analyzer Analyzer是分析器,它的作用是把一个字符串按某种规则划分成一个个词语,并去除其中的无效词语,这里说的无效词语是指英文中的“of”、“the”,中文中的“的”、“地”等词语,这些词语在文章中大量出现,但是本身不包含什么关键信息,去掉有利于缩小索引文件、提高效率、提高命中率。 分词的规则千变万化,但目的只有一个:按语义划分。这点在英文中比较容易实现,因为英文本身就是以单词为单位的,已经用空格分开;而中文则必须以某种方法将连成一片的句子划分成一个个词语。具体划分方法下面再详细介绍,这里只需了解分析器的概念即可。 3.2 document 用户提供的源是一条条记录,它们可以是文本文件、字符串或者数据库表的一条记录等等。一条记录经过索引之后,就是以一个Document的形式存储在索引文件中的。用户进行搜索,也是以Document列表的形式返回。 3.3 field 一个Document可以包含多个信息域,例如一篇文章可以包含“标题”、“正文”、“最后修改时间”等信息域,这些信息域就是通过Field在Document中存储的。 Field有两个属性可选:存储和索引。通过存储属性你可以控制是否对这个Field进行存储;通过索引属性你可以控制是否对该Field进行索引。这看起来似乎有些废话,事实上对这两个属性的正确组合很重要,下面举例说明:还是以刚才的文章为例子,我们需要对标题和正文进行全文搜索,所以我们要把索引属性设置为真,同时我们希望能直接从搜索结果中提取文章标题,所以我们把标题域的存储属性设置为真,但是由于正文域太大了,我们为了缩小索引文件大小,将正文域的存储属性设置为假,当需要时再直接读取文件;我们只是希望能从搜索解果中提取最后修改时间,不需要对它进行搜索,所以我们把最后修改时间域的存储属性设置为真,索引属性设置为假。上面的三个域涵盖了两个属性的三种组合,还有一种全为假的没有用到,事实上Field不允许你那么设置,因为既不存储又不索引的域是没有意义的。

C 经典程序代码大全

C 经典程序代码大全 #include const float PI= 3.1416; //声明常量(只读变量)PI为 3.1416 float fCir_L(float); //声明自定义函数fCir_L()的原型 float fCir_S(float); //声明自定义函数fCir_S()的原型 //以下是main()函数 main() { float r,l,s; //声明3个变量 cout>r; //键盘输入 l=fCir_L(r); //计算圆的周长,赋值给变量l s=fCir_S(r); //计算圆的面积,赋值给变量s cout=0.0) //如果参数大于0,则计算圆的周长 z=2*PI*x; return(z); //返回函数值 } //定义计算圆的面积的函数fCir_S() float fCir_S(float x) { float z=- 1.0; //声明局部变量 if (x>=0.0) //如果参数大于0,则计算圆的面积 z=PI*x*x; return(z); //返回函数值 } /* Program: P1- 2.CPP Written by: Hap Date written: 02:11:10 */ #include void main(void) { double s1,s2,s3; s1= 1.5; /* 对变量s1赋值*/ cout main() { double r=

1.0; cout>r; //键盘输入 l=2* 3.1416*r; //计算圆的周长,赋值给变量l cout //包含iostream.h头文件 void main() { //输出字符常量.变量和字符串 char c1= A ; cout //包含iostream.h头文件 main() { //输入输出字符 char c; cin>>c; cout>n; cout>x; cout>n; cout>c>>n>>x; cout //包含iostream.h头文件 main() { //声明整型变量 int a,b; //从键盘上为整型变量赋值cout>a; cout>b; //整型数的算术运算 cout //包含iostream.h 头文件 main() { //声明变量,并初始化 int a=010,b=10,c=0X10; //以进制形式显示数据 cout>a; cout>b; cout>c; cout //包含iostream.h头文件 #include // iomanip.h头文件包含setprecision()的定义 main() { //float型变量的声明.输入.计算和输出 float fx,fy; cout>fx; cout>fy; cout>dx; cout>dy; cout //包含iostream.h 头文件 main() { //字符类型变量的声明 char c1= A ; char c2; //字符数据的运算及输出 c2=c1+32; cout>c1>>c2; cout //包含iostream.h头文件 main() { char c1= \a ,TAB= \t ; //阵铃一声 cout //包含iostream.h头文件 main()

lucene索引优化

这篇文章主要介绍了如何提高Lucene的索引速度。介绍的大部分思路都是很容易尝试的,当然另外一部分可能会加大你程序的复杂度。所以请确认索引速度确实很慢,而且很慢的原因确实是因为Lucene自身而造成的。推荐姐妹篇:如何提高和优化Lucene搜索速度 ? 确认你在使用最新的Lucene版本。 ? 尽量使用本地文件系统 远程文件系统一般来说都会降低索引速度。如果索引必须分布在远程服务器,请尝试先在本地生成索引,然后分发到远程服务器上。 ? 使用更快的硬件设备,特别是更快的IO设备 ? 在索引期间复用单一的IndexWriter实例 ? 使用按照内存消耗Flush代替根据文档数量Flush 在Lucene 2.2之前的版本,可以在每次添加文档后调用ramSizeInBytes方法,当索引消耗过多的内存时,然后在调用flush()方法。这样做在索引大量小文档或者文档大小不定的情况下尤为有效。你必须先把maxBufferedDocs参数设置足够大,以防止writer基于文档数量flush。但是注意,别把这个值设置的太大,否则你将遭遇Lucene-845号BUG。不过这个BUG已经在2.3版本中得到解决。 在Lucene2.3之后的版本。IndexWriter可以自动的根据内存消耗调用flush()。你可以通过writer.setRAMBufferSizeMB()来设置缓存大小。当你打算按照内存大小flush后,确保没有在别的地方设置MaxBufferedDocs值。否则flush条件将变的不确定(谁先符合条件就按照谁)。 ? 在你能承受的范围内使用更多的内存 在flush前使用更多的内存意味着Lucene将在索引时生成更大的segment,也意味着合并次数也随之减少。在Lucene-843中测试,大概48MB内存可能是一个比较合适的值。但是,你的程序可能会是另外一个值。这跟不同的机器也有一定的关系,请自己多加测试,选择一个权衡值。 ? 关闭复合文件格式 调用setUseCompoundFile(false)可以关闭复合文件选项。生成复合文件将消耗更多的时间(经过Lucene-888测试,大概会增加7%-33%的时间)。但是请注意,这样做将大大的增加搜索和索引使用的文件句柄的数量。如果合并因子也很大的话,你可能会出现用光文件句柄的情况。 ? 重用Document和Field实例

C经典程序代码大全

//根据半径计算圆的周长和面积#include const float PI=3.1416; //声明常量(只读变量)PI为3.1416 float fCir_L(float); //声明自定义函数fCir_L()的原型 float fCir_S(float); //声明自定义函数fCir_S()的原型 //以下是main()函数 main() { float r,l,s; //声明3个变量 cout<<"r="; //显示字符串 cin>>r; //键盘输入 l=fCir_L(r); //计算圆的周长,赋值给变量l s=fCir_S(r); //计算圆的面积,赋值给变量s cout<<"l="<= 80 && s < 90) { MessageBox.Show("良好"); } else if (s >= 70 && s < 80) { MessageBox.Show("中"); } else if (s >= 60 && s < 70) { MessageBox.Show("及格"); } else { MessageBox.Show("不及格"); } } 2)一元二次方程求解 private void button1_Click(object sender, EventArgs e) { double a = double.Parse(txb_A.Text), b = double.Parse(txb_B.Text), c = double.Parse(txb_C.Text); if (a == 0) { MessageBox.Show("方程的根是:" + (-c / b).ToString()); } else { double delta = Math.Pow(b, 2) - 4 * a * c;

if (delta >= 0) { double X1 = (-b + Math.Pow(delta, 0.5)) / 2 * a; double X2 = (-b - Math.Pow(delta, 0.5)) / 2 * a; string temp = "X1="+X1.ToString()+"\r\nX2="+X2.ToString(); MessageBox.Show(temp); } else { MessageBox.Show("没有实数根!"); } } } 3)1-100之间所有整数的和,能被某数整除的所有整数的和,积 private void button1_Click(object sender, EventArgs e) { int sum = 0; for (int i = 0; i <= 100; i = i + 1) { sum = sum + i; } textBox1.Text = sum.ToString(); } 求1~100之内所有偶数的和 int sum = 0; for (int i = 0; i <= 100; i = i + 2) { sum = sum + i; } textBox1.Text = sum.ToString(); private void button1_Click(object sender, EventArgs e) { int sum = 0; int a; for (int i = 0; i <= 100; i++) { a = i % 7; if (a == 0) { sum = sum + i;

Lucene3.0之搜索

Lucene3.0之查询处理(1):原理 1、查询的三种方式 ①顺序查询:简单,但查询效率低 ②索引查询:快速,需要基础索引结构支撑 2、理论模型 ①布尔模型:基于集合论和布尔代数的一种简单检索模型 ②向量模型:查询串和文档之间分配不同的权值,权值大小放映了文档库中的文档 与用户查询串的相关度。查询得到的结果文档按照权值计算相关度有关排序,所以向量模型得到的匹配文档可以是全部精确匹配,也可以是部分匹配查询串。 3、查询流程 用户查询请求输入->查询词频->查询词频出现->查询词格式化->文本库索引匹配->相似度和排序计算->结果排重与生成。 4、Lucence3.0查询概述 1、主要利用查询工具IndexSearcher类 这是检索的主要控制和工具,也是所有搜索操作的入口。其构造方法主要有: IndexSearcher(Directory path) IndexSearcher(Directory path, boolean readOnly) IndexSearcher(IndexReader r) IndexSearcher(IndexReader reader, IndexReader[] subReaders, int[] docStarts) 这里推荐主要使用第1个和第2个构造方法。 2、其它相关的类 ①Query:抽象类,必须通过一系列子类来表述检索的具体需求。 ②QueryParser:查询分析器。处理用户输入的查询条件。把用户输入的非格式化检 索词转化成后台检索可以理解的Query对象 查询最基本的结果返回方式是通过Hits对象来提供。Hits提供了检索查询结果的缓冲,为结果的展示和返回提供支持。Hits中的结果集已经按照相关性进行了排序,前面的文档结果表明与查询词更为相似。 Lucene3.0之查询(2):查询类型 1、查询Query对象 Lucnce查询主要有两种方式。一是通过Query子类构造函数方法生成子类。这种方法最大的好处是非常直观,可以根据自己的功能目标挑选合适的子类来够着具体的Query对象。 另一种查询方式是通过QueryParse动态构造查询对象。这种方法使用了parse方法,具体构造的对象类型需要根据查询词的内容来确定。除了少数特殊查询,几乎所有的查询检索都可以通过QueryParser来代替特定子类的构造函数来查询对象生成功能。 2、最小项查询TermQuery 适合关键字查询文档,大小写敏感。 ①Term term = new Term(“content”, “星期一”);

相关主题
文本预览
相关文档 最新文档