Lucene学习笔记(2)--lucene的核心类介绍
知彼知己百战不殆,为了有效地使用Lucene,你需要深入的理解它是如何工作的,以及如何在需要的时候扩展它。下面,我们将首先熟悉一下Lucene为索引和搜索所公开的核心类。
1、索引过程的核心类
- IndexWriter
- Directory
- Analyzer
- Document
- Field
下图展示了这些类在建立索引的过程中是如何协作的。
1.1 IndexWriter
IndexWriter(写索引)是索引过程的核心组件,这个类负责创建新索引或者打开已有索引,以及向索引中添加、删除或更新被索引文档的信息。可以把它看做这样一个对象:它为你提供针对索引文件的写入操作,但不能用于读取或搜索索引。
1.2 Directory
Directory类描述了Lucene索引的存放位置。它的子类负责具体指定索引的存储路径。
1.3 Analyzer
文本文件在被索引前,需要经过Analyzer(分析器)处理。Analyzer是由IndexWriter的构造方法来指定的,它负责从被索引文本文件中提取词汇单元,并剔除剩下的无用信息。Analyzer是一个抽象类,Lucene提供了几个类实现它。这些类有的用于跳过停用词(英文中如:a、an、the、in等,中文中如:的,把,呢,啊等);有的用于把词汇单元转换成小写形式,以使搜索过程能忽略大小写差别;对于要将Lucene集成到应用程序的开发人员来说,选择什么样的Analyzer是程序设计中的非常关键一步。
1.4 Document
Document(文档)对象代表一些域(field)的集合。你可以将Document对象理解为虚拟文档如Web页面、邮件信息、文本文件,然后你可以从中取回大量数据。
1.5 Field
索引中的每个文档都包含一个或多个不同命名的域,这些域包含在Field类中。每个域都有一个域名和对应的域值,以及一组选项来精确控制Lucene索引操作的各个域值。文档中可能拥有不止一个同名的域。在这种情况下,域的值就按照索引操作顺序添加进去。在搜索时,所有的域的文本连接在一起,作为一个文本域来处理。
2、搜索过程的核心类
- IndexSearcher
- Term
- Query
- TermQuery
- TopDocs
2.1 IndexSearcher
IndexSearcher类用于搜索由IndexWriter类创建的索引,这个类公开了几个搜索方法,它是连接索引的中心环节。可以将IndexSearcher类看做一个以只读方式打开索引的类。它需要利用Directory实例来掌控前期创建的索引,然后才能提供大量的搜索方法。
2.2 Term
Term对象是搜索功能的基本单元。与Field对象类似,Term对象包含一对字符串元素:域名和单词(或域文本值)。在搜索过程中可以创建Term对象,并和TermQuery对象一起使用:
Query q = new TermQuery(new Term("contents","lucene"));
TopDocs hits = searcher.search(q, 10);
以上代码命令Lucene寻找contents域中包含单词lucene的前10个文档,并按照降序的排列这10个文档。
2.3 Query
Lucene含有许多具体的Query子类。目前我们使用到的只是Lucene基本的子类:TermQuery类。其他的子类有:BooleanQuery、PhraseQuery、PrefixQuery、PhrasePrefixQuery、TermRangeQuery、NumericRangeQuery、FilteredQuery和SpanQuery。Query是他们共同的抽象父类。
2.4 TermQuery
TermQuery是lucene提供的最基本的查询类型,也是最简单的查询类型之一。它用来匹配指定域中包含特定项的文档。
2.5 TopDocs
TopDocs类是一个简单的指针容器,指针一般指向前N个排名的搜索结果,搜索结果即匹配查询条件的文档。TopDocs会记录前N个结果中每个结果的int docID和浮点分数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步