热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Lucene3.0之索引

2019独角兽企业重金招聘Python工程师标准1倒排索引倒排索引是满足实际应用而设计的一种数据结构。倒排索引的每一个元素是一个索引项,每一个索引项是由关键字属

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1 倒排索引
    倒排索引是满足实际应用而设计的一种数据结构。倒排索引的每一个元素是一个索引项,每一个索引项是由关键字属性值和关键字关联结果,或者记录的存放地址组成。倒排索引是利用索引关键字直接确定文档列表,最后确定希望找到的文档列表。与传统的顺序查找和记录组织方式相反,因此称为倒排索引。通常把采用倒排索引方式组织的文件或者倒排索引和文档主文件一起称为倒排文件。
2 Lucence索引器
2.1 模式
   2.1.1 独立索引模式:每个Document独立索引成一个文件
   2.1.2 符合索引模式:等待索引的全部Document索引成一个文件
2.2 结构
    索引项->索引域->索引文档->索引段->索引
   2.2.1 索引域的属性
    1、域的名称(String类型)
    2、域存储的值
    3、Store
       Store.YES:保持索引和原始信息
       Store.NO:信息只索引,但不保存
    4、Index
       Index.ANALYZED:分词并建立索引
       Index.ANALYZED_NO_NORMS:分词并建立索引,同时index-time,document boosting和field length normalization这几个域不使用。
       Index.NO:不建立索引
       Index.NOT_ANALYZED:不分词,但建立索引
       Index.NOT_ANALYZED_NO_NORMS:不分词,建立索引,同时index-time,document boosting和field length normalization这几个域不使用。
    5、Field.TermVector:表示域内信息是否需要分词。
   2.2.2 索引项
    索引项是索引管理的最小单元。在程序中没有显示的调用,它是利用分词器,在后台自动把一个域的值进行分隔。得到的每个独立元素称为一个索引项,用来建立索引。
2.3 格式
    复合索引模式(默认):可以减少索引文件的数量,便于管理和使用,适用于静态索引。多文件索引格式适用于动态索引。
2.3.1 多文件索引格式
    使用一系列索引文件分别存储索引,分散管理数据的索引存储格式。多文件索引在打开时需要读取大量文件,会大大占用系统的文件句柄等资源,造成系统响应速度慢,甚至系统崩溃。
    主要的索引文件及功能:
    1、segment_*:描述一组索引的参数,使用文件头固定格式描述后面的内容,包括每个独立新建索引的大小,属性等。
    2、fnm:索引域描述文件,一个独立的索引(PerIndex)叫做一个segment(索引段),一个fnm文件描述了本索引的File数,各个Field的属性编号。
    3、fdx:文档域值索引文件,采用定长方式存储,根据docid排序,可直接定位。用来记录每个文档的Stored fields值的存储位置。
    4、fdt:文档域值存储文件,存储Stored fields值的文件。通过fdx中记录的便宜访问。
    5、tis:存储每个term在文档中的分布信息,如文档频率,每个含term文档出现次数记录的偏移和位置记录的偏移排列顺序。先按Field名字字典排序,在每个Field按term字典排序。
    6、tii:该文件是tis文件的索引和精简,排列格式一样,但不含有每个term属性的信息。这个文件可以完全读入到内存中。
    7、frq:该文件是tis文件的扩展。记录每个term在每个包含文件中具体出现频率。
    8、prx:该文件是tis文件的延伸,记录每个term在每个文档偏移信息。这个文档省略类docid,必须配合frq文件使用。
    9、tvx,tvd,tvf:用来索引和保持每一个文档的向量化字段的信息。
2.3.2 复合索引结构
    1、segment_*:描述一组索引的参数,使用文件头固定格式描述后面的内容,包括每个独立新建索引的大小,属性等。
    2、segment.gen:存储索引创建参数。
    3、cfs:存储实际的索引数据,不同子索引的内容按照一定的格式存储,仍然可以区分,直到索引优化压缩操作发生时。
3 与索引操作相关的类

3.1 IndexWriter

    构造方法: 

IndexWriter(Directory d, Analyzer a, boolean create, IndexDeletionPolicy deletionPolicy, IndexWriter.MaxFieldLength mfl) IndexWriter(Directory d, Analyzer a, boolean create, IndexWriter.MaxFieldLength mfl) IndexWriter(Directory d, Analyzer a, IndexDeletionPolicy deletionPolicy, IndexWriter.MaxFieldLength mfl) IndexWriter(Directory d, Analyzer a, IndexDeletionPolicy deletionPolicy, IndexWriter.MaxFieldLength mfl, IndexCommit commit) IndexWriter(Directory d, Analyzer a, IndexWriter.MaxFieldLength mfl)

    各个构造方法的参数意义相同。其中,Directory d 表示索引的存储路径;Analyzer a 是分词器;boolean create表示是否新建索引,IndexDeletionPolicy deletionPolicy表示索引的删除策略;IndexWriter.MaxFieldLength mfl索引项个数;IndexCommit commit,用于获得和commit point相关联的segment文件。

