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)

Reply via email to