Solr学习笔记 - 关于timeAllowed
时间:2022-07-22
本文章向大家介绍Solr学习笔记 - 关于timeAllowed,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
关于timeAllowed
TimeLimitingCollector
TimeLimitingCollector的getLeafCollector方法返回一个FilterLeafCollector对象,在collect每个doc的时候判断是否超时:
return new FilterLeafCollector(this.collector.getLeafCollector(context)) {
public void collect(int doc) throws IOException {
long time = TimeLimitingCollector.this.clock.get();
if (time - TimeLimitingCollector.this.timeout > 0L) {
if (TimeLimitingCollector.this.greedy) {
this.in.collect(doc);
}
throw new TimeLimitingCollector.TimeExceededException(TimeLimitingCollector.this.timeout - TimeLimitingCollector.this.t0, time - TimeLimitingCollector.this.t0, TimeLimitingCollector.this.docBase + doc);
} else {
this.in.collect(doc);
}
}
}
SolrQueryTimeoutImpl
如果参数设置了timeAllowed,还会设置一个SolrQueryTimeoutImpl
SearchHandler:
long timeAllowed = req.getParams().getLong(CommonParams.TIME_ALLOWED, -1L);
if (timeAllowed >= 0L) {
SolrQueryTimeoutImpl.set(timeAllowed);
}
那么在执行reader在执行加载term的时候就会进行时间检查,超时则会抛出ExitingReaderException异常。
ExitableFilterAtomicReader:
/**
* Throws {@link ExitingReaderException} if {@link QueryTimeout#shouldExit()} returns true,
* or if {@link Thread#interrupted()} returns true.
*/
private void checkAndThrow() {
if (queryTimeout.shouldExit()) {
throw new ExitingReaderException("The request took too long to iterate over point values. Timeout: "
+ queryTimeout.toString()
+ ", PointValues=" + in
);
} else if (Thread.interrupted()) {
throw new ExitingReaderException("Interrupted while iterating over point values. PointValues=" + in);
}
}
主要是在IndexSearch.search方法中加载term的时候。
public void search(Query query, Collector results) throws IOException {
query = rewrite(query);
search(leafContexts, createWeight(query, results.scoreMode(), 1), results);
}
createWeight会调用
IndexSearch.createNormalizedWeight
TermQuery.createWeight
TermContext.build
-
ExitableTermsEnum
类所有过程会调用checkAndThrow检查超时。
TermContext.build方法:
for (final LeafReaderContext ctx : context.leaves()) {
final Terms terms = ctx.reader().terms(field);
if (terms != null) {
final TermsEnum termsEnum = terms.iterator();
if (termsEnum.seekExact(bytes)) {
final TermState termState = termsEnum.termState();
perReaderTermState.register(termState, ctx.ord, termsEnum.docFreq(), termsEnum.totalTermFreq());
}
}
}
召回阶段
如果召回阶段超时,抛出 ExitableDirectoryReader.ExitingReaderException 异常,在SearchHandler.handleRequestBody方法里会捕获这个异常,增加partialResults=trued的标识,并返回已经收集的结果。
rerank阶段
topCollector.topDocs
如果rerank阶段超时,由于ReRankCollector.topDocs捕获了所有异常,然后抛出SolrException,导致无结果
rerank有两处会排除ExitingReaderException异常。
1. scorer阶段
scorer = modelWeight.scorer(readerContext);
一般语法为正常的召回,都会在scorer阶段创建weight。同时加载term。
2. score阶段
一般是函数计算阶段发生term加载。例如:
FloatPayloadValueSource.getValues
public void reset() throws IOException {
if (terms != null) {
final TermsEnum termsEnum = terms.iterator();
if (termsEnum.seekExact(indexedBytes)) {
docs = termsEnum.postings(null, PostingsEnum.ALL);
} else {
docs = null;
}
} else {
docs = null;
}
...
}
- 用python抓取淘宝评论
- 使用Dropwizard(2)-配置分类ConfiguredBundle
- Upgrade with the Gradle Wrapper, gradlew升级
- 使用swagger作为restful api的doc文档生成
- 面试机器学习、大数据岗位时遇到的各种问题
- 使用nginx代理跨域,使用nginx代理bing的每日一图
- Java Web基础入门
- Java中Optional使用注意事项
- 使用awk来解析dump文件 (73天)
- IntelIj IDEA运行JUnit Test OutOfMemoryError
- git pull fails “unable to resolve reference” “unable to update local ref”
- 使用dropwizard(5)--加入swagger
- 使用hint来调优sql语句(72天)
- 用R语言对城管事件数据分析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 详解length charAt indexOf lastIndexOf includes concat slice substring substr详解
- sort实现
- border-radius
- USACO Training Section 1.1黑色星期五Friday the Thirteenth
- background-clip默认从border开始的哈
- background-origin默认从padding-box开始的哈
- USACO Training Section 1.1 坏掉的项链Broken Necklace
- 简易通讯录类实现原理
- 盒子模型box-sizing属性的用法
- JeecgBoot配置及前后端分离HelloWorld项目
- POJ 3122 Pie
- POJ 2456 Aggressive cows
- css内容 元素 元素空间的练习