热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Lucene全文检索技术入门

一、搜索引擎的历史萌芽:Archie、Gopher起步:Robot(网络机器人)的出现与spider(网络爬虫)发展:excite、galax


一、 搜索引擎的历史

         萌芽:Archie、Gopher

         起步:Robot(网络机器人)的出现与spider(网络爬虫)

         发展:excite、galaxy、yahoo

         繁荣:infoseek,altaVista,Google和baidu

 

搜索技术发展依赖网络机器人和网络爬虫

         网络机器人:互联网上完成特定功能的程序

         网络爬虫:专门用于搜索领域程序,主要目的,去互联网上 下载需要资源

 

二、 搜索技术在日常中应用

         本地软件 : 文档内检索、本地文件检索、 myeclipse 帮助文档索引

         站内检索 : BBS和BLOG 提供文章搜索功能 (贴吧)

         垂直网站资源检索 : 818 工作网 (显示智联招聘、前程无忧等招聘网站的查询结果 )

         互联网中各种资源的搜索 : baidu、google (所有领域的资源)

 

信息检索的过程

         1)构建文本库

         2)建立索引

         3)进行搜索

         4)对结果进行排序

 

三、 倒排索引

         传统查找采用线性查询,从前向后查找

         使用倒排索引,将关键单词出现位置建立索引,通过查询索引库,获知内容位置,对于文档很大的情况,检索效率也是非常高的

 

四、 lucene 快速入门

         Lucene:一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供,Lucene提供了一                         个简单却强大的应用程式接口,能够做全文索引和搜寻,在Java开发环境里Lucene是一个成                     熟的免费开放源代码工具

注:Lucene并不是现成的搜索引擎产品,但可以用来制作搜索引擎产品,lucene可以对任何资源建立索引,      前提必须要获得资源对应文本内容

 

课程以3.6.2 讲解, 最新版本 lucene4.3  (lucene4 和 lucene3 开发差别很大 )

         ApacheSolr: Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器

 

什么是全文检索

全文检索:计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章                              中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查                         找的结果反馈给用户的检索方式

入门步骤

         1、 去官网下载 lucene 开发包

                   lucene目录: 开发核心包 lucene-core-3.6.2.jar 

                   contrib目录:存放插件包

                   docs目录:存放文档

 

         2、 使用lucene 在原有数据存储上, 对数据建立索引

                   软件开发,数据应该保存在数据库, 数据库中提供索引技术 

 

lucene索引与数据库的索引功能的区别

         数据库不可能对所有字段建立索引(默认根据主键、外键有约束列检索索引),数据库建立索引并没      有采用分词算法(也不是全文索引),lucene可以对目标文件分层进行全文检索,lucene在做模糊查询   的时候,数据库是不能做索引的,而lucene的优点主要发生在模糊查询上的索引建立上。

 

3、 对存储数据转换Document(lucene框架中可以被索引的数据对象 )

         Field(Stringname, String value, Field.Store store, Field.Index index)  代表一个字段


4、 生成索引


5、 通过第三方工具 Luke 查看索引文件内容

    注:luke 只能支持到 lucene3.x

         lukeall-3.5.0.jar可执行jar文件 、 DOS命令行运行方式java -jar 文件名

        


6、 索引库的查询

 

Lucene开发 API详细分析

1、 包结构


         2、 创建索引相关 API

         Directory  索引操作目录

         Analyzer   分词器

         Document索引中文档对象

         Field文档内部数据信息

         IndexWriterConfig索引生成配置信息

         IndexWriter  索引生成对象

基本步骤:

·第一步 : 指定创建索引目录

         Directorydirectory = FSDirectory.open(new File("index")); // FSDirectory 打开磁盘目录

·第二步 : 指定分词器

    new StandardAnalyzer(Version.LUCENE_36); 建立标准分词器

         使用不同版本lucene 需要传入不同 Version对象

·第三步 : 转换数据为Document对象

    document.add(new Field(name, value ,store, index)) ;

          name : 通常实体类属性名

          value : 属性值

          store : Store.YES 存储 、Store.NO  不存储

                   注:这里存储指的就是,是否将数据保存到document文档数据区

          index : 是否索引

                   Index.NO  不建立索引 (在索引区没有数据,该字段不可以查询)

                   Index.ANALYZED分词建立索引 "lucene入门" ----- "lucene","入" ,"门"

                   Index.NOT_ANALYZED不分词建立索引  "lucene入门" ---- "lucene入门"

                   Index.ANALYZED_NO_NORMS  分词建立索引,不存放权重信息

                   Index.NOT_ANALYZED_NO_NORMS不分词建立索引,不存放权重信息

                   注:NORMS(权重):影响排名,计算得分,如果 ANALYZED_NO_NORMS不存放权重信息,默认                                     值为1.0 NORM 由分词频率决定,如果不存放权重,性能更好

