私はelasticsearch 2.2.0をデフォルトのクラスタ構成で使用しています。私は春のデータelasticsearchを使用してスキャンとスクロールのクエリに問題が発生します。Elasticsearch SearchContextMissingExceptionは、Spring Data Elasticsearchを使用した 'scan&scroll'クエリ中です。
[2016-06-29 12:45:52,046][DEBUG][action.search.type ] [Vector] [155597] Failed to execute query phase
RemoteTransportException[[Vector][10.132.47.95:9300][indices:data/read/search[phase/scan/scroll]]]; nested: SearchContextMissingException[No search context found for id [155597]];
Caused by: SearchContextMissingException[No search context found for id [155597]]
at org.elasticsearch.search.SearchService.findContext(SearchService.java:611)
at org.elasticsearch.search.SearchService.executeScan(SearchService.java:311)
at org.elasticsearch.search.action.SearchServiceTransportAction$SearchScanScrollTransportHandler.messageReceived(SearchServiceTransportAction.java:433)
at org.elasticsearch.search.action.SearchServiceTransportAction$SearchScanScrollTransportHandler.messageReceived(SearchServiceTransportAction.java:430)
at org.elasticsearch.transport.TransportService$4.doRun(TransportService.java:350)
at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
私の「スキャン&スクロール」コード:
public List<T> getAllElements(SearchQuery searchQuery) {
searchQuery.setPageable(new PageRequest(0, PAGE_SIZE));
String scrollId = elasticsearchTemplate.scan(searchQuery, 1000, false);
List<T> allElements = new LinkedList<>();
boolean hasRecords = true;
while (hasRecords) {
Page<T> page = elasticsearchTemplate.scroll(scrollId, 5000, resultMapper);
if (page.hasContent()) {
allElements.addAll(page.getContent());
} else {
hasRecords = false;
}
}
elasticsearchTemplate.clearScroll(scrollId);
return allElements;
}
私のクエリ結果のサイズがPAGE_SIZEパラメータ未満である場合には、このようなエラーが5を発生し、私は、クエリを実行すると私はこのようなエラーが出ます回。私はそれがシャードごとに1つだと思います。結果のサイズがPAGE_SIZEより大きい場合、エラーは数回発生します。
Page<T> page = elasticsearchTemplate.scroll(scrollId, 5000, resultMapper);
を
私はページにはコンテンツがありませんことを確信しているとき:私は呼んでいないために私のコードをリファクタリングしようとしました。しかし、PAGE_SIZEがクエリ結果よりも大きい場合にのみ機能するので、解決策はまったくありません。
私はそれがelasticsearch側にのみ問題であると付け加えなければなりません。クライアント側では、エラーは隠されており、いずれの場合もクエリの結果は正しいです。誰がこの問題の原因を知っていますか?
ありがとう、
サイモン。
私はそれを試してみましたが、私の場合はうまくいきません。私のサンプルクエリは非常にシンプルで、1秒未満しかかからず、問題になることはありません。 – esnosek
もしあなたが確実にしたいなら、 'org.elasticsearch.search.SearchService'でDEBUGログを有効にすることができます。もし' freeing search context .... 'デバッグログが表示されたら、これが問題です。 – Val
ありがとう、ありがとう、しかし、そのクラスのDEBUGログを有効にした後は何も変わっていません。エラーログは以前と同じです。 – esnosek