Streaming expressions allow for users to pass in any arbitrary URL params
in the search streaming source. I'm looking to add the ability for certain
streaming functions, maybe just "search()" but possibly more, to extract
the extra URL params passed along in the streaming request.

For example sending a request:
http://localhost:8983/solr/example/stream?expr=search(collection1, q="*:*",
fl="id", sort="id")&
*shards.preference=shards.preference=replica.location:local*

would be equivalent to:
http://localhost:8983/solr/example/stream?expr=search(collection1, q="*:*",
fl="id", sort="id",
*shards.preference="shards.preference=replica.location:local"*)

The beauty of URL params is that they can easily be overridden and checked,
for example in a proxy between the user and solr. It is harder to do this
with streaming expressions as the proxy would need to parse the expression
and know the logic of the functions and sources.

I'm open to discussion on whether the params able to be captured by the
streaming function would need to be white-listed or black-listed. My idea
is that this would be generically implemented through something like the
StreamContext, so that any streaming function that wants to add this
functionality is able to do so.

Another option is to add a URL parameter such as
*&expr.override.search.shards.preference=replica.location:local* (
*expr.override.<function>.<parameter>=<value>*). That way it's explicit
that the user is trying to send options to the streaming expression, and
extraneous URL params aren't accidentally captured when they were included
for a different purpose.

Anyways this would really help us for some uses cases, especially the
replica routing options used in the example above. Really interested to see
opinions on either of these options.

- Houston Putman

Reply via email to