Skip to content

Rules Retriever Failing with Unknown NamedWriteable #126071

@bean710

Description

@bean710

Elasticsearch Version

8.17.4

Installed Plugins

No response

Java Version

bundled

OS Version

Cloud

Problem Description

When using the rules retriever, the query will fail on at least one shard. It seems to be inconsistent and will switch between which shards fail (when there is more than one on the searched index) and will sometimes apply the rules scoring and sometimes will not.

Steps to Reproduce

This appears to be reproducible with a brand new rules set and a brand new content index.

Rules:

PUT _query_rules/my-rules
{
  "rules": [
    {
      "rule_id": "1",
      "type": "pinned",
      "actions": {
        "ids": ["6759e60f09a922ba4dbac10d"]
      },
      "criteria": [
        {
          "type": "contains",
          "values": ["search"],
          "metadata": "user_query"
        }
      ]
    }
  ]
}

Query:

POST search-es-blog/_search?error_trace=true&explain=true
{
  "from": 0,
  "size": 10,
  "retriever": {
    "rule": {
      "rank_window_size": 10000,
      "match_criteria": {
        "user_query": "search"
      },
      "ruleset_ids": [
        "my-rules"
      ],
      "retriever": {
        "standard": {
          "query": {
            "match_all": {}
          }
        }
      }
    }
  },
  "_source": false
}

My index was web crawling the Elastic blog, but the actual content of the index does not seem to matter.

Logs (if relevant)

Stack Trace:

