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文档得分是如何计算的? 计算公式是什么?