3.2 IndexReader

IndexReader管理已经建立的Lucence索引,负责磁盘目录上存放的索引的加载和删除维护工作。通过它内部的方法,可以统计当前索引中的文档数目等信息。 

3.3 Analyzer

分词器,用于分词。

4 索引设置的一些建议

4.1 索引域类型选择

1) 尽量减少不必要的存储

2) 不需要检索的内容不要建立索引

3) 非文本格式需要提前转化

4)需要整体存放的内容不要分词

4.2 索引参数优化

1) 设置合并参数setMergeFactor(),用于控制最大内存中存放的索引文档Document个数。

2)设置最大文档个数setMaxBufferedDocs(),合并段的大小,也就是一个索引段达到多少个以后,可以合并成一个更大的新段。

3) 限制域索引个数setMaxFieldLength()

4) 设置最大内存删除项数setMaxBufferedDeleteTerms

4.3 磁盘索引和内存索引

  磁盘索引使用FSDirectory,内存索引使用RAMDirectory。

4.4 同步与锁机制

write.lock用于避免一个线程同时修改一个索引文档而设置

commit.lock主要在segment建立,合并或读取时使用,只在索引的合并函数和段合并函数中使用。

实例:

 

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
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.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;public class LuceneIndexManager {private static String Index_Path = "D:/index";private static String Text_Path = "D:/text/wine.txt";public static void main(String[] args) {try {Date start = new Date();File file1 = new File(Text_Path);File file2 = new File(Index_Path);Directory dir = FSDirectory.open(file2);Analyzer TextAnalyzer = new StandardAnalyzer(Version.LUCENE_CURRENT);IndexWriter TextIndex = new IndexWriter(dir,TextAnalyzer, true,IndexWriter.MaxFieldLength.LIMITED);Document document = new Document();Field field_name = new Field("name", file1.getName(),Field.Store.YES,Field.Index.NOT_ANALYZED);document.add(field_name);FileInputStream inputfile = new FileInputStream(file1);int len = inputfile.available();byte[] buffer = new byte[len];inputfile.read(buffer);inputfile.close();String contenttext = new String(buffer);Field field_content = new Field("content", contenttext,Field.Store.YES, Field.Index.ANALYZED);document.add(field_content);TextIndex.addDocument(document);TextIndex.optimize();TextIndex.close();Date end = new Date();long tm_index = end.getTime() - start.getTime();System.out.print("Total Time(ms): ");System.out.println(tm_index);} catch (IOException e) {e.printStackTrace();}System.out.println("Index Success");}}


转:https://my.oschina.net/lovelong1/blog/53337



推荐阅读
  • 无损压缩算法专题——LZSS算法实现
    本文介绍了基于无损压缩算法专题的LZSS算法实现。通过Python和C两种语言的代码实现了对任意文件的压缩和解压功能。详细介绍了LZSS算法的原理和实现过程,以及代码中的注释。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 使用freemaker生成Java代码的步骤及示例代码
    本文介绍了使用freemaker这个jar包生成Java代码的步骤,通过提前编辑好的模板,可以避免写重复代码。首先需要在springboot的pom.xml文件中加入freemaker的依赖包。然后编写模板,定义要生成的Java类的属性和方法。最后编写生成代码的类,通过加载模板文件和数据模型,生成Java代码文件。本文提供了示例代码,并展示了文件目录结构。 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 流数据流和IO流的使用及应用
    本文介绍了流数据流和IO流的基本概念和用法,包括输入流、输出流、字节流、字符流、缓冲区等。同时还介绍了异常处理和常用的流类,如FileReader、FileWriter、FileInputStream、FileOutputStream、OutputStreamWriter、InputStreamReader、BufferedReader、BufferedWriter等。此外,还介绍了系统流和标准流的使用。 ... [详细]
  • 1、Ipv4只能用于内网,外网只能用2、DNS:把域名解析成ip地址3、MAC地址就是物理地址(网卡序列号)   IP地址:电脑序列号4、不同电脑,微信之间互相通信,靠的是端口;  ... [详细]
  • 设备模型三(潜谈sysfs)
    前言引出一个问题:假设sysaxx,xx是kobja的属性文件,当对xx进行写操作时,即echo‘1’sysaxx实际上,调用了kobja的ktype中定义的接口函 ... [详细]
  • 先记住几个专用名词,如下:Workspace:工作区IndexStage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库一、新建代码库#在当前目录新建一个G ... [详细]
author-avatar
yeszio
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有