-
Lucene 的核心 JAR 包很小只有1MB左右,并且不需要任何第三方依赖
-
随着信息量的增大,靠层次分类、多层目录的方法来搜索满足不了需求了,所以需要搜索引擎
例如 google、mac os的finder
-
信息检索(IR,Information Retrieval)
-
搜索程序的典型组件
Users ---> Search User Interface ---> **Build Query** ---> **Run Query** <---> **Index** <--- **Index Document** <--- **Analyze Document** <--- Build Document <--- Acquire Content <--- Raw Content 标**的部分可以由Lucene完成
-
索引组件
-
索引操作整体目标
文本内容 ----索引操作---> 索引
索引是可以被快速检索的东西
-
获取内容 Acquire Content
通过种种方式(组织好的数据库、网络爬虫爬web站点、本地xml文件等),获取内容
内容获取模块在访问规模较大的内容集时,重要的是能够以增量方式运行;并且是active的,是持续运行的后台服务
-
建立文档 Build Document
文档主要包括几个带值的域
示例
title=Lipitor, Thief of Memory isbn=9781424301621 author=Duane Graveline,Kilmer S. McCully,Jay S. Cohen subject=cholesterol,statin,lipitor pubmonth=200611 url=http://www.amazon.com/Lipitor-Thief-Memory-Duane-Graveline/dp/1424301629
文本文件好办,二进制文件需要文档过滤器先过滤
-
文档分析 Analyze Document
目标:
文档 ----文档分析---> 语汇单元
语汇单元:类似于语言中的单词
-
文档索引 Index Document
目标:将文档加入索引列表
-
-
搜索组件
-
搜索质量的衡量标准
查准率:衡量搜索系统过滤非相关文档的能力
查全率:衡量搜索系统查找相关文档的能力
-
用户搜索界面 UI
-
建立查询 Build Query
查询语句可以包含布尔运算、短语查询、通配符查询
-
搜索查询 Search Query
常见的搜索理论模型有3种
(1) 纯布尔模型
(2) 向量空间模型
(3) 概率模型
Lucene采用(1)和(2)
-
展现结果 Render Result
-
-
搜索程序的其他模块
-
管理界面
跟踪程序运行情况、配置程序的各种组件、启动和停止搜索服务等
-
分析界面
各类查询请求的运行频率、搜索期间发生的故障等
-
搜索范围
多机分布式问题
搜索范围有两种界定方式:
(1) 净处理内容:
将数据分割成各个小部分,前端服务器将查询请求发到各台机器分别查询,然后再汇总结果
(2) 净查询吞吐量
将同一索引复制到多台机器,前端负载均衡器将新来的查询请求发送给加载最少的后台机器
-
-
建立索引过程用到的核心类
Document 包括 Field1, Field2, ... Field n Document ---> Analyzer ---> IndexWriter ---> Directory
-
IndexWriter
写索引的核心组件:创建新索引,添加、删除或更新被索引文档的信息,但是不能用于读取和搜索
-
Directory
描述索引存放位置的抽象类
-
Analyzer
分析器的抽象类,用于从文本文件中提取语汇单元,作为 IndexWriter 的构造函数
-
Field
索引中每个文档都包含一个或多个不同命名的域(name=val形式)
-
Document
一系列Field的集合,Lucene内核只处理java.lang.String, java.io.Reader和本地数字类型
-
-
根据索引进行搜索过程用到的核心类
-
IndexSearcher
读索引的核心组件,以只读的方式打开索引
-
Term
搜索功能的基本单元,Term对象包括field-name和val
-
Query
查询过程的抽象类
TermQuery是最基本的查询类型,用来匹配指定域中包含特定项的文档
最基本流程示例:
Directory dir = FSDirectory.open(new File("./src/lia/meetlucene/index")); IndexSearcher indexSearcher = new IndexSearcher(dir); Query query = new TermQuery(new Term("contents", "patent")); TopDocs hits = indexSearcher.search(query, 15); System.out.println("Total Hits: " + hits.totalHits); for (ScoreDoc scoreDoc : hits.scoreDocs) { Document doc = indexSearcher.doc(scoreDoc.doc); System.out.println(doc.get("fullpath")); } indexSearcher.close();
-
TopDocs
负责展示搜索结果,是一个简单的指针容器,指向排名前N的搜索结果
-
-
Lucene的三大主要组件
-
索引
把原始文本文档压缩储存成索引文件
-
分析
从原始文本文档或用户查询输入中,进行分词变成语汇单元
-
搜索
根据分析结果从索引中找到相关文档,并评分排序
-