一. 索引
1. 索引流程
获取内容(爬虫等) —>
建立文档(获取内容转换成文档:标题、 征文、 摘要、 作者、 链接。 加权), 借助 Tika 框架可以方便地从 PDF、 Word 等中方便提取 —>
文档分析 (文本分割成语汇单元的独立原子元素, 和语言中的单词很像。 如何处理连接一体的各个单词呢? 是否需要进行语法修正? 是否需要插入同义词? 是否需要将单数和复数格式单词合并成同一个语汇单元? 常用词干提取器, running, run, runs 映射到 run) —>
文档索引 (文档加入索引列表)
2. 索引核心类
IndexWriter 是索引过程的核心组件。 可以理解为: 提供对索引文件的写入操作, 但不能用于读取或者搜索索引。 IndexWriter 需要开辟一定空间来存储索引, 该功能可以由 Directory 完成。
Director 类描述了 Lucene 索引的存放位置。
Analyzer 负责从索引文本文件中提取语汇单元, 并提出剩下的无用信息。
Document 对表一些 Field 的集合。 可以理解为虚拟文档 - 比如 Web 页面、 Email 信息或者文本文件, 然后可以从中获取大量数据。
3. 索引调试
使用 IndexWriter 的 setInfoStream(System.out) 该代码能够揭示有关段刷新和段合并的诊断信息, 可以帮助我们调整索引参数。 也可以使用 Luck 第三方工具来监视。
二. 搜索
1. 搜索流程
搜索质量主要由查准率(过滤非相关文档能力)和查全率(查找相关文档的能力)来衡量。
用户搜索界面:直观、 简洁。 最好的例子当然是 Google。 高亮关键词, 排序都至关重要 —>
建立查询(Build Query): Lucene 提供了一个称之为查询解析器(QueryParser)的强大开发包, 用它可以根据通用查询语法(布尔运算、 短语查询、 通配符)将用户输入的文本处理成查询对象。 在这期间, 也可以进行加权或者过滤, 如电商过滤掉脱销产品防止客户流到其他电商。 —>
搜索查询(Search Query): 查询检索索引并返回与查询语句匹配的文档, 结果返回时按照查询请求来排序。
常见搜索理论模型:
纯布尔模型 — 文档不管是否匹配查询请求, 都不会被评分。 即无序的, 仅是匹配文档的一个集合。
向量空间模型 — 查询语句和文档都是高维空间向量模型, 每一个独立项都是一个维度。 查询语句和文档之间的相关性或相似性由各自向量之间的距离计算得到。
概率模型 —
采用全概率方法来计算文档和查询语句的匹配概率。
Lucene 并没有提供有关搜索范围的处理模块。 但 Solr 和 Nutch 都提供了对索引拆分和复制。 Katta 也能提供。 Elastic search 提供了另一个选择。
2. 搜索核心类
IndexSearcher 类用于搜索由 IndexWriter 类创建的索引。 最简单的搜索方法将单个 Query 对象和 int topN 计数作为参数, 返回一个 TopDocs 对象。
Term 搜索功能基本单元。
Query Lucene 含有 Query 的子类。 TermQuery, BooleanQuery、 PhraseQuery、 PrefixQuery、 PhrasePrefixQuery、 TermRangeQuery、 NumericRangeQuery、 FilteredQuery 和 SpanQuery。
三. 代码实战