SearchContextMissingException: No search context found for id [xx] 问题排查

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: SearchContextMissingException: No search context found for id [xx] 问题排查

背景

需要将存放在ES系统中的IMEI信息,将全量的数据分批拉取结果集到另外的系统,处理流程大抵就是先调用ES的查询方法,Scroll查询每批次10000条数据,得到数据集合后,在转换成自己系统需要的信息,最后插入到数据库,然后再通过scrollId进行下一次的查询。

但是有的时候会报下面的问题,我观察后发现,都是在处理一些大数据量的时候查询条件时,因为要入库,可能耗时比较多一些,而期初我们的setScroll中的过期时间比较短导致的。

 

DEBUG!!default!![2022-08-28 20:11:06,432][DEBUG][action.search.type       ] [<Query Node Name>] [27419] Failed to execute fetch phase
org.elasticsearch.transport.RemoteTransportException: [<Data Node Name>][inet[/xx.x.x.xxx:9300]][search/phase/fetch/id]
Caused by: org.elasticsearch.search.SearchContextMissingException: No search context found for id [27419]
    at org.elasticsearch.search.SearchService.findContext(SearchService.java:481)
    at org.elasticsearch.search.SearchService.executeFetchPhase(SearchService.java:451)
    at org.elasticsearch.search.action.SearchServiceTransportAction$SearchFetchByIdTransportHandler.messageReceived(SearchServiceTransportAction.java:793)
    at org.elasticsearch.search.action.SearchServiceTransportAction$SearchFetchByIdTransportHandler.messageReceived(SearchServiceTransportAction.java:782)
    at org.elasticsearch.transport.netty.MessageChannelHandler$RequestHandler.run(MessageChannelHandler.java:275)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)


scroll分页流程

使用ES搜索,当请求返回单个“页面”的结果时,scroll API可用于从单个搜索请求中检索大量结果(甚至所有结果),其方式与在传统数据库中使用光标的方式大致相同。

Scroll滚动不是为了实时用户请求,而是为了处理大量数据,例如为了将ES集群中的数据同步到另外的系统中去。

这个Scroll是一个快照,ES内部在这个快照中会保存于此相关的上下文信息,快照是非实时的信息。

为了使用scroll,初始搜索请求应该在查询字符串中指定scroll参数,它告诉elasticsearch它应该保持“搜索上下文”活动多长时间(参见保持搜索上下文活动)

第二次请求的时候需要带上第一次返回回来的scrollId,后面的每次查询都需要带上这个scroll_id,不过这个有时效性,超过了一定时间Scroll的搜索上下文search context alive就失效了。

结果

跟进后发现这个报错来自游标查询。之所以会出现这个报错,是由于时间已经超过游标当时设置的时间,scroll超时后自动删除了,所以才会提示:“No search context found for id”。

解决办法也简单,要么增大游标的有效时间,要么缩短获取数据后的处理时间。

setScroll()里传入的时间,表示一次处理setSize()里的数据超时时间。即处理一个分页最长不超过的时间。从你获取结果,处理请求到下一次遍历结果时间在5分钟之内即可,下面的代码表示5分钟。

   /**
     * scroll有效时间
     */
    public final static TimeValue SCROLL_KEEP_ALIVE = TimeValue.timeValueMinutes(5);
    /**
     * 300s 超时
     */
    public final static TimeValue TIMEOUT_5_MINUTES = TimeValue.timeValueSeconds(300);  // 300s 超时
    SearchResponse response = client.prepareSearchScroll(scrollId).setScroll(SCROLL_KEEP_ALIVE).execute().actionGet(TIMEOUT_5_MINUTES);


本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
1月前
|
Web App开发 前端开发 JavaScript
控制台出现报错DevTools failed to load source map: Could not load content for chrome-extension://的原因及解决方案
控制台出现报错DevTools failed to load source map: Could not load content for chrome-extension://的原因及解决方案
105 0
控制台出现报错DevTools failed to load source map: Could not load content for chrome-extension://的原因及解决方案
|
7月前
|
SQL Java 数据库连接
错误:FUNCTION simple_notebook.count does not exist.解决方法
错误:FUNCTION simple_notebook.count does not exist.解决方法
|
7月前
|
应用服务中间件 数据安全/隐私保护 容器
websphere Error 404:SRVE0190E: File not found: index.action
websphere Error 404:SRVE0190E: File not found: index.action
|
Java Go
ES 查询时提示:all shards failed [type=search_phase_execution_exception]
ES 查询时提示:all shards failed [type=search_phase_execution_exception]
ES 查询时提示:all shards failed [type=search_phase_execution_exception]
|
Linux
解决办法:error: <item> inner element must either be a resource reference or empty.
解决办法:error: <item> inner element must either be a resource reference or empty.
217 0
如何处理SAP gateway service使用过程中遇到的400 error - invalid key predicate type for guid
如何处理SAP gateway service使用过程中遇到的400 error - invalid key predicate type for guid
如何处理SAP gateway service使用过程中遇到的400 error - invalid key predicate type for guid
|
Web App开发
Chrome source code map - fail - cannot debug
Chrome source code map - fail - cannot debug
Chrome source code map - fail - cannot debug
How to render S4 Code List extension field into CRM WebUI product search view
This question is asked by Wade. Suppose I have created one extension field in S4 with type CodeList which contains all possible queue type supported by JDK. This extension field must be exposed to CRM Product Search WebUI. POC is done in X3C/504:
How to render S4 Code List extension field into CRM WebUI product search view
SAP Enterprise search test report ESH_TEST_SEARCH debug in Q2D
SAP Enterprise search test report ESH_TEST_SEARCH debug in Q2D
SAP Enterprise search test report ESH_TEST_SEARCH debug in Q2D