### Description

This is a followup to #85926.

As part of the ingest processing pipeline, we call `CollectionUtils.ensureNoSelfReferences(...)` to ensure that a script processor didn't accidentally introduce a circular object. However, this check is only necessary if we know there was the potential for a circular option, which can only happen with either a custom processor (a plugin where we have no control), or a script processor. We should be able to only call this sanity check if we know we need it, rather than for every document.
server/src/main/java/org/elasticsearch/action/index/IndexRequest.java
private String id;
    @Nullable
    private String routing;
    private BytesReference source;
    private OpType opType = OpType.INDEX;
    private long version = Versions.MATCH_ANY;
    private VersionType versionType = VersionType.INTERNAL;
    private XContentType contentType;
    private String pipeline;
    private String finalPipeline;
    private boolean isPipelineResolved;
    private boolean requireAlias;
    /**
     * Value for {@link #getAutoGeneratedTimestamp()} if the document has an external
     * provided ID.
     */
    public static final long UNSET_AUTO_GENERATED_TIMESTAMP = -1L;
    private long autoGeneratedTimestamp = UNSET_AUTO_GENERATED_TIMESTAMP;
    private boolean isRetry = false;
    private long ifSeqNo = UNASSIGNED_SEQ_NO;
    private long ifPrimaryTerm = UNASSIGNED_PRIMARY_TERM;
    private Map<String, String> dynamicTemplates = Map.of();
    /**
     * rawTimestamp field is used on the coordinate node, it doesn't need to be serialised.
     */
    private Object rawTimestamp;
    public IndexRequest(StreamInput in) throws IOException {
        this(null, in);
    }
    public IndexRequest(@Nullable ShardId shardId, StreamInput in) throws IOException {