Lucene的原理和应用
随着互联网的迅速普及与发展,网络舆论对社会生活的影响力越来越大, 网络口碑研究也逐渐形成一个新兴行业。有效的网络口碑研究,需要全方位地倾听网民的声音。 信息检索技术的应用,有效地提高了网络口碑研究的工作效率。
Lucene 作为当今最知名的开源信息检索库,被广泛应用于各种与全文检索相关的项目中。 本文将简要介绍Lucene的基本原理与应用,在此抛砖引玉,希望能有机会与更多的同行进行交流。
Lucene是什么
Lucene 是一个开源的、成熟的全文索引与信息检索(IR)库,采用Java实现。它在系统中的地位,相当于一个主要用来全文检索的数据库,与系统其它模块的关系如下:

Lucene与数据库的类比
|
数据库
|
Luecene
|
|
|
基本概念
|
列/字段
|
Field
|
|
行/记录
|
Document
|
|
|
基本操作
|
查询(SELECT)
|
Searcher
|
|
添加(INSERT)
|
IndexWriter. addDocument |
|
|
删除(DELETE)
|
IndexReader.delete
|
|
|
修改(UPDATE)
|
不支持(可删除后重新添加)
|
Lucene与倒排索引(Inverted index)
我想很多人在用数据库时,都遇到过这种类似的情况:查找含‘奥运会’这个词的数据, 一般都用 LIKE '%奥运会%' 作为条件的SQL语句进行。 这种解决方法,在数据量很大时,存在严重的性能问题。因为一般的数据库索引,对这种查询没有任何帮助。 Lucene作为主要应用于全文检索领域的库,引入了一种倒排索引的技术。
● 相关概念
Term = Field.name + Token.text
Token 分词后的最小单位,如:2008年、奥运会、将、在、北京、举行
Document 每个Document有个唯一的内部编号ID(int类型),重建索引时ID可能变化
● 倒排索引文件格式(示意图)
Term1 DocID1 DocID2 DocID3 …
Term2 DocID1 DocID2 DocID3 …
… …
从以上格式中不难看出,利用这种索引文件,可以迅速定位到包含‘奥运会’这个词的所有文章。
中文分词与信息检索模型
在上面的索引格式中可以看到,在建索引前,需要将一句话拆分为一个个词,这里就要用到中文分词技术。 常见中文分词算法:正向最大匹配法、逆向最大匹配法、基于统计的分词方法; 需要说明的是:Lucene仅提供了分词接口(没有中文分词实现),因此一般还有用到另外的第三方中文分词库。
当检索到含‘奥运会’这个词的文章共有1万篇时,哪些应该排在最前面呢?这就涉及到Lucene的评分机制,默认Lucene评分采用的是信息检索中的向量空间模型理论。
关于中文分词和信息检索模型,这是很大的一个研究课题。感兴趣的朋友,可以到网上搜索相关文章进行深入了解;
使用lucene的常见问题与建议
● 中文分词库: 网上可用的免费中文分词库有 IKAnalyzer(免费但不开源)、Stanford(开源但需自行封装lucene接口)
● 组合查询条件:通过使用QueryParser类,可以支持AND、OR等多种组合条件
● 结果排序: lucene默认按评分排序,通过结合Sort与SortField类,可指定多个排序字段与升降序,排序字段的索引类型必须为UN_TOKENIZED
● 分布式查询: 通过lucene提供的RemoteSearchable类,可以实现分布式查询
● 并行查询: 当分布式有多个节点时,可以通过ParallelMultiSearcher进行并行,以提高检索性能
● 分词与查询: 当索引中以‘奥运会’作为一个词时,通过‘奥运’是无法检索到相应结果的。这个问题可以通过修改检索条件或分词时按较小粒度进行处理
● 数字与日期: 因lucene索引库一律按String类型处理,因此数字日期应补0,使能够正确按字符串比较排序
● 字段索引类型:email日期等无需分词的字段,索引类型应选择UN_TOKENIZED
● 线程安全性: 应保证同时只有一个线程对lucene库进行写操作,可以有多个线程对lucene库进行读操作
Lucene的原理和应用的更多相关文章
- Lucene 工作原理 之倒排索引
1.简介 倒排索引源于实际应用中需要根据属性的值来查找记录.这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址.由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排 ...
- Lucene底层原理和优化经验分享(1)-Lucene简介和索引原理
Lucene底层原理和优化经验分享(1)-Lucene简介和索引原理 2017年01月04日 08:52:12 阅读数:18366 基于Lucene检索引擎我们开发了自己的全文检索系统,承担起后台PB ...
- 【转】Lucene工作原理——反向索引
原文链接: http://my.oschina.net/wangfree/blog/77045 倒排索引 倒排索引(反向索引) 倒排索引源于实际应用中需要根据属性的值来查找记录.这种索引表中的每一项 ...
- 基于Lucene查询原理分析Elasticsearch的性能
前言 Elasticsearch是一个很火的分布式搜索系统,提供了非常强大而且易用的查询和分析能力,包括全文索引.模糊查询.多条件组合查询.地理位置查询等等,而且具有一定的分析聚合能力.因为其查询场景 ...
- Lucene 查询原理 传统二级索引方案 倒排链合并 倒排索引 跳表 位图
提问: 1.倒排索引与传统数据库的索引相比优势? 2.在lucene中如果想做范围查找,根据上面的FST模型可以看出来,需要遍历FST找到包含这个range的一个点然后进入对应的倒排链,然后进行求并集 ...
- .NET面试题系列(十三)Lucene底层原理
索引原理 全文检索技术由来已久,绝大多数都基于倒排索引来做,曾经也有过一些其他方案如文件指纹.倒排索引,顾名思义,它相反于一篇文章包含了哪些词,它从词出发,记载了这个词在哪些文档中出现过,由两部分组成 ...
- Lucene工作原理
Lucene是一个高性能的java全文检索工具包,它使用的是倒排文件索引结构.该结构及相应的生成算法如下: 0)设有两篇文章1和2 文章1的内容为:Tom lives in Guangzhou,I l ...
- [转载] Lucene 工作原理
转载自http://www.cnblogs.com/dewin/archive/2009/11/24/1609905.html Lucene是一个高性能的java全文检索工具包,它使用的是倒排文件索引 ...
- Lucene 工作原理<转>
Lucene是一个高性能的java全文检索工具包,它使用的是倒排文件索引结构.该结构及相应的生成算法如下: 0)设有两篇文章1和2 文章1的内容为:Tom lives in Guangzhou,I l ...
随机推荐
- 04.Continue,和三元表达式的学习
立即结束本次循环,判断循环条件,如果成立,则进入下一次循环,否则退出循环. 举例:运动员跑步喝水的例子 比如:我编写代码的时候,上个厕所,回来继续写代码 练习1: namespace _09.练习02 ...
- ubuntu下安装MySQL8.0
为了一劳永逸不每次都到处找资料,花了一下午时间做了这些.其中大部分是根据官方手册来的,后面部分谢谢大佬的帮助,超开心. 一.首先,将MySQL APT存储库添加到系统的软件存储库列表中 1.转到htt ...
- angular2-生命周期钩子函数
生命周期的顺序 当Angular使用构造函数新建一个组件或指令后,就会按下面的顺序在特定时刻调用这些生命周期钩子方法: 钩子 目的和时机 ngOnChanges() 当Angular(重新)设置数据绑 ...
- css 条纹背景
先介绍文章用到的二个知识点 background-size 属性 语法 background-size: length|percentage|cover|contain; css线性渐变 linear ...
- RDMA in CloudComputing
https://blog.csdn.net/qq_21125183/article/details/80563463
- Android Studio笔记之快捷键
Android Studio h2{ color: #4abcde; } pre{ background-color: #f8f8f8; border: solid 1px #ccc; border- ...
- CSS布局中的问题解决方式
1.解决搜索框和按钮不对齐的方法 vertical-align属性只有两个元素设置为display:inline-block才有效 2.盒子莫名的分行现象 问题描述:比如父盒子宽度为960px,两个左 ...
- Consul在linux系统, 群集实战
Consul作为微服务的服务注册与发现组件,是非常重要的一部分 目前想用Consul作为配置管理的统一管理 准备两台机器 11.11.11.1011.11.11.20 下载consul linux版 ...
- Selenium2学习(八)-- 操作元素(键盘和鼠标事件)
前言 在前面的几篇中重点介绍了一些元素的到位方法,到位到元素后,接下来就是需要操作元素了.本篇总结了web页面常用的一些操作元素方法,可以统称为行为事件 有些web界面的选项菜单需要鼠标悬停在某个元素 ...
- helm回滚应用
helm状态显示为部署,但容器可能不是running 以下是helm的解释 大概意思是helm只要在k8s上执行完成就当做成功,容器部署到创建状态已经不在Helm的角色设定里了 执行回滚前先模拟下过程 ...