org.elasticsearch.ElasticsearchException$1: Unknown NamedWriteable [org.elasticsearch.search.rank.RankDoc][query_rule_rank_doc]
	at org.elasticsearch.server@8.17.4/org.elasticsearch.ElasticsearchException.guessRootCauses(ElasticsearchException.java:706)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.action.search.SearchPhaseExecutionException.guessRootCauses(SearchPhaseExecutionException.java:161)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.ElasticsearchException.guessRootCauses(ElasticsearchException.java:688)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.ElasticsearchException.generateFailureXContent(ElasticsearchException.java:634)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.rest.RestResponse.build(RestResponse.java:200)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.rest.RestResponse.<init>(RestResponse.java:159)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.rest.RestResponse.<init>(RestResponse.java:120)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.rest.action.RestActionListener.onFailure(RestActionListener.java:54)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.rest.action.RestCancellableNodeClient$1.onFailure(RestCancellableNodeClient.java:97)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.tasks.TaskManager$1.onFailure(TaskManager.java:215)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.action.ActionListenerImplementations.safeAcceptException(ActionListenerImplementations.java:64)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.action.ActionListenerImplementations.safeOnFailure(ActionListenerImplementations.java:75)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.action.DelegatingActionListener.onFailure(DelegatingActionListener.java:32)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.action.ActionListenerImplementations$RunBeforeActionListener.onFailure(ActionListenerImplementations.java:346)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.action.ActionListenerImplementations.safeAcceptException(ActionListenerImplementations.java:64)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.action.ActionListenerImplementations.safeOnFailure(ActionListenerImplementations.java:75)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.action.DelegatingActionListener.onFailure(DelegatingActionListener.java:32)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.action.support.ContextPreservingActionListener.onFailure(ContextPreservingActionListener.java:40)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.action.ActionListenerImplementations.safeAcceptException(ActionListenerImplementations.java:64)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.action.ActionListenerImplementations.safeOnFailure(ActionListenerImplementations.java:75)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.action.DelegatingActionListener.onFailure(DelegatingActionListener.java:32)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.action.search.TransportSearchAction$SearchResponseActionListener.onFailure(TransportSearchAction.java:1952)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.action.search.TransportSearchAction$1.lambda$onFailure$1(TransportSearchAction.java:524)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.action.ActionListenerImplementations$RunAfterActionListener.onResponse(ActionListenerImplementations.java:300)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.tasks.TaskManager$1.onResponse(TaskManager.java:203)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.tasks.TaskManager$1.onResponse(TaskManager.java:197)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.action.ActionListenerImplementations$RunBeforeActionListener.onResponse(ActionListenerImplementations.java:336)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.action.support.ContextPreservingActionListener.onResponse(ContextPreservingActionListener.java:33)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.action.ActionListenerImplementations$MappedActionListener.onResponse(ActionListenerImplementations.java:97)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.action.search.ClearScrollController.lambda$closeContexts$7(ClearScrollController.java:168)
	at org.elasticsearch.base@8.17.4/org.elasticsearch.core.AbstractRefCounted$1.closeInternal(AbstractRefCounted.java:125)
	at org.elasticsearch.base@8.17.4/org.elasticsearch.core.AbstractRefCounted.decRef(AbstractRefCounted.java:77)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.action.support.RefCountingRunnable.close(RefCountingRunnable.java:113)
	at org.elasticsearch.base@8.17.4/org.elasticsearch.core.Releasables.close(Releasables.java:35)
	at org.elasticsearch.base@8.17.4/org.elasticsearch.core.Releasables.closeExpectNoException(Releasables.java:57)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.action.ActionListenerImplementations$2.run(ActionListenerImplementations.java:51)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:217)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.action.ActionListenerImplementations$MappedActionListener.onResponse(ActionListenerImplementations.java:97)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.action.ActionListenerResponseHandler.handleResponse(ActionListenerResponseHandler.java:49)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.transport.TransportService$ContextRestoreResponseHandler.handleResponse(TransportService.java:1500)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.transport.InboundHandler.doHandleResponse(InboundHandler.java:434)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.transport.InboundHandler.handleResponse(InboundHandler.java:383)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.transport.InboundHandler.executeResponseHandler(InboundHandler.java:150)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.transport.InboundHandler.messageReceived(InboundHandler.java:125)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.transport.InboundHandler.inboundMessage(InboundHandler.java:98)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.transport.TcpTransport.inboundMessage(TcpTransport.java:822)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.transport.InboundPipeline.forwardFragments(InboundPipeline.java:125)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.transport.InboundPipeline.doHandleBytes(InboundPipeline.java:97)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.transport.InboundPipeline.handleBytes(InboundPipeline.java:62)
	at org.elasticsearch.transport.netty4@8.17.4/org.elasticsearch.transport.netty4.Netty4MessageInboundHandler.channelRead(Netty4MessageInboundHandler.java:55)
	at io.netty.transport@4.1.118.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at io.netty.transport@4.1.118.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.transport@4.1.118.Final/io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.codec@4.1.118.Final/io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:107)
	at io.netty.transport@4.1.118.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at io.netty.transport@4.1.118.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.transport@4.1.118.Final/io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.handler@4.1.118.Final/io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1515)
	at io.netty.handler@4.1.118.Final/io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1378)
	at io.netty.handler@4.1.118.Final/io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1427)
	at io.netty.codec@4.1.118.Final/io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:530)
	at io.netty.codec@4.1.118.Final/io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:469)
	at io.netty.codec@4.1.118.Final/io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:290)
	at io.netty.transport@4.1.118.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at io.netty.transport@4.1.118.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.transport@4.1.118.Final/io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.transport@4.1.118.Final/io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1357)
	at io.netty.transport@4.1.118.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
	at io.netty.transport@4.1.118.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.transport@4.1.118.Final/io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:868)
	at io.netty.transport@4.1.118.Final/io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
	at io.netty.transport@4.1.118.Final/io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:796)
	at io.netty.transport@4.1.118.Final/io.netty.channel.nio.NioEventLoop.processSelectedKeysPlain(NioEventLoop.java:697)
	at io.netty.transport@4.1.118.Final/io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:660)
	at io.netty.transport@4.1.118.Final/io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
	at io.netty.common@4.1.118.Final/io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:998)
	at io.netty.common@4.1.118.Final/io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at java.base/java.lang.Thread.run(Thread.java:1575)
