借助基础的lucence框架理解搜索引擎的原理~~
ref: Lucene in Action:

信息超负荷问题解决方案: 新的用户接口/智能代理
Lucene是一个高性能,可伸缩的信息搜索库,可以为应用程序添加索引和搜索能力.
版本: java/Perl/Python/C++/net
搜索引擎的核心是索引
搜索的质量用精确度和召回率来描述,召回率衡量系统搜索到相关文档的能力,精确度描述过滤不相关的能力

正文摘要文件(存储域,名称,偏移位置,域数据)
倒排信息文件(字典,文本,所在域,索引,词频)
顺排信息文件(词向量索引,向量域信息)
打分相关文件

实现:

  1. LRUcache基于linkedhashmap,多线程需要用collections.synchronized.map包装一下
  2. 默认打分公式基于空间向量模型(Query->weight->scorer->sumScorer)

对结构化数据搜索:SQL,元数据,windows搜索对文件名,类型,修改时间
对非结构化数据搜索:windows搜索,grep,搜索引擎–>全文搜索:顺序扫描法,索引法

反向索引: 字符串到文件的映射(词典->倒排表)

创建索引:

  1. Tokenizer分词: 文档->单词,去标点符号,去停词
  2. Linguistic Processor语言处理组件: 处理词元(小写,词根stemming/lemmatization)
  3. Indexer:索引组件: 将Term创建字典.排序,合并为倒排链表

搜索:

  1. 用户输入查询语句(AND/OR/NOT)
  2. 词法分析,语法分析,语言处理(同indexer)
  3. 搜索索引,负荷语法树的文档(链表合并->做差)
  4. 文档和查询语句的相关性(relevance)排序
    a. 计算词的权重tf, df
    b. 空间向量模型判断VSM文档的相关性
    http://blog.csdn.net/forfuture1978/archive/2009/10/22/4711308.aspx
    盘古分词(lucene .net2.9)