Lucene 索引

Lucene的核心索引类:

1、IndexWriter:建立索引的核心组件。

2、Directory:代表一个lucene索引项的位置。

3、Analyzer:对文本内容进行分析的抽象类,具体实现中有停用词切除 、词干分析、大小写切换等功能。

4、Document:可以视作文本经过处理后所对应的对象,由多个字段组成 ,如路径、标题、摘要、修改日期等等。

5、Field:字段 ,对应于文本的某一部分数据,便于检索时根据结果提取。早期版本分为四个类型:Keyword、UnIndexed、UnStored和Text,其主要区别归结于三个方面:是否被分析,是否被索引,是否存储于索引中。但是在最新版本的Lucene中,使用了一种更为统一的形式,也即只有Field一个类,然后使用一些参数来描述这个字段的属性,通过参数组合,可以组合出各种类别,甚至那四种不存在的类别理论上也是可以组合出来。

public Field (String name, String value, Store store, Index index)


下面来看一个例子代码:

[java]  view plain copy
  1. package com.qianyan.luceneIndex;  
  2.   
  3. import java.io.IOException;  
  4.   
  5.   
  6. import org.apache.lucene.analysis.Analyzer;  
  7. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  8. import org.apache.lucene.document.Document;  
  9. import org.apache.lucene.document.Field;  
  10. import org.apache.lucene.index.IndexWriter;  
  11. import org.apache.lucene.store.Directory;  
  12. import org.apache.lucene.store.FSDirectory;  
  13.   
  14. public class IndexTest {  
  15.   
  16.     public static void main(String[] args) throws IOException{  
  17.       
  18.         String[] ids = {"1""2""3"};  
  19.         String[] names = {"zhangsan""lisi""wangwu"};  
  20.         String[] addresses = {"shanghai""beijing""guangzhou"};  
  21.         Analyzer analyzer = new StandardAnalyzer();  
  22.         String indexDir = "E:/luceneindex";  
  23.         Directory dir = FSDirectory.getDirectory(indexDir);  
  24.         //true 表示创建或覆盖当前索引;false 表示对当前索引进行追加  
  25.         //Default value is 128  
  26.         IndexWriter writer = new IndexWriter(dir, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);  
  27.         for(int i = 0; i < ids.length; i++){  
  28.             Document document = new Document();  
  29.             document.add(new Field("id", ids[i], Field.Store.YES, Field.Index.ANALYZED));  
  30.             document.add(new Field("name", names[i], Field.Store.YES, Field.Index.NOT_ANALYZED));  
  31.             document.add(new Field("address", addresses[i], Field.Store.YES, Field.Index.ANALYZED));  
  32.             writer.addDocument(document);  
  33.         }  
  34.         writer.optimize();  
  35.         writer.close();  
  36.     }  
  37.       
  38. }  
运行后查看 E:/luceneindex 会看到生成的索引文件。


删除索引:

[java]  view plain copy
  1. package com.qianyan.luceneIndex;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import org.apache.lucene.index.IndexReader;  
  6. import org.apache.lucene.index.Term;  
  7. import org.apache.lucene.store.Directory;  
  8. import org.apache.lucene.store.FSDirectory;  
  9.   
  10. public class TestDelDocument {  
  11.   
  12.     public static void main(String[] args) throws IOException{  
  13.         String indexDir = "E:/luceneindex";  
  14.         Directory dir = FSDirectory.getDirectory(indexDir);  
  15.         IndexReader reader = IndexReader.open(dir);  
  16.         System.out.println(reader.maxDoc());  
  17.         //直接根据序号删除索引 注:从0开始  
  18.         //reader.deleteDocument(0);  
  19.         //根据索引值名删除索引  
  20.         //reader.deleteDocuments(new Term("id", "3"));  
  21.         System.out.println(reader.numDocs());  
  22.         reader.close();  
  23.         dir.close();  
  24.     }  
  25. }  


取消删除标记索引:

