Also if expressed as xml the lucene classes can be sent to solr (not sure if we have a tool to express them as xml however)
https://solr.apache.org/guide/solr/latest/query-guide/other-parsers.html#xml-query-parser On Tue, Aug 20, 2024 at 1:11 PM Mike Drob <md...@apache.org> wrote: > At the risk of sounding ignorant, what is the advantage of this over using > Lucene classes to programmatically build queries and then toString those? > It's not a single class, but the lucene search package has always seemed > pretty straightforward to me. > > https://lucene.apache.org/core/9_7_0/core/org/apache/lucene/search/package-summary.html#query > > https://lucene.apache.org/core/9_7_0/core/org/apache/lucene/search/Query.html > > If the goal is human readable query methods, I had previously done some of > the work in the opposite direction (matching queries to descriptions > instead of descriptions to queries) in test framework's QueryMatcher, might > be worth comparing against. > > https://github.com/apache/solr/blob/main/solr/test-framework/src/java/org/apache/solr/util/QueryMatchers.java > > > > On Tue, Aug 20, 2024 at 11:07 AM David Smiley <dsmi...@apache.org> wrote: > > > 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 > > > > > -- http://www.needhamsoftware.com (work) https://a.co/d/b2sZLD9 (my fantasy fiction book)