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

lucene创建索引

lucene创建索引_Lucene概述第一部分:创建索引相关推荐

  1. Oracle教程之管理索引(一)--Oracle管理索引

    1.索引的创建语法: CREATE UNIUQE | BITMAP INDEX <schema>.<index_name> ON <schema>.<tabl ...

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

    介绍 我最近一直在与开源搜索引擎Lucene合作 . 我不是专家,但是由于我只是浏览了一些相当稀疏的文档并将应用程序从Lucene的很旧的版本迁移到了最新版本的2.4,所以我在总体上很清楚. Luce ...

  3. 利用Lucene.net搭建站内搜索(3)---创建索引

    Lucene.net提供了很全面的数据搜索操作,你可以利用Lucene.net检索磁盘中的文件,网页,数据库中的数据,但是前提是预先对数据创建索引. Lucene索引过程分为三个主要的操作阶段:将数据 ...

  4. mysql主键创建非聚集索引_什么是聚集索引,非聚集索引,索引覆盖,回表,索引下推...

    聚集索引 我们先建如下的一张表 CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学号',`name` var ...

  5. mysql按升序创建索引_Mysql中的降序索引底层实现

    什么是降序索引 大家可能对索引比较熟悉,而对降序索引比较陌生,事实上降序索引是索引的子集. 我们通常使用下面的语句来创建一个索引: 上面sql的意思是在t1表中,针对b,c,d三个字段创建一个联合索引 ...

  6. oracle心间directory并附权,【Oracle】第一章创建授权

    ORACLE 第一章创建授权 通过命令查看控制文件,数据文件,日志文件: 控制文件 :Desc v$controlfile; 数据文件 :desc v$datafile; 日志文件:desc v$lo ...

  7. mysql唯一索引的关键字,Mysql中创建唯一索引的关键字是______

    摘要: 本差如果入当准成将标期损异计益,创建本节相抵则应准成支差将标约差余额和超后的,"本润"计入的借年利方科目.键字细胞最长的血寿命是(.创建制作工序津派_道旗袍有_.... 本 ...

  8. MYSQL索引的作用以及如何创建索引

    一.索引的作用 索引是什么,首先我们可以举个例子,字典大家应该都使用过,我们可以使用目录快速定位到所要查找的内容,那么索引跟目录的作用类似,在数据库表记录中,利用索引,可以快速过滤查找到数据记录. 一 ...

  9. 安装Oracle之后的第一步---创建表空间、新增用户、用户授权

    第一步:创建表空间 表空间:此空间是用来进行数据存储的. 临时表空间:主要用途是在数据库进行排序运算.管理索引.访问视图等操作时提供临时的运算空间,当运算完成之后系统会自动清理. 备注:因为用途不同所 ...

最新文章

  1. 随机森林是我最喜欢的模型
  2. Ubuntu下 安装 window 虚拟机
  3. XamarinAndroid组件教程RecylerView适配器设置动画
  4. 【alibaba-cloud】Gateway网关
  5. Android个人信息管理系统 源代码,个人信息管理系统源代码(自己写的).doc
  6. P4457-[BJOI2018]治疗之雨【期望dp,高斯消元】
  7. 20061008: IntelliJ Idea 6
  8. 对于根目录磁盘满的了问题
  9. 如何使用记事本和cmd执行java代码
  10. wps在线预览接口_Office在线预览及PDF在线预览的实现方式大集合
  11. 数学神童:让天赋更自由
  12. C语言经典例17-统计字符个数
  13. 30岁开始实现我的程序员梦
  14. Jvav常问面试题(附解析)
  15. unity3D-游戏/AR/VR在线就业班 C#入门访问修饰符学习笔记
  16. Android Studio基础输入文本框EditText
  17. 如何把SQL表格发给别人直接使用
  18. js 按拼音 首字母 排序 并分组
  19. 7-5 梅森数 (10 分)
  20. Chart.js 插件的使用

热门文章

  1. (十二)C3P0连接池使用教程
  2. C++描述杭电OJ 2017.字符串统计||
  3. linux 安装mysql 8.0_Linux安装mysql 8.0的详细方法介绍(代码示例)
  4. mininet编程实现交换机规则的插入、删除与修改。_可编程网卡芯片在滴滴云网络的应用实践...
  5. JVM参数设置、分析(转)
  6. SpringBoot整合Shiro权限框架
  7. HDU1864(01背包)
  8. Spring boot (5):Spring data jpa 的使用
  9. java项目教训_[免费电子书]分析超过600,000个Java项目的经验教训
  10. natty的异步通信框架_OpenHub框架进行的异步通信