Lucene搜索/索引过程笔记

lucene索引文档过程: 
> 初始化IndexWriter
> 构建Document
> 调用IndexWriter.addDocument执行写入
    > 初始化DocumentWriter。参数指定写出位置为内存
    > 生成自增段ID
    > 调用DocumentWriter.addDocument(); 执行写入
        > 写出FieldInfos到内存
        > 写出FieldValues到内存
        > 计算词元列表
        > 排序词元列表
        > 写出词元到内存文件
        > 写出归一化变量到内存文件
    > 全局变量segmentInfos添加新增段
    > 增量合并段
> 调用IndexWriter.optimize()优化索引
    > 合并内存中的段并将合并后的段写出到磁盘
    > 如果当前索引里有多个索引,则合并这些索引
> 调用IndexWriter.close()关闭索引


归一化变量是什么? 干什么用的?


为什么要在searchable接口上放一个rewrite方法?

为什么Weight的创建要用query的createWeight,而不是直接new Weight();

为什么search接口不返回一个包含查询结果的list,而是把查询过程包含在返回对象的构造方法里面?

为什么searcher不能带pageNo pageSize?

为什么要把搜索任务放在query头上?不同的query搜索逻辑有什么不一样?


Term搜索过程:

> 初始化IndexSearcher
> 根据查询语句和解析器解析出Query
> 调用IndexSearcher.search(query); 执行搜索
    > 执行搜索,获取前100条
        > 重写query
        > 创建Weight
            > 计算Weight的平方和(?)
            > 计算权重归一化因子(?)
            > 执行weight的归一化操作
        > 创建Scorer
            > 通过reader获取命中的文档列表
            > 获取搜索term所属field的归一化因子
            > 获取当前Query的相似性算法
            > 返回TermScorer
        > 通过Scorer对命中的文档打分,并获取得分前100条文档
    > 计算得分归一化值
    > 将命中的100条文档得分乘上归一化因子,然后添加到hitDocs缓存中
> 遍历hitDocs获取最终命中的文档列表数据
    > 如果当前遍历的文档没有文档内容数据,则通过searcher获取该文档内容
    > 如果遍历超过100条,则重新执行搜索获取当前遍历的位置数据


lucene文档得分是如何计算的? 计算公式是什么?

 

上一篇:java-如何在Lucene中将RAMDirectory集成到FSDirectory


下一篇:java-休眠搜索在索引中存储byte []