jruby and solrj

View: New views
6 Messages — Rating Filter:   Alert me  

jruby and solrj

by goodieboy :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

I've been messing around with jRuby and SolrJ with nice results. But can't
seem to get the SolrQuery.addFacetField method to work. I get this error:

"for method addFacetField expected [[Ljava.lang.String;]; got:
[java.lang.String]; error: argument type mismatch (TypeError)"

I'm using it like:

query.add_facet_field 'cat'

and also tried:

query.addFacetField 'cat'

Any ideas as to what I'm doing wrong?

Matt

p.s. The other methods I've tried work great: set_query, set_query_type,
set_facet, set_facet_limit, set_facet_min_count, set_include_score,
add_sort_field.

Re: jruby and solrj

by ryantxu :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

just guessing, but try passing that as a string[] rather then just a  
string

The java function takes ( string ... v ) -- in java that means you can  
pass either a string or an array, or a variable length list of  
strings.  I'm guessing that does something funny with jruby

ryan


On Oct 5, 2008, at 10:54 PM, Matt Mitchell wrote:

> I've been messing around with jRuby and SolrJ with nice results. But  
> can't
> seem to get the SolrQuery.addFacetField method to work. I get this  
> error:
>
> "for method addFacetField expected [[Ljava.lang.String;]; got:
> [java.lang.String]; error: argument type mismatch (TypeError)"
>
> I'm using it like:
>
> query.add_facet_field 'cat'
>
> and also tried:
>
> query.addFacetField 'cat'
>
> Any ideas as to what I'm doing wrong?
>
> Matt
>
> p.s. The other methods I've tried work great: set_query,  
> set_query_type,
> set_facet, set_facet_limit, set_facet_min_count, set_include_score,
> add_sort_field.


Re: jruby and solrj

