The problem is that the ${q} macro syntax is interpreted by Solr as a Java Property. Thus these two syntaxes conflict when we encode the macro substitution into the solrconfig.xml. See https://cwiki.apache.org/confluence/display/solr/Configuring+solrconfig.xml
The way to escape seems to be to indicate ${q} is the default value to use, ie: <str name="bq">{!complexphrase df=title}"${q:${q}}"</str> I must say as a user new to this syntax, this is a surprising complexity. Also, while a great feature, macro substitution doesn't seem particularly well documented and i took us a while to figure this out. Should a syntax that doesn't conflict with Java properties be considered? Perhaps sunset the original syntax? At the least document how to port your macros to solrconfig? Best! -Doug On Mon, Sep 4, 2017 at 1:16 PM Bertrand Rigaldies < brigald...@opensourceconnections.com> wrote: > Hi there, on Solr 6.6.0, using the built-in "techproducts" example: > > bin/solr start -f -e techproducts > > I can successfully search with URL-based bq as shown in the URL (bq setting > in *bold*) below: > > http://localhost:8983/solr/techproducts/select? > *bq={!complexphrase%20inOrder=true%20df=name}%22${q}%22* > &debugQuery=on&defType=edismax&fl=*,score&indent=on&q=iPod%20Mini&wt=json > > where I see the expected ComplexPhraseQuery expression in the parsed query: > > "parsedquery":"(+(DisjunctionMaxQuery((text:ipod)) > DisjunctionMaxQuery((text:mini))) *ComplexPhraseQuery(\"iPod Mini\")* > )/no_coord" > > However, *I have been unable to accomplish the same query using a search > handler *in solrconfig.xml, as shown below: > > <requestHandler name="/search_by_name_phrase" class="solr.SearchHandler"> > <lst name="defaults"> > <str name="echoParams">ALL</str> > <int name="rows">10</int> > > <!-- Query parser --> > <str name="defType">edismax</str> > > <!-- Query fields --> > <str name="qf">name</str> > > <!-- Fields list --> > <str name="fl">name, score</str> > > <!-- Boost matching the search terms in order in name --> > <!-- Error: org.apache.solr.common.SolrException: No system property > or default value specified for q value:{!complexphrase inOrder=true > df=name}"${q}"--> > <str name="bq">*{!complexphrase inOrder=true df=name}"${q}"*</str> > > <!-- Escaping does not work either. Not sure I have the proper > escaping syntax. --> > <!--<str name="bq">{!complexphrase inOrder=true > df=name}"\\$\\{q\\}"</str>--> > </lst> > </requestHandler> > > The expression <str name="bq">{!complexphrase inOrder=true > df=name}"${q}"</str> errors out when loading solrconfig.xml with the > following error: > > Error: org.apache.solr.common.SolrException: No system property or default > value specified for q value:{!complexphrase inOrder=true df=name}"${q}" > > as if Solr is looking for a Java property "q"!? > > The variation shows below without the macro expansion, but assuming a > normal localParam substitution, seems to be taking "$q" as a literate: > > Setting: > <str name="bq">{!complexphrase inOrder=true}name:"$q"</str> > Produces: > "parsedquery":"(+(DisjunctionMaxQuery((name:ipod)) > DisjunctionMaxQuery((name:mini))) *ComplexPhraseQuery(\"$q\")*)/no_coord" > > The variation with an attempt to escape the macro expansion does not work > either: > > Setting: > <str name="bq">{!complexphrase inOrder=true > df=name}"\\$\\{q\\}"</str> > Produces: > "parsedquery":"(+(DisjunctionMaxQuery((name:ipod)) > DisjunctionMaxQuery((name:mini)))* ComplexPhraseQuery(\"\\$\\{q\\}\"))* > /no_coord" > > Also, the following variations do *not* produce the expected > ComplexPhraseQuery statement in the parsed query: > Settings: > <str name="bq">{!complexphrase inOrder=true}name:$q</str> > <str name="bq">{!complexphrase inOrder=true df=name}$q</str> > <str name="bq">{!complexphrase inOrder=true}name:($q)</str> > <str name="bq">{!complexphrase inOrder=true df=name}($q)</str> > <str name="bq">{!complexphrase inOrder=true}name:\"$q\"</str> > <str name="bq">{!complexphrase inOrder=true df=name}\"$q\"</str> > <str name="bq">{!complexphrase inOrder=true df=name v="$q"}</str> > <str name="bq">{!complexphrase inOrder=true df=name v=\"$q\"}</str> > Produces: > "parsedquery":"(+(DisjunctionMaxQuery((name:ipod)) > DisjunctionMaxQuery((name:mini))) *name:q*)/no_coord" > > And finally, also not producing the expected ComplexPhraseQuery statement: > Setting: > <str name="bq">{!complexphrase inOrder=true df=name v=$q}</str> > Produces: > "parsedquery":"(+(DisjunctionMaxQuery((name:ipod)) > DisjunctionMaxQuery((name:mini))) *(name:ipod name:mini)*)/no_coord" > > The documentation for ComplexPhraseQuery > <https://lucene.apache.org/solr/guide/6_6/other-parsers.html#other-parsers > > > stipulates > some required "escaping": Special care has to be given when escaping: > clauses between double quotes (usually whole query) is parsed twice, these > parts have to be escaped as twice. eg "foo\\: bar\\^" > > hence, it is possible that I have not used the proper escaping syntax. > > It is troubling that I cannot use the same URL parameter expression in a > search handler to accomplish the same effect, a strong assumption of mine > in how Solr can be used. > > Any suggestion, comment, or similar experience? Does it look like a bug? > > Thank you, > Bertrand > -- Consultant, OpenSource Connections. Contact info at http://o19s.com/about-us/doug-turnbull/; Free/Busy (http://bit.ly/dougs_cal)