How to create a query directly (bypassing the query-parser)?

2009-03-31 Thread Development Team
Hi everybody, after reading the documentation on the Solr site, I have the
following newbie-ish question:

On the Lucene query parser syntax page (
http://lucene.apache.org/java/2_4_0/queryparsersyntax.html) linked to from
the Solr query syntax page, they mention:
If you are programmatically generating a query string and then parsing it
with the query parser then you should seriously consider building your
queries directly with the query API. In other words, the query parser is
designed for human-entered text, not for program-generated text.

What do they mean by using the API? If I use SolrJ to construct a
SolrQuery, doesn't that get processed by the query parser? How do I bypass
the query parser to set up a query directly?

Especially for token-values (values that fit a defined set, such as Enum
values), it seems silly for me to continually be appending, +tokenField:(1,
2, 3) to my query. Why should I write code to construct the query string,
then send this to the parser to parse the string into an object? Can't I set
these query parameters directly? If so, how?

- Daryl.


Re: How to create a query directly (bypassing the query-parser)?

2009-03-31 Thread Erik Hatcher


On Mar 31, 2009, at 2:13 PM, Development Team wrote:

On the Lucene query parser syntax page (
http://lucene.apache.org/java/2_4_0/queryparsersyntax.html) linked  
to from

the Solr query syntax page, they mention:
If you are programmatically generating a query string and then  
parsing it

with the query parser then you should seriously consider building your
queries directly with the query API. In other words, the query  
parser is

designed for human-entered text, not for program-generated text.

What do they mean by using the API? If I use SolrJ to construct a
SolrQuery, doesn't that get processed by the query parser? How do I  
bypass

the query parser to set up a query directly?

Especially for token-values (values that fit a defined set, such as  
Enum
values), it seems silly for me to continually be appending,  
+tokenField:(1,
2, 3) to my query. Why should I write code to construct the query  
string,
then send this to the parser to parse the string into an object?  
Can't I set

these query parameters directly? If so, how?


Without a custom QParser implementation, there is no way to avoid the  
string concatenation - parser step, even using SolrJ.  The bit you  
refer to in the Lucene query parser documentation is at the Lucene API  
level, which is only accessible via QParser plugins, not by a Solr  
client API.


Erik



Re: How to create a query directly (bypassing the query-parser)?

2009-03-31 Thread Chris Harris
2009/3/31 Erik Hatcher e...@ehatchersolutions.com:

 On Mar 31, 2009, at 2:13 PM, Development Team wrote:

 On the Lucene query parser syntax page (
 http://lucene.apache.org/java/2_4_0/queryparsersyntax.html) linked to from
 the Solr query syntax page, they mention:
 If you are programmatically generating a query string and then parsing it
 with the query parser then you should seriously consider building your
 queries directly with the query API. In other words, the query parser is
 designed for human-entered text, not for program-generated text.

 What do they mean by using the API? If I use SolrJ to construct a
 SolrQuery, doesn't that get processed by the query parser? How do I bypass
 the query parser to set up a query directly?

 Without a custom QParser implementation, there is no way to avoid the string
 concatenation - parser step, even using SolrJ.  The bit you refer to in the
 Lucene query parser documentation is at the Lucene API level, which is only
 accessible via QParser plugins, not by a Solr client API.

        Erik


One way to get a step removed from raw string manipulations would be
to install the Xml Query Parser patch for Solr

  https://issues.apache.org/jira/browse/SOLR-839

and then to construct XML representations of the desired queries using
your client language's standard XML libraries. Here's an example of
the sort of XML that you might then pass as your query string:

BooleanQuery fieldName=contents
 Clause occurs=should
  TermQuerymerger/TermQuery
 /Clause
 Clause occurs=mustnot
  TermQuerysumitomo/TermQuery
 /Clause
 Clause occurs=must
  TermQuerybank/TermQuery
 /Clause
/BooleanQuery