文档章节

搜索引擎-Luncene

crayzer_yixiu
 crayzer_yixiu
发布于 2016/09/22 21:39
字数 2016
阅读 80
收藏 3

什么是lucene?

  • Lucene是一个全文搜索框架,而不是应用产品。因此它并不像http://www.baidu.com/或者googleDesktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品。

lucene能做什么?

  • 要回答这个问题,先要了解lucene的本质。实际上lucene的功能很单一,说到底,就是你给它若干个字符串,然后它为你提供一个全文搜索服务,告诉你你要搜索的关键词出现在哪里。知道了这个本质,你就可以发挥想象做任何符合这个条件的事情了。你可以把站内新闻都索引了,做个资料库;你可以把一个数据库表的若干个字段索引起来,那就不用再担心因为“%like%”而锁表了;你也可以写个自己的搜索引擎……

你该不该选择lucene?

  • 下面给出一些官方测试数据,如果你觉得可以接受,那么可以选择。
    • 测试一:250万记录,300M左右文本,生成索引380M左右,800线程下平均处理时间300ms。
    • 测试二:37000记录,索引数据库中的两个varchar字段,索引文件2.6M,800线程下平均处理时间1.5ms。

lucene为什么这么快

  • 倒排索引 :
    • 倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(inverted file)。
    • 倒排文件(倒排索引),索引对象是文档或者文档集合中的单词等,用来存储这些单词在一个文档或者一组文档中的存储位置,是对文档或者文档集合的一种最常用的索引机制。
    • 搜索引擎的关键步骤就是建立倒排索引,倒排索引一般表示为一个关键词,然后是它的频度(出现的次数),位置(出现在哪一篇文章或网页中,及有关的日期,作者等信息),它相当于为互联网上几千亿页网页做了一个索引,好比一本书的目录、标签一般。读者想看哪一个主题相关的章节,直接根据目录即可找到相关的页面。不必再从书的第一页到最后一页,一页一页的查找。技术分享

更多详细请查看:

http://www.cnblogs.com/raphael5200/p/5143687.html

http://blog.csdn.net/chichengit/article/details/9235157

  • 压缩算法:
    • LZ4算法又称为Realtime Compression Algorithm,在操作系统(linux/freeBSD)、文件系统(OpenZFS)、大数据(Hadoop)、搜索引擎(Lucene/solr)、数据库(Hbase)……都可以看到它的身影,可以说是一个非常通用的算法。LZ4最突出的地方在于它的压缩/解压速度。

相关文章:

http://blog.csdn.net/zhangskd/article/details/17009111

http://blog.csdn.net/zhangskd/article/details/17282895

  • 二元搜索:
    • 二元搜索算法是在排好序的数组中找到特定的元素,类似key,value
    • 首先, 比较数组中间的元素,如果相同,则返回此元素的指针,表示找到了. 如果不相同, 此函数就会继续搜索其中大小相符的一半,然后继续下去. 如果剩下的数组长度为0, 则表示找不到,那么函数就会结束.

lucene的工作方式 

  • lucene提供的服务实际包含两部分:一入一出。所谓入是写入,即将你提供的源(本质是字符串)写入索引或者将其从索引中删除;所谓出是读出,即向用户提供全文搜索服务,让用户可以通过关键词定位源 

写入流程

  • 源字符串首先经过analyzer处理,包括:分词,分成一个个单词;去除stopword(可选)。  将源中需要的信息加入Document的各个Field中,并把需要索引的Field索引起来,把需要存储的Field存储起来。  将索引写入存储器,存储器可以是内存或磁盘。

读出流程 

  • 用户提供搜索关键词,经过analyzer处理。  对处理后的关键词搜索索引找出对应的Document。  用户根据需要从找到的Document中提取需要的Field。

