Let's bikeshed before you write code, okay?  Otherwise you potentially
waste time and/or grow attached to sunk costs.

Feedback:
* avoid the word "term"; it already has Lucene definition and a Solr
query parser but you're using it in a way that isn't either.  I
recommend simply  for "fieldQuery" -- these queries target specific
fields after all.
* Can we avoid top level classes that the user must know about;
instead having one class -- QueryBuilder (or named QueryStringBuilder)
with factory methods that are easily discoverable?  Not a huge deal.
* Instead of "Group", lets acknowledge these map to a BooleanQuery so
I think "bool" in some way should be used instead.  Some bool builder
can then have must() should() filter() methods without needing an
enum.
* Can't import any Lucene things

I'll add examples below of my feedback ideas.

On Tue, Aug 20, 2024 at 11:04 AM Geoffrey Slinker
<geoffrey_slin...@yahoo.com.invalid> wrote:

> Instantiate a Term and set the values and call toString to get a string that 
> can be used in a Standard Solr Query.
>        Term term = new Term("pink panther").withBoost(1.5f);
>        term. toString()
>
>        Output: "pink panther"^1.5
>
>        Term term = new Term("title", "pink panther").withBoost(1.5f);
>        term. toString()
>
>        Output: title:"pink panther"^1.5

final QueryStringBuilder B = new QueryStringBuilder(potential
options); // immutable
B.field("title", "ping panther").withBoost(1.5f).toString();


>           TermGroup group = new TermGroup().with(Occur. MUST).withBoost(1.4f);
>           group. addTerm(new Term("foo", "bar").withProximity(1));
>
>           String query = group. toString();
>
>           Output: +( foo:bar~1 )^1.4

the outer MUST is pointless but I'll recreate anyway:

final QueryStringBuilder B = new QueryStringBuilder(potential
options); // immutable
B.bool().must(B.fieldFuzzy("foo", "bar", 1).withBoost(1.4)).toString();

> Example:
>           TermGroup group = new TermGroup().withConstantScore(5.0f);
>           group. addTerm(new Term("foo", "bar").withProximity(1));
>
>           String query = group. toString();
>
>           Output: ( foo:bar~1 )^=5

final QueryStringBuilder B = new QueryStringBuilder(potential
options); // immutable
B.fieldFuzzy("foo", "bar", 1).withConstantScore(5.0f).toString();
// no "group" terminology necessary

> Instead of using string manipulation to create complex query strings the 
> TermGroup 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:
>   +(
>         (
>                 title:"Grand Illusion"~1
>                 title:"Paradise Theatre"~1
>         )^0.3
>         (
>                 title:"Night At The Opera"~1
>                 title:"News Of The World"~1
>         )^0.3
>         (
>                 title:"Van Halen"~1
>                 title:1984~1
>         )^0.3
>   )
>
>
>   The code to do so is as simple this:
>
>       TermGroup group = new TermGroup().with(Occur. MUST);
>
>       TermGroup favoriteStyx = group. addGroup().withBoost(0.3f);
>       TermGroup favoriteQueen = group. addGroup().withBoost(0.3f);
>       TermGroup favoriteVanHalen = group. addGroup().withBoost(0.3f);
>
>       favoriteStyx. addTerm(new Term("title","Grand Illusion").with(Occur. 
> SHOULD).withProximity(1));
>       favoriteStyx. addTerm(new Term("title","Paradise Theatre").with(Occur. 
> SHOULD).withProximity(1));
>
>       favoriteQueen. addTerm(new Term("title","Night At The 
> Opera").with(Occur. SHOULD).withProximity(1));
>       favoriteQueen. addTerm(new Term("title","News Of The 
> World").with(Occur. SHOULD).withProximity(1));
>
>       favoriteVanHalen. addTerm(new Term("title","Van Halen").with(Occur. 
> SHOULD).withProximity(1));
>       favoriteVanHalen. addTerm(new Term("title","1984").with(Occur. 
> SHOULD).withProximity(1));
>

// again, the outer bool MUST is pointless but will recreate your example

final QueryStringBuilder B = new QueryStringBuilder(potential
options); // immutable

var favoriteStyx = B.bool();
favoriteStyx.should(B.field("title", "Grand Illusion").withProximity(1));
favoriteStyx.should(B.field("title", "Paradise Theater").withProximity(1));

var favoriteQueen = B.bool();
favoriteQueen.should(B.field("title", "Night At The Opera").withProximity(1));
favoriteQueen.should(B.field("title", "News Of The World").withProximity(1));

var favoriteVanHalen = B.bool();
favoriteVanHalen.should(B.field("title", "Van Halen").withProximity(1));
favoriteVanHalen.should(B.field("title", "1984").withProximity(1));

B.bool().must( // pointless wrap
  B.bool().should(favoriteStyx.withBoost(0.3f))
               .should(favoriteQueen.withBoost(0.3f))
               .should(favoriteVanHalen.withBoost(0.3f))
).toString();

---
If we imagine plausibly expanding support to write Solr JSON as an
alternative, then it could affect the code choices.  Like
toSolrLuceneSyntax() and toSolrQueryDsl().

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

Reply via email to