Caused by: java.lang.IllegalArgumentException: Unknown NamedWriteable [org.elasticsearch.search.rank.RankDoc][query_rule_rank_doc]
	at org.elasticsearch.common.io.stream.NamedWriteableRegistry.throwOnUnknownWritable(NamedWriteableRegistry.java:151)
	at org.elasticsearch.common.io.stream.NamedWriteableRegistry.getReader(NamedWriteableRegistry.java:126)
	at org.elasticsearch.common.io.stream.NamedWriteableRegistry.getReader(NamedWriteableRegistry.java:109)
	at org.elasticsearch.common.io.stream.NamedWriteableAwareStreamInput.readNamedWriteable(NamedWriteableAwareStreamInput.java:56)
	at org.elasticsearch.common.io.stream.NamedWriteableAwareStreamInput.readNamedWriteable(NamedWriteableAwareStreamInput.java:33)
	at org.elasticsearch.index.query.RankDocsQueryBuilder.lambda$new$0(RankDocsQueryBuilder.java:46)
	at org.elasticsearch.common.io.stream.StreamInput.readArray(StreamInput.java:1090)
	at org.elasticsearch.index.query.RankDocsQueryBuilder.<init>(RankDocsQueryBuilder.java:46)
	at org.elasticsearch.common.io.stream.NamedWriteableAwareStreamInput.readNamedWriteable(NamedWriteableAwareStreamInput.java:57)
	at org.elasticsearch.common.io.stream.NamedWriteableAwareStreamInput.readNamedWriteable(NamedWriteableAwareStreamInput.java:33)
	at org.elasticsearch.search.builder.SubSearchSourceBuilder.<init>(SubSearchSourceBuilder.java:80)
	at org.elasticsearch.common.io.stream.StreamInput.readCollection(StreamInput.java:1319)
	at org.elasticsearch.common.io.stream.StreamInput.readCollectionAsList(StreamInput.java:1191)
	at org.elasticsearch.search.builder.SearchSourceBuilder.<init>(SearchSourceBuilder.java:242)
	at org.elasticsearch.common.io.stream.StreamInput.readOptional(StreamInput.java:1117)
	at org.elasticsearch.common.io.stream.StreamInput.readOptionalWriteable(StreamInput.java:1107)
	at org.elasticsearch.search.internal.ShardSearchRequest.<init>(ShardSearchRequest.java:287)
	at org.elasticsearch.transport.RequestHandlerRegistry.newRequest(RequestHandlerRegistry.java:63)
	at org.elasticsearch.transport.InboundHandler.handleRequest(InboundHandler.java:262)
	at org.elasticsearch.transport.InboundHandler.messageReceived(InboundHandler.java:118)
	at org.elasticsearch.transport.InboundHandler.inboundMessage(InboundHandler.java:98)
	at org.elasticsearch.transport.TcpTransport.inboundMessage(TcpTransport.java:822)
	at org.elasticsearch.transport.InboundPipeline.forwardFragments(InboundPipeline.java:125)
	at org.elasticsearch.transport.InboundPipeline.doHandleBytes(InboundPipeline.java:97)
	at org.elasticsearch.transport.InboundPipeline.handleBytes(InboundPipeline.java:62)
	at org.elasticsearch.transport.netty4.Netty4MessageInboundHandler.channelRead(Netty4MessageInboundHandler.java:55)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:107)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1515)
	at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1378)
	at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1427)
	at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:530)
	at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:469)
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:290)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1357)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:868)
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:796)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysPlain(NioEventLoop.java:697)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:660)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:998)
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at java.lang.Thread.run(Thread.java:1575)

Metadata

Metadata

Assignees

Labels

:Search Relevance/RankingScoring, rescoring, rank evaluation.>bugTeam:Search RelevanceMeta label for the Search Relevance team in Elasticsearchpriority:highA label for assessing bug priority to be used by ES engineers

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions