Apache Lucene 详解及示例

Apache Lucene 详解及示例

1. 简介

Apache Lucene 是一个高性能的全文搜索引擎库,广泛应用于构建搜索系统。本文将详细解析 Lucene 的核心概念和主要功能,并通过多个示例代码演示其使用方法。

2. 核心概念

2.1 倒排索引

倒排索引将文档中的每个词条与其出现的位置进行映射,从而加速搜索。例如,如果我们有两个文档:

  • Doc1: “Lucene is a search library”
  • Doc2: “Lucene is powerful”

倒排索引将会生成以下映射:

Lucene -> [Doc1, Doc2]
is -> [Doc1, Doc2]
a -> [Doc1]
search -> [Doc1]
library -> [Doc1]
powerful -> [Doc2]

2.2 文档与字段

文档是 Lucene 索引的基本单元,由多个字段组成。每个字段可以存储不同类型的数据,例如文本、数值、日期等。

3. 示例代码

3.1 创建索引

下面的示例展示了如何使用 Lucene 创建索引并添加文档:

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.analysis.standard.StandardAnalyzer;public class LuceneIndexingExample {public static void main(String[] args) throws Exception {// 创建内存目录Directory directory = new RAMDirectory();// 创建分析器StandardAnalyzer analyzer = new StandardAnalyzer();// 配置 IndexWriterIndexWriterConfig config = new IndexWriterConfig(analyzer);IndexWriter writer = new IndexWriter(directory, config);// 添加文档Document doc1 = new Document();doc1.add(new TextField("content", "Lucene is a search library", Field.Store.YES));writer.addDocument(doc1);Document doc2 = new Document();doc2.add(new TextField("content", "Lucene is powerful", Field.Store.YES));writer.addDocument(doc2);writer.close();}
}

3.2 查询索引

下面的示例展示了如何查询已创建的索引:

import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.QueryParser;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.analysis.standard.StandardAnalyzer;public class LuceneSearchingExample {public static void main(String[] args) throws Exception {// 假设已创建索引(见上例)Directory directory = new RAMDirectory();StandardAnalyzer analyzer = new StandardAnalyzer();// 查询索引DirectoryReader reader = DirectoryReader.open(directory);IndexSearcher searcher = new IndexSearcher(reader);QueryParser parser = new QueryParser("content", analyzer);Query query = parser.parse("powerful");TopDocs results = searcher.search(query, 10);for (ScoreDoc scoreDoc : results.scoreDocs) {Document foundDoc = searcher.doc(scoreDoc.doc);System.out.println("Found document: " + foundDoc.get("content"));}reader.close();}
}

3.3 更新索引
下面的示例展示了如何更新已存在的索引:

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.analysis.standard.StandardAnalyzer;public class LuceneUpdateExample {public static void main(String[] args) throws Exception {// 创建内存目录和分析器Directory directory = new RAMDirectory();StandardAnalyzer analyzer = new StandardAnalyzer();// 配置 IndexWriterIndexWriterConfig config = new IndexWriterConfig(analyzer);IndexWriter writer = new IndexWriter(directory, config);// 添加文档Document doc1 = new Document();doc1.add(new TextField("content", "Lucene is a search library", Field.Store.YES));writer.addDocument(doc1);writer.close();// 更新文档writer = new IndexWriter(directory, config);Document doc2 = new Document();doc2.add(new TextField("content", "Lucene is an updated search library", Field.Store.YES));writer.updateDocument(new Term("content", "Lucene is a search library"), doc2);writer.close();// 查询更新后的索引DirectoryReader reader = DirectoryReader.open(directory);IndexSearcher searcher = new IndexSearcher(reader);QueryParser parser = new QueryParser("content", analyzer);Query query = parser.parse("updated");TopDocs results = searcher.search(query, 10);for (ScoreDoc scoreDoc : results.scoreDocs) {Document foundDoc = searcher.doc(scoreDoc.doc);System.out.println("Found document: " + foundDoc.get("content"));}reader.close();}
}

3.4 删除文档

下面的示例展示了如何从索引中删除文档:

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.analysis.standard.StandardAnalyzer;public class LuceneDeleteExample {public static void main(String[] args) throws Exception {// 创建内存目录和分析器Directory directory = new RAMDirectory();StandardAnalyzer analyzer = new StandardAnalyzer();// 配置 IndexWriterIndexWriterConfig config = new IndexWriterConfig(analyzer);IndexWriter writer = new IndexWriter(directory, config);// 添加文档Document doc1 = new Document();doc1.add(new TextField("content", "Lucene is a search library", Field.Store.YES));writer.addDocument(doc1);writer.close();// 删除文档writer = new IndexWriter(directory, config);writer.deleteDocuments(new Term("content", "Lucene is a search library"));writer.close();// 查询删除后的索引DirectoryReader reader = DirectoryReader.open(directory);IndexSearcher searcher = new IndexSearcher(reader);QueryParser parser = new QueryParser("content", analyzer);Query query = parser.parse("search");TopDocs results = searcher.search(query, 10);if (results.totalHits.value == 0) {System.out.println("No documents found.");} else {for (ScoreDoc scoreDoc : results.scoreDocs) {Document foundDoc = searcher.doc(scoreDoc.doc);System.out.println("Found document: " + foundDoc.get("content"));}}reader.close();}
}

4. Lucene 性能优化

  • 索引分片:将索引分成多个部分以提高查询性能。
  • 缓存:使用缓存来加速频繁的查询操作。
  • 索引合并:定期合并小的索引段以提高搜索效率。

5. 总结

Apache Lucene 是一个功能强大的搜索引擎库,通过灵活的配置和优化,可以处理各种复杂的搜索需求。以上示例展示了如何创建、查询、更新和删除索引,以及如何优化 Lucene 的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/46690.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java18】初始化块

初始化块和构造器、成员变量、成员方法一起,是唯四能在类中出现的成员。 初始化块的作用和构造器类似,目的是对对象进行初始化操作;一个类中可以有多个初始化块;初始化块只有两种修饰方式:static和default。用static修…

向量数据量milvus k8s helm 对接外部安装部署流程

前情概要:历经了太多的坑,从简单的到困难的,该文章主要是为大家尽可能的展现安装部署流程中遇见的坑! 如果2024年7月15日17:13:41 你处在这个时间阶段 附近,你会发现docker下载镜像失败! 这个问题&#xff…

[C/C++入门][ifelse]11、三位数找最大值(比大小以及多个数找最大值)

比较数的大小 在学习数学的早期阶段,孩子们会学会如何比较两个数的大小。他们通常通过观察数的数字组成来判断哪个数更大。例如,当比较数字34和56时,如果左边第一位的数字不同,那么具有较大数字的数就是较大的数。在这个例子中&a…

nginx生成自签名SSL证书配置HTTPS

一、安装nginx nginx必须有"--with-http_ssl_module"模块 查看nginx安装的模块: rootecs-7398:/usr/local/nginx# cd /usr/local/nginx/ rootecs-7398:/usr/local/nginx# ./sbin/nginx -V nginx version: nginx/1.20.2 built by gcc 9.4.0 (Ubuntu 9.4.0…

机器学习与神经网络之间的关系 --九五小庞

机器学习与神经网络之间存在紧密而复杂的关系。简而言之,神经网络是机器学习领域中的一个重要分支,尤其是深度学习的核心组成部分。下面详细解释它们之间的关系: 机器学习概述 机器学习是一门涉及让计算机系统从数据中自动学习和改进的学科。…

k8s secret-从环境变量里去读和从yaml文件里读取secret有什么区别?

从环境变量和YAML文件中读取Kubernetes Secret的区别主要体现在使用方式、动态更新能力以及管理便捷性上。以下是详细的区别说明: 1. **使用方式**: - **环境变量方式**:Kubernetes允许将Secret作为环境变量注入到Pod的容器中。这种方式的好处…

Android Studio - adb.exe已停止运作的解决方案

adb.exe 是Android Debug Bridge 的缩写,它是Android SDK 中的一个调试工具,允许开发者通过命令行界面与设备进行交互,执行各种操作,如运行设备的shell、管理模拟器或设备的端口映射、在计算机和设备之间上传/下载文件、将本地APK…

微服务经纬:Eureka驱动的分布式服务网格配置全解

微服务经纬:Eureka驱动的分布式服务网格配置全解 在微服务架构的宏伟蓝图中,服务网格(Service Mesh)作为微服务间通信的独立层,承担着流量管理、服务发现、故障恢复等关键任务。Eureka,Netflix开源的服务发…

我的GeneFace++部署与运行之旅

文章目录 引言项目背景概述重要性分析结论 环境准备1. 安装CUDA2. 安装Python依赖3. 准备3DMM模型(BFM2009)及其他数据 运行官方 Demo训练自己的视频数据准备训练推理测试 遇到的问题与解决方案问题一:cuda 安装完发现版本不对问题二&#xf…

C语言 底层逻辑详细阐述结构体 #结构体的声明 #结构体的初始化 #结构体成员访问 #结构体传参

文章目录 前言 一、结构体的基础知识 二、结构体的初始化 1、结构体类型声明: 2、结构体成员的类型 3、结构体变量的初始化: 三、结构体成员访问 四、结构体传参 总结 前言 基于自我理解的角度来讲结构体; 一、结构体的基础知识 结构是一些…

网络安全-网络设备及其配置1

1.路由器 路由器的作用 路由器是连接多个网络的设备,主要功能是数据包的转发和路由选择。路由器通过分析目标IP地址,将数据包从一个网络转发到另一个网络,确保不同网络之间的通信。它在家庭、企业和互联网服务提供商(ISP&#x…

vue3入门特性

Vue 3 是一个用于构建用户界面的渐进式 JavaScript 框架:核心思想是通过声明式的方式来描述 UI 组件,并通过响应式系统来自动更新 UI。Vue 3 引入了许多新特性和改进,包括组合式 API(Composition API)、更好的性能和 T…

NSSCTF中24网安培训day2中web题目

[SWPUCTF 2021 新生赛]ez_unserialize 这道题目考察php反序列化的知识点 打开题目,发现没有提示,我们试着用御剑扫描目录文件,发现存在robots.txt的文件 接着访问这个文件,发现是一段php反序列化代码,我们需要进行序…

论文翻译:通过云计算对联网多智能体系统进行预测控制

通过云计算对联网多智能体系统进行预测控制 文章目录 通过云计算对联网多智能体系统进行预测控制摘要前言通过云计算实现联网的多智能体控制系统网络化多智能体系统的云预测控制器设计云预测控制系统的稳定性和一致性分析例子结论 摘要 本文研究了基于云计算的网络化多智能体预…

【常见开源库的二次开发】基于openssl的加密与解密——Base58比特币钱包地址——算法分析(三)

目录: 目录: 一、base58(58进制) 1.1 什么是base58? 1.2 辗转相除法 1.3 base58输出字节数: 二、源码分析: 2.1源代码: 2.2 算法思路介绍: 2.2.1 Base58编码过程: 2.1.2 Base58解码过…

Leetcode—146. LRU 缓存【中等】(shared_ptr、unordered_map、list)

2024每日刷题(143) Leetcode—146. LRU 缓存 先验知识 list & unordered_map 实现代码 struct Node{int key;int value;Node(int key, int value): key(key), value(value) {} };class LRUCache { public:LRUCache(int capacity): m_capacity(capa…

实战案例:用百度千帆大模型API开发智能五子棋

前随着人工智能技术的迅猛发展,各种智能应用层出不穷。五子棋作为一款经典的棋类游戏,拥有广泛的爱好者。将人工智能技术与五子棋结合,不仅能提升游戏的趣味性和挑战性,还能展现AI在复杂决策问题上的强大能力。在本篇文章中&#…

Elasticsearch:将Logstash日志存到elasticsearch中

配置Logstash # cat syslog02.conf #filename:syslog02.conf #注意这个是要用#号注释掉 input{file{path > ["/var/log/*.log"]} } output{elasticsearch {#建议将搜索引擎不要和应用部署到一台服务器,我们介绍就同台服务器hosts > ["192.168…

habase集群安装

解压到/opt/softs目录 tar -zxvf hbase-2.4.11-bin.tar.gz -C /opt/softs/ 改名 mv hbase-2.4.11/ hbase2.4.11 配置环境变量 修改/etc/profile vim /etc/profile 添加 #HBASE_HOME export HBASE_HOME/opt/softs/hbase2.4.11 export PATH$PATH:$HBASE_HOME/bin 修改其中的…

怎么把自己写的组件发布到npm官方仓库??

一.注册npm账号 npm官网 1.注册npm 账号 2.登陆 3.登陆成功 二.搭建一个vue 项目 具体步骤参考liu.z Z 博客 或者初始化一个vue项目 vue create XXX (工程名字)运行代码 npm run serve三.组件封装 1.在src文件下建一个package文件&#xff0…