You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-user@lucene.apache.org by Shawn Heisey <so...@elyograg.org> on 2011/09/29 18:31:57 UTC

Query with plus sign failing

The following query is failing:

((Google +))

This is ultimately reduced to 'google' by my analysis chain, but the 
following is in my log (3.2.0, but 3.4.0 also fails):

SEVERE: org.apache.solr.common.SolrException: 
org.apache.lucene.queryParser.ParseException: Cannot parse '(  (Google 
+))': Encountered " ")" ") "" at line 1, column 12.

If I change it to 'Google+' or 'Goo+gle' it works.

Below is the fieldType definition.  The pattern filter is designed to 
strip leading/trailing punctuation characters, but leave any punctuation 
in the middle of a term alone.  It does affect the plus sign, by 
reducing it to a term of length zero.  The length filter then removes it 
at the end.  In the 'Google+' variant, the pattern filter simply strips 
that character off and the query does not fail.  Am I seeing a bug here, 
or problems with my fieldType?

<fieldType name="genText" class="solr.TextField" sortMissingLast="true" 
positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.PatternReplaceFilterFactory"
           pattern="^(\p{Punct}*)(.*?)(\p{Punct}*)$"
           replacement="$2"
           allowempty="false"
         />
<filter class="solr.WordDelimiterFilterFactory"
           splitOnCaseChange="1"
           splitOnNumerics="1"
           stemEnglishPossessive="1"
           generateWordParts="1"
           generateNumberParts="1"
           catenateWords="1"
           catenateNumbers="1"
           catenateAll="0"
           preserveOriginal="1"
         />
<filter class="solr.ICUFoldingFilterFactory"/>
<filter class="solr.LengthFilterFactory" min="1" max="512"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.PatternReplaceFilterFactory"
           pattern="^(\p{Punct}*)(.*?)(\p{Punct}*)$"
           replacement="$2"
           allowempty="false"
         />
<filter class="solr.WordDelimiterFilterFactory"
           splitOnCaseChange="1"
           splitOnNumerics="1"
           stemEnglishPossessive="1"
           generateWordParts="1"
           generateNumberParts="1"
           catenateWords="0"
           catenateNumbers="0"
           catenateAll="0"
           preserveOriginal="1"
         />
<filter class="solr.ICUFoldingFilterFactory"/>
<filter class="solr.LengthFilterFactory" min="1" max="512"/>
</analyzer>
</fieldType>


Re: Query with plus sign failing

Posted by Erik Hatcher <er...@gmail.com>.
Just a fact of life with the Lucene query parser.  You'll need to escape the + with a backslash for this to work.

	Erik

On Sep 29, 2011, at 12:31 , Shawn Heisey wrote:

> The following query is failing:
> 
> ((Google +))
> 
> This is ultimately reduced to 'google' by my analysis chain, but the following is in my log (3.2.0, but 3.4.0 also fails):
> 
> SEVERE: org.apache.solr.common.SolrException: org.apache.lucene.queryParser.ParseException: Cannot parse '(  (Google +))': Encountered " ")" ") "" at line 1, column 12.
> 
> If I change it to 'Google+' or 'Goo+gle' it works.
> 
> Below is the fieldType definition.  The pattern filter is designed to strip leading/trailing punctuation characters, but leave any punctuation in the middle of a term alone.  It does affect the plus sign, by reducing it to a term of length zero.  The length filter then removes it at the end.  In the 'Google+' variant, the pattern filter simply strips that character off and the query does not fail.  Am I seeing a bug here, or problems with my fieldType?
> 
> <fieldType name="genText" class="solr.TextField" sortMissingLast="true" positionIncrementGap="100">
> <analyzer type="index">
> <tokenizer class="solr.WhitespaceTokenizerFactory"/>
> <filter class="solr.PatternReplaceFilterFactory"
>          pattern="^(\p{Punct}*)(.*?)(\p{Punct}*)$"
>          replacement="$2"
>          allowempty="false"
>        />
> <filter class="solr.WordDelimiterFilterFactory"
>          splitOnCaseChange="1"
>          splitOnNumerics="1"
>          stemEnglishPossessive="1"
>          generateWordParts="1"
>          generateNumberParts="1"
>          catenateWords="1"
>          catenateNumbers="1"
>          catenateAll="0"
>          preserveOriginal="1"
>        />
> <filter class="solr.ICUFoldingFilterFactory"/>
> <filter class="solr.LengthFilterFactory" min="1" max="512"/>
> </analyzer>
> <analyzer type="query">
> <tokenizer class="solr.WhitespaceTokenizerFactory"/>
> <filter class="solr.PatternReplaceFilterFactory"
>          pattern="^(\p{Punct}*)(.*?)(\p{Punct}*)$"
>          replacement="$2"
>          allowempty="false"
>        />
> <filter class="solr.WordDelimiterFilterFactory"
>          splitOnCaseChange="1"
>          splitOnNumerics="1"
>          stemEnglishPossessive="1"
>          generateWordParts="1"
>          generateNumberParts="1"
>          catenateWords="0"
>          catenateNumbers="0"
>          catenateAll="0"
>          preserveOriginal="1"
>        />
> <filter class="solr.ICUFoldingFilterFactory"/>
> <filter class="solr.LengthFilterFactory" min="1" max="512"/>
> </analyzer>
> </fieldType>
>