分享

基于lucene的案例开发4:创建索引

本帖最后由 nettman 于 2015-4-16 22:42 编辑
问题导读

1.如何指定索引分词技术?
2.如何把文档写到索引中?
3.创建索引过程中,用到了哪些核心类?



接上篇:
基于lucene的案例开发3:索引文件结构


从这篇博客开始,不论是API介绍还是后面的案例开发,都是基于 lucene4.3.1 这个版本,Lucene4.3.1 下载请点击这里, Lucene其他版本下载请点击这里,Lucene4.3.1官方API文档请点击这里


创建索引demo

      在开始介绍之前,先看一个简单的索引创建demo程序:
  1. /**   
  2. *@Description:   索引创建demo
  3. */   
  4. package com.lulei.lucene.study;   
  5.   
  6. import java.io.File;  
  7.   
  8. import org.apache.lucene.analysis.Analyzer;  
  9. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  10. import org.apache.lucene.document.Document;  
  11. import org.apache.lucene.document.Field.Store;  
  12. import org.apache.lucene.document.TextField;  
  13. import org.apache.lucene.index.IndexWriter;  
  14. import org.apache.lucene.index.IndexWriterConfig;  
  15. import org.apache.lucene.index.IndexWriterConfig.OpenMode;  
  16. import org.apache.lucene.store.Directory;  
  17. import org.apache.lucene.store.FSDirectory;  
  18. import org.apache.lucene.util.Version;  
  19.    
  20. public class IndexCreate {  
  21.   
  22.     public static void main(String[] args) {  
  23.         //指定索引分词技术,这里使用的是标准分词  
  24.         Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43);  
  25.         //indexwriter 配置信息  
  26.         IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_43, analyzer);  
  27.         //索引的打开方式,没有索引文件就新建,有就打开  
  28.         indexWriterConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);  
  29.         Directory directory = null;  
  30.         IndexWriter indexWrite = null;  
  31.         try {  
  32.             //指定索引硬盘存储路径  
  33.             directory = FSDirectory.open(new File("D://study/index/testindex"));  
  34.             //如果索引处于锁定状态,则解锁  
  35.             if (IndexWriter.isLocked(directory)){  
  36.                 IndexWriter.unlock(directory);  
  37.             }  
  38.             //指定所以操作对象indexWrite  
  39.             indexWrite = new IndexWriter(directory, indexWriterConfig);  
  40.         } catch (Exception e) {  
  41.             e.printStackTrace();  
  42.         }  
  43.          
  44.         //创建文档一  
  45.         Document doc1 = new Document();  
  46.         //对name域赋值“测试标题”,存储域值信息  
  47.         doc1.add(new TextField("name", "测试标题", Store.YES));  
  48.         //对content域赋值“测试标题”,存储域值信息  
  49.         doc1.add(new TextField("content", "测试内容", Store.YES));  
  50.         try {  
  51.             //将文档写入到索引中  
  52.             indexWrite.addDocument(doc1);  
  53.         } catch (Exception e) {  
  54.             e.printStackTrace();  
  55.         }  
  56.          
  57.         //创建文档二  
  58.         Document doc2 = new Document();  
  59.         doc2.add(new TextField("name", "基于lucene的案例开发:索引数学模型", Store.YES));  
  60.         doc2.add(new TextField("content", "lucene将一篇文档分成若干个域,每个域又分成若干个词元,通过词元在文档中的重要程度,将文档转化为N维的空间向量,通过计算两个向量之间的夹角余弦值来计算两个文档的相似程度", Store.YES));  
  61.         try {  
  62.             //将文档写入到索引中  
  63.             indexWrite.addDocument(doc2);  
  64.         } catch (Exception e) {  
  65.             e.printStackTrace();  
  66.         }  
  67.          
  68.         //将indexWrite操作提交,如果不提交,之前的操作将不会保存到硬盘  
  69.         try {  
  70.             //这一步很消耗系统资源,所以commit操作需要有一定的策略  
  71.             indexWrite.commit();  
  72.             //关闭资源  
  73.             indexWrite.close();  
  74.             directory.close();  
  75.         } catch (Exception e) {  
  76.             e.printStackTrace();  
  77.         }  
  78.     }  
  79. }  
复制代码

在上述的程序中,已做了详细的注释,对每一条语句的作用就不再介绍,下面就看一下执行这个main函数之后创建的索引文件,如下图:



1.png

      通过索引查看工具 luke 可以简单的看下索引中的内容,如下图:

2.jpg
3.jpg

      从上面两张图,我们可以看出索引中一共有两个文档,content域有50个词,name域有18个词,索引中存储了文档的详细信息。

创建索引核心类
      在上述创建索引过程中,用到了几个核心类:IndexWriter、Directory、Analyzer、Document、Field。
IndexWriter
      IndexWriter(写索引)是索引过程中的核心组件,这个类负责创建新的索引或打开已有的索引以及向索引中添加、删除、更新被索引的文档信息;IndexWriter需要开辟一定空间来存储索引,该功能可以由Directory完成。
Directory
      Directory类描述了Lucene索引的存放位置。它是一个抽象类,它的子类负责指定索引的存储路径,在前面的例子中,我们用的是FSDirectory.open方法来获取真实文件在文件系统中的存储路径,然后将他们依次传递给IndexWriter类构造方法。
Analyzer
      文档信息在被索引之前需要经过Analyzer(分析器)处理,上述例子中使用的是标准分词,在以后的博客中会单独介绍各种分词器以及使用场景。
Document
      Document对象的结构比较简单,为一个包含多个Field对象的容器,上述事例中的文档就包含两个域 name、 content。
Filed
      索引中的每一个文档都包含一个或多个域不同命名的域,每个域都有一个域名和对应的域值以及一组选项来精确控制Lucene索引操作各个域值。在搜索时,所有域的文本就好像连接在一起,作为一个文本域来处理。

上述几个核心类在Lucene的操作中非常重要而且常用,如需要详细了解,还请参照官方API文档。





相关内容:
基于lucene的案例开发1:lucene初始认知

基于lucene的案例开发2:索引数学模型

基于lucene的案例开发3:索引文件结构

基于lucene的案例开发4:创建索引

基于lucene的案例开发5:搜索索引

基于lucene的案例开发6:分词器介绍

基于lucene的案例开发7:Query查询

基于lucene的案例开发8:IndexSearcher中检索方法

基于lucene的案例开发9:案例初识

基于lucene的案例开发10:搜索后台基础,JsonUtil & XmlUtil类介绍

基于lucene的案例开发11:项目常用类ClassUtil & CharsetUtil介绍

基于lucene的案例开发12:数据库连接池

基于lucene的案例开发13:实现实时索引基本原理

基于lucene的案例开发14:实时索引管理类IndexManager

基于lucene的案例开发15:实时索引的检索

基于lucene的案例开发16:实时索引的修改

基于lucene的案例开发17:查询语句创建PackQuery

基于lucene的案例开发18:纵横小说更新列表页抓取

基于lucene的案例开发19:纵横小说简介页采集

基于lucene的案例开发20:纵横小说章节列表采集

基于lucene的案例开发21:纵横小说阅读页采集

出处:http://blog.csdn.net/xiaojimanman/article/details/42836309

已有(2)人评论

跳转到指定楼层
feng01301218 发表于 2015-4-7 13:04:24
回复

使用道具 举报

zhujun182104906 发表于 2015-4-10 13:57:11
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条