Unless something changed while I wasn't paying attention, order of fields
in a response is not guaranteed, and some searching in Jira seems to
confirm that ordering of fields in the response is a WONTFIX since 1.3:
https://issues.apache.org/jira/browse/SOLR-1190

One would not normally expect ordered keys in JSON anyway...  According to
its spec name/value pairs are unordered: https://www.json.org/json-en.html
--> "An *object* is an unordered set of name/value pairs."

There are a lot of places in our code where we do use LinkedHashMap to hold
the fields, so reading the code might be slightly misleading, but I believe
this is for the iteration cost benefits (scales vs actual entries, rather
vs capacity) more than ordering (some exceptions in our codebase, see rant
below). This use of LinkedHashMap may have led to an undocumented
consistency that you have (unfortunately) come to rely upon.

<rant tags="old, tired, hard to fix">
There are some ways in which solr's usage of JSON is a bit dodgy (accepting
illegal commas in some places instead of throwing an error... an
intentional feature of noggit, but not one I like), and in one case that I
know of, duplicate keys are allowed (in
https://solr.apache.org/guide/solr/latest/indexing-guide/indexing-with-update-handlers.html#sending-json-update-commands)
which IS *technically* legal json, but actively discouraged by the RFC:
https://www.rfc-editor.org/rfc/rfc7159#section-4. Since the keys in that
update format denote operations to be performed, order is significant by
implication... something explicitly not guaranteed by the spec. I've always
been annoyed by this design because it relies on behavior that the JSON
spec doesn't ask fully compliant parsers to provide, and it relies on
duplicate keys that many folks will fail to anticipate because it's so rare
and not well supported by libraries. Even in the simpler json.org spec,
there is reference to objects being intended to represent structures in
other languages such as "*object*, record, struct, dictionary, hash table,
keyed list, or associative array", most of which don't allow duplicate
keys, so one could infer some intent even if they failed to exclude the
behavior explicitly. Any mapping of the object into either Java or
Javascript for manipulation requires custom processing, and custom data
structures rather than a simple object mapper... should have been [ {
"operation":"ADD", "parameters": {...}}, ... ] which is ordered and easily
mapped with default mapper configurations widely available everywhere...
</rant>



On Sat, Sep 14, 2024 at 9:11 AM Thomas Corthals <tho...@klascement.net>
wrote:

> Hi,
>
> Up until Solr 9.6.1, when using the fl parameter the fields were returned
> in what seems to be the same order they are stored in. With Solr 9.7.0,
> they are returned in a different order.
>
> With the techproducts example on Solr 9.6.1:
>
> {
>   "responseHeader":{
>     "status":0,
>     "QTime":2,
>     "params":{
>       "q":"price:[70 TO 80]",
>       "fl":"id,price"
>     }
>   },
>   "response":{
>     "numFound":1,
>     "start":0,
>     "numFoundExact":true,
>     "docs":[{
>       "id":"VS1GB400C3",
>       "price":74.99
>     }]
>   }
> }
>
> Same query and field list on Solr 9.7.0:
>
> {
>   "responseHeader":{
>     "status":0,
>     "QTime":44,
>     "params":{
>       "q":"price:[70 TO 80]",
>       "fl":"id,price"
>     }
>   },
>   "response":{
>     "numFound":1,
>     "start":0,
>     "numFoundExact":true,
>     "docs":[{
>       "price":74.99,
>       "id":"VS1GB400C3"
>     }]
>   }
> }
>
> Is there a way to keep the returned field order consistent with how it used
> to be? I'm looking at dozens of failed integration tests because of this
> changed field order. And I can't change the order in the expected outcome
> because the tests have to run against multiple Solr versions.
>
> Thomas
>


-- 
http://www.needhamsoftware.com (work)
https://a.co/d/b2sZLD9 (my fantasy fiction book)

Reply via email to