by Erik Hatcher :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Unfortunately, to call varargs from JRuby (so I just learned from  
irc's #jruby), you have to do this:

   query.add_facet_field(['cat'].to_java :string)

anyway, for our solr-jruby purposes, i think we can stick to using the  
ModifiableSolrParams API instead of SolrQuery, but we still get  
varargs issues.

thankfully Ruby solves this relatively nicely...

   solr = EmbeddedSolrServer.new(container, "core1")
   query = ModifiableSolrParams.new
   def query.abcd(key, values)
     add(key,(values.is_a?(Array) ? values : [values]).to_java(:string))
   end
   query.abcd('q','*:*')
   query.abcd('facet.field',['cat'])
   response = solr.query(query)

We'll just need to sprinkle a little Ruby fairy dust on some of this  
clunky stuff.  It's not all that bad.  But the varargs one is strange  
to me, but I'm sure there is some deep technical reason why that  
support isn't intuitive.

        Erik


On Oct 6, 2008, at 1:36 AM, Ryan McKinley wrote:

> just guessing, but try passing that as a string[] rather then just a  
> string
>
> The java function takes ( string ... v ) -- in java that means you  
> can pass either a string or an array, or a variable length list of  
> strings.  I'm guessing that does something funny with jruby
>
> ryan
>
>
> On Oct 5, 2008, at 10:54 PM, Matt Mitchell wrote:
>
>> I've been messing around with jRuby and SolrJ with nice results.  
>> But can't
>> seem to get the SolrQuery.addFacetField method to work. I get this  
>> error:
>>
>> "for method addFacetField expected [[Ljava.lang.String;]; got:
>> [java.lang.String]; error: argument type mismatch (TypeError)"
>>
>> I'm using it like:
>>
>> query.add_facet_field 'cat'
>>
>> and also tried:
>>
>> query.addFacetField 'cat'
>>
>> Any ideas as to what I'm doing wrong?
>>
>> Matt
>>
>> p.s. The other methods I've tried work great: set_query,  
>> set_query_type,
>> set_facet, set_facet_limit, set_facet_min_count, set_include_score,
>> add_sort_field.


Re: jruby and solrj

by goodieboy :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Awesome, thanks Erik! I really like the idea of bypassing SolrQuery, and
just using a straight up Hash. It'll be even easier to keep the API
consistent between jruby and standard ruby now.


On Mon, Oct 6, 2008 at 3:59 PM, Erik Hatcher <erik@...>wrote:

> Unfortunately, to call varargs from JRuby (so I just learned from irc's
> #jruby), you have to do this:
>
>  query.add_facet_field(['cat'].to_java :string)
>
> anyway, for our solr-jruby purposes, i think we can stick to using the
> ModifiableSolrParams API instead of SolrQuery, but we still get varargs
> issues.
>
> thankfully Ruby solves this relatively nicely...
>
>  solr = EmbeddedSolrServer.new(container, "core1")
>  query = ModifiableSolrParams.new
>  def query.abcd(key, values)
>    add(key,(values.is_a?(Array) ? values : [values]).to_java(:string))
>  end
>  query.abcd('q','*:*')
>  query.abcd('facet.field',['cat'])
>  response = solr.query(query)
>
> We'll just need to sprinkle a little Ruby fairy dust on some of this clunky
> stuff.  It's not all that bad.  But the varargs one is strange to me, but
> I'm sure there is some deep technical reason why that support isn't
> intuitive.
>
>        Erik
>
>
>
> On Oct 6, 2008, at 1:36 AM, Ryan McKinley wrote:
>
>  just guessing, but try passing that as a string[] rather then just a
>> string
>>
>> The java function takes ( string ... v ) -- in java that means you can
>> pass either a string or an array, or a variable length list of strings.  I'm
>> guessing that does something funny with jruby
>>
>> ryan
>>
>>
>> On Oct 5, 2008, at 10:54 PM, Matt Mitchell wrote:
>>
>>  I've been messing around with jRuby and SolrJ with nice results. But
>>> can't
>>> seem to get the SolrQuery.addFacetField method to work. I get this error:
>>>
>>> "for method addFacetField expected [[Ljava.lang.String;]; got:
>>> [java.lang.String]; error: argument type mismatch (TypeError)"
>>>
>>> I'm using it like:
>>>
>>> query.add_facet_field 'cat'
>>>
>>> and also tried:
>>>
>>> query.addFacetField 'cat'
>>>
>>> Any ideas as to what I'm doing wrong?
>>>
>>> Matt
>>>
>>> p.s. The other methods I've tried work great: set_query, set_query_type,
>>> set_facet, set_facet_limit, set_facet_min_count, set_include_score,
>>> add_sort_field.
>>>
>>
>

Re: jruby and solrj

by Erik Hatcher :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


On Oct 6, 2008, at 4:19 PM, Matt Mitchell wrote:
> Awesome, thanks Erik! I really like the idea of bypassing SolrQuery,  
> and
> just using a straight up Hash. It'll be even easier to keep the API
> consistent between jruby and standard ruby now.

Here's a cute trick:

   query = {'qt' => 'standard', 'q'=>'*:*', 'facet.field' => 'cat'}
   response = solr.query(MapSolrParams.new(query))

But that doesn't work, as-is, with an array for the facet.field  
parameter, nor does it work for symbols, so this doesn't work for two  
reasons:

   solr.query(MapSolrParams.new(
      :qt => 'standard', :q=>'*:*', 'facet.field' => ['cat']
   )

Getting warmer!  :)

        Erik



Re: jruby and solrj

by Erik Hatcher :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

I've created a simple bare minimum server.rb that - similar to SolrJ's  
SolrServer abstraction in (currently mostly empty) methods.

And in test/ I've checked in a JRuby example showing the difference  
between going through a pure Ruby API and the SolrJ API.  You can run  
it this way from the root of the solr-ruby-refactoring branch:

    jruby -Ilib test/temp.rb

I think the goal is to achieve something like this being equivalent  
for both MRI and SolrJ-Ruby, regardless of the solr object type:

   response = eval(solr.request(:qt => 'standard', :q => '*:*',  
'facet.field' => ['cat'], :wt=>'ruby'))
   puts response['response']['numFound']

Not quite sure where the eval belongs, so I left it out of  
Solr::Server for now.  We want to be able to support raw responses  
through solr-ruby also, for use cases like letting Solr's JSON  
response pass through a Ruby application server (or perhaps even to  
use JSON within solr-ruby, if it parses faster).

Shouldn't be too hard to get there from here, eh Matt?

        Erik