Lucene概述第一部分:创建索引

介绍

我最近一直在与开源搜索引擎Lucene合作 。 我不是专家,但是由于我只是浏览了一些相当稀疏的文档并将应用程序从Lucene的很旧的版本迁移到了最新版本的2.4,所以我在总体上很清楚。 Lucene的文档有点让人难以想象,因此我想趁此机会在我脑海中崭露头角时,对Lucene进行高层次的概述。

如果您发现此页面正在寻找Lucene的入门资料,那么对您有好处! 那就是它的目的。 不要期望找到最佳实践,代码示例或高级主题。 您将对Lucene的概念体系结构有一个清晰的介绍,通过它您可以高效地访问项目网站上的FAQ和教程。 我正在使用Lucene的Java实现,但是所有这些高级内容都将同样适用于任何其他Lucene风格。

您应该了解的第一件事是Lucene的实际作用。 Lucene实际上只做两件事。

  1. 它创建搜索索引。
  2. 它在那些索引中搜索内容。

索引是您需要进行搜索的任何数据的有效导航表示。 您的数据可能与内容管理系统中的一组Word文档一样简单,或者可能是来自数据库,HTML页面或系统中任何类型的数据对象的记录。 由您决定要使哪些实体可搜索。 对于我们的讨论,我们假设我们正在处理一组Word文档。

创建索引

因此,第一步是为我们的Word文档集创建索引。 为此,我们需要编写一些代码,以从Word文档中获取信息并将其转换为可搜索的索引。 唯一的方法就是蛮力。 我们必须遍历每个Word文档,检查每个文档并将其转换为Lucene创建索引时需要处理的部分。

Lucene创建索引需要哪些步骤? 那里有两个。

  1. 文件资料
  2. 领域

这两个抽象是Lucene的关键,Lucene用两个顶级Java类(Document和Field)来表示它们。 文档,不要与我们的实际Word文档混淆,是一个Java类,表示Lucene中的可搜索项目。 可搜索项是指文档是您在搜索时发现的东西。 创建这些文档由您决定。

对于我们来说幸运的是,这是从实际的Word文档到Lucene文档的非常清晰的一步。 我想任何人都会同意,这将是我们的用户在进行搜索时希望找到的Word文档。 这使我们的处理变得相当简单,我们将为每个实际的Word文档简单地创建一个Lucene文档。

创建文档及其字段

但是我们该怎么做呢? 实际上非常简单。 首先,我们使用new运算符创建Document对象-仅此而已。 但是,在这一点上,文档是没有意义的。 现在,我们必须确定要添加到文档中的字段。 这是我们必须思考的部分。 文档由任意数量的字段组成,每个字段都有一个名称和一个值。 这里的所有都是它的。

创建Lucene索引的开发人员几乎普遍创建了两个字段。 最重要的字段将是“内容”字段。 这个字段保存了我们要为其创建Lucene文档的Word文档的内容。 请记住,字段的名称完全是任意的,但是大多数人将字段之一称为“内容”,他们将现实世界中可搜索对象(在我们的情况下为Word文档)的实际内容粘贴到该字段的值中。 本质上,字段只是一个名称:值对。

开发人员创建的另一个非常常见的字段是“标题”字段。 该字段的值将是Word文档的标题。 我们可能希望将有关Word文档的其他信息保留在索引中。 其他常见字段是诸如“作者”,“ creation_date”,“关键字”等之类的内容。对所需字段的标识完全取决于业务需求。

因此,对于我们要使其可搜索的每个Word文档,我们都必须创建一个Lucene文档,其中包含我们上面概述的字段。 使用这些字段创建文档后,我们将其添加到Lucene索引编写器中,并要求它编写索引。 而已! 现在,我们有了一个可搜索的索引。 的确如此,但是我们可能已经忽略了几个Field细节。 让我们仔细看看Fields。

字段详细信息:存储还是索引?

字段可以以多种方式保留在索引中。 您最初可能怀疑存在的最明显的方法,也许是唯一的方法是可搜索的方法。 在我们的示例中,我们完全希望,如果用户键入一个Word文档内容中存在的单词,则搜索将在搜索结果中返回该Word文档。 为此,Lucene必须索引该字段。 首先,该术语有点让人困惑,但是请注意,完全有可能在不使其可搜索的情况下将“字段”“存储”在索引中。 换句话说,可以“存储”一个字段,但不能“索引”它。 为什么? 您很快就会看到。

Lucene在将Field保留在索引中的方式之间的第一个区别是存储还是索引。 如果我们期望某个字段的值匹配以使文档被搜索击中,那么我们必须为该字段建立索引。 如果仅存储字段,则搜索查询无法达到其值。 为什么要存储一个字段? 很简单,当我们通过索引字段之一命中Document时,Lucene将向我们返回整个Document对象。 所有存储的字段将在该Document对象上可用; 被索引的字段将不在该对象上。 索引字段是用于查找文档的信息,存储的字段是与文档一起返回的信息。 两件事。

