当前位置: 首页 > news >正文

[Lucene] Lucene 全文检索引擎简介

  Lucene是一个用Java 写的全文索引引擎工具包,可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。Lucene 的作者Doug Cutting  贡献出Lucene的目标就是为各种中小型应用程序加入全文检索功能。

全文检索的实现机制

  Lucene 的API 接口设计的比较通用,输入输出结构都很像数据库的表==>记录==>字段,所以很多传统的应用的文件、数据库等可以比较方便的映射到Lucene的存储结构/接口中。可以先把 Lucene 当成一个技持全文索引的数据库系统。

Lucene和数据库比较:

2009052016353662.jpg

 

全文检索 ≠ like "%keyword%"

  比较厚的书后面常附关键词索引表(比如:北京:12, 34页, 上海:3,77页……),是为了帮助读者比较快地找到相关内容的页码。数据库索引功能能够大大提高效率原理也是一样,通过索引查找显示比一页一页翻页查找快很多倍,所以之所以效率高,另一个原因是它是排好序的。对于检索系统来说核心是一个排序问题。

   建立一个高效检索系统的关键是建立一个类似于科技索引一样的向索引机制,将数据源排序存储的同时,另外存储一个排好序的关键词列表,用于关键词 =》 数据源(比如文章)映射关系,比如:

    关键词 =》 出现关键词的数据库(文章)编号、出现次数(甚至包括位置:起始偏移量,结束偏移量)、出现频率

利用这样的映射关系索引,检索过程就是把模糊查询变成多个可以利用索引的精确查询的逻辑组合的过程。而大大提高了关键词查询的效率,所以全文检查最后还是一个排序问题。

Lucene 和数据库模糊查询比较:

2009052016532096.jpg

全文检索和数据库应用最大的不同在于:让最相关的头100条结果满足98%以上用户的需求

Lucene的创新之处:

  大部分的搜索(数据库)引擎都是用B树结构来维护索引,索引的更新会导致大量的IO操作,Lucene在实现中,对此稍微有所改进:不是维护一个索引文件,而是在扩展索引的时候不断创建新的索引文件,然后定期的把这些新的小索引文件合并到原先的大索引中(针对不同的更新策略,批次的大小可以调整),这样在不影响检索的效率的前提下,提高了索引的效率。

Lucene和其他一些全文检索系统/应用的比较:

2009052016552019.jpg

 

关于亚洲语言的的切分词问题(Word Segment)

  对于中文来说,全文索引首先还要解决一个语言分析的问题,对于英文来说,语句中单词之间是天然通过空格分开的,但亚洲语言的中日韩文语句中的字是一个字挨一个,所有,首先要把语句中按“词”进行索引的话,这个词如何切分出来就是一个很大的问题。

  首先,肯定不能用单个字符作(si-gram)为索引单元,否则查“上海”时,不能让含有“海上”也匹配。

  但一句话:“北京天安门”,计算机如何按照中文的语言习惯进行切分呢?
  “北京 天安门” 还是“北 京 天安门”?让计算机能够按照语言习惯进行切分,往往需要机器有一个比较丰富的词库才能够比较准确的识别出语句中的单词。

  另外一个解决的办法是采用自动切分算法:将单词按照2元语法(bigram)方式切分出来,比如:
  "北京天安门" ==> "北京 京天 天安 安门"。

  这样,在查询的时候,无论是查询"北京" 还是查询"天安门",将查询词组按同样的规则进行切分:"北京","天安安门",多个关键词之间按与"and"的关系组合,同样能够正确地映射到相应的索引中。这种方式对于其他亚洲语言:韩文,日文都是通用的。

  基于自动切分的最大优点是没有词表维护成本,实现简单,缺点是索引效率低,但对于中小型应用来说,基于2元语法的切分还是够用的。基于2元切分后的索引一般大小和源文件差不多,而对于英文,索引文件一般只有原文件的30%-40%不同,

2009052016570831.jpg

  目前比较大的搜索引擎的语言分析算法一般是基于以上2个机制的结合。

-------------------------------------------------

原文:http://www.chedong.com/tech/lucene.html

相关文章:

  • Js 跨域调用问题
  • struts中filter解决中文问题
  • ASP.NET内部原理(HttpHandler和HttpModule)
  • SQL Server中临时表与表变量的区别
  • Pro C# 2008 and the .NET 3.5 Platform学习过程
  • 魔兽世界真的还值得你玩下去么?
  • 图解ASP.NET AJAX 1.0 RC开发
  • 动脑筋
  • 在Exchange 2003的03域改名
  • RHEL4- FTP服务(一)vsftpd的安装与启动
  • javascript中获取地址栏参数
  • WCF 4.0中的WS-Discovery
  • 《亮剑.NET:.NET深入体验与实战精要》前言
  • 在 Java 应用程序中定时执行任务
  • 我的座右铭
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • .pyc 想到的一些问题
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • JavaScript实现分页效果
  • Meteor的表单提交:Form
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 计算机常识 - 收藏集 - 掘金
  • 两列自适应布局方案整理
  • 硬币翻转问题,区间操作
  • 栈实现走出迷宫(C++)
  • No resource identifier found for attribute,RxJava之zip操作符
  • 阿里云API、SDK和CLI应用实践方案
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • $L^p$ 调和函数恒为零
  • (175)FPGA门控时钟技术
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (定时器/计数器)中断系统(详解与使用)
  • (四)JPA - JQPL 实现增删改查
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET 使用 XPath 来读写 XML 文件
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .net生成的类,跨工程调用显示注释
  • .net实现客户区延伸至至非客户区
  • .NET值类型变量“活”在哪?
  • .pop ----remove 删除
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • @Bean有哪些属性
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • [20161214]如何确定dbid.txt
  • [acm算法学习] 后缀数组SA
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用