[java]  view plain copy
  1. package com.qianyan.luceneIndex;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import org.apache.lucene.index.IndexReader;  
  6. import org.apache.lucene.index.Term;  
  7. import org.apache.lucene.store.Directory;  
  8. import org.apache.lucene.store.FSDirectory;  
  9.   
  10. public class UnDeleteDocument {  
  11.   
  12.     public static void main(String[] args) throws IOException {  
  13.         String indexDir = "E:/luceneindex";  
  14.         Directory dir = FSDirectory.getDirectory(indexDir);  
  15.         IndexReader reader = IndexReader.open(dir);  
  16.           
  17.         System.out.println("before delete:" + reader.numDocs());  
  18.           
  19.         reader.deleteDocuments(new Term("id""1"));  
  20.         System.out.println("after delete:" + reader.numDocs());  
  21.           
  22.         reader.undeleteAll();  
  23.         System.out.println("after undelete:" + reader.numDocs());  
  24.           
  25.         reader.close();  
  26.         dir.close();  
  27.           
  28.     }  
  29. }  

修改索引(注:在lucene里修改意味着 删除后添加)

[java]  view plain copy
  1. package com.qianyan.luceneIndex;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import org.apache.lucene.analysis.Analyzer;  
  6. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  7. import org.apache.lucene.document.Document;  
  8. import org.apache.lucene.document.Field;  
  9. import org.apache.lucene.index.IndexReader;  
  10. import org.apache.lucene.index.IndexWriter;  
  11. import org.apache.lucene.index.Term;  
  12. import org.apache.lucene.store.Directory;  
  13. import org.apache.lucene.store.FSDirectory;  
  14.   
  15. public class UpdateDocument {  
  16.   
  17.     public static void main(String[] args) throws IOException{  
  18.         Analyzer analyzer = new StandardAnalyzer();  
  19.         String indexDir = "E:/luceneindex";  
  20.         Directory dir = FSDirectory.getDirectory(indexDir);  
  21.         IndexReader reader = IndexReader.open(dir);  
  22.           
  23.         System.out.println("before delete : " + reader.numDocs());  
  24.         reader.deleteDocuments(new Term("id""2"));  
  25.         System.out.println("after delete : " + reader.numDocs());  
  26.         reader.close();  
  27.           
  28.         IndexWriter writer = new IndexWriter(dir, analyzer, false, IndexWriter.MaxFieldLength.LIMITED);  
  29.         Document document = new Document();  
  30.         document.add(new Field("id""2", Field.Store.YES, Field.Index.ANALYZED));  
  31.         document.add(new Field("name""Tom", Field.Store.YES, Field.Index.ANALYZED));  
  32.         document.add(new Field("address""tianjin", Field.Store.YES, Field.Index.ANALYZED));  
  33.         writer.addDocument(document);     
  34.         writer.close();  
  35.           
  36.         reader = IndexReader.open(dir);  
  37.         System.out.println("after add : " + reader.numDocs());  
  38.           
  39.         dir.close();  
  40.         reader.close();  
  41.     }  
  42. }  


在lucene中搜索算法的score简单说是由 tf * idf * boost * lengthNorm计算得来的。

tf:是查询的词在文档中出现的次数的平方根

idf:表示反转文档频率。

boost:激励因子,可以通过setBoost方法设置,需要说明的通过field和doc都可以设置,所设置的值lengthNorm,是由搜索的field的长度决定了,越长文档的分值越低。

控制score的就是设置boost值。

lucene会把计算后,最大分值超过1.0的分值作为分母,其他的文档的分值都除以这个最大值,计算出最终的得分。


document.setBoost(0.5f);  //不太重要

document.setBoost(1.5f);  //比较重要

field.setBoost(0.5f);  //不太重要

field.setBoost(1.5f);  //比较重要


lucene索引效率设置:

setMaxBufferedDocs  16MB

setMergeFactor  10

setMaxMergeDocs  Inter.Max_VALUE;


Directory dir = FSDirectory.getDirectory(indexDir);      //文件系统读取,IO操作

Directory dir = RAMDirectory();       //内存读取,效率高,容量小


原文地址:http://blog.youkuaiyun.com/shaopeng5211/article/details/8683589

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值