·第四步 创建索引

                   indexWriterConfig.setOpenMode(OpenMode.APPEND);//默认索引追加

                   indexWriterConfig.setOpenMode(OpenMode.CREATE);//每次新建索引库

        

案例: 通过图书案例,了解哪些数据需要存储的,哪些数据需要索引的

         书号:存储、索引、不分词(用户输入完整书号,不用模糊查询)

         书名:存储、索引、分词(用户输入部分书名模糊查询)

         作者名:存储、索引、不分词

         书的出版日期:存储(用户没有查询要求)

         书的摘要:索引、分词(没有完整显示信息需要)

         书的价格:存储(不查询、需要显示)

注:数据要不要被查询 -----要就索引,不要就不索引

         数据查询时是完整查询还是模糊查询 ----完整查询就不分词,模糊查询就分词

         查询数据结果中要不要有该数据 ----有就存储,没有就不存储

 

3、 如果多个线程同时对一个索引库进行写入,是不可以的

         当创建一个 IndexWriter的时候,就会对索引库进行加锁,确保同一时间只能由一个IndexWriter向索引库写入,如果当对一个索引库创建了多个 IndexWriter时会发生异常:org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out:NativeFSLock@D:\work\javaee20130222\lucene3_day1\index\write.lock

         解决方法:确保一个索引库只能有一个IndexWriter对象,需要创建工具类,将其放到static块中

 

4、 查询索引API 详细分析

QueryParser 查询解析器,将查询字符串解析为Query对象

  *  MultiFieldQueryParser 可以匹配多个Field

默认QueryParser 只能查询 一个Field,如果要从多个Field中进行查询,使用 MultiFieldQueryParser


Term  搜索分词的最小单位

      一个Term对象有两个String类型的域组成:字段的名称和字段的值

TermQuery 搜索最小单位的查询(不用分词器)


IndexSearcher 索引查询对象

         对于IndexSearcher 对象没有线程安全问题,如果将IndexSearch获得写入工具方法,该对象无需static

TopDocs 查询结果排名前n文档对象

         totalHits属性:代表查询的总结果数

         scoreDocs属性:返回得分文档数组

ScoreDoc 得分文档对象

         store属性 查询得分

         doc属性 文档内部编号

 

ssh环境中使用 lucene对数据进行索引(提高hibernate检索性能

         注:需要在进行数据表增删改查同时, 维护索引库的增删改查

1、 实现SSH 的CURD 操作

2、 在CURD 数据库表的同时, 操作索引库

         导入 lucene-core-3.6.2.jar

3、 在保存Article文章数据时,为Article对象数据创建索引

                  编写工具类ArticleDocumentUtils ,完成 Article对象 和 Document 相互转换


                  编写工具类Configuration提供获得索引Directory对象和 Analyzzer 分词器


                  编写工具类LuceneUtils 获得 IndexWriter和IndexSearcher


4、 索引CURD

         添加索引 indexWriter.addDocument(document);


         删除索引 


         修改索引  indexWriter.updateDocument(term,document);

         注:(不进行修改,因为性能很差),一般都是先删除再创建。


         查询索引 (用于非主键字段 like模糊查询,先查询索引库获得数据id ,再通过id 查询数据表)

         注:根据id 查询基本上不用索引库,因为数据库的本身对 id 有索引,只需查询数据库就行了。

 

索引的调优

1、 合并因子 mergeFactor

         默认情况下,每创建一个对象就会创建一组索引文件

         例:通过 mergePolicy.setMergeFactor(4); 设置合并因子(四个对象以上创建索引就合并)


        手动合并索引方法  LuceneUtils.get IndexWriter().optimize();(已过时)

         好处: 减少硬盘上索引文件数量

2、   使用RAMDirectory

         RAMDirectory是内存的一个区域,当虚拟机退出后,里面的内容也会随之消失,RAMDirectory的性能         要好于FSDirectory, 因此可以结合使用,在虚拟机退出时,将RAM内容转到FSDirectory

 

案例一 : 使用RAMDirectory  ,当虚拟机退出,索引库数据丢失

        

案例二: JVM运行时,读取FSDirectory中索引 ---- RAMDirectory  操作RAMDirectory

                   在JVM 停止之前,将RAMDirectory 数据写入 FSDirectory 

         注意:必须设置 OpenMode.CREATE,否则会多出分词数据。


推荐阅读
  • Jboss的EJB部署描述符standardjaws.xml配置步骤详解
    本文详细介绍了Jboss的EJB部署描述符standardjaws.xml的配置步骤,包括映射CMP实体EJB、数据源连接池的获取以及数据库配置等内容。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
author-avatar
圈儿丫头1986
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有