Lucene系列-概述
为了生存,就得干一行爱一行。那就学习下lucene吧。
全文检索介绍
流程:
- 建索引
- 准备待搜索文档
- 文档分词:将文档分成一个个单独的单词,去除标点符号、停词(无意义的冠词介词等),得到token
- 语言处理:统一小写,单词缩减或转变为词根形式,得到term
- 索引:用term创建字典,term->doc,对字典按字母顺序排序,合并相同的term成为文档倒排链表。term->doc1,doc2,doc3
- 搜索
- 输入查询语句
- 处理查询语句:词法分析、语法分析、语言处理,得到语法树
- 搜索索引,得到符合语法树的文档
- 根据文档和查询语句的相关性,进行结果排序
计算文档间的相关性:
文档有许多term组成,不同的term对文档的重要性不同。判断文档间的关系需要两步:
- 计算各term对文档的权重
- 计算文档和query间的相关性
文档由一系列的词组成,可以用各词的权重组成的向量代表一个文档。Doc vector = {weight1, weight2, ..., weightN},query也看做是一个文档,query和doc的词数取并集,不含某词,则对应的权重为0。
文档间的相关性转变为两个向量间的夹角大小,夹角越小,相关性越大。夹角越小,余弦越大,所以文档间的相关性如下计算:
Lucene
Lucene就是一个开源的全文检索库,java实现的,只支持纯文本文件的索引和搜索,不负责其由其他格式文件抽取文本或从网络抓取文件。它的工作流程和上述相似。
代码实例
//建索引
Analyzer analyzer = new MaxWordAnalyzer();//词法分析器
IndexWriter writer = new IndexWriter(new RAMDirectory(), analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED); //建索引主类
Document doc = new Document();//待索引文档
doc.add(new Field("id","1",Field.Store.YES,Field.Index.NOT_ANALYZED));//文档属性
doc.add(new Field("name","zhangsan",Field.Store.YES,Field.Index.ANALYZED_NO_NORMS);
writer.addDocument(doc);
writer.commit();
//搜索索引
QueryParser parser = new QueryParser(Version.LUCENE_30, "name", analyzer);//语法分析器(词法、语法分析)
Query q = parser.parse("zhangsan");//查询语句的语法分析获得语法树
IndexSearcher searcher = new IndexSearcher(writer.getReader());//查询主类
TopDocs docs = searcher.search(q,10);//搜索
for (ScoreDoc scoreDoc : docs.scoreDocs) {
//展示结果
Document doc = searcher.doc(scoreDoc.doc);
System.out.println(doc.get("id") + doc.get("name"));
}
Lucene包结构
红线为建索引过程,蓝线为搜索过程。
analysis:语言分析器,对需要建立索引的文本进行分词、过滤等操作,如Analyzer类
index:索引管理,负责索引的创建、删除,如IndexWriter。索引包是整个系统核心,全文检索的根本就是为每个切出来的词建索引,查询时就只需要遍历索引,而不需要去正文中遍历,从而极大的提高检索效率。
store:数据存储管理,主要包括一些底层的I/O操作,如Directory
queryParser:查询分析器,生成语法树,实现查询关键词间的运算,如QueryParser
search:对索引的搜索,根据查询条件,得到结果,如IndexSearcher
similarity:对相关性打分模型的实现
Lucene系列-概述的更多相关文章
- Python网络数据采集系列-------概述
这是一个正在准备中的系列文章,主要参考的是<Web Scraping with Python_Collecting Data from the Modern Web-O'Reilly(2015) ...
- Lucene系列-FieldCache
域缓存,加载所有文档中某个特定域的值到内存,便于随机存取该域值. 用途及使用场景 当用户需要访问各文档中某个域的值时,IndexSearcher.doc(docId)获得Document的所有域值,但 ...
- [lucene系列笔记1]lucene6的安装与配置(Windows系统)
lucene是一个java开源的高效全文检索工具包,最近做项目要用到,把学习的过程记录一下. 第一步:下载安装jdk 1.首先从官网下载jdk(下载之前先查看你的电脑是多少位操作系统,如果是32就下载 ...
- Lucene系列-索引文件
本文介绍下lucene生成的索引有哪些文件组成,每个文件包含了什么信息.基于Lucene 4.10.0. 数据结构 索引(index)包含了存储的文档(document)正排.倒排信息,用于文本搜索. ...
- Lucene系列-近实时搜索(1)
近实时搜索(near-real-time)可以搜索IndexWriter还未commit的内容,介于immediate和eventual之间,在数据比较大.更新较频繁的情况下使用.本文主要来介绍下如何 ...
- Lucene系列-facet
1.facet的直观认识 facet:面.切面.方面.个人理解就是维度,在满足query的前提下,观察结果在各维度上的分布(一个维度下各子类的数目). 如jd上搜“手机”,得到4009个商品.其中品牌 ...
- Lucene系列-搜索
Lucene搜索的时候就要构造查询语句,本篇就介绍下各种Query.IndexSearcher是搜索主类,提供的常用查询接口有: TopDocs search(Query query, int n); ...
- Lucene系列-分析器
分析器介绍 搜索的基础是对文本信息进行分析,Lucene的分析工具在org.apache.lucene.analysis包中.分析器负责对文本进行分词.语言处理得到词条,建索引和搜索的时候都需要用到分 ...
- 笔记之Cyclone IV 第一卷第一章FPGA 器件系列概述
因为本人用的黑金四代开发板,中央芯片采用ALTERA的cycloneIV E,所以就此器件阅读altera官网资料,并做相应的笔记,以便于以后查阅 Cyclone IV 器件系列具有以下特性:■ 低成 ...
随机推荐
- 转载:JAVA中关于set()和get()方法的理解及使用
对于JAVA初学者来说,set和get这两个方法似乎已经很熟悉了,这两个方法是JAVA变成中的基本用法,也是出现频率相当高的两个方法. 为了让JAVA初学者能更好的理解这两个方法的使用和意义,今天笔者 ...
- java excle导出合计字段值
效果图: 代码实现: 解释: // 四个参数分别是:起始行,起始列,结束行,结束列 sheet.addMergedRegion(new Region(0, (short) (celln + 1), 0 ...
- 关于Scrum团队的理解
<阅读完<构建之法>第6~7章>之读后感 阅读完<构建之法>第6~7章之后,不仅感觉获益匪浅,也甚感团队合作.分配.工作的不易与一个团队运营一个项目并推广的艰辛与 ...
- redis连接超时报错
应用程序连接redis超时,报错如下: ERROR DubboServerHandler-xxx.xx.xx.52:20880-thread-172 2016-12-21 15:25:20,429 c ...
- 将 project.json 项目转换为 Visual Studio 2015 解决方案
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
- webpack入门指南(转载)
什么是 webpack? webpack是近期最火的一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX).coffee.样式(含less/sass).图片等都作为模块来使用和处理. 我们可以 ...
- MYSQL中 ENUM 类型
MYSQL中 ENUM 类型的详细解释 ENUM类型 ENUM 是一个字符串对象,其值通常选自一个允许值列表中,该列表在表创建时的列规格说明中被明确地列举. 在下列某些情况下,值也可以是空串(&quo ...
- android IOC框架学习记录
一.框架如下几种: 1.Roboguice 2.Spring for Android 3.afinal 4.xUtils 二.Roboguice说明 项目地址:https://gith ...
- Android 适配2
Android AutoLayout全新的适配方式 堪称适配终结者 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/4999094 ...
- mysql 基本操作语句
mysql 基本操作笔记: 创建表demo:CREATE TABLE `role` ( `role_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMME ...