索引库结构—倒排序索引
我们需要对文档进行预处理,建立一种便于检索的数据结构,以此来提高信息检索的速度,这种数据结构就是索引。目前广泛使用的一种索引方式是倒排序索引。(说明:以下只是用于说明倒排序索引的结构,最终的索引结构要复杂的多(要考虑更多、更复杂的情况)。例如还要存储关键词在文本中的编号位置,或是首字母的字符位置等信息。)
倒排序索引的原理就如同查字典。要先查目录,得到数据对应的页码,在直接翻到指定的页码。不是在文章中找词,而是从目录中找词所在的文章。这需要在索引库中生成一个词汇表(目录),在词汇表中的每一个条记录都是类似于“词à所在文档的编号列表”的结构,记录了每一个出现过的单词,和单词出现的地方(哪些文档)。查询时先查词汇表,得到文档的编号,再直接取出相应的文档。
把数据转成指定格式放到索引库中的操作叫做建立索引。建立索引时,在把数据存到索引库后,再更新词汇表。进行搜索时,先从检索词汇表开始,然后找到相对应的文档。如果查询中仅包含一个关键词,则在词汇表中找到该单词,并取出他对应的文档就可以了。如果查询中包含多个关键词,则需要将各个单词检索出的记录进行合并再取出相应的文档记录。
如果词汇表中有一个词“传智播客”对应的文档编号列表为“1”。现在又有添加了一个包含“传智播客”的文档,则词汇表中的“传智播客”词后对应的编号列表变成了“1,2”。因为关键词的数量受实际语言的限制,所以不用担心词汇表会变的很大。
索引文件的检索与维护,更新是先删除后创建
维护倒排索引有三个操作:添加、删除和更新文档。但是更新操作需要较高的代价。因为文档修改后(即使是很小的修改),就可能会造成文档中的很多的关键词的位置都发生了变化,这就需要频繁的读取和修改记录,这种代价是相当高的。因此,一般不进行真正的更新操作,而是使用“先删除,再创建”的方式代替更新操作
建立索引的执行过程(Store、Index)
在建立索引时,先要把文档存到索引库中,还要更新词汇表
我们做的操作:
1、把数据对象转成相应的Document,其中的属性转为Field。
2、调用工具IndexWriter的addDocument(doc),把Document添加到索引库中。
Lucene做的操作:
1、把文档存到索引库中,并自动指定一个内部编号,用来唯一标识这条数据。内部编号类似于这条数据的地址,在索引库内部的数据进行调整后,这个编号就可能会改变,同时词汇表中引用的编号也会做相应改变,以保证正确。但我们如果在外面引用了这个编号,前后两次去取,得到的可能不是同一个文档!所以内部编号最好只在内部用。
2、
更新词汇表。把文本中的词找出并放到词汇表中,建立与文档的对应关系。要把哪些词放到词汇表中呢,也就是文本中包含哪些词呢?这就用到了一个叫做Analyzer(分词器)的工具。他的作用是把一段文本中的词按规则取出所包含的所有词。对应的是Analyzer类,这是一个抽象类,切分词的具体规则是由子类实现的,所以对于不同的语言(规则),要用不同的分词器
在把对象的属性转为Field时,相关代码为:doc.add(newField("title", article.getTitle(),Store.YES,
Index.ANALYZED))。
第三与第四个参数的意思为:
枚举类型
|
枚举常量
|
说明
|
Store
|
NO
|
不存储属性的值
|
YES
|
存储属性的值
|
Index
|
NO
|
不建立索引
|
ANALYZED
|
分词后建立索引
|
NOT_ANALYZED
|
不分词,把整个内容作为一个词建立索引
|
说明:Store是影响搜索出的结果中是否有指定属性的原始内容。Index是影响是否可以从这个属性中查询(No),或是查询时可以查其中的某些词(ANALYZED),还是要把整个内容作为一个词进行查询(NOT_ANALYZED)。
从索引库中搜索的执行过程(QueryParser、TopDocs、ScoreDoc)
1、把要查询字符串转为Query对象。这就像在Hibernate中使用HQL查询时,也要先调用Session.createQuery(hql)转成Hibernate的Query对象一样。把查询字符串转换成Query是使用QueryParser,或使用MultiFieldQueryParser。查询字符串也要先经过Analyzer(分词器)。要求搜索时使用的Analyzer要与建立索引时使用的Analzyer要一致,否则可能搜不出正确的结果。
2、用IndexSearcher.search(),进行查询,得到结果。此方法返回值为TopDocs,是包含结果的多个信息的一个对象。其中有totalHits 代表决记录数,ScoreDoc的数组。ScoreDoc是代表一个结果的相关度得分与文档编号等信息的对象。
3、取出要用到的数据列表。调用IndexSearcher.doc(scoreDoc.doc)以取出指定编号对应的Document数据。
分享到:
相关推荐
4. 示例(demo)模块:包含了一些简单的示例程序,帮助开发者了解如何使用Lucene。 通过阅读和理解这些源代码,开发者可以深入理解Lucene的工作原理,定制自己的搜索引擎,或者为Lucene贡献新的功能。 总的来说,...
- **官方文档**:Apache Lucene提供了详细的API文档和教程,是学习的基础。 - **示例代码**:解压后的"lucene-5.5.3"目录中可能包含示例代码和测试用例,有助于理解和实践。 - **社区支持**:参与开源社区,如...
### Lucene 使用教程 #### 一、Lucene简介与安装 **1.1 Lucene简介** Lucene是一款高性能、全功能的文本搜索引擎库,由Java编写而成,它为开发者提供了构建搜索应用程序的基础工具。Lucene的主要特点包括: - **...
### Apache Lucene教程知识点概述 #### 一、Apache Lucene简介 - **Lucene定义**:Lucene是一款高性能、全功能的文本搜索引擎库,由Java编写而成,是Apache基金会下的一个开源项目。 - **发展历程**:自1999年由...
本教程主要探讨的是如何利用Lucene进行索引优化,特别是通过多线程和处理多个目录来提高索引创建效率。 首先,我们需要理解Lucene的索引原理。Lucene将文档分解为词项(tokens),并对每个词项创建倒排索引。倒排...
**Lucene 入门教程** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发。它提供了一个简单但功能强大的 API,可以让开发者在 Java 应用程序中实现全文检索功能。这个“Lucene入门demo”将帮助我们理解...
1. **创建索引(Indexing)**:这部分代码会读取数据源(如文件、数据库等),创建Lucene文档,然后使用IndexWriter将这些文档写入索引。 2. **搜索(Searching)**:用户输入查询,程序会使用Analyzer处理查询字符...
### Lucene初级教程知识点详解 #### 1. Lucene简介 - **1.1 什么是Lucene** - Lucene是一种高性能的全文检索框架,它主要用于构建搜索引擎的基础架构。与百度或Google Desktop这类直接可用的应用产品不同,Lucene...
在这个项目中,你将学习到如何使用Lucene创建索引,这是搜索引擎的基础。索引过程涉及对文本数据进行分析,将其拆分成可搜索的单元——词元(tokens),然后构建倒排索引,以便于快速查找含有特定词元的文档。此外,...
在这个教程中,读者会学习到如何配置和使用Lucene,如何处理各种类型的查询,如何优化索引和搜索性能,以及如何应对实际项目中的挑战。"www.heyjava.com.url"可能指向一个相关的在线资源,供读者进一步探索和实践。 ...
本教程将深入探讨Lucene 5版本的源码,特别关注拼音检索和分词器的应用,帮助开发者更好地理解和利用这一强大的搜索技术。 一、Lucene概述 Lucene是一个高性能、全文本搜索库,它提供了完整的搜索功能,包括索引、...
在本文中,我们将探讨如何使用Lucene建立数据库索引,并分享一些在实践过程中的经验和教训。Lucene是一个高性能、全文本搜索库,广泛用于构建搜索引擎。在创建索引时,需要注意以下关键点: 1. **资料的准确性**:...
对于本教程,我们使用的是Lucene-3.0.0版本。 **2. Java 开发环境配置** 确保计算机上已安装了Java Development Kit (JDK)。如果尚未安装,请前往Oracle官网下载JDK,并按照官方指南完成安装过程。安装完成后,...
通过学习Lucene3.0 使用教程,开发者能够掌握全文检索的基本原理和技术,为自己的应用系统添加高效、准确的搜索功能。这不仅限于网站内部,也可以应用于桌面应用程序、帮助系统等多种场景。随着技术的深入,开发者还...
2. **复制JAR文件**:将解压后得到的“lucene-demos-2.0.0.jar”和“lucene-core-2.0.0.jar”两个JAR文件复制到JDK的lib目录下。例如,如果你的JDK安装在“D:\Program Files\Java\jdk1.5.0_05”,则将这两个JAR文件...
doc.add(new TextField("title", "Lucene教程", Field.Store.YES)); doc.add(new TextField("content", "这是一个关于Lucene的详细教程", Field.Store.YES)); writer.addDocument(doc); writer.close(); ``` 而查询...
### Lucene 教程详解 #### 一、搜索引擎的基本组成部分 搜索引擎主要由四个核心部分构成:**搜索器**、**索引器**、**检索器**以及**用户接口**。 1. **搜索器**:负责在网络上爬取网页或文档等信息资源。它通过...
- **索引**:详解如何使用Lucene建立文档索引,包括索引的结构设计、存储策略等。 - **为程序添加搜索功能**:讲解如何将Lucene集成到现有的应用程序中,实现高效搜索功能。 - **分析**:介绍Lucene中的分析器机制,...
这个库的核心特性在于它的索引技术,能够快速地查找和返回匹配文档。 2. **基本架构**:Lucene.net的架构主要包括四个主要部分:分析器(Analyzer)、索引(Index)、查询(Query)和搜索(Search)。分析器负责将输入文本...
**Lucene 3.1 使用教程** Lucene 是一个高性能、全文检索的开源库,它提供了文本分析、索引和搜索的功能。随着版本的更新,Lucene 3.1 引入了一些重要的改进和特性,使得开发人员能够更有效地利用其功能。 1. **...