这意味着尽管我们可能无法基于给定字段的内容进行搜索,但是当搜索返回文档时,我们仍然可以利用该字段的值。 我能想到的最明显的用例是基于Web的文档的“ url”字段。 搜索aURL的值没有任何意义,但是您肯定希望知道搜索返回的文档的URL。 您的结果页面还可以如何将用户引导到点击页面? 这是非常重要的一点:存储的字段的值将在搜索返回的文档上可用,但是实际上只有索引的字段的值可以用作搜索的目标。

从技术上讲,存储的字段保留在Lucene索引内。 但是,我们必须跟踪索引的字段与存储的字段不同的事实。 不幸的术语。 这就是单词重要的原因。 他们可以避免很多混乱。

索引字段:已分析还是未分析?

对于下一个皱纹,我们必须指出,可以以两种不同的方式对索引字段进行索引。 首先,我们可以在单个块中索引字段的值。 换句话说,我们可能有一个“电话号码”字段。 当我们搜索电话号码时,我们需要匹配整个值或什么都不匹配。 这是很合理的。 因此,对于像电话号码这样的字段,我们将整个值ATOMICALLY索引到Lucene索引中。

但是,让我们考虑一下Word文档的“内容”字段。 我们是否希望用户必须匹配整个字段? 当然不是。 我们希望将Word文档的内容分解为可搜索的标记。 此过程称为分析。 我们可以从丢弃所有不重要的词开始,例如“ a”,“ the”,“ and”等。我们可以进行许多其他优化,但是最重要的是,字段的内容如“ contents” ”应该由Lucene分析。 这将产生目标轻量级索引。 这就是搜索变得有效和强大的方式。

在API中,这归结为以下事实:创建字段时,我们必须指定

  1. 是否存储
  2. 是否索引
  • 如果建立索引,是否进行分析

现在,您应该清楚字段的详细信息。 重要的是,我们可以存储和索引给定的字段。 这不是一个选择。

创建索引

将所有文档添加到索引后,我们只需告诉索引编写者即可创建索引。 从现在开始,我们可以根据索引的字段搜索任何文档。 寻找即将到来的条目,以对在Lucene索引中搜索事物有一个高层次的概述。

分手笔记

回想一下,我们说过,假设我们的目标数据是一组Word文档会更简单。 现在我们已经完成了,请考虑您的目标数据可以是任何数据。 实际上,搜索的是Lucene文档。 您可以根据需要创建任何内容。 它们可以并且经常来自现实世界中数据对象的集合。 同样,将哪些数据放入Lucene文档中取决于您的业务需求。 它可以像Word文档到Lucene文档的一对一映射一样简单,或者每个Lucene文档可以是各种数据库查询以及您可能会发现的其他内容的集合。

索引愉快!

参考: Lucene概述第一部分:由我们的W4G合作伙伴 Chad Davis在zeroInsertionForce博客上创建索引 。


翻译自: https://www.javacodegeeks.com/2012/04/lucene-overview-part-one-creating-index.html

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

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

相关文章

初识openstack

一、 什么是openstack? OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。 二、openstack前世今身 openstack是一个跟Eucalyptus,AWS(Amazon web Service)类…

c语言case多语句的取值,Switch Case语句中多个值匹配同一个代码块的写法

C#+JQuery+.Ashx+百度Echarts实现全国省市地图和饼状图动态数据图形报表的统计在目前的一个项目中,需要用到报表表现数据,这些数据有多个维度,需要同时表现出来,同时可能会有大量数据呈现的需求,经过几轮挑选,最终选择了百度的e…

php解决下单、抽奖并发导致的库存负数的问题

