I have been using Apache Solr for many years in a live environment that 
services queries at 3K rpm (unless there is a campaign in progress) and updates 
from 3K to 10K rpm. The schema is quite robust with each record potentially 
having 90 fields populated. The system stores 900 million records and is hosted 
on several powerful server instances.

Back in 2015 I attended a session at Lucid Works called “Solr Unleashed”. When 
I described the system that I was building I recall the presenter saying, “Good 
luck with that.” We have had very good luck.

When I first started generating Solr query strings I did it with StringBuilder. 
That became problematic when I wanted to change a boost or a constant score for 
a query term group that had been generated previously. So, I eventually wrote 
some Java classes to provide an object structure that I could manipulate and 
navigate. It has been very helpful, and recently I revamped my query generation 
and was glad I had objects to work with instead of strings.

My employer has often encouraged the development staff to participate in the 
Open Source community and they are supportive of sharing this query generation 
functionality.

I will attach a link to the fork of Apache Solr that I am using below.

I have some questions.

1) Do these Java classes provide functionality that the community would like to 
have? Maybe there is functionality already available or similar.
2) I just made a guess in the project structure on where to put the 
functionality. Maybe it should be in SolrJ, or maybe in Lucene, or somewhere 
else.

The main or working java class is called QueryTermGrouper.

QueryTermGrouper aggregates QueryTerms and other QueryTermGroupers to form 
complex queries that can be used in a Standard Solr Query
Example:
          QueryTermGrouper grouper = new QueryTermGrouper().with(BooleanClause. 
Occur. MUST).withBoost(1.4f);
          grouper. addTerm(new QueryTerm("foo", "bar").withProximity(1));
 
          String query = grouper. toString();
 
          Output: +( foo:bar~1 )^1.4
  
Example:
          QueryTermGrouper grouper = new 
QueryTermGrouper().withConstantScore(5.0f);
          grouper. addTerm(new QueryTerm("foo", "bar").withProximity(1));
 
          String query = grouper. toString();
 
          Output: ( foo:bar~1 )^=5
  
Instead of using string manipulation to create complex query strings the 
QueryTermGrouper allows complex queries to be built inside an object model that 
can be more easily changed.
If you need to generate a query like this:
  (
        (
                cd:"back in black"
                cd:"point of no return"
                cd:"night at the opera"
        )^0.3
 
        (
                record:destroyer
                record:"the grand illusion"
        )^0.5
 
  )
 
  The code to do so is as simple this:
          QueryTermGrouper grouper = new QueryTermGrouper();
          QueryTermGrouper cdGrouper = grouper. addGroup();
          QueryTermGrouper recordsGroup = grouper. addGroup();
 
          cdGrouper. addTerm(new QueryTerm("cd", "back in black"));
          cdGrouper. addTerm(new QueryTerm("cd", "point of no return"));
          cdGrouper. addTerm(new QueryTerm("cd", "night at the opera"));
          cdGrouper. setBoost(0.3f);
 
          recordsGroup. addTerm(new QueryTerm("record", "destroyer"));
          recordsGroup. addTerm(new QueryTerm("record", "the grand illusion"));
          recordsGroup. setBoost(0.5f);


The code can be found here:

https://github.com/gslinker/solr/tree/QUERY_TERM_GROUPER

Unit tests provide 100% coverage on all lines of code and on all branches in 
the code.

Please share your thoughts.

Sincerely
Geoffrey Slinker


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@solr.apache.org
For additional commands, e-mail: dev-h...@solr.apache.org

Reply via email to