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 器件系列具有以下特性:■ 低成 ...
随机推荐
- js跨域访问
什么是跨域 JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦.这里把涉及到跨域的一些问题简单地整理一下: 首 ...
- firefox的console log功能
http://www.ruanyifeng.com/blog/2011/03/firebug_console_tutorial.html Firebug是网页开发的利器,能够极大地提升工作效率. 但是 ...
- java线程池初步理解
多线程基础准备 进程:程序的执行过程,持有资源和线程 线程:是系统中最小的执行单元,同一个进程可以有多个线程,线程共享进程资源 线程交互(同步synchronized):包括互斥和协作,互斥通过对象锁 ...
- The implementation details of the built thermal setup
Lucid infrared thermography of thermally-constrained processors
- col-md-*,col-xs-*
class属性 col-md-*,md 表示 medium (中等的),* 代表一个数字,它指定了这个元素所占的列宽. 在中等大小的屏幕上(例如笔记本电脑),元素的列宽被指定了. col-xs-* , ...
- FMDB读取Datetime类型值为1970的问题
1.问题 今天使用FMDB做一个例子程序,新建的一张表有一个datetime字段,数据库有默认值,大概如下 CREATE TABLE [ConsumptionType] ([id] INTEGER P ...
- [Leetcode][JAVA] Convert Sorted Array to Binary Search Tree && Convert Sorted List to Binary Search Tree
Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in ascending ord ...
- Python学习之路—Day1
第1章 Python语言简介 1.1 Python是什么 Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn)是什么呢?简单的说,它是一种计算机编程语言及一组配套的软件工具和库. ...
- C++是一把很奇怪的刀
C++是一把很奇怪的刀,首尾都是刀刃.用刀能出什么,还是要看拿刀的人.
- 解决Ubuntu发热量大的问题
转自:http://blog.csdn.net/tracker_w/article/details/8801971 用Ubuntu 的朋友应该都有体会,开机不久风扇就开始狂转,本本也会很热.据说是双显 ...