我们知道数据库处理sql是一条条处理的,假设购买商品的流程是这样的: sql1:查询商品库存 if(库存数量 > 0) { //生成订单... sql2:库存-1 } 当没有并发时,上面的流程看起来是如此完美,假设同时两个人下单,而…

在Spring中使用JDBCJobStore配置Quartz

我将开始一些有关Quartz Scheduler内部,提示和技巧的系列文章,这是第0章-如何配置持久性作业存储。 在Quartz中,您基本上可以在将作业和触发器存储在内存中以及在关系数据库中进行选择( Terracotta是最近添加的混合功能&#xff0…

rlwrap插件,实现sqlplus上下翻页

oracle在Linux下,sqlplus中不能上下翻,最主要我经常打错字!嘿嘿 01、下载 RPM :http://rpmfind.net/linux/rpm2html/search.php?queryrlwrap tar.gz:https://fossies.org/linux/privat/rlwrap-0.42.tar.gz/ 百度云:h…

ice库c语言例子,很不多的ICE架构入门学习例子

虽然使用传统的SOCKET编程,我们可以更为清楚程序的性能,能够更直接的操控SOCKET的设置,比如发送超时时间,接受BUFFER的大小,以及进行自己的协议加密。但是由于其调试成本较高,且不易于分布式部署ICE 作为一…

程序员的十个层次,你属于哪一层?(转)

自西方文艺复兴以来,中国在自然科学方面落后西方很多,软件领域也不例外。当然现在中国的许多程序员们对此可能有许多不同的意见,有些人认为中国的程序员水平远落后于西方,有些则认为中国的程序员个人能力并不比西方的程序员差&…

操作系统基础篇

程序运行的4个因素 (1).程序设计语言 (2).编译系统 (3).操作系统 (4).指令集结构(硬件系统) 操作系统的定义:操作系统是掌控计算机上所有事情的软件系统(硬件资源,软件资源) 操作系统对内存,i/o,cpu&#x…

高效快速中值滤波算法c语言,快速中值滤波及c语言实现.docx

...快速中值滤波及c语言实现学生姓名: 刘 勇 学 号: 6100410218 专业班级: 数媒101【摘要】本文讨论了用c语言在微机上实现中值滤波及快速算法,在程序设计的过程中充分考虑到程序运行的时间复杂度和空间复杂度的问题.解…

Arquillian 1.0.0.Final正式发布! 准备使用GlassFish和WebLogic! 杀死所有虫子!

红帽公司和JBoss社区今天宣布的1.0.0.Final发布的Arquillian ,其屡获殊荣的建在Java虚拟机(JVM)运行测试平台。 Arquillian大大减少了编写和执行Java中间件集成和功能测试所需的工作。 它甚至使测试工程师能够解决以前认为无法测试或测试成本…

Jquery选择器特殊字符问题

场景: $("#" AAA ""),AAA代表某表单ID 当AAA为普通字符串时,ok; 当AAA含有特殊符号时(eg:a.b),获取不到该对象; 原因:特殊符号会进行转义&#xf…

qq五笔linux,QQ五笔 - 五笔小字典 QQ绑定很实用

九、 智能调频、空码检索、词序固定在QQ五笔中还有一些小亮点,比如它可以根据“最近输入”、“输入次数”对候选词排序。同时为了加快检索速度,默认只在常用字库(GB2312)中检索,只有出现空码后才会继续搜索容量更大的GBK字库,很好…

DFS:C 小Y的难题(1)

解题心得: 1、在明确使用DFS之后一定要找到递归函数的出口、方向,以及递归的点(在某个情况下开始递归)(void 也可以return,但是没有返回值)。递归时也要有递归的方向,最后都能够达到递归的出口。 2、在DF…

使用ActiveMQ支持Spring Integration路由

正如我在上 一篇 文章中所讨论的那样 ,Spring Integration(SI) 是在Spring Framework之上构建的路由框架 ,它使您可以使用经过验证的企业集成模式来通过消息传递解决系统集成问题。 配置好SI并执行路由和中介逻辑后,您…

quagga源码分析--路由信息处理zebra-rib

对于各个协议生成的路由信息的处理属于quagga中非常重要的一个功能,如何在内核进行路由增加,更新,删除是一个复杂的过程。 quagga在thread任务调度中加入了一种工作队列,work_queue,与内核的工作队列类似,是…

android 关闭蓝牙打电话功能,Android蓝牙开发【八】hfp接听、挂断电话

继续研究hfp相关功能。蓝牙耳机可以控制手机接听、拒接、挂断电话,拨打电话等功能。本文主要分析下起这些操作的大致流程。在系统应用Bluetooth中com_android_bluetooth.cpp提供了多个回调方法,由hardware、协议栈回调过来。蓝牙耳机的一些控制命令都会发…

android在listview中放入从sdcard读取的bitmap

重写viewbinder public class viewbinder_bookmark implements SimpleAdapter.ViewBinder{Overridepublic boolean setViewValue(View view, Object data, String textRepresentation){if(view instanceof ImageView && data instanceof Bitmap){ImageView imageview(I…

将状态机模式实现为流处理器

在我的上一个博客中,我说我真的以为某些“四人行”(GOF)模式已经过时了,如果不是过时的话肯定不受欢迎。 特别是我说过StateMachine不是那么有用,因为您通常会想到另一种更简单的方式来执行您正在执行的事情&#xff0…

android 自定义actionbar,如何让android的actionbar浮动且透明

如上图所示,谷歌地图的actionbar是透明的,且浮动在整个布局之上,没有占用布局空间。其实要做到这样的效果,我们首先想到的是两个方面:1.将让actionbar浮动起来。2.给actionbar一个背景,可以为颜色也可以为图…

CentOS 7安装redis及php扩展

安装remi源 # wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm # rpm -Uvh remi-release-7.rpm # sed -i -e "s/enabled1/enabled0/g" /etc/yum.repos.d/remi.repo 确认使用remi源时安装的Redis版本。 安装Redis 使用remi源yum安装Redis。 # yum …