Lucene API介绍

  • analyzer
    • Analyzer 是分析器,它的作用是把一个字符串按某种规则划分成一个个词语,并去除其中的无效词语,这里说的无效词语是指英文中的“of”、“the”,中文中的“的”、“地”等词语,这些词语在文章中大量出现,但是本身不包含什么关键信息,去掉有利于缩小索引文件、提高效率、提高命中率。分词的规则千变万化,但目的只有一个:按语义划分。这点在英文中比较容易实现,因为英文本身就是以单词为单位的,已经用空格分开;而中文则必须以某种方法将连成一片的句子划分成一个个词语。具体划分方法下面再详细介绍,这里只需了解分析器的概念即可
    • http://www.tuicool.com/articles/uYfy2q2
  • document 
    • 用户提供的源是一条条记录,它们可以是文本文件、字符串或者数据库表的一条记录等等。一条记录经过索引之后,就是以一个Document的形式存储在索引文件中的。用户进行搜索,也是以Document列表的形式返回。 
  •  field 
    • 一个Document可以包含多个信息域,例如一篇文章可以包含“标题”、“正文”、“最后修改时间”等信息域,这些信息域就是通过Field在Document中存储的。 
    • Field有两个属性可选:存储和索引。通过存储属性你可以控制是否对这个Field进行存储;通过索引属性你可以控制是否对该Field进行索引。这看起来似乎有些废话,事实上对这两个属性的正确组合很重要 
    • 下面举例说明
      • 还是以刚才的文章为例子,我们需要对标题和正文进行全文搜索,所以我们要把索引属性设置为真,同时我们希望能直接从搜索结果中提取文章标题,所以我们把标题域的存储属性设置为真,但是由于正文域太大了,我们为了缩小索引文件大小,将正文域的存储属性设置为假,当需要时再直接读取文件;我们只是希望能从搜索解果中提取最后修改时间,不需要对它进行搜索,所以我们把最后修改时间域的存储属性设置为真,索引属性设置为假。上面的三个域涵盖了两个属性的三种组合,还有一种全为假的没有用到,事实上Field不允许你那么设置,因为既不存储又不索引的域是没有意义的。
    • term
      • term是搜索的最小单位,它表示文档的一个词语,term由两部分组成:它表示的词语和这个词语所出现的field。
    • tocken
      • tocken是term的一次出现,它包含trem文本和相应的起止偏移,以及一个类型字符串。一句话中可以出现多次相同的词语,它们都用同一个term表示,但是用不同的tocken,每个tocken标记该词语出现的地方
    • segment
      • 添加索引时并不是每个document都马上添加到同一个索引文件,它们首先被写入到不同的小文件,然后再合并成一个大索引文件,这里每个小文件都是一个segment。

© 著作权归作者所有

共有 人打赏支持
crayzer_yixiu
粉丝 26
博文 57
码字总数 87921
作品 0
杭州
高级程序员
私信 提问
简拼功能的实现

简拼功能之前在 Delphi 端还是很容易实现的,数据量少时,直接用数据库做prefix查询即可。 但是,现在多个商家在一个库中,数据量要大很多。 一种常用的方法是使用lucene来索引,lucene的查询...

wupher
2016/07/05
6
6
ICEcore

ICEcore是一个优秀的可扩展的开放团队协作软件,为整个团队工作空间提供实时的交流环境。它通过提供一个交流平台为开发团队带来生产力的提升和减少 交流的损失。ICEcore允许用户创建团队和分...

匿名
2008/09/17
5.5K
0
问个lucene 全文检索的问题 (本人菜鸟)

用luncene 对网站中的内容进行全文检索,比如说 文章的标题和文章的内容,那我标题和内容 是存在数据库里还是以文件的形式存在磁盘上?这个是怎么做到的?

一直没睡醒
2013/06/20
229
1
ChenilleKit

Chenille 是一组基于 Tapestry IOC 的用来开发Web应用程序的模块、服务和工具包 ChenilleKit团队不久前发布了ChenilleKit项目的第一个版本。 1.0.0版本包括原项目T5Components的所有功能,而...

匿名
2009/01/04
567
0
全栈工程师的能力点

全栈工程师是对于除了bat的主站以外的大多数项目,这样的能力也许不是一个方面的专家,但是能再一定时间快速解决一个问题。可能做服务器的发展成全站更容易一些,但是一切能力都是可以通过练...

LANTIANFEIYING
2016/11/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

开启genelog

打开genelog genelog 可以记录数据库的操作语句。 首先进入mysql, mysql -u root -p 设置日志位置 set global general_log_file = "/tmp/general.log"; 设置全局global模式 set global gen......

狼王黄师傅
17分钟前
0
0
Java 帝国对 Python 的渗透能成功吗?哈哈

引子 Java 帝国已经成立20多年,经过历代国王的励精图治,可以说是地大物博,码农众多。 可是国王依然不满足,整天想着如何继续开拓疆土, 这一天晚上他又把几个重臣招来商议了。 IO大臣说:...

边鹏_尛爺鑫
今天
7
0
分布式事务解决方案框架(LCN)

什么是XA接口 XA是一个分布式事务协议,由Tuxedo提出。XA中大致分为两部分:事务管理器和本地资源管理器。其中本地资源管理器往往由数据库实现,比如Oracle、DB2这些商业数据库都实现了XA接口...

群星纪元
今天
7
0
linux 操作系统 常用命令和软件安装

1.系统时间更新 ntpdate time.windows.com 2.传送文件 rsync -av /home/data/a.dat -e ssh root@192.168.0.100:/home 3.传送文件夹 scp -r /home/data root@192.168.0.100:/home 4.JDK安装 ......

WJtiny
今天
3
0
pg_lightool基于basebackup的单表恢复和块恢复

开源软件pg_lightool,实现了基于wal日志的块恢复。详情参见博客:https://my.oschina.net/lcc1990/blog/1931485。由于wal日志中FPW的不确定性,它不能作为一个数据库恢复的解决方案。目前对...

movead
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部