Hi,

I had come across the reduce function in the docs but
I have a hard time getting it to work; I haven't found any documentation on it
or its parameters, and the source code of the GroupOperation doesn't explain it 
either ...
For example, what is the "n" parameter about?


I constructed a source stream to produce the input from my second example:

merge(
    sort(cartesianProduct(tuple(k1="1", k2=array(a)), k2, productSort="k1 
asc"), by="k1 asc"),
    sort(cartesianProduct(tuple(k1="2", k2=array(b,c)), k2, productSort="k1 
asc"), by="k1 asc"),
    on="k1 asc"
  )

---> 

{
  "result-set": {
    "docs": [
      {
        "k1": "1",
        "k2": "a"
      },
      {
        "k1": "2",
        "k2": "b"
      },
      {
        "k1": "2",
        "k2": "c"
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}



Then wrapped in a reduce function:


reduce(
  merge(
    sort(cartesianProduct(tuple(k1="1", k2=array(a)), k2, productSort="k1 
asc"), by="k1 asc"),
    sort(cartesianProduct(tuple(k1="2", k2=array(b,c)), k2, productSort="k1 
asc"), by="k1 asc"),
    on="k1 asc"
  ),
  by="k1",
  group(sort="k1 asc", n="10")
)

---> 

{
  "result-set": {
    "docs": [
      {
        "k1": "1",
        "k2": "a",
        "group": [
          {
            "k1": "1",
            "k2": "a"
          }
        ]
      },
      {
        "k1": "2",
        "k2": "c",
        "group": [
          {
            "k1": "2",
            "k2": "c"
          },
          {
            "k1": "2",
            "k2": "b"
          }
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}


It adds a field "group" that contains an array of the unchanged input documents 
with the same "by" value, 
not grouped values.

{
  "result-set": {
    "docs": [
      {
        "k1": "1",
        "k2": "a",
        "group": [
          {
            "k1": "1",
            "k2": "a"
          }
        ]
      },
      {
        "k1": "2",
        "k2": "c",
        "group": [
          {
            "k1": "2",
            "k2": "c"
          },
          {
            "k1": "2",
            "k2": "b"
          }
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}


Or am I doing it wrong?

Christian Spitzlay










> Am 15.06.2018 um 01:48 schrieb Joel Bernstein <joels...@gmail.com>:
> 
> Actually you're second example is probably a straight forward:
> 
> reduce(select(...), group(...), by="k1")
> 
> Joel Bernstein
> http://joelsolr.blogspot.com/
> 
> On Thu, Jun 14, 2018 at 7:33 PM, Joel Bernstein <joels...@gmail.com> wrote:
> 
>> Take a look at the reduce() function. You'll have to write a custom reduce
>> operation but you can follow the example here:
>> 
>> https://github.com/apache/lucene-solr/blob/master/solr/
>> solrj/src/java/org/apache/solr/client/solrj/io/ops/GroupOperation.java
>> 
>> You can plug in your custom reduce operation in the solrconfig.xml and use
>> it like any other function. If you're interested in working on this you
>> could create a ticket and I can provide guidance.
>> 
>> 
>> Joel Bernstein
>> http://joelsolr.blogspot.com/
>> 
>> 2018-06-14 13:13 GMT-04:00 Christian Spitzlay <
>> christian.spitz...@biologis.com>:
>> 
>>> Hi,
>>> 
>>> is there a way to merge array values?
>>> 
>>> Something that transforms
>>> 
>>> {
>>>  "k1": "1",
>>>  "k2": ["a", "b"]
>>> },
>>> {
>>>  "k1": "2",
>>>  "k2": ["c", "d"]
>>> },
>>> {
>>>  "k1": "2",
>>>  "k2": ["e", "f"]
>>> }
>>> 
>>> into
>>> 
>>> {
>>>  "k1": "1",
>>>  "k2": ["a", "b"]
>>> },
>>> {
>>>  "k1": "2",
>>>  "k2": ["c", "d", "e", "f"]
>>> }
>>> 
>>> 
>>> And an inverse of cartesianProduct() that transforms
>>> 
>>> {
>>>  "k1": "1",
>>>  "k2": "a"
>>> },
>>> {
>>>  "k1": "2",
>>>  "k2": "b"
>>> },
>>> {
>>>  "k1": "2",
>>>  "k2": "c"
>>> }
>>> 
>>> into
>>> 
>>> {
>>>  "k1": "1",
>>>  "k2": ["a"]
>>> },
>>> {
>>>  "k1": "2",
>>>  "k2": ["b", "c"]
>>> }
>>> 
>>> 
>>> Christian
>>> 
>>> 
>>> 
>> 

Reply via email to