- 浏览: 106555 次
- 性别:
- 来自: 吉林
文章分类
最新评论
lucene第一步,lucene基础,索引创建
出自:http://blog.csdn.net/wxwzy738/article/details/8799184 的整理
1、工程结构
2、索引创建时的属性:
Field.Store.YES或者NO(存储域选项)
设置为YES表示或把这个域中的内容完全存储到文件中,方便进行文本的还原
设置为NO表示把这个域的内容不存储到文件中,但是可以被索引,此时内容无法完全还原(doc.get)
Field.Index(索引选项)
Index.ANALYZED:进行分词和索引,适用于标题、内容等
Index.NOT_ANALYZED:进行索引,但是不进行分词,如果身份证号,姓名,ID等,适用于精确搜索
Index.ANALYZED_NOT_NORMS:进行分词但是不存储norms信息,这个norms中包括了创建索引的时间和权值等信息
norms中存储了很多排序的信息,
Index.NOT_ANALYZED_NOT_NORMS:即不进行分词也不存储norms信息
Index.NO:不进行索引
3、lucene的增删改查类
[java]
view plaincopy
- packageorg.itat.index;
- importjava.io.IOException;
- importjava.text.ParseException;
- importjava.text.SimpleDateFormat;
- importjava.util.Date;
- importjava.util.HashMap;
- importjava.util.Map;
- importorg.apache.lucene.analysis.standard.StandardAnalyzer;
- importorg.apache.lucene.document.Document;
- importorg.apache.lucene.document.Field;
- importorg.apache.lucene.document.NumericField;
- importorg.apache.lucene.index.CorruptIndexException;
- importorg.apache.lucene.index.IndexReader;
- importorg.apache.lucene.index.IndexWriter;
- importorg.apache.lucene.index.IndexWriterConfig;
- importorg.apache.lucene.index.StaleReaderException;
- importorg.apache.lucene.index.Term;
- importorg.apache.lucene.search.IndexSearcher;
- importorg.apache.lucene.search.ScoreDoc;
- importorg.apache.lucene.search.TermQuery;
- importorg.apache.lucene.search.TopDocs;
- importorg.apache.lucene.store.Directory;
- importorg.apache.lucene.store.LockObtainFailedException;
- importorg.apache.lucene.store.RAMDirectory;
- importorg.apache.lucene.util.Version;
- publicclassIndexUtil{
- privateString[]ids={"1","2","3","4","5","6"};
- privateString[]emails={"aa@itat.org","bb@itat.org","cc@cc.org","dd@sina.org","ee@zttc.edu","ff@itat.org"};
- privateString[]contents={
- "welcometovisitedthespace,Ilikebook",
- "helloboy,Ilikepingpengball",
- "mynameisccIlikegame",
- "Ilikefootball",
- "IlikefootballandIlikebasketballtoo",
- "Ilikemovieandswim"
- };
- privateDate[]dates=null;
- privateint[]attachs={2,3,1,4,5,5};
- privateString[]names={"zhangsan","lisi","john","jetty","mike","jake"};
- privateDirectorydirectory=null;
- privateMap<String,Float>scores=newHashMap<String,Float>();
- privatestaticIndexReaderreader=null;
- publicIndexUtil(){
- try{
- setDates();
- scores.put("itat.org",2.0f);
- scores.put("zttc.edu",1.5f);
- //directory=FSDirectory.open(newFile("d:/lucene/index02"));
- directory=newRAMDirectory();
- index();
- reader=IndexReader.open(directory,false);
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- /**
- *对于IndexReader而言,反复使用Index.open打开会有很大的开销,所以一般在整个程序的生命周期中
- *只会打开一个IndexReader,通过这个IndexReader来创建不同的IndexSearcher,如果使用单例模式,
- *可能出现的问题有:
- *1、当使用Writer修改了索引之后不会更新信息,所以需要使用IndexReader.openIfChange方法操作
- *如果IndexWriter在创建完成之后,没有关闭,需要进行commit操作之后才能提交
- *@return
- */
- publicIndexSearchergetSearcher(){
- try{
- if(reader==null){
- reader=IndexReader.open(directory,false);
- }else{
- IndexReadertr=IndexReader.openIfChanged(reader);
- //如果原来的reader没改变,返回null
- //如果原来的reader改变,则更新为新的索引
- if(tr!=null){
- reader.close();
- reader=tr;
- }
- }
- returnnewIndexSearcher(reader);
- }catch(CorruptIndexExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- returnnull;
- }
- privatevoidsetDates(){
- SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");
- try{
- dates=newDate[ids.length];
- dates[0]=sdf.parse("2010-02-19");
- dates[1]=sdf.parse("2012-01-11");
- dates[2]=sdf.parse("2011-09-19");
- dates[3]=sdf.parse("2010-12-22");
- dates[4]=sdf.parse("2012-01-01");
- dates[5]=sdf.parse("2011-05-19");
- }catch(ParseExceptione){
- e.printStackTrace();
- }
- }
- /**
- *把之前删除的索引数据进行恢复
- */
- publicvoidundelete(){
- //使用IndexReader进行恢复
- try{
- IndexReaderreader=IndexReader.open(directory,false);
- //恢复时,必须把IndexReader的只读(readOnly)设置为false
- reader.undeleteAll();
- reader.close();
- }catch(CorruptIndexExceptione){
- e.printStackTrace();
- }catch(StaleReaderExceptione){
- e.printStackTrace();
- }catch(LockObtainFailedExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- /**
- *forceMerge是lucene3.5之前替代optimize方法的,其实只是改了个名称,因为优化的使效率变低
- *因为一到优化它就会全部更新索引,这个所涉及到的负载是很大的
- *所以改了个名称,不推荐使用,在做优化的时候会把索引回收站中的数据文件全部删除
- *lucene会在你写索引的时候根据你的索引的段越来越多会自动帮忙优化的,force是强制优化
- */
- publicvoidmerge(){
- IndexWriterwriter=null;
- try{
- writer=newIndexWriter(directory,
- newIndexWriterConfig(Version.LUCENE_35,newStandardAnalyzer(Version.LUCENE_35)));
- //会将索引合并为2段,这两段中的被删除的数据会被清空
- //特别注意:此处Lucene在3.5之后不建议使用,因为会消耗大量的开销,
- //Lucene会根据情况自动处理的
- writer.forceMerge(2);
- }catch(CorruptIndexExceptione){
- e.printStackTrace();
- }catch(LockObtainFailedExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }finally{
- try{
- if(writer!=null)writer.close();
- }catch(CorruptIndexExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- }
- /**
- *假如你想要强制删除回收站的信息可以调用writer.forceMergeDeletes()这个方法,
- *但是这个方法不推荐使用,比较消耗内存,lucene会自动根据容量的大小删除所删除的文件
- */
- publicvoidforceDelete(){
- IndexWriterwriter=null;
- try{
- writer=newIndexWriter(directory,
- newIndexWriterConfig(Version.LUCENE_35,newStandardAnalyzer(Version.LUCENE_35)));
- writer.forceMergeDeletes();
- }catch(CorruptIndexExceptione){
- e.printStackTrace();
- }catch(LockObtainFailedExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }finally{
- try{
- if(writer!=null)writer.close();
- }catch(CorruptIndexExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- }
- /**
- *删除索引数据,默认不会完全删除,被放入索引回收站
- */
- publicvoiddelete(){
- IndexWriterwriter=null;
- try{
- writer=newIndexWriter(directory,
- newIndexWriterConfig(Version.LUCENE_35,newStandardAnalyzer(Version.LUCENE_35)));
- //参数是一个选项,可以是一个Query,也可以是一个term,term是一个精确查找的值
- //此时删除的文档并不会被完全删除,而是存储在一个回收站中的,可以恢复
- //执行完这个操作,索引文件夹下就会多出一个名叫_0_1.del的文件,也就是删除的文件在这个文件中记录了
- writer.deleteDocuments(newTerm("id","1"));
- writer.commit();
- }catch(CorruptIndexExceptione){
- e.printStackTrace();
- }catch(LockObtainFailedExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }finally{
- try{
- if(writer!=null)writer.close();
- }catch(CorruptIndexExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- }
- /**
- *使用reader删除,其实里面也会调用writer删除,
- *优点是使用reader删除马上会更新索引信息
- *现在一般还是使用writer来删除,reader.getWriter这个方法被过时了
- */
- publicvoiddelete02(){
- try{
- reader.deleteDocuments(newTerm("id","1"));
- }catch(CorruptIndexExceptione){
- e.printStackTrace();
- }catch(LockObtainFailedExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- /**
- *更新操作
- *Lucene并没有提供更新,这里的更新操作其实是如下两个操作的合集
- *先删除之后再添加
- */
- publicvoidupdate(){
- IndexWriterwriter=null;
- try{
- writer=newIndexWriter(directory,
- newIndexWriterConfig(Version.LUCENE_35,newStandardAnalyzer(Version.LUCENE_35)));
- Documentdoc=newDocument();
- doc.add(newField("id","11",Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
- doc.add(newField("email",emails[0],Field.Store.YES,Field.Index.NOT_ANALYZED));
- doc.add(newField("content",contents[0],Field.Store.NO,Field.Index.ANALYZED));
- doc.add(newField("name",names[0],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
- writer.updateDocument(newTerm("id","1"),doc);
- }catch(CorruptIndexExceptione){
- e.printStackTrace();
- }catch(LockObtainFailedExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }finally{
- try{
- if(writer!=null)writer.close();
- }catch(CorruptIndexExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- }
- publicvoidquery(){
- try{
- IndexReaderreader=IndexReader.open(directory);
- //通过reader可以有效的获取到文档的数量
- System.out.println("numDocs:"+reader.numDocs());//存储的文档数//不包括被删除的
- System.out.println("maxDocs:"+reader.maxDoc());//总存储量,包括在回收站中的索引
- System.out.println("deleteDocs:"+reader.numDeletedDocs());
- reader.close();
- }catch(CorruptIndexExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- /**
- *索引文件后缀为.fmn为保存的是域的名称等
- *.fdt和.fdx保存的是Store.YES的信息,保存域里面存储的数据
- *.frq表示这里的域哪些出现多少次,哪些单词出现多少次,
- *.nrm存储一些评分信息
- *.prx存储一些偏移量等
- *.tii和.tis专门存储索引里面的所有内容信息
- */
- publicvoidindex(){
- IndexWriterwriter=null;
- try{
- //在2.9版本之后,lucene的就不是全部的索引格式都兼容的了,所以在使用的时候必须写明版本号
- writer=newIndexWriter(directory,newIndexWriterConfig(Version.LUCENE_35,newStandardAnalyzer(Version.LUCENE_35)));
- writer.deleteAll();//清空索引
- Documentdoc=null;
- for(inti=0;i<ids.length;i++){
- doc=newDocument();
- doc.add(newField("id",ids[i],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
- doc.add(newField("email",emails[i],Field.Store.YES,Field.Index.NOT_ANALYZED));
- doc.add(newField("email","test"+i+"@test.com",Field.Store.YES,Field.Index.NOT_ANALYZED));
- doc.add(newField("content",contents[i],Field.Store.NO,Field.Index.ANALYZED));
- doc.add(newField("name",names[i],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
- //存储数字
- //NumberTools.stringToLong("");已经被标记为过时了
- doc.add(newNumericField("attach",Field.Store.YES,true).setIntValue(attachs[i]));
- //存储日期
- doc.add(newNumericField("date",Field.Store.YES,true).setLongValue(dates[i].getTime()));
- Stringet=emails[i].substring(emails[i].lastIndexOf("@")+1);
- System.out.println(et);
- if(scores.containsKey(et)){
- doc.setBoost(scores.get(et));
- }else{
- doc.setBoost(0.5f);//默认是1.0f
- }
- writer.addDocument(doc);
- }
- }catch(CorruptIndexExceptione){
- e.printStackTrace();
- }catch(LockObtainFailedExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }finally{
- try{
- if(writer!=null)writer.close();
- }catch(CorruptIndexExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- }
- publicvoidsearch01(){
- try{
- IndexReaderreader=IndexReader.open(directory);
- IndexSearchersearcher=newIndexSearcher(reader);
- TermQueryquery=newTermQuery(newTerm("email","test0@test.com"));
- TopDocstds=searcher.search(query,10);
- for(ScoreDocsd:tds.scoreDocs){
- Documentdoc=searcher.doc(sd.doc);
- System.out.println("("+sd.doc+"-"+doc.getBoost()+"-"+sd.score+")"+
- doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+
- doc.get("attach")+","+doc.get("date")+","+doc.getValues("email")[1]);
- }
- reader.close();
- }catch(CorruptIndexExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- publicvoidsearch02(){
- try{
- IndexSearchersearcher=getSearcher();
- TermQueryquery=newTermQuery(newTerm("content","like"));
- TopDocstds=searcher.search(query,10);
- for(ScoreDocsd:tds.scoreDocs){
- Documentdoc=searcher.doc(sd.doc);
- System.out.println(doc.get("id")+"---->"+
- doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+
- doc.get("attach")+","+doc.get("date")+","+doc.getValues("email")[1]);
- }
- searcher.close();
- }catch(CorruptIndexExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- }
[java]
view plaincopy
- packageorg.itat.test;
- importorg.itat.index.IndexUtil;
- importorg.junit.Test;
- publicclassTestIndex{
- @Test
- publicvoidtestIndex(){
- IndexUtiliu=newIndexUtil();
- iu.index();
- }
- @Test
- publicvoidtestQuery(){
- IndexUtiliu=newIndexUtil();
- iu.query();
- }
- @Test
- publicvoidtestDelete(){
- IndexUtiliu=newIndexUtil();
- iu.delete();
- }
- @Test
- publicvoidtestDelete02(){
- IndexUtiliu=newIndexUtil();
- iu.delete02();
- }
- @Test
- publicvoidtestUnDelete(){
- IndexUtiliu=newIndexUtil();
- iu.undelete();
- }
- @Test
- publicvoidtestForceDelete(){
- IndexUtiliu=newIndexUtil();
- iu.forceDelete();
- }
- @Test
- publicvoidtestMerge(){
- IndexUtiliu=newIndexUtil();
- iu.merge();
- }
- @Test
- publicvoidtestUpdate(){
- IndexUtiliu=newIndexUtil();
- iu.update();
- }
- @Test
- publicvoidtestSearch01(){
- IndexUtiliu=newIndexUtil();
- iu.search01();
- }
- @Test
- publicvoidtestSearch02(){
- IndexUtiliu=newIndexUtil();
- for(inti=0;i<5;i++){
- iu.search02();
- System.out.println("-----------------------------");
- try{
- Thread.sleep(10000);
- }catch(InterruptedExceptione){
- e.printStackTrace();
- }
- }
- }
- }
相关推荐
- **分词器(Tokenizer)**:分词器将输入的文本分解为一系列的词语,这是建立索引的第一步。 - **分析器(Analyzer)**:分析器结合了分词器、过滤器等,负责对文本进行预处理,如去除停用词、词形还原等。 ### 2...
本篇文章将带你迈出使用Lucene的第一步,重点关注如何实现分页检索,这对于构建高效、用户友好的搜索系统至关重要。 Lucene的核心功能包括文档索引、查询解析和结果排序。在分页检索方面,我们需要考虑如何有效地...
标题中的“lucene第一步---5.中文分词IKAnalyzer和高亮highlighter的使用”指出,这个主题将探讨如何在Lucene中应用IKAnalyzer进行中文分词,以及如何使用高亮器(highlighter)来突出搜索结果中的关键词。Lucene是...
当使用Lucene时,第一步是进行文本分析。Lucene内置了多种Analyzer类,如StandardAnalyzer,用于处理常见的文本清洗和分词任务。分词是将输入文本拆分成独立的词汇单元,这些单元称为“术语”或“Token”。分词器会...
网络机器人是搜索引擎的第一步,它们自动地遍历互联网,抓取网页内容。Lucene本身并不包含网络爬虫功能,但可以与其他爬虫框架如Nutch或Heritrix结合,以获取网页内容并将其送入Lucene进行处理。 2.2.2 索引与搜索 ...
首先,**创建索引**是使用Lucene的第一步。创建索引涉及到读取数据源(如文件或数据库),解析内容,然后将这些内容转换为Lucene可以理解的文档结构。每个文档由一个或多个字段组成,每个字段都有其特定的类型(如...
1. **创建索引**:这是Lucene工作的第一步,它会把文档内容解析成一系列的术语(tokens),然后为每个术语建立倒排索引。倒排索引是一种数据结构,它允许快速查找包含特定术语的文档。 2. **索引写入**:在创建索引...
在项目中,"创建索引"是第一步。这通常涉及读取数据源(如数据库、文件或网页)中的内容,将文本字段拆分成单词(称为分词),并为每个单词创建索引条目。这个过程称为索引构建。项目中可能使用了IKAnalyzerNet,这...
- **索引构建**:这是全文检索的第一步,涉及到将文档内容转换为可被快速搜索的形式。 - **查询处理**:当用户提交查询时,系统会根据已建立的索引执行相应的搜索逻辑。 - **相关性评分**:为了提供最相关的搜索结果...
5. **分词器(Tokenizer)**:用于将输入的文本分解成一系列的词或短语,是文本分析的第一步。 6. **查询解析器(Query Parser)**:处理用户的搜索请求,将其转化为Lucene可以理解的查询对象。 7. **评分...
- **分词器(Tokenizer)**:将输入文本分解成独立的词语,这是建立索引的第一步。 - **搜索器(Searcher)**:负责执行查询,返回匹配结果。 - **查询解析器(Query Parser)**:将用户的查询字符串转化为Lucene...
创建索引是Lucene的第一步,它将文档内容转换为可搜索的结构。这个过程涉及到以下步骤: 1. **初始化Analyzer**: Analyzer负责对输入文本进行分词,根据语言特性进行标准化处理。例如,对于英文,可以使用...
- **分词器(Tokenizer)**: 分词器将输入文本分割成独立的词语,这是建立索引的第一步。 - **分析器(Analyzer)**: 分析器包含分词器和其他过滤器,负责对文本进行预处理,如去除停用词、词干提取等。 2. **...
首先,建立索引是Lucene工作流程中的第一步。索引是Lucene为了快速查找文档而创建的一种数据结构。在Lucene 3.5中,我们通常会使用`IndexWriter`类来创建或更新索引。这个过程包括读取源文档,使用分词器(Analyzer...
在Lucene中,建立索引是搜索的第一步。首先,我们需要创建一个`IndexWriter`实例,这是负责写入索引的主要类。`IndexWriter`配置包括分词器(Tokenizer)、分析器(Analyzer)和目录(Directory)。分词器将文档内容...
1. **索引创建**:这是搜索引擎的第一步,我们需要遍历要索引的数据源(例如文件系统、数据库等),读取内容,并使用Lucene的Analyzer进行分词,然后创建Term(词项)和Document(文档)。Analyzer是负责文本分析的...
- **建立索引**:这是Lucene搜索的第一步,涉及将数据转换为可搜索的索引结构。这通常包括读取数据源(如文件或数据库),然后将内容解析为文档,并使用分析器对文档内容进行分词。 - **搜索索引**:一旦索引建立...
1. **分词器(Tokenizer)**:分词器是处理文本的第一步,它将文档拆分成可搜索的词元(tokens)。对于不同的语言,Lucene 提供了相应的分词器,例如,对于中文,可能会使用 IK 分词器或 HanLP 进行分词;对于英文,...
网页抓取是搜索引擎的第一步,它涉及到从互联网上获取信息。在Lucene项目中,通常会使用像Jsoup或HtmlUnit这样的第三方库来解析和提取网页内容。这些库能够解析HTML文档,提取出我们需要的文本,如文章内容、标题和...
创建索引是Lucene工作的第一步。通过`Directory`接口,如`FSDirectory`,Lucene可以读写文件系统中的索引。`IndexWriter`类负责实际的索引构建过程,它允许添加、删除和更新文档。每个文档由一系列字段(Field)...